From bd178d77babd7fe6a21786860aeb7fdbe584b8ad Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Sun, 17 Jan 2021 02:38:48 +0700 Subject: [PATCH 1/6] Add transposeConjugate function for Complex and Double (conjugate values are not cached). Minor refactoring of MatrixContext and API reference changes --- .../kscience/kmath/linear/FeaturedMatrix.kt | 35 ++++++++++++++----- .../kscience/kmath/linear/MatrixContext.kt | 16 ++++++--- .../kscience/kmath/linear/VirtualMatrix.kt | 9 +++-- .../kscience/kmath/structures/Structure2D.kt | 2 +- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt index 119f5d844..bbe2a0b61 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt @@ -1,6 +1,8 @@ package kscience.kmath.linear +import kscience.kmath.operations.Complex import kscience.kmath.operations.Ring +import kscience.kmath.operations.conjugate import kscience.kmath.structures.Matrix import kscience.kmath.structures.Structure2D import kscience.kmath.structures.asBuffer @@ -70,7 +72,7 @@ public fun > GenericMatrixContext.one(rows: Int, c /** - * A virtual matrix of zeroes + * Returns virtual matrix of zeroes. */ public fun > GenericMatrixContext.zero(rows: Int, columns: Int): FeaturedMatrix = VirtualMatrix(rows, columns) { _, _ -> elementContext.zero } @@ -78,12 +80,27 @@ public fun > GenericMatrixContext.zero(rows: Int, public class TransposedFeature(public val original: Matrix) : MatrixFeature /** - * Create a virtual transposed matrix without copying anything. `A.transpose().transpose() === A` + * Create a virtual transposed matrix without copying anything. `A.transpose().transpose() === A`. */ -public fun Matrix.transpose(): Matrix { - return getFeature>()?.original ?: VirtualMatrix( - colNum, - rowNum, - setOf(TransposedFeature(this)) - ) { i, j -> get(j, i) } -} \ No newline at end of file +public fun Matrix.transpose(): Matrix = getFeature>()?.original ?: VirtualMatrix( + colNum, + rowNum, + setOf(TransposedFeature(this)), +) { i, j -> get(j, i) } + +/** + * Returns Hermitian conjugate of this matrix (i.e., just transposes it). + * + * + */ +public fun Matrix.transposeConjugate(): Matrix = transpose() + +/** + * Returns Hermitian conjugate of this matrix (i.e., transposes it and replaces each element with its conjugate). + * + * @return the Hermitian conjugate of this matrix. + */ +public fun Matrix.transposeConjugate(): Matrix { + val t = transpose() + return VirtualMatrix(t.rowNum, t.colNum) { i, j -> t[i,j].conjugate } +} diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/MatrixContext.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/MatrixContext.kt index 8c28a240f..c61eb7eb9 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/MatrixContext.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/MatrixContext.kt @@ -10,7 +10,10 @@ import kscience.kmath.structures.Matrix import kscience.kmath.structures.asSequence /** - * Basic operations on matrices. Operates on [Matrix] + * Basic operations on matrices. Operates on [Matrix]. + * + * @param T the type of items in the matrices. + * @param M the type of operated matrices. */ public interface MatrixContext> : SpaceOperations> { /** @@ -84,9 +87,16 @@ public interface MatrixContext> : SpaceOperations, out M : Matrix> : MatrixContext { /** - * The ring context for matrix elements + * The ring over matrix elements. */ public val elementContext: R @@ -133,8 +143,6 @@ public interface GenericMatrixContext, out M : Matrix> : public override fun multiply(a: Matrix, k: Number): M = produce(a.rowNum, a.colNum) { i, j -> elementContext { a[i, j] * k } } - public operator fun Number.times(matrix: FeaturedMatrix): M = multiply(matrix, this) - public override operator fun Matrix.times(value: T): M = produce(rowNum, colNum) { i, j -> elementContext { get(i, j) * value } } } diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/VirtualMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/VirtualMatrix.kt index e0a1d0026..8b7eaa3e7 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/VirtualMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/VirtualMatrix.kt @@ -2,17 +2,22 @@ package kscience.kmath.linear import kscience.kmath.structures.Matrix +/** + * The matrix where each element is evaluated each time when is being accessed. + * + * @property generator the function that provides elements. + */ public class VirtualMatrix( override val rowNum: Int, override val colNum: Int, override val features: Set = emptySet(), - public val generator: (i: Int, j: Int) -> T + public val generator: (i: Int, j: Int) -> T, ) : FeaturedMatrix { public constructor( rowNum: Int, colNum: Int, vararg features: MatrixFeature, - generator: (i: Int, j: Int) -> T + generator: (i: Int, j: Int) -> T, ) : this( rowNum, colNum, diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/structures/Structure2D.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/structures/Structure2D.kt index bac7d3389..7131a02e0 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/structures/Structure2D.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/structures/Structure2D.kt @@ -72,6 +72,6 @@ else /** * Alias for [Structure2D] with more familiar name. * - * @param T the type of items. + * @param T the type of items in the matrix. */ public typealias Matrix = Structure2D From 6636b228f3fb21e90d1239acf6145784af8a3073 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Sun, 17 Jan 2021 18:59:20 +0700 Subject: [PATCH 2/6] Add missing JvmName annotations --- .../commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt index bbe2a0b61..4a1eef318 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt @@ -93,6 +93,7 @@ public fun Matrix.transpose(): Matrix = getFeature.transposeConjugate(): Matrix = transpose() /** @@ -100,6 +101,7 @@ public fun Matrix.transposeConjugate(): Matrix = transpose() * * @return the Hermitian conjugate of this matrix. */ +@JvmName("transposeConjugateComplex") public fun Matrix.transposeConjugate(): Matrix { val t = transpose() return VirtualMatrix(t.rowNum, t.colNum) { i, j -> t[i,j].conjugate } From 3f00410fc1a5b3501ad0eba531596de8e211a979 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Sun, 17 Jan 2021 19:12:14 +0700 Subject: [PATCH 3/6] Add missing import --- .../commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt index 4a1eef318..f154a6115 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt @@ -6,6 +6,7 @@ import kscience.kmath.operations.conjugate import kscience.kmath.structures.Matrix import kscience.kmath.structures.Structure2D import kscience.kmath.structures.asBuffer +import kotlin.jvm.JvmName import kotlin.math.sqrt /** From f1b319f73de90b13adf88491ae6cf4a838f84822 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Tue, 19 Jan 2021 00:14:12 +0700 Subject: [PATCH 4/6] Minor: micro-optimize getFeature function, reformat --- .../kotlin/kscience/kmath/linear/FeaturedMatrix.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt index f154a6115..61dbdf721 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt @@ -60,8 +60,9 @@ public inline fun Matrix<*>.hasFeature(): Boolean = /** * Get the first feature matching given class. Does not guarantee that matrix has only one feature matching the criteria */ +@Suppress("UNCHECKED_CAST") public inline fun Matrix<*>.getFeature(): T? = - features.filterIsInstance().firstOrNull() + features.find { it is T }?.let { it as T } /** * Diagonal matrix of ones. The matrix is virtual no actual matrix is created @@ -78,7 +79,12 @@ public fun > GenericMatrixContext.one(rows: Int, c public fun > GenericMatrixContext.zero(rows: Int, columns: Int): FeaturedMatrix = VirtualMatrix(rows, columns) { _, _ -> elementContext.zero } -public class TransposedFeature(public val original: Matrix) : MatrixFeature +/** + * Matrices with this feature were transposed previosly and hold the reference to their original. + * + * @property original the matrix before transposition. + */ +public inline class TransposedFeature(public val original: Matrix) : MatrixFeature /** * Create a virtual transposed matrix without copying anything. `A.transpose().transpose() === A`. @@ -105,5 +111,5 @@ public fun Matrix.transposeConjugate(): Matrix = transpose() @JvmName("transposeConjugateComplex") public fun Matrix.transposeConjugate(): Matrix { val t = transpose() - return VirtualMatrix(t.rowNum, t.colNum) { i, j -> t[i,j].conjugate } + return VirtualMatrix(t.rowNum, t.colNum) { i, j -> t[i, j].conjugate } } From 6d118fc84195e2b3c37fbff8403ffc692823f973 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Tue, 19 Jan 2021 00:15:09 +0700 Subject: [PATCH 5/6] Minor: fix a typo --- .../commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt index 61dbdf721..54e4c3777 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt @@ -80,7 +80,7 @@ public fun > GenericMatrixContext.zero(rows: Int, VirtualMatrix(rows, columns) { _, _ -> elementContext.zero } /** - * Matrices with this feature were transposed previosly and hold the reference to their original. + * Matrices with this feature were transposed previously and hold the reference to their original. * * @property original the matrix before transposition. */ From 7418228d08be2693fdd10bceadf1af967ef45379 Mon Sep 17 00:00:00 2001 From: Iaroslav Postovalov Date: Tue, 19 Jan 2021 00:27:28 +0700 Subject: [PATCH 6/6] Update KDoc comments --- .../kotlin/kscience/kmath/linear/FeaturedMatrix.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt index 54e4c3777..38c81b646 100644 --- a/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt +++ b/kmath-core/src/commonMain/kotlin/kscience/kmath/linear/FeaturedMatrix.kt @@ -74,7 +74,14 @@ public fun > GenericMatrixContext.one(rows: Int, c /** - * Returns virtual matrix of zeroes. + * Returns a [VirtualMatrix] of zeroes. + * + * @param T the type of matrix's items. + * @param R the type of ring over the matrix's items. + * @receiver the matrix context to provide the [R] ring. + * @param rows the count of rows. + * @param columns the count of columns. + * @return a new virtual matrix. */ public fun > GenericMatrixContext.zero(rows: Int, columns: Int): FeaturedMatrix = VirtualMatrix(rows, columns) { _, _ -> elementContext.zero } @@ -82,6 +89,7 @@ public fun > GenericMatrixContext.zero(rows: Int, /** * Matrices with this feature were transposed previously and hold the reference to their original. * + * @param T the type of matrices' items. * @property original the matrix before transposition. */ public inline class TransposedFeature(public val original: Matrix) : MatrixFeature