(f, g)
| 23 | |
| 24 | |
| 25 | def direct_sum_test_impl(f, g): |
| 26 | dm = dynamics.directSum(f, g) |
| 27 | dd = dm.createData() |
| 28 | print(dd) |
| 29 | space = dm.space_next |
| 30 | print(space) |
| 31 | assert space.num_components == 2 |
| 32 | |
| 33 | x0 = space.rand() |
| 34 | u0 = np.random.randn(dm.nu) |
| 35 | dm.forward(x0, u0, dd) |
| 36 | print(dd.xnext) |
| 37 | |
| 38 | dd1 = f.createData() |
| 39 | dd2 = g.createData() |
| 40 | x01, x02 = space.split(x0).tolist() |
| 41 | u01, u02 = u0[: f.nu], u0[f.nu :] |
| 42 | f.forward(x01, u01, dd1) |
| 43 | g.forward(x02, u02, dd2) |
| 44 | assert np.allclose(dd1.xnext, dd.data1.xnext) |
| 45 | assert np.allclose(dd2.xnext, dd.data2.xnext) |
| 46 | |
| 47 | dm.dForward(x0, u0, dd) |
| 48 | f.dForward(x01, u01, dd1) |
| 49 | g.dForward(x02, u02, dd2) |
| 50 | print(dd.Jx) |
| 51 | print(dd.data1.Jx) |
| 52 | print(dd.data2.Jx) |
| 53 | assert np.allclose(dd1.Jx, dd.data1.Jx) |
| 54 | assert np.allclose(dd1.Ju, dd.data1.Ju) |
| 55 | |
| 56 | assert np.allclose(dd2.Jx, dd.data2.Jx) |
| 57 | assert np.allclose(dd2.Ju, dd.data2.Ju) |
| 58 | |
| 59 | |
| 60 | @pytest.mark.skipif( |
no test coverage detected