From f15ac203236355117e72f81159af7a496f5c6706 Mon Sep 17 00:00:00 2001
From: Roland Grinis <roland.grinis@grinisrit.com>
Date: Mon, 1 Mar 2021 22:52:58 +0000
Subject: [PATCH] Cannot afford to inherit from RingWithNumbers

---
 .../kmath/tensors/RealTensorAlgebra.kt        | 35 +++++++++----------
 .../kscience/kmath/tensors/TensorAlgebra.kt   |  9 ++---
 2 files changed, 21 insertions(+), 23 deletions(-)

diff --git a/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/RealTensorAlgebra.kt b/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/RealTensorAlgebra.kt
index 0a28ace4f..6023d2b72 100644
--- a/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/RealTensorAlgebra.kt
+++ b/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/RealTensorAlgebra.kt
@@ -19,25 +19,6 @@ public class RealTensor(
 
 public class RealTensorAlgebra : TensorPartialDivisionAlgebra<Double, RealTensor> {
 
-    override fun add(a: RealTensor, b: RealTensor): RealTensor {
-        TODO("Not yet implemented")
-    }
-
-    override fun multiply(a: RealTensor, k: Number): RealTensor {
-        TODO("Not yet implemented")
-    }
-
-    override val zero: RealTensor
-        get() = TODO("Not yet implemented")
-
-    override fun multiply(a: RealTensor, b: RealTensor): RealTensor {
-        TODO("Not yet implemented")
-    }
-
-    override val one: RealTensor
-        get() = TODO("Not yet implemented")
-
-
     override fun Double.plus(other: RealTensor): RealTensor {
         val n = other.buffer.size
         val arr = other.buffer.array
@@ -51,6 +32,10 @@ public class RealTensorAlgebra : TensorPartialDivisionAlgebra<Double, RealTensor
         TODO("Not yet implemented")
     }
 
+    override fun RealTensor.plus(other: RealTensor): RealTensor {
+        TODO("Not yet implemented")
+    }
+
     override fun RealTensor.plusAssign(value: Double) {
         TODO("Not yet implemented")
     }
@@ -67,6 +52,10 @@ public class RealTensorAlgebra : TensorPartialDivisionAlgebra<Double, RealTensor
         TODO("Not yet implemented")
     }
 
+    override fun RealTensor.minus(other: RealTensor): RealTensor {
+        TODO("Not yet implemented")
+    }
+
     override fun RealTensor.minusAssign(value: Double) {
         TODO("Not yet implemented")
     }
@@ -83,6 +72,10 @@ public class RealTensorAlgebra : TensorPartialDivisionAlgebra<Double, RealTensor
         TODO("Not yet implemented")
     }
 
+    override fun RealTensor.times(other: RealTensor): RealTensor {
+        TODO("Not yet implemented")
+    }
+
     override fun RealTensor.timesAssign(value: Double) {
         TODO("Not yet implemented")
     }
@@ -91,6 +84,10 @@ public class RealTensorAlgebra : TensorPartialDivisionAlgebra<Double, RealTensor
         TODO("Not yet implemented")
     }
 
+    override fun RealTensor.unaryMinus(): RealTensor {
+        TODO("Not yet implemented")
+    }
+
     override fun RealTensor.dot(other: RealTensor): RealTensor {
         TODO("Not yet implemented")
     }
diff --git a/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/TensorAlgebra.kt b/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/TensorAlgebra.kt
index 83c45feec..137230d29 100644
--- a/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/TensorAlgebra.kt
+++ b/kmath-core/src/commonMain/kotlin/space/kscience/kmath/tensors/TensorAlgebra.kt
@@ -1,25 +1,26 @@
 package space.kscience.kmath.tensors
 
-import space.kscience.kmath.operations.Ring
-import space.kscience.kmath.operations.RingWithNumbers
-
 // https://proofwiki.org/wiki/Definition:Algebra_over_Ring
-public interface TensorAlgebra<T, TensorType : TensorStructure<T>>: RingWithNumbers<TensorType> {
+public interface TensorAlgebra<T, TensorType : TensorStructure<T>>{
 
     public operator fun T.plus(other: TensorType): TensorType
     public operator fun TensorType.plus(value: T): TensorType
+    public operator fun TensorType.plus(other: TensorType): TensorType
     public operator fun TensorType.plusAssign(value: T): Unit
     public operator fun TensorType.plusAssign(other: TensorType): Unit
 
     public operator fun T.minus(other: TensorType): TensorType
     public operator fun TensorType.minus(value: T): TensorType
+    public operator fun TensorType.minus(other: TensorType): TensorType
     public operator fun TensorType.minusAssign(value: T): Unit
     public operator fun TensorType.minusAssign(other: TensorType): Unit
 
     public operator fun T.times(other: TensorType): TensorType
     public operator fun TensorType.times(value: T): TensorType
+    public operator fun TensorType.times(other: TensorType): TensorType
     public operator fun TensorType.timesAssign(value: T): Unit
     public operator fun TensorType.timesAssign(other: TensorType): Unit
+    public operator fun TensorType.unaryMinus(): TensorType
 
 
     //https://pytorch.org/docs/stable/generated/torch.matmul.html