ASM Bytecode Generation to unwrap Expressions of adv-expr API #94
@ -4,6 +4,6 @@ plugins {
|
|||||||
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(path = ":kmath-core"))
|
api(project(path = ":kmath-core"))
|
||||||
api("org.ow2.asm:asm:8.0.1")
|
implementation("org.ow2.asm:asm:8.0.1")
|
||||||
Probably should be implementation Probably should be implementation
Probably should be implementation Probably should be implementation
|
|||||||
api("org.ow2.asm:asm-commons:8.0.1")
|
implementation("org.ow2.asm:asm-commons:8.0.1")
|
||||||
Probably should be implementation Probably should be implementation
Probably should be implementation Probably should be implementation
|
|||||||
}
|
}
|
||||||
|
|||||||
Probably should be implementation Probably should be implementation
Probably should be implementation Probably should be implementation
|
@ -8,11 +8,30 @@ import scientifik.kmath.operations.Algebra
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
import scientifik.kmath.operations.Field
|
import scientifik.kmath.operations.Field
|
||||||
import scientifik.kmath.operations.Space
|
import scientifik.kmath.operations.Space
|
||||||
|
|
||||||
abstract class AsmCompiled<T>(@JvmField val algebra: Algebra<T>, @JvmField val constants: MutableList<out Any>) {
|
abstract class AsmCompiledExpression<T> internal constructor(
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
abstract fun evaluate(arguments: Map<String, T>): T
|
@JvmField val algebra: Algebra<T>,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
@JvmField val constants: MutableList<out Any>
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
) : Expression<T> {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
abstract override fun invoke(arguments: Map<String, T>): T
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T>, private val className: String) {
|
internal fun buildName(expression: AsmExpression<*>, collision: Int = 0): String {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
val name = "scientifik.kmath.expressions.generated.AsmCompiledExpression_${expression.hashCode()}_$collision"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
try {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
Class.forName(name)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
} catch (ignored: ClassNotFoundException) {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
return name
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
}
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
return buildName(expression, collision + 1)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
}
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
class AsmGenerationContext<T>(
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
classOfT: Class<*>,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
private val algebra: Algebra<T>,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
private val className: String
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
) {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private class ClassLoader(parent: java.lang.ClassLoader) : java.lang.ClassLoader(parent) {
|
private class ClassLoader(parent: java.lang.ClassLoader) : java.lang.ClassLoader(parent) {
|
||||||
internal fun defineClass(name: String?, b: ByteArray): Class<*> = defineClass(name, b, 0, b.size)
|
internal fun defineClass(name: String?, b: ByteArray): Class<*> = defineClass(name, b, 0, b.size)
|
||||||
}
|
}
|
||||||
@ -26,30 +45,23 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
private val T_CLASS: String = classOfT.name.replace('.', '/')
|
private val T_CLASS: String = classOfT.name.replace('.', '/')
|
||||||
|
|
||||||
private val slashesClassName: String = className.replace(oldChar = '.', newChar = '/')
|
private val slashesClassName: String = className.replace(oldChar = '.', newChar = '/')
|
||||||
private val evaluateThisVar: Int = 0
|
private val invokeThisVar: Int = 0
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private val evaluateArgumentsVar: Int = 1
|
private val invokeArgumentsVar: Int = 1
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private var maxStack: Int = 0
|
private var maxStack: Int = 0
|
||||||
private lateinit var constants: MutableList<Any>
|
private val constants: MutableList<Any> = mutableListOf()
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private lateinit var asmCompiledClassWriter: ClassWriter
|
private val asmCompiledClassWriter: ClassWriter = ClassWriter(0)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private lateinit var evaluateMethodVisitor: MethodVisitor
|
private val invokeMethodVisitor: MethodVisitor
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private lateinit var evaluateL0: Label
|
private val invokeL0: Label
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private lateinit var evaluateL1: Label
|
private lateinit var invokeL1: Label
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
private var generatedInstance: AsmCompiledExpression<T>? = null
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
start()
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
fun start() {
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
constants = mutableListOf()
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
asmCompiledClassWriter = ClassWriter(0)
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
maxStack = 0
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
asmCompiledClassWriter.visit(
|
asmCompiledClassWriter.visit(
|
||||||
V1_8,
|
V1_8,
|
||||||
ACC_PUBLIC or ACC_FINAL or ACC_SUPER,
|
ACC_PUBLIC or ACC_FINAL or ACC_SUPER,
|
||||||
slashesClassName,
|
slashesClassName,
|
||||||
"L$ASM_COMPILED_CLASS<L$T_CLASS;>;",
|
"L$ASM_COMPILED_EXPRESSION_CLASS<L$T_CLASS;>;",
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
ASM_COMPILED_CLASS,
|
ASM_COMPILED_EXPRESSION_CLASS,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
arrayOf()
|
arrayOf()
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -66,7 +78,7 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
|
|
||||||
visitMethodInsn(
|
visitMethodInsn(
|
||||||
INVOKESPECIAL,
|
INVOKESPECIAL,
|
||||||
ASM_COMPILED_CLASS,
|
ASM_COMPILED_EXPRESSION_CLASS,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
"<init>",
|
"<init>",
|
||||||
"(L$ALGEBRA_CLASS;L$LIST_CLASS;)V",
|
"(L$ALGEBRA_CLASS;L$LIST_CLASS;)V",
|
||||||
false
|
false
|
||||||
@ -93,45 +105,48 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
visitEnd()
|
visitEnd()
|
||||||
}
|
}
|
||||||
|
|
||||||
evaluateMethodVisitor = visitMethod(
|
invokeMethodVisitor = visitMethod(
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
ACC_PUBLIC or ACC_FINAL,
|
ACC_PUBLIC or ACC_FINAL,
|
||||||
"evaluate",
|
"invoke",
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
"(L$MAP_CLASS;)L$T_CLASS;",
|
"(L$MAP_CLASS;)L$T_CLASS;",
|
||||||
"(L$MAP_CLASS<L$STRING_CLASS;+L$T_CLASS;>;)L$T_CLASS;",
|
"(L$MAP_CLASS<L$STRING_CLASS;+L$T_CLASS;>;)L$T_CLASS;",
|
||||||
null
|
null
|
||||||
)
|
)
|
||||||
|
|
||||||
evaluateMethodVisitor.run {
|
invokeMethodVisitor.run {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitCode()
|
visitCode()
|
||||||
evaluateL0 = Label()
|
invokeL0 = Label()
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitLabel(evaluateL0)
|
visitLabel(invokeL0)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PublishedApi
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun generate(): AsmCompiled<T> {
|
internal fun generate(): AsmCompiledExpression<T> {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
evaluateMethodVisitor.run {
|
generatedInstance?.let { return it }
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
invokeMethodVisitor.run {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitInsn(ARETURN)
|
visitInsn(ARETURN)
|
||||||
evaluateL1 = Label()
|
invokeL1 = Label()
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitLabel(evaluateL1)
|
visitLabel(invokeL1)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
visitLocalVariable(
|
visitLocalVariable(
|
||||||
"this",
|
"this",
|
||||||
"L$slashesClassName;",
|
"L$slashesClassName;",
|
||||||
T_CLASS,
|
T_CLASS,
|
||||||
evaluateL0,
|
invokeL0,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
evaluateL1,
|
invokeL1,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
evaluateThisVar
|
invokeThisVar
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
)
|
)
|
||||||
|
|
||||||
visitLocalVariable(
|
visitLocalVariable(
|
||||||
"arguments",
|
"arguments",
|
||||||
"L$MAP_CLASS;",
|
"L$MAP_CLASS;",
|
||||||
"L$MAP_CLASS<L$STRING_CLASS;+L$T_CLASS;>;",
|
"L$MAP_CLASS<L$STRING_CLASS;+L$T_CLASS;>;",
|
||||||
evaluateL0,
|
invokeL0,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
evaluateL1,
|
invokeL1,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
evaluateArgumentsVar
|
invokeArgumentsVar
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
)
|
)
|
||||||
|
|
||||||
visitMaxs(maxStack + 1, 2)
|
visitMaxs(maxStack + 1, 2)
|
||||||
@ -140,7 +155,7 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
|
|
||||||
asmCompiledClassWriter.visitMethod(
|
asmCompiledClassWriter.visitMethod(
|
||||||
ACC_PUBLIC or ACC_FINAL or ACC_BRIDGE or ACC_SYNTHETIC,
|
ACC_PUBLIC or ACC_FINAL or ACC_BRIDGE or ACC_SYNTHETIC,
|
||||||
"evaluate",
|
"invoke",
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
"(L$MAP_CLASS;)L$OBJECT_CLASS;",
|
"(L$MAP_CLASS;)L$OBJECT_CLASS;",
|
||||||
null,
|
null,
|
||||||
null
|
null
|
||||||
@ -151,7 +166,7 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
visitLabel(l0)
|
visitLabel(l0)
|
||||||
visitVarInsn(ALOAD, 0)
|
visitVarInsn(ALOAD, 0)
|
||||||
visitVarInsn(ALOAD, 1)
|
visitVarInsn(ALOAD, 1)
|
||||||
visitMethodInsn(INVOKEVIRTUAL, slashesClassName, "evaluate", "(L$MAP_CLASS;)L$T_CLASS;", false)
|
visitMethodInsn(INVOKEVIRTUAL, slashesClassName, "invoke", "(L$MAP_CLASS;)L$T_CLASS;", false)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitInsn(ARETURN)
|
visitInsn(ARETURN)
|
||||||
val l1 = Label()
|
val l1 = Label()
|
||||||
visitLabel(l1)
|
visitLabel(l1)
|
||||||
@ -171,31 +186,34 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
|
|
||||||
asmCompiledClassWriter.visitEnd()
|
asmCompiledClassWriter.visitEnd()
|
||||||
|
|
||||||
return classLoader
|
val new = classLoader
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
.defineClass(className, asmCompiledClassWriter.toByteArray())
|
.defineClass(className, asmCompiledClassWriter.toByteArray())
|
||||||
.constructors
|
.constructors
|
||||||
.first()
|
.first()
|
||||||
.newInstance(algebra, constants) as AsmCompiled<T>
|
.newInstance(algebra, constants) as AsmCompiledExpression<T>
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
generatedInstance = new
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
return new
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun visitLoadFromConstants(value: T) = visitLoadAnyFromConstants(value as Any, T_CLASS)
|
internal fun visitLoadFromConstants(value: T) = visitLoadAnyFromConstants(value as Any, T_CLASS)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
fun visitLoadAnyFromConstants(value: Any, type: String) {
|
private fun visitLoadAnyFromConstants(value: Any, type: String) {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
val idx = if (value in constants) constants.indexOf(value) else constants.apply { add(value) }.lastIndex
|
val idx = if (value in constants) constants.indexOf(value) else constants.apply { add(value) }.lastIndex
|
||||||
maxStack++
|
maxStack++
|
||||||
|
|
||||||
evaluateMethodVisitor.run {
|
invokeMethodVisitor.run {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitLoadThis()
|
visitLoadThis()
|
||||||
visitFieldInsn(GETFIELD, slashesClassName, "constants", "L$LIST_CLASS;")
|
visitFieldInsn(GETFIELD, slashesClassName, "constants", "L$LIST_CLASS;")
|
||||||
visitLdcOrIConstInsn(idx)
|
visitLdcOrIConstInsn(idx)
|
||||||
visitMethodInsn(INVOKEINTERFACE, LIST_CLASS, "get", "(I)L$OBJECT_CLASS;", true)
|
visitMethodInsn(INVOKEINTERFACE, LIST_CLASS, "get", "(I)L$OBJECT_CLASS;", true)
|
||||||
evaluateMethodVisitor.visitTypeInsn(CHECKCAST, type)
|
invokeMethodVisitor.visitTypeInsn(CHECKCAST, type)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun visitLoadThis(): Unit = evaluateMethodVisitor.visitVarInsn(ALOAD, evaluateThisVar)
|
private fun visitLoadThis(): Unit = invokeMethodVisitor.visitVarInsn(ALOAD, invokeThisVar)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
fun visitNumberConstant(value: Number) {
|
internal fun visitNumberConstant(value: Number) {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
maxStack++
|
maxStack++
|
||||||
val clazz = value.javaClass
|
val clazz = value.javaClass
|
||||||
val c = clazz.name.replace('.', '/')
|
val c = clazz.name.replace('.', '/')
|
||||||
@ -204,22 +222,22 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
|
|
||||||
if (sigLetter != null) {
|
if (sigLetter != null) {
|
||||||
when (value) {
|
when (value) {
|
||||||
is Int -> evaluateMethodVisitor.visitLdcOrIConstInsn(value)
|
is Int -> invokeMethodVisitor.visitLdcOrIConstInsn(value)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
is Double -> evaluateMethodVisitor.visitLdcOrDConstInsn(value)
|
is Double -> invokeMethodVisitor.visitLdcOrDConstInsn(value)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
is Float -> evaluateMethodVisitor.visitLdcOrFConstInsn(value)
|
is Float -> invokeMethodVisitor.visitLdcOrFConstInsn(value)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
else -> evaluateMethodVisitor.visitLdcInsn(value)
|
else -> invokeMethodVisitor.visitLdcInsn(value)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
|
|
||||||
evaluateMethodVisitor.visitMethodInsn(INVOKESTATIC, c, "valueOf", "($sigLetter)L${c};", false)
|
invokeMethodVisitor.visitMethodInsn(INVOKESTATIC, c, "valueOf", "($sigLetter)L${c};", false)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
visitLoadAnyFromConstants(value, c)
|
visitLoadAnyFromConstants(value, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun visitLoadFromVariables(name: String, defaultValue: T? = null) = evaluateMethodVisitor.run {
|
internal fun visitLoadFromVariables(name: String, defaultValue: T? = null) = invokeMethodVisitor.run {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
maxStack += 2
|
maxStack += 2
|
||||||
visitVarInsn(ALOAD, evaluateArgumentsVar)
|
visitVarInsn(ALOAD, invokeArgumentsVar)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
if (defaultValue != null) {
|
if (defaultValue != null) {
|
||||||
visitLdcInsn(name)
|
visitLdcInsn(name)
|
||||||
@ -242,26 +260,26 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
visitCastToT()
|
visitCastToT()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun visitLoadAlgebra() {
|
internal fun visitLoadAlgebra() {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
evaluateMethodVisitor.visitVarInsn(ALOAD, evaluateThisVar)
|
invokeMethodVisitor.visitVarInsn(ALOAD, invokeThisVar)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
evaluateMethodVisitor.visitFieldInsn(
|
invokeMethodVisitor.visitFieldInsn(
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
GETFIELD,
|
GETFIELD,
|
||||||
ASM_COMPILED_CLASS, "algebra", "L$ALGEBRA_CLASS;"
|
ASM_COMPILED_EXPRESSION_CLASS, "algebra", "L$ALGEBRA_CLASS;"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
)
|
)
|
||||||
|
|
||||||
evaluateMethodVisitor.visitTypeInsn(CHECKCAST, T_ALGEBRA_CLASS)
|
invokeMethodVisitor.visitTypeInsn(CHECKCAST, T_ALGEBRA_CLASS)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun visitAlgebraOperation(owner: String, method: String, descriptor: String) {
|
internal fun visitAlgebraOperation(owner: String, method: String, descriptor: String) {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
maxStack++
|
maxStack++
|
||||||
evaluateMethodVisitor.visitMethodInsn(INVOKEINTERFACE, owner, method, descriptor, true)
|
invokeMethodVisitor.visitMethodInsn(INVOKEINTERFACE, owner, method, descriptor, true)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
visitCastToT()
|
visitCastToT()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun visitCastToT(): Unit = evaluateMethodVisitor.visitTypeInsn(CHECKCAST, T_CLASS)
|
private fun visitCastToT(): Unit = invokeMethodVisitor.visitTypeInsn(CHECKCAST, T_CLASS)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
companion object {
|
internal companion object {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
private val SIGNATURE_LETTERS = mapOf(
|
private val SIGNATURE_LETTERS = mapOf(
|
||||||
java.lang.Byte::class.java to "B",
|
java.lang.Byte::class.java to "B",
|
||||||
java.lang.Short::class.java to "S",
|
java.lang.Short::class.java to "S",
|
||||||
@ -271,16 +289,16 @@ class AsmGenerationContext<T>(classOfT: Class<*>, private val algebra: Algebra<T
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
java.lang.Double::class.java to "D"
|
java.lang.Double::class.java to "D"
|
||||||
)
|
)
|
||||||
|
|
||||||
const val ASM_COMPILED_CLASS = "scientifik/kmath/expressions/AsmCompiled"
|
internal const val ASM_COMPILED_EXPRESSION_CLASS = "scientifik/kmath/expressions/AsmCompiledExpression"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val LIST_CLASS = "java/util/List"
|
internal const val LIST_CLASS = "java/util/List"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val MAP_CLASS = "java/util/Map"
|
internal const val MAP_CLASS = "java/util/Map"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val OBJECT_CLASS = "java/lang/Object"
|
internal const val OBJECT_CLASS = "java/lang/Object"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val ALGEBRA_CLASS = "scientifik/kmath/operations/Algebra"
|
internal const val ALGEBRA_CLASS = "scientifik/kmath/operations/Algebra"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val SPACE_OPERATIONS_CLASS = "scientifik/kmath/operations/SpaceOperations"
|
internal const val SPACE_OPERATIONS_CLASS = "scientifik/kmath/operations/SpaceOperations"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val STRING_CLASS = "java/lang/String"
|
internal const val STRING_CLASS = "java/lang/String"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val FIELD_OPERATIONS_CLASS = "scientifik/kmath/operations/FieldOperations"
|
internal const val FIELD_OPERATIONS_CLASS = "scientifik/kmath/operations/FieldOperations"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val RING_OPERATIONS_CLASS = "scientifik/kmath/operations/RingOperations"
|
internal const val RING_OPERATIONS_CLASS = "scientifik/kmath/operations/RingOperations"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
const val NUMBER_CLASS = "java/lang/Number"
|
internal const val NUMBER_CLASS = "java/lang/Number"
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,43 +384,25 @@ internal class AsmDivExpression<T>(
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class AsmFunctionalExpressionSpace<T>(
|
open class AsmExpressionSpace<T>(space: Space<T>) : Space<AsmExpression<T>>,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
val space: Space<T>,
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
one: T
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
) : Space<AsmExpression<T>>,
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
ExpressionSpace<T, AsmExpression<T>> {
|
ExpressionSpace<T, AsmExpression<T>> {
|
||||||
override val zero: AsmExpression<T> =
|
override val zero: AsmExpression<T> = AsmConstantExpression(space.zero)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
AsmConstantExpression(space.zero)
|
override fun const(value: T): AsmExpression<T> = AsmConstantExpression(value)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
override fun variable(name: String, default: T?): AsmExpression<T> = AsmVariableExpression(name, default)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
override fun const(value: T): AsmExpression<T> =
|
override fun add(a: AsmExpression<T>, b: AsmExpression<T>): AsmExpression<T> = AsmSumExpression(a, b)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
AsmConstantExpression(value)
|
override fun multiply(a: AsmExpression<T>, k: Number): AsmExpression<T> = AsmConstProductExpression(a, k)
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
override fun variable(name: String, default: T?): AsmExpression<T> =
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
AsmVariableExpression(
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
name,
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
default
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
)
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
override fun add(a: AsmExpression<T>, b: AsmExpression<T>): AsmExpression<T> =
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
AsmSumExpression(a, b)
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
override fun multiply(a: AsmExpression<T>, k: Number): AsmExpression<T> =
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
AsmConstProductExpression(a, k)
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
operator fun AsmExpression<T>.plus(arg: T) = this + const(arg)
|
operator fun AsmExpression<T>.plus(arg: T) = this + const(arg)
|
||||||
operator fun AsmExpression<T>.minus(arg: T) = this - const(arg)
|
operator fun AsmExpression<T>.minus(arg: T) = this - const(arg)
|
||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
operator fun T.plus(arg: AsmExpression<T>) = arg + this
|
operator fun T.plus(arg: AsmExpression<T>) = arg + this
|
||||||
operator fun T.minus(arg: AsmExpression<T>) = arg - this
|
operator fun T.minus(arg: AsmExpression<T>) = arg - this
|
||||||
}
|
}
|
||||||
|
|
||||||
class AsmFunctionalExpressionField<T>(val field: Field<T>) : ExpressionField<T, AsmExpression<T>>,
|
class AsmExpressionField<T>(private val field: Field<T>) : ExpressionField<T, AsmExpression<T>>,
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
AsmFunctionalExpressionSpace<T>(field, field.one) {
|
AsmExpressionSpace<T>(field) {
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
override val one: AsmExpression<T>
|
override val one: AsmExpression<T>
|
||||||
get() = const(this.field.one)
|
get() = const(this.field.one)
|
||||||
|
|
||||||
override fun const(value: Double): AsmExpression<T> = const(field.run { one * value })
|
override fun number(value: Number): AsmExpression<T> = const(field.run { one * value })
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
|
|
||||||
override fun multiply(a: AsmExpression<T>, b: AsmExpression<T>): AsmExpression<T> =
|
override fun multiply(a: AsmExpression<T>, b: AsmExpression<T>): AsmExpression<T> =
|
||||||
AsmProductExpression(a, b)
|
AsmProductExpression(a, b)
|
||||||
@ -412,7 +412,6 @@ class AsmFunctionalExpressionField<T>(val field: Field<T>) : ExpressionField<T,
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
|||||||
|
|
||||||
operator fun AsmExpression<T>.times(arg: T) = this * const(arg)
|
operator fun AsmExpression<T>.times(arg: T) = this * const(arg)
|
||||||
operator fun AsmExpression<T>.div(arg: T) = this / const(arg)
|
operator fun AsmExpression<T>.div(arg: T) = this / const(arg)
|
||||||
|
|
||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Not used Not used
|
|||||||
operator fun T.times(arg: AsmExpression<T>) = arg * this
|
operator fun T.times(arg: AsmExpression<T>) = arg * this
|
||||||
operator fun T.div(arg: AsmExpression<T>) = arg / this
|
operator fun T.div(arg: AsmExpression<T>) = arg / this
|
||||||
}
|
}
|
||||||
|
|||||||
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Add suppress for unused parameters and documentation. Add suppress for unused parameters and documentation.
Space is not actually used. Space is not actually used.
Space is not actually used. Space is not actually used.
Not used Not used
Not used Not used
|
@ -12,15 +12,12 @@ class AsmTest {
|
|||||||
arguments: Map<String, T>,
|
arguments: Map<String, T>,
|
||||||
algebra: Algebra<T>,
|
algebra: Algebra<T>,
|
||||||
clazz: Class<*>
|
clazz: Class<*>
|
||||||
) {
|
): Unit = assertEquals(
|
||||||
assertEquals(
|
expectedValue, AsmGenerationContext(clazz, algebra, "TestAsmCompiled")
|
||||||
expectedValue, AsmGenerationContext(
|
.also(expr::invoke)
|
||||||
clazz,
|
.generate()
|
||||||
algebra,
|
.invoke(arguments)
|
||||||
"TestAsmCompiled"
|
)
|
||||||
).also(expr::invoke).generate().evaluate(arguments)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
private fun testDoubleExpressionValue(
|
private fun testDoubleExpressionValue(
|
||||||
@ -29,7 +26,7 @@ class AsmTest {
|
|||||||
arguments: Map<String, Double>,
|
arguments: Map<String, Double>,
|
||||||
algebra: Algebra<Double> = RealField,
|
algebra: Algebra<Double> = RealField,
|
||||||
clazz: Class<Double> = java.lang.Double::class.java as Class<Double>
|
clazz: Class<Double> = java.lang.Double::class.java as Class<Double>
|
||||||
) = testExpressionValue(expectedValue, expr, arguments, algebra, clazz)
|
): Unit = testExpressionValue(expectedValue, expr, arguments, algebra, clazz)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testSum() = testDoubleExpressionValue(
|
fun testSum() = testDoubleExpressionValue(
|
||||||
@ -39,28 +36,28 @@ class AsmTest {
|
|||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testConst() = testDoubleExpressionValue(
|
fun testConst(): Unit = testDoubleExpressionValue(
|
||||||
123.0,
|
123.0,
|
||||||
AsmConstantExpression(123.0),
|
AsmConstantExpression(123.0),
|
||||||
mapOf()
|
mapOf()
|
||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testDiv() = testDoubleExpressionValue(
|
fun testDiv(): Unit = testDoubleExpressionValue(
|
||||||
0.5,
|
0.5,
|
||||||
AsmDivExpression(AsmConstantExpression(1.0), AsmConstantExpression(2.0)),
|
AsmDivExpression(AsmConstantExpression(1.0), AsmConstantExpression(2.0)),
|
||||||
mapOf()
|
mapOf()
|
||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testProduct() = testDoubleExpressionValue(
|
fun testProduct(): Unit = testDoubleExpressionValue(
|
||||||
25.0,
|
25.0,
|
||||||
AsmProductExpression(AsmVariableExpression("x"), AsmVariableExpression("x")),
|
AsmProductExpression(AsmVariableExpression("x"), AsmVariableExpression("x")),
|
||||||
mapOf("x" to 5.0)
|
mapOf("x" to 5.0)
|
||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testCProduct() = testDoubleExpressionValue(
|
fun testCProduct(): Unit = testDoubleExpressionValue(
|
||||||
25.0,
|
25.0,
|
||||||
AsmConstProductExpression(AsmVariableExpression("x"), 5.0),
|
AsmConstProductExpression(AsmVariableExpression("x"), 5.0),
|
||||||
mapOf("x" to 5.0)
|
mapOf("x" to 5.0)
|
||||||
|
@ -76,7 +76,7 @@ interface ExpressionSpace<T, E> : Space<E>, ExpressionContext<T, E> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface ExpressionField<T, E> : Field<E>, ExpressionSpace<T, E> {
|
interface ExpressionField<T, E> : Field<E>, ExpressionSpace<T, E> {
|
||||||
fun const(value: Double): E = one.times(value)
|
fun number(value: Number): E = one * value
|
||||||
|
|
||||||
override fun produce(node: SyntaxTreeNode): E {
|
override fun produce(node: SyntaxTreeNode): E {
|
||||||
if (node is BinaryNode) {
|
if (node is BinaryNode) {
|
||||||
|
@ -27,55 +27,41 @@ internal class ProductExpression<T>(val context: Ring<T>, val first: Expression<
|
|||||||
context.multiply(first.invoke(arguments), second.invoke(arguments))
|
context.multiply(first.invoke(arguments), second.invoke(arguments))
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class ConstProductExpession<T>(val context: Space<T>, val expr: Expression<T>, val const: Number) :
|
internal class ConstProductExpression<T>(val context: Space<T>, val expr: Expression<T>, val const: Number) :
|
||||||
Expression<T> {
|
Expression<T> {
|
||||||
override fun invoke(arguments: Map<String, T>): T = context.multiply(expr.invoke(arguments), const)
|
override fun invoke(arguments: Map<String, T>): T = context.multiply(expr.invoke(arguments), const)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class DivExpession<T>(val context: Field<T>, val expr: Expression<T>, val second: Expression<T>) :
|
internal class DivExpression<T>(val context: Field<T>, val expr: Expression<T>, val second: Expression<T>) :
|
||||||
Expression<T> {
|
Expression<T> {
|
||||||
override fun invoke(arguments: Map<String, T>): T = context.divide(expr.invoke(arguments), second.invoke(arguments))
|
override fun invoke(arguments: Map<String, T>): T = context.divide(expr.invoke(arguments), second.invoke(arguments))
|
||||||
}
|
}
|
||||||
|
|
||||||
open class FunctionalExpressionSpace<T>(
|
open class FunctionalExpressionSpace<T>(val space: Space<T>) : Space<Expression<T>>, ExpressionSpace<T, Expression<T>> {
|
||||||
val space: Space<T>,
|
|
||||||
one: T
|
|
||||||
) : Space<Expression<T>>, ExpressionSpace<T,Expression<T>> {
|
|
||||||
|
|
||||||
override val zero: Expression<T> = ConstantExpression(space.zero)
|
override val zero: Expression<T> = ConstantExpression(space.zero)
|
||||||
|
|
||||||
override fun const(value: T): Expression<T> = ConstantExpression(value)
|
override fun const(value: T): Expression<T> = ConstantExpression(value)
|
||||||
|
|
||||||
override fun variable(name: String, default: T?): Expression<T> = VariableExpression(name, default)
|
override fun variable(name: String, default: T?): Expression<T> = VariableExpression(name, default)
|
||||||
|
|
||||||
override fun add(a: Expression<T>, b: Expression<T>): Expression<T> = SumExpression(space, a, b)
|
override fun add(a: Expression<T>, b: Expression<T>): Expression<T> = SumExpression(space, a, b)
|
||||||
|
override fun multiply(a: Expression<T>, k: Number): Expression<T> = ConstProductExpression(space, a, k)
|
||||||
override fun multiply(a: Expression<T>, k: Number): Expression<T> = ConstProductExpession(space, a, k)
|
operator fun Expression<T>.plus(arg: T): Expression<T> = this + const(arg)
|
||||||
|
operator fun Expression<T>.minus(arg: T): Expression<T> = this - const(arg)
|
||||||
|
operator fun T.plus(arg: Expression<T>): Expression<T> = arg + this
|
||||||
operator fun Expression<T>.plus(arg: T) = this + const(arg)
|
operator fun T.minus(arg: Expression<T>): Expression<T> = arg - this
|
||||||
operator fun Expression<T>.minus(arg: T) = this - const(arg)
|
|
||||||
|
|
||||||
operator fun T.plus(arg: Expression<T>) = arg + this
|
|
||||||
operator fun T.minus(arg: Expression<T>) = arg - this
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open class FunctionalExpressionField<T>(
|
open class FunctionalExpressionField<T>(
|
||||||
val field: Field<T>
|
val field: Field<T>
|
||||||
) : ExpressionField<T,Expression<T>>, FunctionalExpressionSpace<T>(field, field.one) {
|
) : ExpressionField<T, Expression<T>>, FunctionalExpressionSpace<T>(field) {
|
||||||
|
|
||||||
override val one: Expression<T>
|
override val one: Expression<T>
|
||||||
get() = const(this.field.one)
|
get() = const(this.field.one)
|
||||||
|
|
||||||
override fun const(value: Double): Expression<T> = const(field.run { one*value})
|
override fun number(value: Number): Expression<T> = const(field.run { one * value })
|
||||||
|
|
||||||
override fun multiply(a: Expression<T>, b: Expression<T>): Expression<T> = ProductExpression(field, a, b)
|
override fun multiply(a: Expression<T>, b: Expression<T>): Expression<T> = ProductExpression(field, a, b)
|
||||||
|
override fun divide(a: Expression<T>, b: Expression<T>): Expression<T> = DivExpression(field, a, b)
|
||||||
override fun divide(a: Expression<T>, b: Expression<T>): Expression<T> = DivExpession(field, a, b)
|
operator fun Expression<T>.times(arg: T): Expression<T> = this * const(arg)
|
||||||
|
operator fun Expression<T>.div(arg: T): Expression<T> = this / const(arg)
|
||||||
operator fun Expression<T>.times(arg: T) = this * const(arg)
|
operator fun T.times(arg: Expression<T>): Expression<T> = arg * this
|
||||||
operator fun Expression<T>.div(arg: T) = this / const(arg)
|
operator fun T.div(arg: Expression<T>): Expression<T> = arg / this
|
||||||
|
}
|
||||||
operator fun T.times(arg: Expression<T>) = arg * this
|
|
||||||
operator fun T.div(arg: Expression<T>) = arg / this
|
|
||||||
}
|
|
||||||
|
Probably should be implementation
Probably should be implementation