|
26 | 26 |
|
27 | 27 | from . import config |
28 | 28 | from .iosys import InputOutputSystem, _parse_spec, _process_iosys_keywords, \ |
29 | | - _process_signal_list, common_timebase, isctime, isdtime |
| 29 | + _process_signal_list, common_timebase, iosys_repr, isctime, isdtime |
30 | 30 | from .timeresp import _check_convert_array, _process_time_response, \ |
31 | 31 | TimeResponseData, TimeResponseList |
32 | 32 |
|
@@ -773,6 +773,71 @@ def outfcn(t, x, u, params): |
773 | 773 | index + "; combining with previous entries") |
774 | 774 | self.output_map[index + j, ylist_index] += gain |
775 | 775 |
|
| 776 | + def __str__(self): |
| 777 | + import textwrap |
| 778 | + out = super().__str__() |
| 779 | + |
| 780 | + out += f"\n\nSubsystems ({len(self.syslist)}):\n" |
| 781 | + for sys in self.syslist: |
| 782 | + out += "\n".join(textwrap.wrap( |
| 783 | + iosys_repr(sys, format='info'), width=78, |
| 784 | + initial_indent=" * ", subsequent_indent=" ")) + "\n" |
| 785 | + |
| 786 | + # Build a list of input, output, and inpout signals |
| 787 | + input_list, output_list, inpout_list = [], [], [] |
| 788 | + for sys in self.syslist: |
| 789 | + input_list += [sys.name + "." + lbl for lbl in sys.input_labels] |
| 790 | + output_list += [sys.name + "." + lbl for lbl in sys.output_labels] |
| 791 | + inpout_list = input_list + output_list |
| 792 | + |
| 793 | + # Define a utility function to generate the signal |
| 794 | + def cxn_string(signal, gain, first): |
| 795 | + if gain == 1: |
| 796 | + return (" + " if not first else "") + f"{signal}" |
| 797 | + elif gain == -1: |
| 798 | + return (" - " if not first else "-") + f"{signal}" |
| 799 | + elif gain > 0: |
| 800 | + return (" + " if not first else "") + f"{gain} * {signal}" |
| 801 | + elif gain < 0: |
| 802 | + return (" - " if not first else "-") + \ |
| 803 | + f"{abs(gain)} * {signal}" |
| 804 | + |
| 805 | + out += f"\nConnections:\n" |
| 806 | + for i in range(len(input_list)): |
| 807 | + first = True |
| 808 | + cxn = f"{input_list[i]} <- " |
| 809 | + if np.any(self.connect_map[i]): |
| 810 | + for j in range(len(output_list)): |
| 811 | + if self.connect_map[i, j]: |
| 812 | + cxn += cxn_string( |
| 813 | + output_list[j], self.connect_map[i,j], first) |
| 814 | + first = False |
| 815 | + if np.any(self.input_map[i]): |
| 816 | + for j in range(len(self.input_labels)): |
| 817 | + if self.input_map[i, j]: |
| 818 | + cxn += cxn_string( |
| 819 | + self.input_labels[j], self.input_map[i, j], first) |
| 820 | + first = False |
| 821 | + out += "\n".join(textwrap.wrap( |
| 822 | + cxn, width=78, initial_indent=" * ", |
| 823 | + subsequent_indent=" ")) + "\n" |
| 824 | + |
| 825 | + out += f"\nOutputs:\n" |
| 826 | + for i in range(len(self.output_labels)): |
| 827 | + first = True |
| 828 | + cxn = f"{self.output_labels[i]} <- " |
| 829 | + if np.any(self.output_map[i]): |
| 830 | + for j in range(len(inpout_list)): |
| 831 | + if self.output_map[i, j]: |
| 832 | + cxn += cxn_string( |
| 833 | + output_list[j], self.output_map[i, j], first) |
| 834 | + first = False |
| 835 | + out += "\n".join(textwrap.wrap( |
| 836 | + cxn, width=78, initial_indent=" * ", |
| 837 | + subsequent_indent=" ")) + "\n" |
| 838 | + |
| 839 | + return out[:-1] |
| 840 | + |
776 | 841 | def _update_params(self, params, warning=False): |
777 | 842 | for sys in self.syslist: |
778 | 843 | local = sys.params.copy() # start with system parameters |
|
0 commit comments