From 04a407d9a638b00c9eeb943457cdaf37b60400e1 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Sat, 14 Feb 2026 12:17:54 +0200 Subject: [PATCH 1/6] 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 2/6] 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 3/6] 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 4/6] 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 5/6] 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 6/6] 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. ///