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_forloop(self): with open(os.path.join(TEST_DIR, 'ForLoop.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) casadi_model = gen_casadi.generate(ast_tree, 'ForLoop') print(casadi_model) ref_model = Model() x = ca.MX.sym("x", 10) y = ca.MX.sym("y", 10) z = ca.MX.sym("z", 10) u = ca.MX.sym('u', 10, 2) v = ca.MX.sym('v', 2, 10) w = ca.MX.sym('w', 2, 10) b = ca.MX.sym("b") n = ca.MX.sym("n") s = ca.MX.sym('s', 10) Arr = ca.MX.sym('Arr', 2, 2) der_s = ca.MX.sym('der(s)', 10) ref_model.states = list(map(Variable, [s])) ref_model.der_states = list(map(Variable, [der_s])) ref_model.alg_states = list(map(Variable, [x, y, z, u, v, w, b, Arr])) ref_model.parameters = list(map(Variable, [n])) ref_model.parameters[0].value = 10 ref_model.equations = [ ca.horzcat(x - (np.arange(1, 11) + b), w[0, :].T - np.arange(1, 11), w[1, :].T - np.arange(2, 21, 2), u - np.ones( (10, 2)), v.T - np.ones((10, 2))), y[0:5] - np.zeros(5), y[5:] - np.ones(5), ca.horzcat(z[0:5] - np.array([2, 2, 2, 2, 2]), z[5:10] - np.array([1, 1, 1, 1, 1])), der_s - np.ones(10), ca.horzcat(Arr[:, 1], Arr[:, 0]) - np.array([[2, 1], [2, 1]]) ] self.assert_model_equivalent_numeric(ref_model, casadi_model)
def test_inheritance(self): with open(os.path.join(TEST_DIR, 'Inheritance.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) casadi_model = gen_casadi.generate(ast_tree, 'Sub') ref_model = Model() x = ca.MX.sym("x") der_x = ca.MX.sym("der(x)") y = ca.MX.sym("y") # noinspection PyUnusedLocal der_y = ca.MX.sym("y") k = ca.MX.sym("k") ref_model.states = list(map(Variable, [x])) ref_model.states[0].max = 30.0 ref_model.der_states = list(map(Variable, [der_x])) ref_model.alg_states = list(map(Variable, [y])) ref_model.parameters = list(map(Variable, [k])) ref_model.parameters[0].value = -1.0 ref_model.equations = [der_x - k * x, x + y - 3] self.assert_model_equivalent_numeric(ref_model, casadi_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)
def test_inheritance_instantiation(self): with open(os.path.join(TEST_DIR, 'InheritanceInstantiation.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) casadi_model = gen_casadi.generate(ast_tree, 'C2') ref_model = Model() print(casadi_model) bcomp1_a = ca.MX.sym('bcomp1.a') bcomp1_b = ca.MX.sym('bcomp1.b') bcomp2_a = ca.MX.sym('bcomp2.a') bcomp2_b = ca.MX.sym('bcomp2.b') bcomp3_a = ca.MX.sym('bcomp3.a') bcomp3_b = ca.MX.sym('bcomp3.b') bcomp1_v = ca.MX.sym('bcomp1.v', 3) bcomp2_v = ca.MX.sym('bcomp2.v', 4) bcomp3_v = ca.MX.sym('bcomp3.v', 2) ref_model.states = [] ref_model.der_states = [] ref_model.alg_states = list( map(Variable, [bcomp1_v, bcomp2_v, bcomp3_v])) ref_model.parameters = list( map(Variable, [bcomp1_a, bcomp2_a, bcomp3_a, bcomp1_b, bcomp2_b, bcomp3_b])) ref_model.parameters[0].value = 0 ref_model.parameters[1].value = 0 ref_model.parameters[2].value = 1 ref_model.parameters[3].value = 3 ref_model.parameters[4].value = 4 ref_model.parameters[5].value = 2 ref_model.equations = [] self.assert_model_equivalent_numeric(ref_model, casadi_model)
def test_state_annotator(self): with open(os.path.join(TEST_DIR, 'StateAnnotator.mo'), 'r') as f: txt = f.read() ast_tree = parser.parse(txt) casadi_model = gen_casadi.generate(ast_tree, 'StateAnnotator') print(casadi_model) ref_model = Model() x = ca.MX.sym('x') y = ca.MX.sym('y') z = ca.MX.sym('z') der_x = ca.MX.sym('der(x)') der_y = ca.MX.sym('der(y)') der_z = ca.MX.sym('der(z)') ref_model.states = list(map(Variable, [x, y, z])) ref_model.der_states = list(map(Variable, [der_x, der_y, der_z])) ref_model.equations = [ der_x + der_y - 1, der_x * y + x * der_y - 2, (der_x * y - x * der_y) / (y**2) - 3, 2 * x * der_x - 4, der_z - 5, der_x * z + x * der_z + der_y * z + y * der_z - 4, 0 ] self.assert_model_equivalent_numeric(ref_model, casadi_model)
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)