Remove kotlinx-io dependency, use DeferScope to dispose native memory
This commit is contained in:
parent
3c069398a2
commit
3ae2be06e2
@ -12,7 +12,6 @@ allprojects {
|
|||||||
maven("https://dl.bintray.com/kotlin/kotlin-eap")
|
maven("https://dl.bintray.com/kotlin/kotlin-eap")
|
||||||
maven("https://dl.bintray.com/kotlin/kotlinx")
|
maven("https://dl.bintray.com/kotlin/kotlinx")
|
||||||
maven("https://dl.bintray.com/hotkeytlt/maven")
|
maven("https://dl.bintray.com/hotkeytlt/maven")
|
||||||
maven("https://dl.bintray.com/commandertvis/kotlinx-io/")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "kscience.kmath"
|
group = "kscience.kmath"
|
||||||
|
@ -19,8 +19,9 @@ private fun KtPsiFactory.createMatrixClass(
|
|||||||
|
|
||||||
@Language("kotlin") val text = """internal class $className(
|
@Language("kotlin") val text = """internal class $className(
|
||||||
override val nativeHandle: CPointer<$structName>,
|
override val nativeHandle: CPointer<$structName>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<$kotlinTypeName, $structName>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<$kotlinTypeName, $structName>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ private fun KtPsiFactory.createMatrixClass(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): $className =
|
override fun suggestFeature(vararg features: MatrixFeature): $className =
|
||||||
${className}(nativeHandle, this.features + features)
|
${className}(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): $kotlinTypeName = ${
|
override operator fun get(i: Int, j: Int): $kotlinTypeName = ${
|
||||||
fn("gsl_matrixRget", cTypeName)
|
fn("gsl_matrixRget", cTypeName)
|
||||||
@ -42,7 +43,7 @@ private fun KtPsiFactory.createMatrixClass(
|
|||||||
override fun copy(): $className {
|
override fun copy(): $className {
|
||||||
val new = requireNotNull(${fn("gsl_matrixRalloc", cTypeName)}(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(${fn("gsl_matrixRalloc", cTypeName)}(rowNum.toULong(), colNum.toULong()))
|
||||||
${fn("gsl_matrixRmemcpy", cTypeName)}(new, nativeHandle)
|
${fn("gsl_matrixRmemcpy", cTypeName)}(new, nativeHandle)
|
||||||
return $className(new, features)
|
return $className(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = ${fn("gsl_matrixRfree", cTypeName)}(nativeHandle)
|
override fun close(): Unit = ${fn("gsl_matrixRfree", cTypeName)}(nativeHandle)
|
||||||
|
@ -18,7 +18,8 @@ private fun KtPsiFactory.createVectorClass(
|
|||||||
val structName = sn("gsl_vectorR", cTypeName)
|
val structName = sn("gsl_vectorR", cTypeName)
|
||||||
|
|
||||||
@Language("kotlin") val text =
|
@Language("kotlin") val text =
|
||||||
"""internal class $className(override val nativeHandle: CPointer<$structName>) : GslVector<$kotlinTypeName, $structName>() {
|
"""internal class $className(override val nativeHandle: CPointer<$structName>, scope: DeferScope)
|
||||||
|
: GslVector<$kotlinTypeName, $structName>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ private fun KtPsiFactory.createVectorClass(
|
|||||||
override fun copy(): $className {
|
override fun copy(): $className {
|
||||||
val new = requireNotNull(${fn("gsl_vectorRalloc", cTypeName)}(size.toULong()))
|
val new = requireNotNull(${fn("gsl_vectorRalloc", cTypeName)}(size.toULong()))
|
||||||
${fn("gsl_vectorRmemcpy", cTypeName)}(new, nativeHandle)
|
${fn("gsl_vectorRmemcpy", cTypeName)}(new, nativeHandle)
|
||||||
return ${className}(new)
|
return ${className}(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
@ -8,6 +8,8 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
|
explicitApiWarning()
|
||||||
|
|
||||||
val nativeTarget = when (System.getProperty("os.name")) {
|
val nativeTarget = when (System.getProperty("os.name")) {
|
||||||
"Mac OS X" -> macosX64("native")
|
"Mac OS X" -> macosX64("native")
|
||||||
"Linux" -> linuxX64("native")
|
"Linux" -> linuxX64("native")
|
||||||
@ -20,7 +22,11 @@ kotlin {
|
|||||||
|
|
||||||
val main by nativeTarget.compilations.getting {
|
val main by nativeTarget.compilations.getting {
|
||||||
cinterops {
|
cinterops {
|
||||||
val libgsl by creating { includeDirs { headerFilterOnly("/usr/include/", "/usr/local/") } }
|
val libgsl by creating {
|
||||||
|
includeDirs {
|
||||||
|
headerFilterOnly("/usr/include/", "/usr/local/")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +41,6 @@ kotlin {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":kmath-core"))
|
api(project(":kmath-core"))
|
||||||
api("org.jetbrains.kotlinx:kotlinx-io:0.2.0-tvis-3")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,9 @@ internal fun Complex.toGsl(): CValue<gsl_complex> = cValue {
|
|||||||
|
|
||||||
internal class GslComplexMatrix(
|
internal class GslComplexMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_complex>,
|
override val nativeHandle: CPointer<gsl_matrix_complex>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<Complex, gsl_matrix_complex>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<Complex, gsl_matrix_complex>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -25,7 +26,7 @@ internal class GslComplexMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslComplexMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslComplexMatrix =
|
||||||
GslComplexMatrix(nativeHandle, this.features + features)
|
GslComplexMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): Complex =
|
override operator fun get(i: Int, j: Int): Complex =
|
||||||
gsl_matrix_complex_get(nativeHandle, i.toULong(), j.toULong()).toKMath()
|
gsl_matrix_complex_get(nativeHandle, i.toULong(), j.toULong()).toKMath()
|
||||||
@ -36,7 +37,7 @@ internal class GslComplexMatrix(
|
|||||||
override fun copy(): GslComplexMatrix {
|
override fun copy(): GslComplexMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_complex_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_complex_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_complex_memcpy(new, nativeHandle)
|
gsl_matrix_complex_memcpy(new, nativeHandle)
|
||||||
return GslComplexMatrix(new, features)
|
return GslComplexMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_complex_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_complex_free(nativeHandle)
|
||||||
@ -47,18 +48,20 @@ internal class GslComplexMatrix(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslComplexVector(override val nativeHandle: CPointer<gsl_vector_complex>) :
|
internal class GslComplexVector(override val nativeHandle: CPointer<gsl_vector_complex>, scope: DeferScope) :
|
||||||
GslVector<Complex, gsl_vector_complex>() {
|
GslVector<Complex, gsl_vector_complex>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
override fun get(index: Int): Complex = gsl_vector_complex_get(nativeHandle, index.toULong()).toKMath()
|
override fun get(index: Int): Complex = gsl_vector_complex_get(nativeHandle, index.toULong()).toKMath()
|
||||||
override fun set(index: Int, value: Complex): Unit = gsl_vector_complex_set(nativeHandle, index.toULong(), value.toGsl())
|
|
||||||
|
override fun set(index: Int, value: Complex): Unit =
|
||||||
|
gsl_vector_complex_set(nativeHandle, index.toULong(), value.toGsl())
|
||||||
|
|
||||||
override fun copy(): GslComplexVector {
|
override fun copy(): GslComplexVector {
|
||||||
val new = requireNotNull(gsl_vector_complex_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_complex_alloc(size.toULong()))
|
||||||
gsl_vector_complex_memcpy(new, nativeHandle)
|
gsl_vector_complex_memcpy(new, nativeHandle)
|
||||||
return GslComplexVector(new)
|
return GslComplexVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package kscience.kmath.gsl
|
package kscience.kmath.gsl
|
||||||
|
|
||||||
import kotlinx.cinterop.CStructVar
|
import kotlinx.cinterop.CStructVar
|
||||||
|
import kotlinx.cinterop.DeferScope
|
||||||
import kscience.kmath.linear.FeaturedMatrix
|
import kscience.kmath.linear.FeaturedMatrix
|
||||||
import kscience.kmath.structures.NDStructure
|
import kscience.kmath.structures.NDStructure
|
||||||
|
|
||||||
public abstract class GslMatrix<T : Any, H : CStructVar> internal constructor(): GslMemoryHolder<H>(),
|
public abstract class GslMatrix<T : Any, H : CStructVar> internal constructor(scope: DeferScope) :
|
||||||
|
GslMemoryHolder<H>(scope),
|
||||||
FeaturedMatrix<T> {
|
FeaturedMatrix<T> {
|
||||||
internal abstract operator fun set(i: Int, j: Int, value: T)
|
internal abstract operator fun set(i: Int, j: Int, value: T)
|
||||||
internal abstract fun copy(): GslMatrix<T, H>
|
internal abstract fun copy(): GslMatrix<T, H>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package kscience.kmath.gsl
|
package kscience.kmath.gsl
|
||||||
|
|
||||||
import kotlinx.cinterop.CStructVar
|
import kotlinx.cinterop.CStructVar
|
||||||
|
import kotlinx.cinterop.DeferScope
|
||||||
import kotlinx.cinterop.pointed
|
import kotlinx.cinterop.pointed
|
||||||
import kscience.kmath.linear.MatrixContext
|
import kscience.kmath.linear.MatrixContext
|
||||||
import kscience.kmath.linear.Point
|
import kscience.kmath.linear.Point
|
||||||
@ -18,8 +19,9 @@ internal inline fun <T : Any, H : CStructVar> GslMatrix<T, H>.fill(initializer:
|
|||||||
internal inline fun <T : Any, H : CStructVar> GslVector<T, H>.fill(initializer: (Int) -> T): GslVector<T, H> =
|
internal inline fun <T : Any, H : CStructVar> GslVector<T, H>.fill(initializer: (Int) -> T): GslVector<T, H> =
|
||||||
apply { (0 until size).forEach { index -> this[index] = initializer(index) } }
|
apply { (0 until size).forEach { index -> this[index] = initializer(index) } }
|
||||||
|
|
||||||
public abstract class GslMatrixContext<T : Any, H1 : CStructVar, H2 : CStructVar> internal constructor() :
|
public abstract class GslMatrixContext<T : Any, H1 : CStructVar, H2 : CStructVar> internal constructor(
|
||||||
MatrixContext<T> {
|
internal val scope: DeferScope
|
||||||
|
) : MatrixContext<T> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
public fun Matrix<T>.toGsl(): GslMatrix<T, H1> = (if (this is GslMatrix<*, *>)
|
public fun Matrix<T>.toGsl(): GslMatrix<T, H1> = (if (this is GslMatrix<*, *>)
|
||||||
this as GslMatrix<T, H1>
|
this as GslMatrix<T, H1>
|
||||||
@ -37,19 +39,19 @@ public abstract class GslMatrixContext<T : Any, H1 : CStructVar, H2 : CStructVar
|
|||||||
produceDirtyMatrix(rows, columns).fill(initializer)
|
produceDirtyMatrix(rows, columns).fill(initializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
public object GslRealMatrixContext : GslMatrixContext<Double, gsl_matrix, gsl_vector>() {
|
public class GslRealMatrixContext(scope: DeferScope) : GslMatrixContext<Double, gsl_matrix, gsl_vector>(scope) {
|
||||||
override fun produceDirtyMatrix(rows: Int, columns: Int): GslMatrix<Double, gsl_matrix> =
|
override fun produceDirtyMatrix(rows: Int, columns: Int): GslMatrix<Double, gsl_matrix> =
|
||||||
GslRealMatrix(requireNotNull(gsl_matrix_alloc(rows.toULong(), columns.toULong())))
|
GslRealMatrix(nativeHandle = requireNotNull(gsl_matrix_alloc(rows.toULong(), columns.toULong())), scope = scope)
|
||||||
|
|
||||||
override fun produceDirtyVector(size: Int): GslVector<Double, gsl_vector> =
|
override fun produceDirtyVector(size: Int): GslVector<Double, gsl_vector> =
|
||||||
GslRealVector(requireNotNull(gsl_vector_alloc(size.toULong())))
|
GslRealVector(nativeHandle = requireNotNull(gsl_vector_alloc(size.toULong())), scope = scope)
|
||||||
|
|
||||||
public override fun Matrix<Double>.dot(other: Matrix<Double>): GslMatrix<Double, gsl_matrix> {
|
public override fun Matrix<Double>.dot(other: Matrix<Double>): GslMatrix<Double, gsl_matrix> {
|
||||||
val x = toGsl().nativeHandle
|
val x = toGsl().nativeHandle
|
||||||
val a = other.toGsl().nativeHandle
|
val a = other.toGsl().nativeHandle
|
||||||
val result = requireNotNull(gsl_matrix_calloc(a.pointed.size1, a.pointed.size2))
|
val result = requireNotNull(gsl_matrix_calloc(a.pointed.size1, a.pointed.size2))
|
||||||
gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, x, a, 1.0, result)
|
gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, x, a, 1.0, result)
|
||||||
return GslRealMatrix(result)
|
return GslRealMatrix(result, scope = scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun Matrix<Double>.dot(vector: Point<Double>): GslVector<Double, gsl_vector> {
|
public override fun Matrix<Double>.dot(vector: Point<Double>): GslVector<Double, gsl_vector> {
|
||||||
@ -57,7 +59,7 @@ public object GslRealMatrixContext : GslMatrixContext<Double, gsl_matrix, gsl_ve
|
|||||||
val a = vector.toGsl().nativeHandle
|
val a = vector.toGsl().nativeHandle
|
||||||
val result = requireNotNull(gsl_vector_calloc(a.pointed.size))
|
val result = requireNotNull(gsl_vector_calloc(a.pointed.size))
|
||||||
gsl_blas_dgemv(CblasNoTrans, 1.0, x, a, 1.0, result)
|
gsl_blas_dgemv(CblasNoTrans, 1.0, x, a, 1.0, result)
|
||||||
return GslRealVector(result)
|
return GslRealVector(result, scope = scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun Matrix<Double>.times(value: Double): GslMatrix<Double, gsl_matrix> {
|
public override fun Matrix<Double>.times(value: Double): GslMatrix<Double, gsl_matrix> {
|
||||||
@ -79,19 +81,20 @@ public object GslRealMatrixContext : GslMatrixContext<Double, gsl_matrix, gsl_ve
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public object GslFloatMatrixContext : GslMatrixContext<Float, gsl_matrix_float, gsl_vector_float>() {
|
public class GslFloatMatrixContext(scope: DeferScope) :
|
||||||
|
GslMatrixContext<Float, gsl_matrix_float, gsl_vector_float>(scope) {
|
||||||
override fun produceDirtyMatrix(rows: Int, columns: Int): GslMatrix<Float, gsl_matrix_float> =
|
override fun produceDirtyMatrix(rows: Int, columns: Int): GslMatrix<Float, gsl_matrix_float> =
|
||||||
GslFloatMatrix(requireNotNull(gsl_matrix_float_alloc(rows.toULong(), columns.toULong())))
|
GslFloatMatrix(requireNotNull(gsl_matrix_float_alloc(rows.toULong(), columns.toULong())), scope = scope)
|
||||||
|
|
||||||
override fun produceDirtyVector(size: Int): GslVector<Float, gsl_vector_float> =
|
override fun produceDirtyVector(size: Int): GslVector<Float, gsl_vector_float> =
|
||||||
GslFloatVector(requireNotNull(gsl_vector_float_alloc(size.toULong())))
|
GslFloatVector(requireNotNull(gsl_vector_float_alloc(size.toULong())), scope)
|
||||||
|
|
||||||
public override fun Matrix<Float>.dot(other: Matrix<Float>): GslMatrix<Float, gsl_matrix_float> {
|
public override fun Matrix<Float>.dot(other: Matrix<Float>): GslMatrix<Float, gsl_matrix_float> {
|
||||||
val x = toGsl().nativeHandle
|
val x = toGsl().nativeHandle
|
||||||
val a = other.toGsl().nativeHandle
|
val a = other.toGsl().nativeHandle
|
||||||
val result = requireNotNull(gsl_matrix_float_calloc(a.pointed.size1, a.pointed.size2))
|
val result = requireNotNull(gsl_matrix_float_calloc(a.pointed.size1, a.pointed.size2))
|
||||||
gsl_blas_sgemm(CblasNoTrans, CblasNoTrans, 1f, x, a, 1f, result)
|
gsl_blas_sgemm(CblasNoTrans, CblasNoTrans, 1f, x, a, 1f, result)
|
||||||
return GslFloatMatrix(result)
|
return GslFloatMatrix(nativeHandle = result, scope = scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun Matrix<Float>.dot(vector: Point<Float>): GslVector<Float, gsl_vector_float> {
|
public override fun Matrix<Float>.dot(vector: Point<Float>): GslVector<Float, gsl_vector_float> {
|
||||||
@ -99,7 +102,7 @@ public object GslFloatMatrixContext : GslMatrixContext<Float, gsl_matrix_float,
|
|||||||
val a = vector.toGsl().nativeHandle
|
val a = vector.toGsl().nativeHandle
|
||||||
val result = requireNotNull(gsl_vector_float_calloc(a.pointed.size))
|
val result = requireNotNull(gsl_vector_float_calloc(a.pointed.size))
|
||||||
gsl_blas_sgemv(CblasNoTrans, 1f, x, a, 1f, result)
|
gsl_blas_sgemv(CblasNoTrans, 1f, x, a, 1f, result)
|
||||||
return GslFloatVector(result)
|
return GslFloatVector(nativeHandle = result, scope = scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun Matrix<Float>.times(value: Float): GslMatrix<Float, gsl_matrix_float> {
|
public override fun Matrix<Float>.times(value: Float): GslMatrix<Float, gsl_matrix_float> {
|
||||||
@ -121,19 +124,22 @@ public object GslFloatMatrixContext : GslMatrixContext<Float, gsl_matrix_float,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public object GslComplexMatrixContext : GslMatrixContext<Complex, gsl_matrix_complex, gsl_vector_complex>() {
|
public class GslComplexMatrixContext(scope: DeferScope) :
|
||||||
override fun produceDirtyMatrix(rows: Int, columns: Int): GslMatrix<Complex, gsl_matrix_complex> =
|
GslMatrixContext<Complex, gsl_matrix_complex, gsl_vector_complex>(scope) {
|
||||||
GslComplexMatrix(requireNotNull(gsl_matrix_complex_alloc(rows.toULong(), columns.toULong())))
|
override fun produceDirtyMatrix(rows: Int, columns: Int): GslMatrix<Complex, gsl_matrix_complex> = GslComplexMatrix(
|
||||||
|
nativeHandle = requireNotNull(gsl_matrix_complex_alloc(rows.toULong(), columns.toULong())),
|
||||||
|
scope = scope
|
||||||
|
)
|
||||||
|
|
||||||
override fun produceDirtyVector(size: Int): GslVector<Complex, gsl_vector_complex> =
|
override fun produceDirtyVector(size: Int): GslVector<Complex, gsl_vector_complex> =
|
||||||
GslComplexVector(requireNotNull(gsl_vector_complex_alloc(size.toULong())))
|
GslComplexVector(requireNotNull(gsl_vector_complex_alloc(size.toULong())), scope)
|
||||||
|
|
||||||
public override fun Matrix<Complex>.dot(other: Matrix<Complex>): GslMatrix<Complex, gsl_matrix_complex> {
|
public override fun Matrix<Complex>.dot(other: Matrix<Complex>): GslMatrix<Complex, gsl_matrix_complex> {
|
||||||
val x = toGsl().nativeHandle
|
val x = toGsl().nativeHandle
|
||||||
val a = other.toGsl().nativeHandle
|
val a = other.toGsl().nativeHandle
|
||||||
val result = requireNotNull(gsl_matrix_complex_calloc(a.pointed.size1, a.pointed.size2))
|
val result = requireNotNull(gsl_matrix_complex_calloc(a.pointed.size1, a.pointed.size2))
|
||||||
gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, ComplexField.one.toGsl(), x, a, ComplexField.one.toGsl(), result)
|
gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, ComplexField.one.toGsl(), x, a, ComplexField.one.toGsl(), result)
|
||||||
return GslComplexMatrix(result)
|
return GslComplexMatrix(nativeHandle = result, scope = scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun Matrix<Complex>.dot(vector: Point<Complex>): GslVector<Complex, gsl_vector_complex> {
|
public override fun Matrix<Complex>.dot(vector: Point<Complex>): GslVector<Complex, gsl_vector_complex> {
|
||||||
@ -141,7 +147,7 @@ public object GslComplexMatrixContext : GslMatrixContext<Complex, gsl_matrix_com
|
|||||||
val a = vector.toGsl().nativeHandle
|
val a = vector.toGsl().nativeHandle
|
||||||
val result = requireNotNull(gsl_vector_complex_calloc(a.pointed.size))
|
val result = requireNotNull(gsl_vector_complex_calloc(a.pointed.size))
|
||||||
gsl_blas_zgemv(CblasNoTrans, ComplexField.one.toGsl(), x, a, ComplexField.one.toGsl(), result)
|
gsl_blas_zgemv(CblasNoTrans, ComplexField.one.toGsl(), x, a, ComplexField.one.toGsl(), result)
|
||||||
return GslComplexVector(result)
|
return GslComplexVector(result, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
public override fun Matrix<Complex>.times(value: Complex): GslMatrix<Complex, gsl_matrix_complex> {
|
public override fun Matrix<Complex>.times(value: Complex): GslMatrix<Complex, gsl_matrix_complex> {
|
||||||
|
@ -2,8 +2,14 @@ package kscience.kmath.gsl
|
|||||||
|
|
||||||
import kotlinx.cinterop.CPointer
|
import kotlinx.cinterop.CPointer
|
||||||
import kotlinx.cinterop.CStructVar
|
import kotlinx.cinterop.CStructVar
|
||||||
import kotlinx.io.Closeable
|
import kotlinx.cinterop.DeferScope
|
||||||
|
|
||||||
public abstract class GslMemoryHolder<H : CStructVar> internal constructor() : Closeable {
|
public abstract class GslMemoryHolder<H : CStructVar> internal constructor(internal val scope: DeferScope) {
|
||||||
internal abstract val nativeHandle: CPointer<H>
|
internal abstract val nativeHandle: CPointer<H>
|
||||||
|
|
||||||
|
init {
|
||||||
|
scope.defer(::close)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal abstract fun close()
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
package kscience.kmath.gsl
|
package kscience.kmath.gsl
|
||||||
|
|
||||||
import kotlinx.cinterop.CStructVar
|
import kotlinx.cinterop.CStructVar
|
||||||
|
import kotlinx.cinterop.DeferScope
|
||||||
import kscience.kmath.linear.Point
|
import kscience.kmath.linear.Point
|
||||||
|
|
||||||
public abstract class GslVector<T, H : CStructVar> internal constructor() : GslMemoryHolder<H>(), Point<T> {
|
public abstract class GslVector<T, H : CStructVar> internal constructor(scope: DeferScope) :
|
||||||
|
GslMemoryHolder<H>(scope), Point<T> {
|
||||||
internal abstract operator fun set(index: Int, value: T)
|
internal abstract operator fun set(index: Int, value: T)
|
||||||
internal abstract fun copy(): GslVector<T, H>
|
internal abstract fun copy(): GslVector<T, H>
|
||||||
|
|
||||||
|
@ -6,8 +6,9 @@ import org.gnu.gsl.*
|
|||||||
|
|
||||||
internal class GslRealMatrix(
|
internal class GslRealMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix>,
|
override val nativeHandle: CPointer<gsl_matrix>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<Double, gsl_matrix>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<Double, gsl_matrix>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -17,7 +18,7 @@ internal class GslRealMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslRealMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslRealMatrix =
|
||||||
GslRealMatrix(nativeHandle, this.features + features)
|
GslRealMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): Double = gsl_matrix_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): Double = gsl_matrix_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -27,7 +28,7 @@ internal class GslRealMatrix(
|
|||||||
override fun copy(): GslRealMatrix {
|
override fun copy(): GslRealMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_memcpy(new, nativeHandle)
|
gsl_matrix_memcpy(new, nativeHandle)
|
||||||
return GslRealMatrix(new, features)
|
return GslRealMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_free(nativeHandle)
|
||||||
@ -40,8 +41,9 @@ internal class GslRealMatrix(
|
|||||||
|
|
||||||
internal class GslFloatMatrix(
|
internal class GslFloatMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_float>,
|
override val nativeHandle: CPointer<gsl_matrix_float>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<Float, gsl_matrix_float>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<Float, gsl_matrix_float>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -51,7 +53,7 @@ internal class GslFloatMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslFloatMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslFloatMatrix =
|
||||||
GslFloatMatrix(nativeHandle, this.features + features)
|
GslFloatMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): Float = gsl_matrix_float_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): Float = gsl_matrix_float_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -61,7 +63,7 @@ internal class GslFloatMatrix(
|
|||||||
override fun copy(): GslFloatMatrix {
|
override fun copy(): GslFloatMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_float_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_float_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_float_memcpy(new, nativeHandle)
|
gsl_matrix_float_memcpy(new, nativeHandle)
|
||||||
return GslFloatMatrix(new, features)
|
return GslFloatMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_float_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_float_free(nativeHandle)
|
||||||
@ -74,8 +76,9 @@ internal class GslFloatMatrix(
|
|||||||
|
|
||||||
internal class GslShortMatrix(
|
internal class GslShortMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_short>,
|
override val nativeHandle: CPointer<gsl_matrix_short>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<Short, gsl_matrix_short>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<Short, gsl_matrix_short>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -85,7 +88,7 @@ internal class GslShortMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslShortMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslShortMatrix =
|
||||||
GslShortMatrix(nativeHandle, this.features + features)
|
GslShortMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): Short = gsl_matrix_short_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): Short = gsl_matrix_short_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -95,7 +98,7 @@ internal class GslShortMatrix(
|
|||||||
override fun copy(): GslShortMatrix {
|
override fun copy(): GslShortMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_short_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_short_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_short_memcpy(new, nativeHandle)
|
gsl_matrix_short_memcpy(new, nativeHandle)
|
||||||
return GslShortMatrix(new, features)
|
return GslShortMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_short_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_short_free(nativeHandle)
|
||||||
@ -108,8 +111,9 @@ internal class GslShortMatrix(
|
|||||||
|
|
||||||
internal class GslUShortMatrix(
|
internal class GslUShortMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_ushort>,
|
override val nativeHandle: CPointer<gsl_matrix_ushort>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<UShort, gsl_matrix_ushort>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<UShort, gsl_matrix_ushort>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -119,7 +123,7 @@ internal class GslUShortMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslUShortMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslUShortMatrix =
|
||||||
GslUShortMatrix(nativeHandle, this.features + features)
|
GslUShortMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): UShort = gsl_matrix_ushort_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): UShort = gsl_matrix_ushort_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -129,7 +133,7 @@ internal class GslUShortMatrix(
|
|||||||
override fun copy(): GslUShortMatrix {
|
override fun copy(): GslUShortMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_ushort_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_ushort_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_ushort_memcpy(new, nativeHandle)
|
gsl_matrix_ushort_memcpy(new, nativeHandle)
|
||||||
return GslUShortMatrix(new, features)
|
return GslUShortMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_ushort_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_ushort_free(nativeHandle)
|
||||||
@ -142,8 +146,9 @@ internal class GslUShortMatrix(
|
|||||||
|
|
||||||
internal class GslLongMatrix(
|
internal class GslLongMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_long>,
|
override val nativeHandle: CPointer<gsl_matrix_long>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<Long, gsl_matrix_long>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<Long, gsl_matrix_long>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -153,7 +158,7 @@ internal class GslLongMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslLongMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslLongMatrix =
|
||||||
GslLongMatrix(nativeHandle, this.features + features)
|
GslLongMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): Long = gsl_matrix_long_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): Long = gsl_matrix_long_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -163,7 +168,7 @@ internal class GslLongMatrix(
|
|||||||
override fun copy(): GslLongMatrix {
|
override fun copy(): GslLongMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_long_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_long_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_long_memcpy(new, nativeHandle)
|
gsl_matrix_long_memcpy(new, nativeHandle)
|
||||||
return GslLongMatrix(new, features)
|
return GslLongMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_long_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_long_free(nativeHandle)
|
||||||
@ -176,8 +181,9 @@ internal class GslLongMatrix(
|
|||||||
|
|
||||||
internal class GslULongMatrix(
|
internal class GslULongMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_ulong>,
|
override val nativeHandle: CPointer<gsl_matrix_ulong>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<ULong, gsl_matrix_ulong>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<ULong, gsl_matrix_ulong>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -187,7 +193,7 @@ internal class GslULongMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslULongMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslULongMatrix =
|
||||||
GslULongMatrix(nativeHandle, this.features + features)
|
GslULongMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): ULong = gsl_matrix_ulong_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): ULong = gsl_matrix_ulong_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -197,7 +203,7 @@ internal class GslULongMatrix(
|
|||||||
override fun copy(): GslULongMatrix {
|
override fun copy(): GslULongMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_ulong_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_ulong_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_ulong_memcpy(new, nativeHandle)
|
gsl_matrix_ulong_memcpy(new, nativeHandle)
|
||||||
return GslULongMatrix(new, features)
|
return GslULongMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_ulong_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_ulong_free(nativeHandle)
|
||||||
@ -210,8 +216,9 @@ internal class GslULongMatrix(
|
|||||||
|
|
||||||
internal class GslIntMatrix(
|
internal class GslIntMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_int>,
|
override val nativeHandle: CPointer<gsl_matrix_int>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<Int, gsl_matrix_int>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<Int, gsl_matrix_int>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -221,7 +228,7 @@ internal class GslIntMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslIntMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslIntMatrix =
|
||||||
GslIntMatrix(nativeHandle, this.features + features)
|
GslIntMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): Int = gsl_matrix_int_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): Int = gsl_matrix_int_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -231,7 +238,7 @@ internal class GslIntMatrix(
|
|||||||
override fun copy(): GslIntMatrix {
|
override fun copy(): GslIntMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_int_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_int_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_int_memcpy(new, nativeHandle)
|
gsl_matrix_int_memcpy(new, nativeHandle)
|
||||||
return GslIntMatrix(new, features)
|
return GslIntMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_int_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_int_free(nativeHandle)
|
||||||
@ -244,8 +251,9 @@ internal class GslIntMatrix(
|
|||||||
|
|
||||||
internal class GslUIntMatrix(
|
internal class GslUIntMatrix(
|
||||||
override val nativeHandle: CPointer<gsl_matrix_uint>,
|
override val nativeHandle: CPointer<gsl_matrix_uint>,
|
||||||
features: Set<MatrixFeature> = emptySet()
|
features: Set<MatrixFeature> = emptySet(),
|
||||||
) : GslMatrix<UInt, gsl_matrix_uint>() {
|
scope: DeferScope
|
||||||
|
) : GslMatrix<UInt, gsl_matrix_uint>(scope) {
|
||||||
override val rowNum: Int
|
override val rowNum: Int
|
||||||
get() = nativeHandle.pointed.size1.toInt()
|
get() = nativeHandle.pointed.size1.toInt()
|
||||||
|
|
||||||
@ -255,7 +263,7 @@ internal class GslUIntMatrix(
|
|||||||
override val features: Set<MatrixFeature> = features
|
override val features: Set<MatrixFeature> = features
|
||||||
|
|
||||||
override fun suggestFeature(vararg features: MatrixFeature): GslUIntMatrix =
|
override fun suggestFeature(vararg features: MatrixFeature): GslUIntMatrix =
|
||||||
GslUIntMatrix(nativeHandle, this.features + features)
|
GslUIntMatrix(nativeHandle, this.features + features, scope)
|
||||||
|
|
||||||
override operator fun get(i: Int, j: Int): UInt = gsl_matrix_uint_get(nativeHandle, i.toULong(), j.toULong())
|
override operator fun get(i: Int, j: Int): UInt = gsl_matrix_uint_get(nativeHandle, i.toULong(), j.toULong())
|
||||||
|
|
||||||
@ -265,7 +273,7 @@ internal class GslUIntMatrix(
|
|||||||
override fun copy(): GslUIntMatrix {
|
override fun copy(): GslUIntMatrix {
|
||||||
val new = requireNotNull(gsl_matrix_uint_alloc(rowNum.toULong(), colNum.toULong()))
|
val new = requireNotNull(gsl_matrix_uint_alloc(rowNum.toULong(), colNum.toULong()))
|
||||||
gsl_matrix_uint_memcpy(new, nativeHandle)
|
gsl_matrix_uint_memcpy(new, nativeHandle)
|
||||||
return GslUIntMatrix(new, features)
|
return GslUIntMatrix(new, features, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close(): Unit = gsl_matrix_uint_free(nativeHandle)
|
override fun close(): Unit = gsl_matrix_uint_free(nativeHandle)
|
||||||
|
@ -3,7 +3,8 @@ package kscience.kmath.gsl
|
|||||||
import kotlinx.cinterop.*
|
import kotlinx.cinterop.*
|
||||||
import org.gnu.gsl.*
|
import org.gnu.gsl.*
|
||||||
|
|
||||||
internal class GslRealVector(override val nativeHandle: CPointer<gsl_vector>) : GslVector<Double, gsl_vector>() {
|
internal class GslRealVector(override val nativeHandle: CPointer<gsl_vector>, scope: DeferScope)
|
||||||
|
: GslVector<Double, gsl_vector>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -13,7 +14,7 @@ internal class GslRealVector(override val nativeHandle: CPointer<gsl_vector>) :
|
|||||||
override fun copy(): GslRealVector {
|
override fun copy(): GslRealVector {
|
||||||
val new = requireNotNull(gsl_vector_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_alloc(size.toULong()))
|
||||||
gsl_vector_memcpy(new, nativeHandle)
|
gsl_vector_memcpy(new, nativeHandle)
|
||||||
return GslRealVector(new)
|
return GslRealVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -24,7 +25,8 @@ internal class GslRealVector(override val nativeHandle: CPointer<gsl_vector>) :
|
|||||||
override fun close(): Unit = gsl_vector_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslFloatVector(override val nativeHandle: CPointer<gsl_vector_float>) : GslVector<Float, gsl_vector_float>() {
|
internal class GslFloatVector(override val nativeHandle: CPointer<gsl_vector_float>, scope: DeferScope)
|
||||||
|
: GslVector<Float, gsl_vector_float>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -34,7 +36,7 @@ internal class GslFloatVector(override val nativeHandle: CPointer<gsl_vector_flo
|
|||||||
override fun copy(): GslFloatVector {
|
override fun copy(): GslFloatVector {
|
||||||
val new = requireNotNull(gsl_vector_float_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_float_alloc(size.toULong()))
|
||||||
gsl_vector_float_memcpy(new, nativeHandle)
|
gsl_vector_float_memcpy(new, nativeHandle)
|
||||||
return GslFloatVector(new)
|
return GslFloatVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -45,7 +47,8 @@ internal class GslFloatVector(override val nativeHandle: CPointer<gsl_vector_flo
|
|||||||
override fun close(): Unit = gsl_vector_float_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_float_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslShortVector(override val nativeHandle: CPointer<gsl_vector_short>) : GslVector<Short, gsl_vector_short>() {
|
internal class GslShortVector(override val nativeHandle: CPointer<gsl_vector_short>, scope: DeferScope)
|
||||||
|
: GslVector<Short, gsl_vector_short>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -55,7 +58,7 @@ internal class GslShortVector(override val nativeHandle: CPointer<gsl_vector_sho
|
|||||||
override fun copy(): GslShortVector {
|
override fun copy(): GslShortVector {
|
||||||
val new = requireNotNull(gsl_vector_short_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_short_alloc(size.toULong()))
|
||||||
gsl_vector_short_memcpy(new, nativeHandle)
|
gsl_vector_short_memcpy(new, nativeHandle)
|
||||||
return GslShortVector(new)
|
return GslShortVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -66,7 +69,8 @@ internal class GslShortVector(override val nativeHandle: CPointer<gsl_vector_sho
|
|||||||
override fun close(): Unit = gsl_vector_short_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_short_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslUShortVector(override val nativeHandle: CPointer<gsl_vector_ushort>) : GslVector<UShort, gsl_vector_ushort>() {
|
internal class GslUShortVector(override val nativeHandle: CPointer<gsl_vector_ushort>, scope: DeferScope)
|
||||||
|
: GslVector<UShort, gsl_vector_ushort>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -76,7 +80,7 @@ internal class GslUShortVector(override val nativeHandle: CPointer<gsl_vector_us
|
|||||||
override fun copy(): GslUShortVector {
|
override fun copy(): GslUShortVector {
|
||||||
val new = requireNotNull(gsl_vector_ushort_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_ushort_alloc(size.toULong()))
|
||||||
gsl_vector_ushort_memcpy(new, nativeHandle)
|
gsl_vector_ushort_memcpy(new, nativeHandle)
|
||||||
return GslUShortVector(new)
|
return GslUShortVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -87,7 +91,8 @@ internal class GslUShortVector(override val nativeHandle: CPointer<gsl_vector_us
|
|||||||
override fun close(): Unit = gsl_vector_ushort_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_ushort_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslLongVector(override val nativeHandle: CPointer<gsl_vector_long>) : GslVector<Long, gsl_vector_long>() {
|
internal class GslLongVector(override val nativeHandle: CPointer<gsl_vector_long>, scope: DeferScope)
|
||||||
|
: GslVector<Long, gsl_vector_long>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -97,7 +102,7 @@ internal class GslLongVector(override val nativeHandle: CPointer<gsl_vector_long
|
|||||||
override fun copy(): GslLongVector {
|
override fun copy(): GslLongVector {
|
||||||
val new = requireNotNull(gsl_vector_long_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_long_alloc(size.toULong()))
|
||||||
gsl_vector_long_memcpy(new, nativeHandle)
|
gsl_vector_long_memcpy(new, nativeHandle)
|
||||||
return GslLongVector(new)
|
return GslLongVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -108,7 +113,8 @@ internal class GslLongVector(override val nativeHandle: CPointer<gsl_vector_long
|
|||||||
override fun close(): Unit = gsl_vector_long_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_long_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslULongVector(override val nativeHandle: CPointer<gsl_vector_ulong>) : GslVector<ULong, gsl_vector_ulong>() {
|
internal class GslULongVector(override val nativeHandle: CPointer<gsl_vector_ulong>, scope: DeferScope)
|
||||||
|
: GslVector<ULong, gsl_vector_ulong>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -118,7 +124,7 @@ internal class GslULongVector(override val nativeHandle: CPointer<gsl_vector_ulo
|
|||||||
override fun copy(): GslULongVector {
|
override fun copy(): GslULongVector {
|
||||||
val new = requireNotNull(gsl_vector_ulong_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_ulong_alloc(size.toULong()))
|
||||||
gsl_vector_ulong_memcpy(new, nativeHandle)
|
gsl_vector_ulong_memcpy(new, nativeHandle)
|
||||||
return GslULongVector(new)
|
return GslULongVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -129,7 +135,8 @@ internal class GslULongVector(override val nativeHandle: CPointer<gsl_vector_ulo
|
|||||||
override fun close(): Unit = gsl_vector_ulong_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_ulong_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslIntVector(override val nativeHandle: CPointer<gsl_vector_int>) : GslVector<Int, gsl_vector_int>() {
|
internal class GslIntVector(override val nativeHandle: CPointer<gsl_vector_int>, scope: DeferScope)
|
||||||
|
: GslVector<Int, gsl_vector_int>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -139,7 +146,7 @@ internal class GslIntVector(override val nativeHandle: CPointer<gsl_vector_int>)
|
|||||||
override fun copy(): GslIntVector {
|
override fun copy(): GslIntVector {
|
||||||
val new = requireNotNull(gsl_vector_int_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_int_alloc(size.toULong()))
|
||||||
gsl_vector_int_memcpy(new, nativeHandle)
|
gsl_vector_int_memcpy(new, nativeHandle)
|
||||||
return GslIntVector(new)
|
return GslIntVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
@ -150,7 +157,8 @@ internal class GslIntVector(override val nativeHandle: CPointer<gsl_vector_int>)
|
|||||||
override fun close(): Unit = gsl_vector_int_free(nativeHandle)
|
override fun close(): Unit = gsl_vector_int_free(nativeHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GslUIntVector(override val nativeHandle: CPointer<gsl_vector_uint>) : GslVector<UInt, gsl_vector_uint>() {
|
internal class GslUIntVector(override val nativeHandle: CPointer<gsl_vector_uint>, scope: DeferScope)
|
||||||
|
: GslVector<UInt, gsl_vector_uint>(scope) {
|
||||||
override val size: Int
|
override val size: Int
|
||||||
get() = nativeHandle.pointed.size.toInt()
|
get() = nativeHandle.pointed.size.toInt()
|
||||||
|
|
||||||
@ -160,7 +168,7 @@ internal class GslUIntVector(override val nativeHandle: CPointer<gsl_vector_uint
|
|||||||
override fun copy(): GslUIntVector {
|
override fun copy(): GslUIntVector {
|
||||||
val new = requireNotNull(gsl_vector_uint_alloc(size.toULong()))
|
val new = requireNotNull(gsl_vector_uint_alloc(size.toULong()))
|
||||||
gsl_vector_uint_memcpy(new, nativeHandle)
|
gsl_vector_uint_memcpy(new, nativeHandle)
|
||||||
return GslUIntVector(new)
|
return GslUIntVector(new, scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package kscience.kmath.gsl
|
package kscience.kmath.gsl
|
||||||
|
|
||||||
|
import kotlinx.cinterop.memScoped
|
||||||
import kscience.kmath.linear.RealMatrixContext
|
import kscience.kmath.linear.RealMatrixContext
|
||||||
import kscience.kmath.operations.invoke
|
import kscience.kmath.operations.invoke
|
||||||
import kscience.kmath.structures.RealBuffer
|
import kscience.kmath.structures.RealBuffer
|
||||||
@ -11,36 +12,37 @@ import kotlin.test.assertTrue
|
|||||||
|
|
||||||
internal class RealTest {
|
internal class RealTest {
|
||||||
@Test
|
@Test
|
||||||
fun testScale() = GslRealMatrixContext {
|
fun testScale() = memScoped {
|
||||||
val ma = GslRealMatrixContext.produce(10, 10) { _, _ -> 0.1 }
|
(GslRealMatrixContext(this)) {
|
||||||
|
val ma = produce(10, 10) { _, _ -> 0.1 }
|
||||||
val mb = (ma * 20.0)
|
val mb = (ma * 20.0)
|
||||||
assertEquals(mb[0, 1], 2.0)
|
assertEquals(mb[0, 1], 2.0)
|
||||||
mb.close()
|
}
|
||||||
ma.close()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testDotOfMatrixAndVector() {
|
fun testDotOfMatrixAndVector() = memScoped {
|
||||||
val ma = GslRealMatrixContext.produce(2, 2) { _, _ -> 100.0 }
|
(GslRealMatrixContext(this)) {
|
||||||
|
val ma = produce(2, 2) { _, _ -> 100.0 }
|
||||||
val vb = RealBuffer(2) { 0.1 }
|
val vb = RealBuffer(2) { 0.1 }
|
||||||
val res1 = GslRealMatrixContext { ma dot vb }
|
val res1 = ma dot vb
|
||||||
val res2 = RealMatrixContext { ma dot vb }
|
val res2 = RealMatrixContext { ma dot vb }
|
||||||
println(res1.asSequence().toList())
|
println(res1.asSequence().toList())
|
||||||
println(res2.asSequence().toList())
|
println(res2.asSequence().toList())
|
||||||
assertTrue(res1.contentEquals(res2))
|
assertTrue(res1.contentEquals(res2))
|
||||||
res1.close()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testDotOfMatrixAndMatrix() {
|
fun testDotOfMatrixAndMatrix() = memScoped {
|
||||||
val ma = GslRealMatrixContext.produce(2, 2) { _, _ -> 100.0 }
|
(GslRealMatrixContext(this)) {
|
||||||
val mb = GslRealMatrixContext.produce(2, 2) { _, _ -> 100.0 }
|
val ma = produce(2, 2) { _, _ -> 100.0 }
|
||||||
val res1 = GslRealMatrixContext { ma dot mb }
|
val mb = produce(2, 2) { _, _ -> 100.0 }
|
||||||
|
val res1 = ma dot mb
|
||||||
val res2 = RealMatrixContext { ma dot mb }
|
val res2 = RealMatrixContext { ma dot mb }
|
||||||
println(res1.rows.asIterable().map { it.asSequence() }.flatMap(Sequence<*>::toList))
|
println(res1.rows.asIterable().map { it.asSequence() }.flatMap(Sequence<*>::toList))
|
||||||
println(res2.rows.asIterable().map { it.asSequence() }.flatMap(Sequence<*>::toList))
|
println(res2.rows.asIterable().map { it.asSequence() }.flatMap(Sequence<*>::toList))
|
||||||
assertEquals(res1, res2)
|
assertEquals(res1, res2)
|
||||||
ma.close()
|
}
|
||||||
mb.close()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user