Update algebra extensions, improve docs
This commit is contained in:
parent
4c39b98017
commit
eae218ff5f
@ -1,15 +1,62 @@
|
|||||||
package scientifik.kmath.operations
|
package scientifik.kmath.operations
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the sum of all elements in the iterable in this [Space].
|
||||||
|
*
|
||||||
|
* @receiver the algebra that provides addition.
|
||||||
|
* @param data the collection to sum up.
|
||||||
|
* @return the sum.
|
||||||
|
*/
|
||||||
fun <T> Space<T>.sum(data: Iterable<T>): T = data.fold(zero) { left, right -> add(left, right) }
|
fun <T> Space<T>.sum(data: Iterable<T>): T = data.fold(zero) { left, right -> add(left, right) }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the sum of all elements in the sequence in this [Space].
|
||||||
|
*
|
||||||
|
* @receiver the algebra that provides addition.
|
||||||
|
* @param data the collection to sum up.
|
||||||
|
* @return the sum.
|
||||||
|
*/
|
||||||
fun <T> Space<T>.sum(data: Sequence<T>): T = data.fold(zero) { left, right -> add(left, right) }
|
fun <T> Space<T>.sum(data: Sequence<T>): T = data.fold(zero) { left, right -> add(left, right) }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the sum of all elements in the iterable in provided space.
|
||||||
|
*
|
||||||
|
* @receiver the collection to sum up.
|
||||||
|
* @param space the algebra that provides addition.
|
||||||
|
* @return the sum.
|
||||||
|
*/
|
||||||
fun <T : Any, S : Space<T>> Iterable<T>.sumWith(space: S): T = space.sum(this)
|
fun <T : Any, S : Space<T>> Iterable<T>.sumWith(space: S): T = space.sum(this)
|
||||||
|
|
||||||
//TODO optimized power operation
|
//TODO optimized power operation
|
||||||
fun <T> RingOperations<T>.power(arg: T, power: Int): T {
|
|
||||||
|
/**
|
||||||
|
* Raises [arg] to the natural power [power].
|
||||||
|
*
|
||||||
|
* @receiver the algebra to provide multiplication.
|
||||||
|
* @param arg the base.
|
||||||
|
* @param power the exponent.
|
||||||
|
* @return the base raised to the power.
|
||||||
|
*/
|
||||||
|
fun <T> Ring<T>.power(arg: T, power: Int): T {
|
||||||
|
require(power >= 0) { "The power can't be negative." }
|
||||||
|
require(power != 0 || arg != zero) { "The $zero raised to $power is not defined." }
|
||||||
|
if (power == 0) return one
|
||||||
var res = arg
|
var res = arg
|
||||||
repeat(power - 1) {
|
repeat(power - 1) { res *= arg }
|
||||||
res *= arg
|
|
||||||
}
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raises [arg] to the integer power [power].
|
||||||
|
*
|
||||||
|
* @receiver the algebra to provide multiplication and division.
|
||||||
|
* @param arg the base.
|
||||||
|
* @param power the exponent.
|
||||||
|
* @return the base raised to the power.
|
||||||
|
*/
|
||||||
|
fun <T> Field<T>.power(arg: T, power: Int): T {
|
||||||
|
require(power != 0 || arg != zero) { "The $zero raised to $power is not defined." }
|
||||||
|
if (power == 0) return one
|
||||||
|
if (power < 0) return one / (this as Ring<T>).power(arg, -power)
|
||||||
|
return (this as Ring<T>).power(arg, power)
|
||||||
|
}
|
||||||
|
@ -143,7 +143,11 @@ interface PowerOperations<T> : Algebra<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Raises [arg] to the power [pow].
|
* Raises this element to the power [pow].
|
||||||
|
*
|
||||||
|
* @receiver the base.
|
||||||
|
* @param power the exponent.
|
||||||
|
* @return the base raised to the power.
|
||||||
*/
|
*/
|
||||||
infix fun <T : MathElement<out PowerOperations<T>>> T.pow(power: Double): T = context.power(this, power)
|
infix fun <T : MathElement<out PowerOperations<T>>> T.pow(power: Double): T = context.power(this, power)
|
||||||
|
|
||||||
|
@ -4,13 +4,22 @@ import scientifik.kmath.operations.Complex
|
|||||||
import scientifik.kmath.operations.complex
|
import scientifik.kmath.operations.complex
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function that produces [Buffer] from its size and function that supplies values.
|
||||||
|
*
|
||||||
|
* @param T the type of buffer.
|
||||||
|
*/
|
||||||
typealias BufferFactory<T> = (Int, (Int) -> T) -> Buffer<T>
|
typealias BufferFactory<T> = (Int, (Int) -> T) -> Buffer<T>
|
||||||
typealias MutableBufferFactory<T> = (Int, (Int) -> T) -> MutableBuffer<T>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A generic random access structure for both primitives and objects
|
* Function that produces [MutableBuffer] from its size and function that supplies values.
|
||||||
|
*
|
||||||
|
* @param T the type of buffer.
|
||||||
|
*/
|
||||||
|
typealias MutableBufferFactory<T> = (Int, (Int) -> T) -> MutableBuffer<T>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic random-access structure for both primitives and objects.
|
||||||
*/
|
*/
|
||||||
interface Buffer<T> {
|
interface Buffer<T> {
|
||||||
|
|
||||||
@ -69,12 +78,24 @@ interface Buffer<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a sequence that returns all elements from this [Buffer].
|
||||||
|
*/
|
||||||
fun <T> Buffer<T>.asSequence(): Sequence<T> = Sequence(::iterator)
|
fun <T> Buffer<T>.asSequence(): Sequence<T> = Sequence(::iterator)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an iterable that returns all elements from this [Buffer].
|
||||||
|
*/
|
||||||
fun <T> Buffer<T>.asIterable(): Iterable<T> = Iterable(::iterator)
|
fun <T> Buffer<T>.asIterable(): Iterable<T> = Iterable(::iterator)
|
||||||
|
|
||||||
val Buffer<*>.indices: IntRange get() = IntRange(0, size - 1)
|
/**
|
||||||
|
* Returns an [IntRange] of the valid indices for this [Buffer].
|
||||||
|
*/
|
||||||
|
val Buffer<*>.indices: IntRange get() = 0 until size
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A generic mutable random-access structure for both primitives and objects.
|
||||||
|
*/
|
||||||
interface MutableBuffer<T> : Buffer<T> {
|
interface MutableBuffer<T> : Buffer<T> {
|
||||||
operator fun set(index: Int, value: T)
|
operator fun set(index: Int, value: T)
|
||||||
|
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
package scientifik.kmath.structures
|
package scientifik.kmath.structures
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specialized [MutableBuffer] implementation over [IntArray].
|
||||||
|
*
|
||||||
|
* @property array the underlying array.
|
||||||
|
*/
|
||||||
inline class IntBuffer(val array: IntArray) : MutableBuffer<Int> {
|
inline class IntBuffer(val array: IntArray) : MutableBuffer<Int> {
|
||||||
override val size: Int get() = array.size
|
override val size: Int get() = array.size
|
||||||
|
|
||||||
@ -16,4 +21,10 @@ inline class IntBuffer(val array: IntArray) : MutableBuffer<Int> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns [IntBuffer] over this array.
|
||||||
|
*
|
||||||
|
* @receiver the array.
|
||||||
|
* @return the new buffer.
|
||||||
|
*/
|
||||||
fun IntArray.asBuffer(): IntBuffer = IntBuffer(this)
|
fun IntArray.asBuffer(): IntBuffer = IntBuffer(this)
|
||||||
|
@ -5,7 +5,7 @@ import java.math.BigInteger
|
|||||||
import java.math.MathContext
|
import java.math.MathContext
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A field wrapper for Java [BigInteger]
|
* A field over [BigInteger].
|
||||||
*/
|
*/
|
||||||
object JBigIntegerField : Field<BigInteger> {
|
object JBigIntegerField : Field<BigInteger> {
|
||||||
override val zero: BigInteger
|
override val zero: BigInteger
|
||||||
@ -24,7 +24,9 @@ object JBigIntegerField : Field<BigInteger> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Field wrapper for Java [BigDecimal]
|
* An abstract field over [BigDecimal].
|
||||||
|
*
|
||||||
|
* @property mathContext the [MathContext] to use.
|
||||||
*/
|
*/
|
||||||
abstract class JBigDecimalFieldBase internal constructor(val mathContext: MathContext = MathContext.DECIMAL64) :
|
abstract class JBigDecimalFieldBase internal constructor(val mathContext: MathContext = MathContext.DECIMAL64) :
|
||||||
Field<BigDecimal>,
|
Field<BigDecimal>,
|
||||||
@ -50,6 +52,9 @@ abstract class JBigDecimalFieldBase internal constructor(val mathContext: MathCo
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A field over [BigDecimal].
|
||||||
|
*/
|
||||||
class JBigDecimalField(mathContext: MathContext = MathContext.DECIMAL64) : JBigDecimalFieldBase(mathContext) {
|
class JBigDecimalField(mathContext: MathContext = MathContext.DECIMAL64) : JBigDecimalFieldBase(mathContext) {
|
||||||
companion object : JBigDecimalFieldBase()
|
companion object : JBigDecimalFieldBase()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user