Sort classes, add vectors support
This commit is contained in:
parent
5724558760
commit
90bdf00f8b
@ -7,10 +7,8 @@ import kscience.kmath.operations.Complex
|
||||
import kscience.kmath.structures.NDStructure
|
||||
import org.gnu.gsl.*
|
||||
|
||||
public sealed class GslMatrix<T : Any> : FeaturedMatrix<T> {
|
||||
protected abstract val nativeHandle: CValues<out CStructVar>
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
public sealed class GslMatrix<T : Any> : StructHolder(), FeaturedMatrix<T> {
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
return NDStructure.equals(this, other as? NDStructure<*> ?: return false)
|
||||
}
|
||||
|
||||
@ -43,6 +41,30 @@ public class GslRealMatrix(protected override val nativeHandle: CValues<gsl_matr
|
||||
}
|
||||
}
|
||||
|
||||
public class GslFloatMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_float>,
|
||||
features: Set<MatrixFeature>
|
||||
) :
|
||||
GslMatrix<Float>() {
|
||||
public override val rowNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size1.toInt() }
|
||||
|
||||
public override val colNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size2.toInt() }
|
||||
|
||||
public override val features: Set<MatrixFeature> = features
|
||||
|
||||
public override fun suggestFeature(vararg features: MatrixFeature): GslFloatMatrix =
|
||||
GslFloatMatrix(nativeHandle, this.features + features)
|
||||
|
||||
public override fun get(i: Int, j: Int): Float = gsl_matrix_float_get(nativeHandle, i.toULong(), j.toULong())
|
||||
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
if (other is GslFloatMatrix) gsl_matrix_float_equal(nativeHandle, other.nativeHandle)
|
||||
return super.equals(other)
|
||||
}
|
||||
}
|
||||
|
||||
public class GslIntMatrix(protected override val nativeHandle: CValues<gsl_matrix_int>, features: Set<MatrixFeature>) :
|
||||
GslMatrix<Int>() {
|
||||
|
||||
@ -65,6 +87,30 @@ public class GslIntMatrix(protected override val nativeHandle: CValues<gsl_matri
|
||||
}
|
||||
}
|
||||
|
||||
public class GslUIntMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_uint>,
|
||||
features: Set<MatrixFeature>
|
||||
) : GslMatrix<UInt>() {
|
||||
|
||||
public override val rowNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size1.toInt() }
|
||||
|
||||
public override val colNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size2.toInt() }
|
||||
|
||||
public override val features: Set<MatrixFeature> = features
|
||||
|
||||
public override fun suggestFeature(vararg features: MatrixFeature): GslUIntMatrix =
|
||||
GslUIntMatrix(nativeHandle, this.features + features)
|
||||
|
||||
public override fun get(i: Int, j: Int): UInt = gsl_matrix_uint_get(nativeHandle, i.toULong(), j.toULong())
|
||||
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
if (other is GslUIntMatrix) gsl_matrix_uint_equal(nativeHandle, other.nativeHandle)
|
||||
return super.equals(other)
|
||||
}
|
||||
}
|
||||
|
||||
public class GslLongMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_long>,
|
||||
features: Set<MatrixFeature>
|
||||
@ -90,55 +136,6 @@ public class GslLongMatrix(
|
||||
}
|
||||
}
|
||||
|
||||
public class GslFloatMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_float>,
|
||||
features: Set<MatrixFeature>
|
||||
) :
|
||||
GslMatrix<Float>() {
|
||||
|
||||
public override val rowNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size1.toInt() }
|
||||
|
||||
public override val colNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size2.toInt() }
|
||||
|
||||
public override val features: Set<MatrixFeature> = features
|
||||
|
||||
public override fun suggestFeature(vararg features: MatrixFeature): GslFloatMatrix =
|
||||
GslFloatMatrix(nativeHandle, this.features + features)
|
||||
|
||||
public override fun get(i: Int, j: Int): Float = gsl_matrix_float_get(nativeHandle, i.toULong(), j.toULong())
|
||||
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
if (other is GslFloatMatrix) gsl_matrix_float_equal(nativeHandle, other.nativeHandle)
|
||||
return super.equals(other)
|
||||
}
|
||||
}
|
||||
|
||||
public class GslUIntMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_uint>,
|
||||
features: Set<MatrixFeature>
|
||||
) : GslMatrix<UInt>() {
|
||||
|
||||
public override val rowNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size1.toInt() }
|
||||
|
||||
public override val colNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size2.toInt() }
|
||||
|
||||
public override val features: Set<MatrixFeature> = features
|
||||
|
||||
public override fun suggestFeature(vararg features: MatrixFeature): GslUIntMatrix =
|
||||
GslUIntMatrix(nativeHandle, this.features + features)
|
||||
|
||||
public override fun get(i: Int, j: Int): UInt = gsl_matrix_uint_get(nativeHandle, i.toULong(), j.toULong())
|
||||
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
if (other is GslUIntMatrix) gsl_matrix_uint_equal(nativeHandle, other.nativeHandle)
|
||||
return super.equals(other)
|
||||
}
|
||||
}
|
||||
|
||||
public class GslULongMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_ulong>,
|
||||
features: Set<MatrixFeature>
|
||||
@ -163,30 +160,6 @@ public class GslULongMatrix(
|
||||
}
|
||||
}
|
||||
|
||||
public class GslUShortMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_ushort>,
|
||||
features: Set<MatrixFeature>
|
||||
) : GslMatrix<UShort>() {
|
||||
|
||||
public override val rowNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size1.toInt() }
|
||||
|
||||
public override val colNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size2.toInt() }
|
||||
|
||||
public override val features: Set<MatrixFeature> = features
|
||||
|
||||
public override fun suggestFeature(vararg features: MatrixFeature): GslUShortMatrix =
|
||||
GslUShortMatrix(nativeHandle, this.features + features)
|
||||
|
||||
public override fun get(i: Int, j: Int): UShort = gsl_matrix_ushort_get(nativeHandle, i.toULong(), j.toULong())
|
||||
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
if (other is GslUShortMatrix) gsl_matrix_ushort_equal(nativeHandle, other.nativeHandle)
|
||||
return super.equals(other)
|
||||
}
|
||||
}
|
||||
|
||||
public class GslShortMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_short>,
|
||||
features: Set<MatrixFeature>
|
||||
@ -211,6 +184,30 @@ public class GslShortMatrix(
|
||||
}
|
||||
}
|
||||
|
||||
public class GslUShortMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_ushort>,
|
||||
features: Set<MatrixFeature>
|
||||
) : GslMatrix<UShort>() {
|
||||
|
||||
public override val rowNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size1.toInt() }
|
||||
|
||||
public override val colNum: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size2.toInt() }
|
||||
|
||||
public override val features: Set<MatrixFeature> = features
|
||||
|
||||
public override fun suggestFeature(vararg features: MatrixFeature): GslUShortMatrix =
|
||||
GslUShortMatrix(nativeHandle, this.features + features)
|
||||
|
||||
public override fun get(i: Int, j: Int): UShort = gsl_matrix_ushort_get(nativeHandle, i.toULong(), j.toULong())
|
||||
|
||||
public override fun equals(other: Any?): Boolean {
|
||||
if (other is GslUShortMatrix) gsl_matrix_ushort_equal(nativeHandle, other.nativeHandle)
|
||||
return super.equals(other)
|
||||
}
|
||||
}
|
||||
|
||||
public class GslComplexMatrix(
|
||||
protected override val nativeHandle: CValues<gsl_matrix_complex>,
|
||||
features: Set<MatrixFeature>
|
||||
|
@ -0,0 +1,84 @@
|
||||
package kscience.kmath.gsl
|
||||
|
||||
import kotlinx.cinterop.*
|
||||
import kscience.kmath.linear.Point
|
||||
import kscience.kmath.operations.Complex
|
||||
import org.gnu.gsl.*
|
||||
|
||||
public sealed class GslVector<T> : StructHolder(), Point<T> {
|
||||
public override fun iterator(): Iterator<T> = object : Iterator<T> {
|
||||
private var cursor = 0
|
||||
|
||||
override fun hasNext(): Boolean = cursor < size
|
||||
|
||||
override fun next(): T {
|
||||
cursor++
|
||||
return this@GslVector[cursor - 1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GslRealVector(override val nativeHandle: CValues<gsl_vector>) : GslVector<Double>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): Double = gsl_vector_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslFloatVector(override val nativeHandle: CValues<gsl_vector_float>) : GslVector<Float>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): Float = gsl_vector_float_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslIntVector(override val nativeHandle: CValues<gsl_vector_int>) : GslVector<Int>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): Int = gsl_vector_int_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslUIntVector(override val nativeHandle: CValues<gsl_vector_uint>) : GslVector<UInt>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): UInt = gsl_vector_uint_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslLongVector(override val nativeHandle: CValues<gsl_vector_long>) : GslVector<Long>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): Long = gsl_vector_long_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslULongVector(override val nativeHandle: CValues<gsl_vector_ulong>) : GslVector<ULong>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): ULong = gsl_vector_ulong_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslShortVector(override val nativeHandle: CValues<gsl_vector_short>) : GslVector<Short>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): Short = gsl_vector_short_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslUShortVector(override val nativeHandle: CValues<gsl_vector_ushort>) : GslVector<UShort>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): UShort = gsl_vector_ushort_get(nativeHandle, index.toULong())
|
||||
}
|
||||
|
||||
public class GslComplexVector(override val nativeHandle: CValues<gsl_vector_complex>) : GslVector<Complex>() {
|
||||
public override val size: Int
|
||||
get() = memScoped { nativeHandle.getPointer(this).pointed.size.toInt() }
|
||||
|
||||
public override fun get(index: Int): Complex = gsl_vector_complex_get(nativeHandle, index.toULong()).useContents {
|
||||
Complex(dat[0], dat[1])
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package kscience.kmath.gsl
|
||||
|
||||
import kotlinx.cinterop.CStructVar
|
||||
import kotlinx.cinterop.CValues
|
||||
|
||||
public abstract class StructHolder internal constructor() {
|
||||
protected abstract val nativeHandle: CValues<out CStructVar>
|
||||
}
|
Loading…
Reference in New Issue
Block a user