Skip to content

Commit

Permalink
Merge pull request #3 from kleis-technology/fix/request-by-process
Browse files Browse the repository at this point in the history
core: evaluator: one-shot dynamic addition of a template
  • Loading branch information
pevab authored Jan 17, 2024
2 parents 7211001 + 8a3752c commit 40f38bf
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package ch.kleis.lcaac.core.lang.evaluator

import ch.kleis.lcaac.core.lang.SymbolTable
import ch.kleis.lcaac.core.lang.evaluator.protocol.Oracle
import ch.kleis.lcaac.core.lang.evaluator.protocol.Learner
import ch.kleis.lcaac.core.lang.evaluator.protocol.Oracle
import ch.kleis.lcaac.core.lang.expression.*
import ch.kleis.lcaac.core.lang.register.ProcessKey
import ch.kleis.lcaac.core.math.QuantityOperations
import org.slf4j.LoggerFactory

Expand Down Expand Up @@ -32,9 +33,23 @@ class Evaluator<Q>(
}
}

fun trace(template: EProcessTemplate<Q>, arguments: Map<String, DataExpression<Q>> = emptyMap()): EvaluationTrace<Q> {
return prepareRequests(template, arguments)
.let(this::trace)
fun with(template: EProcessTemplate<Q>): Evaluator<Q> {
val processKey = ProcessKey(template.body.name)
if (symbolTable.processTemplates[processKey] != null) throw IllegalStateException("Process ${template.body.name} already exists")
val st = this.symbolTable.copy(
processTemplates = this.symbolTable.processTemplates.plus(
mapOf(processKey to template)
)
)
return Evaluator(st, ops)
}

fun trace(
template: EProcessTemplate<Q>,
arguments: Map<String, DataExpression<Q>> = emptyMap()
): EvaluationTrace<Q> {
val requests = prepareRequests(template, arguments)
return trace(requests)
}

private fun <Q> prepareRequests(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,68 @@ import ch.kleis.lcaac.core.math.basic.BasicNumber
import ch.kleis.lcaac.core.math.basic.BasicOperations
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Timeout
import org.junit.jupiter.api.assertThrows
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertNotEquals

class EvaluatorTest {
private val ops = BasicOperations

@Test
fun with_whenNewTemplate() {
// given
val template = EProcessTemplate(
body = EProcess(
name = "eProcess",
products = listOf(
ETechnoExchange(QuantityFixture.oneKilogram, ProductFixture.carrot)
),
impacts = listOf(
ImpactFixture.oneClimateChange
),
)
)
val evaluator = Evaluator(SymbolTable.empty(), BasicOperations)
.with(template)
val expected = ImpactValue(
QuantityValueFixture.oneKilogram,
IndicatorValueFixture.climateChange,
)

// when
val actual = evaluator.trace(template).getEntryPoint().impacts.first()

// then
assertEquals(expected, actual)
}

@Test
fun with_whenNameCollision_shouldThrow() {
// given
val template = EProcessTemplate(
body = EProcess(
name = "eProcess",
products = listOf(
ETechnoExchange(QuantityFixture.oneKilogram, ProductFixture.carrot)
),
impacts = listOf(
ImpactFixture.oneClimateChange
),
)
)
val symbolTable = SymbolTable(
processTemplates = ProcessTemplateRegister.from(mapOf(
ProcessKey("eProcess") to template
))
)
val evaluator = Evaluator(symbolTable, BasicOperations)

// when/then
val e = assertThrows<IllegalStateException> { evaluator.with(template) }
assertEquals("Process eProcess already exists", e.message)
}

@Test
fun eval_processWithImpacts_shouldReduceImpacts() {
// given
Expand Down

0 comments on commit 40f38bf

Please sign in to comment.