From d9b719fe5a7a731abd9bc5717ce26f096c73caab Mon Sep 17 00:00:00 2001 From: apomytkina Date: Sun, 15 May 2022 16:55:55 +0300 Subject: [PATCH] DoubleBuffer generator was moved to DoubleBuffer file and factory functions were added for LongArray --- .../space/kscience/kmath/structures/DoubleBuffer.kt | 6 ++++++ .../kscience/kmath/histogram/UniformHistogram1DTest.kt | 5 +++-- .../main/kotlin/space/kscience/kmath/nd4j/arrays.kt | 10 ++++++++++ .../space/kscience/kmath/samplers/BoxMullerSampler.kt | 5 +++-- .../kotlin/space/kscience/kmath/stat/RandomChain.kt | 3 ++- .../space/kscience/kmath/stat/RandomGenerator.kt | 5 ----- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/kmath-core/src/commonMain/kotlin/space/kscience/kmath/structures/DoubleBuffer.kt b/kmath-core/src/commonMain/kotlin/space/kscience/kmath/structures/DoubleBuffer.kt index f4388a477..0bbbec138 100644 --- a/kmath-core/src/commonMain/kotlin/space/kscience/kmath/structures/DoubleBuffer.kt +++ b/kmath-core/src/commonMain/kotlin/space/kscience/kmath/structures/DoubleBuffer.kt @@ -6,6 +6,7 @@ package space.kscience.kmath.structures import kotlin.jvm.JvmInline +import kotlin.random.Random.Default.nextDouble /** * Specialized [MutableBuffer] implementation over [DoubleArray]. @@ -42,6 +43,11 @@ public value class DoubleBuffer(public val array: DoubleArray) : MutableBuffer Double): DoubleBuffer = DoubleBuffer(DoubleArray(size) { init(it) }) +/** + * A chunk of doubles of given [size]. + */ +public fun nextDoubleBuffer(size: Int): DoubleBuffer = DoubleBuffer(size) { nextDouble() } + /** * Returns a new [DoubleBuffer] of given elements. */ diff --git a/kmath-histograms/src/commonTest/kotlin/space/kscience/kmath/histogram/UniformHistogram1DTest.kt b/kmath-histograms/src/commonTest/kotlin/space/kscience/kmath/histogram/UniformHistogram1DTest.kt index 09bf3939d..86f149ecc 100644 --- a/kmath-histograms/src/commonTest/kotlin/space/kscience/kmath/histogram/UniformHistogram1DTest.kt +++ b/kmath-histograms/src/commonTest/kotlin/space/kscience/kmath/histogram/UniformHistogram1DTest.kt @@ -12,6 +12,7 @@ import space.kscience.kmath.misc.UnstableKMathAPI import space.kscience.kmath.operations.DoubleField import space.kscience.kmath.stat.RandomGenerator import space.kscience.kmath.stat.nextBuffer +import space.kscience.kmath.structures.nextDoubleBuffer import kotlin.native.concurrent.ThreadLocal import kotlin.test.Test import kotlin.test.assertEquals @@ -35,7 +36,7 @@ internal class UniformHistogram1DTest { @Test fun rebinDown() = runTest { - val h1 = Histogram.uniform1D(DoubleField, 0.01).produce(generator.nextDoubleBuffer(10000)) + val h1 = Histogram.uniform1D(DoubleField, 0.01).produce(nextDoubleBuffer(10000)) val h2 = Histogram.uniform1D(DoubleField,0.03).produceFrom(h1) assertEquals(10000, h2.bins.sumOf { it.binValue }.toInt()) @@ -43,7 +44,7 @@ internal class UniformHistogram1DTest { @Test fun rebinUp() = runTest { - val h1 = Histogram.uniform1D(DoubleField, 0.03).produce(generator.nextDoubleBuffer(10000)) + val h1 = Histogram.uniform1D(DoubleField, 0.03).produce(nextDoubleBuffer(10000)) val h2 = Histogram.uniform1D(DoubleField,0.01).produceFrom(h1) assertEquals(10000, h2.bins.sumOf { it.binValue }.toInt()) diff --git a/kmath-nd4j/src/main/kotlin/space/kscience/kmath/nd4j/arrays.kt b/kmath-nd4j/src/main/kotlin/space/kscience/kmath/nd4j/arrays.kt index 3ca756600..db910f158 100644 --- a/kmath-nd4j/src/main/kotlin/space/kscience/kmath/nd4j/arrays.kt +++ b/kmath-nd4j/src/main/kotlin/space/kscience/kmath/nd4j/arrays.kt @@ -8,3 +8,13 @@ package space.kscience.kmath.nd4j import space.kscience.kmath.misc.toIntExact internal fun LongArray.toIntArray(): IntArray = IntArray(size) { this[it].toIntExact() } + +internal fun LongArray.linspace(start: Long, stop: Long) = Array(this.size) { + start + it * ((stop - start) / (this.size - 1)) +} + +internal fun LongArray.zeros() = Array(this.size) { 0 } + +internal fun LongArray.ones() = Array(this.size) { 1 } + +internal fun repeat(number: Long, size: Int) = LongArray(size) { number } \ No newline at end of file diff --git a/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/samplers/BoxMullerSampler.kt b/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/samplers/BoxMullerSampler.kt index b3c014553..9719cef0a 100644 --- a/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/samplers/BoxMullerSampler.kt +++ b/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/samplers/BoxMullerSampler.kt @@ -8,6 +8,7 @@ package space.kscience.kmath.samplers import space.kscience.kmath.chains.BlockingDoubleChain import space.kscience.kmath.stat.RandomGenerator import space.kscience.kmath.structures.DoubleBuffer +import space.kscience.kmath.structures.nextDoubleBuffer import kotlin.math.* /** @@ -23,8 +24,8 @@ public object BoxMullerSampler : NormalizedGaussianSampler { var state = Double.NaN override fun nextBufferBlocking(size: Int): DoubleBuffer { - val xs = generator.nextDoubleBuffer(size) - val ys = generator.nextDoubleBuffer(size) + val xs = nextDoubleBuffer(size) + val ys = nextDoubleBuffer(size) return DoubleBuffer(size) { index -> if (state.isNaN()) { diff --git a/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomChain.kt b/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomChain.kt index d4bc36b5b..ab05b3aa1 100644 --- a/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomChain.kt +++ b/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomChain.kt @@ -8,6 +8,7 @@ package space.kscience.kmath.stat import space.kscience.kmath.chains.BlockingDoubleChain import space.kscience.kmath.chains.Chain import space.kscience.kmath.structures.DoubleBuffer +import space.kscience.kmath.structures.nextDoubleBuffer /** * A possibly stateful chain producing random values. @@ -31,7 +32,7 @@ public fun RandomGenerator.chain(generator: suspend RandomGenerator.() -> R) * A type-specific double chunk random chain */ public class UniformDoubleChain(public val generator: RandomGenerator) : BlockingDoubleChain { - override fun nextBufferBlocking(size: Int): DoubleBuffer = generator.nextDoubleBuffer(size) + override fun nextBufferBlocking(size: Int): DoubleBuffer = nextDoubleBuffer(size) override suspend fun nextBuffer(size: Int): DoubleBuffer = nextBufferBlocking(size) override suspend fun fork(): UniformDoubleChain = UniformDoubleChain(generator.fork()) diff --git a/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomGenerator.kt b/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomGenerator.kt index f280a78aa..cce92a877 100644 --- a/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomGenerator.kt +++ b/kmath-stat/src/commonMain/kotlin/space/kscience/kmath/stat/RandomGenerator.kt @@ -22,11 +22,6 @@ public interface RandomGenerator { */ public fun nextDouble(): Double - /** - * A chunk of doubles of given [size]. - */ - public fun nextDoubleBuffer(size: Int): DoubleBuffer = DoubleBuffer(size) { nextDouble() } - /** * Gets the next random `Int` from the random number generator. *