All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.space.kscience.kmath.operations.algebraExtensions.kt Maven / Gradle / Ivy

package space.kscience.kmath.operations

/**
 * Returns the sum of all elements in the iterable in this [Space].
 *
 * @receiver the algebra that provides addition.
 * @param data the iterable to sum up.
 * @return the sum.
 */
public fun  Space.sum(data: Iterable): 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 sequence to sum up.
 * @return the sum.
 */
public fun  Space.sum(data: Sequence): T = data.fold(zero) { left, right -> add(left, right) }

/**
 * Returns an average value of elements in the iterable in this [Space].
 *
 * @receiver the algebra that provides addition and division.
 * @param data the iterable to find average.
 * @return the average value.
 * @author Iaroslav Postovalov
 */
public fun  Space.average(data: Iterable): T = sum(data) / data.count()

/**
 * Returns an average value of elements in the sequence in this [Space].
 *
 * @receiver the algebra that provides addition and division.
 * @param data the sequence to find average.
 * @return the average value.
 * @author Iaroslav Postovalov
 */
public fun  Space.average(data: Sequence): T = sum(data) / data.count()

/**
 * Absolute of the comparable [value]
 */
public fun > Space.abs(value: T): T = if (value > zero) value else -value

/**
 * 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.
 */
public fun  Iterable.sumWith(space: Space): T = space.sum(this)

/**
 * Returns the sum of all elements in the sequence in provided space.
 *
 * @receiver the collection to sum up.
 * @param space the algebra that provides addition.
 * @return the sum.
 */
public fun  Sequence.sumWith(space: Space): T = space.sum(this)

/**
 * Returns an average value of elements in the iterable in this [Space].
 *
 * @receiver the iterable to find average.
 * @param space the algebra that provides addition and division.
 * @return the average value.
 * @author Iaroslav Postovalov
 */
public fun  Iterable.averageWith(space: Space): T = space.average(this)

/**
 * Returns an average value of elements in the sequence in this [Space].
 *
 * @receiver the sequence to find average.
 * @param space the algebra that provides addition and division.
 * @return the average value.
 * @author Iaroslav Postovalov
 */
public fun  Sequence.averageWith(space: Space): T = space.average(this)

//TODO optimized power operation

/**
 * 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.
 */
public fun  Ring.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
    repeat(power - 1) { res *= arg }
    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.
 * @author Iaroslav Postovalov
 */
public fun  Field.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).power(arg, -power)
    return (this as Ring).power(arg, power)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy