Add more fine-grained converters from MST to SVar and SConst

This commit is contained in:
Iaroslav Postovalov 2020-10-12 21:06:15 +07:00
parent 84f7535fdd
commit 5de9d69237
No known key found for this signature in database
GPG Key ID: 46E15E4A31B3BCD7

View File

@ -8,8 +8,8 @@ import kscience.kmath.operations.*
/** /**
* Maps [SFun] objects to [MST]. Some unsupported operations like [Derivative] are bound and converted then. * Maps [SFun] objects to [MST]. Some unsupported operations like [Derivative] are bound and converted then.
* *
* @receiver a scalar function. * @receiver the scalar function.
* @return the [MST]. * @return a node.
*/ */
public fun <X : SFun<X>> SFun<X>.mst(): MST = MstExtendedField { public fun <X : SFun<X>> SFun<X>.mst(): MST = MstExtendedField {
when (this@mst) { when (this@mst) {
@ -30,16 +30,33 @@ public fun <X : SFun<X>> SFun<X>.mst(): MST = MstExtendedField {
} }
} }
/**
* Maps [MST.Numeric] to [SConst] directly.
*
* @receiver the node.
* @return a new constant.
*/
public fun <X : SFun<X>> MST.Numeric.sconst(): SConst<X> = SConst(value)
/**
* Maps [MST.Symbolic] to [SVar] directly.
*
* @receiver the node.
* @param proto the prototype instance.
* @return a new variable.
*/
public fun <X : SFun<X>> MST.Symbolic.svar(proto: X): SVar<X> = SVar(proto, value)
/** /**
* Maps [MST] objects to [SFun]. Unsupported operations throw [IllegalStateException]. * Maps [MST] objects to [SFun]. Unsupported operations throw [IllegalStateException].
* *
* @receiver an [MST]. * @receiver the node.
* @return the scalar function. * @param proto the prototype instance.
* @return a scalar function.
*/ */
public fun <X : SFun<X>> MST.sfun(proto: X): SFun<X> { public fun <X : SFun<X>> MST.sfun(proto: X): SFun<X> = when (this) {
return when (this) { is MST.Numeric -> sconst()
is MST.Numeric -> SConst(value) is MST.Symbolic -> svar(proto)
is MST.Symbolic -> SVar(proto, value)
is MST.Unary -> when (operation) { is MST.Unary -> when (operation) {
SpaceOperations.PLUS_OPERATION -> value.sfun(proto) SpaceOperations.PLUS_OPERATION -> value.sfun(proto)
@ -61,5 +78,4 @@ public fun <X : SFun<X>> MST.sfun(proto: X): SFun<X> {
PowerOperations.POW_OPERATION -> Power(left.sfun(proto), SConst((right as MST.Numeric).value)) PowerOperations.POW_OPERATION -> Power(left.sfun(proto), SConst((right as MST.Numeric).value))
else -> error("Binary operation $operation not defined in $this") else -> error("Binary operation $operation not defined in $this")
} }
}
} }