]> gerrit.simantics Code Review - simantics/sysdyn.git/commitdiff
refs #5042
authorjsimomaa <jsimomaa@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Mon, 30 Jun 2014 10:54:47 +0000 (10:54 +0000)
committerjsimomaa <jsimomaa@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Mon, 30 Jun 2014 10:54:47 +0000 (10:54 +0000)
refs #5019
refs #5009

Merging changes from r29718, r29733, r29763  trunk to branches/1.8  sysdyn 1.8.1

git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/branches/1.8@29767 ac1ea38d-2e2b-0410-8846-a27921b304fc

12 files changed:
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Array.java
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/ElementwiseProduct.java
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NodeClass.java
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Parser.java
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Solver.java
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelParser.java
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jj
fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jjt
org.simantics.sysdyn/scl/Sysdyn.scl
org.simantics.sysdyn/src/org/simantics/sysdyn/manager/OldSysdynExperiment.java
org.simantics.sysdyn/src/org/simantics/sysdyn/manager/SysdynExperiments.java
org.simantics.sysdyn/src/org/simantics/sysdyn/solver/InternalSolver.java

index db00150642e150cdacd494d2bcb0dc169e418cd0..68a0504bf4eecfed8c8a037c65c15309d95daf88 100644 (file)
@@ -13,18 +13,23 @@ package fi.semantum.sysdyn.solver;
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.Iterator;\r
+import java.util.List;\r
 import java.util.Map;\r
 \r
 public class Array implements IExpression {\r
 \r
        public static final Array FULL = new Array();\r
        \r
-       private ArrayList<Object> elements = new ArrayList<Object>();\r
+       final private ArrayList<Object> elements;\r
 \r
        public Array() {\r
-               \r
+               elements = new ArrayList<Object>();\r
        }\r
        \r
+       public Array(int size) {\r
+               elements = new ArrayList<Object>(size);\r
+       }\r
+\r
        public Array addElement(Object element) {\r
                if(element instanceof Constant) addElement(((Constant)element).value);\r
                else elements.add(element);\r
@@ -70,7 +75,7 @@ public class Array implements IExpression {
                return elements.get(index);\r
        }\r
        \r
-       public Collection<Object> elements() {\r
+       public List<Object> elements() {\r
                return elements;\r
        }\r
        \r
index e3198cfeca802c842bbd872682e2bce778559873..f87529c53fe4e52cb2d59ec303b05f27fa0347b1 100644 (file)
@@ -12,6 +12,7 @@ package fi.semantum.sysdyn.solver;
 \r
 import java.util.Collection;\r
 import java.util.Iterator;\r
+import java.util.List;\r
 import java.util.Map;\r
 \r
 public class ElementwiseProduct implements IExpression {\r
@@ -36,26 +37,24 @@ public class ElementwiseProduct implements IExpression {
                if(left instanceof Array && right instanceof Array) {\r
                        Array la = (Array)left;\r
                        Array ra = (Array)right;\r
-                       Collection<Object> lae = la.elements();\r
-                       Collection<Object> rae = ra.elements();\r
+                       List<Object> lae = la.elements();\r
+                       List<Object> rae = ra.elements();\r
                        if(lae.size() != rae.size()) throw new UnsupportedOperationException();\r
-                       Iterator<Object> li = lae.iterator();\r
-                       Iterator<Object> ri = rae.iterator();\r
-                       Array result = new Array();\r
-                       for(int i=0;i<lae.size();i++) {\r
-                               double ld = (Double)li.next();\r
-                               double rd = (Double)ri.next();\r
+                       Array result = new Array(lae.size());\r
+                       int index = 0;\r
+                       for(Object o : lae) {\r
+                               Double ld = (Double)o;\r
+                               Double rd = (Double)rae.get(index++);\r
                                result.addElement(ld*rd);\r
                        }\r
                        return result;\r
                } else if (left instanceof Array && right instanceof Double) {\r
                        Array la = (Array)left;\r
                        Double rd = (Double)right;\r
-                       Collection<Object> lae = la.elements();\r
-                       Iterator<Object> li = lae.iterator();\r
-                       Array result = new Array();\r
-                       for(int i=0;i<lae.size();i++) {\r
-                               double ld = (Double)li.next();\r
+                       List<Object> lae = la.elements();\r
+                       Array result = new Array(lae.size());\r
+                       for(Object o : lae) {\r
+                               Double ld = (Double)o;\r
                                result.addElement(ld*rd);\r
                        }\r
                        return result;\r
index 81b86df71287487b91928ed8e5060a68d12bb5b4..8d2e49a0eb87f21b763fcc3bf92fe617b6db2fc1 100644 (file)
@@ -33,9 +33,11 @@ public enum NodeClass {
        subscript_2,\r
        component_clause,\r
        component_declaration,\r
+       component_list,\r
        array_subscripts,\r
        declaration,\r
        class_definition,\r
+       class_specifier,\r
        array,\r
        primary,\r
        component_reference,\r
index bd6fc87d7fbac312df4b75ba44ab02c3e4a94034..e2c722d75702dbc561d1da36c69f9842f7a6b062 100644 (file)
@@ -40,6 +40,17 @@ public class Parser {
        \r
        static Map<String, NodeClass> nodeNameMap = new HashMap<String, NodeClass>();\r
        \r
+       public String getPackagePath(SimpleNode n) {\r
+               SimpleNode parent = (SimpleNode)n.jjtGetParent();\r
+               if(parent == null) return "";\r
+               NodeClass nc = NodeClass.of(parent.toString());\r
+               if (nc == NodeClass.class_specifier) {\r
+                       return getPackagePath(parent) + parent.op + "."; \r
+               } else {\r
+                       return getPackagePath(parent); \r
+               }\r
+       }\r
+       \r
        public Object walk_(SimpleNode n, int indent, IFrame frame) {\r
 \r
                Model model = frame instanceof Model ? (Model)frame : null;\r
@@ -246,9 +257,20 @@ public class Parser {
                        IExpression[] subscripts = (third instanceof IExpression[])? (IExpression[])third : null;\r
                        int declarationStart = (third instanceof IExpression[]) ? 3 : 2;\r
                        ArrayList<Object> clauses = new ArrayList<Object>();\r
-                       for(int i=declarationStart;i<n.jjtGetNumChildren();i++) {\r
+                       \r
+                       ArrayList<Declaration> declarations2 = new ArrayList<Declaration>();\r
+                       if(third instanceof ArrayList) {\r
+                               ArrayList<Declaration> decls = (ArrayList<Declaration>)third;\r
+                               declarations2.addAll(decls);\r
+                       } else {\r
+                               for(int i=declarationStart;i<n.jjtGetNumChildren();i++) {\r
+                                       Declaration decl = (Declaration)walk((SimpleNode)n.jjtGetChild(i), indent+2, frame);\r
+                                       declarations2.add(decl);\r
+                               }\r
+                       }\r
+                       \r
+                       for(Declaration decl : declarations2) {\r
                                \r
-                               Declaration decl = (Declaration)walk((SimpleNode)n.jjtGetChild(i), indent+2, frame);\r
                                if(subscripts != null)\r
                                        decl.variable.subscripts = subscripts;\r
                                \r
@@ -288,6 +310,16 @@ public class Parser {
                                }\r
                        }\r
                        return clauses;\r
+               case component_list:\r
+                       if(n.jjtGetNumChildren() == 1)\r
+                               return walk((SimpleNode)n.jjtGetChild(0), indent+2, frame);\r
+                       else {\r
+                               ArrayList<Declaration> result = new ArrayList<Declaration>();\r
+                               for(int i=0;i<n.jjtGetNumChildren();i++) {\r
+                                       result.add((Declaration)walk((SimpleNode)n.jjtGetChild(i),indent+2, frame));\r
+                               }\r
+                               return result;\r
+                       }\r
                case component_declaration:\r
                        return (Declaration)walk((SimpleNode)n.jjtGetChild(0), indent+2, frame);\r
                case array_subscripts:\r
@@ -318,10 +350,13 @@ public class Parser {
                                }\r
                                return b.toString();\r
                        }\r
+               case class_specifier:\r
+                       return walk((SimpleNode)n.jjtGetChild(0), indent+2, frame);\r
                case class_definition:\r
                        if("function".equals(n.op)) {\r
                                SimpleNode child = (SimpleNode)n.jjtGetChild(0);\r
-                               String functionName = child.op;\r
+                               String packagePath = getPackagePath(child);\r
+                               String functionName = packagePath + child.op;\r
                                ArrayList<IStatement> stms2 = new ArrayList<IStatement>();\r
                                Function function = new Function(functionName, new StatementList(stms2));\r
                                ArrayList<Object> composition = (ArrayList<Object>)walk(child, indent+2, function);\r
@@ -392,6 +427,10 @@ public class Parser {
                                \r
                                return null;\r
                                \r
+                       } else if("package".equals(n.op)) {\r
+\r
+                               return walk((SimpleNode)n.jjtGetChild(0), indent+2, frame);\r
+\r
                        } else {\r
                                System.err.println("class_definition " + n.op);\r
                        }\r
index b65afaff5e7bbb9bc1599e823b01a92b6b033e07..e03b297deb789137e6c772064b6109ec14084ae4 100644 (file)
@@ -42,6 +42,9 @@ public class Solver {
        private NodeCache cache;\r
        private boolean ready;\r
        \r
+       private boolean dirty;\r
+       private boolean started;\r
+       \r
        public Solver() {\r
                defaultStep = 0.1;\r
                start = 0;\r
@@ -105,23 +108,27 @@ public class Solver {
                });\r
                \r
        }\r
+\r
+       private SimpleNode n;\r
+       private String codeCache = null;\r
        \r
        public void prepare(String input) throws Exception {\r
                \r
                long startNanos = System.nanoTime();\r
                \r
-//             LineReader reader = new LineReader(input, cache);\r
-//             reader.parse();\r
-//             \r
-//             model = reader.model;\r
+               if(!input.equals(codeCache)) {\r
                \r
-               StringReader reader = new StringReader(input);\r
-               ModelParser modelParser = new ModelParser(reader);\r
-               SimpleNode n = (SimpleNode)modelParser.stored_definition();\r
+                       StringReader reader = new StringReader(input);\r
+                       ModelParser modelParser = new ModelParser(reader);\r
+                       n = (SimpleNode)modelParser.stored_definition();\r
+               \r
+               }\r
+\r
            Parser parser = new Parser();\r
            model = new Model(new Globals(), "", false);\r
                parser.walk(n, 0, model);\r
-               \r
+               codeCache = input;\r
+\r
                env = new Environment(model, defaultStep, start);\r
                \r
                int size = model.prepare();\r
@@ -237,6 +244,8 @@ public class Solver {
                env.initial = false;\r
                \r
                ready = true;\r
+               started = false;\r
+               dirty = false;\r
                \r
                long endNanos = System.nanoTime();\r
                \r
@@ -252,15 +261,67 @@ public class Solver {
                return env.getValueArray();\r
        }\r
        \r
+       public void aboutToRun() {\r
+\r
+               if(!started && dirty) {\r
+                       \r
+                       // Solve all algebraic equations\r
+                       Assignment[] assignments = model.assignmentArray;\r
+                       for(int i=0;i<assignments.length;i++) {\r
+                               if(assignments[i].isConstant) continue;\r
+                               Object value = assignments[i].expression.evaluate(env);\r
+                               assignments[i].target.assign(env, assignments[i].subscripts, value);\r
+                       }\r
+                       for(Assignment ass : model.initials) {\r
+                               if(ass.isConstant) continue;\r
+                               Object value = ass.expression.evaluate(env);\r
+                               ass.target.assign(env, ass.subscripts, value);\r
+                       }\r
+\r
+                       // Solve initial values\r
+                       for(VariableDeclaration vd : model.variables) {\r
+                               try {\r
+                                       for(Argument arg : vd.modification.args) {\r
+                                               if(arg.name.endsWith("start")) {\r
+                                                       Object value = arg.modification.evaluate(env);\r
+                                                       if(vd.variable.base.dimension() == 1) {\r
+                                                               vd.variable.assign(env, null, value);\r
+                                                       } else {\r
+                                                               if(value instanceof Double) {\r
+                                                                       Array array = new Array();\r
+                                                                       for(int i=0;i<vd.variable.base.dimension();i++) array.addElement(value);\r
+                                                                       vd.variable.assign(env, null, array);\r
+                                                               } else {\r
+                                                                       throw new IllegalStateException();\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               } catch (Exception e) {\r
+                                       if(PRINT_EXCEPTIONS) {\r
+                                               e.printStackTrace();\r
+                                               System.err.println("failed to assign " + vd.variable.toString());\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       dirty = false;\r
+                       \r
+               }\r
+               \r
+       }\r
+       \r
        public void step() {\r
                \r
 //             printEnvironment();\r
 //             \r
 //             new Exception().printStackTrace();\r
-\r
+               \r
                // TODO: do something more sensible if the solver is not ready\r
                if (!ready) return;\r
                \r
+               started = true;\r
+\r
                Assignment[] assignments = model.assignmentArray;\r
                Assignment[] derivatives = model.derivativeArray;\r
                \r
@@ -307,6 +368,7 @@ public class Solver {
        \r
        public void setValue(String key, double value) {\r
                env.setValue(key, value);\r
+               dirty = true;\r
        }\r
        \r
 }\r
index de6a2b2501c89ac425f6bbf506c750e48278c6a3..c50c60586559b38461a6834f24d3cba36ea9d273 100644 (file)
@@ -218,10 +218,11 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
         break;\r
       case 37:\r
         jj_consume_token(37);\r
+                jjtn000.op = "package";\r
         break;\r
       case 26:\r
         jj_consume_token(26);\r
-                             jjtn000.op = "function";\r
+                                                         jjtn000.op = "function";\r
         break;\r
       case 17:\r
         jj_consume_token(17);\r
@@ -4658,31 +4659,31 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     if (jj_scan_token(62)) return true;\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_166()) jj_scanpos = xsp;\r
+    if (jj_3R_167()) jj_scanpos = xsp;\r
     if (jj_scan_token(63)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_129() {\r
+  private boolean jj_3R_130() {\r
     if (jj_scan_token(49)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_124() {\r
+  private boolean jj_3R_125() {\r
     if (jj_scan_token(75)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_153() {\r
+  private boolean jj_3R_154() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(68)) jj_scanpos = xsp;\r
     if (jj_scan_token(IDENT)) return true;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_161()) jj_scanpos = xsp;\r
+    if (jj_3R_162()) jj_scanpos = xsp;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_162()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_163()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
@@ -4693,7 +4694,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_159() {\r
+  private boolean jj_3R_160() {\r
     if (jj_scan_token(58)) return true;\r
     return false;\r
   }\r
@@ -4703,7 +4704,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_150() {\r
+  private boolean jj_3R_151() {\r
     if (jj_scan_token(84)) return true;\r
     return false;\r
   }\r
@@ -4739,55 +4740,53 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_123() {\r
+  private boolean jj_3R_124() {\r
     if (jj_scan_token(74)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_146() {\r
-    if (jj_3R_155()) return true;\r
+  private boolean jj_3R_147() {\r
+    if (jj_3R_156()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_164() {\r
+  private boolean jj_3R_165() {\r
     if (jj_scan_token(70)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_145() {\r
+  private boolean jj_3R_146() {\r
     if (jj_scan_token(66)) return true;\r
-    if (jj_3R_154()) return true;\r
+    if (jj_3R_155()) return true;\r
     if (jj_scan_token(67)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_144() {\r
+  private boolean jj_3R_145() {\r
     if (jj_scan_token(62)) return true;\r
     if (jj_3R_47()) return true;\r
     if (jj_scan_token(63)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_142() {\r
-    if (jj_3R_152()) return true;\r
+  private boolean jj_3R_143() {\r
+    if (jj_3R_153()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_157() {\r
+  private boolean jj_3R_158() {\r
     if (jj_scan_token(87)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_143() {\r
-    if (jj_3R_153()) return true;\r
+  private boolean jj_3R_144() {\r
+    if (jj_3R_154()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_134() {\r
+  private boolean jj_3R_135() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_137()) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_138()) {\r
     jj_scanpos = xsp;\r
     if (jj_3R_139()) {\r
@@ -4806,6 +4805,8 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     jj_scanpos = xsp;\r
     if (jj_3R_146()) {\r
     jj_scanpos = xsp;\r
+    if (jj_3R_147()) {\r
+    jj_scanpos = xsp;\r
     if (jj_scan_token(35)) return true;\r
     }\r
     }\r
@@ -4820,182 +4821,182 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_137() {\r
+  private boolean jj_3R_138() {\r
     if (jj_scan_token(UNSIGNED_NUMBER)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_141() {\r
+  private boolean jj_3R_142() {\r
     if (jj_scan_token(33)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_140() {\r
+  private boolean jj_3R_141() {\r
     if (jj_scan_token(6)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_139() {\r
+  private boolean jj_3R_140() {\r
     if (jj_scan_token(STRING)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_138() {\r
+  private boolean jj_3R_139() {\r
     if (jj_scan_token(UNSIGNED_INTEGER)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_149() {\r
+  private boolean jj_3R_150() {\r
     if (jj_scan_token(83)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_128() {\r
+  private boolean jj_3R_129() {\r
     if (jj_scan_token(42)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_155() {\r
+  private boolean jj_3R_156() {\r
     if (jj_scan_token(64)) return true;\r
-    if (jj_3R_165()) return true;\r
+    if (jj_3R_166()) return true;\r
     if (jj_scan_token(65)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_135() {\r
-    if (jj_3R_147()) return true;\r
-    if (jj_3R_134()) return true;\r
+  private boolean jj_3R_136() {\r
+    if (jj_3R_148()) return true;\r
+    if (jj_3R_135()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_154() {\r
-    if (jj_3R_163()) return true;\r
+  private boolean jj_3R_155() {\r
+    if (jj_3R_164()) return true;\r
     Token xsp;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_164()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_165()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_158() {\r
+  private boolean jj_3R_159() {\r
     if (jj_3R_60()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_133() {\r
+  private boolean jj_3R_134() {\r
     if (jj_scan_token(79)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_152() {\r
+  private boolean jj_3R_153() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_158()) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_159()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_160()) return true;\r
+    if (jj_3R_160()) {\r
+    jj_scanpos = xsp;\r
+    if (jj_3R_161()) return true;\r
     }\r
     }\r
     if (jj_3R_74()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_122() {\r
+  private boolean jj_3R_123() {\r
     if (jj_scan_token(73)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_147() {\r
+  private boolean jj_3R_148() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_156()) {\r
+    if (jj_3R_157()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_157()) return true;\r
+    if (jj_3R_158()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_156() {\r
+  private boolean jj_3R_157() {\r
     if (jj_scan_token(86)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_119() {\r
-    if (jj_3R_134()) return true;\r
+  private boolean jj_3R_120() {\r
+    if (jj_3R_135()) return true;\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_135()) jj_scanpos = xsp;\r
+    if (jj_3R_136()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_120() {\r
-    if (jj_3R_136()) return true;\r
-    if (jj_3R_119()) return true;\r
+  private boolean jj_3R_121() {\r
+    if (jj_3R_137()) return true;\r
+    if (jj_3R_120()) return true;\r
     return false;\r
   }\r
 \r
   private boolean jj_3R_104() {\r
-    if (jj_3R_114()) return true;\r
+    if (jj_3R_115()) return true;\r
     if (jj_3R_103()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_113() {\r
-    if (jj_3R_118()) return true;\r
-    if (jj_3R_112()) return true;\r
+  private boolean jj_3R_114() {\r
+    if (jj_3R_119()) return true;\r
+    if (jj_3R_113()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_136() {\r
+  private boolean jj_3R_137() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_148()) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_149()) {\r
     jj_scanpos = xsp;\r
     if (jj_3R_150()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_151()) return true;\r
+    if (jj_3R_151()) {\r
+    jj_scanpos = xsp;\r
+    if (jj_3R_152()) return true;\r
     }\r
     }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_148() {\r
+  private boolean jj_3R_149() {\r
     if (jj_scan_token(82)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_110() {\r
+  private boolean jj_3R_111() {\r
     if (jj_3R_60()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_112() {\r
-    if (jj_3R_119()) return true;\r
+  private boolean jj_3R_113() {\r
+    if (jj_3R_120()) return true;\r
     Token xsp;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_120()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_121()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_131() {\r
+  private boolean jj_3R_132() {\r
     if (jj_scan_token(56)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_118() {\r
+  private boolean jj_3R_119() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_132()) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_133()) {\r
     jj_scanpos = xsp;\r
+    if (jj_3R_134()) {\r
+    jj_scanpos = xsp;\r
     if (jj_scan_token(80)) {\r
     jj_scanpos = xsp;\r
     if (jj_scan_token(81)) return true;\r
@@ -5005,7 +5006,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_132() {\r
+  private boolean jj_3R_133() {\r
     if (jj_scan_token(78)) return true;\r
     return false;\r
   }\r
@@ -5016,40 +5017,40 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_117() {\r
+  private boolean jj_3R_118() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_130()) {\r
+    if (jj_3R_131()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_131()) return true;\r
+    if (jj_3R_132()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_130() {\r
+  private boolean jj_3R_131() {\r
     if (jj_scan_token(32)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_111() {\r
-    if (jj_3R_118()) return true;\r
+  private boolean jj_3R_112() {\r
+    if (jj_3R_119()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_116() {\r
+  private boolean jj_3R_117() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_127()) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_128()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_129()) return true;\r
+    if (jj_3R_129()) {\r
+    jj_scanpos = xsp;\r
+    if (jj_3R_130()) return true;\r
     }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_127() {\r
+  private boolean jj_3R_128() {\r
     if (jj_scan_token(5)) return true;\r
     return false;\r
   }\r
@@ -5057,16 +5058,16 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
   private boolean jj_3R_103() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_111()) jj_scanpos = xsp;\r
-    if (jj_3R_112()) return true;\r
+    if (jj_3R_112()) jj_scanpos = xsp;\r
+    if (jj_3R_113()) return true;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_113()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_114()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_115() {\r
+  private boolean jj_3R_116() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(16)) {\r
@@ -5076,11 +5077,9 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_114() {\r
+  private boolean jj_3R_115() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_121()) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_122()) {\r
     jj_scanpos = xsp;\r
     if (jj_3R_123()) {\r
@@ -5089,7 +5088,9 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     jj_scanpos = xsp;\r
     if (jj_3R_125()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_126()) return true;\r
+    if (jj_3R_126()) {\r
+    jj_scanpos = xsp;\r
+    if (jj_3R_127()) return true;\r
     }\r
     }\r
     }\r
@@ -5098,7 +5099,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_121() {\r
+  private boolean jj_3R_122() {\r
     if (jj_scan_token(72)) return true;\r
     return false;\r
   }\r
@@ -5115,14 +5116,14 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_109() {\r
+  private boolean jj_3R_110() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_115()) jj_scanpos = xsp;\r
-    xsp = jj_scanpos;\r
     if (jj_3R_116()) jj_scanpos = xsp;\r
     xsp = jj_scanpos;\r
     if (jj_3R_117()) jj_scanpos = xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_118()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
@@ -5191,8 +5192,8 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
   }\r
 \r
   private boolean jj_3R_102() {\r
-    if (jj_3R_109()) return true;\r
     if (jj_3R_110()) return true;\r
+    if (jj_3R_111()) return true;\r
     return false;\r
   }\r
 \r
@@ -5399,6 +5400,11 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
+  private boolean jj_3R_109() {\r
+    if (jj_scan_token(26)) return true;\r
+    return false;\r
+  }\r
+\r
   private boolean jj_3R_106() {\r
     if (jj_scan_token(7)) return true;\r
     return false;\r
@@ -5438,13 +5444,13 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_108() {\r
-    if (jj_scan_token(26)) return true;\r
+  private boolean jj_3R_105() {\r
+    if (jj_scan_token(34)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_105() {\r
-    if (jj_scan_token(34)) return true;\r
+  private boolean jj_3R_108() {\r
+    if (jj_scan_token(37)) return true;\r
     return false;\r
   }\r
 \r
@@ -5467,10 +5473,10 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     jj_scanpos = xsp;\r
     if (jj_scan_token(38)) {\r
     jj_scanpos = xsp;\r
-    if (jj_scan_token(37)) {\r
-    jj_scanpos = xsp;\r
     if (jj_3R_108()) {\r
     jj_scanpos = xsp;\r
+    if (jj_3R_109()) {\r
+    jj_scanpos = xsp;\r
     if (jj_scan_token(17)) {\r
     jj_scanpos = xsp;\r
     if (jj_scan_token(95)) {\r
@@ -5531,7 +5537,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_173() {\r
+  private boolean jj_3R_174() {\r
     if (jj_3R_47()) return true;\r
     return false;\r
   }\r
@@ -5563,7 +5569,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_162() {\r
+  private boolean jj_3R_163() {\r
     if (jj_scan_token(68)) return true;\r
     if (jj_scan_token(IDENT)) return true;\r
     return false;\r
@@ -5601,7 +5607,7 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_126() {\r
+  private boolean jj_3R_127() {\r
     if (jj_scan_token(77)) return true;\r
     return false;\r
   }\r
@@ -5619,28 +5625,28 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_172() {\r
+  private boolean jj_3R_173() {\r
     if (jj_scan_token(69)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_168() {\r
+  private boolean jj_3R_169() {\r
     if (jj_scan_token(71)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_170() {\r
+  private boolean jj_3R_171() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_172()) {\r
+    if (jj_3R_173()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_173()) return true;\r
+    if (jj_3R_174()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_161() {\r
-    if (jj_3R_167()) return true;\r
+  private boolean jj_3R_162() {\r
+    if (jj_3R_168()) return true;\r
     return false;\r
   }\r
 \r
@@ -5659,50 +5665,50 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_167() {\r
+  private boolean jj_3R_168() {\r
     if (jj_scan_token(66)) return true;\r
-    if (jj_3R_170()) return true;\r
+    if (jj_3R_171()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_125() {\r
+  private boolean jj_3R_126() {\r
     if (jj_scan_token(76)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_163() {\r
+  private boolean jj_3R_164() {\r
     if (jj_3R_47()) return true;\r
     Token xsp;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_168()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_169()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_174() {\r
+  private boolean jj_3R_175() {\r
     if (jj_scan_token(IDENT)) return true;\r
     if (jj_scan_token(88)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_160() {\r
+  private boolean jj_3R_161() {\r
     if (jj_scan_token(46)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_171() {\r
-    if (jj_3R_174()) return true;\r
+  private boolean jj_3R_172() {\r
+    if (jj_3R_175()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_151() {\r
+  private boolean jj_3R_152() {\r
     if (jj_scan_token(85)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_169() {\r
-    if (jj_3R_171()) return true;\r
+  private boolean jj_3R_170() {\r
+    if (jj_3R_172()) return true;\r
     return false;\r
   }\r
 \r
@@ -5714,18 +5720,18 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo
     return false;\r
   }\r
 \r
-  private boolean jj_3R_165() {\r
+  private boolean jj_3R_166() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_3_10()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_169()) return true;\r
+    if (jj_3R_170()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_166() {\r
-    if (jj_3R_165()) return true;\r
+  private boolean jj_3R_167() {\r
+    if (jj_3R_166()) return true;\r
     return false;\r
   }\r
 \r
index 839340c836286c052a48fc95e8e18be3c3ed53f8..6c8fb79101ced0ee43ef8a08b1a344422cc4baee 100644 (file)
@@ -193,7 +193,7 @@ void class_definition() : {/*@bgen(jjtree) class_definition */
     ( "encapsulated" )?\r
     ( "partial" )?\r
     ( "class" { jjtn000.op = "class"; } | "model" { jjtn000.op = "model"; } | "record" | "block" | ( "expandable" )? "connector" | "type" |\r
-    "package" | "function" { jjtn000.op = "function"; } | "operator" | "operator function" | "operator record" )\r
+    "package" { jjtn000.op = "package"; } | "function" { jjtn000.op = "function"; } | "operator" | "operator function" | "operator record" )\r
     class_specifier()/*@bgen(jjtree)*/\r
     } catch (Throwable jjte000) {\r
       if (jjtc000) {\r
index c65900fd944a24e1ddbb7c09040be32c1f0d2826..977d83d7ce37f61b67ec5204c1041c8ec5ac6628 100644 (file)
@@ -121,7 +121,7 @@ void class_definition() : {
     ( "encapsulated" )?\r
     ( "partial" )?\r
     ( "class" { jjtThis.op = "class"; } | "model" { jjtThis.op = "model"; } | "record" | "block" | ( "expandable" )? "connector" | "type" |\r
-    "package" | "function" { jjtThis.op = "function"; } | "operator" | "operator function" | "operator record" )\r
+    "package" { jjtThis.op = "package"; } | "function" { jjtThis.op = "function"; } | "operator" | "operator function" | "operator record" )\r
     class_specifier()\r
 }\r
 \r
index 12e7ef77425a5d194c3d4fbcfc5e81ca4caf3173..b75a31c8ab9562f15469bfb10cb2bf6a863902f0 100644 (file)
@@ -105,4 +105,5 @@ importJava "org.simantics.sysdyn.manager.SysdynExperiments" where
     applyIC :: Variable -> String -> <WriteGraph> ()\r
     deleteIC :: Variable -> String -> <WriteGraph> ()\r
 \r
+    setPublishResults :: Variable -> Boolean -> <ReadGraph> ()\r
     
\ No newline at end of file
index 326e8cbe52702437ad9c2b18221c1ad08eefd1f1..123bede42a2d53a15fcbabc7c0def4b9f5a0f979 100644 (file)
@@ -86,6 +86,8 @@ public class OldSysdynExperiment extends SysdynExperiment {
     protected static String                         omcHome = null;\r
 \r
     public static OldSysdynExperiment                                  INSTANCE;\r
+       \r
+       boolean publishResults = true;\r
 \r
     public OldSysdynExperiment(Resource experiment, Resource model) {\r
         super(experiment, model);\r
@@ -157,8 +159,10 @@ public class OldSysdynExperiment extends SysdynExperiment {
             @Override\r
             public void run() {\r
                 if(!canceled) {\r
-                    // Get and store results\r                    result.saveToFile(file, progressMonitor);\r
-                }\r            }\r
+                    // Get and store results\r
+                    result.saveToFile(file, progressMonitor);\r
+                }\r
+            }\r
         };\r
     }\r
     \r
@@ -822,6 +826,11 @@ public class OldSysdynExperiment extends SysdynExperiment {
     public void resultsChanged() {\r
        resultsChanged(false);\r
     }\r
+    \r
+    public void setPublishResults(boolean value) {\r
+       publishResults = value;\r
+       if(publishResults) resultsChanged(true);\r
+    }\r
 \r
     public void resultsChanged(boolean force) {\r
         long time = System.nanoTime();\r
@@ -841,6 +850,7 @@ public class OldSysdynExperiment extends SysdynExperiment {
      */\r
     @Override\r
     public void updateSubscriptions() {\r
+       if(!publishResults) return;\r
         for(VariableValueSubscription subscription : getListenerSnapshot())\r
             subscription.update();\r
         skippedVariableUpdate = false;\r
index 78d7902c86be3c7bd289a5d91347dafa52dad4c7..aaa959a5960c27a3921ebb800a5a1843c4450a6d 100644 (file)
@@ -35,6 +35,22 @@ import org.simantics.utils.DataContainer;
 \r
 public class SysdynExperiments {\r
 \r
+       public static void setPublishResults(ReadGraph graph, Variable variable, boolean value) throws DatabaseException {\r
+\r
+        final IProject project = Simantics.getProject();\r
+        if (project == null) return;\r
+\r
+        final IExperimentManager experimentManager = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER);\r
+        if(experimentManager == null) return;\r
+        \r
+        IExperiment exp = experimentManager.getExperiment(variable.getName(graph));\r
+        if(exp instanceof OldSysdynExperiment) {\r
+               OldSysdynExperiment experiment = (OldSysdynExperiment)exp;\r
+               experiment.setPublishResults(value);\r
+        }\r
+\r
+       }\r
+       \r
     public static String activateExperiment(IProgressMonitor monitor, final IProject project, final IExperimentManager manager, final Resource experimentResource) {\r
        \r
        if(monitor == null) monitor = new NullProgressMonitor();\r
index 6835e191eb061b9a06a78ddb85c9d37882ac2f42..e7cd7bf152d82444d40581e567057b5a1996c8b2 100644 (file)
@@ -197,6 +197,7 @@ public class InternalSolver implements ISolver {
        \r
        @Override\r
        public void prepareToStep() throws Exception {\r
+               solver.aboutToRun();\r
        }\r
        \r
        @Override\r