Improve ASM and ESTree tests quality

This commit is contained in:
Iaroslav Postovalov 2020-12-22 18:17:24 +07:00
parent 50b62f8a3b
commit 1a5efd0a17
No known key found for this signature in database
GPG Key ID: 46E15E4A31B3BCD7
7 changed files with 73 additions and 69 deletions

View File

@ -1,18 +1,18 @@
package kscience.kmath.estree
import kscience.kmath.ast.mstInField
import kscience.kmath.ast.mstInRing
import kscience.kmath.ast.mstInSpace
import kscience.kmath.ast.*
import kscience.kmath.expressions.invoke
import kscience.kmath.operations.ByteRing
import kscience.kmath.operations.ComplexField
import kscience.kmath.operations.RealField
import kscience.kmath.operations.toComplex
import kotlin.test.Test
import kotlin.test.assertEquals
internal class TestESTreeAlgebras {
internal class TestESTreeConsistencyWithInterpreter {
@Test
fun space() {
val res1 = ByteRing.mstInSpace {
fun mstSpace() {
val res1 = MstSpace.mstInSpace {
binaryOperation("+")(
unaryOperation("+")(
number(3.toByte()) - (number(2.toByte()) + (multiply(
@ -23,9 +23,9 @@ internal class TestESTreeAlgebras {
number(1)
) + symbol("x") + zero
}("x" to 2.toByte())
}("x" to MST.Numeric(2))
val res2 = ByteRing.mstInSpace {
val res2 = MstSpace.mstInSpace {
binaryOperation("+")(
unaryOperation("+")(
number(3.toByte()) - (number(2.toByte()) + (multiply(
@ -36,13 +36,13 @@ internal class TestESTreeAlgebras {
number(1)
) + symbol("x") + zero
}.compile()("x" to 2.toByte())
}.compile()("x" to MST.Numeric(2))
assertEquals(res1, res2)
}
@Test
fun ring() {
fun byteRing() {
val res1 = ByteRing.mstInRing {
binaryOperation("+")(
unaryOperation("+")(
@ -72,7 +72,7 @@ internal class TestESTreeAlgebras {
}
@Test
fun field() {
fun realField() {
val res1 = RealField.mstInField {
+(3 - 2 + 2 * number(1) + 1.0) + binaryOperation("+")(
(3.0 - (symbol("x") + (multiply(add(number(1.0), number(1.0)), 2) + 1.0))) * 3 - 1.0
@ -91,4 +91,25 @@ internal class TestESTreeAlgebras {
assertEquals(res1, res2)
}
@Test
fun complexField() {
val res1 = ComplexField.mstInField {
+(3 - 2 + 2 * number(1) + 1.0) + binaryOperation("+")(
(3.0 - (symbol("x") + (multiply(add(number(1.0), number(1.0)), 2) + 1.0))) * 3 - 1.0
+ number(1),
number(1) / 2 + number(2.0) * one
) + zero
}("x" to 2.0.toComplex())
val res2 = ComplexField.mstInField {
+(3 - 2 + 2 * number(1) + 1.0) + binaryOperation("+")(
(3.0 - (symbol("x") + (multiply(add(number(1.0), number(1.0)), 2) + 1.0))) * 3 - 1.0
+ number(1),
number(1) / 2 + number(2.0) * one
) + zero
}.compile()("x" to 2.0.toComplex())
assertEquals(res1, res2)
}
}

View File

@ -3,17 +3,13 @@ package kscience.kmath.estree
import kscience.kmath.ast.mstInExtendedField
import kscience.kmath.ast.mstInField
import kscience.kmath.ast.mstInSpace
import kscience.kmath.expressions.Expression
import kscience.kmath.expressions.StringSymbol
import kscience.kmath.expressions.invoke
import kscience.kmath.operations.RealField
import kotlin.math.pow
import kotlin.random.Random
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.time.measureTime
internal class TestESTreeExpressions {
internal class TestESTreeOperationsSupport {
@Test
fun testUnaryOperationInvocation() {
val expression = RealField.mstInSpace { -symbol("x") }.compile()
@ -36,21 +32,10 @@ internal class TestESTreeExpressions {
@Test
fun testMultipleCalls() {
val e1 =
RealField.mstInExtendedField { sin(symbol("x")).pow(4) - 6 * symbol("x") / tanh(symbol("x")) }.compile()
val e2 = Expression<Double> { a ->
val x = a.getValue(StringSymbol("x"))
kotlin.math.sin(x).pow(4) - 6 * x / kotlin.math.tanh(x)
}
var r = Random(0)
val e = RealField.mstInExtendedField { sin(symbol("x")).pow(4) - 6 * symbol("x") / tanh(symbol("x")) }.compile()
val r = Random(0)
var s = 0.0
measureTime { repeat(1000000) { s += e1("x" to r.nextDouble()) } }.also(::println)
println(s)
s = 0.0
r = Random(0)
measureTime { repeat(1000000) { s += e2("x" to r.nextDouble()) } }.also(::println)
repeat(1000000) { s += e("x" to r.nextDouble()) }
println(s)
}
}

View File

@ -9,13 +9,13 @@ import kotlin.test.assertFailsWith
internal class TestESTreeVariables {
@Test
fun testVariableWithoutDefault() {
fun testVariable() {
val expr = ByteRing.mstInRing { symbol("x") }.compile()
assertEquals(1.toByte(), expr("x" to 1.toByte()))
}
@Test
fun testVariableWithoutDefaultFails() {
fun testUndefinedVariableFails() {
val expr = ByteRing.mstInRing { symbol("x") }.compile()
assertFailsWith<NoSuchElementException> { expr() }
}

View File

@ -1,18 +1,18 @@
package kscience.kmath.asm
import kscience.kmath.ast.mstInField
import kscience.kmath.ast.mstInRing
import kscience.kmath.ast.mstInSpace
import kscience.kmath.ast.*
import kscience.kmath.expressions.invoke
import kscience.kmath.operations.ByteRing
import kscience.kmath.operations.ComplexField
import kscience.kmath.operations.RealField
import kscience.kmath.operations.toComplex
import kotlin.test.Test
import kotlin.test.assertEquals
internal class TestAsmAlgebras {
internal class TestAsmConsistencyWithInterpreter {
@Test
fun space() {
val res1 = ByteRing.mstInSpace {
fun mstSpace() {
val res1 = MstSpace.mstInSpace {
binaryOperation("+")(
unaryOperation("+")(
number(3.toByte()) - (number(2.toByte()) + (multiply(
@ -23,9 +23,9 @@ internal class TestAsmAlgebras {
number(1)
) + symbol("x") + zero
}("x" to 2.toByte())
}("x" to MST.Numeric(2))
val res2 = ByteRing.mstInSpace {
val res2 = MstSpace.mstInSpace {
binaryOperation("+")(
unaryOperation("+")(
number(3.toByte()) - (number(2.toByte()) + (multiply(
@ -36,13 +36,13 @@ internal class TestAsmAlgebras {
number(1)
) + symbol("x") + zero
}.compile()("x" to 2.toByte())
}.compile()("x" to MST.Numeric(2))
assertEquals(res1, res2)
}
@Test
fun ring() {
fun byteRing() {
val res1 = ByteRing.mstInRing {
binaryOperation("+")(
unaryOperation("+")(
@ -72,7 +72,7 @@ internal class TestAsmAlgebras {
}
@Test
fun field() {
fun realField() {
val res1 = RealField.mstInField {
+(3 - 2 + 2 * number(1) + 1.0) + binaryOperation("+")(
(3.0 - (symbol("x") + (multiply(add(number(1.0), number(1.0)), 2) + 1.0))) * 3 - 1.0
@ -91,4 +91,25 @@ internal class TestAsmAlgebras {
assertEquals(res1, res2)
}
@Test
fun complexField() {
val res1 = ComplexField.mstInField {
+(3 - 2 + 2 * number(1) + 1.0) + binaryOperation("+")(
(3.0 - (symbol("x") + (multiply(add(number(1.0), number(1.0)), 2) + 1.0))) * 3 - 1.0
+ number(1),
number(1) / 2 + number(2.0) * one
) + zero
}("x" to 2.0.toComplex())
val res2 = ComplexField.mstInField {
+(3 - 2 + 2 * number(1) + 1.0) + binaryOperation("+")(
(3.0 - (symbol("x") + (multiply(add(number(1.0), number(1.0)), 2) + 1.0))) * 3 - 1.0
+ number(1),
number(1) / 2 + number(2.0) * one
) + zero
}.compile()("x" to 2.0.toComplex())
assertEquals(res1, res2)
}
}

View File

@ -9,7 +9,7 @@ import kotlin.random.Random
import kotlin.test.Test
import kotlin.test.assertEquals
internal class TestAsmExpressions {
internal class TestAsmOperationsSupport {
@Test
fun testUnaryOperationInvocation() {
val expression = RealField.mstInSpace { -symbol("x") }.compile()

View File

@ -9,13 +9,13 @@ import kotlin.test.assertFailsWith
internal class TestAsmVariables {
@Test
fun testVariableWithoutDefault() {
fun testVariable() {
val expr = ByteRing.mstInRing { symbol("x") }.compile()
assertEquals(1.toByte(), expr("x" to 1.toByte()))
}
@Test
fun testVariableWithoutDefaultFails() {
fun testUndefinedVariableFails() {
val expr = ByteRing.mstInRing { symbol("x") }.compile()
assertFailsWith<NoSuchElementException> { expr() }
}

View File

@ -1,23 +0,0 @@
package kscience.kmath.ast
import kscience.kmath.asm.compile
import kscience.kmath.asm.expression
import kscience.kmath.expressions.invoke
import kscience.kmath.operations.Complex
import kscience.kmath.operations.ComplexField
import kotlin.test.Test
import kotlin.test.assertEquals
internal class AsmTest {
@Test
fun `compile MST`() {
val res = ComplexField.expression("2+2*(2+2)".parseMath())()
assertEquals(Complex(10.0, 0.0), res)
}
@Test
fun `compile MSTExpression`() {
val res = ComplexField.mstInField { number(2) + number(2) * (number(2) + number(2)) }.compile()()
assertEquals(Complex(10.0, 0.0), res)
}
}