From a439fabe27100398008104f31c554ef9f0eb7ec2 Mon Sep 17 00:00:00 2001 From: Nico Mack Date: Fri, 7 Apr 2017 14:48:29 +0200 Subject: [PATCH] Added isolation mode to equations. Better support for datatypes in Python Executor --- .../itis/dkd/tui/cps/system/Equation.java | 21 +++++++++++++++++-- .../tui/cps/system/EquationSystemBuilder.java | 10 +++++++++ .../tui/cps/system/LinearEquationSystem.java | 2 -- .../cps/system/executor/PythonExecutor.java | 5 ++++- .../tui/cps/system/executor/SqlExecutor.java | 1 + .../dkd/tui/cps/utility/Externalization.java | 3 +++ .../cps/utility/externalization.properties | 1 + 7 files changed, 38 insertions(+), 5 deletions(-) diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/Equation.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/Equation.java index 711b975..6f81cf1 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/system/Equation.java +++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/Equation.java @@ -52,6 +52,7 @@ public class Equation { @Nullable private Executor scriptExecutor; private String script; + private boolean isolated; private static Logger LOGGER = LoggerFactory.getLogger(Equation.class.getSimpleName()); @@ -70,6 +71,7 @@ public class Equation { this.mapping = mapping; this.lockedMapping = mapping; this.script = script; + this.isolated = false; } /** @@ -81,6 +83,16 @@ public class Equation { return mapping; } + /** + * Allows to isolate this equation. An isolated equation will not notify dependent equations + * when evaluation entailed changes in results. + * + * @param isolateIt + */ + public void setIsolated(boolean isolateIt) { + this.isolated = isolateIt; + } + /** * Method called to evaluate the script of the equation with the variables provided by the * mapping. @@ -100,7 +112,8 @@ public class Equation { scriptExecutor.eval(this.script); } catch (Exception exception) { - LOGGER.error("Error while evaluating script {}", this.script, exception); //$NON-NLS-1$ + LOGGER.error("Error while evaluating script {}", this.script); //$NON-NLS-1$ + LOGGER.error("Engine threw an exception", exception); //$NON-NLS-1$ } dependentVariables = mapping.getDependentVariables(); @@ -121,7 +134,11 @@ public class Equation { variable.suspendListenerNotification(false); } - if (consolidated && consolidatedListeners != null) { + if (isolated && LOGGER.isInfoEnabled()) { + LOGGER.info("Equation {} evaluated in isolated mode! Dependent variables won't trigger dependent equations!", this.name); //$NON-NLS-1$ + } + + if (!isolated && consolidated && consolidatedListeners != null) { for (InputChangeListener listener : consolidatedListeners.keySet()) { Variable variable = consolidatedListeners.get(listener); listener.inputChanged(new InputEvent(variable)); diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java index ae1dc31..4dda29d 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java +++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/EquationSystemBuilder.java @@ -555,12 +555,14 @@ public class EquationSystemBuilder { private void addDependencies(Element equation) throws EquationSystemException { String periodicity = equation.getAttributeValue(Externalization.PERIODIC_ATTRIBUTE); + boolean periodic = false; if (!Strings.isNullOrEmpty(periodicity)) { Matcher regex = booleanPattern.matcher(periodicity); periodic = regex.matches(); } + addParameterDependencies(equation); addResultDependencies(equation); @@ -582,6 +584,7 @@ public class EquationSystemBuilder { LinkedHashSet> equationInputs = new LinkedHashSet<>(); LinkedHashSet> equationOutputs = new LinkedHashSet<>(); boolean lockToNesting = true; + String periodicity = equation.getAttributeValue(Externalization.PERIODIC_ATTRIBUTE); boolean periodic = false; @@ -590,6 +593,12 @@ public class EquationSystemBuilder { periodic = regex.matches(); } + String mode = equation.getAttributeValue(Externalization.MODE_ATTRIBUTE); + boolean isolated = false; + + if (!Strings.isNullOrEmpty(mode)) { + isolated = Externalization.ISOLATED_VALUE.equals(mode); + } for (String identifier : equationParameters.get(equationName)) { if (independentVariables.containsKey(identifier)) { @@ -637,6 +646,7 @@ public class EquationSystemBuilder { final LinearEquationSystem equationSystem = new LinearEquationSystem(lockToNesting); Equation newEquation = new Equation(equationName, variableMapping, script); newEquation.setExecutor(executors.get(executor)); + newEquation.setIsolated(isolated); equationSystem.addEquation(newEquation); if (!periodic) { diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/LinearEquationSystem.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/LinearEquationSystem.java index eae4fc6..d2fa219 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/system/LinearEquationSystem.java +++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/LinearEquationSystem.java @@ -58,9 +58,7 @@ public class LinearEquationSystem extends System { public LinearEquationSystem(boolean lockToNesting) { super(); equations = new ConcurrentHashMap<>(); - // scriptEngine = new ScriptEngineManager().getEngineByName("js"); //$NON-NLS-1$ this.lockSystemForNesting = lockToNesting; - // assert scriptEngine != null : "Script engine cannot be null;"; //$NON-NLS-1$ } /** diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/PythonExecutor.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/PythonExecutor.java index 31448c6..b7c4f89 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/PythonExecutor.java +++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/PythonExecutor.java @@ -52,7 +52,7 @@ public class PythonExecutor extends Executor { @Override public void set(Variable variable) { if (variable instanceof VectorVariable) { - VectorVariable vector = (VectorVariable) variable; + VectorVariable vector = (VectorVariable) variable; if (!vector.isEmpty()) { PyArray array = null; @@ -84,6 +84,9 @@ public class PythonExecutor extends Executor { LOGGER.info("Parameter -> {} = {}", variable.getName(), list.toString()); //$NON-NLS-1$ } } + } else { + LOGGER.warn("Empty Vector {}", variable.getName()); //$NON-NLS-1$ + engine.set(variable.getName(), new PyArray(Object.class, 0)); } } else { diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java b/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java index e10577f..1a2aae5 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java +++ b/CPS/src/lu/list/itis/dkd/tui/cps/system/executor/SqlExecutor.java @@ -373,6 +373,7 @@ public class SqlExecutor extends Executor { // Suspend notification of input change listeners while populating vector variable.suspendListenerNotification(true); + vector.clear(); for (Object[] values : columnValues) { Object value = values[index]; vector.add(value); diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/utility/Externalization.java b/CPS/src/lu/list/itis/dkd/tui/cps/utility/Externalization.java index 691ec88..32e4838 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/utility/Externalization.java +++ b/CPS/src/lu/list/itis/dkd/tui/cps/utility/Externalization.java @@ -42,6 +42,7 @@ public class Externalization extends NLS { public static String VECTOR_VARIABLE_CLASS; public static String EQUATION_ELEMENT; + public static String MODE_ATTRIBUTE; public static String EQUATIONS_ELEMENT; public static String INVOKE_ELEMENT; public static String EXECUTOR_ATTRIBUTE; @@ -75,6 +76,8 @@ public class Externalization extends NLS { public static final String TEXT_TYPE = "text"; public static final String VECTOR_TYPE = "vector"; + public static final String ISOLATED_VALUE = "isolated"; + static { // initialize resource bundle diff --git a/CPS/src/lu/list/itis/dkd/tui/cps/utility/externalization.properties b/CPS/src/lu/list/itis/dkd/tui/cps/utility/externalization.properties index e80cb37..a1ef126 100644 --- a/CPS/src/lu/list/itis/dkd/tui/cps/utility/externalization.properties +++ b/CPS/src/lu/list/itis/dkd/tui/cps/utility/externalization.properties @@ -11,6 +11,7 @@ EXECUTOR_POSTFIX=Executor EQUATIONS_ELEMENT=equations EQUATION_ELEMENT=equation +MODE_ATTRIBUTE=mode INVOKE_ELEMENT=invoke EXECUTOR_ATTRIBUTE=executor NAME_ATTRIBUTE=name -- GitLab