Browse Source

Added an execute_model script, which adds the model, as well as compiling everything

Yentl Van Tendeloo 9 years ago
parent
commit
d5290f6c8d

+ 1 - 0
integration/code/several_petrinets.mvc

@@ -155,6 +155,7 @@ PetriNets invalid_petrinet_7 {
     }
 }
 
+export PetriNets to models/PetriNets
 export valid_petrinet to models/valid_petrinet
 export invalid_petrinet_1 to models/invalid_petrinet_1
 export invalid_petrinet_2 to models/invalid_petrinet_2

+ 2 - 0
interface/HUTN/hutn_compiler/compiler.py

@@ -144,6 +144,7 @@ def main(input_file, grammar_file, mode, args=[]):
     from constructors_visitor import ConstructorsVisitor
     from constructors_object_visitor import ConstructorsObjectVisitor
     from model_visitor import ModelVisitor
+    from model_object_visitor import ModelObjectVisitor
 
     modes = {
         "N" : [],
@@ -156,6 +157,7 @@ def main(input_file, grammar_file, mode, args=[]):
         "CS" : [SemanticsVisitor, ConstructorsVisitor],
         "CO" : [SemanticsVisitor, ConstructorsObjectVisitor],
         "M" : [ModelVisitor],
+        "MO" : [ModelObjectVisitor],
     }
     return do_compile(input_file, grammar_file, [v(args) for v in modes[mode]])
 

+ 39 - 0
interface/HUTN/hutn_compiler/model_object_visitor.py

@@ -0,0 +1,39 @@
+from model_visitor import ModelVisitor
+from compiler import main as do_compile
+import os
+import urllib2
+import urllib
+import json
+
+def jsonstr(s):
+    return '"%s"' % s
+
+def empty(s):
+    return None
+
+class ModelObjectVisitor(ModelVisitor):
+    def __init__(self, args):
+        ModelVisitor.__init__(self, args)
+        self.username = args[0]
+        self.obj_file = args[1]
+        self.real_file = args[2]
+        self.address = args[3]
+
+    def dump(self):
+        v = ModelVisitor.dump(self)
+        data = []
+        data.append(["V", '4'])
+        for i in v:
+            data.append(["V", i])
+        data.append(["V", '"exit"'])
+
+        # Wait for kernel to signal that it finished
+        data.append(["V", '2'])
+
+        urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": self.username}))).read()
+        v = urllib2.urlopen(urllib2.Request(self.address, urllib.urlencode({"op": "get_output", "username": self.username}))).read()
+        v = v.split("=", 2)[2]
+        if v == "DONE":
+            return True
+        else:
+            return False

+ 54 - 0
scripts/execute_model.py

@@ -0,0 +1,54 @@
+import random
+import sys
+import multiprocessing
+
+from compile import do_compile
+from link_and_load import link_and_load
+
+models = []
+code = []
+
+address = sys.argv[1]
+username = sys.argv[2]
+
+for f in sys.argv[3:]:
+    if f.endswith(".mvc"):
+        models.append(f)
+    elif f.endswith(".alc"):
+        code.append(f)
+    else:
+        print("Unknown file format for file " + f)
+        print("Requires either .mvc or .alc")
+
+def do_compile_wrapper(filename, mode, grammar):
+    do_compile(address, filename, str(random.random()), filename, mode, ["--debug"], grammar=grammar)
+
+def initialize_SCD():
+    import urllib2
+    import urllib
+    import json
+    username = random.random()
+    urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "element_type": "V", "value": '"%s"' % username, "username": "user_manager"}))).read()
+
+    data = []
+    data.append(["V", '4'])
+    data.append(["V", '"initialize_SCD"'])
+    data.append(["V", '"models/SimpleClassDiagrams"'])
+    data.append(["V", '"exit"'])
+    data.append(["V", '2'])
+
+    print("Initializing SCD")
+    urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "username": username}))).read()
+    v = urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "username": username}))).read()
+    print("Initialized!")
+
+for f in models:
+    # Parse all models and upload them
+    initialize_SCD()
+
+    for m in models:
+        do_compile_wrapper(f, "MO", "grammars/modelling.g")
+
+    p = multiprocessing.Pool(multiprocessing.cpu_count() * 2)
+    p.map(lambda i: do_compile_wrapper(i, "PO", grammar="grammars/actionlanguage.g"), code)
+    link_and_load(address, username, code)