def test_conversion_all_funcs(self): x1, x2, x3 = xx = st.symb_vector("x1:4") u1, u2 = uu = st.symb_vector("u1:3") xxuusum = sum(xx) + sum(uu) arg = sp.tanh(xxuusum) # limit the argument to (-1, 1)*0.99 # see mpc.CassadiPrinter.__init__ for exlanation sp_func_names = mpc.CassadiPrinter().cs_func_keys.keys() blacklist = ["atan2", ] flist = [getattr(sp, name) for name in sp_func_names if name not in blacklist] # create the test_matrix expr_list = [] for func in flist: if func is sp.acosh: # only defined for values > 1 expr_list.append(func(1/arg)) else: expr_list.append(func(arg)) expr_sp = sp.Matrix(expr_list + [arg, xxuusum]) func_cs = mpc.create_casadi_func(expr_sp, xx, uu) xxuu = list(xx) + list(uu) func_np = st.expr_to_func(xxuu, expr_sp) argvals = np.random.rand(len(xxuu)) argvals_cs = (argvals[:len(xx)], argvals[len(xx):]) res_np = func_np(*argvals) res_cs = func_cs(*argvals_cs).full().squeeze() self.assertTrue(np.allclose(res_np, res_cs))
def test_conversion1(self): x1, x2, x3 = xx = st.symb_vector("x1:4") u1, u2 = uu = st.symb_vector("u1:3") expr_sp = sp.Matrix([x1 + x2 + x3, sp.sin(x1)*x2**x3, 1.23, 0, u1*sp.exp(u2)]) func_cs = mpc.create_casadi_func(expr_sp, xx, uu) xxuu = list(xx) + list(uu) func_np = st.expr_to_func(xxuu, expr_sp) argvals = np.random.rand(len(xxuu)) argvals_cs = (argvals[:len(xx)], argvals[len(xx):]) res_np = func_np(*argvals) res_cs = func_cs(*argvals_cs).full().squeeze() self.assertTrue(np.allclose(res_np, res_cs))
def test_conversion2(self): x1, x2, x3 = xx = st.symb_vector("x1:4") u1, u2 = uu = st.symb_vector("u1:3") lmd1, lmd2 = llmd = st.symb_vector("lmd1:3") xxuullmd = list(xx) + list(uu) + list(llmd) expr_sp = sp.Matrix([x1 + x2 + x3, sp.sin(x1)*x2**x3, 1.23, 0, u1*sp.exp(u2), x1*lmd1 + lmd2**4]) func_cs = mpc.create_casadi_func(expr_sp, xxuullmd) func_np = st.expr_to_func(xxuullmd, expr_sp) argvals = np.random.rand(len(xxuullmd)) # unpack the array for lambdified function res_np = func_np(*argvals) # pass the whole array for casadi function res_cs = func_cs(argvals).full().squeeze() self.assertTrue(np.allclose(res_np, res_cs))