Skip to content

Commit 6be8f48

Browse files
committed
allow combining I/O time responses with different numbers of states
1 parent 8b416eb commit 6be8f48

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

control/timeplot.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -653,24 +653,28 @@ def combine_time_responses(response_list, trace_labels=None, title=None):
653653
ntraces = max(1, base.ntraces)
654654

655655
# Initial pass through trace list to count things up and do error checks
656+
nstates = base.nstates
656657
for response in response_list[1:]:
657658
# Make sure the time vector is the same
658659
if not np.allclose(base.t, response.t):
659660
raise ValueError("all responses must have the same time vector")
660661

661662
# Make sure the dimensions are all the same
662663
if base.ninputs != response.ninputs or \
663-
base.noutputs != response.noutputs or \
664-
base.nstates != response.nstates:
664+
base.noutputs != response.noutputs:
665665
raise ValueError("all responses must have the same number of "
666666
"inputs, outputs, and states")
667667

668+
if nstates != response.nstates:
669+
warn("responses have different state dimensions; dropping states")
670+
nstates = 0
671+
668672
ntraces += max(1, response.ntraces)
669673

670674
# Create data structures for the new time response data object
671675
inputs = np.empty((base.ninputs, ntraces, base.t.size))
672676
outputs = np.empty((base.noutputs, ntraces, base.t.size))
673-
states = np.empty((base.nstates, ntraces, base.t.size))
677+
states = np.empty((nstates, ntraces, base.t.size))
674678

675679
# See whether we should create labels or not
676680
if trace_labels is None:
@@ -689,7 +693,8 @@ def combine_time_responses(response_list, trace_labels=None, title=None):
689693
# Single trace
690694
inputs[:, offset, :] = response.u
691695
outputs[:, offset, :] = response.y
692-
states[:, offset, :] = response.x
696+
if nstates:
697+
states[:, offset, :] = response.x
693698
offset += 1
694699

695700
# Add on trace label and trace type
@@ -703,7 +708,8 @@ def combine_time_responses(response_list, trace_labels=None, title=None):
703708
for i in range(response.ntraces):
704709
inputs[:, offset, :] = response.u[:, i, :]
705710
outputs[:, offset, :] = response.y[:, i, :]
706-
states[:, offset, :] = response.x[:, i, :]
711+
if nstates:
712+
states[:, offset, :] = response.x[:, i, :]
707713

708714
# Save the trace labels
709715
if generate_trace_labels:
@@ -721,9 +727,10 @@ def combine_time_responses(response_list, trace_labels=None, title=None):
721727
trace_types += [None] * response.ntraces
722728

723729
return TimeResponseData(
724-
base.t, outputs, states, inputs, issiso=base.issiso,
730+
base.t, outputs, states if nstates else None, inputs,
725731
output_labels=base.output_labels, input_labels=base.input_labels,
726-
state_labels=base.state_labels, title=title, transpose=base.transpose,
727-
return_x=base.return_x, squeeze=base.squeeze, sysname=base.sysname,
732+
state_labels=base.state_labels if nstates else None,
733+
title=title, transpose=base.transpose, return_x=base.return_x,
734+
issiso=base.issiso, squeeze=base.squeeze, sysname=base.sysname,
728735
trace_labels=trace_labels, trace_types=trace_types,
729736
plot_inputs=base.plot_inputs)

0 commit comments

Comments
 (0)