forked from kscience/kmath
Added limited polimorphism to Histogram
This commit is contained in:
parent
34374e1006
commit
6a0ef6a235
@ -6,13 +6,13 @@ import scientifik.kmath.structures.NDStructure
|
|||||||
import scientifik.kmath.structures.ndStructure
|
import scientifik.kmath.structures.ndStructure
|
||||||
import kotlin.math.floor
|
import kotlin.math.floor
|
||||||
|
|
||||||
class MultivariateBin(override val center: RealVector, val sizes: RealVector, val counter: LongCounter = LongCounter()) : Bin {
|
class MultivariateBin(override val center: RealVector, val sizes: RealVector, val counter: LongCounter = LongCounter()) : Bin<Double> {
|
||||||
init {
|
init {
|
||||||
if (center.size != sizes.size) error("Dimension mismatch in bin creation. Expected ${center.size}, but found ${sizes.size}")
|
if (center.size != sizes.size) error("Dimension mismatch in bin creation. Expected ${center.size}, but found ${sizes.size}")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun contains(vector: RealVector): Boolean {
|
override fun contains(vector: RealVector): Boolean {
|
||||||
if(vector.size != center.size) error("Dimension mismatch for input vector. Expected ${center.size}, but found ${vector.size}")
|
if (vector.size != center.size) error("Dimension mismatch for input vector. Expected ${center.size}, but found ${vector.size}")
|
||||||
return vector.asSequence().mapIndexed { i, value -> value in (center[i] - sizes[i] / 2)..(center[i] + sizes[i] / 2) }.all { it }
|
return vector.asSequence().mapIndexed { i, value -> value in (center[i] - sizes[i] / 2)..(center[i] + sizes[i] / 2) }.all { it }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,8 +28,8 @@ class MultivariateBin(override val center: RealVector, val sizes: RealVector, va
|
|||||||
class FastHistogram(
|
class FastHistogram(
|
||||||
private val lower: RealVector,
|
private val lower: RealVector,
|
||||||
private val upper: RealVector,
|
private val upper: RealVector,
|
||||||
private val binNums: IntArray = IntArray(lower.size) { 100 }
|
private val binNums: IntArray = IntArray(lower.size) { 20 }
|
||||||
) : Histogram<MultivariateBin> {
|
) : Histogram<Double, MultivariateBin> {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
// argument checks
|
// argument checks
|
||||||
@ -105,7 +105,7 @@ class FastHistogram(
|
|||||||
*)
|
*)
|
||||||
*```
|
*```
|
||||||
*/
|
*/
|
||||||
fun fromRanges(vararg ranges: Pair<ClosedFloatingPointRange<Double>,Int>): FastHistogram {
|
fun fromRanges(vararg ranges: Pair<ClosedFloatingPointRange<Double>, Int>): FastHistogram {
|
||||||
return FastHistogram(
|
return FastHistogram(
|
||||||
ranges.map { it.first.start }.toVector(),
|
ranges.map { it.first.start }.toVector(),
|
||||||
ranges.map { it.first.endInclusive }.toVector(),
|
ranges.map { it.first.endInclusive }.toVector(),
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package scientifik.kmath.histogram
|
package scientifik.kmath.histogram
|
||||||
|
|
||||||
import scientifik.kmath.linear.RealVector
|
import scientifik.kmath.linear.Vector
|
||||||
import scientifik.kmath.linear.toVector
|
import scientifik.kmath.linear.toVector
|
||||||
import scientifik.kmath.operations.Space
|
import scientifik.kmath.operations.Space
|
||||||
|
|
||||||
@ -8,28 +8,28 @@ import scientifik.kmath.operations.Space
|
|||||||
* A simple geometric domain
|
* A simple geometric domain
|
||||||
* TODO move to geometry module
|
* TODO move to geometry module
|
||||||
*/
|
*/
|
||||||
interface Domain {
|
interface Domain<T: Any> {
|
||||||
operator fun contains(vector: RealVector): Boolean
|
operator fun contains(vector: Vector<T>): Boolean
|
||||||
val dimension: Int
|
val dimension: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The bin in the histogram. The histogram is by definition always done in the real space
|
* The bin in the histogram. The histogram is by definition always done in the real space
|
||||||
*/
|
*/
|
||||||
interface Bin : Domain {
|
interface Bin<T: Any> : Domain<T> {
|
||||||
/**
|
/**
|
||||||
* The value of this bin
|
* The value of this bin
|
||||||
*/
|
*/
|
||||||
val value: Number
|
val value: Number
|
||||||
val center: RealVector
|
val center: Vector<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Histogram<out B : Bin> : Iterable<B> {
|
interface Histogram<T: Any, out B : Bin<T>> : Iterable<B> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find existing bin, corresponding to given coordinates
|
* Find existing bin, corresponding to given coordinates
|
||||||
*/
|
*/
|
||||||
operator fun get(point: RealVector): B?
|
operator fun get(point: Vector<T>): B?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dimension of the histogram
|
* Dimension of the histogram
|
||||||
@ -39,24 +39,24 @@ interface Histogram<out B : Bin> : Iterable<B> {
|
|||||||
/**
|
/**
|
||||||
* Increment appropriate bin
|
* Increment appropriate bin
|
||||||
*/
|
*/
|
||||||
fun put(point: RealVector)
|
fun put(point: Vector<T>)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Histogram<*>.put(vararg point: Double) = put(point.toVector())
|
fun Histogram<Double,*>.put(vararg point: Double) = put(point.toVector())
|
||||||
|
|
||||||
fun Histogram<*>.fill(sequence: Iterable<RealVector>) = sequence.forEach { put(it) }
|
fun <T: Any> Histogram<T,*>.fill(sequence: Iterable<Vector<T>>) = sequence.forEach { put(it) }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pass a sequence builder into histogram
|
* Pass a sequence builder into histogram
|
||||||
*/
|
*/
|
||||||
fun Histogram<*>.fill(buider: suspend SequenceScope<RealVector>.() -> Unit) = fill(sequence(buider).asIterable())
|
fun <T: Any> Histogram<T, *>.fill(buider: suspend SequenceScope<Vector<T>>.() -> Unit) = fill(sequence(buider).asIterable())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A space to perform arithmetic operations on histograms
|
* A space to perform arithmetic operations on histograms
|
||||||
*/
|
*/
|
||||||
interface HistogramSpace<B : Bin, H : Histogram<B>> : Space<H> {
|
interface HistogramSpace<T: Any, B : Bin<T>, H : Histogram<T,B>> : Space<H> {
|
||||||
/**
|
/**
|
||||||
* Rules for performing operations on bins
|
* Rules for performing operations on bins
|
||||||
*/
|
*/
|
||||||
val binSpace: Space<Bin>
|
val binSpace: Space<Bin<T>>
|
||||||
}
|
}
|
@ -7,7 +7,7 @@ import kotlin.math.floor
|
|||||||
|
|
||||||
//TODO move to common
|
//TODO move to common
|
||||||
|
|
||||||
class UnivariateBin(val position: Double, val size: Double, val counter: LongCounter = LongCounter()) : Bin {
|
class UnivariateBin(val position: Double, val size: Double, val counter: LongCounter = LongCounter()) : Bin<Double> {
|
||||||
//TODO add weighting
|
//TODO add weighting
|
||||||
override val value: Number get() = counter.sum()
|
override val value: Number get() = counter.sum()
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ class UnivariateBin(val position: Double, val size: Double, val counter: LongCou
|
|||||||
/**
|
/**
|
||||||
* Univariate histogram with log(n) bin search speed
|
* Univariate histogram with log(n) bin search speed
|
||||||
*/
|
*/
|
||||||
class UnivariateHistogram private constructor(private val factory: (Double) -> UnivariateBin) : Histogram<UnivariateBin> {
|
class UnivariateHistogram private constructor(private val factory: (Double) -> UnivariateBin) : Histogram<Double,UnivariateBin> {
|
||||||
|
|
||||||
private val bins: TreeMap<Double, UnivariateBin> = TreeMap()
|
private val bins: TreeMap<Double, UnivariateBin> = TreeMap()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user