Skip to content

Commit 3ec2f02

Browse files
committed
Fixed system naming conventions and unit tests. Still need to do signal names.
1 parent f955b3a commit 3ec2f02

File tree

3 files changed

+20
-24
lines changed

3 files changed

+20
-24
lines changed

control/iosys.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ def linearize(self, x0, u0, t=0, params={}, eps=1e-6):
544544
def copy(self, newname=None):
545545
"""Make a copy of an input/output system."""
546546
newsys = copy.copy(self)
547-
newsys.name = self.name_or_default("copy of " + self.name if not newname)
547+
newsys.name = self.name_or_default("copy of " + self.name if not newname else newname)
548548
return newsys
549549

550550

@@ -937,9 +937,6 @@ def __init__(self, syslist, connections=[], inplist=[], outlist=[],
937937
sysobj_name_dct[sys] = sys.name
938938
self.syslist_index[sys.name] = sysidx
939939

940-
# This won't work when there are duplicate sysnames
941-
# Should we throw an error rather than just warning above?
942-
# Users can use sys.copy() to get a unique name for the dup system.
943940
if states is None:
944941
states = []
945942
for sys, sysname in sysobj_name_dct.items():

control/tests/iosys_test.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,8 @@ def test_sys_naming_convention(self):
817817
ct.InputOutputSystem.idCounter = 0
818818
sys = ct.LinearIOSystem(self.mimo_linsys1)
819819
self.assertEquals(sys.name, "sys[0]")
820-
820+
self.assertEquals(sys.copy().name, "copy of sys[0]")
821+
821822
namedsys = ios.NonlinearIOSystem(
822823
updfcn = lambda t, x, u, params: np.array(
823824
np.dot(self.mimo_linsys1.A, np.reshape(x, (-1, 1))) \
@@ -837,7 +838,6 @@ def test_sys_naming_convention(self):
837838
unnamedsys2 = ct.NonlinearIOSystem(
838839
None, lambda t,x,u,params: u, inputs=2, outputs=2
839840
)
840-
breakpoint()
841841
self.assertEquals(unnamedsys2.name, "sys[2]")
842842

843843
# Unnamed/unnamed connections
@@ -852,8 +852,8 @@ def test_sys_naming_convention(self):
852852
self.assertEquals(uu_parallel.name, "sys[4]")
853853
self.assertEquals(u_neg.name, "sys[5]")
854854
self.assertEquals(uu_feedback.name, "sys[6]")
855-
self.assertEquals(uu_dup.name, "sys[8]")
856-
self.assertEquals(uu_hierarchical.name, "sys[9]")
855+
self.assertEquals(uu_dup.name, "sys[7]")
856+
self.assertEquals(uu_hierarchical.name, "sys[8]")
857857

858858
# Unnamed/named connections
859859
un_series = unnamedsys1 * namedsys
@@ -862,21 +862,15 @@ def test_sys_naming_convention(self):
862862
un_dup = unnamedsys1 * namedsys.copy()
863863
un_hierarchical = uu_series*unnamedsys1
864864

865-
self.assertEquals(un_series.name, "sys[10]")
866-
self.assertEquals(un_parallel.name, "sys[11]")
867-
self.assertEquals(un_feedback.name, "sys[12]")
868-
self.assertEquals(un_dup.name, "sys[14]")
869-
self.assertEquals(un_hierarchical.name, "sys[15]")
870-
871-
# Name conflict (test new names are assigned)
872-
same_name_sum = unnamedsys1 + unnamedsys1.copy(unnamedsys1.name)
873-
self.assertEquals(same_name_sum.name, "sys[16]")
865+
self.assertEquals(un_series.name, "sys[9]")
866+
self.assertEquals(un_parallel.name, "sys[10]")
867+
self.assertEquals(un_feedback.name, "sys[11]")
868+
self.assertEquals(un_dup.name, "sys[12]")
869+
self.assertEquals(un_hierarchical.name, "sys[13]")
874870

875871
# Same system conflict
876872
with warnings.catch_warnings(record=True) as warnval:
877-
# Trigger a warning
878873
unnamedsys1 * unnamedsys1
879-
# Verify that we got a warning
880874
self.assertEqual(len(warnval), 1)
881875

882876
def test_signals_naming_convention(self):
@@ -945,8 +939,9 @@ def test_lineariosys_statespace(self):
945939
np.testing.assert_array_equal(io_feedback.D, ss_feedback.D)
946940

947941
def test_duplicates(self):
948-
nlios = ios.NonlinearIOSystem(None, \
949-
lambda t, x, u, params: u*u, inputs=1, outputs=1)
942+
nlios = ios.NonlinearIOSystem(lambda t,x,u,params: x, \
943+
lambda t, x, u, params: u*u, \
944+
inputs=1, outputs=1, states=1, name="sys")
950945

951946
# Turn off deprecation warnings
952947
warnings.simplefilter("ignore", category=DeprecationWarning)
@@ -967,7 +962,11 @@ def test_duplicates(self):
967962
nlios2 = nlios.copy()
968963
with warnings.catch_warnings(record=True) as warnval:
969964
ios_series = nlios1 * nlios2
970-
self.assertEqual(len(warnval), 0)
965+
self.assertEquals(len(warnval), 1)
966+
# when subsystems have the same name, duplicates are
967+
# renamed <subsysname_i>
968+
self.assertTrue("copy of sys_1.x[0]" in ios_series.state_index.keys())
969+
self.assertTrue("copy of sys.x[0]" in ios_series.state_index.keys())
971970

972971
# Duplicate names
973972
iosys_siso = ct.LinearIOSystem(self.siso_linsys)

control/timeresp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,8 @@ def forced_response(sys, T=None, U=0., X0=0., transpose=False,
404404
xout = xout[::inc, :]
405405

406406
# Transpose the output and state vectors to match local convention
407-
xout = sp.transpose(xout)
408-
yout = sp.transpose(yout)
407+
xout = np.transpose(xout)
408+
yout = np.transpose(yout)
409409

410410
# Get rid of unneeded dimensions
411411
if squeeze:

0 commit comments

Comments
 (0)