def test_caching(self): # Clear cache db_file = os.path.join(TEST_DIR, 'Aircraft') try: os.remove(db_file) except: pass for f in glob.glob(os.path.join(TEST_DIR, "Aircraft*.so")): os.remove(f) for f in glob.glob(os.path.join(TEST_DIR, "Aircraft*.dll")): os.remove(f) for f in glob.glob(os.path.join(TEST_DIR, "Aircraft*.dylib")): os.remove(f) # Create model, cache it, and load the cache compiler_options = \ {'cache': True} ref_model = transfer_model(TEST_DIR, 'Aircraft', compiler_options) self.assertIsInstance(ref_model, Model) self.assertNotIsInstance(ref_model, CachedModel) cached_model = transfer_model(TEST_DIR, 'Aircraft', compiler_options) self.assertIsInstance(cached_model, Model) self.assertIsInstance(cached_model, CachedModel) # Compare self.assert_model_equivalent_numeric(ref_model, cached_model)
def test_inline_input_assignment(self): casadi_model = transfer_model(TEST_DIR, 'InlineAssignment') self.assertTrue(casadi_model.inputs[0].fixed) self.assertFalse(casadi_model.alg_states[0].fixed) casadi_model = transfer_model(TEST_DIR, 'InlineAssignment', {'detect_aliases': True}) self.assertTrue(casadi_model.inputs[0].fixed)
def test_simplify_detect_negative_alias(self): # Create model, cache it, and load the cache compiler_options = \ {'detect_aliases': True} casadi_model = transfer_model(TEST_DIR, 'NegativeAlias', compiler_options) ref_model = Model() x = ca.MX.sym('x') der_x = ca.MX.sym('der(x)') ref_model.states = list(map(Variable, [x])) ref_model.states[0].min = 1 ref_model.states[0].max = 2 ref_model.states[0].nominal = 10 ref_model.der_states = list(map(Variable, [der_x])) ref_model.alg_states = list(map(Variable, [])) ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) ref_model.equations = [der_x - x] # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model) self.assertEquals(casadi_model.states[0].aliases, ['-alias'])
def test_simplify_all(self): # Create model, cache it, and load the cache compiler_options = \ {'expand_vectors': True, 'replace_constant_values': True, 'replace_constant_expressions': True, 'replace_parameter_values': True, 'replace_parameter_expressions': True, 'eliminate_constant_assignments': True, 'detect_aliases': True, 'eliminable_variable_expression': r'_\w+', 'reduce_affine_expression': True} casadi_model = transfer_model(TEST_DIR, 'Simplify', compiler_options) ref_model = Model() p3 = ca.MX.sym('p3') x = ca.MX.sym('x') der_x = ca.MX.sym('der(x)') y = ca.MX.sym('y') ref_model.states = list(map(Variable, [x])) ref_model.states[0].min = 1 ref_model.states[0].max = 2 ref_model.states[0].nominal = 10 ref_model.der_states = list(map(Variable, [der_x])) ref_model.alg_states = list(map(Variable, [y])) ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) ref_model.constants = list(map(Variable, [])) constant_values = [] for _cst, v in zip(ref_model.constants, constant_values): _cst.value = v ref_model.parameters = list(map(Variable, [p3])) parameter_values = [np.nan] for par, v in zip(ref_model.parameters, parameter_values): par.value = v A = ca.MX(2, 3) A[0, 0] = -1.0 A[0, 1] = 1.0 A[1, 0] = -1.1 A[1, 2] = 1.0 b = ca.MX(2, 1) b[0] = -6 - 3 * p3 b[1] = -7 x = ca.vertcat(x, der_x, y) ref_model.equations = [ca.mtimes(A, x) + b] # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model)
def test_simplify_eliminate_constant_assignments(self): # Create model, cache it, and load the cache compiler_options = \ {'eliminate_constant_assignments': True} casadi_model = transfer_model(TEST_DIR, 'Simplify', compiler_options) ref_model = Model() c = ca.MX.sym('c') p1 = ca.MX.sym('p1') p2 = ca.MX.sym('p2') p3 = ca.MX.sym('p3') p4 = ca.MX.sym('p4') x = ca.MX.sym('x') der_x = ca.MX.sym('der(x)') alias = ca.MX.sym('alias') y = ca.MX.sym('y') _tmp = ca.MX.sym('_tmp') cst = ca.MX.sym('cst') ref_model.states = list(map(Variable, [x])) ref_model.states[0].min = 0 ref_model.states[0].max = 3 ref_model.states[0].nominal = 10 ref_model.der_states = list(map(Variable, [der_x])) ref_model.alg_states = list(map(Variable, [alias, y, _tmp])) ref_model.alg_states[0].min = 1 ref_model.alg_states[0].max = 2 ref_model.alg_states[0].nominal = 1 ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) ref_model.constants = list(map(Variable, [c, cst])) constant_values = [3, 4] for _cst, v in zip(ref_model.constants, constant_values): _cst.value = v ref_model.parameters = list(map(Variable, [p1, p2, p3, p4])) parameter_values = [2.0, 2 * p1, np.nan, 2 * p3] for par, v in zip(ref_model.parameters, parameter_values): par.value = v ref_model.equations = [ der_x - x - p1 - p2 - p3 - p4, alias - x, y - x - c - _tmp - cst, _tmp - 0.1 * x ] # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model)
def test_simplify_replace_parameter_values_and_expressions(self): # Create model, cache it, and load the cache compiler_options = \ {'replace_parameter_values': True, 'replace_parameter_expressions': True} casadi_model = transfer_model(TEST_DIR, 'Simplify', compiler_options) ref_model = Model() c = ca.MX.sym('c') p3 = ca.MX.sym('p3') x = ca.MX.sym('x') der_x = ca.MX.sym('der(x)') alias = ca.MX.sym('alias') y = ca.MX.sym('y') _tmp = ca.MX.sym('_tmp') cst = ca.MX.sym('cst') ref_model.states = list(map(Variable, [x])) ref_model.states[0].min = 0 ref_model.states[0].max = 3 ref_model.states[0].nominal = 10 ref_model.der_states = list(map(Variable, [der_x])) ref_model.alg_states = list(map(Variable, [alias, y, _tmp, cst])) ref_model.alg_states[0].min = 1 ref_model.alg_states[0].max = 2 ref_model.alg_states[0].nominal = 1 ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) ref_model.constants = list(map(Variable, [c])) constant_values = [3] for _cst, v in zip(ref_model.constants, constant_values): _cst.value = v ref_model.parameters = list(map(Variable, [p3])) parameter_values = [np.nan] for par, v in zip(ref_model.parameters, parameter_values): par.value = v ref_model.equations = [ der_x - x - 6 - 3 * p3, alias - x, y - x - c - _tmp - cst, _tmp - 0.1 * x, cst - 4 ] print(casadi_model) print(ref_model) # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model)
def test_simplify_reduce_affine_expression_loop(self): # Create model, cache it, and load the cache compiler_options = \ {'expand_vectors': True, 'detect_aliases': True, 'reduce_affine_expression': True, 'replace_constant_expressions': True, 'replace_constant_values': True, 'replace_parameter_expressions': True, 'replace_parameter_values': True} casadi_model = transfer_model(TEST_DIR, 'SimplifyLoop', compiler_options) ref_model = Model() x = ca.MX.sym('x') y0 = ca.MX.sym('y[0]') y1 = ca.MX.sym('y[1]') A = ca.MX(2, 3) A[0, 0] = -1 A[0, 1] = 1 A[0, 2] = 0 A[1, 0] = -2 A[1, 1] = 0 A[1, 2] = 1 b = ca.MX(2, 1) b[0, 0] = 0 b[1, 0] = 0 ref_model.states = list(map(Variable, [])) ref_model.der_states = list(map(Variable, [])) ref_model.alg_states = list(map(Variable, [x, y0, y1])) ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) x = ca.vertcat(x, y0, y1) ref_model.equations = [ca.mtimes(A, x) + b] # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model)
def test_simplify_expand_vectors(self): # Create model, cache it, and load the cache compiler_options = \ {'expand_vectors': True} casadi_model = transfer_model(TEST_DIR, 'SimplifyVector', compiler_options) ref_model = Model() x0 = ca.MX.sym('x[0]') x1 = ca.MX.sym('x[1]') der_x0 = ca.MX.sym('der(x)[0]') der_x1 = ca.MX.sym('der(x)[1]') ref_model.states = list(map(Variable, [x0, x1])) ref_model.der_states = list(map(Variable, [der_x0, der_x1])) ref_model.alg_states = list(map(Variable, [])) ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) ref_model.equations = [der_x0 - x0, der_x1 - x1] # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model)
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+', 'detect_aliases': True, 'expand': False, 'cache': True} model = transfer_model(model_folder, model_name, compiler_options) print(model)
def test_cat_params(self): casadi_model = transfer_model(TEST_DIR, 'Concat', {'replace_constant_values': True}) c = [0, 1, 2, 2, 2, 0, 1] for i, e in enumerate(c): self.assertEqual(casadi_model.parameters[1].value[i], e)
def test_simplify_reduce_affine_expression(self): # Create model, cache it, and load the cache compiler_options = \ {'reduce_affine_expression': True} casadi_model = transfer_model(TEST_DIR, 'Simplify', compiler_options) ref_model = Model() c = ca.MX.sym('c') p1 = ca.MX.sym('p1') p2 = ca.MX.sym('p2') p3 = ca.MX.sym('p3') p4 = ca.MX.sym('p4') x = ca.MX.sym('x') der_x = ca.MX.sym('der(x)') alias = ca.MX.sym('alias') y = ca.MX.sym('y') _tmp = ca.MX.sym('_tmp') cst = ca.MX.sym('cst') ref_model.states = list(map(Variable, [x])) ref_model.states[0].min = 0 ref_model.states[0].max = 3 ref_model.states[0].nominal = 10 ref_model.der_states = list(map(Variable, [der_x])) ref_model.alg_states = list(map(Variable, [alias, y, _tmp, cst])) ref_model.alg_states[0].min = 1 ref_model.alg_states[0].max = 2 ref_model.alg_states[0].nominal = 1 ref_model.inputs = list(map(Variable, [])) ref_model.outputs = list(map(Variable, [])) ref_model.constants = list(map(Variable, [c])) constant_values = [3] for _cst, v in zip(ref_model.constants, constant_values): _cst.value = v ref_model.parameters = list(map(Variable, [p1, p2, p3, p4])) parameter_values = [2.0, 2 * p1, np.nan, 2 * p3] for par, v in zip(ref_model.parameters, parameter_values): par.value = v A = ca.MX(5, 6) A[0, 0] = -1.0 A[0, 1] = 1.0 A[1, 2] = 1.0 A[1, 0] = -1.0 A[2, 0] = -1.0 A[2, 3] = 1.0 A[2, 4] = -1.0 A[2, 5] = -1.0 A[3, 0] = -0.1 A[3, 4] = 1.0 A[4, 5] = 1.0 b = ca.MX(5, 1) b[0] = -p1 - p2 - p3 - p4 b[2] = -c b[4] = -4 x = ca.vertcat(x, der_x, alias, y, _tmp, cst) ref_model.equations = [ca.mtimes(A, x) + b] # Compare self.assert_model_equivalent_numeric(casadi_model, ref_model)