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/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/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/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 a925d884..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 @@ -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); @@ -28,9 +34,16 @@ 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) - 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..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 @@ -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); @@ -28,9 +34,16 @@ 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) - 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.Add.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Add.cs index d48bd510..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 @@ -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); @@ -43,15 +49,23 @@ 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) - 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.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 89448352..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 @@ -19,15 +19,28 @@ 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; } 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) - 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.Product.cs b/src/NumSharp.Core/Backends/Default/Math/Reduction/Default.Reduction.Product.cs index 81bc391d..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 @@ -19,16 +19,29 @@ 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; } 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) - 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/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..441c47c5 --- /dev/null +++ b/src/NumSharp.Core/Backends/Kernels/ILKernelGenerator.cs @@ -0,0 +1,4819 @@ +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). + /// Uses SIMD when LHS type equals result type (no per-element conversion needed). + /// + private static MixedTypeKernel GenerateSimdScalarRightKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdScalarRight_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + // Use SIMD when: LHS type == Result type (no per-element conversion needed), + // result type supports SIMD, and operation has SIMD support + bool canUseSimd = key.LhsType == key.ResultType && + CanUseSimd(key.ResultType) && + CanUseSimdForOp(key.Op); + + if (canUseSimd) + { + EmitSimdScalarRightLoop(il, key, resultSize); + } + else + { + EmitScalarRightLoop(il, key, lhsSize, rhsSize, resultSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a SimdScalarLeft kernel (left operand is scalar). + /// Uses SIMD when RHS type equals result type (no per-element conversion needed). + /// + private static MixedTypeKernel GenerateSimdScalarLeftKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdScalarLeft_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + // Use SIMD when: RHS type == Result type (no per-element conversion needed), + // result type supports SIMD, and operation has SIMD support + bool canUseSimd = key.RhsType == key.ResultType && + CanUseSimd(key.ResultType) && + CanUseSimdForOp(key.Op); + + if (canUseSimd) + { + EmitSimdScalarLeftLoop(il, key, resultSize); + } + else + { + EmitScalarLeftLoop(il, key, lhsSize, rhsSize, resultSize); + } + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a SimdChunk kernel (inner dimension contiguous/broadcast). + /// + private static MixedTypeKernel GenerateSimdChunkKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_SimdChunk_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitChunkLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + /// + /// Generate a General kernel (arbitrary strides, coordinate-based iteration). + /// + private static MixedTypeKernel GenerateGeneralKernel(MixedTypeKernelKey key) + { + var dm = new DynamicMethod( + name: $"MixedType_General_{key}", + returnType: typeof(void), + parameterTypes: new[] + { + typeof(void*), typeof(void*), typeof(void*), + typeof(int*), typeof(int*), typeof(int*), + typeof(int), typeof(int) + }, + owner: typeof(ILKernelGenerator), + skipVisibility: true + ); + + var il = dm.GetILGenerator(); + + int lhsSize = GetTypeSize(key.LhsType); + int rhsSize = GetTypeSize(key.RhsType); + int resultSize = GetTypeSize(key.ResultType); + + EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); + + il.Emit(OpCodes.Ret); + return dm.CreateDelegate(); + } + + #endregion + + #region IL Loop Emission + + /// + /// Emit a scalar loop for contiguous arrays (no SIMD). + /// + private static void EmitScalarFullLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // loop counter + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhs[i], rhs[i]) + // Load result address + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert to result type + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs[i] and convert to result type + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Perform operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Store result + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit a SIMD loop for contiguous same-type arrays. + /// + private static void EmitSimdFullLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // For same-type operations, use Vector256 + int vectorCount = GetVectorCount(key.ResultType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.LhsType); + + // Load rhs vector + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.RhsType); + + // Vector operation + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP === + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = op(lhs[i], rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit loop for scalar right operand (broadcast scalar to array). + /// + private static void EmitScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locRhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load rhs[0] and convert to result type, store in local + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locRhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhs[i], rhsVal) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[i] and convert + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load cached rhs scalar + il.Emit(OpCodes.Ldloc, locRhsVal); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit loop for scalar left operand (broadcast scalar to array). + /// + private static void EmitScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locLhsVal = il.DeclareLocal(GetClrType(key.ResultType)); // scalar value + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + + // Load lhs[0] and convert to result type, store in local + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + il.Emit(OpCodes.Stloc, locLhsVal); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // result[i] = op(lhsVal, rhs[i]) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load cached lhs scalar + il.Emit(OpCodes.Ldloc, locLhsVal); + + // Load rhs[i] and convert + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + /// + /// Emit SIMD loop for scalar right operand (broadcast scalar to vector). + /// Requires: LHS type == Result type (no per-element conversion needed). + /// + private static void EmitSimdScalarRightLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + int vectorCount = GetVectorCount(key.ResultType); + var clrType = GetClrType(key.ResultType); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // === Load scalar, convert to result type, broadcast to vector === + // Load rhs[0] (the scalar) + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + // Convert to result type if needed + if (key.RhsType != key.ResultType) + { + EmitConvertTo(il, key.RhsType, key.ResultType); + } + // Broadcast to Vector256: Vector256.Create(scalar) + EmitVectorCreate(il, key.ResultType); + il.Emit(OpCodes.Stloc, locScalarVec); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load lhs vector: Vector256.Load(lhs + i * elemSize) + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.LhsType); + + // Load scalar vector + il.Emit(OpCodes.Ldloc, locScalarVec); + + // Vector operation: lhsVec op scalarVec + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector: Vector256.Store(resultVec, result + i * elemSize) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP (scalar remainder) === + // Load scalar value once for tail loop + var locScalarVal = il.DeclareLocal(clrType); + il.Emit(OpCodes.Ldarg_1); // rhs + EmitLoadIndirect(il, key.RhsType); + if (key.RhsType != key.ResultType) + { + EmitConvertTo(il, key.RhsType, key.ResultType); + } + il.Emit(OpCodes.Stloc, locScalarVal); + + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = lhs[i] op scalarVal + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + + il.Emit(OpCodes.Ldloc, locScalarVal); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit SIMD loop for scalar left operand (broadcast scalar to vector). + /// Requires: RHS type == Result type (no per-element conversion needed). + /// + private static void EmitSimdScalarLeftLoop(ILGenerator il, MixedTypeKernelKey key, int elemSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + int vectorCount = GetVectorCount(key.ResultType); + var clrType = GetClrType(key.ResultType); + var vectorType = typeof(Vector256<>).MakeGenericType(clrType); + + var locI = il.DeclareLocal(typeof(int)); // loop counter + var locVectorEnd = il.DeclareLocal(typeof(int)); // totalSize - vectorCount + var locScalarVec = il.DeclareLocal(vectorType); // broadcasted scalar vector + + var lblSimdLoop = il.DefineLabel(); + var lblSimdLoopEnd = il.DefineLabel(); + var lblTailLoop = il.DefineLabel(); + var lblTailLoopEnd = il.DefineLabel(); + + // === Load scalar, convert to result type, broadcast to vector === + // Load lhs[0] (the scalar) + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + // Convert to result type if needed + if (key.LhsType != key.ResultType) + { + EmitConvertTo(il, key.LhsType, key.ResultType); + } + // Broadcast to Vector256: Vector256.Create(scalar) + EmitVectorCreate(il, key.ResultType); + il.Emit(OpCodes.Stloc, locScalarVec); + + // vectorEnd = totalSize - vectorCount + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locVectorEnd); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // === SIMD LOOP === + il.MarkLabel(lblSimdLoop); + + // if (i > vectorEnd) goto SimdLoopEnd + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldloc, locVectorEnd); + il.Emit(OpCodes.Bgt, lblSimdLoopEnd); + + // Load scalar vector + il.Emit(OpCodes.Ldloc, locScalarVec); + + // Load rhs vector: Vector256.Load(rhs + i * elemSize) + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorLoad(il, key.RhsType); + + // Vector operation: scalarVec op rhsVec + EmitVectorOperation(il, key.Op, key.ResultType); + + // Store result vector: Vector256.Store(resultVec, result + i * elemSize) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitVectorStore(il, key.ResultType); + + // i += vectorCount + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4, vectorCount); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblSimdLoop); + il.MarkLabel(lblSimdLoopEnd); + + // === TAIL LOOP (scalar remainder) === + // Load scalar value once for tail loop + var locScalarVal = il.DeclareLocal(clrType); + il.Emit(OpCodes.Ldarg_0); // lhs + EmitLoadIndirect(il, key.LhsType); + if (key.LhsType != key.ResultType) + { + EmitConvertTo(il, key.LhsType, key.ResultType); + } + il.Emit(OpCodes.Stloc, locScalarVal); + + il.MarkLabel(lblTailLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblTailLoopEnd); + + // result[i] = scalarVal op rhs[i] + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + il.Emit(OpCodes.Ldloc, locScalarVal); + + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, elemSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + + EmitScalarOperation(il, key.Op, key.ResultType); + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblTailLoop); + il.MarkLabel(lblTailLoopEnd); + } + + /// + /// Emit chunked loop for inner-contiguous arrays. + /// This is more complex - processes the inner dimension as a chunk. + /// + private static void EmitChunkLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // For simplicity in initial implementation, use general loop + // TODO: Implement proper chunked SIMD processing + EmitGeneralLoop(il, key, lhsSize, rhsSize, resultSize); + } + + /// + /// Emit general coordinate-based iteration loop. + /// Handles arbitrary strides. + /// + private static void EmitGeneralLoop(ILGenerator il, MixedTypeKernelKey key, + int lhsSize, int rhsSize, int resultSize) + { + // Args: void* lhs (0), void* rhs (1), void* result (2), + // int* lhsStrides (3), int* rhsStrides (4), int* shape (5), + // int ndim (6), int totalSize (7) + + var locI = il.DeclareLocal(typeof(int)); // linear index + var locD = il.DeclareLocal(typeof(int)); // dimension counter + var locLhsOffset = il.DeclareLocal(typeof(int)); // lhs offset + var locRhsOffset = il.DeclareLocal(typeof(int)); // rhs offset + var locCoord = il.DeclareLocal(typeof(int)); // current coordinate + var locIdx = il.DeclareLocal(typeof(int)); // temp for coordinate calculation + + var lblLoop = il.DefineLabel(); + var lblLoopEnd = il.DefineLabel(); + var lblDimLoop = il.DefineLabel(); + var lblDimLoopEnd = il.DefineLabel(); + + // i = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locI); + + // Main loop + il.MarkLabel(lblLoop); + + // if (i >= totalSize) goto end + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldarg_S, (byte)7); // totalSize + il.Emit(OpCodes.Bge, lblLoopEnd); + + // Calculate lhsOffset and rhsOffset from linear index + // lhsOffset = 0, rhsOffset = 0 + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locLhsOffset); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // idx = i (for coordinate calculation) + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Stloc, locIdx); + + // For each dimension (right to left): coord = idx % shape[d], idx /= shape[d] + // d = ndim - 1 + il.Emit(OpCodes.Ldarg_S, (byte)6); // ndim + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.MarkLabel(lblDimLoop); + + // if (d < 0) goto DimLoopEnd + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Blt, lblDimLoopEnd); + + // coord = idx % shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); // sizeof(int) + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Rem); + il.Emit(OpCodes.Stloc, locCoord); + + // idx /= shape[d] + il.Emit(OpCodes.Ldloc, locIdx); + il.Emit(OpCodes.Ldarg_S, (byte)5); // shape + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Div); + il.Emit(OpCodes.Stloc, locIdx); + + // lhsOffset += coord * lhsStrides[d] + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_3); // lhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locLhsOffset); + + // rhsOffset += coord * rhsStrides[d] + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Ldloc, locCoord); + il.Emit(OpCodes.Ldarg_S, (byte)4); // rhsStrides + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4_4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Ldind_I4); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locRhsOffset); + + // d-- + il.Emit(OpCodes.Ldloc, locD); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Sub); + il.Emit(OpCodes.Stloc, locD); + + il.Emit(OpCodes.Br, lblDimLoop); + il.MarkLabel(lblDimLoopEnd); + + // Now compute: result[i] = op(lhs[lhsOffset], rhs[rhsOffset]) + // Load result address (contiguous output) + il.Emit(OpCodes.Ldarg_2); // result + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, resultSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + + // Load lhs[lhsOffset] + il.Emit(OpCodes.Ldarg_0); // lhs + il.Emit(OpCodes.Ldloc, locLhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, lhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.LhsType); + EmitConvertTo(il, key.LhsType, key.ResultType); + + // Load rhs[rhsOffset] + il.Emit(OpCodes.Ldarg_1); // rhs + il.Emit(OpCodes.Ldloc, locRhsOffset); + il.Emit(OpCodes.Conv_I); + il.Emit(OpCodes.Ldc_I4, rhsSize); + il.Emit(OpCodes.Mul); + il.Emit(OpCodes.Add); + EmitLoadIndirect(il, key.RhsType); + EmitConvertTo(il, key.RhsType, key.ResultType); + + // Operation + EmitScalarOperation(il, key.Op, key.ResultType); + + // Store + EmitStoreIndirect(il, key.ResultType); + + // i++ + il.Emit(OpCodes.Ldloc, locI); + il.Emit(OpCodes.Ldc_I4_1); + il.Emit(OpCodes.Add); + il.Emit(OpCodes.Stloc, locI); + + il.Emit(OpCodes.Br, lblLoop); + il.MarkLabel(lblLoopEnd); + } + + #endregion + + #region NPTypeCode-Based IL Helpers + + /// + /// Get size in bytes for NPTypeCode. + /// + internal static int GetTypeSize(NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => 1, + NPTypeCode.Byte => 1, + NPTypeCode.Int16 => 2, + NPTypeCode.UInt16 => 2, + NPTypeCode.Int32 => 4, + NPTypeCode.UInt32 => 4, + NPTypeCode.Int64 => 8, + NPTypeCode.UInt64 => 8, + NPTypeCode.Char => 2, + NPTypeCode.Single => 4, + NPTypeCode.Double => 8, + NPTypeCode.Decimal => 16, + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Get CLR Type for NPTypeCode. + /// + internal static Type GetClrType(NPTypeCode type) + { + return type switch + { + NPTypeCode.Boolean => typeof(bool), + NPTypeCode.Byte => typeof(byte), + NPTypeCode.Int16 => typeof(short), + NPTypeCode.UInt16 => typeof(ushort), + NPTypeCode.Int32 => typeof(int), + NPTypeCode.UInt32 => typeof(uint), + NPTypeCode.Int64 => typeof(long), + NPTypeCode.UInt64 => typeof(ulong), + NPTypeCode.Char => typeof(char), + NPTypeCode.Single => typeof(float), + NPTypeCode.Double => typeof(double), + NPTypeCode.Decimal => typeof(decimal), + _ => throw new NotSupportedException($"Type {type} not supported") + }; + } + + /// + /// Check if type supports SIMD 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.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. + /// + 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.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/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/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/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/Reduction/ReduceAddTests.cs b/test/NumSharp.UnitTest/Backends/Unmanaged/Math/Reduction/ReduceAddTests.cs index 862f63e7..43e310d2 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); @@ -237,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); + } } } 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/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)); 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/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/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/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); } 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); 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