Skip to content

Commit 45c3abd

Browse files
committed
add conversions for LTI systems in interconnect()
1 parent beb629b commit 45c3abd

2 files changed

Lines changed: 46 additions & 4 deletions

File tree

‎control/iosys.py‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,12 @@ def __init__(self, syslist, connections=[], inplist=[], outlist=[],
894894

895895
# Go through the system list and keep track of counts, offsets
896896
for sysidx, sys in enumerate(syslist):
897+
# If we were passed a SS or TF system, convert to LinearIOSystem
898+
if isinstance(sys, (StateSpace, TransferFunction)) and \
899+
not isinstance(sys, LinearIOSystem):
900+
sys = LinearIOSystem(sys)
901+
syslist[sysidx] = sys
902+
897903
# Make sure time bases are consistent
898904
dt = common_timebase(dt, sys.dt)
899905

@@ -1781,7 +1787,7 @@ def input_output_response(
17811787

17821788
# Update the parameter values
17831789
sys._update_params(params)
1784-
1790+
17851791
#
17861792
# Define a function to evaluate the input at an arbitrary time
17871793
#

‎control/tests/type_conversion_test.py‎

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def sys_dict():
5959
rtype_list = ['ss', 'tf', 'frd', 'lio', 'ios', 'arr', 'flt']
6060
conversion_table = [
6161
# op left ss tf frd lio ios arr flt
62-
('add', 'ss', ['ss', 'ss', 'frd', 'ss', 'ios', 'ss', 'ss' ]),
62+
('add', 'ss', ['ss', 'ss', 'frd', 'lio', 'ios', 'ss', 'ss' ]),
6363
('add', 'tf', ['tf', 'tf', 'frd', 'lio', 'ios', 'tf', 'tf' ]),
6464
('add', 'frd', ['frd', 'frd', 'frd', 'frd', 'E', 'frd', 'frd']),
6565
('add', 'lio', ['lio', 'lio', 'xrd', 'lio', 'ios', 'lio', 'lio']),
@@ -68,7 +68,7 @@ def sys_dict():
6868
('add', 'flt', ['ss', 'tf', 'frd', 'lio', 'ios', 'arr', 'flt']),
6969

7070
# op left ss tf frd lio ios arr flt
71-
('sub', 'ss', ['ss', 'ss', 'frd', 'ss', 'ios', 'ss', 'ss' ]),
71+
('sub', 'ss', ['ss', 'ss', 'frd', 'lio', 'ios', 'ss', 'ss' ]),
7272
('sub', 'tf', ['tf', 'tf', 'frd', 'lio', 'ios', 'tf', 'tf' ]),
7373
('sub', 'frd', ['frd', 'frd', 'frd', 'frd', 'E', 'frd', 'frd']),
7474
('sub', 'lio', ['lio', 'lio', 'xrd', 'lio', 'ios', 'lio', 'lio']),
@@ -77,7 +77,7 @@ def sys_dict():
7777
('sub', 'flt', ['ss', 'tf', 'frd', 'lio', 'ios', 'arr', 'flt']),
7878

7979
# op left ss tf frd lio ios arr flt
80-
('mul', 'ss', ['ss', 'ss', 'frd', 'ss', 'ios', 'ss', 'ss' ]),
80+
('mul', 'ss', ['ss', 'ss', 'frd', 'lio', 'ios', 'ss', 'ss' ]),
8181
('mul', 'tf', ['tf', 'tf', 'frd', 'lio', 'ios', 'tf', 'tf' ]),
8282
('mul', 'frd', ['frd', 'frd', 'frd', 'frd', 'E', 'frd', 'frd']),
8383
('mul', 'lio', ['lio', 'lio', 'xrd', 'lio', 'ios', 'lio', 'lio']),
@@ -191,3 +191,39 @@ def test_binary_op_type_conversions(opname, ltype, rtype, sys_dict):
191191
assert len(result.output_labels) == result.noutputs
192192
if result.nstates is not None:
193193
assert len(result.state_labels) == result.nstates
194+
195+
@pytest.mark.parametrize(
196+
"typelist, connections, inplist, outlist, expected", [
197+
(['lio', 'lio'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'lio'),
198+
(['lio', 'ss'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'lio'),
199+
(['ss', 'lio'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'lio'),
200+
(['ss', 'ss'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'lio'),
201+
(['lio', 'tf'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'lio'),
202+
(['lio', 'frd'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'E'),
203+
(['ios', 'ios'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'ios'),
204+
(['lio', 'ios'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'ios'),
205+
(['ss', 'ios'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'ios'),
206+
(['tf', 'ios'], [[(1, 0), (0, 0)]], [[(0, 0)]], [[(1, 0)]], 'ios'),
207+
(['lio', 'ss', 'tf'],
208+
[[(1, 0), (0, 0)], [(2, 0), (1, 0)]], [[(0, 0)]], [[(2, 0)]], 'lio'),
209+
(['ios', 'ss', 'tf'],
210+
[[(1, 0), (0, 0)], [(2, 0), (1, 0)]], [[(0, 0)]], [[(2, 0)]], 'ios'),
211+
])
212+
def test_interconnect(
213+
typelist, connections, inplist, outlist, expected, sys_dict):
214+
# Create the system list
215+
syslist = [sys_dict[_type] for _type in typelist]
216+
217+
# Make copies of any duplicates
218+
for sysidx, sys in enumerate(syslist):
219+
if sys == syslist[0]:
220+
syslist[sysidx] = sys.copy()
221+
222+
# Make sure we get the right result
223+
if expected == 'E' or expected[0] == 'x':
224+
# Exception expected
225+
with pytest.raises(TypeError):
226+
result = ct.interconnect(syslist, connections, inplist, outlist)
227+
else:
228+
result = ct.interconnect(syslist, connections, inplist, outlist)
229+
assert isinstance(result, type_dict[expected])

0 commit comments

Comments
 (0)