DoubleBuffer generator was moved to DoubleBuffer file and factory functions were added for LongArray

This commit is contained in:
apomytkina 2022-05-15 16:55:55 +03:00
parent 2144c6382c
commit d9b719fe5a
6 changed files with 24 additions and 10 deletions

View File

@ -6,6 +6,7 @@
package space.kscience.kmath.structures package space.kscience.kmath.structures
import kotlin.jvm.JvmInline import kotlin.jvm.JvmInline
import kotlin.random.Random.Default.nextDouble
/** /**
* Specialized [MutableBuffer] implementation over [DoubleArray]. * Specialized [MutableBuffer] implementation over [DoubleArray].
@ -42,6 +43,11 @@ public value class DoubleBuffer(public val array: DoubleArray) : MutableBuffer<D
*/ */
public inline fun DoubleBuffer(size: Int, init: (Int) -> Double): DoubleBuffer = DoubleBuffer(DoubleArray(size) { init(it) }) public inline fun DoubleBuffer(size: Int, init: (Int) -> 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. * Returns a new [DoubleBuffer] of given elements.
*/ */

View File

@ -12,6 +12,7 @@ import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.operations.DoubleField import space.kscience.kmath.operations.DoubleField
import space.kscience.kmath.stat.RandomGenerator import space.kscience.kmath.stat.RandomGenerator
import space.kscience.kmath.stat.nextBuffer import space.kscience.kmath.stat.nextBuffer
import space.kscience.kmath.structures.nextDoubleBuffer
import kotlin.native.concurrent.ThreadLocal import kotlin.native.concurrent.ThreadLocal
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
@ -35,7 +36,7 @@ internal class UniformHistogram1DTest {
@Test @Test
fun rebinDown() = runTest { 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) val h2 = Histogram.uniform1D(DoubleField,0.03).produceFrom(h1)
assertEquals(10000, h2.bins.sumOf { it.binValue }.toInt()) assertEquals(10000, h2.bins.sumOf { it.binValue }.toInt())
@ -43,7 +44,7 @@ internal class UniformHistogram1DTest {
@Test @Test
fun rebinUp() = runTest { 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) val h2 = Histogram.uniform1D(DoubleField,0.01).produceFrom(h1)
assertEquals(10000, h2.bins.sumOf { it.binValue }.toInt()) assertEquals(10000, h2.bins.sumOf { it.binValue }.toInt())

View File

@ -8,3 +8,13 @@ package space.kscience.kmath.nd4j
import space.kscience.kmath.misc.toIntExact import space.kscience.kmath.misc.toIntExact
internal fun LongArray.toIntArray(): IntArray = IntArray(size) { this[it].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 }

View File

@ -8,6 +8,7 @@ package space.kscience.kmath.samplers
import space.kscience.kmath.chains.BlockingDoubleChain import space.kscience.kmath.chains.BlockingDoubleChain
import space.kscience.kmath.stat.RandomGenerator import space.kscience.kmath.stat.RandomGenerator
import space.kscience.kmath.structures.DoubleBuffer import space.kscience.kmath.structures.DoubleBuffer
import space.kscience.kmath.structures.nextDoubleBuffer
import kotlin.math.* import kotlin.math.*
/** /**
@ -23,8 +24,8 @@ public object BoxMullerSampler : NormalizedGaussianSampler {
var state = Double.NaN var state = Double.NaN
override fun nextBufferBlocking(size: Int): DoubleBuffer { override fun nextBufferBlocking(size: Int): DoubleBuffer {
val xs = generator.nextDoubleBuffer(size) val xs = nextDoubleBuffer(size)
val ys = generator.nextDoubleBuffer(size) val ys = nextDoubleBuffer(size)
return DoubleBuffer(size) { index -> return DoubleBuffer(size) { index ->
if (state.isNaN()) { if (state.isNaN()) {

View File

@ -8,6 +8,7 @@ package space.kscience.kmath.stat
import space.kscience.kmath.chains.BlockingDoubleChain import space.kscience.kmath.chains.BlockingDoubleChain
import space.kscience.kmath.chains.Chain import space.kscience.kmath.chains.Chain
import space.kscience.kmath.structures.DoubleBuffer import space.kscience.kmath.structures.DoubleBuffer
import space.kscience.kmath.structures.nextDoubleBuffer
/** /**
* A possibly stateful chain producing random values. * A possibly stateful chain producing random values.
@ -31,7 +32,7 @@ public fun <R> RandomGenerator.chain(generator: suspend RandomGenerator.() -> R)
* A type-specific double chunk random chain * A type-specific double chunk random chain
*/ */
public class UniformDoubleChain(public val generator: RandomGenerator) : BlockingDoubleChain { 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 nextBuffer(size: Int): DoubleBuffer = nextBufferBlocking(size)
override suspend fun fork(): UniformDoubleChain = UniformDoubleChain(generator.fork()) override suspend fun fork(): UniformDoubleChain = UniformDoubleChain(generator.fork())

View File

@ -22,11 +22,6 @@ public interface RandomGenerator {
*/ */
public fun nextDouble(): Double 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. * Gets the next random `Int` from the random number generator.
* *