def test_non_siso_manipulation(): sys = Alpha(0.1) A, B, C, D = sys.ss SIMO = LinearSystem((A, B, np.eye(len(A)), [[0], [0]])) assert not SIMO.is_SISO assert SIMO.size_in == 1 assert SIMO.size_out == 2 assert SIMO.shape == (2, 1) assert not SIMO.has_passthrough assert ss_equal(_eval(SIMO), SIMO) assert isinstance(str(SIMO), str) assert ss_equal(canonical(SIMO), SIMO) for sub1, sub2 in zip(sys, SIMO): assert ss_equal(sub1, sub2) MISO = LinearSystem((A, [[1, 1]], C, [[0, 1]])) assert not MISO.is_SISO assert MISO.size_in == 2 assert MISO.size_out == 1 assert MISO.shape == (1, 2) assert MISO.has_passthrough assert ss_equal(_eval(MISO), MISO) assert isinstance(str(MISO), str) MIMO = LinearSystem((A, [[1, 1]], np.eye(len(A)), np.zeros((2, 2)))) assert not MIMO.is_SISO assert MIMO.size_in == MIMO.size_out == 2 assert MIMO.shape == (2, 2) assert not MIMO.has_passthrough assert ss_equal(_eval(MIMO), MIMO) assert isinstance(str(MIMO), str) for sub1, sub2 in zip(MISO, MIMO): assert ss_equal(sub1, sub2)
def test_canonical(): sys = ([1], [1], [1], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [1, 0]], [[1], [0]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 1]], [[0], [1]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 1]], [[1], [0]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 0]], [[1], [0]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 0]], [[0], [1]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0, 1], [0, 1, 1], [1, 0, 0]], [[0], [1], [-1]], [[1, 1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = nengo.Alpha(0.1) csys = canonical(sys, controllable=True) osys = canonical(sys, controllable=False) assert ss_equal(csys, LinearSystem(sys).controllable) assert ss_equal(osys, LinearSystem(sys).observable) assert sys_equal(csys, osys) assert not ss_equal(csys, osys) # different state-space realizations A, B, C, D = csys.ss assert sys_equal(csys, sys) assert ss_equal(csys, ([[-20, -100], [1, 0]], [[1], [0]], [[0, 100]], [[0]])) assert sys_equal(osys, sys) assert ss_equal(osys, ([[-20, 1], [-100, 0]], [[0], [100]], [[1, 0]], [[0]]))
def test_canonical(): sys = ([1], [1], [1], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [1, 0]], [[1], [0]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 1]], [[0], [1]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 1]], [[1], [0]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 0]], [[1], [0]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0], [0, 0]], [[0], [1]], [[1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = ([[1, 0, 1], [0, 1, 1], [1, 0, 0]], [[0], [1], [-1]], [[1, 1, 1]], [0]) assert sys_equal(canonical(sys), sys) sys = nengo.Alpha(0.1) csys = canonical(sys, controllable=True) osys = canonical(sys, controllable=False) assert sys_equal(csys, osys) assert not ss_equal(csys, osys) # different state-space realizations A, B, C, D = csys.ss assert sys_equal(csys, sys) assert ss_equal(csys, ([[-20, -100], [1, 0]], [[1], [0]], [[0, 100]], [[0]])) assert sys_equal(osys, sys) assert ss_equal(osys, ([[-20, 1], [-100, 0]], [[0], [100]], [[1, 0]], [[0]]))
def __call__(self, sys, radii=1.0): return scale_state(canonical(sys, controllable=False), radii=radii), {}