def test_inheritance(self): with open(os.path.join(TEST_DIR, 'InheritanceInstantiation.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) flat_tree = tree.flatten(ast_tree, 'C2') self.assertEqual(flat_tree.classes['C2'].symbols['bcomp.b'].value.value, 3.0)
def test_inheritance_symbol_modifiers(self): with open(os.path.join(MODEL_DIR, 'Inheritance.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='Sub')) self.assertEqual(flat_tree.classes['Sub'].symbols['x'].max.value, 30.0)
def test_extends_modification(self): with open(os.path.join(MODEL_DIR, 'ExtendsModification.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='MainModel')) self.assertEqual(flat_tree.classes['MainModel'].symbols['e.HQ.H'].min.name, "e.H_b")
def test_function_pull(self): with open(os.path.join(MODEL_DIR, 'FunctionPull.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'Level1.Level2.Level3.Function5' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) # Check if all referenced functions are pulled in self.assertIn('Level1.Level2.Level3.f', flat_tree.classes) self.assertIn('Level1.Level2.Level3.TestPackage.times2', flat_tree.classes) self.assertIn('Level1.Level2.Level3.TestPackage.square', flat_tree.classes) self.assertNotIn('Level1.Level2.Level3.TestPackage.not_called', flat_tree.classes) # Check if the classes in the flattened tree have the right type self.assertEqual(flat_tree.classes['Function5'].type, 'model') self.assertEqual(flat_tree.classes['Level1.Level2.Level3.f'].type, 'function') self.assertEqual(flat_tree.classes['Level1.Level2.Level3.TestPackage.times2'].type, 'function') self.assertEqual(flat_tree.classes['Level1.Level2.Level3.TestPackage.square'].type, 'function') # Check whether input/output information of functions comes along properly func_t2 = flat_tree.classes['Level1.Level2.Level3.TestPackage.times2'] self.assertIn("input", func_t2.symbols['x'].prefixes) self.assertIn("output", func_t2.symbols['y'].prefixes) # Check if built-in function call statement comes along properly func_f = flat_tree.classes['Level1.Level2.Level3.f'] self.assertEqual(func_f.statements[0].right.operator, '*') # Check if user-specified function call statement comes along properly self.assertEqual(func_f.statements[0].right.operands[0].operator, 'Level1.Level2.Level3.TestPackage.times2')
def test_nested_classes(self): with open(os.path.join(MODEL_DIR, 'NestedClasses.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='C2')) self.assertEqual(flat_tree.classes['C2'].symbols['v1'].nominal.value, 1000.0) self.assertEqual(flat_tree.classes['C2'].symbols['v2'].nominal.value, 1000.0)
def test_estimator(self): with open(os.path.join(MODEL_DIR, './Estimator.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) print('AST TREE\n', ast_tree) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='Estimator')) print('AST TREE FLAT\n', flat_tree) self.flush()
def test_spring_system(self): with open(os.path.join(MODEL_DIR, 'SpringSystem.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) print('AST TREE\n', ast_tree) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='SpringSystem')) print('AST TREE FLAT\n', flat_tree) self.flush()
def test_aircraft(self): with open(os.path.join(TEST_DIR, 'Aircraft.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) print('AST TREE\n', ast_tree) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='Aircraft')) print('AST TREE FLAT\n', flat_tree) self.flush()
def test_duplicate_state(self): with open(os.path.join(MODEL_DIR, 'DuplicateState.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) print('AST TREE\n', ast_tree) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='DuplicateState')) print('AST TREE FLAT\n', flat_tree) self.flush()
def test_spring(self): with open(os.path.join(TEST_DIR, 'Spring.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) print('AST TREE\n', ast_tree) flat_tree = tree.flatten(ast_tree, 'Spring') print('AST TREE FLAT\n', flat_tree) self.flush()
def test_inheritance(self): with open(os.path.join(MODEL_DIR, 'InheritanceInstantiation.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='C2')) self.assertEqual(flat_tree.classes['C2'].symbols['bcomp1.b'].value.value, 3.0) self.assertEqual(flat_tree.classes['C2'].symbols['bcomp3.a'].value.value, 1.0) self.assertEqual(flat_tree.classes['C2'].symbols['bcomp3.b'].value.value, 2.0)
def test_bouncing_ball(self): with open(os.path.join(MODEL_DIR, 'BouncingBall.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) print('AST TREE\n', ast_tree) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='BouncingBall')) print(flat_tree) print('AST TREE FLAT\n', flat_tree) self.flush()
def test_nested_symbol_modification(self): with open(os.path.join(MODEL_DIR, 'NestedSymbolModification.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'E' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertEqual(flat_tree.classes['E'].symbols['c.x'].nominal.value, 2.0)
def test_parameter_modification_scope(self): with open(os.path.join(MODEL_DIR, 'ParameterScope.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'ScopeTest' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertEqual(flat_tree.classes['ScopeTest'].symbols['nc.p'].value.name, 'p')
def test_extends_order(self): with open(os.path.join(MODEL_DIR, 'ExtendsOrder.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'P.M' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertEqual(flat_tree.classes['M'].symbols['at.m'].value.value, 0.0)
def test_redeclare_in_extends(self): with open(os.path.join(MODEL_DIR, 'RedeclareInExtends.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'ChannelZ' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertIn('down.Z', flat_tree.classes['ChannelZ'].symbols)
def test_redeclaration_scope(self): with open(os.path.join(TEST_DIR, 'RedeclarationScope.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'ChannelZ' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertIn('c.up.Z', flat_tree.classes['ChannelZ'].symbols) self.assertIn('c.down.A', flat_tree.classes['ChannelZ'].symbols)
def test_constant_references(self): with open(os.path.join(MODEL_DIR, 'ConstantReferences.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'b' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertEqual(flat_tree.classes['b'].symbols['m.p'].value.value, 2.0) self.assertEqual(flat_tree.classes['b'].symbols['M2.m.f'].value.value, 3.0)
def test_extends_redeclareable(self): with open(os.path.join(MODEL_DIR, 'ExtendsRedeclareable.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) class_name = 'E' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) self.assertIn('z.y', flat_tree.classes['E'].symbols) self.assertEqual(flat_tree.classes['E'].symbols['z.y'].nominal.value, 2.0)
def generate(ast_tree: ast.Tree, model_name: str): """ :param ast_tree: AST to generate from :param model_name: class to generate :return: sympy source code for model """ component_ref = ast.ComponentRef.from_string(model_name) ast_tree_new = copy.deepcopy(ast_tree) ast_walker = TreeWalker() flat_tree = flatten(ast_tree_new, component_ref) sympy_gen = SympyGenerator() ast_walker.walk(sympy_gen, flat_tree) return sympy_gen.src[flat_tree]
def generate(ast_tree: ast.Tree, model_name: str, options: Dict[str, bool] = {}) -> Model: """ :param ast_tree: AST to generate from :param model_name: class to generate :param options: dictionary of generator options :return: casadi model """ component_ref = ast.ComponentRef.from_string(model_name) ast_walker = TreeWalker() flat_tree = flatten(ast_tree, component_ref) component_ref_tuple = component_ref.to_tuple() casadi_gen = Generator(flat_tree, component_ref_tuple[-1], options) ast_walker.walk(casadi_gen, flat_tree) return casadi_gen.model
def test_spring(self): with open(os.path.join(TEST_DIR, 'SpringSystem.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='SpringSystem')) print(flat_tree) text = gen_sympy.generate(ast_tree, 'SpringSystem') with open(os.path.join(TEST_DIR, 'generated/Spring.py'), 'w') as f: f.write(text) from test.generated.Spring import SpringSystem as SpringSystem e = SpringSystem() e.linearize_symbolic() e.linearize() # noinspection PyUnusedLocal res = e.simulate(x0=[1.0, 1.0]) self.flush()
def test_tree_lookup(self): with open(os.path.join(MODEL_DIR, 'TreeLookup.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) # The class we want to flatten. We first have to turn it into a # full-fledged ComponentRef. class_name = 'Level1.Level2.Level3.Test' comp_ref = ast.ComponentRef.from_string(class_name) flat_tree = tree.flatten(ast_tree, comp_ref) # NOTE: We currently do not flatten the component ref in the final # tree's keys, so we use it once again to lookup the flattened class. self.assertIn('elem.tc.i', flat_tree.classes['Test'].symbols.keys()) self.assertIn('elem.tc.a', flat_tree.classes['Test'].symbols.keys()) self.assertIn('b', flat_tree.classes['Test'].symbols.keys())
def test_connector(self): with open(os.path.join(TEST_DIR, 'Connector.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) # print(ast_tree) # noinspection PyUnusedLocal flat_tree = tree.flatten(ast_tree, ast.ComponentRef(name='Aircraft')) # print(flat_tree) # noinspection PyUnusedLocal walker = tree.TreeWalker() # noinspection PyUnusedLocal classes = ast_tree.classes # noinspection PyUnusedLocal root = ast_tree.classes['Aircraft'] # instantiator = tree.Instantiator(classes=classes) # walker.walk(instantiator, root) # print(instantiator.res[root].symbols.keys()) # print(instantiator.res[root]) # print('INSTANTIATOR\n-----------\n\n') # print(instantiator.res[root]) # connectExpander = tree.ConnectExpander(classes=classes) # walker.walk(connectExpander, instantiator.res[root]) # print('CONNECT EXPANDER\n-----------\n\n') # print(connectExpander.new_class) # text = gen_sympy.generate(ast_tree, 'Aircraft') # print(text) # with open(os.path.join(TEST_DIR, 'generated/Connect.py'), 'w') as f: # f.write(text) # from generated.Connect import Aircraft as Aircraft # e = Aircraft() # res = e.simulate() self.flush()
def test_connector(self): with open(os.path.join(TEST_DIR, "Connector.mo"), "r") as f: txt = f.read() ast_tree = parser.parse(txt) # print(ast_tree) flat_tree = tree.flatten(ast_tree, "Aircraft") # print(flat_tree) walker = tree.TreeWalker() classes = ast_tree.classes root = ast_tree.classes["Aircraft"] instantiator = tree.Instatiator(classes=classes) walker.walk(instantiator, root) print(instantiator.res[root].symbols.keys()) print(instantiator.res[root]) # print('INSTANTIATOR\n-----------\n\n') # print(instantiator.res[root]) # connectExpander = tree.ConnectExpander(classes=classes) # walker.walk(connectExpander, instantiator.res[root]) # print('CONNECT EXPANDER\n-----------\n\n') # print(connectExpander.new_class) # text = gen_sympy.generate(ast_tree, 'Aircraft') # print(text) # with open(os.path.join(TEST_DIR, 'generated/Connect.py'), 'w') as f: # f.write(text) # from generated.Connect import Aircraft as Aircraft # e = Aircraft() # res = e.simulate() self.flush()
if options.flatten_only: # Load folder _ast = None for root, dir, files in os.walk(model_folder, followlinks=True): for item in fnmatch.filter(files, "*.mo"): logger.info("Parsing {}".format(item)) with open(os.path.join(root, item), 'r') as f: if _ast is None: _ast = parser.parse(f.read()) else: _ast.extend(parser.parse(f.read())) logger.info("Flattening") _ast = tree.flatten(_ast, ast.ComponentRef.from_string(model_name)) print(_ast) else: # Set CasADi installation folder if options.casadi_folder is not None: sys.path.append(options.casadi_folder) from pymola.backends.casadi.api import transfer_model import casadi as ca logger.info("Generating CasADi model") compiler_options = \ {'replace_constants': True, 'replace_parameter_expressions': True, 'eliminable_variable_expression': r'_\w+',