Provide dynamic operations currying for Algebra<T> instead of eager calls and add JS code generation support #162
@ -7,10 +7,10 @@ import kscience.kmath.operations.*
|
|||||||
*/
|
*/
|
||||||
public object MstAlgebra : NumericAlgebra<MST> {
|
public object MstAlgebra : NumericAlgebra<MST> {
|
||||||
public override fun number(value: Number): MST.Numeric = MST.Numeric(value)
|
public override fun number(value: Number): MST.Numeric = MST.Numeric(value)
|
||||||
|
|
||||||
public override fun symbol(value: String): MST.Symbolic = MST.Symbolic(value)
|
public override fun symbol(value: String): MST.Symbolic = MST.Symbolic(value)
|
||||||
|
|
||||||
public override fun unaryOperation(operation: String): (arg: MST) -> MST.Unary = { arg -> MST.Unary(operation, arg) }
|
public override fun unaryOperation(operation: String): (arg: MST) -> MST.Unary =
|
||||||
|
{ arg -> MST.Unary(operation, arg) }
|
||||||
|
|
||||||
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST.Binary =
|
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST.Binary =
|
||||||
{ left, right -> MST.Binary(operation, left, right) }
|
{ left, right -> MST.Binary(operation, left, right) }
|
||||||
@ -25,92 +25,95 @@ public object MstSpace : Space<MST>, NumericAlgebra<MST> {
|
|||||||
public override fun number(value: Number): MST.Numeric = MstAlgebra.number(value)
|
public override fun number(value: Number): MST.Numeric = MstAlgebra.number(value)
|
||||||
public override fun symbol(value: String): MST.Symbolic = MstAlgebra.symbol(value)
|
public override fun symbol(value: String): MST.Symbolic = MstAlgebra.symbol(value)
|
||||||
override fun add(a: MST, b: MST): MST.Binary = binaryOperation(SpaceOperations.PLUS_OPERATION)(a, b)
|
override fun add(a: MST, b: MST): MST.Binary = binaryOperation(SpaceOperations.PLUS_OPERATION)(a, b)
|
||||||
override fun multiply(a: MST, k: Number): MST = binaryOperation(RingOperations.TIMES_OPERATION)(a, number(k))
|
override fun multiply(a: MST, k: Number): MST.Binary = binaryOperation(RingOperations.TIMES_OPERATION)(a, number(k))
|
||||||
|
|
||||||
override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST =
|
override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST.Binary =
|
||||||
MstAlgebra.binaryOperation(operation)
|
MstAlgebra.binaryOperation(operation)
|
||||||
|
|
||||||
override fun unaryOperation(operation: String): (arg: MST) -> MST = MstAlgebra.unaryOperation(operation)
|
override fun unaryOperation(operation: String): (arg: MST) -> MST.Unary = MstAlgebra.unaryOperation(operation)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [Ring] over [MST] nodes.
|
* [Ring] over [MST] nodes.
|
||||||
*/
|
*/
|
||||||
public object MstRing : Ring<MST>, NumericAlgebra<MST> {
|
public object MstRing : Ring<MST>, NumericAlgebra<MST> {
|
||||||
override val zero: MST
|
override val zero: MST.Numeric
|
||||||
get() = MstSpace.zero
|
get() = MstSpace.zero
|
||||||
override val one: MST = number(1.0)
|
|
||||||
|
|
||||||
public override fun number(value: Number): MST = MstSpace.number(value)
|
override val one: MST.Numeric by lazy { number(1.0) }
|
||||||
public override fun symbol(value: String): MST = MstSpace.symbol(value)
|
|
||||||
public override fun add(a: MST, b: MST): MST = MstSpace.add(a, b)
|
|
||||||
public override fun multiply(a: MST, k: Number): MST = MstSpace.multiply(a, k)
|
|
||||||
public override fun multiply(a: MST, b: MST): MST = binaryOperation(RingOperations.TIMES_OPERATION)(a, b)
|
|
||||||
|
|
||||||
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST =
|
public override fun number(value: Number): MST.Numeric = MstSpace.number(value)
|
||||||
|
public override fun symbol(value: String): MST.Symbolic = MstSpace.symbol(value)
|
||||||
|
public override fun add(a: MST, b: MST): MST.Binary = MstSpace.add(a, b)
|
||||||
|
public override fun multiply(a: MST, k: Number): MST.Binary = MstSpace.multiply(a, k)
|
||||||
|
public override fun multiply(a: MST, b: MST): MST.Binary = binaryOperation(RingOperations.TIMES_OPERATION)(a, b)
|
||||||
|
|
||||||
|
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST.Binary =
|
||||||
MstSpace.binaryOperation(operation)
|
MstSpace.binaryOperation(operation)
|
||||||
|
|
||||||
public override fun unaryOperation(operation: String): (arg: MST) -> MST = MstAlgebra.unaryOperation(operation)
|
public override fun unaryOperation(operation: String): (arg: MST) -> MST.Unary =
|
||||||
|
MstAlgebra.unaryOperation(operation)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [Field] over [MST] nodes.
|
* [Field] over [MST] nodes.
|
||||||
*/
|
*/
|
||||||
public object MstField : Field<MST> {
|
public object MstField : Field<MST> {
|
||||||
public override val zero: MST
|
public override val zero: MST.Numeric
|
||||||
get() = MstRing.zero
|
get() = MstRing.zero
|
||||||
|
|
||||||
public override val one: MST
|
public override val one: MST.Numeric
|
||||||
get() = MstRing.one
|
get() = MstRing.one
|
||||||
|
|
||||||
public override fun symbol(value: String): MST = MstRing.symbol(value)
|
public override fun symbol(value: String): MST.Symbolic = MstRing.symbol(value)
|
||||||
public override fun number(value: Number): MST = MstRing.number(value)
|
public override fun number(value: Number): MST.Numeric = MstRing.number(value)
|
||||||
public override fun add(a: MST, b: MST): MST = MstRing.add(a, b)
|
public override fun add(a: MST, b: MST): MST.Binary = MstRing.add(a, b)
|
||||||
public override fun multiply(a: MST, k: Number): MST = MstRing.multiply(a, k)
|
public override fun multiply(a: MST, k: Number): MST.Binary = MstRing.multiply(a, k)
|
||||||
public override fun multiply(a: MST, b: MST): MST = MstRing.multiply(a, b)
|
public override fun multiply(a: MST, b: MST): MST.Binary = MstRing.multiply(a, b)
|
||||||
public override fun divide(a: MST, b: MST): MST = binaryOperation(FieldOperations.DIV_OPERATION)(a, b)
|
public override fun divide(a: MST, b: MST): MST.Binary = binaryOperation(FieldOperations.DIV_OPERATION)(a, b)
|
||||||
|
|
||||||
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST =
|
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST.Binary =
|
||||||
MstRing.binaryOperation(operation)
|
MstRing.binaryOperation(operation)
|
||||||
|
|
||||||
public override fun unaryOperation(operation: String): (arg: MST) -> MST = MstRing.unaryOperation(operation)
|
public override fun unaryOperation(operation: String): (arg: MST) -> MST.Unary = MstRing.unaryOperation(operation)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [ExtendedField] over [MST] nodes.
|
* [ExtendedField] over [MST] nodes.
|
||||||
*/
|
*/
|
||||||
public object MstExtendedField : ExtendedField<MST> {
|
public object MstExtendedField : ExtendedField<MST> {
|
||||||
public override val zero: MST
|
public override val zero: MST.Numeric
|
||||||
get() = MstField.zero
|
get() = MstField.zero
|
||||||
|
|
||||||
public override val one: MST
|
public override val one: MST.Numeric
|
||||||
get() = MstField.one
|
get() = MstField.one
|
||||||
|
|
||||||
public override fun symbol(value: String): MST = MstField.symbol(value)
|
public override fun symbol(value: String): MST = MstField.symbol(value)
|
||||||
public override fun sin(arg: MST): MST = unaryOperation(TrigonometricOperations.SIN_OPERATION)(arg)
|
public override fun sin(arg: MST): MST.Unary = unaryOperation(TrigonometricOperations.SIN_OPERATION)(arg)
|
||||||
public override fun cos(arg: MST): MST = unaryOperation(TrigonometricOperations.COS_OPERATION)(arg)
|
public override fun cos(arg: MST): MST.Unary = unaryOperation(TrigonometricOperations.COS_OPERATION)(arg)
|
||||||
public override fun tan(arg: MST): MST = unaryOperation(TrigonometricOperations.TAN_OPERATION)(arg)
|
public override fun tan(arg: MST): MST.Unary = unaryOperation(TrigonometricOperations.TAN_OPERATION)(arg)
|
||||||
public override fun asin(arg: MST): MST = unaryOperation(TrigonometricOperations.ASIN_OPERATION)(arg)
|
public override fun asin(arg: MST): MST.Unary = unaryOperation(TrigonometricOperations.ASIN_OPERATION)(arg)
|
||||||
public override fun acos(arg: MST): MST = unaryOperation(TrigonometricOperations.ACOS_OPERATION)(arg)
|
public override fun acos(arg: MST): MST.Unary = unaryOperation(TrigonometricOperations.ACOS_OPERATION)(arg)
|
||||||
public override fun atan(arg: MST): MST = unaryOperation(TrigonometricOperations.ATAN_OPERATION)(arg)
|
public override fun atan(arg: MST): MST.Unary = unaryOperation(TrigonometricOperations.ATAN_OPERATION)(arg)
|
||||||
public override fun sinh(arg: MST): MST = unaryOperation(HyperbolicOperations.SINH_OPERATION)(arg)
|
public override fun sinh(arg: MST): MST.Unary = unaryOperation(HyperbolicOperations.SINH_OPERATION)(arg)
|
||||||
public override fun cosh(arg: MST): MST = unaryOperation(HyperbolicOperations.COSH_OPERATION)(arg)
|
public override fun cosh(arg: MST): MST.Unary = unaryOperation(HyperbolicOperations.COSH_OPERATION)(arg)
|
||||||
public override fun tanh(arg: MST): MST = unaryOperation(HyperbolicOperations.TANH_OPERATION)(arg)
|
public override fun tanh(arg: MST): MST.Unary = unaryOperation(HyperbolicOperations.TANH_OPERATION)(arg)
|
||||||
public override fun asinh(arg: MST): MST = unaryOperation(HyperbolicOperations.ASINH_OPERATION)(arg)
|
public override fun asinh(arg: MST): MST.Unary = unaryOperation(HyperbolicOperations.ASINH_OPERATION)(arg)
|
||||||
public override fun acosh(arg: MST): MST = unaryOperation(HyperbolicOperations.ACOSH_OPERATION)(arg)
|
public override fun acosh(arg: MST): MST.Unary = unaryOperation(HyperbolicOperations.ACOSH_OPERATION)(arg)
|
||||||
public override fun atanh(arg: MST): MST = unaryOperation(HyperbolicOperations.ATANH_OPERATION)(arg)
|
public override fun atanh(arg: MST): MST.Unary = unaryOperation(HyperbolicOperations.ATANH_OPERATION)(arg)
|
||||||
public override fun add(a: MST, b: MST): MST = MstField.add(a, b)
|
public override fun add(a: MST, b: MST): MST.Binary = MstField.add(a, b)
|
||||||
public override fun multiply(a: MST, k: Number): MST = MstField.multiply(a, k)
|
public override fun multiply(a: MST, k: Number): MST.Binary = MstField.multiply(a, k)
|
||||||
public override fun multiply(a: MST, b: MST): MST = MstField.multiply(a, b)
|
public override fun multiply(a: MST, b: MST): MST.Binary = MstField.multiply(a, b)
|
||||||
public override fun divide(a: MST, b: MST): MST = MstField.divide(a, b)
|
public override fun divide(a: MST, b: MST): MST.Binary = MstField.divide(a, b)
|
||||||
public override fun power(arg: MST, pow: Number): MST = binaryOperation(PowerOperations.POW_OPERATION)(arg, number(pow))
|
|
||||||
public override fun exp(arg: MST): MST = unaryOperation(ExponentialOperations.EXP_OPERATION)(arg)
|
|
||||||
public override fun ln(arg: MST): MST = unaryOperation(ExponentialOperations.LN_OPERATION)(arg)
|
|
||||||
|
|
||||||
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST =
|
public override fun power(arg: MST, pow: Number): MST.Binary =
|
||||||
|
binaryOperation(PowerOperations.POW_OPERATION)(arg, number(pow))
|
||||||
|
|
||||||
|
public override fun exp(arg: MST): MST.Unary = unaryOperation(ExponentialOperations.EXP_OPERATION)(arg)
|
||||||
|
public override fun ln(arg: MST): MST.Unary = unaryOperation(ExponentialOperations.LN_OPERATION)(arg)
|
||||||
|
|
||||||
|
public override fun binaryOperation(operation: String): (left: MST, right: MST) -> MST.Binary =
|
||||||
MstField.binaryOperation(operation)
|
MstField.binaryOperation(operation)
|
||||||
|
|
||||||
public override fun unaryOperation(operation: String): (arg: MST) -> MST = MstField.unaryOperation(operation)
|
public override fun unaryOperation(operation: String): (arg: MST) -> MST.Unary = MstField.unaryOperation(operation)
|
||||||
override fun unaryOperation(operation: String, arg: MST): MST.Unary =
|
|
||||||
MST.Unary(operation, arg)
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user