Reverse types for buffers and typealiases for geometry.

This commit is contained in:
Alexander Nozik 2024-02-22 21:03:58 +03:00
parent dba001eff3
commit fcb7e2fa7d
67 changed files with 117 additions and 353 deletions

View File

@ -18,7 +18,7 @@
### Added
- Reification. Explicit `SafeType` for algebras and buffers.
- Reification. Explicit `SafeType` for algebras.
- Integer division algebras.
- Float32 geometries.
- New Attributes-kt module that could be used as stand-alone. It declares. type-safe attributes containers.
@ -30,6 +30,7 @@
### Changed
- Buffer copy removed from API (added as an extension).
- Default naming for algebra and buffers now uses IntXX/FloatXX notation instead of Java types.
- Remove unnecessary inlines in basic algebras.
- QuaternionField -> QuaternionAlgebra and does not implement `Field` anymore since it is non-commutative

View File

@ -14,7 +14,7 @@ allprojects {
}
group = "space.kscience"
version = "0.4.0-RC"
version = "0.4.0-RC2"
}
subprojects {

View File

@ -23,7 +23,7 @@ import space.kscience.kmath.structures.IntBuffer
import space.kscience.kmath.structures.asBuffer
public class CMMatrix(public val origin: RealMatrix) : Matrix<Double> {
override val type: SafeType<Double> get() = DoubleField.type
override val rowNum: Int get() = origin.rowDimension
override val colNum: Int get() = origin.columnDimension
@ -32,7 +32,6 @@ public class CMMatrix(public val origin: RealMatrix) : Matrix<Double> {
@JvmInline
public value class CMVector(public val origin: RealVector) : Point<Double> {
override val type: SafeType<Double> get() = DoubleField.type
override val size: Int get() = origin.dimension
override operator fun get(index: Int): Double = origin.getEntry(index)

View File

@ -36,8 +36,6 @@ public class Quaternion(
require(!z.isNaN()) { "z-component of quaternion is not-a-number" }
}
override val type: SafeType<Double> get() = safeTypeOf()
/**
* Returns a string representation of this quaternion.
*/

View File

@ -428,7 +428,6 @@ public final class space/kscience/kmath/expressions/NamedMatrix : space/kscience
public fun getRowNum ()I
public fun getRows ()Ljava/util/List;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public final fun getValues ()Lspace/kscience/kmath/nd/Structure2D;
}
@ -820,7 +819,6 @@ public final class space/kscience/kmath/linear/MatrixWrapper : space/kscience/km
public fun getRowNum ()I
public fun getRows ()Ljava/util/List;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun toString ()Ljava/lang/String;
}
@ -871,7 +869,6 @@ public final class space/kscience/kmath/linear/TransposedMatrix : space/kscience
public fun getColNum ()I
public final fun getOrigin ()Lspace/kscience/kmath/nd/Structure2D;
public fun getRowNum ()I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public final class space/kscience/kmath/linear/UpperTriangular : space/kscience/attributes/FlagAttribute, space/kscience/kmath/linear/MatrixAttribute {
@ -879,15 +876,14 @@ public final class space/kscience/kmath/linear/UpperTriangular : space/kscience/
}
public final class space/kscience/kmath/linear/VirtualMatrix : space/kscience/kmath/nd/Structure2D {
public synthetic fun <init> (Lkotlin/reflect/KType;IILspace/kscience/attributes/Attributes;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Lkotlin/reflect/KType;IILspace/kscience/attributes/Attributes;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (IILspace/kscience/attributes/Attributes;Lkotlin/jvm/functions/Function2;)V
public synthetic fun <init> (IILspace/kscience/attributes/Attributes;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun get (II)Ljava/lang/Object;
public fun getAttributes ()Lspace/kscience/attributes/Attributes;
public fun getColNum ()I
public final fun getGenerator ()Lkotlin/jvm/functions/Function2;
public fun getRowNum ()I
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public final class space/kscience/kmath/linear/VirtualMatrixKt {
@ -1009,7 +1005,6 @@ public class space/kscience/kmath/nd/BufferND : space/kscience/kmath/nd/Structur
public fun getBuffer ()Lspace/kscience/kmath/structures/Buffer;
public fun getIndices ()Lspace/kscience/kmath/nd/ShapeIndexer;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun toString ()Ljava/lang/String;
}
@ -1160,7 +1155,6 @@ public final class space/kscience/kmath/nd/Float64BufferND : space/kscience/kmat
public synthetic fun getBuffer ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun getBuffer-E20IKn8 ()[D
public fun getDouble ([I)D
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun setDouble ([ID)V
}
@ -1290,11 +1284,9 @@ public abstract interface class space/kscience/kmath/nd/MutableStructureND : spa
public final class space/kscience/kmath/nd/MutableStructureNDAccessorBuffer : space/kscience/kmath/structures/MutableBuffer {
public fun <init> (Lspace/kscience/kmath/nd/MutableStructureND;ILkotlin/jvm/functions/Function1;)V
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun get (I)Ljava/lang/Object;
public fun getSize ()I
public final fun getStructure ()Lspace/kscience/kmath/nd/MutableStructureND;
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun set (ILjava/lang/Object;)V
public fun toString ()Ljava/lang/String;
}
@ -1316,7 +1308,6 @@ public final class space/kscience/kmath/nd/PermutedMutableStructureND : space/ks
public final fun getOrigin ()Lspace/kscience/kmath/nd/MutableStructureND;
public final fun getPermutation ()Lkotlin/jvm/functions/Function1;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun set ([ILjava/lang/Object;)V
}
@ -1326,7 +1317,6 @@ public final class space/kscience/kmath/nd/PermutedStructureND : space/kscience/
public final fun getOrigin ()Lspace/kscience/kmath/nd/StructureND;
public final fun getPermutation ()Lkotlin/jvm/functions/Function1;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public final class space/kscience/kmath/nd/PermutedStructureNDKt {
@ -1477,7 +1467,7 @@ public final class space/kscience/kmath/nd/Structure2DKt {
public abstract interface class space/kscience/kmath/nd/StructureAttribute : space/kscience/attributes/Attribute {
}
public abstract interface class space/kscience/kmath/nd/StructureND : space/kscience/attributes/AttributeContainer, space/kscience/attributes/WithType, space/kscience/kmath/nd/WithShape {
public abstract interface class space/kscience/kmath/nd/StructureND : space/kscience/attributes/AttributeContainer, space/kscience/kmath/nd/WithShape {
public static final field Companion Lspace/kscience/kmath/nd/StructureND$Companion;
public fun elements ()Lkotlin/sequences/Sequence;
public abstract fun get ([I)Ljava/lang/Object;
@ -1509,20 +1499,17 @@ public final class space/kscience/kmath/nd/StructureNDKt {
public abstract interface class space/kscience/kmath/nd/StructureNDOfDouble : space/kscience/kmath/nd/StructureND {
public abstract fun getDouble ([I)D
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public abstract interface class space/kscience/kmath/nd/StructureNDOfInt : space/kscience/kmath/nd/StructureND {
public abstract fun getInt ([I)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public class space/kscience/kmath/nd/VirtualStructureND : space/kscience/kmath/nd/StructureND {
public synthetic fun <init> (Lkotlin/reflect/KType;[ILkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> ([ILkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun get ([I)Ljava/lang/Object;
public final fun getProducer ()Lkotlin/jvm/functions/Function1;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public abstract interface class space/kscience/kmath/nd/WithShape {
@ -2376,21 +2363,31 @@ public abstract interface class space/kscience/kmath/operations/WithSize {
}
public final class space/kscience/kmath/structures/ArrayBuffer : space/kscience/kmath/structures/MutableBuffer {
public synthetic fun <init> (Lkotlin/reflect/KType;[Ljava/lang/Object;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public static final synthetic fun box-impl ([Ljava/lang/Object;)Lspace/kscience/kmath/structures/ArrayBuffer;
public static fun constructor-impl ([Ljava/lang/Object;)[Ljava/lang/Object;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([Ljava/lang/Object;Ljava/lang/Object;)Z
public static final fun equals-impl0 ([Ljava/lang/Object;[Ljava/lang/Object;)Z
public fun get (I)Ljava/lang/Object;
public static fun get-impl ([Ljava/lang/Object;I)Ljava/lang/Object;
public fun getSize ()I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getSize-impl ([Ljava/lang/Object;)I
public fun hashCode ()I
public static fun hashCode-impl ([Ljava/lang/Object;)I
public fun iterator ()Ljava/util/Iterator;
public static fun iterator-impl ([Ljava/lang/Object;)Ljava/util/Iterator;
public fun set (ILjava/lang/Object;)V
public static fun set-impl ([Ljava/lang/Object;ILjava/lang/Object;)V
public fun toString ()Ljava/lang/String;
public static fun toString-impl ([Ljava/lang/Object;)Ljava/lang/String;
public final synthetic fun unbox-impl ()[Ljava/lang/Object;
}
public final class space/kscience/kmath/structures/ArrayBufferKt {
public static final fun asBuffer-Fnn_obI ([Ljava/lang/Object;Lkotlin/reflect/KType;)Lspace/kscience/kmath/structures/ArrayBuffer;
public static final fun asBuffer ([Ljava/lang/Object;)[Ljava/lang/Object;
}
public abstract interface class space/kscience/kmath/structures/Buffer : space/kscience/attributes/WithType, space/kscience/kmath/operations/WithSize {
public abstract interface class space/kscience/kmath/structures/Buffer : space/kscience/kmath/operations/WithSize {
public static final field Companion Lspace/kscience/kmath/structures/Buffer$Companion;
public abstract fun get (I)Ljava/lang/Object;
public abstract fun getSize ()I
@ -2449,7 +2446,6 @@ public final class space/kscience/kmath/structures/BufferSlice : space/kscience/
public abstract interface class space/kscience/kmath/structures/BufferView : space/kscience/kmath/structures/Buffer {
public fun get (I)Ljava/lang/Object;
public abstract fun getOrigin ()Lspace/kscience/kmath/structures/Buffer;
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
}
public final class space/kscience/kmath/structures/BufferViewKt {
@ -2477,7 +2473,6 @@ public final class space/kscience/kmath/structures/FlaggedDoubleBuffer : space/k
public fun getFlag (I)B
public final fun getFlags ()[B
public fun getSize ()I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public final fun getValues ()[D
public fun iterator ()Ljava/util/Iterator;
public fun toString ()Ljava/lang/String;
@ -2486,8 +2481,6 @@ public final class space/kscience/kmath/structures/FlaggedDoubleBuffer : space/k
public final class space/kscience/kmath/structures/Float32Buffer : space/kscience/kmath/structures/PrimitiveBuffer {
public static final synthetic fun box-impl ([F)Lspace/kscience/kmath/structures/Float32Buffer;
public static fun constructor-impl ([F)[F
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public static fun copy-impl ([F)Lspace/kscience/kmath/structures/MutableBuffer;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([FLjava/lang/Object;)Z
public static final fun equals-impl0 ([F[F)Z
@ -2497,8 +2490,6 @@ public final class space/kscience/kmath/structures/Float32Buffer : space/kscienc
public final fun getArray ()[F
public fun getSize ()I
public static fun getSize-impl ([F)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY ([F)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl ([F)I
public synthetic fun iterator ()Ljava/util/Iterator;
@ -2523,9 +2514,6 @@ public final class space/kscience/kmath/structures/Float64Buffer : space/kscienc
public static final field Companion Lspace/kscience/kmath/structures/Float64Buffer$Companion;
public static final synthetic fun box-impl ([D)Lspace/kscience/kmath/structures/Float64Buffer;
public static fun constructor-impl ([D)[D
public synthetic fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun copy-E20IKn8 ()[D
public static fun copy-E20IKn8 ([D)[D
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([DLjava/lang/Object;)Z
public static final fun equals-impl0 ([D[D)Z
@ -2535,8 +2523,6 @@ public final class space/kscience/kmath/structures/Float64Buffer : space/kscienc
public final fun getArray ()[D
public fun getSize ()I
public static fun getSize-impl ([D)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY ([D)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl ([D)I
public synthetic fun iterator ()Ljava/util/Iterator;
@ -2571,8 +2557,6 @@ public abstract interface class space/kscience/kmath/structures/Float64BufferTra
public final class space/kscience/kmath/structures/Int16Buffer : space/kscience/kmath/structures/MutableBuffer {
public static final synthetic fun box-impl ([S)Lspace/kscience/kmath/structures/Int16Buffer;
public static fun constructor-impl ([S)[S
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public static fun copy-impl ([S)Lspace/kscience/kmath/structures/MutableBuffer;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([SLjava/lang/Object;)Z
public static final fun equals-impl0 ([S[S)Z
@ -2582,8 +2566,6 @@ public final class space/kscience/kmath/structures/Int16Buffer : space/kscience/
public final fun getArray ()[S
public fun getSize ()I
public static fun getSize-impl ([S)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY ([S)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl ([S)I
public synthetic fun iterator ()Ljava/util/Iterator;
@ -2607,9 +2589,6 @@ public final class space/kscience/kmath/structures/Int16BufferKt {
public final class space/kscience/kmath/structures/Int32Buffer : space/kscience/kmath/structures/PrimitiveBuffer {
public static final synthetic fun box-impl ([I)Lspace/kscience/kmath/structures/Int32Buffer;
public static fun constructor-impl ([I)[I
public synthetic fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun copy-M_oXE9g ()[I
public static fun copy-M_oXE9g ([I)[I
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([ILjava/lang/Object;)Z
public static final fun equals-impl0 ([I[I)Z
@ -2619,8 +2598,6 @@ public final class space/kscience/kmath/structures/Int32Buffer : space/kscience/
public final fun getArray ()[I
public fun getSize ()I
public static fun getSize-impl ([I)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY ([I)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl ([I)I
public synthetic fun iterator ()Ljava/util/Iterator;
@ -2644,8 +2621,6 @@ public final class space/kscience/kmath/structures/Int32BufferKt {
public final class space/kscience/kmath/structures/Int64Buffer : space/kscience/kmath/structures/PrimitiveBuffer {
public static final synthetic fun box-impl ([J)Lspace/kscience/kmath/structures/Int64Buffer;
public static fun constructor-impl ([J)[J
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public static fun copy-impl ([J)Lspace/kscience/kmath/structures/MutableBuffer;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([JLjava/lang/Object;)Z
public static final fun equals-impl0 ([J[J)Z
@ -2655,8 +2630,6 @@ public final class space/kscience/kmath/structures/Int64Buffer : space/kscience/
public final fun getArray ()[J
public fun getSize ()I
public static fun getSize-impl ([J)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY ([J)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl ([J)I
public synthetic fun iterator ()Ljava/util/Iterator;
@ -2680,8 +2653,6 @@ public final class space/kscience/kmath/structures/Int64BufferKt {
public final class space/kscience/kmath/structures/Int8Buffer : space/kscience/kmath/structures/MutableBuffer {
public static final synthetic fun box-impl ([B)Lspace/kscience/kmath/structures/Int8Buffer;
public static fun constructor-impl ([B)[B
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public static fun copy-impl ([B)Lspace/kscience/kmath/structures/MutableBuffer;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl ([BLjava/lang/Object;)Z
public static final fun equals-impl0 ([B[B)Z
@ -2691,8 +2662,6 @@ public final class space/kscience/kmath/structures/Int8Buffer : space/kscience/k
public final fun getArray ()[B
public fun getSize ()I
public static fun getSize-impl ([B)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY ([B)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl ([B)I
public synthetic fun iterator ()Ljava/util/Iterator;
@ -2714,23 +2683,21 @@ public final class space/kscience/kmath/structures/Int8BufferKt {
}
public final class space/kscience/kmath/structures/ListBuffer : space/kscience/kmath/structures/Buffer {
public synthetic fun <init> (Lkotlin/reflect/KType;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/util/List;)V
public fun get (I)Ljava/lang/Object;
public final fun getList ()Ljava/util/List;
public fun getSize ()I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun iterator ()Ljava/util/Iterator;
public fun toString ()Ljava/lang/String;
}
public final class space/kscience/kmath/structures/ListBufferKt {
public static final fun asBuffer-Fnn_obI (Ljava/util/List;Lkotlin/reflect/KType;)Lspace/kscience/kmath/structures/ListBuffer;
public static final fun asMutableBuffer-Fnn_obI (Ljava/util/List;Lkotlin/reflect/KType;)Lspace/kscience/kmath/structures/MutableListBuffer;
public static final fun asBuffer (Ljava/util/List;)Lspace/kscience/kmath/structures/ListBuffer;
public static final fun asMutableBuffer (Ljava/util/List;)Lspace/kscience/kmath/structures/MutableListBuffer;
}
public abstract interface class space/kscience/kmath/structures/MutableBuffer : space/kscience/kmath/structures/Buffer {
public static final field Companion Lspace/kscience/kmath/structures/MutableBuffer$Companion;
public abstract fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public abstract fun set (ILjava/lang/Object;)V
}
@ -2752,15 +2719,15 @@ public final class space/kscience/kmath/structures/MutableBufferFactory$Companio
public final class space/kscience/kmath/structures/MutableBufferKt {
public static final fun MutableBuffer--rwW0uw (Lkotlin/reflect/KType;ILkotlin/jvm/functions/Function1;)Lspace/kscience/kmath/structures/MutableBuffer;
public static final fun copy (Lspace/kscience/kmath/structures/Buffer;Lspace/kscience/kmath/structures/BufferFactory;)Lspace/kscience/kmath/structures/Buffer;
public static final fun mutableCopy (Lspace/kscience/kmath/structures/Buffer;Lspace/kscience/kmath/structures/MutableBufferFactory;)Lspace/kscience/kmath/structures/MutableBuffer;
}
public final class space/kscience/kmath/structures/MutableListBuffer : space/kscience/kmath/structures/MutableBuffer {
public synthetic fun <init> (Lkotlin/reflect/KType;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun <init> (Ljava/util/List;)V
public fun get (I)Ljava/lang/Object;
public final fun getList ()Ljava/util/List;
public fun getSize ()I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun iterator ()Ljava/util/Iterator;
public fun set (ILjava/lang/Object;)V
public fun toString ()Ljava/lang/String;
@ -2789,7 +2756,6 @@ public final class space/kscience/kmath/structures/PermutedBuffer : space/kscien
public final class space/kscience/kmath/structures/PermutedMutableBuffer : space/kscience/kmath/structures/BufferView, space/kscience/kmath/structures/MutableBuffer {
public fun <init> (Lspace/kscience/kmath/structures/MutableBuffer;[I)V
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun get (I)Ljava/lang/Object;
public synthetic fun getOrigin ()Lspace/kscience/kmath/structures/Buffer;
public fun getOrigin ()Lspace/kscience/kmath/structures/MutableBuffer;
@ -2814,10 +2780,9 @@ public final class space/kscience/kmath/structures/ValueFlag : java/lang/Enum {
}
public final class space/kscience/kmath/structures/VirtualBuffer : space/kscience/kmath/structures/Buffer {
public synthetic fun <init> (Lkotlin/reflect/KType;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (ILkotlin/jvm/functions/Function1;)V
public fun get (I)Ljava/lang/Object;
public fun getSize ()I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun iterator ()Ljava/util/Iterator;
public fun toString ()Ljava/lang/String;
}

View File

@ -189,7 +189,7 @@ public abstract class DSAlgebra<T, A : Ring<T>>(
vararg derivatives: T,
): DS<T, A> {
require(derivatives.size == compiler.size) { "dimension mismatch: ${derivatives.size} and ${compiler.size}" }
val data = derivatives.asList().asBuffer(algebra.type)
val data = derivatives.asList().asBuffer()
return DS(data)
}

View File

@ -53,7 +53,7 @@ public class DerivationResult<T : Any>(
*/
public fun <T : Any> DerivationResult<T>.grad(vararg variables: Symbol): Point<T> {
check(variables.isNotEmpty()) { "Variable order is not provided for gradient construction" }
return variables.map(::derivative).asBuffer(type)
return variables.map(::derivative).asBuffer()
}
/**

View File

@ -227,4 +227,4 @@ public fun <T> Matrix<T>.asVector(): Point<T> =
* @receiver a buffer.
* @return the new matrix.
*/
public fun <T> Point<T>.asMatrix(): VirtualMatrix<T> = VirtualMatrix(type, size, 1) { i, _ -> get(i) }
public fun <T> Point<T>.asMatrix(): VirtualMatrix<T> = VirtualMatrix(size, 1) { i, _ -> get(i) }

View File

@ -27,7 +27,7 @@ public interface LupDecomposition<T> {
* Create a pivot matrix from pivot vector using provided [LinearSpace]
*/
public fun <T> LupDecomposition<T>.pivotMatrix(linearSpace: LinearSpace<T, Ring<T>>): Matrix<T> =
VirtualMatrix(linearSpace.type, l.rowNum, l.colNum) { row, column ->
VirtualMatrix(l.rowNum, l.colNum) { row, column ->
if (column == pivot[row]) linearSpace.elementAlgebra.one else linearSpace.elementAlgebra.zero
}
@ -47,7 +47,7 @@ public class GenericLupDecomposition<T>(
override val l: Matrix<T>
get() = VirtualMatrix(lu.type, lu.rowNum, lu.colNum, attributes = Attributes(LowerTriangular)) { i, j ->
get() = VirtualMatrix(lu.rowNum, lu.colNum, attributes = Attributes(LowerTriangular)) { i, j ->
when {
j < i -> lu[i, j]
j == i -> elementAlgebra.one
@ -56,7 +56,7 @@ public class GenericLupDecomposition<T>(
}
override val u: Matrix<T>
get() = VirtualMatrix(lu.type, lu.rowNum, lu.colNum, attributes = Attributes(UpperTriangular)) { i, j ->
get() = VirtualMatrix(lu.rowNum, lu.colNum, attributes = Attributes(UpperTriangular)) { i, j ->
if (j >= i) lu[i, j] else elementAlgebra.zero
}

View File

@ -68,7 +68,7 @@ public fun <T> Matrix<T>.modifyAttributes(modifier: (Attributes) -> Attributes):
public fun <T> LinearSpace<T, Ring<T>>.one(
rows: Int,
columns: Int,
): MatrixWrapper<T> = VirtualMatrix(type, rows, columns) { i, j ->
): MatrixWrapper<T> = VirtualMatrix(rows, columns) { i, j ->
if (i == j) elementAlgebra.one else elementAlgebra.zero
}.withAttribute(IsUnit)
@ -79,6 +79,6 @@ public fun <T> LinearSpace<T, Ring<T>>.one(
public fun <T> LinearSpace<T, Ring<T>>.zero(
rows: Int,
columns: Int,
): MatrixWrapper<T> = VirtualMatrix(type, rows, columns) { _, _ ->
): MatrixWrapper<T> = VirtualMatrix(rows, columns) { _, _ ->
elementAlgebra.zero
}.withAttribute(IsZero)

View File

@ -6,11 +6,9 @@
package space.kscience.kmath.linear
import space.kscience.attributes.Attributes
import space.kscience.attributes.SafeType
public class TransposedMatrix<T>(public val origin: Matrix<T>) : Matrix<T> {
override val type: SafeType<T> get() = origin.type
override val rowNum: Int get() = origin.colNum

View File

@ -6,7 +6,6 @@
package space.kscience.kmath.linear
import space.kscience.attributes.Attributes
import space.kscience.attributes.SafeType
import space.kscience.kmath.nd.ShapeND
@ -16,7 +15,6 @@ import space.kscience.kmath.nd.ShapeND
* @property generator the function that provides elements.
*/
public class VirtualMatrix<out T>(
override val type: SafeType<T>,
override val rowNum: Int,
override val colNum: Int,
override val attributes: Attributes = Attributes.EMPTY,
@ -31,4 +29,4 @@ public class VirtualMatrix<out T>(
public fun <T : Any> MatrixBuilder<T, *>.virtual(
attributes: Attributes = Attributes.EMPTY,
generator: (i: Int, j: Int) -> T,
): VirtualMatrix<T> = VirtualMatrix(type, rows, columns, attributes, generator)
): VirtualMatrix<T> = VirtualMatrix(rows, columns, attributes, generator)

View File

@ -26,7 +26,7 @@ public fun <V : Comparable<V>> Buffer<V>.indicesSorted(): IntArray = permSortInd
*/
public fun <V : Comparable<V>> Buffer<V>.sorted(): Buffer<V> {
val permutations = indicesSorted()
return VirtualBuffer(type, size) { this[permutations[it]] }
return VirtualBuffer(size) { this[permutations[it]] }
}
@UnstableKMathAPI
@ -38,7 +38,7 @@ public fun <V : Comparable<V>> Buffer<V>.indicesSortedDescending(): IntArray =
*/
public fun <V : Comparable<V>> Buffer<V>.sortedDescending(): Buffer<V> {
val permutations = indicesSortedDescending()
return VirtualBuffer(type, size) { this[permutations[it]] }
return VirtualBuffer(size) { this[permutations[it]] }
}
@UnstableKMathAPI
@ -47,7 +47,7 @@ public fun <V, C : Comparable<C>> Buffer<V>.indicesSortedBy(selector: (V) -> C):
public fun <V, C : Comparable<C>> Buffer<V>.sortedBy(selector: (V) -> C): Buffer<V> {
val permutations = indicesSortedBy(selector)
return VirtualBuffer(type, size) { this[permutations[it]] }
return VirtualBuffer(size) { this[permutations[it]] }
}
@UnstableKMathAPI
@ -56,7 +56,7 @@ public fun <V, C : Comparable<C>> Buffer<V>.indicesSortedByDescending(selector:
public fun <V, C : Comparable<C>> Buffer<V>.sortedByDescending(selector: (V) -> C): Buffer<V> {
val permutations = indicesSortedByDescending(selector)
return VirtualBuffer(type, size) { this[permutations[it]] }
return VirtualBuffer(size) { this[permutations[it]] }
}
@UnstableKMathAPI
@ -68,7 +68,7 @@ public fun <V> Buffer<V>.indicesSortedWith(comparator: Comparator<V>): IntArray
*/
public fun <V> Buffer<V>.sortedWith(comparator: Comparator<V>): Buffer<V> {
val permutations = indicesSortedWith(comparator)
return VirtualBuffer(type,size) { this[permutations[it]] }
return VirtualBuffer(size) { this[permutations[it]] }
}
private fun <V> Buffer<V>.permSortIndicesWith(comparator: Comparator<Int>): IntArray {

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.nd
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.BufferFactory
@ -24,8 +23,6 @@ public open class BufferND<out T>(
public open val buffer: Buffer<T>,
) : StructureND<T> {
override val type: SafeType<T> get() = buffer.type
@PerformancePitfall
override operator fun get(index: IntArray): T = buffer[indices.offset(index)]

View File

@ -5,11 +5,9 @@
package space.kscience.kmath.nd
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.operations.*
import space.kscience.kmath.structures.Float64
import space.kscience.kmath.structures.Float64Buffer
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@ -24,8 +22,6 @@ public class Float64BufferND(
override val buffer: Float64Buffer,
) : MutableBufferND<Double>(indexes, buffer), MutableStructureNDOfDouble {
override val type: SafeType<Float64> get() = Float64Field.type
override fun getDouble(index: IntArray): Double = buffer[indices.offset(index)]
override fun setDouble(index: IntArray, value: Double) {

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.nd
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
@ -14,8 +13,6 @@ public class PermutedStructureND<T>(
public val permutation: (IntArray) -> IntArray,
) : StructureND<T> {
override val type: SafeType<T> get() = origin.type
override val shape: ShapeND
get() = origin.shape
@ -35,8 +32,6 @@ public class PermutedMutableStructureND<T>(
public val permutation: (IntArray) -> IntArray,
) : MutableStructureND<T> {
override val type: SafeType<T> get() = origin.type
@OptIn(PerformancePitfall::class)
override fun set(index: IntArray, value: T) {
origin[permutation(index)] = value

View File

@ -5,12 +5,10 @@
package space.kscience.kmath.nd
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.operations.asSequence
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.MutableBuffer
import space.kscience.kmath.structures.asMutableBuffer
import kotlin.jvm.JvmInline
/**
@ -48,8 +46,6 @@ public interface MutableStructure1D<T> : Structure1D<T>, MutableStructureND<T>,
@JvmInline
private value class Structure1DWrapper<out T>(val structure: StructureND<T>) : Structure1D<T> {
override val type: SafeType<T> get() = structure.type
override val shape: ShapeND get() = structure.shape
override val size: Int get() = structure.shape[0]
@ -65,8 +61,6 @@ private value class Structure1DWrapper<out T>(val structure: StructureND<T>) : S
*/
private class MutableStructure1DWrapper<T>(val structure: MutableStructureND<T>) : MutableStructure1D<T> {
override val type: SafeType<T> get() = structure.type
override val shape: ShapeND get() = structure.shape
override val size: Int get() = structure.shape[0]
@ -81,13 +75,6 @@ private class MutableStructure1DWrapper<T>(val structure: MutableStructureND<T>)
structure[intArrayOf(index)] = value
}
@OptIn(PerformancePitfall::class)
override fun copy(): MutableBuffer<T> = structure
.elements()
.map(Pair<IntArray, T>::second)
.toMutableList()
.asMutableBuffer(type)
override fun toString(): String = Buffer.toString(this)
}
@ -98,8 +85,6 @@ private class MutableStructure1DWrapper<T>(val structure: MutableStructureND<T>)
@JvmInline
private value class Buffer1DWrapper<out T>(val buffer: Buffer<T>) : Structure1D<T> {
override val type: SafeType<T> get() = buffer.type
override val shape: ShapeND get() = ShapeND(buffer.size)
override val size: Int get() = buffer.size
@ -113,8 +98,6 @@ private value class Buffer1DWrapper<out T>(val buffer: Buffer<T>) : Structure1D<
internal class MutableBuffer1DWrapper<T>(val buffer: MutableBuffer<T>) : MutableStructure1D<T> {
override val type: SafeType<T> get() = buffer.type
override val shape: ShapeND get() = ShapeND(buffer.size)
override val size: Int get() = buffer.size
@ -128,8 +111,6 @@ internal class MutableBuffer1DWrapper<T>(val buffer: MutableBuffer<T>) : Mutable
buffer[index] = value
}
override fun copy(): MutableBuffer<T> = buffer.copy()
override fun toString(): String = Buffer.toString(this)
}

View File

@ -6,7 +6,6 @@
package space.kscience.kmath.nd
import space.kscience.attributes.Attributes
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.MutableBuffer
@ -36,14 +35,14 @@ public interface Structure2D<out T> : StructureND<T> {
*/
@PerformancePitfall
public val rows: List<Buffer<T>>
get() = List(rowNum) { i -> VirtualBuffer(type, colNum) { j -> get(i, j) } }
get() = List(rowNum) { i -> VirtualBuffer(colNum) { j -> get(i, j) } }
/**
* The buffer of columns for this structure. It gets elements from the structure dynamically.
*/
@PerformancePitfall
public val columns: List<Buffer<T>>
get() = List(colNum) { j -> VirtualBuffer(type, rowNum) { i -> get(i, j) } }
get() = List(colNum) { j -> VirtualBuffer(rowNum) { i -> get(i, j) } }
/**
* Retrieves an element from the structure by two indices.
@ -79,8 +78,6 @@ public class MutableStructureNDAccessorBuffer<T>(
private val indexer: (Int) -> IntArray,
) : MutableBuffer<T> {
override val type: SafeType<T> get() = structure.type
override fun set(index: Int, value: T) {
structure[indexer(index)] = value
}
@ -88,8 +85,6 @@ public class MutableStructureNDAccessorBuffer<T>(
override fun get(index: Int): T = structure[indexer(index)]
override fun toString(): String = "AccessorBuffer(structure=$structure, size=$size)"
override fun copy(): MutableBuffer<T> = MutableBuffer(type, size, ::get)
}
/**
@ -130,8 +125,6 @@ public interface MutableStructure2D<T> : Structure2D<T>, MutableStructureND<T> {
@JvmInline
private value class Structure2DWrapper<out T>(val structure: StructureND<T>) : Structure2D<T> {
override val type: SafeType<T> get() = structure.type
override val shape: ShapeND get() = structure.shape
override val rowNum: Int get() = shape[0]
@ -152,8 +145,6 @@ private value class Structure2DWrapper<out T>(val structure: StructureND<T>) : S
*/
private class MutableStructure2DWrapper<T>(val structure: MutableStructureND<T>) : MutableStructure2D<T> {
override val type: SafeType<T> get() = structure.type
override val shape: ShapeND get() = structure.shape
override val rowNum: Int get() = shape[0]

View File

@ -5,7 +5,10 @@
package space.kscience.kmath.nd
import space.kscience.attributes.*
import space.kscience.attributes.Attribute
import space.kscience.attributes.AttributeContainer
import space.kscience.attributes.Attributes
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.linear.LinearSpace
import space.kscience.kmath.operations.Ring
@ -24,7 +27,7 @@ public interface StructureAttribute<T> : Attribute<T>
*
* @param T the type of items.
*/
public interface StructureND<out T> : AttributeContainer, WithShape, WithType<T> {
public interface StructureND<out T> : AttributeContainer, WithShape {
/**
* The shape of structure i.e., non-empty sequence of non-negative integers that specify sizes of dimensions for
* this structure.

View File

@ -5,13 +5,10 @@
package space.kscience.kmath.nd
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.UnstableKMathAPI
public open class VirtualStructureND<T>(
override val type: SafeType<T>,
override val shape: ShapeND,
public val producer: (IntArray) -> T,
) : StructureND<T> {
@ -27,10 +24,10 @@ public open class VirtualStructureND<T>(
public class VirtualDoubleStructureND(
shape: ShapeND,
producer: (IntArray) -> Double,
) : VirtualStructureND<Double>(safeTypeOf(), shape, producer)
) : VirtualStructureND<Double>(shape, producer)
@UnstableKMathAPI
public class VirtualIntStructureND(
shape: ShapeND,
producer: (IntArray) -> Int,
) : VirtualStructureND<Int>(safeTypeOf(), shape, producer)
) : VirtualStructureND<Int>(shape, producer)

View File

@ -10,7 +10,7 @@ import space.kscience.kmath.PerformancePitfall
@OptIn(PerformancePitfall::class)
public fun <T> StructureND<T>.roll(axis: Int, step: Int = 1): StructureND<T> {
require(axis in shape.indices) { "Axis $axis is outside of shape dimensions: [0, ${shape.size})" }
return VirtualStructureND(type, shape) { index ->
return VirtualStructureND(shape) { index ->
val newIndex: IntArray = IntArray(index.size) { indexAxis ->
if (indexAxis == axis) {
(index[indexAxis] + step).mod(shape[indexAxis])
@ -26,7 +26,7 @@ public fun <T> StructureND<T>.roll(axis: Int, step: Int = 1): StructureND<T> {
public fun <T> StructureND<T>.roll(pair: Pair<Int, Int>, vararg others: Pair<Int, Int>): StructureND<T> {
val axisMap: Map<Int, Int> = mapOf(pair, *others)
require(axisMap.keys.all { it in shape.indices }) { "Some of axes ${axisMap.keys} is outside of shape dimensions: [0, ${shape.size})" }
return VirtualStructureND(type, shape) { index ->
return VirtualStructureND(shape) { index ->
val newIndex: IntArray = IntArray(index.size) { indexAxis ->
val offset = axisMap[indexAxis] ?: 0
(index[indexAxis] + offset).mod(shape[indexAxis])

View File

@ -5,14 +5,9 @@
package space.kscience.kmath.nd
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.operations.Float64Field
import space.kscience.kmath.operations.Int32Field
import space.kscience.kmath.structures.Float64
public interface StructureNDOfDouble : StructureND<Double> {
override val type: SafeType<Float64> get() = Float64Field.type
/**
* Guaranteed non-blocking access to content
@ -42,8 +37,6 @@ public fun MutableStructureND<Double>.getDouble(index: IntArray): Double =
public interface StructureNDOfInt : StructureND<Int> {
override val type: SafeType<Int> get() = Int32Field.type
/**
* Guaranteed non-blocking access to content
*/

View File

@ -5,8 +5,7 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.jvm.JvmInline
/**
* [MutableBuffer] implementation over [Array].
@ -14,7 +13,8 @@ import space.kscience.attributes.safeTypeOf
* @param T the type of elements contained in the buffer.
* @property array The underlying array.
*/
public class ArrayBuffer<T>(override val type: SafeType<T>, internal val array: Array<T>) : MutableBuffer<T> {
@JvmInline
public value class ArrayBuffer<T>(internal val array: Array<T>) : MutableBuffer<T> {
// Can't inline because array is invariant
override val size: Int get() = array.size
@ -25,7 +25,6 @@ public class ArrayBuffer<T>(override val type: SafeType<T>, internal val array:
}
override operator fun iterator(): Iterator<T> = array.iterator()
override fun copy(): MutableBuffer<T> = ArrayBuffer(type, array.copyOf())
override fun toString(): String = Buffer.toString(this)
}
@ -33,9 +32,4 @@ public class ArrayBuffer<T>(override val type: SafeType<T>, internal val array:
/**
* Returns an [ArrayBuffer] that wraps the original array.
*/
public fun <T> Array<T>.asBuffer(type: SafeType<T>): ArrayBuffer<T> = ArrayBuffer(type, this)
/**
* Returns an [ArrayBuffer] that wraps the original array.
*/
public inline fun <reified T> Array<T>.asBuffer(): ArrayBuffer<T> = ArrayBuffer(safeTypeOf<T>(), this)
public fun <T> Array<T>.asBuffer(): ArrayBuffer<T> = ArrayBuffer( this)

View File

@ -66,7 +66,7 @@ public inline fun <reified T> MutableBufferFactory(): MutableBufferFactory<T> =
*
* @param T the type of elements contained in the buffer.
*/
public interface Buffer<out T> : WithSize, WithType<T> {
public interface Buffer<out T> : WithSize {
/**
* The size of this buffer.
*/
@ -120,7 +120,7 @@ public fun <T> Buffer(
typeOf<Int>() -> MutableBuffer.int(size) { initializer(it) as Int } as Buffer<T>
typeOf<Long>() -> MutableBuffer.long(size) { initializer(it) as Long } as Buffer<T>
typeOf<Float>() -> MutableBuffer.float(size) { initializer(it) as Float } as Buffer<T>
else -> List(size, initializer).asBuffer(type)
else -> List(size, initializer).asBuffer()
}
/**
@ -139,7 +139,7 @@ public inline fun <reified T> Buffer(size: Int, initializer: (Int) -> T): Buffer
typeOf<Int>() -> MutableBuffer.int(size) { initializer(it) as Int } as Buffer<T>
typeOf<Long>() -> MutableBuffer.long(size) { initializer(it) as Long } as Buffer<T>
typeOf<Float>() -> MutableBuffer.float(size) { initializer(it) as Float } as Buffer<T>
else -> List(size, initializer).asBuffer(type)
else -> List(size, initializer).asBuffer()
}
}
@ -172,7 +172,6 @@ public fun <T> Buffer<T>.last(): T {
* @param T the type of elements provided by the buffer.
*/
public class VirtualBuffer<out T>(
override val type: SafeType<T>,
override val size: Int,
private val generator: (Int) -> T,
) : Buffer<T> {
@ -185,11 +184,3 @@ public class VirtualBuffer<out T>(
override fun toString(): String = Buffer.toString(this)
}
/**
* Inline builder for [VirtualBuffer]
*/
public inline fun <reified T> VirtualBuffer(
size: Int,
noinline generator: (Int) -> T,
): VirtualBuffer<T> = VirtualBuffer(safeTypeOf(), size, generator)

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.kmath.nd.Structure2D
/**
@ -33,7 +32,6 @@ internal class BufferAccessor2D<T>(
// ) { (i, j) -> get(i, j) }.as2D()
inner class Row(val buffer: MutableBuffer<T>, val rowIndex: Int) : MutableBuffer<T> {
override val type: SafeType<T> get() = buffer.type
override val size: Int get() = colNum
@ -43,7 +41,6 @@ internal class BufferAccessor2D<T>(
buffer[rowIndex, index] = value
}
override fun copy(): MutableBuffer<T> = factory(colNum) { get(it) }
override operator fun iterator(): Iterator<T> = (0 until colNum).map(::get).iterator()
override fun toString(): String = Buffer.toString(this)

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.kmath.UnstableKMathAPI
/**
@ -14,8 +13,6 @@ import space.kscience.kmath.UnstableKMathAPI
public interface BufferView<T> : Buffer<T> {
public val origin: Buffer<T>
override val type: SafeType<T> get() = origin.type
/**
* Get the index in [origin] buffer from index in this buffer.
* Return -1 if element not present in the original buffer
@ -190,9 +187,7 @@ public class PermutedMutableBuffer<T>(
origin[permutations[index]] = value
}
override fun copy(): MutableBuffer<T> = PermutedMutableBuffer(origin.copy(), permutations)
//TODO Probably could be optimized
override fun iterator(): Iterator<T> = permutations.asSequence().map { origin[it] }.iterator()
@UnstableKMathAPI

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.experimental.and
/**
@ -60,8 +58,6 @@ public class FlaggedDoubleBuffer(
public val flags: ByteArray
) : FlaggedBuffer<Double?>, Buffer<Double?> {
override val type: SafeType<Double?> = safeTypeOf()
init {
require(values.size == flags.size) { "Values and flags must have the same dimensions" }
}

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.jvm.JvmInline
/**
@ -18,8 +16,6 @@ import kotlin.jvm.JvmInline
@JvmInline
public value class Float32Buffer(public val array: FloatArray) : PrimitiveBuffer<Float> {
override val type: SafeType<Float32> get() = safeTypeOf<Float32>()
override val size: Int get() = array.size
override operator fun get(index: Int): Float = array[index]
@ -30,8 +26,6 @@ public value class Float32Buffer(public val array: FloatArray) : PrimitiveBuffer
override operator fun iterator(): FloatIterator = array.iterator()
override fun copy(): MutableBuffer<Float> =
Float32Buffer(array.copyOf())
}
public typealias FloatBuffer = Float32Buffer

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import space.kscience.kmath.operations.BufferTransform
import kotlin.jvm.JvmInline
@ -18,8 +16,6 @@ import kotlin.jvm.JvmInline
@JvmInline
public value class Float64Buffer(public val array: DoubleArray) : PrimitiveBuffer<Double> {
override val type: SafeType<Double> get() = safeTypeOf()
override val size: Int get() = array.size
override operator fun get(index: Int): Double = array[index]
@ -30,8 +26,6 @@ public value class Float64Buffer(public val array: DoubleArray) : PrimitiveBuffe
override operator fun iterator(): DoubleIterator = array.iterator()
override fun copy(): Float64Buffer = Float64Buffer(array.copyOf())
override fun toString(): String = Buffer.toString(this)
public companion object {

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.jvm.JvmInline
/**
@ -17,7 +15,7 @@ import kotlin.jvm.JvmInline
@JvmInline
public value class Int16Buffer(public val array: ShortArray) : MutableBuffer<Short> {
override val type: SafeType<Short> get() = safeTypeOf()
override val size: Int get() = array.size
override operator fun get(index: Int): Short = array[index]
@ -27,7 +25,6 @@ public value class Int16Buffer(public val array: ShortArray) : MutableBuffer<Sho
}
override operator fun iterator(): ShortIterator = array.iterator()
override fun copy(): MutableBuffer<Short> = Int16Buffer(array.copyOf())
}
public typealias ShortBuffer = Int16Buffer

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.jvm.JvmInline
/**
@ -17,7 +15,6 @@ import kotlin.jvm.JvmInline
@JvmInline
public value class Int32Buffer(public val array: IntArray) : PrimitiveBuffer<Int> {
override val type: SafeType<Int> get() = safeTypeOf()
override val size: Int get() = array.size
@ -29,7 +26,6 @@ public value class Int32Buffer(public val array: IntArray) : PrimitiveBuffer<Int
override operator fun iterator(): IntIterator = array.iterator()
override fun copy(): Int32Buffer = Int32Buffer(array.copyOf())
}
public typealias IntBuffer = Int32Buffer

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.jvm.JvmInline
/**
@ -17,8 +15,6 @@ import kotlin.jvm.JvmInline
@JvmInline
public value class Int64Buffer(public val array: LongArray) : PrimitiveBuffer<Long> {
override val type: SafeType<Long> get() = safeTypeOf()
override val size: Int get() = array.size
override operator fun get(index: Int): Long = array[index]
@ -29,8 +25,6 @@ public value class Int64Buffer(public val array: LongArray) : PrimitiveBuffer<Lo
override operator fun iterator(): LongIterator = array.iterator()
override fun copy(): MutableBuffer<Long> =
Int64Buffer(array.copyOf())
}
public typealias LongBuffer = Int64Buffer

View File

@ -5,8 +5,6 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import kotlin.jvm.JvmInline
/**
@ -17,8 +15,6 @@ import kotlin.jvm.JvmInline
@JvmInline
public value class Int8Buffer(public val array: ByteArray) : MutableBuffer<Byte> {
override val type: SafeType<Byte> get() = safeTypeOf()
override val size: Int get() = array.size
override operator fun get(index: Int): Byte = array[index]
@ -28,7 +24,6 @@ public value class Int8Buffer(public val array: ByteArray) : MutableBuffer<Byte>
}
override operator fun iterator(): ByteIterator = array.iterator()
override fun copy(): MutableBuffer<Byte> = Int8Buffer(array.copyOf())
}
/**

View File

@ -5,16 +5,13 @@
package space.kscience.kmath.structures
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
/**
* [Buffer] implementation over [List].
*
* @param T the type of elements contained in the buffer.
* @property list The underlying list.
*/
public class ListBuffer<T>(override val type: SafeType<T>, public val list: List<T>) : Buffer<T> {
public class ListBuffer<T>(public val list: List<T>) : Buffer<T> {
override val size: Int get() = list.size
@ -28,12 +25,7 @@ public class ListBuffer<T>(override val type: SafeType<T>, public val list: List
/**
* Returns an [ListBuffer] that wraps the original list.
*/
public fun <T> List<T>.asBuffer(type: SafeType<T>): ListBuffer<T> = ListBuffer(type, this)
/**
* Returns an [ListBuffer] that wraps the original list.
*/
public inline fun <reified T> List<T>.asBuffer(): ListBuffer<T> = asBuffer(safeTypeOf())
public fun <T> List<T>.asBuffer(): ListBuffer<T> = ListBuffer(this)
/**
* [MutableBuffer] implementation over [MutableList].
@ -41,7 +33,7 @@ public inline fun <reified T> List<T>.asBuffer(): ListBuffer<T> = asBuffer(safeT
* @param T the type of elements contained in the buffer.
* @property list The underlying list.
*/
public class MutableListBuffer<T>(override val type: SafeType<T>, public val list: MutableList<T>) : MutableBuffer<T> {
public class MutableListBuffer<T>(public val list: MutableList<T>) : MutableBuffer<T> {
override val size: Int get() = list.size
@ -52,7 +44,6 @@ public class MutableListBuffer<T>(override val type: SafeType<T>, public val lis
}
override operator fun iterator(): Iterator<T> = list.iterator()
override fun copy(): MutableBuffer<T> = MutableListBuffer(type, ArrayList(list))
override fun toString(): String = Buffer.toString(this)
}
@ -61,15 +52,4 @@ public class MutableListBuffer<T>(override val type: SafeType<T>, public val lis
/**
* Returns an [MutableListBuffer] that wraps the original list.
*/
public fun <T> MutableList<T>.asMutableBuffer(type: SafeType<T>): MutableListBuffer<T> = MutableListBuffer(
type,
this
)
/**
* Returns an [MutableListBuffer] that wraps the original list.
*/
public inline fun <reified T> MutableList<T>.asMutableBuffer(): MutableListBuffer<T> = MutableListBuffer(
safeTypeOf(),
this
)
public fun <T> MutableList<T>.asMutableBuffer(): MutableListBuffer<T> = MutableListBuffer(this)

View File

@ -14,16 +14,13 @@ import kotlin.reflect.typeOf
*
* @param T the type of elements contained in the buffer.
*/
public interface MutableBuffer<T> : Buffer<T> {
public interface MutableBuffer<T> : Buffer<T>{
/**
* Sets the array element at the specified [index] to the specified [value].
*/
public operator fun set(index: Int, value: T)
/**
* Returns a shallow copy of the buffer.
*/
public fun copy(): MutableBuffer<T>
public companion object {
/**
@ -65,6 +62,25 @@ public interface MutableBuffer<T> : Buffer<T> {
}
/**
* Returns a shallow copy of the buffer.
*/
public fun <T> Buffer<T>.copy(bufferFactory: BufferFactory<T>): Buffer<T> =if(this is ArrayBuffer){
ArrayBuffer(array.copyOf())
}else{
bufferFactory(size,::get)
}
/**
* Returns a mutable shallow copy of the buffer.
*/
public fun <T> Buffer<T>.mutableCopy(bufferFactory: MutableBufferFactory<T>): MutableBuffer<T> =if(this is ArrayBuffer){
ArrayBuffer(array.copyOf())
}else{
bufferFactory(size,::get)
}
/**
* Creates a [MutableBuffer] of given [type]. If the type is primitive, specialized buffers are used
* ([Int32Buffer], [Float64Buffer], etc.), [ListBuffer] is returned otherwise.
@ -84,7 +100,7 @@ public inline fun <T> MutableBuffer(
typeOf<Float>() -> MutableBuffer.float(size) { initializer(it) as Float } as MutableBuffer<T>
typeOf<Double>() -> MutableBuffer.double(size) { initializer(it) as Double } as MutableBuffer<T>
//TODO add unsigned types
else -> MutableListBuffer(type, MutableList(size, initializer))
else -> MutableListBuffer(MutableList(size, initializer))
}
/**

View File

@ -38,7 +38,7 @@ class MatrixTest {
@Test
fun testMatrixExtension() = Double.algebra.linearSpace.run {
val transitionMatrix: Matrix<Double> = VirtualMatrix(type,6, 6) { row, col ->
val transitionMatrix: Matrix<Double> = VirtualMatrix(6, 6) { row, col ->
when {
col == 0 -> .50
row + 1 == col -> .50

View File

@ -33,7 +33,7 @@ public fun <T> MutableBuffer.Companion.parallel(
typeOf<Double>() -> IntStream.range(0, size).parallel().mapToDouble { initializer(it) as Float64 }.toArray()
.asBuffer() as MutableBuffer<T>
//TODO add unsigned types
else -> IntStream.range(0, size).parallel().mapToObj { initializer(it) }.collect(Collectors.toList<T>()).asMutableBuffer(type)
else -> IntStream.range(0, size).parallel().mapToObj { initializer(it) }.collect(Collectors.toList<T>()).asMutableBuffer()
}
public class ParallelBufferFactory<T>(override val type: SafeType<T>) : MutableBufferFactory<T> {

View File

@ -37,7 +37,7 @@ class ParallelMatrixTest {
@Test
fun testMatrixExtension() = Float64Field.linearSpace.parallel{
val transitionMatrix: Matrix<Double> = VirtualMatrix(type,6, 6) { row, col ->
val transitionMatrix: Matrix<Double> = VirtualMatrix(6, 6) { row, col ->
when {
col == 0 -> .50
row + 1 == col -> .50

View File

@ -7,22 +7,19 @@ package space.kscience.kmath.streaming
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import space.kscience.attributes.SafeType
import space.kscience.kmath.operations.Group
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.MutableBuffer
import space.kscience.kmath.structures.VirtualBuffer
import space.kscience.kmath.structures.*
/**
* Thread-safe ring buffer
*/
public class RingBuffer<T>(
private val buffer: MutableBuffer<T>,
private val bufferFactory: BufferFactory<T>,
private var startIndex: Int = 0,
size: Int = 0,
) : Buffer<T> {
override val type: SafeType<T> get() = buffer.type
private val mutex: Mutex = Mutex()
@ -43,7 +40,7 @@ public class RingBuffer<T>(
override operator fun iterator(): Iterator<T> = object : AbstractIterator<T>() {
private var count = size
private var index = startIndex
val copy = buffer.copy()
val copy = buffer.copy(bufferFactory)
override fun computeNext() {
if (count == 0) done() else {
@ -58,8 +55,8 @@ public class RingBuffer<T>(
* A safe snapshot operation
*/
public suspend fun snapshot(): Buffer<T> = mutex.withLock {
val copy = buffer.copy()
VirtualBuffer(type, size) { i -> copy[startIndex.forward(i)] }
val copy = buffer.copy(bufferFactory)
VirtualBuffer(size) { i -> copy[startIndex.forward(i)] }
}
public suspend fun push(element: T) {
@ -76,7 +73,7 @@ public class RingBuffer<T>(
public inline fun <reified T : Any> RingBuffer(size: Int, empty: T): RingBuffer<T> {
val buffer = MutableBuffer(size) { empty }
return RingBuffer(buffer)
return RingBuffer(buffer, BufferFactory())
}
/**
@ -84,5 +81,5 @@ public inline fun <reified T : Any> RingBuffer(size: Int, empty: T): RingBuffer<
*/
public fun <T> RingBuffer(size: Int, algebra: Group<T>): RingBuffer<T> {
val buffer: MutableBuffer<T> = MutableBuffer(algebra.type, size) { algebra.zero }
return RingBuffer(buffer)
return RingBuffer(buffer, algebra.bufferFactory)
}

View File

@ -6,8 +6,6 @@
package space.kscience.kmath.structures
import kotlinx.coroutines.*
import space.kscience.attributes.SafeType
import space.kscience.attributes.safeTypeOf
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.coroutines.Math
import space.kscience.kmath.nd.ColumnStrides
@ -16,7 +14,6 @@ import space.kscience.kmath.nd.StructureND
public class LazyStructureND<out T>(
public val scope: CoroutineScope,
override val type: SafeType<T>,
override val shape: ShapeND,
public val function: suspend (IntArray) -> T,
) : StructureND<T> {
@ -54,10 +51,10 @@ public suspend fun <T> StructureND<T>.await(index: IntArray): T =
public inline fun <T, reified R> StructureND<T>.mapAsyncIndexed(
scope: CoroutineScope,
crossinline function: suspend (T, index: IntArray) -> R,
): LazyStructureND<R> = LazyStructureND(scope, safeTypeOf(), shape) { index -> function(get(index), index) }
): LazyStructureND<R> = LazyStructureND(scope, shape) { index -> function(get(index), index) }
@OptIn(PerformancePitfall::class)
public inline fun <T, reified R> StructureND<T>.mapAsync(
scope: CoroutineScope,
crossinline function: suspend (T) -> R,
): LazyStructureND<R> = LazyStructureND(scope, safeTypeOf(), shape) { index -> function(get(index)) }
): LazyStructureND<R> = LazyStructureND(scope, shape) { index -> function(get(index)) }

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.dimensions
import space.kscience.attributes.SafeType
import space.kscience.kmath.linear.*
import space.kscience.kmath.nd.ShapeND
import space.kscience.kmath.nd.Structure2D
@ -50,8 +49,6 @@ public value class DMatrixWrapper<out T, R : Dimension, C : Dimension>(
private val structure: Structure2D<T>,
) : DMatrix<T, R, C> {
override val type: SafeType<T> get() = structure.type
override val shape: ShapeND get() = structure.shape
override val rowNum: Int get() = shape[0]
override val colNum: Int get() = shape[1]
@ -81,8 +78,6 @@ public interface DPoint<out T, D : Dimension> : Point<T> {
@JvmInline
public value class DPointWrapper<out T, D : Dimension>(public val point: Point<T>) : DPoint<T, D> {
override val type: SafeType<T> get() = point.type
override val size: Int get() = point.size
override operator fun get(index: Int): T = point[index]

View File

@ -38,7 +38,6 @@ public class EjmlDoubleVector<out M : DMatrix>(override val origin: M) : EjmlVec
require(origin.numRows == 1) { "The origin matrix must have only one row to form a vector" }
}
override val type: SafeType<Double> get() = safeTypeOf()
override operator fun get(index: Int): Double = origin[0, index]
}
@ -51,8 +50,6 @@ public class EjmlFloatVector<out M : FMatrix>(override val origin: M) : EjmlVect
require(origin.numRows == 1) { "The origin matrix must have only one row to form a vector" }
}
override val type: SafeType<Float> get() = safeTypeOf()
override operator fun get(index: Int): Float = origin[0, index]
}
@ -60,8 +57,6 @@ public class EjmlFloatVector<out M : FMatrix>(override val origin: M) : EjmlVect
* [EjmlMatrix] specialization for [Double].
*/
public class EjmlDoubleMatrix<out M : DMatrix>(override val origin: M) : EjmlMatrix<Double, M>(origin) {
override val type: SafeType<Double> get() = safeTypeOf()
override operator fun get(i: Int, j: Int): Double = origin[i, j]
}
@ -69,7 +64,6 @@ public class EjmlDoubleMatrix<out M : DMatrix>(override val origin: M) : EjmlMat
* [EjmlMatrix] specialization for [Float].
*/
public class EjmlFloatMatrix<out M : FMatrix>(override val origin: M) : EjmlMatrix<Float, M>(origin) {
override val type: SafeType<Float> get() = safeTypeOf()
override operator fun get(i: Int, j: Int): Float = origin[i, j]
}

View File

@ -48,7 +48,7 @@ public fun Sequence<DoubleArray>.toMatrix(): RealMatrix = toList().let {
}
public fun RealMatrix.repeatStackVertical(n: Int): RealMatrix =
VirtualMatrix(type, rowNum * n, colNum) { row, col ->
VirtualMatrix( rowNum * n, colNum) { row, col ->
get(if (row == 0) 0 else row % rowNum, col)
}

View File

@ -54,14 +54,14 @@ public fun <T : Comparable<T>> PolynomialInterpolator<T>.interpolatePolynomials(
public fun <T : Comparable<T>> PolynomialInterpolator<T>.interpolatePolynomials(
data: Map<T, T>,
): PiecewisePolynomial<T> {
val pointSet = XYColumnarData.of(data.keys.toList().asBuffer(type), data.values.toList().asBuffer(type))
val pointSet = XYColumnarData.of(data.keys.toList().asBuffer(), data.values.toList().asBuffer())
return interpolatePolynomials(pointSet)
}
public fun <T : Comparable<T>> PolynomialInterpolator<T>.interpolatePolynomials(
data: List<Pair<T, T>>,
): PiecewisePolynomial<T> {
val pointSet = XYColumnarData.of(data.map { it.first }.asBuffer(type), data.map { it.second }.asBuffer(type))
val pointSet = XYColumnarData.of(data.map { it.first }.asBuffer(), data.map { it.second }.asBuffer())
return interpolatePolynomials(pointSet)
}

View File

@ -6,6 +6,7 @@ kscience{
jvm()
js()
native()
wasm()
useContextReceivers()
useSerialization()

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.geometry
import space.kscience.attributes.SafeType
import space.kscience.kmath.linear.Point
import space.kscience.kmath.structures.Buffer
@ -34,9 +33,6 @@ public fun <T> Buffer<T>.asVector3D(): Vector3D<T> = object : Vector3D<T> {
require(this@asVector3D.size == 3) { "Buffer of size 3 is required for Vector3D" }
}
override val type: SafeType<T> = this@asVector3D.type
override val x: T get() = this@asVector3D[0]
override val y: T get() = this@asVector3D[1]
override val z: T get() = this@asVector3D[2]

View File

@ -11,7 +11,6 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import space.kscience.attributes.SafeType
import space.kscience.kmath.geometry.GeometrySpace
import space.kscience.kmath.geometry.Vector2D
import space.kscience.kmath.operations.Float32Field
@ -20,10 +19,8 @@ import space.kscience.kmath.structures.MutableBufferFactory
import kotlin.math.pow
import kotlin.math.sqrt
@Serializable(Float32Space2D.VectorSerializer::class)
public interface Float32Vector2D : Vector2D<Float32>{
override val type: SafeType<Float32> get() = Float32Field.type
}
public typealias Float32Vector2D = Vector2D<Float32>
public object Float32Space2D : GeometrySpace<Vector2D<Float32>, Float32> {

View File

@ -11,7 +11,6 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import space.kscience.attributes.SafeType
import space.kscience.kmath.geometry.GeometrySpace
import space.kscience.kmath.geometry.Vector2D
import space.kscience.kmath.operations.Float64Field
@ -22,10 +21,7 @@ import kotlin.math.pow
import kotlin.math.sqrt
@Serializable(Float64Space2D.VectorSerializer::class)
public interface Float64Vector2D : Vector2D<Float64> {
override val type: SafeType<Float64> get() = Float64Field.type
}
public typealias Float64Vector2D = Vector2D<Float64>
@Deprecated("Use Float64Vector2D", ReplaceWith("Float64Vector2D"))
public typealias DoubleVector2D = Float64Vector2D

View File

@ -11,7 +11,6 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import space.kscience.attributes.SafeType
import space.kscience.kmath.geometry.GeometrySpace
import space.kscience.kmath.geometry.Vector3D
import space.kscience.kmath.operations.Float32Field
@ -20,10 +19,8 @@ import space.kscience.kmath.structures.MutableBufferFactory
import kotlin.math.pow
import kotlin.math.sqrt
@Serializable(Float32Space3D.VectorSerializer::class)
public interface Float32Vector3D : Vector3D<Float>{
override val type: SafeType<Float32> get() = Float32Field.type
}
public typealias Float32Vector3D = Vector3D<Float>
public object Float32Space3D : GeometrySpace<Vector3D<Float32>, Float32> {

View File

@ -11,7 +11,6 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import space.kscience.attributes.SafeType
import space.kscience.kmath.geometry.GeometrySpace
import space.kscience.kmath.geometry.Vector3D
import space.kscience.kmath.linear.Float64LinearSpace
@ -34,10 +33,7 @@ internal fun leviCivita(i: Int, j: Int, k: Int): Int = when {
else -> 0
}
@Serializable(Float64Space3D.VectorSerializer::class)
public interface Float64Vector3D : Vector3D<Float64> {
override val type: SafeType<Float64> get() = Float64Field.type
}
public typealias Float64Vector3D = Vector3D<Float64>
@Deprecated("Use Float64Vector3D", ReplaceWith("Float64Vector3D"))
public typealias DoubleVector3D = Float64Vector3D

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.geometry.euclidean3d
import space.kscience.attributes.SafeType
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.complex.*
import space.kscience.kmath.geometry.*
@ -245,8 +244,6 @@ public fun Quaternion.Companion.fromEuler(
* A vector consisting of angles
*/
public data class AngleVector(override val x: Angle, override val y: Angle, override val z: Angle) : Vector3D<Angle> {
override val type: SafeType<Angle> get() = Angle.type
public companion object
}

View File

@ -38,7 +38,6 @@ public class space/kscience/kmath/memory/MemoryBuffer : space/kscience/kmath/str
protected final fun getMemory ()Lspace/kscience/kmath/memory/Memory;
public fun getSize ()I
protected final fun getSpec ()Lspace/kscience/kmath/memory/MemorySpec;
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun iterator ()Ljava/util/Iterator;
public fun toString ()Ljava/lang/String;
}
@ -90,7 +89,6 @@ public abstract interface class space/kscience/kmath/memory/MemoryWriter : java/
public final class space/kscience/kmath/memory/MutableMemoryBuffer : space/kscience/kmath/memory/MemoryBuffer, space/kscience/kmath/structures/MutableBuffer {
public static final field Companion Lspace/kscience/kmath/memory/MutableMemoryBuffer$Companion;
public fun <init> (Lspace/kscience/kmath/memory/Memory;Lspace/kscience/kmath/memory/MemorySpec;)V
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public fun set (ILjava/lang/Object;)V
}

View File

@ -5,7 +5,6 @@
package space.kscience.kmath.memory
import space.kscience.attributes.SafeType
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.MutableBuffer
@ -18,8 +17,6 @@ import space.kscience.kmath.structures.MutableBuffer
*/
public open class MemoryBuffer<T : Any>(protected val memory: Memory, protected val spec: MemorySpec<T>) : Buffer<T> {
override val type: SafeType<T> get() = spec.type
override val size: Int get() = memory.size / spec.objectSize
override operator fun get(index: Int): T = memory.read { read(spec, spec.objectSize * index) }
@ -56,7 +53,6 @@ public class MutableMemoryBuffer<T : Any>(
private val writer: MemoryWriter = memory.writer()
override operator fun set(index: Int, value: T): Unit = writer.write(spec, spec.objectSize * index, value)
override fun copy(): MutableBuffer<T> = MutableMemoryBuffer(memory.copy(), spec)
public companion object {
public fun <T : Any> create(spec: MemorySpec<T>, size: Int): MutableMemoryBuffer<T> =

View File

@ -30,8 +30,6 @@ public val DataType.type: SafeType<*>
@JvmInline
public value class MultikTensor<T>(public val array: MutableMultiArray<T, DN>) : Tensor<T> {
@Suppress("UNCHECKED_CAST")
override val type: SafeType<T> get() = array.dtype.type as SafeType<T>
override val shape: ShapeND get() = ShapeND(array.shape)

View File

@ -202,7 +202,6 @@ public final class space/kscience/kmath/nd4j/Nd4jArrayFloatStructure : space/ksc
public fun get ([I)Ljava/lang/Float;
public synthetic fun get ([I)Ljava/lang/Object;
public fun getNdArray ()Lorg/nd4j/linalg/api/ndarray/INDArray;
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun hashCode ()I
public fun set ([IF)V
public synthetic fun set ([ILjava/lang/Object;)V

View File

@ -6,10 +6,8 @@
package space.kscience.kmath.nd4j
import org.nd4j.linalg.api.ndarray.INDArray
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.nd.*
import space.kscience.kmath.operations.Float32Field
/**
* Represents a [StructureND] wrapping an [INDArray] object.
@ -70,8 +68,6 @@ public fun INDArray.asDoubleStructure(): Nd4jArrayStructure<Double> = Nd4jArrayD
public data class Nd4jArrayFloatStructure(override val ndArray: INDArray) : Nd4jArrayStructure<Float>() {
override val type: SafeType<Float> get() = Float32Field.type
override fun elementsIterator(): Iterator<Pair<IntArray, Float>> = ndArray.floatIterator()
@PerformancePitfall

View File

@ -64,7 +64,6 @@ public object ValueAndErrorField : Field<ValueAndError> {
require(values.size == ds.size)
}
override val type: SafeType<ValueAndError> get() = safeTypeOf()
override val size: Int
get() = values.size
@ -77,7 +76,6 @@ public object ValueAndErrorField : Field<ValueAndError> {
values[index] = value.dispersion
}
override fun copy(): MutableBuffer<ValueAndError> = ValueAndErrorBuffer(values.copy(), ds.copy())
}
override val bufferFactory: MutableBufferFactory<ValueAndError> = object : MutableBufferFactory<ValueAndError> {

View File

@ -10,7 +10,6 @@ import org.tensorflow.Output
import org.tensorflow.ndarray.NdArray
import org.tensorflow.op.core.Constant
import org.tensorflow.types.TFloat64
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.expressions.Symbol
@ -26,7 +25,6 @@ public class DoubleTensorFlowOutput(
graph: Graph,
output: Output<TFloat64>,
) : TensorFlowOutput<Double, TFloat64>(graph, output) {
override val type: SafeType<Double> get() = Float64Field.type
override fun org.tensorflow.Tensor.actualizeTensor(): NdArray<Double> = this as TFloat64
}

View File

@ -10,19 +10,12 @@ import org.tensorflow.Output
import org.tensorflow.ndarray.NdArray
import org.tensorflow.types.TInt32
import org.tensorflow.types.TInt64
import space.kscience.attributes.SafeType
import space.kscience.kmath.operations.Int32Ring
import space.kscience.kmath.operations.Int64Ring
import space.kscience.kmath.structures.Int32
import space.kscience.kmath.structures.Int64
public class IntTensorFlowOutput(
graph: Graph,
output: Output<TInt32>,
) : TensorFlowOutput<Int, TInt32>(graph, output) {
override val type: SafeType<Int32> get() = Int32Ring.type
override fun org.tensorflow.Tensor.actualizeTensor(): NdArray<Int> = this as TInt32
}
@ -31,6 +24,5 @@ public class LongTensorFlowOutput(
output: Output<TInt64>,
) : TensorFlowOutput<Long, TInt64>(graph, output) {
override val type: SafeType<Int64> get() = Int64Ring.type
override fun org.tensorflow.Tensor.actualizeTensor(): NdArray<Long> = this as TInt64
}

View File

@ -17,7 +17,6 @@ import org.tensorflow.op.core.*
import org.tensorflow.types.TInt32
import org.tensorflow.types.family.TNumber
import org.tensorflow.types.family.TType
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.UnsafeKMathAPI
import space.kscience.kmath.UnstableKMathAPI
@ -40,7 +39,8 @@ public sealed interface TensorFlowTensor<T> : Tensor<T>
/**
* Static (eager) in-memory TensorFlow tensor
*/
public class TensorFlowArray<T>(override val type: SafeType<T>, public val tensor: NdArray<T>) : Tensor<T> {
@JvmInline
public value class TensorFlowArray<T>(public val tensor: NdArray<T>) : Tensor<T> {
override val shape: ShapeND get() = ShapeND(tensor.shape().asArray().toIntArray())
@ -74,7 +74,7 @@ public abstract class TensorFlowOutput<T, TT : TType>(
internal val actualTensor by lazy {
Session(graph).use { session ->
TensorFlowArray(type, session.runner().fetch(output).run().first().actualizeTensor())
TensorFlowArray(session.runner().fetch(output).run().first().actualizeTensor())
}
}

View File

@ -5,12 +5,10 @@
package space.kscience.kmath.tensors.core
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.nd.MutableStructureNDOfDouble
import space.kscience.kmath.nd.ShapeND
import space.kscience.kmath.operations.DoubleField
import space.kscience.kmath.structures.*
import space.kscience.kmath.tensors.core.internal.toPrettyString
@ -36,7 +34,7 @@ public class OffsetDoubleBuffer(
/**
* Copy only a part of buffer that belongs to this [OffsetDoubleBuffer]
*/
override fun copy(): Float64Buffer = origin.array.copyOfRange(offset, offset + size).asBuffer()
public fun copy(): Float64Buffer = origin.array.copyOfRange(offset, offset + size).asBuffer()
override fun iterator(): Iterator<Double> = iterator {
for (i in indices) {
@ -90,8 +88,6 @@ public open class DoubleTensor(
final override val source: OffsetDoubleBuffer,
) : BufferedTensor<Double>(shape), MutableStructureNDOfDouble {
override val type: SafeType<Double> get() = DoubleField.type
init {
require(linearSize == source.size) { "Source buffer size must be equal tensor size" }
}

View File

@ -8,7 +8,6 @@ package space.kscience.kmath.tensors.core
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.nd.MutableStructure1D
import space.kscience.kmath.nd.ShapeND
import space.kscience.kmath.structures.MutableBuffer
public class DoubleTensor1D(
source: OffsetDoubleBuffer,
@ -30,8 +29,6 @@ public class DoubleTensor1D(
source[index] = value
}
override fun copy(): MutableBuffer<Double> = source.copy()
@PerformancePitfall
override fun elements(): Sequence<Pair<IntArray, Double>> = super<MutableStructure1D>.elements()
}

View File

@ -5,10 +5,8 @@
package space.kscience.kmath.tensors.core
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.nd.ShapeND
import space.kscience.kmath.operations.IntRing
import space.kscience.kmath.structures.*
/**
@ -26,8 +24,6 @@ public class OffsetIntBuffer(
require(offset + size <= source.size) { "Maximum index must be inside source dimension" }
}
override val type: SafeType<Int> get() = IntRing.type
override fun set(index: Int, value: Int) {
require(index in 0 until size) { "Index must be in [0, size)" }
source[index + offset] = value
@ -38,7 +34,7 @@ public class OffsetIntBuffer(
/**
* Copy only a part of buffer that belongs to this tensor
*/
override fun copy(): Int32Buffer = source.array.copyOfRange(offset, offset + size).asBuffer()
public fun copy(): Int32Buffer = source.array.copyOfRange(offset, offset + size).asBuffer()
override fun iterator(): Iterator<Int> = iterator {
for (i in indices) {
@ -87,7 +83,6 @@ public class IntTensor(
require(linearSize == source.size) { "Source buffer size must be equal tensor size" }
}
override val type: SafeType<Int> get() = IntRing.type
public constructor(shape: ShapeND, buffer: Int32Buffer) : this(shape, OffsetIntBuffer(buffer, 0, buffer.size))

View File

@ -17,7 +17,7 @@ import space.kscience.kmath.tensors.api.Tensor
public fun StructureND<Double>.copyToTensor(): DoubleTensor = if (this is DoubleTensor) {
DoubleTensor(shape, source.copy())
} else if (this is Float64BufferND && indices is RowStrides) {
DoubleTensor(shape, buffer.copy())
DoubleTensor(shape, buffer.array.copyOf().asBuffer())
} else {
DoubleTensor(
shape,

View File

@ -1,8 +1,6 @@
public final class space/kscience/kmath/viktor/ViktorBuffer : space/kscience/kmath/structures/MutableBuffer {
public static final synthetic fun box-impl (Lorg/jetbrains/bio/viktor/F64FlatArray;)Lspace/kscience/kmath/viktor/ViktorBuffer;
public static fun constructor-impl (Lorg/jetbrains/bio/viktor/F64FlatArray;)Lorg/jetbrains/bio/viktor/F64FlatArray;
public fun copy ()Lspace/kscience/kmath/structures/MutableBuffer;
public static fun copy-impl (Lorg/jetbrains/bio/viktor/F64FlatArray;)Lspace/kscience/kmath/structures/MutableBuffer;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl (Lorg/jetbrains/bio/viktor/F64FlatArray;Ljava/lang/Object;)Z
public static final fun equals-impl0 (Lorg/jetbrains/bio/viktor/F64FlatArray;Lorg/jetbrains/bio/viktor/F64FlatArray;)Z
@ -12,8 +10,6 @@ public final class space/kscience/kmath/viktor/ViktorBuffer : space/kscience/kma
public final fun getFlatArray ()Lorg/jetbrains/bio/viktor/F64FlatArray;
public fun getSize ()I
public static fun getSize-impl (Lorg/jetbrains/bio/viktor/F64FlatArray;)I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public static fun getType-V0oMfBY (Lorg/jetbrains/bio/viktor/F64FlatArray;)Lkotlin/reflect/KType;
public fun hashCode ()I
public static fun hashCode-impl (Lorg/jetbrains/bio/viktor/F64FlatArray;)I
public fun iterator ()Ljava/util/Iterator;
@ -115,7 +111,6 @@ public final class space/kscience/kmath/viktor/ViktorStructureND : space/kscienc
public synthetic fun get ([I)Ljava/lang/Object;
public final fun getF64Buffer ()Lorg/jetbrains/bio/viktor/F64Array;
public fun getShape-IIYLAfE ()[I
public fun getType-V0oMfBY ()Lkotlin/reflect/KType;
public fun set ([ID)V
public synthetic fun set ([ILjava/lang/Object;)V
}

View File

@ -6,15 +6,12 @@
package space.kscience.kmath.viktor
import org.jetbrains.bio.viktor.F64FlatArray
import space.kscience.attributes.SafeType
import space.kscience.kmath.operations.Float64Field
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.MutableBuffer
@Suppress("NOTHING_TO_INLINE", "OVERRIDE_BY_INLINE")
@JvmInline
public value class ViktorBuffer(public val flatArray: F64FlatArray) : MutableBuffer<Double> {
override val type: SafeType<Double> get() = Float64Field.type
override val size: Int
get() = flatArray.length
@ -25,7 +22,6 @@ public value class ViktorBuffer(public val flatArray: F64FlatArray) : MutableBuf
flatArray[index] = value
}
override fun copy(): MutableBuffer<Double> = ViktorBuffer(flatArray.copy().flatten())
override operator fun iterator(): Iterator<Double> = flatArray.data.iterator()
override fun toString(): String = Buffer.toString(this)

View File

@ -6,17 +6,13 @@
package space.kscience.kmath.viktor
import org.jetbrains.bio.viktor.F64Array
import space.kscience.attributes.SafeType
import space.kscience.kmath.PerformancePitfall
import space.kscience.kmath.nd.ColumnStrides
import space.kscience.kmath.nd.MutableStructureND
import space.kscience.kmath.nd.ShapeND
import space.kscience.kmath.operations.Float64Field
@Suppress("OVERRIDE_BY_INLINE", "NOTHING_TO_INLINE")
public class ViktorStructureND(public val f64Buffer: F64Array) : MutableStructureND<Double> {
override val type: SafeType<Double> get() = Float64Field.type
override val shape: ShapeND get() = ShapeND(f64Buffer.shape)
@OptIn(PerformancePitfall::class)