From ece5f9216f2458a92e32f7d536e55f1fef35ae25 Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Tue, 20 Jun 2023 22:53:57 -0700 Subject: [PATCH 01/12] initial implementation --- control/__init__.py | 5 +- control/config.py | 3 + control/tests/timeplot_test.py | 88 ++++++++ control/timeplot.py | 382 +++++++++++++++++++++++++++++++++ control/timeresp.py | 42 +++- 5 files changed, 510 insertions(+), 10 deletions(-) create mode 100644 control/tests/timeplot_test.py create mode 100644 control/timeplot.py diff --git a/control/__init__.py b/control/__init__.py index 9781ab80e..120d16325 100644 --- a/control/__init__.py +++ b/control/__init__.py @@ -77,6 +77,10 @@ from .xferfcn import * from .frdata import * +# Time responses and plotting +from .timeresp import * +from .timeplot import * + from .bdalg import * from .delay import * from .descfcn import * @@ -91,7 +95,6 @@ from .rlocus import * from .statefbk import * from .stochsys import * -from .timeresp import * from .ctrlutil import * from .canonical import * from .robust import * diff --git a/control/config.py b/control/config.py index 987693c2d..1ed8b5dd5 100644 --- a/control/config.py +++ b/control/config.py @@ -135,6 +135,9 @@ def reset_defaults(): from .optimal import _optimal_defaults defaults.update(_optimal_defaults) + from .timeplot import _timeplot_defaults + defaults.update(_timeplot_defaults) + def _get_param(module, param, argval=None, defval=None, pop=False, last=False): """Return the default value for a configuration option. diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py new file mode 100644 index 000000000..362abe369 --- /dev/null +++ b/control/tests/timeplot_test.py @@ -0,0 +1,88 @@ +# timeplot_test.py - test out time response plots +# RMM, 23 Jun 2023 + +import pytest +import control as ct +import matplotlib as mpl +import matplotlib.pyplot as plt + +# Step responses +@pytest.mark.parametrize("nin, nout", [(1, 1), (1, 2), (2, 1), (2, 2), (2, 3)]) +@pytest.mark.parametrize("transpose", [True, False]) +@pytest.mark.parametrize("plot_inputs", [None, True, False]) +def test_simple_response(nout, nin, transpose, plot_inputs): + sys = ct.rss(4, nout, nin) + stepresp = ct.step_response(sys) + stepresp.plot(plot_inputs=plot_inputs, transpose=transpose) + + # Add additional data (and provide infon in the title) + ct.step_response(ct.rss(4, nout, nin), stepresp.time[-1]).plot( + plot_inputs=plot_inputs, transpose=transpose, + title=stepresp.title + f" [{plot_inputs=}, {transpose=}]") + + +@pytest.mark.parametrize("transpose", [True, False]) +def test_combine_signals(transpose): + sys = ct.rss(4, 2, 3) + stepresp = ct.step_response(sys) + stepresp.plot( + combine_signals=True, transpose=transpose, + title=f"Step response: combine_signals = True; transpose={transpose}") + + +@pytest.mark.parametrize("transpose", [True, False]) +def test_combine_traces(transpose): + sys = ct.rss(4, 2, 3) + stepresp = ct.step_response(sys) + stepresp.plot( + combine_traces=True, transpose=transpose, + title=f"Step response: combine_traces = True; transpose={transpose}") + + +@pytest.mark.parametrize("transpose", [True, False]) +def test_combine_signals_traces(transpose): + sys = ct.rss(4, 5, 3) + stepresp = ct.step_response(sys) + stepresp.plot( + combine_signals=True, combine_traces=True, transpose=transpose, + title=f"Step response: combine_signals/traces = True;" + + f"transpose={transpose}") + + +if __name__ == "__main__": + # + # Interactive mode: generate plots for manual viewing + # + # Running this script in python (or better ipython) will show a + # collection of figures that should all look OK on the screeen. + # + + # In interactive mode, turn on ipython interactive graphics + plt.ion() + + # Start by clearing existing figures + plt.close('all') + + print ("Simple step responses") + for size in [(1, 1), (1, 2), (2, 1), (2, 2), (2, 3)]: + for transpose in [False, True]: + for plot_inputs in [None, True, False]: + plt.figure() + test_simple_response( + *size, transpose=transpose, plot_inputs=plot_inputs) + + print ("Combine signals") + for transpose in [False, True]: + plt.figure() + test_combine_signals(transpose) + + print ("Combine traces") + for transpose in [False, True]: + plt.figure() + test_combine_traces(transpose) + + print ("Combine signals and traces") + for transpose in [False, True]: + plt.figure() + test_combine_signals_traces(transpose) + diff --git a/control/timeplot.py b/control/timeplot.py new file mode 100644 index 000000000..0375baf89 --- /dev/null +++ b/control/timeplot.py @@ -0,0 +1,382 @@ +# timeplot.py - time plotting functions +# RMM, 20 Jun 2023 +# +# This file contains routines for plotting out time responses. These +# functions can be called either as standalone functions or access from the +# TimeDataResponse class. +# +# Note: Depending on how this goes, it might eventually make sense to +# put the functions here directly into timeresp.py. +# +# Desired features +# [ ] Step/impulse response plots don't include inputs by default +# [ ] Forced/I-O response plots include inputs by default +# [ ] Ability to start inputs at zero +# [ ] Ability to plot all data on a single graph +# [ ] Ability to plot inputs with outputs on separate graphs +# [ ] Ability to plot inputs and/or outputs on selected axes +# [ ] Multi-trace graphs using different line styles +# [ ] Plotting function return Line2D elements +# [ ] Axis labels/legends based on what is plotted (siso, mimo, multi-trace) +# [ ] Ability to select (index) output and/or trace (and time?) +# [ ] Legends should not contain redundant information (nor appear redundantly) + +import numpy as np +import matplotlib as mpl +import matplotlib.pyplot as plt + +from . import config + +# Default font dictionary +_timeplot_rcParams = mpl.rcParams.copy() +_timeplot_rcParams.update({ + 'axes.labelsize': 'small', + 'axes.titlesize': 'small', + 'figure.titlesize': 'medium', + 'legend.fontsize': 'small', + 'xtick.labelsize': 'small', + 'ytick.labelsize': 'small', +}) + +# Default values for module parameter variables +_timeplot_defaults = { + 'timeplot.line_styles': ['-', '--', ':', '-.'], + 'timeplot.line_colors': [ + 'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', + 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'], + 'timeplot.time_label': "Time [s]", +} + +# Plot the input/output response of a system +def ioresp_plot( + data, ax=None, plot_inputs=None, plot_outputs=True, transpose=False, + combine_traces=False, combine_signals=False, legend_loc='center right', + add_initial_zero=True, title=None, relabel=True, **kwargs): + """Plot the time response of an input/output system. + + This function creates a standard set of plots for the input/output + response of a system, with the data provided via a `TimeResponseData` + object, which is the standard output for python-control simulation + functions. + + Parameters + ---------- + data : TimeResponseData + Data to be plotted. + ax : array of Axes + The matplotlib Axes to draw the figure on. If not specified, the + Axes for the current figure are used or, if there is no current + figure with the correct number and shape of Axes, a new figure is + created. The default shape of the array should be (data.ntraces, + data.ninputs + data.inputs), but if combine_traces == True then + only one row is needed and if combine_signals == True then only one + or two columns are needed (depending on plot_inputs and + plot_outputs). + plot_inputs : str or bool, optional + Sets how and where to plot the inputs: + * False: don't plot the inputs. + * 'separate` or True: plot inputs on their own axes + * 'with-output': plot inputs on corresponding output axes + * 'combined`: combine inputs and show on each output + plot_outputs : bool, optional + If False, suppress plotting of the outputs. + combine_traces : bool, optional + If set to True, combine all traces onto a single row instead of + plotting a separate row for each trace. + combine_signals : bool, optional + If set to True, combine all input and output signals onto a single + plot (for each). + transpose : bool, optional + If transpose is False (default), signals are plotted from top to + bottom, starting with outputs (if plotted) and then inputs. + Multi-trace plots are stacked horizontally. If transpose is True, + signals are plotted from left to right, starting with the inputs + (if plotted) and then the outputs. Multi-trace responses are + stacked vertically. + + Returns + ------- + out : list of Artist or list of list of Artist + Array of Artist objects for each line in the plot. The shape of + the array matches the plot style, + + Additional Parameters + --------------------- + relabel : bool, optional + By default, existing figures and axes are relabeled when new data + are added. If set to `False`, just plot new data on existing axes. + time_label : str, optional + Label to use for the time axis. + legend_loc : str or list of str, optional + Location of the legend for multi-trace plots. If an array line + style is used, a list of locations can be passed to allow + specifying individual locations for the legend in each axes. + add_initial_zero : bool + Add an initial point of zero at the first time point for all + inputs. This is useful when the initial value of the input is + nonzero (for example in a step input). Default is True. + trace_cycler: :class:`~matplotlib.Cycler` + Line style cycle to use for traces. Default = ['-', '--', ':', '-.']. + + """ + from cycler import cycler + from .iosys import InputOutputSystem + from .timeresp import TimeResponseData + + # + # Process keywords and set defaults + # + + # Set up defaults + time_label = config._get_param( + 'timeplot', 'time_label', kwargs, _timeplot_defaults, pop=True) + line_styles = config._get_param( + 'timeplot', 'line_styles', kwargs, _timeplot_defaults, pop=True) + line_colors = config._get_param( + 'timeplot', 'line_colors', kwargs, _timeplot_defaults, pop=True) + + title = data.title if title == None else title + + # Make sure we process alled of the optional arguments + if kwargs: + raise TypeError("unrecognized keywords: " + str(kwargs)) + + # Configure the cycle of colors and line styles + my_cycler = cycler(linestyle=line_styles) * cycler(color=line_colors) + + # + # Find/create axes + # + # Data are plotted in a standard subplots array, whose size depends on + # which signals are being plotted and how they are combined. The + # baseline layout for data is to plot everything separately, with + # outputs and inputs making up the rows and traces making up the + # columns: + # + # Trace 0 Trace q + # +------+ +------+ + # | y[0] | ... | y[0] | + # +------+ +------+ + # : + # +------+ +------+ + # | y[p] | ... | y[p] | + # +------+ +------+ + # + # +------+ +------+ + # | u[0] | ... | u[0] | + # +------+ +------+ + # : + # +------+ +------+ + # | u[m] | ... | u[m] | + # +------+ +------+ + # + # * Omitting: either the inputs or the outputs can be omitted. + # + # * Combining: inputs, outputs, and traces can be combined onto a + # single set of axes using various keyword combinations + # (combine_signals, combine_traces, plot_input='combine'). This + # basically collapses data along either the rows or columns, and a + # legend is generated. + # + # * Transpose: if the `transpose` keyword is True, then instead of + # plotting the data vertically (outputs over inputs), we plot left to + # right (inputs, outputs): + # + # +------+ +------+ +------+ +------+ + # Trace 0 | u[0] | ... | u[m] | | y[0] | ... | y[p] | + # +------+ +------+ +------+ +------+ + # : + # : + # +------+ +------+ +------+ +------+ + # Trace q | u[0] | ... | u[m] | | y[0] | ... | y[p] | + # +------+ +------+ +------+ +------+ + # + + # Decide on the number of inputs and outputs + if plot_inputs is None: + plot_inputs = data.plot_inputs + ninputs = data.ninputs if plot_inputs else 0 + noutputs = data.noutputs if plot_outputs else 0 + if ninputs == 0 and noutputs == 0: + raise ValueError( + "plot_inputs and plot_outputs both True; no data to plot") + + # Figure how how many rows and columns to use + nrows = noutputs + ninputs if not combine_signals else \ + int(plot_inputs) + int(plot_outputs) + ncols = data.ntraces if not combine_traces else 1 + if transpose: + nrows, ncols = ncols, nrows + + # See if we can use the current figure axes + fig = plt.gcf() # get current figure (or create new one) + if ax is None and plt.get_fignums(): + ax = fig.get_axes() + if len(ax) == nrows * ncols: + # Assume that the shape is right (no easy way to infer this) + ax = np.array(ax).reshape(nrows, ncols) + elif len(ax) != 0: + # Need to generate a new figure + fig, ax = plt.figure(), None + else: + # Blank figure, just need to recreate axes + ax = None + + # Create new axes, if needed, and customize them + if ax is None: + with plt.rc_context(_timeplot_rcParams): + ax_array = fig.subplots(nrows, ncols, sharex=True, squeeze=False) + for ax in np.nditer(ax_array, flags=["refs_ok"]): + ax.item().set_prop_cycle(my_cycler) + fig.set_tight_layout(True) + fig.align_labels() + + else: + # Make sure the axes are the right shape + if ax.shape != (nrows, ncols): + raise ValueError( + "specified axes are not the right shape; " + f"got {ax.shape} but expecting ({nrows}, {ncols})") + ax_array = ax + + # + # Map inputs/outputs and traces to axes + # + # This set of code takes care of all of the various options for how to + # plot the data. The arrays ax_outputs and ax_inputs are used to map + # the different signals that are plotted onto the axes created above. + # This code is complicated because it has to handle lots of different + # variations. + # + + # Create the map from trace, signal to axes, accounting for combine_* + ax_outputs = np.empty((noutputs, data.ntraces), dtype=object) + ax_inputs = np.empty((ninputs, data.ntraces), dtype=object) + + # Keep track of the number of axes for the inputs and outputs + noutput_axes = noutputs if plot_outputs and not combine_signals \ + else int(plot_outputs) + ninput_axes = ninputs if plot_inputs and not combine_signals \ + else int(plot_inputs) + + for i in range(noutputs): + for j in range(data.ntraces): + signal_index = i if not combine_signals else 0 + trace_index = j if not combine_traces else 0 + if transpose: + ax_outputs[i, j] = \ + ax_array[trace_index, signal_index + ninput_axes] + else: + ax_outputs[i, j] = ax_array[signal_index, trace_index] + + for i in range(ninputs): + for j in range(data.ntraces): + signal_index = noutput_axes + (i if not combine_signals else 0) + trace_index = j if not combine_traces else 0 + if transpose: + ax_inputs[i, j] = \ + ax_array[trace_index, signal_index - noutput_axes] + else: + ax_inputs[i, j] = ax_array[signal_index, trace_index] + + # + # Plot the data + # + + # Reshape the inputs and outputs for uniform indexing + outputs = data.y.reshape(data.noutputs, data.ntraces, -1) + inputs = data.u.reshape(data.ninputs, data.ntraces, -1) + + # Create a list of lines for the output + out = np.empty((noutputs + ninputs, data.ntraces), dtype=object) + + # Go through each trace and each input/output + for trace in range(data.ntraces): + # Set the line style for each trace + style = line_styles[trace % len(line_styles)] + + # Plot the output + for i in range(noutputs): + label = data.output_labels[i] + if data.ntraces > 1: + label += f", trace {trace}" + out[i, trace] = ax_outputs[i, trace].plot( + data.time, outputs[i][trace], label=label) + + # Plot the input + for i in range(ninputs): + label = data.input_labels[i] # set label for legend + if data.ntraces > 1: + label += f", trace {trace}" + + if add_initial_zero: # start trace from the origin + x = np.hstack([np.array([data.time[0]]), data.time]) + y = np.hstack([np.array([0]), inputs[i][trace]]) + else: + x, y = data.time, inputs[i][trace] + + out[noutputs + i, trace] = ax_inputs[i, trace].plot( + x, y, label=label) + + # Stop here if the user wants to control everything + if not relabel: + return out + + # + # Label the axes + # + + # Label the outputs + if combine_signals and plot_outputs: + if transpose: + for trace in range(data.ntraces if transpose else 1): + ax_outputs[0, trace].set_ylabel("Outputs") + else: + ax_array[0, 0].set_ylabel("Outputs") + else: + for i in range(noutputs): + for trace in range(data.ntraces if transpose else 1): + ax_outputs[i, trace].set_ylabel(data.output_labels[i]) + + # Label the inputs + if combine_signals and plot_inputs: + if transpose: + for trace in range(data.ntraces if transpose else 1): + ax_inputs[0, trace].set_ylabel("Inputs") + else: + ax_inputs[0, 0].set_ylabel("Inputs") + else: + for i in range(ninputs): + for trace in range(data.ntraces if transpose else 1): + ax_inputs[i, trace].set_ylabel(data.input_labels[i]) + + # Label the traces + if not combine_traces and not transpose: + for trace in range(data.ntraces): + with plt.rc_context(_timeplot_rcParams): + ax_outputs[0, trace].set_title(f"Trace {trace}") + + # Create legends + legend_loc = np.broadcast_to(np.array(legend_loc), ax_array.shape) + for i in range(nrows): + for j in range(ncols): + ax = ax_array[i, j] + if len(ax.get_lines()) > 1: + with plt.rc_context(_timeplot_rcParams): + ax.legend(loc=legend_loc[i, j]) + + # if data.noutputs > 1 or data.ntraces > 1: + # ax[0].set_ylabel("Outputs") + # ax[0].legend(loc=legend_loc[0]) + # else: + # ax[0].set_ylabel(f"Output {data.output_labels[i]}") + + # Time units on the bottom + for col in range(ncols): + ax_array[-1, col].set_xlabel(time_label) + + if fig is not None and data.title is not None: + with plt.rc_context(_timeplot_rcParams): + fig.suptitle(title) + + return out diff --git a/control/timeresp.py b/control/timeresp.py index defdbdf4e..a7a60b5f5 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -81,6 +81,7 @@ from . import config from .exception import pandas_check from .iosys import isctime, isdtime +from .timeplot import ioresp_plot __all__ = ['forced_response', 'step_response', 'step_info', @@ -169,6 +170,13 @@ class TimeResponseData: input_labels, output_labels, state_labels : array of str Names for the input, output, and state variables. + sysname : str, optional + Name of the system that created the data. + + plot_inputs : bool, optional + Whether or not to plot the inputs by default (can be overridden in + the plot() method) + ntraces : int Number of independent traces represented in the input/output response. If ntraces is 0 then the data represents a single trace @@ -210,7 +218,8 @@ class TimeResponseData: def __init__( self, time, outputs, states=None, inputs=None, issiso=None, output_labels=None, state_labels=None, input_labels=None, - transpose=False, return_x=False, squeeze=None, multi_trace=False + title=None, transpose=False, return_x=False, squeeze=None, + multi_trace=False, plot_inputs=True, sysname=None ): """Create an input/output time response object. @@ -241,9 +250,8 @@ def __init__( single-input, multi-trace response), or a 3D array indexed by input, trace, and time. - sys : LTI or InputOutputSystem, optional - System that generated the data. If desired, the system used to - generate the data can be stored along with the data. + title : str, optonal + Title of the data set (used as figure title in plotting). squeeze : bool, optional By default, if a system is single-input, single-output (SISO) @@ -267,6 +275,9 @@ def __init__( Optional labels for the inputs, outputs, and states, given as a list of strings matching the appropriate signal dimension. + sysname : str, optional + Name of the system that created the data. + transpose : bool, optional If True, transpose all input and output arrays (for backward compatibility with MATLAB and :func:`scipy.signal.lsim`). @@ -276,6 +287,10 @@ def __init__( If True, return the state vector when enumerating result by assigning to a tuple (default = False). + plot_inputs : bool, optional + Whether or not to plot the inputs by default (can be overridden + in the plot() method) + multi_trace : bool, optional If ``True``, then 2D input array represents multiple traces. For a MIMO system, the ``input`` attribute should then be set to @@ -290,6 +305,8 @@ def __init__( self.t = np.atleast_1d(time) if self.t.ndim != 1: raise ValueError("Time vector must be 1D array") + self.title = title + self.sysname = sysname # # Output vector (and number of traces) @@ -363,9 +380,11 @@ def __init__( if inputs is None: self.u = None self.ninputs = 0 + self.plot_inputs = False else: self.u = np.array(inputs) + self.plot_inputs = plot_inputs # Make sure the shape is OK and figure out the nuumber of inputs if multi_trace and self.u.ndim == 3 and \ @@ -655,6 +674,10 @@ def to_pandas(self): return pandas.DataFrame(data) + # Plot data + def plot(self, *args, **kwargs): + return ioresp_plot(self, *args, **kwargs) + # Process signal labels def _process_labels(labels, signal, length): @@ -1132,7 +1155,7 @@ def forced_response(sys, T=None, U=0., X0=0., transpose=False, return TimeResponseData( tout, yout, xout, U, issiso=sys.issiso(), output_labels=sys.output_labels, input_labels=sys.input_labels, - state_labels=sys.state_labels, + state_labels=sys.state_labels, sysname=sys.name, plot_inputs=True, transpose=transpose, return_x=return_x, squeeze=squeeze) @@ -1377,8 +1400,9 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, return TimeResponseData( response.time, yout, xout, uout, issiso=issiso, output_labels=output_labels, input_labels=input_labels, - state_labels=sys.state_labels, - transpose=transpose, return_x=return_x, squeeze=squeeze) + state_labels=sys.state_labels, title="Step response for " + sys.name, + transpose=transpose, return_x=return_x, squeeze=squeeze, + sysname=sys.name, plot_inputs=False) def step_info(sysdata, T=None, T_num=None, yfinal=None, @@ -1718,7 +1742,7 @@ def initial_response(sys, T=None, X0=0, output=None, T_num=None, return TimeResponseData( response.t, yout, response.x, None, issiso=issiso, output_labels=output_labels, input_labels=None, - state_labels=sys.state_labels, + state_labels=sys.state_labels, sysname=sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze) @@ -1887,7 +1911,7 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, return TimeResponseData( response.time, yout, xout, uout, issiso=issiso, output_labels=output_labels, input_labels=input_labels, - state_labels=sys.state_labels, + state_labels=sys.state_labels, sysname=sys.name, plot_inputs=False, transpose=transpose, return_x=return_x, squeeze=squeeze) From dacf17c87e13aa2e6d33c2f9fb706215800eeb2b Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Sun, 25 Jun 2023 10:03:56 -0700 Subject: [PATCH 02/12] add support for plot_input='overlay', trace labeling, legend processing --- control/nlsys.py | 4 +- control/tests/kwargs_test.py | 3 + control/tests/timeplot_test.py | 28 ++- control/timeplot.py | 402 +++++++++++++++++++++++++-------- control/timeresp.py | 28 ++- 5 files changed, 359 insertions(+), 106 deletions(-) diff --git a/control/nlsys.py b/control/nlsys.py index c540decb6..f11d08a31 100644 --- a/control/nlsys.py +++ b/control/nlsys.py @@ -1488,6 +1488,7 @@ def ufun(t): return TimeResponseData( t_eval, y, None, u, issiso=sys.issiso(), output_labels=sys.output_labels, input_labels=sys.input_labels, + title="Input/output response for " + sys.name, sysname=sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze) # Create a lambda function for the right hand side @@ -1567,7 +1568,8 @@ def ivp_rhs(t, x): return TimeResponseData( soln.t, y, soln.y, u, issiso=sys.issiso(), output_labels=sys.output_labels, input_labels=sys.input_labels, - state_labels=sys.state_labels, + state_labels=sys.state_labels, sysname=sys.name, + title="Input/output response for " + sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze) diff --git a/control/tests/kwargs_test.py b/control/tests/kwargs_test.py index 1abc7547e..9b66aef38 100644 --- a/control/tests/kwargs_test.py +++ b/control/tests/kwargs_test.py @@ -26,6 +26,7 @@ import control.tests.statefbk_test as statefbk_test import control.tests.stochsys_test as stochsys_test import control.tests.trdata_test as trdata_test +import control.tests.timeplot_test as timeplot_test @pytest.mark.parametrize("module, prefix", [ (control, ""), (control.flatsys, "flatsys."), (control.optimal, "optimal.") @@ -185,6 +186,7 @@ def test_matplotlib_kwargs(function, nsysargs, moreargs, kwargs, mplcleanup): 'gangof4_plot': test_matplotlib_kwargs, 'input_output_response': test_unrecognized_kwargs, 'interconnect': interconnect_test.test_interconnect_exceptions, + 'ioresp_plot': timeplot_test.test_errors, 'linearize': test_unrecognized_kwargs, 'lqe': test_unrecognized_kwargs, 'lqr': test_unrecognized_kwargs, @@ -230,6 +232,7 @@ def test_matplotlib_kwargs(function, nsysargs, moreargs, kwargs, mplcleanup): 'StateSpace.__init__': test_unrecognized_kwargs, 'StateSpace.sample': test_unrecognized_kwargs, 'TimeResponseData.__call__': trdata_test.test_response_copy, + 'TimeResponseData.plot': timeplot_test.test_errors, 'TransferFunction.__init__': test_unrecognized_kwargs, 'TransferFunction.sample': test_unrecognized_kwargs, 'optimal.OptimalControlProblem.__init__': diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 362abe369..9fd2e23cf 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -9,17 +9,22 @@ # Step responses @pytest.mark.parametrize("nin, nout", [(1, 1), (1, 2), (2, 1), (2, 2), (2, 3)]) @pytest.mark.parametrize("transpose", [True, False]) -@pytest.mark.parametrize("plot_inputs", [None, True, False]) +@pytest.mark.parametrize("plot_inputs", [None, True, False, 'overlay']) def test_simple_response(nout, nin, transpose, plot_inputs): sys = ct.rss(4, nout, nin) stepresp = ct.step_response(sys) stepresp.plot(plot_inputs=plot_inputs, transpose=transpose) # Add additional data (and provide infon in the title) - ct.step_response(ct.rss(4, nout, nin), stepresp.time[-1]).plot( - plot_inputs=plot_inputs, transpose=transpose, - title=stepresp.title + f" [{plot_inputs=}, {transpose=}]") + newsys = ct.rss(4, nout, nin) + out = ct.step_response(newsys, stepresp.time[-1]).plot( + plot_inputs=plot_inputs, transpose=transpose) + # Update the title so we can see what is going on + fig = out[0, 0][0].axes.figure + fig.suptitle( + fig._suptitle._text + f" [{nout}x{nin}, {plot_inputs=}, {transpose=}]", + fontsize='small') @pytest.mark.parametrize("transpose", [True, False]) def test_combine_signals(transpose): @@ -49,6 +54,19 @@ def test_combine_signals_traces(transpose): f"transpose={transpose}") +def test_errors(): + sys = ct.rss(2, 1, 1) + stepresp = ct.step_response(sys) + with pytest.raises(TypeError, match="unrecognized keyword"): + stepresp.plot(unknown=None) + + with pytest.raises(TypeError, match="unrecognized keyword"): + ct.ioresp_plot(stepresp, unknown=None) + + with pytest.raises(ValueError, match="unrecognized value"): + stepresp.plot(plot_inputs='unknown') + + if __name__ == "__main__": # # Interactive mode: generate plots for manual viewing @@ -66,7 +84,7 @@ def test_combine_signals_traces(transpose): print ("Simple step responses") for size in [(1, 1), (1, 2), (2, 1), (2, 2), (2, 3)]: for transpose in [False, True]: - for plot_inputs in [None, True, False]: + for plot_inputs in [None, True, False, 'overlay']: plt.figure() test_simple_response( *size, transpose=transpose, plot_inputs=plot_inputs) diff --git a/control/timeplot.py b/control/timeplot.py index 0375baf89..a4953c12f 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -8,32 +8,35 @@ # Note: Depending on how this goes, it might eventually make sense to # put the functions here directly into timeresp.py. # -# Desired features -# [ ] Step/impulse response plots don't include inputs by default -# [ ] Forced/I-O response plots include inputs by default -# [ ] Ability to start inputs at zero -# [ ] Ability to plot all data on a single graph -# [ ] Ability to plot inputs with outputs on separate graphs -# [ ] Ability to plot inputs and/or outputs on selected axes -# [ ] Multi-trace graphs using different line styles -# [ ] Plotting function return Line2D elements -# [ ] Axis labels/legends based on what is plotted (siso, mimo, multi-trace) +# Desired features (i = implemented but not tested, c = complete, w/ tests) +# [i] Step/impulse response plots don't include inputs by default +# [i] Forced/I-O response plots include inputs by default +# [ ] Ability to start inputs at zero (step functions only?) +# [i] Ability to plot all data on a single graph +# [i] Ability to plot inputs with outputs on separate graphs +# [i] Ability to plot inputs and/or outputs on selected axes +# [i] Multi-trace graphs using different line styles +# [i] Plotting function return Line2D elements +# [i] Axis labels/legends based on what is plotted (siso, mimo, multi-trace) # [ ] Ability to select (index) output and/or trace (and time?) -# [ ] Legends should not contain redundant information (nor appear redundantly) +# [i] Legends should not contain redundant information (nor appear redundantly) import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt +from os.path import commonprefix from . import config +__all__ = ['ioresp_plot'] + # Default font dictionary _timeplot_rcParams = mpl.rcParams.copy() _timeplot_rcParams.update({ 'axes.labelsize': 'small', 'axes.titlesize': 'small', 'figure.titlesize': 'medium', - 'legend.fontsize': 'small', + 'legend.fontsize': 'x-small', 'xtick.labelsize': 'small', 'ytick.labelsize': 'small', }) @@ -50,8 +53,9 @@ # Plot the input/output response of a system def ioresp_plot( data, ax=None, plot_inputs=None, plot_outputs=True, transpose=False, - combine_traces=False, combine_signals=False, legend_loc='center right', - add_initial_zero=True, title=None, relabel=True, **kwargs): + combine_traces=False, combine_signals=False, legend_spec=None, + legend_loc=None, add_initial_zero=True, title=None, relabel=True, + **kwargs): """Plot the time response of an input/output system. This function creates a standard set of plots for the input/output @@ -72,12 +76,12 @@ def ioresp_plot( only one row is needed and if combine_signals == True then only one or two columns are needed (depending on plot_inputs and plot_outputs). - plot_inputs : str or bool, optional + plot_inputs : bool or str, optional Sets how and where to plot the inputs: - * False: don't plot the inputs. - * 'separate` or True: plot inputs on their own axes - * 'with-output': plot inputs on corresponding output axes - * 'combined`: combine inputs and show on each output + * False: don't plot the inputs + * None: use value from time response data (default) + * 'overlay`: plot inputs overlaid with outputs + * True: plot the inputs on their own axes plot_outputs : bool, optional If False, suppress plotting of the outputs. combine_traces : bool, optional @@ -107,10 +111,14 @@ def ioresp_plot( are added. If set to `False`, just plot new data on existing axes. time_label : str, optional Label to use for the time axis. - legend_loc : str or list of str, optional - Location of the legend for multi-trace plots. If an array line - style is used, a list of locations can be passed to allow - specifying individual locations for the legend in each axes. + legend_spec : array of str, option + Location of the legend for multi-trace plots. Specifies an array + of legend location strings matching the shape of the subplots, with + each entry being either None (for no legend) or a legend location + string (see :func:`~matplotlib.pyplot.legend`). + legend_loc : str + Location of the legend within the axes for which it appears. This + value is used if legend_spec is None. add_initial_zero : bool Add an initial point of zero at the first time point for all inputs. This is useful when the initial value of the input is @@ -135,15 +143,22 @@ def ioresp_plot( line_colors = config._get_param( 'timeplot', 'line_colors', kwargs, _timeplot_defaults, pop=True) + # Set the title for the data title = data.title if title == None else title - # Make sure we process alled of the optional arguments - if kwargs: - raise TypeError("unrecognized keywords: " + str(kwargs)) + # Determine whether or not to plot the input data (and how) + if plot_inputs is None: + plot_inputs = data.plot_inputs + if plot_inputs not in [True, False, 'overlay']: + raise ValueError(f"unrecognized value: {plot_inputs=}") # Configure the cycle of colors and line styles my_cycler = cycler(linestyle=line_styles) * cycler(color=line_colors) + # Make sure we process alled of the optional arguments + if kwargs: + raise TypeError("unrecognized keyword(s): " + str(kwargs)) + # # Find/create axes # @@ -170,11 +185,13 @@ def ioresp_plot( # | u[m] | ... | u[m] | # +------+ +------+ # + # A variety of options are available to modify this format: + # # * Omitting: either the inputs or the outputs can be omitted. # # * Combining: inputs, outputs, and traces can be combined onto a # single set of axes using various keyword combinations - # (combine_signals, combine_traces, plot_input='combine'). This + # (combine_signals, combine_traces, plot_inputs='overlay'). This # basically collapses data along either the rows or columns, and a # legend is generated. # @@ -191,20 +208,32 @@ def ioresp_plot( # Trace q | u[0] | ... | u[m] | | y[0] | ... | y[p] | # +------+ +------+ +------+ +------+ # + # This also affects the way in which legends and labels are generated. # Decide on the number of inputs and outputs - if plot_inputs is None: - plot_inputs = data.plot_inputs ninputs = data.ninputs if plot_inputs else 0 noutputs = data.noutputs if plot_outputs else 0 + ntraces = max(1, data.ntraces) # treat data.ntraces == 0 as 1 trace if ninputs == 0 and noutputs == 0: raise ValueError( "plot_inputs and plot_outputs both True; no data to plot") - # Figure how how many rows and columns to use - nrows = noutputs + ninputs if not combine_signals else \ - int(plot_inputs) + int(plot_outputs) - ncols = data.ntraces if not combine_traces else 1 + # Figure how how many rows and columns to use + offsets for inputs/outputs + if plot_inputs == 'overlay' and not combine_signals: + nrows = max(ninputs, noutputs) # Plot inputs on top of outputs + noutput_axes = 0 # No offset required + ninput_axes = 0 # No offset required + elif combine_signals: + nrows = int(plot_outputs) # Start with outputs + nrows += int(plot_inputs == True) # Add plot for inputs if needed + noutput_axes = 1 if plot_outputs else 0 + ninput_axes = 1 if plot_inputs else 0 + else: + nrows = noutputs + ninputs # Plot inputs separately + noutput_axes = noutputs if plot_outputs else 0 + ninput_axes = ninputs if plot_inputs else 0 + + ncols = ntraces if not combine_traces else 1 if transpose: nrows, ncols = ncols, nrows @@ -250,17 +279,11 @@ def ioresp_plot( # # Create the map from trace, signal to axes, accounting for combine_* - ax_outputs = np.empty((noutputs, data.ntraces), dtype=object) - ax_inputs = np.empty((ninputs, data.ntraces), dtype=object) - - # Keep track of the number of axes for the inputs and outputs - noutput_axes = noutputs if plot_outputs and not combine_signals \ - else int(plot_outputs) - ninput_axes = ninputs if plot_inputs and not combine_signals \ - else int(plot_inputs) + ax_outputs = np.empty((noutputs, ntraces), dtype=object) + ax_inputs = np.empty((ninputs, ntraces), dtype=object) for i in range(noutputs): - for j in range(data.ntraces): + for j in range(ntraces): signal_index = i if not combine_signals else 0 trace_index = j if not combine_traces else 0 if transpose: @@ -270,7 +293,7 @@ def ioresp_plot( ax_outputs[i, j] = ax_array[signal_index, trace_index] for i in range(ninputs): - for j in range(data.ntraces): + for j in range(ntraces): signal_index = noutput_axes + (i if not combine_signals else 0) trace_index = j if not combine_traces else 0 if transpose: @@ -282,32 +305,58 @@ def ioresp_plot( # # Plot the data # + # The ax_output and ax_input arrays have the axes needed for making the + # plots. Labels are used on each axes for later creation of legends. + # The gneric labels if of the form: + # + # signal name, trace label, system name + # + # The signal name or tracel label can be omitted if they will appear on + # the axes title or ylabel. The system name is always included, since + # multiple calls to plot() will require a legend that distinguishes + # which system signals are plotted. The system name is stripped off + # later (in the legend-handling code) if it is not needed, but must be + # included here since a plot may be built up by multiple calls to plot(). + # # Reshape the inputs and outputs for uniform indexing - outputs = data.y.reshape(data.noutputs, data.ntraces, -1) - inputs = data.u.reshape(data.ninputs, data.ntraces, -1) + outputs = data.y.reshape(data.noutputs, ntraces, -1) + inputs = data.u.reshape(data.ninputs, ntraces, -1) # Create a list of lines for the output - out = np.empty((noutputs + ninputs, data.ntraces), dtype=object) + out = np.empty((noutputs + ninputs, ntraces), dtype=object) - # Go through each trace and each input/output - for trace in range(data.ntraces): - # Set the line style for each trace - style = line_styles[trace % len(line_styles)] + # Utility function for creating line label + def _make_line_label(signal_index, signal_labels, trace_index): + label = "" # start with an empty label + + # Add the signal name if it won't appear as an axes label + if combine_signals or plot_inputs == 'overlay': + label += signal_labels[signal_index] + + # Add the trace label if this is a multi-trace figure + if combine_traces and ntraces > 1: + label += ", " if label != "" else "" + label += f"trace {trace_index}" if data.trace_labels is None \ + else data.trace_labels[trace_index] + # Add the system name (will strip off later if redundant) + label += ", " if label != "" else "" + label += f"{data.sysname}" + + return label + + # Go through each trace and each input/output + for trace in range(ntraces): # Plot the output for i in range(noutputs): - label = data.output_labels[i] - if data.ntraces > 1: - label += f", trace {trace}" + label = _make_line_label(i, data.output_labels, trace) out[i, trace] = ax_outputs[i, trace].plot( data.time, outputs[i][trace], label=label) # Plot the input for i in range(ninputs): - label = data.input_labels[i] # set label for legend - if data.ntraces > 1: - label += f", trace {trace}" + label = _make_line_label(i, data.input_labels, trace) if add_initial_zero: # start trace from the origin x = np.hstack([np.array([data.time[0]]), data.time]) @@ -323,60 +372,221 @@ def ioresp_plot( return out # - # Label the axes + # Label the axes (including trace labels) + # + # Once the data are plotted, we label the axes. The horizontal axes is + # always time and this is labeled only on the bottom most column. The + # vertical axes can consist either of a single signal or a combination + # of signals (when combine_signal is True or plot+inputs = 'overlay'. + # + # Traces are labeled at the top of the first row of plots (regular) or + # the left edge of rows (tranpose). # - # Label the outputs - if combine_signals and plot_outputs: - if transpose: - for trace in range(data.ntraces if transpose else 1): - ax_outputs[0, trace].set_ylabel("Outputs") - else: - ax_array[0, 0].set_ylabel("Outputs") - else: - for i in range(noutputs): - for trace in range(data.ntraces if transpose else 1): - ax_outputs[i, trace].set_ylabel(data.output_labels[i]) + # Time units on the bottom + for col in range(ncols): + ax_array[-1, col].set_xlabel(time_label) - # Label the inputs - if combine_signals and plot_inputs: - if transpose: - for trace in range(data.ntraces if transpose else 1): - ax_inputs[0, trace].set_ylabel("Inputs") + # Keep track of whether inputs are overlaid on outputs + overlaid = plot_inputs == 'overlay' + overlaid_title = "Inputs, Outputs" + + if transpose: # inputs on left, outputs on right + # Label the inputs + if combine_signals and plot_inputs: + label = overlaid_title if overlaid else "Inputs" + for trace in range(ntraces): + ax_inputs[0, trace].set_ylabel(label) else: - ax_inputs[0, 0].set_ylabel("Inputs") - else: - for i in range(ninputs): - for trace in range(data.ntraces if transpose else 1): - ax_inputs[i, trace].set_ylabel(data.input_labels[i]) + for i in range(ninputs): + label = overlaid_title if overlaid else data.input_labels[i] + for trace in range(ntraces): + ax_inputs[i, trace].set_ylabel(label) + + # Label the outputs + if combine_signals and plot_outputs: + label = overlaid_title if overlaid else "Outputs" + for trace in range(ntraces): + ax_outputs[0, trace].set_ylabel(label) + else: + for i in range(noutputs): + label = overlaid_title if overlaid else data.output_labels[i] + for trace in range(ntraces): + ax_outputs[i, trace].set_ylabel(label) + + # Set the trace titles, if needed + if ntraces > 1 and not combine_traces: + for trace in range(ntraces): + # Get the existing ylabel for left column + label = ax_array[trace, 0].get_ylabel() + + # Add on the trace title + label = f"Trace {trace}" if data.trace_labels is None \ + else data.trace_labels[trace] + "\n" + label + ax_array[trace, 0].set_ylabel(label) + + else: # regular plot (outputs over inputs) + # Set the trace titles, if needed + if ntraces > 1 and not combine_traces: + for trace in range(ntraces): + with plt.rc_context(_timeplot_rcParams): + ax_outputs[0, trace].set_title( + f"Trace {trace}" if data.trace_labels is None + else data.trace_labels[trace]) - # Label the traces - if not combine_traces and not transpose: - for trace in range(data.ntraces): - with plt.rc_context(_timeplot_rcParams): - ax_outputs[0, trace].set_title(f"Trace {trace}") + # Label the outputs + if combine_signals and plot_outputs: + ax_outputs[0, 0].set_ylabel("Outputs") + else: + for i in range(noutputs): + ax_outputs[i, 0].set_ylabel( + overlaid_title if overlaid else data.output_labels[i]) + + # Label the inputs + if combine_signals and plot_inputs: + label = overlaid_title if overlaid else "Inputs" + ax_inputs[0, 0].set_ylabel(label) + else: + for i in range(ninputs): + label = overlaid_title if overlaid else data.input_labels[i] + ax_inputs[i, 0].set_ylabel(label) + # # Create legends - legend_loc = np.broadcast_to(np.array(legend_loc), ax_array.shape) + # + # Legends can be placed manually by passing a legend_spec array that + # matches the shape of the suplots, with each item being a string + # indicating the location of the legend for that axes (or None for no + # legend). + # + # If no legend spec is passed, a minimal number of legends are used so + # that each line in each axis can be uniquely identified. The details + # depends on the various plotting parameters, but the general rule is + # to place legends in the top row and right column. + # + # Because plots can be built up by multiple calls to plot(), the legend + # strings are created from the line labels manually. Thus an initial + # call to plot() may not generate any legends (eg, if no signals are + # combined nor overlaid), but subsequent calls to plot() will need a + # legend for each different line (system). + # + + # Figure out where to put legends + if legend_spec is None: + legend_map = np.full(ax_array.shape, None, dtype=object) + if legend_loc == None: + legend_loc = 'center right' + if transpose: + if (combine_signals or plot_inputs == 'overlay') and combine_traces: + # Put a legend in each plot for inputs and outputs + legend_map[0, ninput_axes] = legend_loc + if plot_inputs is True: + legend_map[0, 0] = legend_loc + elif combine_signals: + # Put a legend in rightmost input/output plot + legend_map[0, ninput_axes] = legend_loc + if plot_inputs is True: + legend_map[0, 0] = legend_loc + elif plot_inputs == 'overlay': + # Put a legend on the top of each column + for i in range(ntraces): + legend_map[0, i] = legend_loc + elif combine_traces: + # Put a legend topmost input/output plot + legend_map[0, -1] = legend_loc + else: + # Put legend in the upper right + legend_map[0, -1] = legend_loc + else: # regular layout + if (combine_signals or plot_inputs == 'overlay') and combine_traces: + # Put a legend in each plot for inputs and outputs + legend_map[0, -1] = legend_loc + if plot_inputs is True: + legend_map[noutput_axes, -1] = legend_loc + elif combine_signals: + # Put a legend in rightmost input/output plot + legend_map[0, -1] = legend_loc + if plot_inputs is True: + legend_map[noutput_axes, -1] = legend_loc + elif plot_inputs == 'overlay': + # Put a legend on the right of each row + for i in range(max(ninputs, noutputs)): + legend_map[i, -1] = legend_loc + elif combine_traces: + # Put a legend topmost input/output plot + legend_map[0, -1] = legend_loc + else: + # Put legend in the upper right + legend_map[0, -1] = legend_loc + + # Create axis legends for i in range(nrows): for j in range(ncols): ax = ax_array[i, j] - if len(ax.get_lines()) > 1: + # Get the labels to use + labels = [line.get_label() for line in ax.get_lines()] + + # Look for a common prefix (up to a space) + # TODO: fix error in 1x2, overlay, transpose (Fig 24) + common_prefix = commonprefix(labels) + last_space = common_prefix.rfind(', ') + if last_space < 0 or plot_inputs == 'overlay': + common_prefix = '' + elif last_space > 0: + common_prefix = common_prefix[:last_space] + prefix_len = len(common_prefix) + + # Look for a common suffice (up to a space) + common_suffix = commonprefix( + [label[::-1] for label in labels])[::-1] + suffix_len = len(common_suffix) + # Only chop things off after a comma or space + while suffix_len > 0 and common_suffix[-suffix_len] != ',': + suffix_len -= 1 + + # Strip the labels of common information + if suffix_len > 0: + labels = [label[prefix_len:-suffix_len] for label in labels] + else: + labels = [label[prefix_len:] for label in labels] + + # Update the labels to remove common strings + if len(labels) > 1 and legend_map[i, j] != None: with plt.rc_context(_timeplot_rcParams): - ax.legend(loc=legend_loc[i, j]) + ax.legend(labels, loc=legend_map[i, j]) - # if data.noutputs > 1 or data.ntraces > 1: - # ax[0].set_ylabel("Outputs") - # ax[0].legend(loc=legend_loc[0]) - # else: - # ax[0].set_ylabel(f"Output {data.output_labels[i]}") + # + # Update the plot title (= figure suptitle) + # + # If plots are built up by multiple calls to plot() and the title is + # not given, then the title is updated to provide a list of unique text + # items in each successive title. For data generated by the I/O + # response functions this will generate a common prefix followed by a + # list of systems (e.g., "Step response for sys[1], sys[2]"). + # - # Time units on the bottom - for col in range(ncols): - ax_array[-1, col].set_xlabel(time_label) + if fig is not None and title is not None: + # Get the current title, if it exists + old_title = None if fig._suptitle is None else fig._suptitle._text + + if old_title is not None: + # Find the common part of the titles + common_prefix = commonprefix([old_title, title]) + + # Back up to the last space + last_space = common_prefix.rfind(' ') + if last_space > 0: + common_prefix = common_prefix[:last_space] + title_suffix = title[len(common_prefix):] + + # Add the new part of the title (usually the system name) + separator = ',' if len(common_prefix) > 0 else ';' + new_title = old_title + separator + title_suffix + else: + new_title = title - if fig is not None and data.title is not None: + # Add the title with plt.rc_context(_timeplot_rcParams): - fig.suptitle(title) + fig.suptitle(new_title) return out diff --git a/control/timeresp.py b/control/timeresp.py index a7a60b5f5..b1a03d681 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -182,6 +182,9 @@ class TimeResponseData: response. If ntraces is 0 then the data represents a single trace with the trace index surpressed in the data. + trace_labels : array of string + Labels to use for traces (set to sysname it ntraces is 0) + Notes ----- 1. For backward compatibility with earlier versions of python-control, @@ -219,7 +222,8 @@ def __init__( self, time, outputs, states=None, inputs=None, issiso=None, output_labels=None, state_labels=None, input_labels=None, title=None, transpose=False, return_x=False, squeeze=None, - multi_trace=False, plot_inputs=True, sysname=None + multi_trace=False, trace_labels=None, plot_inputs=True, + sysname=None ): """Create an input/output time response object. @@ -416,6 +420,10 @@ def __init__( self.input_labels = _process_labels( input_labels, "input", self.ninputs) + # Check and store trace labels, if present + self.trace_labels = _process_labels( + trace_labels, "trace", self.ntraces) + # Figure out if the system is SISO if issiso is None: # Figure out based on the data @@ -1156,6 +1164,7 @@ def forced_response(sys, T=None, U=0., X0=0., transpose=False, tout, yout, xout, U, issiso=sys.issiso(), output_labels=sys.output_labels, input_labels=sys.input_labels, state_labels=sys.state_labels, sysname=sys.name, plot_inputs=True, + title="Forced response for " + sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze) @@ -1372,11 +1381,15 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, uout = np.empty((ninputs, ninputs, T.size)) # Simulate the response for each input + trace_labels = [] for i in range(sys.ninputs): # If input keyword was specified, only simulate for that input if isinstance(input, int) and i != input: continue + # Save a label for this plot + trace_labels.append(f"From {sys.input_labels[i]}") + # Create a set of single inputs system for simulation U = np.zeros((sys.ninputs, T.size)) U[i, :] = np.ones_like(T) @@ -1402,7 +1415,7 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, output_labels=output_labels, input_labels=input_labels, state_labels=sys.state_labels, title="Step response for " + sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze, - sysname=sys.name, plot_inputs=False) + sysname=sys.name, trace_labels=trace_labels, plot_inputs=False) def step_info(sysdata, T=None, T_num=None, yfinal=None, @@ -1743,6 +1756,7 @@ def initial_response(sys, T=None, X0=0, output=None, T_num=None, response.t, yout, response.x, None, issiso=issiso, output_labels=output_labels, input_labels=None, state_labels=sys.state_labels, sysname=sys.name, + title="Initial response for " + sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze) @@ -1869,11 +1883,15 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, uout = np.full((ninputs, ninputs, np.asarray(T).size), None) # Simulate the response for each input + trace_labels = [] for i in range(sys.ninputs): # If input keyword was specified, only handle that case if isinstance(input, int) and i != input: continue + # Save a label for this plot + trace_labels.append(f"From {sys.input_labels[i]}") + # # Compute new X0 that contains the impulse # @@ -1911,8 +1929,10 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, return TimeResponseData( response.time, yout, xout, uout, issiso=issiso, output_labels=output_labels, input_labels=input_labels, - state_labels=sys.state_labels, sysname=sys.name, plot_inputs=False, - transpose=transpose, return_x=return_x, squeeze=squeeze) + state_labels=sys.state_labels, trace_labels=trace_labels, + title="Impulse response for " + sys.name, + sysname=sys.name, plot_inputs=False, transpose=transpose, + return_x=return_x, squeeze=squeeze) # utility function to find time period and time increment using pole locations From 9f99219726af16878f1c93c82389ac289f99fe7e Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Wed, 28 Jun 2023 15:46:37 -0700 Subject: [PATCH 03/12] unit tests + bug fixes --- control/tests/timeplot_test.py | 206 ++++++++++++++++++++++++--------- control/timeplot.py | 43 ++++--- control/timeresp.py | 25 ++-- 3 files changed, 196 insertions(+), 78 deletions(-) diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 9fd2e23cf..345634084 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -5,53 +5,134 @@ import control as ct import matplotlib as mpl import matplotlib.pyplot as plt - -# Step responses -@pytest.mark.parametrize("nin, nout", [(1, 1), (1, 2), (2, 1), (2, 2), (2, 3)]) +import numpy as np + +# Detailed test of (almost) all functionality +# (uncomment rows for developmental testing, but otherwise takes too long) +@pytest.mark.parametrize( + "sys", [ + # ct.rss(1, 1, 1, strictly_proper=True, name="rss"), + ct.nlsys( + lambda t, x, u, params: -x + u, None, + inputs=1, outputs=1, states=1, name="nlsys"), + # ct.rss(2, 1, 2, strictly_proper=True, name="rss"), + ct.rss(2, 2, 1, strictly_proper=True, name="rss"), + # ct.drss(2, 2, 2, name="drss"), + # ct.rss(2, 2, 3, strictly_proper=True, name="rss"), + ]) @pytest.mark.parametrize("transpose", [True, False]) @pytest.mark.parametrize("plot_inputs", [None, True, False, 'overlay']) -def test_simple_response(nout, nin, transpose, plot_inputs): - sys = ct.rss(4, nout, nin) - stepresp = ct.step_response(sys) - stepresp.plot(plot_inputs=plot_inputs, transpose=transpose) +@pytest.mark.parametrize("plot_outputs", [True, False]) +@pytest.mark.parametrize("combine_signals", [True, False]) +@pytest.mark.parametrize("combine_traces", [True, False]) +@pytest.mark.parametrize("second_system", [False, True]) +@pytest.mark.parametrize("fcn", [ + ct.step_response, ct.impulse_response, ct.initial_response, + ct.forced_response, ct.input_output_response]) +def test_response_plots( + fcn, sys, plot_inputs, plot_outputs, combine_signals, combine_traces, + transpose, second_system, clear=True): + # Figure out the time range to use and check some special cases + if not isinstance(sys, ct.lti.LTI): + if fcn == ct.impulse_response: + pytest.skip("impulse response not implemented for nlsys") + + # Nonlinear systems require explicit time limits + T = 10 + timepts = np.linspace(0, T) + else: + # Linear systems figure things out on their own + T = None + timepts = np.linspace(0, 10) # for input_output_response + + # Save up the keyword arguments + kwargs = dict( + plot_inputs=plot_inputs, plot_outputs=plot_outputs, transpose=transpose, + combine_signals=combine_signals, combine_traces=combine_traces) + + # Create the response + if fcn is ct.input_output_response and \ + not isinstance(sys, ct.NonlinearIOSystem): + # Skip transfer functions and other non-state space systems + return None + if fcn in [ct.input_output_response, ct.forced_response]: + U = np.zeros((sys.ninputs, timepts.size)) + for i in range(sys.ninputs): + U[i] = np.cos(timepts * i + i) + args = [timepts, U] + + elif fcn == ct.initial_response: + args = [T, np.ones(sys.nstates)] # T, X0 + + elif not isinstance(sys, ct.lti.LTI): + args = [T] # nonlinear systems require final time + + else: # step, initial, impulse responses + args = [] + + # Create a new figure (in case previous one is of the same size) and plot + if not clear: + plt.figure() + response = fcn(sys, *args) + + # Look for cases where there are no data to plot + if not plot_outputs and ( + plot_inputs is False or response.ninputs == 0 or + plot_inputs is None and response.plot_inputs is False): + with pytest.raises(ValueError, match=".* no data to plot"): + out = response.plot(**kwargs) + return None + elif not plot_outputs and plot_inputs == 'overlay': + with pytest.raises(ValueError, match="can't overlay inputs"): + out = response.plot(**kwargs) + return None + elif plot_inputs in [True, 'overlay'] and response.ninputs == 0: + with pytest.raises(ValueError, match=".* but no inputs"): + out = response.plot(**kwargs) + return None + + out = response.plot(**kwargs) + + # TODO: add some basic checks here # Add additional data (and provide infon in the title) - newsys = ct.rss(4, nout, nin) - out = ct.step_response(newsys, stepresp.time[-1]).plot( - plot_inputs=plot_inputs, transpose=transpose) + if second_system: + newsys = ct.rss( + sys.nstates, sys.noutputs, sys.ninputs, strictly_proper=True) + if fcn not in [ct.initial_response, ct.forced_response, + ct.input_output_response] and \ + isinstance(sys, ct.lti.LTI): + # Reuse the previously computed time to make plots look nicer + fcn(newsys, *args, T=response.time[-1]).plot(**kwargs) + else: + # Compute and plot new response (time is one of the arguments) + fcn(newsys, *args).plot(**kwargs) + + # TODO: add some basic checks here # Update the title so we can see what is going on fig = out[0, 0][0].axes.figure fig.suptitle( - fig._suptitle._text + f" [{nout}x{nin}, {plot_inputs=}, {transpose=}]", + fig._suptitle._text + + f" [{sys.noutputs}x{sys.ninputs}, cs={combine_signals}, " + f"ct={combine_traces}, pi={plot_inputs}, tr={transpose}]", fontsize='small') -@pytest.mark.parametrize("transpose", [True, False]) -def test_combine_signals(transpose): - sys = ct.rss(4, 2, 3) - stepresp = ct.step_response(sys) - stepresp.plot( - combine_signals=True, transpose=transpose, - title=f"Step response: combine_signals = True; transpose={transpose}") - - -@pytest.mark.parametrize("transpose", [True, False]) -def test_combine_traces(transpose): - sys = ct.rss(4, 2, 3) - stepresp = ct.step_response(sys) - stepresp.plot( - combine_traces=True, transpose=transpose, - title=f"Step response: combine_traces = True; transpose={transpose}") + # Get rid of the figure to free up memory + if clear: + plt.clf() -@pytest.mark.parametrize("transpose", [True, False]) -def test_combine_signals_traces(transpose): - sys = ct.rss(4, 5, 3) - stepresp = ct.step_response(sys) - stepresp.plot( - combine_signals=True, combine_traces=True, transpose=transpose, - title=f"Step response: combine_signals/traces = True;" + - f"transpose={transpose}") +def test_legend_map(): + sys_mimo = ct.tf2ss( + [[[1], [0.1]], [[0.2], [1]]], + [[[1, 0.6, 1], [1, 1, 1]], [[1, 0.4, 1], [1, 2, 1]]], name="MIMO") + response = ct.step_response(sys_mimo) + response.plot( + legend_map=np.array([['center', 'upper right'], + [None, 'center right']]), + plot_inputs=True, combine_signals=True, transpose=True, + title='MIMO step response with custom legend placement') def test_errors(): @@ -81,26 +162,39 @@ def test_errors(): # Start by clearing existing figures plt.close('all') - print ("Simple step responses") - for size in [(1, 1), (1, 2), (2, 1), (2, 2), (2, 3)]: - for transpose in [False, True]: - for plot_inputs in [None, True, False, 'overlay']: - plt.figure() - test_simple_response( - *size, transpose=transpose, plot_inputs=plot_inputs) + # Define a set of systems to test + sys_siso = ct.tf2ss([1], [1, 2, 1], name="SISO") + sys_mimo = ct.tf2ss( + [[[1], [0.1]], [[0.2], [1]]], + [[[1, 0.6, 1], [1, 1, 1]], [[1, 0.4, 1], [1, 2, 1]]], name="MIMO") + + # Define and run a selected set of interesting tests + # def test_response_plots( + # fcn, sys, plot_inputs, plot_outputs, combine_signals, + # combine_traces, transpose, second_system, clear=True): + N, T, F = None, True, False + test_cases = [ + # response fcn system in out cs ct tr ss + (ct.step_response, sys_siso, N, T, F, F, F, F), # 1 + (ct.step_response, sys_siso, T, F, F, F, F, F), # 2 + (ct.step_response, sys_siso, T, T, F, F, F, T), # 3 + (ct.step_response, sys_siso, 'overlay', T, F, F, F, T), # 4 + (ct.step_response, sys_mimo, F, T, F, F, F, F), # 5 + (ct.step_response, sys_mimo, T, T, F, F, F, F), # 6 + (ct.step_response, sys_mimo, 'overlay', T, F, F, F, F), # 7 + (ct.step_response, sys_mimo, T, T, T, F, F, F), # 8 + (ct.step_response, sys_mimo, T, T, T, T, F, F), # 9 + (ct.step_response, sys_mimo, T, T, F, F, T, F), # 10 + (ct.step_response, sys_mimo, T, T, T, F, T, F), # 11 + (ct.step_response, sys_mimo, 'overlay', T, T, F, T, F), # 12 + (ct.forced_response, sys_mimo, N, T, T, F, T, F), # 13 + (ct.forced_response, sys_mimo, 'overlay', T, F, F, F, F), # 14 + ] + for args in test_cases: + test_response_plots(*args, clear=F) - print ("Combine signals") - for transpose in [False, True]: - plt.figure() - test_combine_signals(transpose) - - print ("Combine traces") - for transpose in [False, True]: - plt.figure() - test_combine_traces(transpose) - - print ("Combine signals and traces") - for transpose in [False, True]: - plt.figure() - test_combine_signals_traces(transpose) + # + # Run a few more special cases to show off capabilities + # + test_legend_map() # show ability to set legend location diff --git a/control/timeplot.py b/control/timeplot.py index a4953c12f..d775d1805 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -18,7 +18,7 @@ # [i] Multi-trace graphs using different line styles # [i] Plotting function return Line2D elements # [i] Axis labels/legends based on what is plotted (siso, mimo, multi-trace) -# [ ] Ability to select (index) output and/or trace (and time?) +# [x] Ability to select (index) output and/or trace (and time?) # [i] Legends should not contain redundant information (nor appear redundantly) import numpy as np @@ -53,7 +53,7 @@ # Plot the input/output response of a system def ioresp_plot( data, ax=None, plot_inputs=None, plot_outputs=True, transpose=False, - combine_traces=False, combine_signals=False, legend_spec=None, + combine_traces=False, combine_signals=False, legend_map=None, legend_loc=None, add_initial_zero=True, title=None, relabel=True, **kwargs): """Plot the time response of an input/output system. @@ -111,14 +111,14 @@ def ioresp_plot( are added. If set to `False`, just plot new data on existing axes. time_label : str, optional Label to use for the time axis. - legend_spec : array of str, option + legend_map : array of str, option Location of the legend for multi-trace plots. Specifies an array of legend location strings matching the shape of the subplots, with each entry being either None (for no legend) or a legend location string (see :func:`~matplotlib.pyplot.legend`). legend_loc : str Location of the legend within the axes for which it appears. This - value is used if legend_spec is None. + value is used if legend_map is None. add_initial_zero : bool Add an initial point of zero at the first time point for all inputs. This is useful when the initial value of the input is @@ -216,7 +216,13 @@ def ioresp_plot( ntraces = max(1, data.ntraces) # treat data.ntraces == 0 as 1 trace if ninputs == 0 and noutputs == 0: raise ValueError( - "plot_inputs and plot_outputs both True; no data to plot") + "plot_inputs and plot_outputs both False; no data to plot") + elif plot_inputs == 'overlay' and noutputs == 0: + raise ValueError( + "can't overlay inputs with no outputs") + elif plot_inputs in [True, 'overlay'] and data.ninputs == 0: + raise ValueError( + "input plotting requested but no inputs in time response data") # Figure how how many rows and columns to use + offsets for inputs/outputs if plot_inputs == 'overlay' and not combine_signals: @@ -226,8 +232,8 @@ def ioresp_plot( elif combine_signals: nrows = int(plot_outputs) # Start with outputs nrows += int(plot_inputs == True) # Add plot for inputs if needed - noutput_axes = 1 if plot_outputs else 0 - ninput_axes = 1 if plot_inputs else 0 + noutput_axes = 1 if plot_outputs and plot_inputs is True else 0 + ninput_axes = 1 if plot_inputs is True else 0 else: nrows = noutputs + ninputs # Plot inputs separately noutput_axes = noutputs if plot_outputs else 0 @@ -321,7 +327,10 @@ def ioresp_plot( # Reshape the inputs and outputs for uniform indexing outputs = data.y.reshape(data.noutputs, ntraces, -1) - inputs = data.u.reshape(data.ninputs, ntraces, -1) + if data.u is None or not plot_inputs: + inputs = None + else: + inputs = data.u.reshape(data.ninputs, ntraces, -1) # Create a list of lines for the output out = np.empty((noutputs + ninputs, ntraces), dtype=object) @@ -430,7 +439,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): if ntraces > 1 and not combine_traces: for trace in range(ntraces): with plt.rc_context(_timeplot_rcParams): - ax_outputs[0, trace].set_title( + ax_array[0, trace].set_title( f"Trace {trace}" if data.trace_labels is None else data.trace_labels[trace]) @@ -454,7 +463,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): # # Create legends # - # Legends can be placed manually by passing a legend_spec array that + # Legends can be placed manually by passing a legend_map array that # matches the shape of the suplots, with each item being a string # indicating the location of the legend for that axes (or None for no # legend). @@ -472,21 +481,23 @@ def _make_line_label(signal_index, signal_labels, trace_index): # # Figure out where to put legends - if legend_spec is None: + if legend_map is None: legend_map = np.full(ax_array.shape, None, dtype=object) if legend_loc == None: legend_loc = 'center right' if transpose: if (combine_signals or plot_inputs == 'overlay') and combine_traces: # Put a legend in each plot for inputs and outputs - legend_map[0, ninput_axes] = legend_loc + if plot_outputs is True: + legend_map[0, ninput_axes] = legend_loc if plot_inputs is True: legend_map[0, 0] = legend_loc elif combine_signals: # Put a legend in rightmost input/output plot - legend_map[0, ninput_axes] = legend_loc if plot_inputs is True: legend_map[0, 0] = legend_loc + if plot_outputs is True: + legend_map[0, ninput_axes] = legend_loc elif plot_inputs == 'overlay': # Put a legend on the top of each column for i in range(ntraces): @@ -500,12 +511,14 @@ def _make_line_label(signal_index, signal_labels, trace_index): else: # regular layout if (combine_signals or plot_inputs == 'overlay') and combine_traces: # Put a legend in each plot for inputs and outputs - legend_map[0, -1] = legend_loc + if plot_outputs is True: + legend_map[0, -1] = legend_loc if plot_inputs is True: legend_map[noutput_axes, -1] = legend_loc elif combine_signals: # Put a legend in rightmost input/output plot - legend_map[0, -1] = legend_loc + if plot_outputs is True: + legend_map[0, -1] = legend_loc if plot_inputs is True: legend_map[noutput_axes, -1] = legend_loc elif plot_inputs == 'overlay': diff --git a/control/timeresp.py b/control/timeresp.py index b1a03d681..210221776 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -1356,7 +1356,7 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, from .statesp import _convert_to_statespace # Create the time and input vectors - if T is None or np.asarray(T).size == 1 and isinstance(sys, LTI): + if T is None or np.asarray(T).size == 1: T = _default_time_vector(sys, N=T_num, tfinal=T, is_step=True) T = np.atleast_1d(T).reshape(-1) if T.ndim != 1 and len(T) < 2: @@ -1370,7 +1370,7 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, "with given X0.") # Convert to state space so that we can simulate - if sys.nstates is None: + if isinstance(sys, LTI) and sys.nstates is None: sys = _convert_to_statespace(sys) # Set up arrays to handle the output @@ -1732,10 +1732,7 @@ def initial_response(sys, T=None, X0=0, output=None, T_num=None, # Create the time and input vectors if T is None or np.asarray(T).size == 1: - if isinstance(sys, LTI): - T = _default_time_vector(sys, N=T_num, tfinal=T, is_step=False) - elif T_num is not None: - T = np.linspace(0, T, T_num) + T = _default_time_vector(sys, N=T_num, tfinal=T, is_step=False) T = np.atleast_1d(T).reshape(-1) if T.ndim != 1 and len(T) < 2: raise ValueError("invalid value of T for this type of system") @@ -1857,7 +1854,7 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, from .lti import LTI # Create the time and input vectors - if T is None or np.asarray(T).size == 1 and isinstance(sys, LTI): + if T is None or np.asarray(T).size == 1: T = _default_time_vector(sys, N=T_num, tfinal=T, is_step=False) T = np.atleast_1d(T).reshape(-1) if T.ndim != 1 and len(T) < 2: @@ -2106,6 +2103,20 @@ def _ideal_tfinal_and_dt(sys, is_step=True): def _default_time_vector(sys, N=None, tfinal=None, is_step=True): """Returns a time vector that has a reasonable number of points. if system is discrete-time, N is ignored """ + from .lti import LTI + + # For non-LTI system, need tfinal + if not isinstance(sys, LTI): + if tfinal is None: + raise ValueError( + "can't automatically compute T for non-LTI system") + elif isinstance(tfinal, (int, float, np.number)): + if N is None: + return np.linspace(0, tfinal) + else: + return np.linspace(0, tfinal, N) + else: + return tfinal # Assume we got passed something appropriate N_max = 5000 N_min_ct = 100 # min points for cont time systems From 3f7e27588558a2df013e6281de7dd3991a3c3725 Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Thu, 29 Jun 2023 14:43:21 -0700 Subject: [PATCH 04/12] add user documentation (with figures) + combine_traces function --- control/tests/timeplot_test.py | 45 ++++++++++- control/timeplot.py | 113 +++++++++++++++++++++++--- control/timeresp.py | 23 ++++-- doc/Makefile | 5 +- doc/index.rst | 1 + doc/plotting.rst | 126 +++++++++++++++++++++++++++++ doc/timeplot-mimo_ioresp-mt_tr.png | Bin 0 -> 62546 bytes doc/timeplot-mimo_ioresp-ov_lm.png | Bin 0 -> 57319 bytes doc/timeplot-mimo_step-default.png | Bin 0 -> 31828 bytes doc/timeplot-mimo_step-pi_cs.png | Bin 0 -> 31853 bytes 10 files changed, 295 insertions(+), 18 deletions(-) create mode 100644 doc/plotting.rst create mode 100644 doc/timeplot-mimo_ioresp-mt_tr.png create mode 100644 doc/timeplot-mimo_ioresp-ov_lm.png create mode 100644 doc/timeplot-mimo_step-default.png create mode 100644 doc/timeplot-mimo_step-pi_cs.png diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 345634084..5a0afe97b 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -7,6 +7,8 @@ import matplotlib.pyplot as plt import numpy as np +from .conftest import slycotonly + # Detailed test of (almost) all functionality # (uncomment rows for developmental testing, but otherwise takes too long) @pytest.mark.parametrize( @@ -123,6 +125,7 @@ def test_response_plots( plt.clf() +@slycotonly def test_legend_map(): sys_mimo = ct.tf2ss( [[[1], [0.1]], [[0.2], [1]]], @@ -194,7 +197,47 @@ def test_errors(): test_response_plots(*args, clear=F) # - # Run a few more special cases to show off capabilities + # Run a few more special cases to show off capabilities (and save some + # of them for use in the documentation). # test_legend_map() # show ability to set legend location + + # Basic step response + plt.figure() + ct.step_response(sys_mimo).plot() + plt.savefig('timeplot-mimo_step-default.png') + + # Step response with plot_inputs, combine_signals + plt.figure() + ct.step_response(sys_mimo).plot( + plot_inputs=True, combine_signals=True, + title="Step response for 2x2 MIMO system " + + "[plot_inputs, combine_signals]") + plt.savefig('timeplot-mimo_step-pi_cs.png') + + # Input/output response with overlaid inputs, legend_map + plt.figure() + timepts = np.linspace(0, 10, 100) + U = np.vstack([np.sin(timepts), np.cos(2*timepts)]) + ct.input_output_response(sys_mimo, timepts, U).plot( + plot_inputs='overlay', + legend_map=np.array([['lower right'], ['lower right']]), + title="I/O response for 2x2 MIMO system " + + "[plot_inputs='overlay', legend_map]") + plt.savefig('timeplot-mimo_ioresp-ov_lm.png') + + # Multi-trace plot, transpose + plt.figure() + U = np.vstack([np.sin(timepts), np.cos(2*timepts)]) + resp1 = ct.input_output_response(sys_mimo, timepts, U) + + U = np.vstack([np.cos(2*timepts), np.sin(timepts)]) + resp2 = ct.input_output_response(sys_mimo, timepts, U) + + ct.combine_traces( + [resp1, resp2], trace_labels=["Scenario #1", "Scenario #2"]).plot( + transpose=True, + title="I/O responses for 2x2 MIMO system, multiple traces " + "[transpose]") + plt.savefig('timeplot-mimo_ioresp-mt_tr.png') diff --git a/control/timeplot.py b/control/timeplot.py index d775d1805..7f156ae5d 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -28,7 +28,7 @@ from . import config -__all__ = ['ioresp_plot'] +__all__ = ['ioresp_plot', 'combine_traces'] # Default font dictionary _timeplot_rcParams = mpl.rcParams.copy() @@ -71,11 +71,11 @@ def ioresp_plot( The matplotlib Axes to draw the figure on. If not specified, the Axes for the current figure are used or, if there is no current figure with the correct number and shape of Axes, a new figure is - created. The default shape of the array should be (data.ntraces, - data.ninputs + data.inputs), but if combine_traces == True then - only one row is needed and if combine_signals == True then only one - or two columns are needed (depending on plot_inputs and - plot_outputs). + created. The default shape of the array should be (noutputs + + ninputs, ntraces), but if `combine_traces` is set to `True` then + only one row is needed and if `combine_signals` is set to `True` + then only one or two columns are needed (depending on plot_inputs + and plot_outputs). plot_inputs : bool or str, optional Sets how and where to plot the inputs: * False: don't plot the inputs @@ -121,8 +121,7 @@ def ioresp_plot( value is used if legend_map is None. add_initial_zero : bool Add an initial point of zero at the first time point for all - inputs. This is useful when the initial value of the input is - nonzero (for example in a step input). Default is True. + inputs with type 'step'. Default is True. trace_cycler: :class:`~matplotlib.Cycler` Line style cycle to use for traces. Default = ['-', '--', ':', '-.']. @@ -367,7 +366,8 @@ def _make_line_label(signal_index, signal_labels, trace_index): for i in range(ninputs): label = _make_line_label(i, data.input_labels, trace) - if add_initial_zero: # start trace from the origin + if add_initial_zero and data.trace_types \ + and data.trace_types[i] == 'step': x = np.hstack([np.array([data.time[0]]), data.time]) y = np.hstack([np.array([0]), inputs[i][trace]]) else: @@ -603,3 +603,98 @@ def _make_line_label(signal_index, signal_labels, trace_index): fig.suptitle(new_title) return out + + +def combine_traces(trace_list, trace_labels=None, title=None): + """Combine multiple individual time responses into a multi-trace response. + + This function combines multiple instances of :class:`TimeResponseData` + into a multi-trace :class:`TimeResponseData` object. + + Parameters + ---------- + trace_list : list of :class:`TimeResponseData` objects + Traces to be combined. + trace_labels : list of str, optional + List of labels for each trace. If not specified, trace names are + taken from the input data or set to None. + + Returns + ------- + data : :class:`TimeResponseData` + Multi-trace input/output data. + + """ + from .timeresp import TimeResponseData + + # Save the first trace as the base case + base = trace_list[0] + + # Process keywords + title = base.title if title is None else title + + # Figure out the size of the data (and check for consistency) + ntraces = max(1, base.ntraces) + + # Initial pass through trace list to count things up and do error checks + for trace in trace_list[1:]: + # Make sure the time vector is the same + if not np.allclose(base.t, trace.t): + raise ValueError("all traces must have the same time vector") + + # Make sure the dimensions are all the same + if base.ninputs != trace.ninputs or base.noutputs != trace.noutputs \ + or base.nstates != trace.nstates: + raise ValuError("all traces must have the same number of " + "inputs, outputs, and states") + + ntraces += max(1, trace.ntraces) + + # Create data structures for the new time response data object + inputs = np.empty((base.ninputs, ntraces, base.t.size)) + outputs = np.empty((base.noutputs, ntraces, base.t.size)) + states = np.empty((base.nstates, ntraces, base.t.size)) + + # See whether we should create labels or not + if trace_labels is None: + generate_trace_labels = True + trace_labels = [] + elif len(trace_labels) != ntraces: + raise ValueError( + "number of trace labels does not match number of traces") + else: + generate_trace_labels = False + + offset = 0 + trace_types = [] + for trace in trace_list: + if trace.ntraces == 0: + # Single trace + inputs[:, offset, :] = trace.u + outputs[:, offset, :] = trace.y + states[:, offset, :] = trace.x + if generate_trace_labels: + trace_labels.append(trace.title) + if trace.trace_types is not None: + trace_types.append(trace.types[0]) + offset += 1 + else: + for i in range(trace.ntraces): + inputs[:, offset, :] = trace.u[:, i, :] + outputs[:, offset, :] = trace.y[:, i, :] + states[:, offset, :] = trace.x[:, i, :] + if generate_trace_labels and trace.trace_labels is not None: + trace_labels.append(trace.trace_labels) + else: + trace_labels.append(trace.title, f", trace {i}") + if trace.trace_types is not None: + trace_types.append(trace.trace_types) + offset += trace.ntraces + + return TimeResponseData( + base.t, outputs, states, inputs, issiso=base.issiso, + output_labels=base.output_labels, input_labels=base.input_labels, + state_labels=base.state_labels, title=title, transpose=base.transpose, + return_x=base.return_x, squeeze=base.squeeze, sysname=base.sysname, + trace_labels=trace_labels, trace_types=trace_types, + plot_inputs=base.plot_inputs) diff --git a/control/timeresp.py b/control/timeresp.py index 210221776..ffb495eb2 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -177,14 +177,18 @@ class TimeResponseData: Whether or not to plot the inputs by default (can be overridden in the plot() method) - ntraces : int + ntraces : int, optional Number of independent traces represented in the input/output - response. If ntraces is 0 then the data represents a single trace - with the trace index surpressed in the data. + response. If ntraces is 0 (default) then the data represents a + single trace with the trace index surpressed in the data. - trace_labels : array of string + trace_labels : array of string, optional Labels to use for traces (set to sysname it ntraces is 0) + trace_labels : array of string, optional + Type of trace. Currently only 'step' is supported, which controls + the way in which the signal is plotted. + Notes ----- 1. For backward compatibility with earlier versions of python-control, @@ -222,7 +226,8 @@ def __init__( self, time, outputs, states=None, inputs=None, issiso=None, output_labels=None, state_labels=None, input_labels=None, title=None, transpose=False, return_x=False, squeeze=None, - multi_trace=False, trace_labels=None, plot_inputs=True, + multi_trace=False, trace_labels=None, trace_types=None, + plot_inputs=True, sysname=None ): """Create an input/output time response object. @@ -423,6 +428,7 @@ def __init__( # Check and store trace labels, if present self.trace_labels = _process_labels( trace_labels, "trace", self.ntraces) + self.trace_types = trace_types # Figure out if the system is SISO if issiso is None: @@ -1382,13 +1388,15 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, # Simulate the response for each input trace_labels = [] + trace_types = [] for i in range(sys.ninputs): # If input keyword was specified, only simulate for that input if isinstance(input, int) and i != input: continue - # Save a label for this plot + # Save a label and type for this plot trace_labels.append(f"From {sys.input_labels[i]}") + trace_types.append('step') # Create a set of single inputs system for simulation U = np.zeros((sys.ninputs, T.size)) @@ -1415,7 +1423,8 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, output_labels=output_labels, input_labels=input_labels, state_labels=sys.state_labels, title="Step response for " + sys.name, transpose=transpose, return_x=return_x, squeeze=squeeze, - sysname=sys.name, trace_labels=trace_labels, plot_inputs=False) + sysname=sys.name, trace_labels=trace_labels, + trace_types=trace_types, plot_inputs=False) def step_info(sysdata, T=None, T_num=None, yfinal=None, diff --git a/doc/Makefile b/doc/Makefile index 6e1012343..88a1b7bad 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -15,10 +15,13 @@ help: .PHONY: help Makefile # Rules to create figures -FIGS = classes.pdf +FIGS = classes.pdf timeplot-mimo_step-pi_cs.png classes.pdf: classes.fig fig2dev -Lpdf $< $@ +timeplot-mimo_step-pi_cs.png: ../control/tests/timeplot_test.py + PYTHONPATH=.. python $< + # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). html pdf clean doctest: Makefile $(FIGS) diff --git a/doc/index.rst b/doc/index.rst index 98b184286..ec556e7ce 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -26,6 +26,7 @@ implements basic operations for analysis and design of feedback control systems. conventions control classes + plotting matlab flatsys iosys diff --git a/doc/plotting.rst b/doc/plotting.rst new file mode 100644 index 000000000..cc9908e70 --- /dev/null +++ b/doc/plotting.rst @@ -0,0 +1,126 @@ +.. _plotting-module: + +************* +Plotting data +************* + +The Python Control Toolbox contains a number of functions for plotting +input/output responses in the time and frequency domain, root locus +diagrams, and other standard charts used in control system analysis. While +some legacy functions do both analysis and plotting, the standard pattern +used in the toolbox is to provide a function that performs the basic +computation (e.g., time or frequency response) and returns and object +representing the output data. A separate plotting function, typically +ending in `_plot` is then used to plot the data. The plotting function is +also available via the `plot()` method of the analysis object, allowing the +following type of calls:: + + step_response(sys).plot() + frequency_response(sys).plot() # implementation pending + nyquist_curve(sys).plot() # implementation pending + rootlocus_curve(sys).plot() # implementation pending + +Time response data +================== + +Input/output time responses are produced one of several python-control +functions: :func:`~control.forced_response`, +:func:`~control.impulse_response`, :func:`~control.initial_response`, +:func:`~control.input_output_response`, :func:`~control.step_response`. +Each of these return a :class:`~control.TimeResponseData` object, which +contains the time, input, state, and output vectors associated with the +simulation. Time response data can be plotted with the +:func:`~control.time_response_plot` function, which is also available as +the :func:`~control.TimeResponseData.plot` method. For example, the step +response for a two-input, two-output can be plotted using the commands:: + + sys_mimo = ct.tf2ss( + [[[1], [0.1]], [[0.2], [1]]], + [[[1, 0.6, 1], [1, 1, 1]], [[1, 0.4, 1], [1, 2, 1]]], name="MIMO") + response = step_response(sys) + response.plot() + +which produces the following plot: + +.. image:: timeplot-mimo_step-default.png + +The :class:`~control.TimeResponseData` object can also be used to access +the data from the simulation:: + + time, outputs, inputs = response.time, response.outputs, response.inputs + fig, axs = plt.subplots(2, 2) + for i in range(2): + for j in range(2): + axs[i, j].plot(time, outputs[i, j]) + +A number of options are available in the `plot` method to customize the +appearance of input output data. For data produced by the +:func:`~control.impulse_response` and :func:`~control.step_response` +commands, the inputs are not shown. This behavior can be changed using the +`plot_inputs` keyword. It is also possible to combine multiple traces onto +a single graph, using either the `combine_signals` keyword (which puts all +outputs out a single graph and all inputs on a single graph) or the +`combine_traces` keyword, which puts different traces (e.g., corresponding +to step inputs in different channels) on the same graph, with appropriate +labeling via a legend on selected axes. + +For example, using `plot_input=True` and `combine_signals=True` yields the +following plot:: + + ct.step_response(sys_mimo).plot( + plot_inputs=True, combine_signals=True, + title="Step response for 2x2 MIMO system " + + "[plot_inputs, combine_signals]") + +.. image:: timeplot-mimo_step-pi_cs.png + +Input/output response plots created with either the +:func:`~control.forced_response` or the +:func:`~control.input_output_response` include the input signals by +default. These can be plotted on separate axes, but also "overlaid" on the +output axes (useful when the input and output signals are being compared to +each other). The following plot shows the use of `plot_inputs='overlay'` +as well as the ability to reposition the legends using the `legend_map` +keyword:: + + timepts = np.linspace(0, 10, 100) + U = np.vstack([np.sin(timepts), np.cos(2*timepts)]) + ct.input_output_response(sys_mimo, timepts, U).plot( + plot_inputs='overlay', + legend_map=np.array([['lower right'], ['lower right']]), + title="I/O response for 2x2 MIMO system " + + "[plot_inputs='overlay', legend_map]") + +.. image:: timeplot-mimo_ioresp-ov_lm.png + +Another option that is available is to use the `transpose` keyword so that +instead of plotting the outputs on the top and inputs on the bottom, the +inputs are plotted on the left and outputs on the right, as shown in the +following figure:: + + U1 = np.vstack([np.sin(timepts), np.cos(2*timepts)]) + resp1 = ct.input_output_response(sys_mimo, timepts, U1) + + U2 = np.vstack([np.cos(2*timepts), np.sin(timepts)]) + resp2 = ct.input_output_response(sys_mimo, timepts, U2) + + ct.combine_traces( + [resp1, resp2], trace_labels=["Scenario #1", "Scenario #2"]).plot( + transpose=True, + title="I/O responses for 2x2 MIMO system, multiple traces " + "[transpose]") + +.. image:: timeplot-mimo_ioresp-mt_tr.png + +This figure also illustrates the ability to create "multi-trace" plots +using the :func:`~control.combine_traces` function. + + +Plotting functions +================== + +.. autosummary:: + :toctree: generated/ + + ~control.ioresp_plot + ~control.combine_traces diff --git a/doc/timeplot-mimo_ioresp-mt_tr.png b/doc/timeplot-mimo_ioresp-mt_tr.png new file mode 100644 index 0000000000000000000000000000000000000000..e21ef1db42fdf1e13ea798a42364421c5e19c5cb GIT binary patch literal 62546 zcmdSBWmJ`4^ez0*DJdx_(%s#ubVx~qba!_*sC0vbfPjF~-6b7Lmq>#kAa(co{onD9 zamTnH@0UA}T(_=9+V^wT)3zk$-|tiVi{0la~rI8W02@3_)<~sL0@7c&C=P z!5@O|vbye?PL}Rormk-xWm9)&dnb2$8#5};x2|qBPLAAcylk8-RMzh9&Tc~N><<6` z3)q}ot=Jb$&)dP9pgAk(xj_)NDeMcbT)fN%g8p>Al#$f(&NKcv%j~v!*!a7e)n=gN#J2i|V|cQJ%P zm%Y8cXdgo#A0H{Zwy$3a$p%da6Uo2q@+UL0v!e{U6s@k=?`}j<60XvJO|m3Zf-H&S zh}Z}2ZvN1SJyaUszq)={@mlLgA~JyD`r(VGqPZso5bWlwUarWX2pSq1Hf<#eJ3roE zZS}?AU!NrfRV^-3B%xfb1&Nm`Wx~H34xgUZV9{?ty}Z0cOQ^Sht z3BpXwe`#~v{ELEzhsWglbmMm(dNH;VgazFNia-3xe_Y?MtU-qEZoUT%%;^{>=+#?p z9Mp6Ud^T)74Wqn+6w}%IMX#3MO)ffq6DHB5I3*MI#01Z&W9UH;iA9cHJjGx`mNYnX zQg?jpX#ex;lg^uQr&@=fd~KKWZ^}P?>S^=&gGYM%=ezjem$##}Z$}CJFQ(*AecLm* zt*~-btj2DY=~$9Np=mO*aVrl^;aGtn*ps^=pDv zzZ21Gf3X~odA-FiZ{vpY(^8aTV`E>`oLRgZ_IuxNCi(Iunn0rBUWd{{=KBGAzT%P+ zMB7H86;0EN2oA2;H;&B_1_76Irb!OVO({=_i172j%O{cx%Qfh;Hs2n%-mcu1iQmUS zRByi8#|S+PrO*tId|)1C{kAMsrOm9@V2w*1o~)eBm-1&qIB9!(J9(ow>YeaO+dBa= ztc{M&yB&6m!^Jw8nuT|pn`W*@jSJ}C$MZz9S>Ak&hkY&D^QGqJt5SHc!);#OM%exM z@ndM5e@)5N%`K+egeu)QP_W|DC%n9%jR>OXaZ8$$&POr9o%fp2!xqoe4LwOJYHEl+ zFV&hN2yVr5M^9P5;LA=J%i@ijou5blUSr&ura*x@XShccS1VP1r7sqKN(1in^2S)IkjmO%=;WxVyVN*&TsaAp7f7TL z_B=$*j{5$KhTC$C3ZGsD^9_ArLt|sgGpDwcr-X#5IXPrpo`<^UcYnU)OQANO_FxQy zSnB!gWMe}ul$+>(K1?5;yl3|}?Tus1zuT2oFZSlmSZ3I+_4oI0mu5RYA0Hp@u^R(N zvFtKPzWurN_<3`4b4gQE#@*WEJ*A5PnZ?;=f1f?yJMdudu2%in_fM$sK79CKu|Hd} zeG>F2%*f14L-#I*#jxeQce~N~^;Xh5YU#-2qN3;Ld&NoUSF^LTIFQBd-=iM$qoX54 z2zE-;;l}cif}daO>EmS0$jB=x)J}Gh%UR7H0cdD{u5x%M-B`ud)m6dAN6-hPzIlgd z+ZEe;Z?~8Rc>p{C7Rya8eI^{q>cw&?D3t!mO)JN>E(_IfU7`P>z z=8WzqtH?!wf29>(8v2i=-;a8A?qazzQLW|A5m~HXL8`ar0y|pVA z5^;P(qDKH9!ywFK=4@#fjDtjf@9*P%zFFvekfl@2Q-UonFi@=ddNVGfJv%T@DY{4zSUSZ5wFehkYH{pvIW*I`TsN-L1}xw zXU(w17fMGBbp+fFW%1e}c3(W)p5Rx`y_&Dmlg6SHQxdy7mDVsaQlSXEHU$CjQomaJ z9Kcvgv3yc$P3MDBJ$QkXwCg^JuB)|Y(x6uTUFdsI?TAmQ!Qrv^}M z%#!;CM270$;}u1)4pny{^8d~+*K7497MXxV9w;X8!S<_dnK-FUkbASic2dwCO`U#q z&v%D!KhdaDkW3^c;e0@C9O@2384kl1Q<$~oUHax^+_ymZXEg%Pi7nuYLF$_KD+n?T zO-*UoheTqMNKpjcxtNZD6iqLmvpt`b#!d;i{hLBA?3ujw@b_EKA6STF^4bx?qDs(x z59j9oBuMqbx7``1eg9MC(8qM6SDr^dWMSd4>hmi%BdVg~M2{;z#cR|{5u%V6ZIPc5vmBP zVfZZ?^|qDxEeQ+{PTH?1mSBLmllDfz$cVzm!GSis??KpIC>Mq=+w*UnXj?sxo&)5f zfi1hDyc`ujGi8-s?w=_+vAi%hS9`0%f z9XoC;VR#^LSjXOR9a^r%G(9sTz3Tr**{o5&S0%R)2E0lc9Mof}Zh$YnL&K-TkwOKP z4it(~<~vi_^2L&+e`r1amsL4(dgvdZT4g1wTb@H?!l z9W?SkljU;XQv;Y0blpoibbYpUtA|-s2hM?G6o)z-Rux(FzPvbWLBb$RX0B<|xTb(^ z0LNk5=VcHT6}9+x@!MjfC&DzT)qw3k{5bgBny8e;!#K7%Pt>`lx;v4pI01N1MhyYe zo{I1h&pC*luew#;$k0GTb~WvUXE)7mzfvh5PNQ)1 z4~~v#Z*Fc(ukt*9*o3YV)mz?99PoGED2vzW>*&Zs$zdqi=vNUPgCN;6l;~XljPqk8 z@$&G5qw#WTX=~#ZPZ9I2jk2}IzfVsGG=*M7TU}jJyINls^`!xXH~o0^GUf%8&SpsJ zIj(1wE9=;K|2MjZb+`RMv8wrErTF<-AHHhx@0l`;wfum;OZN|v3{hC*&&dW;K!FVx z4Ls{7dbcy04lpy5>uqdpU?0xQNrroFS$!f{DG@xVst3ft|7yhxQDQc17Zz&gfBy7h z(FENe7{@Hx(~0FL0n$@6XFL3((JtcGiX%TP+*C!*5UF4MUE6>`lZLuF?$;}@!Dbx9 zL!g39o`{;jbJUw~29r!Y+~2x@(f~u(qR;fX%sj4Lz6M zp5ES9XbbZh#I zk|H4?Wq|WOT}-Byh9q=b&43n)>Ni7sW(C-RT7{Nr60Oi@EdbkxfooTW2T$uxa&@2I zKWRT3cqVYQ?53`v0bjoqzjn9FFW`BYae4>Hvoi=Kc`_%E1ytcCch_g8Zg+sFMcmvU zT8Z}-CyB*^-9Z6dYO&Eyr{|CMKP&iuHF1*xE`VA!0cOGZcH}9GZY}g(^os1q&!4@= z`9dDHy8gdF%0G$f4QXi+A`|l`rbwcA1SRzaCZ%3O4yLpzjzd!7V#RJ=tW!A55&xUA{!tXI#y-wu7n*t`K zrmYu%y1;v1`^8%7LZ#LS3?j49G*<8Hji@^7spr-_q*GV1?LpuS z7GXu~7Mn}}g498<>KKFozOngB{84cK;J^hOSQM?`isw&=c;iktUW!`4b++Fng{-L~vAjW%ZdT_5vi#YNj;YCXx zK5dpR(d}x?$CI_mG}br&X-6Fc7o^pID?|IW4svXfQwd!zq!pUtan)+=El{g4vey6# zz!DE(ePIS33|LWR>~2;4Fbwl zU0po{2*;*BXe-9%M|O1&SYXwF8?T;R8NGfT0mK7mh*wk!Rt7ZY43sfZ8o4h}WKsYf z0F{#Nw9EI|B@xI~S$6Jyg4RCJU^7$ebz&4xF8p;ZU8M{G0=o%AC-2P|`dYgMHlVRK zVbp72FMGThsMz>t{8%8LU|_m%&=0sXtH|1qAF-c4eTv?ZF>?Ww)codr=NgD>4xe+2 zw!8Dup6|{;@<)p!+!yc=V`c#6`EXGtz5%?7UJyWaepilDHKL|Hi2gS_>843QrRtzP zVoIppz1Gp$+Da0ala!R~v;&+W-uP~l$Q!U04!2z;U@$N!Y2ipY1EIBE{cW|UEI%+7 zC>Dtylo#+vZbqdD`$SM|GDY;To#0~v$JzQ zpRB8%{|b-~h-wUvqK3`5Bwv^`<)O6Vbq%}5YOBmHjHd(HhX=v{vK-3@aoHN!*qbUg zUC8m>uejcRr}}&~2<%z!uRnzq6%}iDuU@?hKLE0|*8R5zj0#`xum{BevaK?EmwL$^ z6S5_c17O8_J4L=W;MQ}`U8wE;@6Vn;upCxZO**{?A!x#v&FO#bY?_32xs~m*x}{&~?}@!1Owq zfHM?@O*!yRRV)Su#4v`^Yfx?0^!RXF=kv!B$a^J$MxendfWW4QI(FCdA1>&D8Gs<4 zM9~jZU4T1iX=$OF&(6(l9Jihf0Lpnb!d$Zs6Whlv2W(JV#4ivn1F5u%r$D}#{hG*a z`dymMVZX>x*q|%|2zRajjVoZYB(Qgkq6{RaqoVZPqrL+kPG2v!cznCxmD%INy*CK* z)AcZH`1J#~dq6w~0X1~q9>Q${SPRU#(0&C>ScL~gHq0u|2N}pJZ$K^2U_{WscktkH z^LFh~3~bh$D#KPnv3%@=gam7Q`==_8;CoQTxOc}g!(a@@8<-TeR^RhDHahK>xY_`Z z_l5;-oo+a%6#uO^%-CXOWmOkn+*y5$GrofdA4Uf-B@RX)K0~>wc_t)XuO61!8vDfL1f75Q3UHITu_0svdt3Qy;<<-@) zii#MZ*n;zp{Q8v-mdw|?*-o$r_6M-o1VTqPsJsj>tUEZ9+iKIR^OpSY(a$KDZE+w< z3PRUefD9IXlhf09GprB5@xb^l{wM;{7$}Swr;ZzBuVokcKD&=?UNK{D!Fj@#ZWM6& z8dj8o0EYL-U_pScZGu`M`SvX>j1vIHAp6K* ztQ=a0!Liu&Is)(xOhEO#21tl6w#<0X-MCS!!n?d4PE@6>DBmCjLV911#^SajeHq7v&Z`^xKcD#MPCmU+=BNW0&4Ch&>Nh@ znA-qio?vw3i~8~1{8kNmmBwcH3b<**qoXvP|K@6*r-jrl*~5$uKz3QoNHWw`18*Iq z(yh(SX)?uw#7KnP8K!=_TWk-dz)UD~jN~97B8EYH0nI?AUHJj#cSx0<{B-J6o)9`< z0h%KQI6vH06E7%%PMf`A)WAcf-W=(IA%yxM?F(WF%HMIwC*tQrG!}c4g(V+9$~K*V zz2pa+RUtQ30WUh^7HxwYiPHa666Qex!ut|tiGWgXZpn<_W2K;y z!4U$yZkW08x#OR$D_Cc(-Jz#2%wqs%qRryg+590)UyfyR1D6l=R#fNp>lC}s&2kJn z?jww4$@##9>CsPoFM{{m>C=f2v7l>-8r}=MhGlt%6uh2)9S`8F!}GTqW>jb>fr&8o z0!Qjv=1XX3XwzGhhx7E#WWX=q!(2a5yUzilpnjKsB@uJADl0W+!0?|h#K3^_ML!<^ zZJ^y5@Ec#0<$98Whb^hCP4++WTf@(DYh8iu?Q@V1FwX%9PuFqYg=E84Ph8-)f%qB% zH96X-hF(@yb{nJ@*6ryAphhjMYuqmtK6OVtdsiPAGK)`;bgrT|N`g{^H_d1b{i6Gol~h&H~>)8$-(J z&ha~LMjQOYNxT$1xYb=}J_s}S%>mqzFh4*Y=A*JihCC*Hl+q$Fiy!E2V6}iBkKd^q zqzGHGKTcm6QxK2&c+aWvs`SkRalCsSD0v1TlmI0ZS@qsZa95?LgIT<6opbH|6 ze(+%gooh+|{`ms;(3vd#_%|joDs}D8BL-I1h*$j+^iw7WibD1YF=5r5Hno?uSYJCz zif2j9;W=K;E-VyRRk5th5Z8j@Y5HFeLvEmFKHYzjH15e8^K+8}W-*Z7lWSLx}qPneF|D4`?TpG+g!pFQckCU21vho_y`->z+?{f3I(@1ks_{PJh*} zws%nsZbmfg{Xf1f9Qyy)&C-*bN9zJ!E{udSeL$}P89#gA>+9=0qs-rJR%g-|jqAPh zK}SPCaX=!XnjO~o!bJR{0wn^vs49NXGa>S4EMwudwssNV^zwIMRsL&qclhBb<1t-%(X&c)WrhTYp}oWCr!VF&u?NQazyPHw zpMQ6VS9f;w+HLjN;W)B`flgisX&u+(q{4m#{!kRJd{{)(ifw>imHJ>@>`ZpSi=B3yv5rsu!+N{|RU#iC8x3Z#WASt-^X` zpjEP=_$r{7;N-AZoR6}fztKVW?>V2p7f(GB0X3p{kO#{AN!4It3)b@8x0)#n9nTOf zx%WoKM&gq1Rw9D@Ut{DO3l{#}DI{z=TX7NTtU!K-#mC6UMvdsz-a>wI;?P(0t5aLc zprc`j_~CNJW%>M$e^Gs*aIpy!G{Y=cDB4;Yv3@3btWW5CHD5SObXSex9J)ES7S1|k zJ9Mfo?yAysx2J<>0Lk3=b2GWJ!YVR9H-}WeM0S}6Y?b2rdd=%km6eKnya&R*r~BFu z6vZk}^7BnDBc-PUgP+#@R%7lET1JN^%LN2h#6)gyQh2^I{ZaP~Fm(IJq3gyYFh8H5 z9Hsv>`&Z|;e4K~JX~LbVIKP9|^|Q00n*9=l1j7+>(vEU0{Rgp?AdNZ~l6Yxl&$i|x z0jR5Lq3aj@b#D}lV|t2#*y5-k0=w8pV*SQ1sR?LZsM|X`g`g=0bSWXl&t^AzI_0dV zmlW+r?6cgd8Vh@k)gGreXqJf+gRNe97>NjCf|KF+~Q0fu{mYT zIRzEFx><6-_8SM@fUA)BWYvcaGBNky-skpCvc&Ya78w1AAH^W%IgcihG#Cb23qWhu zK3?sB9!?MF#F>8kSqHRN6`*wKbAE6XDg>VqGd% zhdA!T+x>SVsEt{c^lj8^r}s}rVoc>crBSF#)ejDgu~-6T(30f<#wE=0 zsMM*E0|ixM*ZoVSPVMs8X9jr4fG6bJo_}hgW0ixv@Z{E6;bhg|ds9B^StbLn5b;9) z7IAJ_J0^vNf26O6FuH!E9Si8hZh8A*qi*!#Rtb{gz?0c{4s@y`dK}%6jh;V&f|()^ z*JH2(4VWU6zFiemE))+f#vksgy+auM=~u8&?rhriBXElGuG3hXnaDGRk%ymu>r>_D z&?##fV4aEGY`@D`SeTy&MvBSr>5q(Ark=Ij>r=!jPBI~S|MR>Hz^#)~SX=;o@?c;{ zM7}j8#YBc_2dpRr4-bzf;2gcnl|ils=dG{js4?(e2reVW9{as&rg|Q|i07*q0=isM zm2aw?7%{1nsqEbHM5swqHz%S~F^=E(S^tb^k08L;_HTst(mu9}{}_q;l7b``&$2!! zHpOPF9A*_q;LtR9H_WCLW?vjmOtW*Q%JJ!J(y#HOg%g{UN_zV>1=3 z8T+u?>OIO0bQxhgZEki@r@G`ZcIYy7xl_tQz&N?4&J6#4}7il|wb)j;u zB{nvDIdZK8m6Cw66A*IUIdhxgqe|HwlyB2mn%E$)?(Aba`HAzhK$|<-z1rF!{Hdmj zX@Q(p9K2L@e|M6){akT0xoIwz5NuY#-}X7&B&N_r{?^ea6`#2 zD|;jUO&B?oalG|zqP5&VHGnd|$&Yq#IA2tn;a02shRJu(4Zt%WOiU2|jMwN|9|J0< zLWXbzT37dQAstFvAbhrD+=fqN?Jqj4okvt`iwr;0E40-X{)$<2<@^?zcdu@qxH^f} zL#3po;y*T>M=2`jeiIIqz^kE|F72ZxW*6_^D?tnz5;^(|an-)v@Z}Z>l5(C>SFP$1 zbloE=g@j!z^vK^s7VP=1>L+ABY5H#Vp~37o@AVKAnFQupuq?Xc#7y?$0c=Y5R^TM2A-q@j$GcN{b)sSpdPLTL^lWv~r?kI!XHPr~2@0CbZ#MGz_!vL6!cFQo1kO?1U$XZl%CgR+{{`VxYLN{fQPhmo zs*wwV2@FyImJAFGU7+a{28tUwm|HTvRJ!yPg;`HD%QXS;1DC5W6Ih8y8E3gr$irZ!6*R?c^qeBaSC04*nWUA>5CR zBP-$%bH)+Nkc@I~eo8>F(SEfm?d8P}OcLi|+H^>w)3>w`HXGo*n`xyXI4=2wwM{%r z4?>|AbkbzNCJIm7$>V)EI6>on;xm?m-*C)6& znY^WtTUi<%tLD3u0350C?>{W`Aw4_=(!x%YY)NK+=S$idmSFdZ;v!USD(i6z!me4V zg=B+D9S*n`O>}NggmMmDhbdZX)JA!kXjmd#5TfuD6A8&saC$l^WnYdInPWOiZPi*2 z7I*kN{cr|fr&=m;oI`?3J5ou5D2=hb(f;PsMp1gu45|lfJR6tn_<7;(8qK(hZ0ycR z1bWwb=pKBsKDXT)?q1tW*2QvOu{l2e?BT$RT85Z%=&)iHumMdQ)n5 zY!f1x#&KJJ%ke%k&=c!Bw?uZ|m@6GLqfi|^{#K>~mkedm&}c)NEf@8f8D{-OH2gzf zPpX85Vmb8QO?M9+RY8aXT8uyMr=^y0z62a;Zp4c)PLT4>~{jr)YV2s8#ilst}02a(tmlzu?(+HMYl0}DrQ zOz!`4HuLL%O9Gk}jE}D4823$3i`*ivhcAsMt40@k@<`7*sIfo-;8NxbGPzE_e2|FN#q(TF2~H9&!!iBS%npHB(}+y$ zy!&^->~#T^6oIa2cr`d84iDBhPxPsGKeVLzi3VQymMjoI9hgANt>-$6h(9bDJd)Nd zIGh@K@y3ieUdyb(nGxoyHZH-G<6mxIs-qeKl>~B3~e8|^om0xOc_qm za59S!520KFPr(W?#d6B70LwyW1TVe4ZS*IpWWyI?iO8pkD1X@$6X|S+nUSS!?gH_i z2D2bLJG&OOql80px%zu?q)%)e6u)JBvfHvFOxx)fe=?J$H<$@2F*c*?L%oOv@bf%O zEYhrTh1!aOn_rlvmY)-38CDVVNW=5U31_|)Adc_gSu)(aye`ysA?;`>ifpCmgTmWzT`4u}&C% zsC7ao^|akItA2fg1)2m?)wb@;^8}1=bY2_tTj?)(y}M+!&@1xvloc`zZ;{P@Yi?wU z+x=GOAF~G&WgpTAVpc!F0(iaeO{FO{PmJCqbk>O zRf&d3eTcg-*yF3o>z*t^$?{;TB5nYaf7OW#j{&2SXyw*Jcag40Py&;TzpD>yG0r<#I}l^&zd?k+pNj6 zvJnyyd__9q8BB6nCy50r%wloyHa|U4oiEsWMR1W~h7nSrc96<2TV6Xh^$8GY>4A@g z5+L4VXvn-XAu_Gm27$UAh3wONdX%im$xOk#Pg%ROA1KV=Ih4s%yRryh3Am3#2aZ;Xe^()EgwyP z-V{vx2D*L20=El~91QE)fN`pUOsl-iu1gqbF6Lklc~|?%^(oI&IFIX!*HoY;p$q16yOZKs}}KULR{j_94ojXOpd za22kE6%*xj<>N!JsS$z3hoA}44@om4u5c3GEGx5K7hOk}(q-Bo`_9J@O-QX>TGlV| z%LNLCiikY06X5KX-a#cjZsn}>j!UHIxo#~oc6??jBnS$!882&&ugC~=HOw!i`rk6R z8g@;E)86Od7$I_*ZMim2&dm}0{eZb_Bp&#%k9FaDm%;a(NHgjuPdUT(^ zCM8CQdS}SiAhe=ZDWF7b+h5V^00jfNPvW8=vU~_Z?}xeYm805rk^Cdu{;Y3i(8==f`hhV$A_jq zsi!%G%k>v7Yz@Bj`zKz8#d`+ttdt^1TQdkY3RQmw4@a|E3o0GV{XuN~hQE(#^}~y? z%;sRtNCQsV=mu0r_ACo(AA6?RBHjHGeZnJkM5>domW@#V7tq;q_w+5oh`hVk}kUr=O5@YH5PT6%hR<*f~@D53TFt% zJCy085Zs90j3KTUeB|uQWlAg5He&he;(n3wgW3>yfBB+J z0%;4Qci@AtRky=R&;$#vjEHYLg?1(Hp`s0+HgECgY81XO!nJ%c1Mj99bU^a+OVtJsa5|+Cu)}t1#&BmH$M42qIBZQbBb#L6{0s z;qWsJgGNcB+As4Bj^Ef9tEDNAjnZW#`t> z@5(w12xt$X7Euu20GYVyTk*b?!b#Mk3KB*7djp|ray%nTEo`^lv0>BepC&s=6e!wec_;V z6*9cDEV61+&B!y4rLQ0BIM@>&>q#0o_B706hI#sqP5H8)fG!p_Xr8#h+A9xtH=qY# zli}i@_*KraP7cW=u9ue4QJ?WIBG-F*%-3Q!Or(0W5IGhK7~zN_VAk%k<}m|5lp*57 z1)H6m9q-+ zD9oGoL8Vw*vPM0^Fnw|{q-si+Ggw20Sz6F@)}sLEHy|0@jidV-aPQoHCd!I&e1zW! z&ijZ)6?13`nytjbo-A5S1cWTQ5YS^_0J;Cy_8jn!AV54%bi6`rHN4xPs`Wq^vVCpkE~l~EDV|*ll>M zf&F3U898DiRNQpDaME1WDnV`{XWu2_+J{{J&p27c{U>Ept5qZ>aPPmYJwe7>>16<; z(bjf$y+8ufh_RQ=j8Te-M58>mqXgZ4LFT`|x4V9!^`U^U3m0jFP$F?_deypc{P#ee z1ok>($nlE`s!GIy-iP2`nmZAI^jl$PR#0`8{blWFH%kwZ<<0na`!&%u*P6q#Uvj2QyPLaE|$0f1~%Se z%&Gn86eOjHxBP$+?!-w%CH)yB=x<95yndbApcsqt8oot`HuaP*L%{;O*jt2R*>#i^ z<~o_y%Mx;E2#@o4TyCBi&!euLh)u;L{pF2q;eTK3kir@)!9m7sm_Yayg=MuEL%Ehj zW5G`dJPhdGdF_L?Na)hC_|8AjhL;DOYcNer2>Rtf7@ z;p0~}Y0EFs3?&$(5#ch(3A-$+>ttGZh>`5{Hz^CW7&4!u@(Qw<>?bB}!|xia{#XnY zN5c)i|3%gSeIf30pPD?cQf* z;EKu?xT2IO^m$f=`*CRnN?%B-c-!2xCAHdey_wc0G;n<{Q(K!b#((LTM`yuTHmr6w zx1kMn=@tLc{MQ09XE5Pe)Wn1e4xQ&CB^60jziM4lRG@y-Lk|?@=kd>t~R1_9#5T<$$7&4hk@LpK9i( z%fRF3e_SE$;!xl>wjlolZ=ZO^;upTiER%}0I_ayz%tu3h;psnujf^JL;#T&D2&vN+ zA0VFWaoD^R6EpJ^=<;43ESP`K6U`9za_qDNBlF5&ip#s*2sVCq4d#%gHeQ6FC|Ez~;msZhUtbpE3E&Jq#M3sm69S#$uNr|v` zg>Tw9s!hZ}6^O0q$?|Xh2Os30;yiMZ;-mZLHEV}rffi09l(r*F7%YilaxSLRDYP6K zHGd@AI+M_>sdyHrI4Io@_qb?)5qy%AYYQ5?rP-FP?wm;BmUE>8NQaj89iPHy0pvnVC_(T?~WG#8&K zP(7#~Za5hfVB5y^M(~wAyD9C9{XSY){qsppe(+YPi)s8tov0d?^}nG4sKm@UD2!Ys zT}Ml>v4u~p^&5-0E2ixib113Nb4%W?gTO3p!T)ufm)BfxR3P{C9#j(1T30nfc>wG!U zB@w0#yWA(HSb{@&XOEQaf|l%e4oFu+-7K5059Qt&g>CrUp#c8A(#7*o(^V2j%sik# z9*#qe8|@hlcm3C&cAgAGjh{-i;?qwU7ErpZ3*5~2IleMs#=8AVap7=^BiHr(k;5ve zKb9$gXxWZTK^dY#xHcuKm)mXg+EkKJhsO>b*1BnoCLh&+78aZ$FRv--HNs8XF73 zagY3Q84jnuws?G*bGYB%j~^+MtMes=7U~4U?B(B^4Gw!d*m-&xo-7e8EE}P2wvm zc8H~GjYkj+(C51C6N!A5<};KP$mBmuTbo zMg5TNEYl*UK5$AVkF~U+K=l=PFjBDLgWUb0dZygD|9zp$v69#q#C0&jq^_+^Soas( z?b}6Enj_m_+RRrs2@^;f4C=LtfvRqkqieL7}^k_|!WO2p4^+{E>Ue(-`Zq68u%Z#YnI zj5>dT`$(odrGr(O6__%dwEQ+ms1t%8KH7aDsc1Y2*I-qbA$>F`cp5KX)D-`&D#bcM zve3~qUXXjb_ge_&1UN7JhxKQMee|JZHY$xkbQh1SC5FMl>8ei~Ln@e0F~pY-gGUd- zjPUPI9y4$rt)iQ;{wN6*^vC>le2cXHEkr1?g6*6ISx-GG-M|$M04U{|V55G*QoYqE zN#G2uCC^JP4lYFj}B>!RA24AI_3!#LDJu z>r8u*1$(iDvdHgxQt^#VxUE44sVqZV{=70xbBb=%b{JUA=#7!h0fF9l*Qf3S6%{B7 z2i!`iG0!TA^eu#NTg=_rOiQrAu)`Y(C^GF7M=^#M1&A6jnh_ws-$KFYqF^;NxbV zZ7g#3%*j3iK|Pm?Uq_y|x{|9;aY#9GqYGjeYKTzLoAMA18bN2N;fqv*t|%!&hO@mX z*#Z}hD4F$PXzxyhY)yAKDyPAjT7^KNUGLP_+2)W41SjM`T`T-XR#;mB^m==XE|N+! zyHPe9FiY6htpUsPfrDGzeY$2YK;d`b<3g%GK=)2f2}&g8MTaux*pXl5vT0_bO7ZvU zcGsVA{O0XJ@yBpOpeN7OM^Y}ZP<_tnv2uLP8H`-`InUdaB#TpNLDJab4U~x?P+YKM zT$(Tzrf+sro}vXI|L~@LCKZiSHkK+et>}U8bpK4a50BTeMyeJXAPkn@Y6vL?-R_>h z4k|lh#aKvzSU*-dW|AB2U;}2Lk4*}@s^sqO4nd#W|LTJ~w2YkJB%^Rt>ACxJR`bz0 zKfbqSZP-&=m=CjT#h}4ZdZmqK&HVDkBTes|FL*6afIvr$ zoXoz+!e>Ker)(8r%Ju;!_U7rR( z!vhC6hw=k1aKEzQ`wLn>)I-|*XKrzqZYB77gk9hsP4JdL8yM3A9$<)n4l6CBa?thDNTBR(6kYZ-7Pzx_n18}BT)<{emCCaDP1e^eoNjJqv- zhGAP*=+Ks`Tzf=|AN;!yB(egA2i#y{?lbYe(8viRKy1zb4L!{7W=W6_yW*P4`^c@r zFBYodp?Zj7HVlE^tKv`#O6gGPph0xq$6!Y+FX_?(x(mabN3 zIbC5M*cDsIA?tCee|QegHgql(IEta`@G38~zvFk7#Hvf-p*Bhlyt$%7b2}zXX&zHx zT~j!G{7Ljfv~Tr5)+))>MQ_Tw)KEefcdx;<;lp=`Z(s;2Mg3?})CV_@%o4owoW;30 zL@3xZoxkv0Zwi%FBDZ2_0)F1M5tdOv2ZGyB+{6iT1}^;s?V|oE6LqH#vLl;UG{T#Ak?pBXDYfaU23%xZ;het^S z49}g~=&y^A`r#t%eigzx(gygi6*xen`(q@<(*}k;qk=Q{VM5JUZ&{-fy8%W^bD+IA zzoq!$pDf(Cz;Bbgsmgd zjGS$K+gA=f#x8(Yi^tF{*6z+K1~UXiV5I8lkO7L>0d^^V z|2|{{8n#gI?ylv>NHQ%3b=4%Pel75-cC^11%80Z-y41soB|rw?#k;2Rnng3(5K8D* z>E$4)*>A@FJc!~~GtGJnXN8=N{b#-t%(O_U+6t=ipPoJKgJb&r(NrOd&{IrS=BSOc zpUzr~ti`vz`~>racHKak9q?^R-^Hc#qW_3O#+w@shAPod6Kc!Og2l~V@Q&cO8oq+ zUe4^Jl%nU(PihPIo*B9i41H(VChJ-b2K=hzYaynFW<*w7SW5@sZq_B~9?zYtxl8ac zeM5aD@m=6^3%J1s2s!W1KQsd)7b#`?9Et#=LpVu$0Pwtk^cHp06A3klZEsAw({K%5P`)MNlX+?L=&@{&U7C$S|7@80JNcmGm0DHE{4~ z**L>3ZyFO*0}aXN`V~lO+eL};lISC!8c^xYZrpYS*fQFB5KX2zQIEA;%swp~AZ+yh zmeGSkWWuwW9LZz!iTYd8NGeQcs8|2-7mKKJs*AC(^Rlf^P+%{IOj9DEA5F#gEvYZS zL1?shIYP^H%Zht+$R;OfMoQW*CZp0@f_Ku$Z87_32=y*Vj&jxPE!jKoxM0^$z>QdQ z;7`Hss(c{zRV#20=Jcqb8-?FH|2H}J%o?FgO-ZTN|A`{vOFl`vtVQpZf<3N22K`U3 zEB_a9Zyi?E!nXU4Nq2WhBVB@obeBkrfH+AJ5J3Tva*_hlt%4F#(kW6-8U!RH6{J)^ zP(T3@gY(SwzTdas@9cB-zx$tcxvu4cImVb{j3@5hven>aGKK@J*ItR^7Mr7_z zJ3b=iA6UIn=SAcS7x=VVavDXz2_6|KcHmSn1@3u>`<%ExgT}W9RF9W9u{59>D1YNx zUv*9Pg?7;@dUQfWMo^S6U5T!_vT)~Yt0ekPf;3pE3$`7!o3 zW|ea-a4)!PJuntU-{OA%KmfD*KU99vM8c=LX1%C41ZR&OQSS98)BdsKhn3C2eQ& z^U%oUB_HlxSCdpOwh36;?KG9Q)uN-<$f&%dG!6(7o9Et~)|ECWAPxQezU~Y!^gw83 zjxXcvG=%^GvaVo+0WprJvkN{k!=T0I&z~TOy`Q0PxA)Qf+I<9hVkOtJa~e87QW(3; z^>)*Oy5{UWaSURqojCGDjce8+Sp3wT540eNUxC>#4ifZf>af+f2TBP2OL+u)7!LfV_SntG%~Z&YswBB@k)ch?ICHf~T>^ zt-%rOH{H$_r6zsvJA!+vJ#XC51C<%jljs5#afWGM`|M#xHwMtFXI;Pavf-3x=QBdY zKGgPF_bt^TWiF`HM+2BURo*615+4Olk&DFBvFQn;^o__Eulf*4<)k!HByI zo)z8DP!&TXqdIgK9w@{5+bd;Wa+ikA!L0QBVd6I6I}~wM=Gv zUAmI0Z~2ro6r*GFCMxT?;Z@WYy&o!gavd*hw~M&WXQjJk7H5r)bU?y_8#!TZQ@bIT zQ*4UbFpVj};>}f}3&M)^XW4EkaMarNcfZ|begH2B*vns=d>Xs<`5oWlk~(q!57} zVW(7Q#xC9SSxL(Yp=OFn7A(%uN`t{!BKaJ8eC>@<`kUL^y+D+T1UDz_RoAfl_{;jT&sl5P-?=-&6QKK&{cjR)qF&dp;777l&(a`wXb{8}nMQa*5@Xf^6J z?}PXc7nWfvOpToI9E0H&AAEb#X8~bwcz_d|aIS;zx)034d(U6~p)@I_hZQ3H6UPex zS8^mJ`&s=wC+$hICH*;j2Gz@C64U${R@V%=bH69RI8L2pT(Ds}iLPbQ8)wFfPkxjn zHek>^rnOpOL06SiJZ#y5r){9~m^fewJ+d{)oycYKhj3!lwxx zK?fe-St@|#9yr;k9q#_|2Lpy9=uI7&I$@hhLdpkt2`tc{V9%VIp%|xQQYbLsTTid? zur*@uuHij5;Y8lf^f>y{-QLfQT5p4jJ@D_(bzd-t{|NT}b9~SOrbgdoEb4^?MR14Z zth|R+ZK<~qp&%y}%H1Hss7a30+NddBtJCbBbt$`ez-_~kwYqNlg|8oC$NehnI?F6M zC~W0|lvT}`nzZRe=nQ7^zuG6p(+6qjab2{%Y0&x^`TOCtng)1Rfo$^j^W2yFNz~Z^=#`Js_|jgBR`tJ z!WC?@r=Ud;^$XCm&ikS^Wbo|Co@`}vXf$s^#&dAF<(y|7@&KS=cO^o%~% z#Vzh(OU#LL$#1^}@d7Q*^!IC8K4_!h9$nbtc;PFry+KzM)Ss z?A}xG;-{0e&*=oP$$7*kWG-O~Vwj+^~lPiFVf!W?CoX&zErTth}eVa|M z%0TEDMO0RVnYFS1Vc_z?cV9b$2j7RLG9z%1Io$tjAF|i?=P{6L7_CI5XeZ6IMA?Y) z*n9-t%IWF9r^S*h&^odnue|%R*TtrXDCxK{pC$)X24Lk@U}?JZ!~XpF^Epz+%%GmI zX%EER!Wei3fVNp_bxE^O`NWkn;M7jkrJ62I=0q!WNu6*VtEvBFYKC@77DduY1+>;U zeZI8w@o8BgfZ^KhYdO=)y57P$#v?+>F}!%S6&2(-s06$=yT87b^PE`*hpjLap5cHO z>q?xQpN|8K;0o8t(Y^mV?tL~rxVrU>nbk5}jfjY7Ng2B7llyAx7dnCIzIl`?wT>>)JZsaigy z8U4e#uqZL6Jp^E4z{-`AV`lKit37pfD2S!h(~pAf%i8Uo@4tS36TM(yAf#uIpR4Ok zM}U^;zMQc-a%L>bwh9Nn`lYgd^M$(mD1D5R&8?#jLk|kH44qJVG%ud1aaEx^Ztr(6 zd*$AnO(2vsr5MP2FDL*rNTB3&N+n!dI7Si1d!eEdk#Kuma=d6&AFpxxJAp;c2fUfk zJ79w^QZ1cucd1&`e_9k{Een;5#NH5FTt@gNZE7XY6v8m^Hf~LU#h*>V{yjmTYY@RQ zKp><;kNt3cKp@C8qB}f+5iti$JHW!_X5BHPBh`x?Sn5=Ws6IvAJnO%F|1(Jaew0!V zBwkI5y;Ulc!C%KZxXY*SPC zr?g*S@TD=lQLcs7N}#o(!K~_tiW{X<;mXHP{bT&SF?^;@(X7fp%`$hxDiqK|cZz(M zK9&l-{~^yNOMm2&{SB{HG4gT%Fx_H*w&!U6Na!Vjwy_Tp;Z%DD@}CM!g1gXk)l)GzyECZ)a_Q%+JyB9AMIx|qkm@7r&%8g&Bm8A{16#zGailOE@Wxcck4rh9k0Wc(CaV!Q9dhkk0O7g*R zM@vW*J0s~YcqSD~d5NSrx5x)`<#em=7`9my+c5Q!7^(lxCFQyHg)ju{v2ljIID#fX zFU_Tj{=(gn-%EDJ#@9b+ab7FU9rg4Q_CXeb3=MqxUXSG;+~pF>#ww=TnzX1nkd*)% zfC2%^0g!ck0dV02WCPswD13jrhf*F5*bCo*i<2TUIiJ}lC@bE5(R%()wA|wkzb*V= zhE=9?)Am-$O`9v~pDLx(qasF~dNUgNX?%IlZ|8z4ykNc5d`p!U9x4kIH#JEtpY8j% z(XuD0r_#Blh?J4HOmD^vZ&@_1*Y1W_p=$yJSV%m*q&EUH9MR6_MQkQ=E-$fVQ$EYw6upcDlJHT68)|*_pnz?kjHysGi%z*j$*#E zGm1Zj;1#ylla*M1Sc1v3m|U>B_tZIAT~p(TxXJP5U`-Mn5y9Sn+KRT%;+fM2-c)^~ z8spPTPa{pLBHpd*H7rK2+IrGL<-W0BTq%HD= zj!fe@;p(2aBAff0g)Ik)coOV5{YSXf?(^v-@hkVk6Lz+Chn=0>_h{D<$AF1E#J42{ z!C)>}C}gQ>t)v`9U-Gc|dBAxGXDv)!gy}K!Eu9IP%9pnjN7hgK5ZXG%)gk7hoIJ3> z(=(x%$k7kq9N$`ffuU#28u~CS`LY+x|F|A|6&hLHTer@Dyh%ySzJ&&-yxUqRjOL@z zhOtDM=azCF|s#joh00%M7HsY9M#wT_t+{F)BkWE0haJF@^a}IA@U;>Zj>gz^=^Gd5HywWhOSpX7Y3*fMD_!=>X_J6P>QbGIf z3qe~|E#Mn;o}qQ^Emfc)o-0H1l3agNK3j%ndQkpYVvfy-vXQ0{wqj!!=)Osrk}s?K zz#u9!{0>N{rCbJS?ENNmTA+%LuHpK$?UbNuY9oJ3~BqT)Niv1=3=JGSI#Nrs!nhZV-c`0yLQ)B3) zFq%wQ9ERtgM_R|e`H-`$oLqG1(&Azw)Q)8Ho(Y2l;+R)0m~x>v6x7JoSM9`nY?>=JWV9ODXs1jlHAs>8%^lb2b(dX*I%xom{AIoSMB;{R7_E1_0$bX-pTn@~0o9TdUo8vB zV*@=Onw4q^~4_cDPc=D<0zIo267IfwqY7-ZJ(C?6dJjTD=Q^JKGd0N}rG6P9<8RFAE z;F)}ivEkmwH_0PcV5haKkxZqN>ZfHfz~75kW=Uz*g_pA; zf!6h)g+gYI@~JqxI0o3QrcNv|1Q`LPWCG~47EC&bE*)aLEn{aE)%D^)v zLZdWBPA?LcaSy+MN<$`%NSrXejIdV4l-MWV24NJ&zXcQ`9Q0cOaLrMc`?x0}Si;Sn z0(B|AB`6h`(8{R|^DwgWGG>==5a*7XGS|W)WR_Wl$UL6hCZUBtilFL#p*RNR$XZGt zo6(}vk3F43QfN8Jo`~XL;hIaBLTAoV+xVbPrzqx{FwkOvw8G9L>5u>=mAmY3B3KRP z#`fK2eFYX5&50p5LINvyCZGEJ)yc2l3gurDt7s_|TB^EP>-;*vq6-sO^KJs7O!iOUUyZOG&`FDn%j^ z%SYYL0PK*i=gexpi!rAPEi*i)+(#$CXK2-+fc;P~Tc&=0ZoqIR#g>RDR(wjcufV22 zSI7Oi4YO1O;>H+(G!8RkRJ^%3!jojgNTX=ur)l8G!05PlmyI#Ik*(FRC>G&>daT)N zp6+lCkZI5|7xeBXC-)AOuu#0yLVy)DJ@Q@kc*)1h>hzh*gt7!Qij$r`zVpDlv3&;psG8zjvzNP&H=d+!!t z$b4Yt>V3{jPL?d?w|ePD}M;r&Qk75H6OP740@W`D1+a7uOmB zUN&p;ry#ws#Bu-+zQV8=hWWA|Eu5zNwF9`5g(LjoP8R+m_Cr5X@=Y5YKOQvpP0~&W zxujVhD9tF>gt>0*cUZGD0SQ)oE;jr*m)l)C$*1^4hy;-yUy)_>NG(dJwHP}{xltOx^qN1XwChR~|`FNv9y2cK?6kcZ^?ZP@lF!=RQgd6I1 zTj*|YSpl2jFQfuRBE*l}x^>I!$`!6d8yJs^G2O@AzuY!&Tv{=YEKKoJxG!rK^thry zRDCsb3n!}fN>XyOvttMD(M{aDC~0fY4hYaVQgsa&$aTW1UC=|M@d|at=(qT!8Tdnl zm4jdJ01I;Mt!GUikPnl9XIM~DLNuH$IRGHqLfkz+E(ZHHJL_`_tvr+JTQ1%87>h{L zT18zRcf}#LI{V?SQ$2B)HdkL{FFL3xtG@qp6%2S=LUo_==f7$?UzHT3ZZJ4iYB0A` zuZ4s`gDed>2$9sg@G>A#)IkZ>;q?{xh06}wKn{+%A00L^^A zLQ`_Ih)FMOo!Qa^rh56a;oo`Z`_xURbUcZfKeM@YU>cHntW^S@q&y+bz0QOUwD;*E zgbQrb;6{lXa^Ws7Ah~p363`&HSMK{Co%amV1y`U`GwSh5PoBBh;Tat)t0)aDxL&5=&tPV_91>zihFUl-)c^_cQ7icy;YXf|S`Z8io(`oSM)(&;V z=fvcRq-;~KJ+v=;Q^s%C#)_ZqRPoywt*O6@9d<%cyG*Tc6O!ZRY_J={5wCEV!S3(4 z)CfRYp>`8b;W(!4$Db>t9*uU-=2sF5StCTB5x4WKIe;Y9tg?0no)Z$7zK2s)z$AqD zYMwvS*Ow<@f_N6%1(%Y+40nmCDT|?1TP%ojpN-MpK@FC786Vlx|2~}8S0>LNyTCs^ zRg@)P^91|lyH?HS-5Lw0mkt)W{4_jnsjkRX0RiiuAYTCbHZfTu=!8;mF&==tjz3yB zGp5Y<`z}0srOzDzvqbTCXP+3x495)YkqHH~ay%@|C?R{}pXwCO);zsSY^1l-d6^)W zl1aQlU;Dw_2kZ)$dW~jC{2K%0#N z)C#!-w%juH#2zRHJ|tL0)$!#kPIYMv2rFTDgtIN;Apnj8DHmls%pQ&a-k1zp_cdsF zvU$^8dP{BGj4#&=5C_Mz7ZIVAz7Wgh#@6s+qtEx%T_YW3zMl$A-gn7#Oi&allt35GeEnp4my%%L0!KCgne_vD#RC1yPR#Z^frqK^>s4Dh8 z{GE0&Av}%&+7%HL{-815o!@%{z5uMly2um&u$f)no8fUVObL$ti5>ZqogVb%Z^q=j zdT3+WCC$ZP2s~Hz|Mh%@P1&3`}VfZodV$%X-(>O3SEBp zvo$QJIo&o4MLq$IdI^Ffb(jG+5u85>TxzP7i6c0;F6^aD4hdLSQyvjaW_0t8Gk_3C zRZs(*m2c9af~j6~*F67uu0+9m3%#i6h8odTNYaWECzca8kqt1Q$DD36f4L-0#1v

t6%jGDwH3J?sDq0)C^5-{(3MzFlCHr{#H>af0L~Nc z3^4dO)_Y)BMs8ymq{^7oI3FY;WX*j`F@3Q2fN{+5^y#9rk6X60Os`1oAD0zcIR!{N z?{fE|42=nBK^e2K!-9WbyB_n-onje&z1w+4D|mP9gzf~lz_E?b%*5d6nXpAox-$lZ zSu%ij-Rq&X#uuh9n2`lfO7;5EFb)|IBXr_wwPsRycVTxLQwa^kQoD- zr-Ai*qNeWh6Lq7$pAjYdxE~U36cX;du`b|*Ab{6e!k|7a2EUv{Hbn=|XQ?yvA1Zdo zkV`i_R%>r8b(a0W6@FSV6kT$&_Vhm@7e3xBsHhO#7M(V||JHz%smV`PS5j&dtoOV0 z`EoSc=S+vD4l;|ZG#K?iCw(x_d<$Y!e@Q(y`6HV`XZE!|rb!cSpbR#_lV0oUh3+2# zZ5`cj4T}dNrEBx?#@}y6k8z!=G}Ol%YG%QPM}WPGxfJ49fQQEGZ~~^5A_y=7;}|Fq z32-a>GtJ)r%gFnn@H?|s95*6hgS5F*pg*70_SdIg3;#;=dg`FhHENEH@$c(?=A|)HP@%9`>L|R^%X3;%DVPwgfOK?3RsXmmpwJu=5L%lIB63}hPAV&u#D^BQVE9?2QI3k&%` z5TZoyK!u8z8su(aV`1f{EWISAzZK8 zjJUMzwCN{-pce(!r%zaI(QG#N;x(L62?MymC;*qkb^`nH<_eTTeF>~*q+l^0HhT)P zlOD<6h#6Q5f3w*O7?t~gy)JBTS3aP>fZ?GVeioI5G4N-9#6wq=^*~p!M$#g|T@rLHkuWUPC%o4|WX4JxvLZBTN8!)w(w97Q5SQLaHf<1dwkpi{kK@LI7?cjuZsr=V(c@whR(=*6Ws^0{!J8)R_Zk)E=m?UCmlA{oRzwpFW$dsO#w31&a~mzGwLQeI=HndD6OZ5Avte zNU>hgYb`0-DZPj1L|E?4;XaQp4Q6p7o#7f@tVtD{k3(FzoZSOlJB$Ot_pWPh)t-MS zO9~)5lj%l=NN@Kz+cy!?(&bAu>&7BoxdsBlcNbk!%C|(bieK~eSg}_OHum&A$tfl= zQVM8TWIWU5l7GFK!d1BL)3Uqg?d}KIear~l)`1_0oQ{=Ri|mkcWJG?`{HsQ~k=vt2 z7EAxrrJOnq5sXa}e}XwbVCXc#jU%xF6Na*uPvLn>|KQ zy`w+AmKqaJoDfbbzP)ft3u#s&cB53skYY7-pblpw4*Ww9BQq4(yrl1q!n zH3|nY`6^3MPR@7lODoO?hH6+7OFc@pB~Nis%YYGw@1Pt!0w|bkAq!2HDBr9iYDPD% zw+~1z67Oh;`KBl<8VOUflIngO*36zR?L=>c95>57RntncCQN*I{mQ)YIG&IL5)=|v zu%Ys9hh>kXAJKh|P)$j213n`%iHPUA)@a27KjRLzub;^)wijWfWA$L11)flrTkt$(mYU$$S_OsInz9R zdf)FpxC~=a9BgIPV=VTj(ylv{YJD;BqQXq-u+jI=AG4ReSY;`H-L&!WL4(m_*Hr01 zmQ%IJV||do(6j`^$`Ol9W69>OK7FiA%cKr)Qx}RjTf~k-0?wa^L{lgXetOtwEH108 z@K%X(SKn-md+v#UWX@r!piA#z?s;&j$VU8QM%9pDyMrW7*G|EHmI7wgb#>B<7UmqE z@tS`GMK^I!zg2vi!5P5HOLG`Q@rO@(KS3N z+f_2oSwY_gFAZ2Q;%u@o;RI^zQ(lfhoqp8hmQ9P1%l|$GSO~@;rok9-@k*#1;TdD` zpD450FNX!QZ(a%tBL%CvC>#mr{52?%f;boTStFD4<;3lc=UwAv!?x#E&07hj9=b|P zNzh~B{~J89NpV4nHtOr`eN|nW|G#&8GCY-Vi4D+76uW1Y_Z7~nSA25TvE#Erk@C0$ zc8nKDCz~;D{c`g^1vmHd+1I6-d8lkFiP-QrNJVEg`!YG0eHv{#@(E2nII)9;O%^4d z4`}m1p48>mKzha1)phf+x&5ne2?)md`eI@A)nAwWaN=qRbixg*LA~Au(BLSbUY{*t z^nn%Y(L{1sRCjkb!)sZ8I33Dt#4H-fw=9jnx0*3;h;u)R+M|A*{U0C_Z91VKPSF?S`>h~IMf;WNH*Nn{hy6$rtGJ0ABQLA=Y>Py z1uLxV2{1hDj-5X*A-6v&TN*X@4@vt~hH&=}!E{on$hv^X%YU&LIyRcbY6OSVh!U z2s1SXvP}zS`i9@C)D=#9`=;Yg<`Ll zTaXljnf9Oz9{I$3bH!RUOoA0JF5A63ES`& zHG&7zvd3dL;s@TX4)k%{SeG~XM913h!@+DkLsC~ZaWdS196p~iO9kD%z}2jKt(eRJ zyQ}09+2kD^9e@6+

Q^_ald2bl)(0{27+tM2~cfeG9a91`XJl$m~A=)P)3^qHEO@$}xv%+AJFw@;NF&o2;#m-Uy$ z$2on0$xVtV#P#Pq>sPulkKbLyT+6tKug=>_c?uy%Qi3MAb31QAEQAAB2nh?L5OBxf z0wHl3h47_g@ckX`?nva69Z_(dkl2IrGN3b}5(b&qnG|PUsaHv5vj;3ZLLUBY&)U=?tD@dl*|pEE z`}emWx}#sRKPbkNIt9uM6!;x*NjGpWLXZ{%?3S<)#P;iQ8|W}NlmlsCCyND{L76oHV+UN7ZO>Cl4_M^M43&2HaUU*^dQU8c$RLS zN~%3}GTOG*JnSxW?SgiqJ-%9iJG)>3RetIvgjM-t^zXm^vX2o8j#xb@6bo&KL-PNz zk4JzzAs`^o4apdhqi&IXP6o64>AJq^3v%92P1+uyw<7&TZeImi-{AR_BHoO*VuvG@Isdx=kbZ;RKb zgfp+P&+G$H=AxYU{7l(u{)cIX^-1&4+;5_#Y=oq-p3I?H)NbcTiR)#rL;V1z9m)Sbdfa1kM9j^tcb|8j5NTw z#L)7Rj~mIXN8VDb6lQuiH%c%^qIMU2wwlNs(z4@)7Y)vhVxjLw*t%CwK3~n|e%VUC@_sg^rM-5Kr6j z*1_b(XBf{1T=HntHYsyeG=Ae}RX#fLaa}I zAKXIu=9D8^gizUJ)S)UI4h({O*QtrmzLM?}J0-}T?_}X&q>@^OHqhEU&5aOisS z)U3z+=aeUn-7L8Y_ZyZt$+mCrqesyEn%5+re9*8f{dPj_H^GKI&ya&~JhjZ&RpCsQ zJ-0&D8x(!BHg!p8pq}2>S{?d?LNl|>8);WeqT`K3#>@Q8stHqwtlxw^sxpCBU@EIx zRE?V6kEYJ;8_RaN6QQYH`UE21Gzrn6#5+`{21APh1@<)K?M?L11a|8*?IQLU`%g+= zC*gNA4JeU^ptn=F?4Toq5pE>VOkX4fJNv!+HPaWl&q%~18J+o3=33{2Ib3w%r*2LD zQnmB>NA9~V=0mK7A<>lrC*5zXSs@97x zJL`K2;A$PvgAa{9LjKmeJxz9e5mMgh!|bDue4-j*!{AEHhX&ymd(~@sj>+=#m)&o* zLI)hN6(xNnT(`$=1*6r^_>V4@<2_>j()V_5Uev{rs&2!TSeH3xAAmncq>^}#E>Upv zk@bA1sQu)=yhm$!5Qo3OTuWvmR98=dj^XFMgj`EptVh|~X*w<^Ej>$LF zW~eaKxvwV-B~jfhHWW?KWKC$INA~emQ&#Upy;2N&`@qVSvKL%GERdj*5?ReUgiDE0 zQf5~7xm)B#9-`JXlJ)tTG!g04&5+6W_W^{~af<6RUUc68)v}BSB;q=mkdt6lPAjeK z5iasB&3t2D1uVd34in#bih``x>h~##+ea}N*4Rh5nw7V(un~j()~?L%QkJ~Wg@uF< z(nYyTW1Z*TUPJ;Aq$Cmji&KjYgqSxIZE3o%X3RD#X^3H zFgwZf=j>ivB08(z>L^o>4|3c0?<3PMcZ3goAeR#nd&DWh;c3wL@0W?Q2nKMX z)7a0}GRJ3}T~raY=k>O6TJX7bb*Xp1lMPsQ)sI?>STUbIAHd;FHj~LQ=tzh=G$=z9 zoyk!MJ5YLdKdJ=~+QVmBFZJ|DkX3g^ZgcKnW-sKg=Ih&40t@UP@*c^IYq25UxN6N4 zt`D<2yCG|s_dcvc&Tj|pq3;B-1#NxU%S!L?C%bv68yeAFDcwgr?G-=JMOq4$6fQp` zVXOj?#jCgxeyw8<)|UfV^v(`<|1H{(V*AIf8t`@DLE!_D;q5&g1apDOd!0^^G~J)^#HHsc+8_c>4JEg(rMhM>@?VmiNNzIU9?4hF4v*d&=J6 z$ae@<@7K|vuj%-|Uoz*J=QiJwCL(Tp*54T;5n?eM%x}V#`lz3E=(HyRH-b|~2f~g) z=W;MkK=e9S5eLM9n3i}*<{)yYksmr^`S`wxaE$e+<5--;cGXU=-MeIbL?TatfAkD{ zh|BTuLz#sb)3y0)WZn*;TLvbUW$mU*t=EglE}bUU_1ow??7!^~70vP=mERiMtE65p zod?$v%-RRM-V`u-DRz@%8+0kXByDF%)Dv|h+rGAvgQzSa_zMi?AsJdj>`EsGqzmGz zOUPN;g$%f2bjd4o_ZjEcPw5b>)!k#dM^sIkMXNr4SY59@o?mw2u9R$Wpr0Z4kBN{r zOV=dGPy2e-Yy`D)WtU)IRE75MS+ChpIV2G4p#>ChzgBcd9S}$u0U4DTlsx=V^Ww#ea~Df?8}9dO z)R6vtR&%Z>;l-9s_ig{OT3+PB6s++ zXWZWLg&^$aUzWapLd;3qHKMQvZ|c_^nbaLI(^W3LpOVN2y4SutJNuJ&0xJHKiFo2& z`beILHc3wEs(7u2o3YQ!S6jC1+^5KZvEV@`c7c{c%Pr_m%HVMa!ay)eXLi<+H~}W zvQ$)6!r2EF^hY0a$$sB7(P=I1W^sYn;(|)-%ryK~a5fbwCv5DxX2LcoWW-->QGd^fB!!0WXA}upNNRaZrjoyDyZTC zIUfUxQwYy7SG?ShME*OWf}!3Jv9`3tqL;T~p|&PJA;!Rv$O*LF-9K=~x%YQZLO*=^ zv}v zYC%x@OFZm6Rn=9!C3Z~`n0kQ;sKC6AB-%ZyS~6+vxFb1%+bhu^@{8jtB#^LqQPW?j zpJ8c$SddJ^Xb4Zl$Baw#doF6m2StSBQ?|SGWt7>}D!8WTx z9sP5AQ9#CnL;QbbwMY>{JP(+T>a87U(L0GUwLhelwmVX(gQ<&p-m|-+cbxsw4&K-D z)8OJlq*xNfBB4gdohY*^oCdFLF$rKm zWtQ6^bdaO+v}YzqVU8`G$nFa6{3#h$Ned$B+OSQA{pX}gBA{|FbApca@z-lEVi3}D zuc~eit}}IW=RZ*^AF6SGJqmt4_9UXx+VkPnGd^H1(7bf%!R}vaUPxo{n`5IVwsW3@ zAI<>@E_&s1{RHT=e8KA#)32DG6XY0iuI?Cp)CFEB61 z3Hx+As(}nHzvxE~27jD<{G!7hf#?Po3d^};2rH%NSLfa$ScaU)UC?W-K`)YU=Q8k~ zK)UJ!w07J!6X&}CVnJr%B^e?SuTY4&B68+V@yFZ6`CxEqr7$bcneBjOXjx@t)U-z* z+;ZU6ZqH%Lvk43d1H>lJ=KDYz%`_PaEjCc5#%YqU`fT;Deec=fvbp6ZbbogJ!Vd-( ze2SM(z-VmrLsljWu!K(T|80@uRX*$g*%D+J@}E`U#)hxC;}yiGzJYmNr4u##XUWaa zuZ=Np-P11Fv0H0rt*0X~KIz@m^nG~vV}32o6}OlM?k|S69M)VZXznZDXu&5Hn7vr| z`_?USL8~x~;)UzlqsS2_jppv|aYxS4_^+eCXRZ`XuNeNwU=aofjMd3vavXIiX7*(j zgfFq+Xb&F$ z*HEaj)2z-aSvj2wnl*>TXA7TnNV@*q_^Mk2!NV_)IPD!inkb&U_r)7{+q(Dmx&P6R zB>MQock^GmmO3lDZtK0P`|xB*?=XKoeUcj;etc~?jEdud&7`S9o7EBS#*6;9olH*1HED@)Dj(ThzG z#-L8J>wliT`q#@*g-MRkN)iy(Rw}BKn1eY6 zR_-;tLLoQ8Zrj%>epQ`dJ^XX%%o(5fXRlLm<>U#cm$lad_++9^F3KxH>H#BrFn7U+ zW5cMc@~2Qd*ashf0$#pMX%lipgfWBMqX-voV9zg&AhtWFkML#A8tU{8L zCE%kRI$Ssw>=_I^b@apA>)Z?q!VA`!$FS=^956tRb>BH$&OUkjVDH|0OR!rL08q@- z+&lsT>d2G7Kxk~b;Q9EVWQQ8&&#VVko_^qDM%2&Wx2RLdx;)TBxa=5ha`w~{t|d-S z=FS?W@`Za}F5a{2=~SB&8ckFjhp?Ksg1(jRfnOK!!2USuvJf~!f?z$#Y>P8LwH19) zm|TrAEA4-BBR2*LY zrkqiw;^4$H9Q)?RPUWcGp@Glf{|7v3Qr6TgE^_aI5EeE+b5$u^KTqXniGHG!0{(mA= z0Wt#GE4RLQ#(yy(g>WwB>57X*g@u}vp3f{fUXdFk$M?C*Ij(;kP%MtRL0FVQSX-U9 zWUt5g5Iz137_iZ^X~S`tBb6#KX6!P!Yn?;m9D6k0PX{|fAP@RxIi(JhO0G9o^NdT0 z&c|U7RTuPO;QK$p0BS8$SXM6r*J{ukMLFI0-Cv|hvfqD=3DCzN5H&{o-~yHG3jFsh z4$82Ay}7WlC7B8iHpY8-1Lw^8=rj?R0>r+-Ezy)HGVC&_Q*2s%9Br6Ny3kmF#KGRu z6cXAXgVk(iD@o)7;WBL>0ryK%hd{EE@ai0d!mFC^TVi*vComVHXmU4}370FSe-Bj_ zIPZqWmU@QvMbJdlc)mrDb;531AStXTeLOiif8B1<7=G)u8wpR~^(|>H#Ywi4Rf7M*Hlua#oI->?=@f*t@9@8Ww}^c;LgC{uXNiy4 z1kUJxVDta;SW*hMufxxui)JqPVudn&3l2)S8I5?s;2N1c$Z@7 z*sly%mm7s`Cc51t2g;BLRSp|0IvS}}!J#&F`>=5SYlLp!3a~!A*WT!U<0^ZX?E09{ zM=#&|6GRThiv_Lhf#Dp5EX}yR&uw_%f9|vI$)mQt$g9txPoRuX46aXK3MLy3N}vcd z%V59|v$grWQ+wHWVb;56ZHLR$%U;)`+;giRZo@8L?C90xgrLQfTqOo%*MPg7{~bV~ zbtp(fV&z0l2Pzu|BE99gp6m2wfZuY0Pwm`S8}^qkvOcn#x_nw+aLHD?`uVST-6yn7 zH45=DM>!6~QZok9$JjcKmq!njCJs_6FBRD2mYQ!rTU+ZiA*ZcGq*Su=fkroUI-#nP}0+@%jAZ3w`Ae&8a(5{$lfMQV<*@9Fw#ks5%W#l{{VG+ zr&bw1#^%nj)BT>l1qoq{Tf&<;qgTQL)*sxhd|KM$`|gPJy~YskPOUW84xFZ5d#N_( ze%14|)cghg!TVu|fSz=lNxJZ8@@|<6Y#b=Q43dvacDCXAieGESG6U^;J$N zZSrbVuiK1l-Aq)0O+GnU#CvpvCkOnT$ucO+x6)UjD7ob@%bt zL{{)hZi&`!n4u>%s#euwWp;@9&i-OQvS~FaUMY44dLg5hSh%N*s8G-i?(eq@xyY9X zL->r9j`nx&QRdG@St5dEQ#&dUq-;$6*0Zj#VBOJh zSFzHRIl~b_`v{^hfUlzkecw>jYRl{x$LPJ(ko1C~8>(tuPt?l$E3KX^e^c}Bjlmy+ z`Up-l4de(|w_59&K82)&vM9n@ac+csM2X>2pwXg%z$XqCdGL`K_K~ipx!w|df}hyl zQbFR9a8EN`q)dN=K&f?6GZ1^kv(i^*C1R3uhA}Q-UvqZ$gQIm{1sz;^aSX=*&r&b( zk2j%)RCy|=x>j#%$_XIPWUT%4ui|EqgJ+%-^Tu2Wb z#@Yb9pc`Mv03*a*IdAb}=3?%{$6@3nt+jO@$zbG~-*FB=`{XT`P^mLaIk&==sUazd z$PG{GMWcefdvhDs7e3k_Lhe7<*Ze5``^nV9a@e$@FF%wSF~sbb^iquTMYxdx>N<3w z>e74Da&z(hS|jQgeq)|i*jwuBHt0#xyX=NnS*R@^K6>OkZFR8=9KVHycuzvU8H{Xs zdU`rau|WRtB*UoGV84fIQhNMRpfT42;-odtO%X>~v$PtjCS0w6V3vN5Y2#pmr?|Sb zwhjf0BT4Bo!rdMut&$&FJ<8u%(qPC0avE>9X=vRBf?b#4?6%KP(&jbtIs{MMarugf z0?evr+SpQWL>bg<{s_?_l`NrhHBBCgJY59jeYBVK4MrF76`9Cq*d52;G~}NFb%WB*agZyMc~FA^*X}NLKr+fP14H9&Sjy`CnOAgKOW8qb9Z1 zlbKH=z(Gu)vivxAi}zML36vXWO$UP}=K1!DZt1P;d0xN))BeH$ev+@^kS<&j#>er3Q)l$52c@8%e(zPF7OXAR|uj>BGIuw$uO32 z!Ds8>2<}PJy%DDzI(@-+c^Y^=-&d?*h!dev(LW~1N{tMj*~Cpw5DXNDr?vtNfK#KH z@wR>A4`KM;H@wnSss}T&kU>+rjY}s=Z`|X+U*;|oJ%zK_ z3lV*NZz#`yjTN*lN0hTP3gzs0qViQumqTqHqg;Qsr#!RJ*Ka!a6Q6fck}M645`!?U zK-DH#JlH^LmY;B;ah{S~Wr|AQmwG-D^<3cHM&#N@{+93bI#-Ia6i?dp2`v(FPwuG}X zl46QUTGbl!if^LN4}5_LoTr+RZ}s$OEjR`o{jg+#{90ljjh9!;gbJG!xNSqj(xl-q zu0iV94+*tWR#K^pGjvU`n*bwyf1+s*KDq@PZIe0pgXT+tsr*lR>h0VNx6w#c~m3xCA z3SR!X{$v23TAABp;Xi^N)8#I_d_v+H?EXl-Zu~Qz|8^<2!p2VvnAQ1Uczh8GQSUI26 zSoZuC;bC4rCGVOm8(6wgLJH(#IFsE2Q;K67J9!e6m?GOsElnIPq3*WoM7d2Rs}@_q z*DDAh2>P9bFHx*UNb%OGl|ysL_e?av9ri~ zbATj!Vs0)L;(uZ0o_Ego-Sy|um!E^H3>Ui!FmO#^Hu7&DIF=G|Fk*XG|;T}dLcy)mr|G?^th4i zd^Eh1LCWxY9goUUWa8myE{WffFy*zER_+Bu-rp+dkS><1+%57GDmql+p-$zQ zhLh|YATbzuBu@>VgpJM3uH%EPx~pTSM)JJhWABd{M|k?fEr^48~%x_xlG! zJerJ8avNCRD%JCw&eD^73F5avl&)Dtkl>kq;(7b=pr9gqDZ7l&wEPY=k#&tjA_(Uh z7#Nlx2Y>B?tneg|kl`X1p`XLU+U@_3#IWAgy{DS*bPlik3NzWdaxWH0o=d)s-8|%3 zdfM~B-0n9!Llp4zV(Iq$_8pS&N0k1~W*2=F_XH+5=c4zJH?v0BM}nO(Mlt_y;+TRx za*bi$8%@T=^XKeH$gp!?#cW%P3M!Z-YN&$}l{RnPClc?`NGC1SAmjx$V6>n)!#$gv z=z2>T@oTc>;*$LQ0@B0JivC93wKv_}NOyN5NOyOaGz!uPvQfHA zKt!aa8wu$~K)OK*L8O#cQ8;t|?|H|2?m73~amVnBA9Sz1_F8lP<}aS-{!=ZOQRVzI ze9*~@t=|t<)9qfQ^;&k&XDX|G?8!)&ZqG9gR~x~@)(oi(1d};wD^yWLuQ~{E?0CS8 zD3F^Frr%1r8a2;8VVWtBGXx%pQ1$ZEDMHnZH?2@~G$m%&*h4l$zoF$6nfpvZ3MJFj z23l|9N8xBBT9ji$AXOaR>o2YR9@45qOC@i-@1kY@(e^c1c8iqAy-Ory8C>-oB*|77)3!}mKMaD&1fU)a**1w8XmgWq!SDiQ# zv)%UCE8<^|iYFPVdNUQ8gc=eOzZ!YjXN_@o=NzZ@ zNLY3E-QP=KjbhX=n=8VS|IwqK4_hoCLVP~Zn>|*=&2Jl!d<*60pNHmxKoLv(8b%OUdTr&K(4<2z#S#{l1))joT^r8=~#+P$VGR z$8q+&?L8^V>eyU1DjBOtrsvFxp?@83!Unx8TRSGZKU(h3PyWgdR!xveTBsbg!-(1Y z{s<7Y{trcJ?9v8E`%}t>h=6pW^F&TW5{)>Q6oEVETxI+H7R8qp3+!gl&5^$XM^gW1 z{MT^xki_|V+j@x2;A(Uu$cU=iwrs|~qSU?#9axZ|Z>BaNC6pXGbp($Z2_ zH@80I^bCN76oBrXFaG~e>W!CG!73Rt*pq(*K(%H8A5jp+pNpm!XLhh&AM_2e+h}Pc zYpn7FK(gc+U{23*aTo{_Q*^S?QnBSL;&`5bH987RkLYzMS1KocUJ5iU`6BIvtqD#u zv|iJHh{3qq$@^r_mS(O^8)qf9`G4GODr~|$h;8ddNRQf^WGT=&1@ilUC!blGo5z7s zY=u$-d$1sbye#O|G4SLQv3x&GYvW`Uck)2q+qV9zQUmmn2(j^xV78r+j@slEgRh%U z+svNdi=F2~d8G;&lLxcjv3_lx614k0d@Y$tR%Z8lNgY4U^q!n)kh{-od(0{az%*OR z(8Sm7XASkX*~mqV9}p&2Q_(c%f#TwH$85#=NllPJ`o0jWuxt=`b%4+A7+DOw~V|%0GZK;XZ@m}>+6EPNB z;;2Xf8z^uAA*jC3&kVb`L?cCBM5&lhk-zI^M|5(2waJODf<8XMZwemYcdx&%c+Pmp@2ot0SxTHPpP3Yhu3**6*pNUw z(pQ#xnVu%&dMMVuC|`x8P#nG8HPiB$$Zj77#p z3ql{4fsdU4%0v?`2gqfu9bXMXh=DSoqZAYr$NL9g}g2s6)6eE#>h?B)f7v}Ci^#fnAH#SIqi$?a}25M*b+m02WW71WOV z{4MdT!A40QRI!H8 zKh0Dp%%fE+IR>goBw5GBaWZg_)69J}@Y2$22Hb%yln;!W+yCv|5W_~MS`GK7Rg21Ftfx*z{6VR6qN*>FmJduy6!*~$#t~ly(HZM|3nxB#Pva};2>}U(tZ3Ys* z>W8Jb2Bh$(@k72z7GGU|_aqqoc#1(C#P~EGE*E12kfVa+uTF4)SIc~k_KEd)h*!_I zubCc>ONQJ;rnLW)s29rFpCbyNJ!WSXv@U=eGnY*h~{{~PS}f9N&1 zxw(;3T}UBuNY|O53a<_rfeb&gvk!605}{@)o-66)u%AR}>9xMZblp$td*oloabNob{#KkU7%YT6{D# zv^D@y`w6CU0r-)?W2qLe3ANU&0e*A+L)FcV6HJnTKZ~{2Rm(CKZqlN@EI0+77GXLR zKavk=4&bA8+N+1B1IIgu^;i7m^z~LCtWcRf@-74-ATo-hU2cj4^jh7mZg61l`+R78 z@hugu>8l~w7ZP^H;~yrj(*D{(WZYqY*-vvuH^2)3s)XLJ`zvvR&C@|F6!pf=K^U_8SC`b# z+0L8q5r#vjT~Uf@9_>yn*^031AEWS$BV0S|jcWrpm<(yXLl$T17!L+Gk_tLgo%%%* zZoTLVSK;mP@drbme~5nw5l?ED(ZBZaS43l!Jr>T4h-dUjW-BxxXN3v+ zH*#N^_a-U8V}tszBR@$#MYUs-$9zyF{DfS9L9TC{XqklRp4x7Rz5>CAFb}6$i&7pQ zR$)of^4H>JYLZpvQdYe&VE6S*3l)D)i+m8DRNH{OD4nfSp!@!{!Eo{}yzHIRyGWnn zmk8K%hYWKF1buBvLq&@_B%oB!8`p~B9$j?D_9U^)#emq6tXCGMtY$PJgl{t!r5_O&#wg(EIvTMS#JS_gZN!1P?IBL|{ozK0FbP-Q zFo&z8<_O)BlBhe$S*kk>kP|0eQze0rluc0clAuj)dwDhFkVT?P@r3K-PzUY#>rxiY zHTp$F`?lw8UzCICE(QO>cLght79B$l~TQ$r>TVXM87NYQ$D)8E5GQUGi zi=`MiLKWW%dR``<6gEri_dBY(31Xlg!W##hCnDeL7|uRX>B6sAS4@5n$VQ-fYCcVk ze$t7ERQ5@=TiOei-8Q2)`VKg-ULH)%?^#1;XGh8oOWknFTw3QgdQVn-Da0$zm3a$Wz>n1!ElO64jpC#m=W+E-trEP z!bWq%CL={~epZyZFPDsA;g5{Z)tgiHeuUpW1t%3d(CWI}=Hocg05Gax;qLEdVq`yM z%*w&O_rdbxvY?o9u@2~3&+?E2`bi5FJaTdG#>JfFOEk3<7^(t~`xPmU`~h5N+WnQs zyu!P!)&}RNAr{LInT?=5WgITLg=c5uMdqDD9g+t;iO!|P3v?u$scX* zh{=Me`}Hv*r3|pz+8P>QIM;ut;*%Q!8G_aawprD4WC!*Crm(VPjyo>q9MRUSiB20d z0xvlaqR8R0#EjPwQ!{x7-I_@aDdGyVDD6N*6ri0rRq_JMFjfabGMPkdri?UU(UZ*t zi;|)F3F1PBLEb3^m0@a)s3sjwXwY5e;(et00_))RUQNLz!RB>pIw|0Od+pxfr|<|| zjw|Sj0(BF~_u}9`-`^qEHK{lFNMR0WXih@TUmYxihd$TId@g7_Ur=FMltI{J>fXjK z@wz8TE05HU883$Ae_h;bRKb_OzNg0zmyue`b%5C*gUoUqN_jn~tT0sjJ@FJ;btaks zRgCr12}=3f2H;?!!`f}89NWReZJd0#P~4YhvPB1c}Sh4 z=Bh-!eo&SCCxSk~FLu$B-2_iw-sV_OJ`t$sHSd+?Jo~aVzGoodz)gj0rTOoenn>J8 z10Ue)-9QLRiqPgHMEC=ZJUCC6^q9!}&);xT{7dBA_eg+n^r-8K28}DkVA?mXQsg&N}eY9`#p`cNK-ZdHp^-^ zqc$?j%XBLy#aRZ6rZ;Ws46wu8wQt#^W{*?!!Lxs2XwXR5w$64kOG#?;pvw5fgpz0)?4U;Y6mprEW zs0MReO@>|vo1ywQY5+JWUl4dn)pF5N!cqeP|2KvAfh)-Yq(Y7mF)$$K^Gph0 z6ZB&-31mW~;CUW>v;k_?VC@~?o=F&h4#k*tO}sDTo-7gzj4w_o8}eC zMiMe%_BM82;PjRNy#hexOl)EBsKnJQ>|d%xk#Ie4h)PqYZo&S;LTXd$AY!3w(UfRL zrxIRHrd654g-?X2I6zkrx8~&YKma!;#<7kKt#T6te-Oc1dZ=Fw-eYgM?^)BA940;? z3@i~33GZo;Fs5mslm4%J{Fge* z;zcLwv*T__Ub**u#ry1z%SZDk`?f!fo3Mmj-fn>pQwU;zz zI*USt>z!+Pe8153HT$%p*buJZSSiLzY=FkV$g(dPOCnX|7yg97m1@ESAdz0;o^+n; zAn`q*)yAMC{Q*nzH0~zL;2o^5>s|30O160LFy<<(L`3}GqMW=l?k4C)`w6C(6^du< z08OQBzbL_bh|IL0un@*=T5IH<`~ts_-0t~nQvp6U3*uN280BNdlDd_hQ`Y>p?f9^C zxyM#SpJ+w~-x}x%D%Us|a5U~C8My$w=A%fAY4B1lV~}Y&GZfHG@PCqYtJWA@i!0LB zB->G>nw|EN$KB`yQM|i!EP(Yd=ciL-|COBq=@eV5CrpthLcezC?_!aQx;yI&Ab0j$ zZN_>Vek*zL=c|7UVF<*o4((C50De4B(|{vNG^=`nKF;P(Tp~mx4}v<0jc4~mbu}&+ zc^@314^ISQmC^ilJ7xDhk98KpHzI-VGJ!a9??qbu!Or>2H&ASvHr77vKnKmhk{AYA z!0QZMlj(HHaR4GVLh^Eqdqty@kAd`$_*++=du0B!7=7o{;ht_!%K;atdhir~c7+-R zGq%pD9$=-8zVy(8ECawgfIlEvTC;sF$wL~UlMI2B6Q+x+`Zk>bJt1O1h~btX)eV*> z`&0~s;R)bDQVimelcPsMerwzJsQm&1$MZMs200q8tUH&<{sie3Whpc2Gk2&JPqC&~ zKfuI_gH3cqo;OeP2p2M4d^UyfoGt(CZ+}B!^AmkK8{%yw(LPd zHv=V)eK+Z>HYW}Y?a0(QCz+SWsPR8t58(^ z)DW)vOr$mUv!hLW@!Ym%r(j~WvIo)#Qu7Oix;-a74wekSPFj|Xb$}A$J~UlNid!ru(EZl&2NB=9*>>wLqf@+79)nQ1%y(I-iZ zm(>J;(GvT^rN+JrY;~jtz=i#dNAxxYoS_d2)EUrxp1Bw_A>R0KVMHeLE+i0p)ZqYJ ziZG7ET=}EzbKGGzbBOIJfzQ)_&;5P&?Yv=M{y$ts2@m?eFC3l^94CDS1NI$Sm|Gil z4u`n<_HMDk+dAuTN`AMfLLP;`Z_O=qtu=sz@QDL?#C+RhN*P`z;Yna23mh4nMN_co zV_nzXAPER(iDV%JW{di|)LMC}4^iGdMafO33b`_2G1X~Rt`@1P+G8+}|3 zG8*)Z=+o&=IChC)ikN}wZG3Kj<1xqqiA>)J19fwG`)gJS@l`6zy-*q{pirF8Vm?IF zvH&UwV9=e8+ujm`Q*G3cL!V=cEIQz<13daYW|hQVKwEn^FM~m*f_3UQZ(VKTGws22 zw+fmLBrS~Xj!*|nDRCGk1#~tCHzon$LD|#OL}nl3>Fc>S7yTa{YSd3T93I*kL<4c% z3>s=GA2jr`bo-hsFxEv0*T`zPkh~|`5)^g9}p-{F>5pmMDQX|Q;Fj) zbuuEVb@wEF_X>)OQ2;?V8gzvN7(FgJ%KhJ8Nub`DVpXzNU+o4s3Ln1q=31Q|*c z{yL)eURk?B(r{*NC1c%0XGO;}h2jzYW1j?DObdspbBP6f=zg+B)n1f&D|3lhPahIJwszu}icslhKmA4O$5N!OeNUDyDD30iXBrfE{a_XqRWAZ=-fK}qK3Asw zLg(Fp%iAz?!1zEGra-<33Gb{Lq{X-wo$6`b0F1!NIq6LENWK_L?eyCebI4FppxESA zUDDVG;o$LcXux?|fn-$V@k5i|5+9*yw_)e$VQrz}8})5LL_^g*y?vV;HLEA}+YfLL zi%js`FPc7>v3W~XNR7EbrkO0Z&>or$eI#_e0j|%DSS@bw{_&W+;M~OdlpFzqA`&Sj z0S<~x>X2#1NjT*fUbq^G`-acQaj0)nCXKR}j%Y_HQ?Y_l9??2_Pv#XitUS@xxI%(7 z$6sP)7ib+{3i`iCr|BbT`1PoI+JHB%&ETn00D;iKJQ$W>`FiXf%OO~7;3IG-Qvac| zvn{b$w!6k_ppXp%Ae-#Z1YYmA3vBxq2>QeIfT-&6d?Db2SIw2Sjla4*#vLo5l>aXg z(a*az>2r>XkHUB1k9n=ZWbcA>72fC~_5%?FcRckAOTBq|Em|K(zv!9r3@5+md-AwS zBEC*+uYBkAg=Zu1 zV6t#7`7R~EbitB;a=`M-wfW4_61)3Y{Lrp|N(pQ=k~$?&(0`5mM+?g!!^hWI-O*`q z0qTUEQN7>6yj4_U=^nT-6fgdLNEv>}>N)X(SdwGYet!0KCOZgTL>u--ZP%~tDV|-d z^L4g;hij!m+i!>-GnNWvgkw0r>Yk`g;)Och!6)YXX=M+kh;%c)U$g`( z^lGupcKSA4{888^h_p|O-+`eTygV-APdjZ(w4v|0?lensu zq)Zu)Z%rLXDKGTL!;;^@Qg-~wCKnqSGKb3pw`V-u>!4=LaIh$+DA+1NwX>&bGUwH> zt&{o&kK|MLlhAhz_jWo|g7;M?#qqb+VX%d@e?+;}@AZWz5T?eHmb9Yv^il z{jrjV3ro0yt{VT!kr+cLaI{S%0UbnfcAqzNRUQJI;e&kB1Iq{Ey_T zTP*FzNTMBMPQ6*8CBFG#ewHQqqhBW6HZ+mL6P=?$R)e|fD;tGK+8h6B6n*8~&E=tO zZ;`Arjd-7B+DRubdXD(_K+HA=wSWUWP062%Ap{A#DA{q?YdkKv{qJx`Ez(;w)RqV^ z?D6#Hubq^g7`eZUfcu>YIPdnL0cW`5cEFB|&$L5bvV=cTe7v^l7rk!{nSfL1N!r8jh&2yk#SRxBXW3nIPtBhhzJ8| z(F+NRiqy)Fgx(Q~D#w{bpMAW@6H1IOd}6XWQLRLB#I=9W+NmT>!gXhH9E>Q&)7!DBvNnu0csl-1Ap}cwXCI}c+kkB_C>kgyA zGqSh?y_%1-^0(7McWq)VWW%IzKDr`V1T>v1Q~d`QyP{Dxfw*RJOkc-`O5=r_0&Ps@ zUpX>(ee{2VKo@z2@ zDK%91)M8xrp}ytV1WWY&Uyt)WzQz$=gRL=E_X-sn6vQ>by$9h8xG8hdzYXI}Avlyo zb&eS5e{%IliyBVO1Oea>Qgr~>0_7oZK%926@!|ZwYSzQNpzS!R02iHkdYj>kVS_(7 zj>*HAguZJ_;fC<^gP zT;K0LZYpMjQbuqH({Qh##RmS-@gxASVsc=gFQf1ReqVHkKaDO4_?(sN9uOl zcVfD_+N-g|$D8=D^SAzwREtJSQz2aME3$comKDm>U(%~*x7iRvQ#Y^RW~wl1uOl}S zBK3>Az*l|QX(Fr*gZW|h0!Nb)5rW|UFT2HWYU!D#(6hUnFW*Ay)*gM({?9jm7KSdW zY8)>w!L@7^a4YCL!1W|JvB=_xn=V_BkkC>erzFLMgdglZmpZSf1$9+UB;Ry*->?1V z9~g)eX4~^6rN**#yEg&_h&;_Y{5ZuPt;fp!-6Ck)%k>b-zX5u!&Fh{!Ss6M49l3vg zNOb9PXRt6x9TooxYdzk7&Vxci<6#^YyWrN9dX}fkHB?I7FuaD5I*Bb-1eL6M;zD$x z59veuIM`a-ycZM2h{9KZOf2wZUB3cfHJSE-t}X%iVKYuU0S!+2+iIa6N3rjVrPnz_AuNQ$ zQ+F3w(B=*Dfq3wYX)#~@Wz3>#pish*;tqZ^JV<5Vr-3KCoBVAvD17yx3g*4z8{01IB6 zDJ}Nr^~KG4MOf)>ahA(*z4V^sy@> zGHrX!{hVaqLAY4y3*q2!k+*Et!1uh$2ufrS18I~+!JqWm2oE(GAm%hoBm#Krkoy0+ zp8P4x3aAon!nKpj-r3nfejo3Tc z`=rT*gO0Vp+K;JSJK#9G^v)L2wZSC9R*U-EPs} z!ayl_1W7dlqN@I#)84~N2Y`J+R*mbyWbxkv(;nhK`Hxzq2YlfyGMtZEpU$5hS^TGfz$sgrn47}{GOsy(im-9|$ za3URCy&vBB-e@eNO3|h4@Q43S`01b2*kE;q27RLwNAI>nb(wS>7#k78;V;)$^qobK zU?{(N@K)Wj7kXZa(3RLiMb4(1z4xR_mfXup?CAs(}L&M@qWJ^526gz-8 zG)KfO-5VwWKs31c_(foFa%Y&elLe_<1Ss0*#BZQ?64@OJux=DOlDnk4!GKKtsr~)H z)+kN)V){q@cTDckPw_Gg1BzL1o@CeRdI{qlSapN>CJ>;+4{zZpPj7yFmfWZ^Q|+oG z0u+ZIf9DW=qp-_M+HIM|zelkC8oH{ULiku`P;N7vl8^=Jvf=0J{HXvOQVX9u zfCd5s34=!NMgW@0A@}1L;3rxp>(RqtbL}pJkY^$g_)74t z2K9Tzjb$#Km^`v#TCAjr6&V2uUeQ{d&= zLe8O-`!I8`(~xL4ZC;sHy!y8Nt>REQXW{DVYI`H_i*k5)c(i^p?$e}_ zmKHKF)Q$_*{i~CWDx=xS96=O+e+Ri~jWoFo9OKU-FELEFgBfdE7HHdA0(P!EN#%Zz z={~vd+_d6nZPTb9|M%6y^R))gXOArB;#t&P{g(GC|9>~g2cbIhdY0_iLvu-ahFAa)lzuJz2%EaNmmX;Q9 zgEAPOZVtUPDJM!9N8^@$Rj}Qjs*#Rrnnc#kVB4(dWr6K+ygklrWB!`5cn`YUrszRz zjzKs-qAb+Dy(D#M({ejk8*}Sl;6*M#k&~fwW zXB=+n#9OMkT(&ZI)yjoRjz!FJPPqOY`Y?+mVyKMtx3J3Wb^r@%!DgORzz6bs@PLJ7 zJ&#rg3E~0!@X?=Fw1A^9hPgxX3LLC>Q2Jb}H>12I`oC17$>%~})l2n%z)(|{P(~Gc zRaREO^ZNGMCtu|{QYtqizav84OpSD_{($YRyfA5b(WZJ114kKWp{2YXD7-J=&%-;fA{C}7jrdVIV0IPwTZ&s48)SQDe1 z#C?EE#{VE*UgIr_ndc3B;-Mpx-f$llIl{9uZ=WgkLNsXtW&OPu&C+>(_-*jOl^(u? zmr4DUZoZE% zYjr7K3`ede<^naf6-|pdqQYQ%4T40JGbXH*ah&#|SxxNeCaoy8bW~!^#6e)76b+{f zp@cor+l#Qj5s)U=EaKoLOlFifYSQ-`cUS$T)0*$_2-6)U+O;ri;VBkHjyL%MKrXvh{(UJl<=+c){(!u(%XUth1> zBM%$x?+K_v)vXD-apirEG5zD3LgtH;`Qkc5PrA3HCuXFh6`g!b1@pm^iiN0bGFT2j zDy_&PQrZ=>@2&x?Pu^nq?cHzs+rws>bU>FoBpVC z-R{WUGXFSKV&BXrnRv}U9;Y((+ZnYI@7)<)d_!BJo=E;Fb-rvBH=OegMt$zFCh12f zya(F)5k@#USyC~K#vPn9?s*ugtY5|(6Ojv98<_5I+H=inEUYmvuWBeF7!LXl!jhM? z@;WK_B#6(%#;}Z}m&s)vCD6Pi!LRx_ZV+d~1!Q~NK%YDKxBNzRX^$O{9gCvJ;}a$H z-e8*nS%$9mGwhZNI4PaD_?ocomd1B9JE;X{+agy%1`GjXnCC>H>tMcWdVXln!*TLz z+a5aPG2htKItuK9G50g)?7pdVKMTPSXnO<4MufZt8q}q7HE1vQsMMf~fbW0F}f3F`bW~VRc z|3YD5VP*ga4Aw0!fK~3{cq$0 zl559R4ae(=*qD`9fU};ct#&ZEmsP8J00#!M&*1ix&lM~mAACx)G{dc&=~gO;G(?L= zB;{I9=wX|N4yU|u)B;Rer0(OSZ3n*-Y*}p})%6ough6VGfnnEYoVWGsF|);3y$wQU zvS1+^VXn+SrR5*6wM&-G3CjsPzW6#ox&ffh_~-z4v&B~LO2A;gr1iG+uO(>~Jm2y_0F7l+(9b!ARb1CCdth7u?! zy!f3JCq)Qb7&k3SbNKFpNmIr(uHm06KN*pEUxf+Vn>n_8)!rgPTQNIT3x+NyQA~>N zU6SRYV6r&>IVfyx72mljEMx>#X?3?U%ebE=3uUXl>^#8)mhU#;>KdfAxKYKy zkGmAPu02H-T*1W#EXb!L+VTh^m=vf~*j2b0?NEH7IrH`>tjMc<9J)i(c2HRbHgJN1 ziVF4MP!MCfy1H_Fw3&!aFf19`7J5!}TO`6zBWfJcg3R+GxNgmRc`yV%VA{c_%O!ii zrzVk6h!F(IyL>I?dIE+2nR~naN&3eii1^GX|L5-F zh_TT%6-3MLC=3pf`Et?e(9_t~cj(eX?N3K&TSVz@h|QQE+1X+}A@* zGouZ7vBr-)Tm1l9f=?B=0Uz$!KKor-2p-~2;lTy+QrO?%F&b$fT9;E)v0U(WmaUMJ>wn5Af&<9>gWz8s&u&zQI^%xcPW6 z^o(dIi>2uHm1B3Gfdzmmt3nFA;lZ;08a7&eiuz$ySw>Ml5o?_vWl8o*L5j`A_9lw# zIb|4!1rKrVq5JeVoUM8}r#6V?Y``*;T+cicy@V`+R3c^m3PLqt+ysHXo(TE~=2W5h zcUZOV`vgWV46q+=kKu6WZ86&IW!(?@$pHEQy;t4d#hJa|-a1)&*C9@B+tZD}hvht; zYUJTYV{^uWk*wMqw}inf-AS4RGir!%Wk@YI@RcFr($eJfJV&^`_Pl%zhTddwX8z6* zj>?v|OZWR6I{Biu`ruyG=>FJ|hmY!fq+SdVDP=_YI$uKA>dC*s!dnj{;GpM8zCvlW z@gWYf3xR0dl*d0$LHmX!Rl!E;a%a_w_VbXQNG*%iYgSY(SJkhsqGB{80s&&qg2R18 zq4lBN@_m`4{>B}Mcv^WpBCIN91Eqq%AU{4c4JaL>e%4hByBE9xPb}<+GD6;YWnM4y zU=ksa@hdWicX4&q@2vUvg?VR?&*EnfrFf(AEdD$T_BL!Ytb}qxwpNNCg4Is<1>${TrKvQHs{Tm`z`kHy2z55i_2 zwd}#JekZ2*{pZ(3g3*8PX2VMMh&whOp~7Lv@4Bv_?T8t~L2DTA)7U4IVu8ONN+-|e zdQVLAv-6BnFoS_s!>3;=-v;Yb6VlERSofD->ARAyr+!S}OSQ3|czsfI!aQZ@p}J%z zP=_(C2(M>ytE`IPC)NH6dtVVQdk*D_-VqRfh2@EPQGW(x-^90FK#vRJb;5?wq5e5K z#{5N^1ZmW~&fVc{q5g*Tg*tcDiBdW7FZnH)n*E*iY-LQc2o?Hx&N|j8gl5v~CcMNf z+FlE3TTDPUGL409(v@i*!Xaq z5bSePcYmjXKquwt*9_fwvu=m2Q^@&ZcpDG)&cBo%JE_)2Gn^-k-pa%G$lNRZLH~Me z9!B-WkWi4AbHnQgB<=dxqS#SxqFMwF+537TcR?SGIubgBD;PPUrrij^6t*Y?H%S*f zRhy|Yh+wlwIpHVJ1{QU7-CME^mj%b@Q^3I60t_M2|9thK`?5Z(Zr^SW8$ltAz9uwo z$zrwlXQb8qr*)PI?LRVhi)xnKVMAxoVnUS_+lBs!B#znmkl??>vB1TKYm>E?y%`rL z!7-|Jlh0JZ53WRo@lFt9`p8foiYVS(U0XZlzdPeE%BsQ+iY|FK1=~ALLSu=v;Go_k z&R(rVNJc&+LN6g19#Ei6%Sr6piZx(-hsHLVn4hF>+`Gpp%PwiFiN{-GVV3X1!{;bL zYlyn0mf57U`|4}OLuH0yS;PeQXlJC-!@l7@VD%jRL?;}Bhzf#$7t5;iYSn{E4jkc@ zynzTV4%}vSQR7b_wAR)-{W@I!1}*P)-JZ_gJQDUj@>IgpgmuRHvD&3~8g+3a;ki5m zNL{>LN}pB@k?RUIOli*ZPiHx`)=;cSXr?}kLa0L~Vw3(nXZr1Q@{I7GV5{#14QRs8 z0*0wvHUUSU?zc8vB9-IrZt81dg9Sfc2r01@;T9s&*h-g-pi+aVb8X zOwMI6n505RGQ-LD62NlHW8R1g;vBBCM@h;(7^%C`rfnGY4Gly9$3!Iu`uh~Z!n$I2 zxyid}<-Nwn`I1{&jE1RLd9Zv39yNq@$RdW?$t*K=HldFwJfi6=oG#YgCIS|Qs+qKk z$+YsVA6tBbA;p=T**ArK##C?tQtU0jR31S}SR*1}c_9ZC$T~{XeQ`oeI}lPXcRdvk z2?-GZ;$Expf0xRi8yW-%HhWXwt4t5M2bW@i8wc1|!^nzI&);2sB=Z0EEW5|<_t|b6 z`0Ha5bo;^1f5h4S{| zS7yDizSQzVfwvgbb%g{By-RudHOB_QoDb=G(-`fpx<=fVMA#P-k?tXIG}Z5}0}8EX zx4C*SAFP!xBl*Jv^dsR-D!Eoqr15WVC!TmJ{YOeLNHC4)FO@*St?e7s7dYUiX z5aJkmmg8vsow1Y{OQt1o!f4DHjo64NoAcf8zhBN1CCwzuxTM=wz)f1kJc30eXvfOg zTo^Zpg+AU{0uOkej>}>l5E%^|2c(>R4DPaN+c?Sdz{kbie2&A{3jhx0^@k$|3sr&= z66K-(0Rh;*eW{eY=E_9KO)b?-@X2}+IkplvK*=d`#+ z=cdY!p0rq_AU%T`uQOO~(dXj)alWnLx=pk)P9($*e~gEC6mD(*+<@iZCeE-3_fw{QS%^PW2{2-b9M1En%2DJ+3X%#KB?#zee=E;7>~ z9^{k&9w;V_&^^U1)Wbx&sQ>;xZ`!+y8nCwlg$ZQU2ISQ8iI3h(G_y!!T~v8;OmQJ5 z*Wu{XoXF(96(0pciP+W9kVHr7I}6kclm#LWe6s# zDT+r;6nA7W)y~Wpv)=;2P!)N=%%m|Y(|F?(AEU!kU$SxmogP$=IF0%Mh4241m+!<) zQjtTSLEswdeRfnt#Ke$p^QqB8q^-`R#sUpOf>}>zHTms9uMsFSeKak-ggXtnTgW1K zQl_i-|3uygK=f1454j`#QCLfIckJeKQTDk~DP>C2UY1564uU{nOVFpyK@Kv@i3(5M=ACV`YuZWs<}O5X z=l(9DBv=0R+I>H)|JZ4>tplhI4h{rFL?VI6!8rH`Ji2tE_aZ5iW^n|vG4uk-ybHI9 z{SP(LBc)>Sy6s4B^++Ahs zH%n$BS&OGp8TY6%OXevxZLlvXFW&jHP8+1H98t>>Jr9mFi%l)pTK-bEYJ=EKM=3uf z`BUBWssHxh%_(?3kTp^&^*6vz%LwpwwNGEX)Ul56@wOPKh*AJR!m90MkI+8XPmzyg zJxKN*YK194?w944&x*Wi>5*a}!FBJR3O`nFy1~B8 z>?#~x%{tjPUsY-m9l^GT2GmaxM!K3sU@+O%pD4B`h$Q90E>zrvq)&RE8Um(9c=mWH zOKam-(-~4yca2{PuQ3F!lPqrvN3Zf~$h5$M2>QF9>F`H#X7BSG`B@BWl-^uX52UvXEcN7hzOF14uYGQ_xT-10_`mlHt>xLXeO~8U zLOT=pU$FEst<72JRuWn)mPMUFU8dCaQDttBZ6bJFBr;F&6Z#{nB88Zz+QV^vyYlgq zNeu--R%0(X5d6w0F?z3Nzp*I+8;HJpGBV| zA~8k}FP%eAQ$g+yG>pB|@%M=QdS2{9Rp=TzzZ0Us_dB=a&)lNuhtq_?YH;^We&4i2 z6AIwaPze9U*7iw{CviRD@r8H~?t8#5q+>Ms>513mI&Sn@3|YLTEPS_y9maE*sR ztpv$>>I_Rk_HuxV_HI>I*BcMpYHQ8+d{^I%y(&kTOE*fIuv-eQP{eI9m+N*I_+2L4 zZJF%zQ*H1*H`DQZzzp-?gu`aaP*x9yo_6j720~<%iu77vTwK@zhcq&^p3u2Ns!_tM zifQJiRi_9IKjip5^2&ooa%R$qdAErE!FWT)j&=0` zygn$F&Myp{WCp(bfl{U&P+1_8vB(0{`M(zY4wFHntQUd>%z5rDY8rAio`n{&aWlU= zvqBlje%!*6DJ8DrAb)53i5oiLPj+G zjiB(xwLgnpY|-5!g@YbsVz9&TefMDGPxspCxb_VHfUM)h%`c!0W|slxu8-GI=+^I; z)eZW*%K$)VpzxMorY>ieN~gwmSs>3OEfbVHF!($UaxKl=$9P4AcflQZ^Ot5&k86G& zQCMHe_D+_S1W}Dy@>dq|dlnaa_fNJ+ z4`hk6Kjyz`7eru#I+Ma=!6E2{+XA^rB^F}juMC3NWY7iU_#aEmLnn!sy9Wc{j$p& z@=6t`lFIKGpu$1v@!HkXb1;+B@FzeOIfAaBdb7d1j!gHBP$q51o9Ch122+JOa;Vk+ z*la%`Uwq-(2d|;O9ZGb)(H7FTmv?UvU#exO$TKKd<8*`}1UPCS?W6yR6T!)DH!Qq( z4)?6(`3(2$vUxT?YBf9WLk*96&}Q!z)PYWd?6O;kSaqKMZrtnquJV3qFoyM1zAO!> zXmEYZH*nz61?AtqmvwSk`IR3+`_rSMxOp*BF@#sMU5A77e(iJfhoJxVJ#aENsq}uu zUTOwb{fFlXwgSayGXUS+Lyr{r0??Pi`jc^9v@c)wMNnGjqHSzBK49pL&CQuq9Dd5s zocugh?BfOHNCGo8MQ0qLXsVlAP;RWmtc55uA^_n z)pGUDQhv!^NPl&`J|d{SKZ;Ce7AY!7S_OPJ>=-P;DV67lr?xy;WZ)7EafOStRWcQ-Rx`u5O~HnZJ}JuyVrd?D?Og9VQ`8y8s`-EmLoc+7e7Abs!j5<> zD4dse%>v`yM$rXTp0C!6y_VRs=TV5@Vf99NvC?H#-iRQ^XCC&6F8i z!4Y$hhFX(pszSqOOV}noh<5)+Wmg_gWxK9lmdqI|GA@!RWlRW}Epx_DnMLM^3>h*c znN~7~5{b-n#*B*;DiWD3LdcXU)4A8TzkSZ$|Lk*)fBaay!}H$H^FH@|UDthuvCx8= zduEEAm&l%Yuz8yOj_9rM6jgll%=^hajd%2p^Mak5&zwJ|nSEAIer7;pfgNt`&+3!5NzMyY4r~jR#|4cq!g;LIS?S)PFvqaAapR27JB!xXMienhiA1FTmta!av8&BHD zgPdbHfn%ram|%~2*=#r{UPqee5Qn*mX=pvg%`nM4c=M$hzTV7BjiW~Vvi{ABMuP=^ z_ShqDRZX@pKMzyuE{YP3&2?gNV0>!9EqpS3f3kilaIh__)bB zz>wzU%&E3W&F&vDFiy;y4pa-ZJ;Reu4AfU8s6T$cnGi{aC3!)CIc{k4uE9a3e$d&s zzqa+y*Uj*iEZLU&TIX+bMr>1By9PZ`P4qbLcHucuSuruq}(;#`;HrDDm6 zN`%}pNw*hQh2v3}m6zT>AC`}sRf?;2A15{neHEi9{LDVV)LZ7Gr5J)jIpR~Mj*z?%S+CcW;=m$eL>X)x za^_c`CwF}H z^DL5UY96|sC=8RHEUazp&=8CXpkyEkw15!<6YMgzqdB+&MZYJjuy z2IUwANkw#G0{q8bFwdr1P;@I)DMcuoV>`p z=@q1GmaWf#gNwdJV$eqva&mhv9);}E$`JZhyPK6OfYvrGd0EeNC4kJ0U@JWaywQ5I zCh+c>Tt4`<{0UIDw)7Lv}ok-hJ%p#rFjMv;1ac3yDfK~Be==G%{_l4ZZ9=%ChN zUl7clZPFV1(dXy;%H4-=MDKmYr8Dk3jha15-DK+wKOEEL49FJiBid|UNs6LzsN{u$ zEN;30a9$1p2@&5oIEPshxOC-qIs>zTkTGwMAMTqI4CwKuSB_CO6Sj^CR0V|^&}O&m z&?7M#6$+8r$)c_GSRNJ~$-B3-9KXe7u;P!S`&k?v-HSECos~uNP7_d*R(1UH4K^0c zqc-c*T%bYb<(IZNsNEOJG51n_BnEYRDMp(#HR20(UxUY&!#nWrw^P7nVSKsw&mIsv zk8X|L<6QJ=9AEku*4)CFN9n}L2k+MoyZFDQz?EEONDi4NOG^H9D-%?GgsUaxfNc+CKmb2i(NOi?y#qLwUQs1_H^s>!ewd zf(@f!K{iF-{!>#f>)fQ429tgWvF`?voPIhxWK2MHPrb^BWoo7Aj|#c}XwCUe*d{Mi z49(G(9u~|U(d*Oq$C@7?&@Eb&LXOz}O@8x}Ow5mVT`b1&?&+S|toX#Z1Yq9^FXIVV z+saBS?YVI>Vj{4+rv<(i%f`ska5Wxixb4s~A3;zk6rqk>Q-#A$KB{W<&=g<&g5fXdfrdpkf?rz&#~gbdrz+#lLY(LkDlB78s~PD8tj z-P40UclZqUaPBWZ@Q;SUbvmhy*{vCUOj8^4`Szl-58WsHGPSxc9z9XkHTATaK8^(52vh?`W z9TR$|LKlB-=WH@;p<_8FK2c%rmI4PY^c;(t#0c!vukjOe5!o}SjG4vqS(-LPd`_wH z-4Cw6t69?J?hvdNi2i(};j0#L$(Iz^@QsGZQ-_sbYhPN>sE9=qVT1;Ka6Ok?guf71}rTc}--G}JPvKD2NumPgL!|d}}CQVwD z#bK#d^+**g!arpe$cd309;zXl-?1lx1dcycR_Qvz5X76QHlNR=c5qEoqVkT?@s*$^ zX&K%NWW-#ZWd+_$^G$^`w|K5|-QTPfT)>-S$*{~1^z!n_o0R%rD9iO*WWO~aK`Zl+ z6J@hZgvSdPM#09CLPqR|ME!5di@Z2vZ!bA)2}zLfM#PP9Ggorpl_iTDa-eEqp*(D%Ndcl&y^#q(kl z$;25Gl8KJdhzR12s{YI#`As<#H(4pXZ6I=DC&F5J32MIRv$r7D3#OdzPWW^cTFTRlAsmJ^{`+BG# zv?e9)n0GapwD^^tjs zx`E|gzv+Y=gC$F&YF{w^$%SlK)Cc`*PC9jUa5p>#L9``uN;~VgKlZ%M#w>79pT(Ce zrL*Fn$_&=VlCB<4R|~a>(NGcllEv|yN3f0^|I_k(`NJ*36J+#jXnet)!%JRUBcgM2 z%YtqcY9{+rdhcgfb2dlJRBnEv*iRcABS-5a0ZV_qAWl$7+}5*J+f+_YTD_fgb3i}3 zJ8^(&9r5BgsStZNW}nB^4cz8CyC{CTGOt;G|D^{}BU!S1Ocn7P@H zC!LX?baM{FvmecODrgb6pZ!1LmLi1&m()tPK+;4X{UNv1G`?I%@aa=WQP#9ibJ>#p zp+Y=rEy4T|9!tf$yYvz5t7FY=cH{3m632b6T?D0P^wi^XMNMEl!==Um(A=7AAXv>y z;G;w*+-p{Vv&2ZScbfD|lN8sLzbiC!`@VZ5v+zYn1#Z{O%PF~nXZgS1u0Ct1TaXp# z=i%v#d}wZrvbYh#*b$u{E`SmY+`9;&8+ee-gsd!?SZmZ@Zi)J+ouT?MM5Hv&$oN

d#inwjlf0@uf*b%TvH#hi7GENxeTA#Qs4R!k;cNuK0FL3s)A$cknGv`a7sv<4J4 z1YeCCUPHEzRLXm$kGFS*?zn0@FqHi&pf8m8Q5AXlSl>Dao4AIdAJXk&uCkiWh(jS6 zzPoe>6?J5wy-K~|HIt)BH(x@ybn^R9* zJFMnJO59W&O?*@HRgmva;v-(e&Jr8_`c$%8eL7d#Uq26c44vMf+%@GlzRLl;{4oII z6t|KueB>3A2n!3kJ`xj^_O36dlH7y|k;3KBtn24gHQg3`E4K0#^Kuv$5S)!Unwm;ajrL6 zul6W?PPo5?I)j^b_@IY%_q|(_seQcG8(|&%eGcRbJmZ(`q_VSHUB{+*(^7s@CbEiU z@lz3iK%HC31X08C)~xptFxn#}sOxISs+(;)Hivt085aZ_B~3K9lU74qd)p{F#9kKR z&Q^$&Hw=Xx)_8K69lT}wz!X1wK6fy_t1)WYZ&p*)&*Qx8{OaWQz8t>tLJDryOX)I4 zVTwsC8BIQw%BdKbe4P}aIG0NDq{pWmXSE*vdTKO8)op2Bze{9~$^c8|wmQ`gDTT?q zfnxJwhx66LGF`1x8@`iXvpt3;4ZatFi=I#nwJxo|7@(`#bvuPzU)eKIiz7tvom!$x z2}6u5ZVT17nk@52R$N~VCg~arFkHAi&s@;B;%%8nr8L8>#*o7x3Xmb>fa}1_kZgvanlbjQMe8f8d^hdrCI120A)t`{hYJM z%LIebOni z=3{!Jj(FX@`=UymJ|k7c_VL;wLJ*S_m{zLq9K1jCyp8j4Ta|!pJyGRo_UM%%dsb-0 zmJ>>Z^`|G1r<+kQ^q+#lGkVsVR_6Cr+*aRfoepT@?6MN`NIm$UXXrv<=-`h@2LMUj2AvC@G*5x27nbLt9q7hxMOVEsjfKr5fjy|pyzXK7W$7GyS?LHiIxnP0$P?>N__pz=O1L)T?|VB5 zI~RBg!RR;C3_;3-9{-@95bHWe^}CK9wa?+9_>Oh|)3VT|zkjsuUw#N)LVy1UY!d!4 zLjQJ@zkWq$NJ=3WGQY6U3iW1ckVwVE(A4j(eRwsd_a5Y?=WlhV9*JxZhPEzt(q7Py z@nvD*(eCbUg5jclR2*d|P7fO$5x#g1Mo$y?~M({n0ZM6-UN8A@jEY%EjUJWW$px_GP=*NL)61F)eCK>(78;you| zvH(Nm9>qOd+5b+w`<5SZmI=#t;wt1f+u@OVb>g;#T5uSI<LfE8o05)B>{>bPl|4Ert6rEa`q%;aVu|Co3p0Ly*jM4` zWJAf~osHY*f5f`VATxy=>Q3G0+vzxs60apwYFb)rf^h6_k&T{fArH)Uk`Vbe{A$#p zIVf&8?ytxb8WqXN$UyhOQ$_{Gx<8i^kJwnJz|##|JjYljxQdOo)iYr2GgMGGmR((a ztr283Gf@2SfoojT5Nt5`c|IWu`pFrQVpl8ucfCv!ZFc~2esbN^bQ*_K+1VU+O@ffW zed)Ri#0i>}k#^`BWtpHgnpHzrll7@hO0D7FLCScHnD?*9%@x7?FM<14d_OuHLV_kN z0CY+T^2AueBq4v<1u4y6Q%Bbpi}3vS;S#xkhNR%=n4h_PXQGJ+6Gu`#96b&O^*+z* z;Pnn{98jzZe|pAe-iaeW#kI>F_0Xw6NQ|;48$Oyj1eyb&{yb{L2!RFzZRACM@6)nL z1i@^eX|}-b0y!zOu8tM(CQ&!LP`>{;h9+l~o@-EN%=q%PgYo&hR-g?{7O_>I7gsW1 zv#}0+0t=oBVdViPBNrJBTTtJ;K_g%Zo8|L*fX*qIduJG-cpqNF-k z_AAy#0Cd<}8b3G>4++o<*qE&27 z5@#YW)M6Uprl&20_yYG{fgCSh*6>(jqe;F7V9^?bU(Ru*I62g(~#m-(AII#mrQIGdNG@6|L^~prDL4B)B9JOdt*p0!M9Drf@nHOX=u zpWQz%DJRt_N;>GTe=7x6ElgliMMcF&Dp}r#`&$H$g`#h+(9&#we;*9a2v(9`9WHuz zDAmY|t1wdxF zH;MzDS6m|8L!F|87|H}&?BC#U>gl1FGXn5=>Isy{`0Hm|2<>>!{Km;WJ724*#$psw<7SR MrmU@0q+k*JUl2~)(f|Me literal 0 HcmV?d00001 diff --git a/doc/timeplot-mimo_ioresp-ov_lm.png b/doc/timeplot-mimo_ioresp-ov_lm.png new file mode 100644 index 0000000000000000000000000000000000000000..cdeb800e0625753950c6c5f2d6b772b680d0a7b4 GIT binary patch literal 57319 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ⅅlIBBTDGZV!fxIbTco<7HCbC+bn)+Dnz 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 E0WpOWVgLXD literal 0 HcmV?d00001 diff --git a/doc/timeplot-mimo_step-default.png b/doc/timeplot-mimo_step-default.png new file mode 100644 index 0000000000000000000000000000000000000000..877764fbf109f49fb1a5bda17bbed361f32ef92c GIT binary patch literal 31828 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 Date: Thu, 29 Jun 2023 21:23:06 -0700 Subject: [PATCH 05/12] updated unit tests (coverage) --- control/tests/timeplot_test.py | 227 +++++++++++++++++++++++++++++---- control/timeplot.py | 113 +++++++++++----- doc/plotting.rst | 1 + 3 files changed, 280 insertions(+), 61 deletions(-) diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 5a0afe97b..4edc87863 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -7,10 +7,12 @@ import matplotlib.pyplot as plt import numpy as np -from .conftest import slycotonly +from control.tests.conftest import slycotonly # Detailed test of (almost) all functionality -# (uncomment rows for developmental testing, but otherwise takes too long) +# +# The commented out rows lead to very long testing times => these should be +# used only for developmental testing and not day-to-day testing. @pytest.mark.parametrize( "sys", [ # ct.rss(1, 1, 1, strictly_proper=True, name="rss"), @@ -22,18 +24,52 @@ # ct.drss(2, 2, 2, name="drss"), # ct.rss(2, 2, 3, strictly_proper=True, name="rss"), ]) -@pytest.mark.parametrize("transpose", [True, False]) -@pytest.mark.parametrize("plot_inputs", [None, True, False, 'overlay']) -@pytest.mark.parametrize("plot_outputs", [True, False]) -@pytest.mark.parametrize("combine_signals", [True, False]) -@pytest.mark.parametrize("combine_traces", [True, False]) -@pytest.mark.parametrize("second_system", [False, True]) -@pytest.mark.parametrize("fcn", [ - ct.step_response, ct.impulse_response, ct.initial_response, - ct.forced_response, ct.input_output_response]) +# @pytest.mark.parametrize("transpose", [False, True]) +# @pytest.mark.parametrize("plot_inputs", [False, None, True, 'overlay']) +# @pytest.mark.parametrize("plot_outputs", [True, False]) +# @pytest.mark.parametrize("combine_signals", [False, True]) +# @pytest.mark.parametrize("combine_traces", [False, True]) +# @pytest.mark.parametrize("second_system", [False, True]) +# @pytest.mark.parametrize("fcn", [ +# ct.step_response, ct.impulse_response, ct.initial_response, +# ct.forced_response]) +@pytest.mark.parametrize( # combinatorial-style test (faster) + "fcn, pltinp, pltout, cmbsig, cmbtrc, trpose, secsys", + [(ct.step_response, False, True, False, False, False, False), + (ct.step_response, None, True, False, False, False, False), + (ct.step_response, True, True, False, False, False, False), + (ct.step_response, 'overlay', True, False, False, False, False), + (ct.step_response, 'overlay', True, True, False, False, False), + (ct.step_response, 'overlay', True, False, True, False, False), + (ct.step_response, 'overlay', True, False, False, True, False), + (ct.step_response, 'overlay', True, False, False, False, True), + (ct.step_response, False, False, False, False, False, False), + (ct.step_response, None, False, False, False, False, False), + (ct.step_response, 'overlay', False, False, False, False, False), + (ct.step_response, True, True, False, True, False, False), + (ct.step_response, True, True, False, False, False, True), + (ct.step_response, True, True, False, True, False, True), + (ct.step_response, True, True, True, False, True, True), + (ct.step_response, True, True, False, True, True, True), + (ct.impulse_response, False, True, True, False, False, False), + (ct.initial_response, None, True, False, False, False, False), + (ct.initial_response, False, True, False, False, False, False), + (ct.initial_response, True, True, False, False, False, False), + (ct.forced_response, True, True, False, False, False, False), + (ct.forced_response, None, True, False, False, False, False), + (ct.forced_response, False, True, False, False, False, False), + (ct.forced_response, True, True, True, False, False, False), + (ct.forced_response, True, True, True, True, False, False), + (ct.forced_response, True, True, True, True, True, False), + (ct.forced_response, True, True, True, True, True, True), + (ct.forced_response, 'overlay', True, True, True, False, True), + (ct.input_output_response, + True, True, False, False, False, False), + ]) + def test_response_plots( - fcn, sys, plot_inputs, plot_outputs, combine_signals, combine_traces, - transpose, second_system, clear=True): + fcn, sys, pltinp, pltout, cmbsig, cmbtrc, + trpose, secsys, clear=True): # Figure out the time range to use and check some special cases if not isinstance(sys, ct.lti.LTI): if fcn == ct.impulse_response: @@ -42,6 +78,10 @@ def test_response_plots( # Nonlinear systems require explicit time limits T = 10 timepts = np.linspace(0, T) + + elif isinstance(sys, ct.TransferFunction) and fcn == ct.initial_response: + pytest.skip("initial response not tested for tf") + else: # Linear systems figure things out on their own T = None @@ -49,8 +89,8 @@ def test_response_plots( # Save up the keyword arguments kwargs = dict( - plot_inputs=plot_inputs, plot_outputs=plot_outputs, transpose=transpose, - combine_signals=combine_signals, combine_traces=combine_traces) + plot_inputs=pltinp, plot_outputs=pltout, transpose=trpose, + combine_signals=cmbsig, combine_traces=cmbtrc) # Create the response if fcn is ct.input_output_response and \ @@ -78,27 +118,44 @@ def test_response_plots( response = fcn(sys, *args) # Look for cases where there are no data to plot - if not plot_outputs and ( - plot_inputs is False or response.ninputs == 0 or - plot_inputs is None and response.plot_inputs is False): + if not pltout and ( + pltinp is False or response.ninputs == 0 or + pltinp is None and response.plot_inputs is False): with pytest.raises(ValueError, match=".* no data to plot"): out = response.plot(**kwargs) return None - elif not plot_outputs and plot_inputs == 'overlay': + elif not pltout and pltinp == 'overlay': with pytest.raises(ValueError, match="can't overlay inputs"): out = response.plot(**kwargs) return None - elif plot_inputs in [True, 'overlay'] and response.ninputs == 0: + elif pltinp in [True, 'overlay'] and response.ninputs == 0: with pytest.raises(ValueError, match=".* but no inputs"): out = response.plot(**kwargs) return None out = response.plot(**kwargs) - # TODO: add some basic checks here - - # Add additional data (and provide infon in the title) - if second_system: + # Make sure number of plots is correct + if pltinp is None: + if fcn in [ct.forced_response, ct.input_output_response]: + pltinp = True + else: + pltinp = False + ntraces = max(1, response.ntraces) + nlines = (response.ninputs if pltinp else 0) * ntraces + \ + (response.noutputs if pltout else 0) * ntraces + assert out.size == nlines + + # Make sure all of the outputs are of the right type + for ax_lines in np.nditer(out, flags=["refs_ok"]): + for line in ax_lines.item(): + assert isinstance(line, mpl.lines.Line2D) + + # Save the old axes to compare later + old_axes = plt.gcf().get_axes() + + # Add additional data (and provide info in the title) + if secsys: newsys = ct.rss( sys.nstates, sys.noutputs, sys.ninputs, strictly_proper=True) if fcn not in [ct.initial_response, ct.forced_response, @@ -110,14 +167,20 @@ def test_response_plots( # Compute and plot new response (time is one of the arguments) fcn(newsys, *args).plot(**kwargs) - # TODO: add some basic checks here + # Make sure we have the same axes + new_axes = plt.gcf().get_axes() + assert new_axes == old_axes + + # Make sure every axes has more than one line + for ax in new_axes: + assert len(ax.get_lines()) > 1 # Update the title so we can see what is going on fig = out[0, 0][0].axes.figure fig.suptitle( fig._suptitle._text + - f" [{sys.noutputs}x{sys.ninputs}, cs={combine_signals}, " - f"ct={combine_traces}, pi={plot_inputs}, tr={transpose}]", + f" [{sys.noutputs}x{sys.ninputs}, cs={cmbsig}, " + f"ct={cmbtrc}, pi={pltinp}, tr={trpose}]", fontsize='small') # Get rid of the figure to free up memory @@ -125,6 +188,53 @@ def test_response_plots( plt.clf() +def test_axes_setup(): + get_axes = ct.timeplot.get_axes + + sys_2x3 = ct.rss(4, 2, 3) + sys_2x3b = ct.rss(4, 2, 3) + sys_3x2 = ct.rss(4, 3, 2) + sys_3x1 = ct.rss(4, 3, 1) + + # Two plots of the same size leaves axes unchanged + out1 = ct.step_response(sys_2x3).plot() + out2 = ct.step_response(sys_2x3b).plot() + np.testing.assert_equal(get_axes(out1), get_axes(out2)) + plt.close() + + # Two plots of same net size leaves axes unchanged (unfortunately) + out1 = ct.step_response(sys_2x3).plot() + out2 = ct.step_response(sys_3x2).plot() + np.testing.assert_equal( + get_axes(out1).reshape(-1), get_axes(out2).reshape(-1)) + plt.close() + + # Plots of different shapes generate new plots + out1 = ct.step_response(sys_2x3).plot() + out2 = ct.step_response(sys_3x1).plot() + ax1_list = get_axes(out1).reshape(-1).tolist() + ax2_list = get_axes(out2).reshape(-1).tolist() + for ax in ax1_list: + assert ax not in ax2_list + plt.close() + + # Passing a list of axes preserves those axes + out1 = ct.step_response(sys_2x3).plot() + out2 = ct.step_response(sys_3x1).plot() + out3 = ct.step_response(sys_2x3b).plot(ax=get_axes(out1)) + np.testing.assert_equal(get_axes(out1), get_axes(out3)) + plt.close() + + # Sending an axes array of the wrong size raises exception + with pytest.raises(ValueError, match="not the right shape"): + out = ct.step_response(sys_2x3).plot() + ct.step_response(sys_3x1).plot(ax=get_axes(out)) + sys_2x3 = ct.rss(4, 2, 3) + sys_2x3b = ct.rss(4, 2, 3) + sys_3x2 = ct.rss(4, 3, 2) + sys_3x1 = ct.rss(4, 3, 1) + + @slycotonly def test_legend_map(): sys_mimo = ct.tf2ss( @@ -138,6 +248,68 @@ def test_legend_map(): title='MIMO step response with custom legend placement') +def test_combine_traces(): + sys_mimo = ct.rss(4, 2, 2) + timepts = np.linspace(0, 10, 100) + + # Combine two response with ntrace = 0 + U = np.vstack([np.sin(timepts), np.cos(2*timepts)]) + resp1 = ct.input_output_response(sys_mimo, timepts, U) + + U = np.vstack([np.cos(2*timepts), np.sin(timepts)]) + resp2 = ct.input_output_response(sys_mimo, timepts, U) + + combresp1 = ct.combine_traces([resp1, resp2]) + assert combresp1.ntraces == 2 + np.testing.assert_equal(combresp1.y[:, 0, :], resp1.y) + np.testing.assert_equal(combresp1.y[:, 1, :], resp2.y) + + # Combine two responses with ntrace != 0 + resp3 = ct.step_response(sys_mimo, timepts) + resp4 = ct.step_response(sys_mimo, timepts) + combresp2 = ct.combine_traces([resp3, resp4]) + assert combresp2.ntraces == resp3.ntraces + resp4.ntraces + np.testing.assert_equal(combresp2.y[:, 0:2, :], resp3.y) + np.testing.assert_equal(combresp2.y[:, 2:4, :], resp4.y) + + # Mixture + combresp3 = ct.combine_traces([resp1, resp2, resp3]) + assert combresp3.ntraces == resp3.ntraces + resp4.ntraces + np.testing.assert_equal(combresp3.y[:, 0, :], resp1.y) + np.testing.assert_equal(combresp3.y[:, 1, :], resp2.y) + np.testing.assert_equal(combresp3.y[:, 2:4, :], resp3.y) + assert combresp3.trace_types == [None, None] + resp3.trace_types + assert combresp3.trace_labels == \ + [resp1.title, resp2.title] + resp3.trace_labels + + # Rename the traces + labels = ["T1", "T2", "T3", "T4"] + combresp4 = ct.combine_traces([resp1, resp2, resp3], trace_labels=labels) + assert combresp4.trace_labels == labels + + # Automatically generated trace label names and types + resp5 = ct.step_response(sys_mimo, timepts) + resp5.title = "test" + resp5.trace_labels = None + resp5.trace_types = None + combresp5 = ct.combine_traces([resp1, resp5]) + assert combresp5.trace_labels == [resp1.title] + \ + ["test, trace 0", "test, trace 1"] + assert combresp4.trace_types == [None, None, 'step', 'step'] + + with pytest.raises(ValueError, match="must have the same number"): + resp = ct.step_response(ct.rss(4, 2, 3), timepts) + combresp = ct.combine_traces([resp1, resp]) + + with pytest.raises(ValueError, match="trace labels does not match"): + combresp = ct.combine_traces( + [resp1, resp2], trace_labels=["T1", "T2", "T3"]) + + with pytest.raises(ValueError, match="must have the same time"): + resp = ct.step_response(ct.rss(4, 2, 3), timepts/2) + combresp6 = ct.combine_traces([resp1, resp]) + + def test_errors(): sys = ct.rss(2, 1, 1) stepresp = ct.step_response(sys) @@ -150,7 +322,6 @@ def test_errors(): with pytest.raises(ValueError, match="unrecognized value"): stepresp.plot(plot_inputs='unknown') - if __name__ == "__main__": # # Interactive mode: generate plots for manual viewing diff --git a/control/timeplot.py b/control/timeplot.py index 7f156ae5d..fe983dc53 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -100,9 +100,10 @@ def ioresp_plot( Returns ------- - out : list of Artist or list of list of Artist - Array of Artist objects for each line in the plot. The shape of - the array matches the plot style, + out : array of list of Line2D + Array of Line2D objects for each line in the plot. The shape of + the array matches the subplots shape and the value of the array is a + list of Line2D objects in that subplot. Additional Parameters --------------------- @@ -605,7 +606,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): return out -def combine_traces(trace_list, trace_labels=None, title=None): +def combine_traces(response_list, trace_labels=None, title=None): """Combine multiple individual time responses into a multi-trace response. This function combines multiple instances of :class:`TimeResponseData` @@ -613,8 +614,8 @@ def combine_traces(trace_list, trace_labels=None, title=None): Parameters ---------- - trace_list : list of :class:`TimeResponseData` objects - Traces to be combined. + response_list : list of :class:`TimeResponseData` objects + Reponses to be combined. trace_labels : list of str, optional List of labels for each trace. If not specified, trace names are taken from the input data or set to None. @@ -628,7 +629,7 @@ def combine_traces(trace_list, trace_labels=None, title=None): from .timeresp import TimeResponseData # Save the first trace as the base case - base = trace_list[0] + base = response_list[0] # Process keywords title = base.title if title is None else title @@ -637,18 +638,19 @@ def combine_traces(trace_list, trace_labels=None, title=None): ntraces = max(1, base.ntraces) # Initial pass through trace list to count things up and do error checks - for trace in trace_list[1:]: + for response in response_list[1:]: # Make sure the time vector is the same - if not np.allclose(base.t, trace.t): - raise ValueError("all traces must have the same time vector") + if not np.allclose(base.t, response.t): + raise ValueError("all responses must have the same time vector") # Make sure the dimensions are all the same - if base.ninputs != trace.ninputs or base.noutputs != trace.noutputs \ - or base.nstates != trace.nstates: - raise ValuError("all traces must have the same number of " + if base.ninputs != response.ninputs or \ + base.noutputs != response.noutputs or \ + base.nstates != response.nstates: + raise ValueError("all responses must have the same number of " "inputs, outputs, and states") - ntraces += max(1, trace.ntraces) + ntraces += max(1, response.ntraces) # Create data structures for the new time response data object inputs = np.empty((base.ninputs, ntraces, base.t.size)) @@ -667,29 +669,41 @@ def combine_traces(trace_list, trace_labels=None, title=None): offset = 0 trace_types = [] - for trace in trace_list: - if trace.ntraces == 0: + for response in response_list: + if response.ntraces == 0: # Single trace - inputs[:, offset, :] = trace.u - outputs[:, offset, :] = trace.y - states[:, offset, :] = trace.x - if generate_trace_labels: - trace_labels.append(trace.title) - if trace.trace_types is not None: - trace_types.append(trace.types[0]) + inputs[:, offset, :] = response.u + outputs[:, offset, :] = response.y + states[:, offset, :] = response.x offset += 1 + + # Add on trace label and trace type + if generate_trace_labels: + trace_labels.append(response.title) + trace_types.append( + None if response.trace_types is None else response.types[0]) + else: - for i in range(trace.ntraces): - inputs[:, offset, :] = trace.u[:, i, :] - outputs[:, offset, :] = trace.y[:, i, :] - states[:, offset, :] = trace.x[:, i, :] - if generate_trace_labels and trace.trace_labels is not None: - trace_labels.append(trace.trace_labels) + # Save the data + for i in range(response.ntraces): + inputs[:, offset, :] = response.u[:, i, :] + outputs[:, offset, :] = response.y[:, i, :] + states[:, offset, :] = response.x[:, i, :] + + # Save the trace labels + if generate_trace_labels: + if response.trace_labels is not None: + trace_labels.append(response.trace_labels[i]) + else: + trace_labels.append(response.title + f", trace {i}") + + offset += 1 + + # Save the trace types + if response.trace_types is not None: + trace_types += response.trace_types else: - trace_labels.append(trace.title, f", trace {i}") - if trace.trace_types is not None: - trace_types.append(trace.trace_types) - offset += trace.ntraces + trace_types += [None] * response.ntraces return TimeResponseData( base.t, outputs, states, inputs, issiso=base.issiso, @@ -698,3 +712,36 @@ def combine_traces(trace_list, trace_labels=None, title=None): return_x=base.return_x, squeeze=base.squeeze, sysname=base.sysname, trace_labels=trace_labels, trace_types=trace_types, plot_inputs=base.plot_inputs) + + +# Create vectorized function to find axes from lines +def get_axes(line_array): + """Get a list of axes from an array of lines. + + This function can be used to return the set of axes corresponding to + the line array that is returned by `ioresp_plot`. This is useful for + generating an axes array that can be passed to subsequent plotting + calls. + + Parameters + ---------- + line_array : array of list of Line2D + A 2D array with elements corresponding to a list of lines appearing + in an axes, matching the return type of a time response data plot. + + Returns + ------- + axes_array : arra of list of Axes + A 2D array with elements corresponding to the Axes assocated with + the lines in `line_array`. + + Notes + ----- + Only the first element of each array entry is used to determine the axes. + + """ + return _get_axes(line_array) + + +# Utility function used by get_axes +_get_axes = np.vectorize(lambda lines: lines[0].axes) diff --git a/doc/plotting.rst b/doc/plotting.rst index cc9908e70..c86d3d49a 100644 --- a/doc/plotting.rst +++ b/doc/plotting.rst @@ -124,3 +124,4 @@ Plotting functions ~control.ioresp_plot ~control.combine_traces + control.timeplot.get_axes From 6bb8b56afefaf0bcd6f6cb51136685ddd3208f6e Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Fri, 30 Jun 2023 13:35:37 -0700 Subject: [PATCH 06/12] change ioresp_plot to time_response_plot --- control/tests/kwargs_test.py | 2 +- control/tests/timeplot_test.py | 2 +- control/timeplot.py | 6 +++--- control/timeresp.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/control/tests/kwargs_test.py b/control/tests/kwargs_test.py index 9b66aef38..b29fa2fa5 100644 --- a/control/tests/kwargs_test.py +++ b/control/tests/kwargs_test.py @@ -186,7 +186,7 @@ def test_matplotlib_kwargs(function, nsysargs, moreargs, kwargs, mplcleanup): 'gangof4_plot': test_matplotlib_kwargs, 'input_output_response': test_unrecognized_kwargs, 'interconnect': interconnect_test.test_interconnect_exceptions, - 'ioresp_plot': timeplot_test.test_errors, + 'time_response_plot': timeplot_test.test_errors, 'linearize': test_unrecognized_kwargs, 'lqe': test_unrecognized_kwargs, 'lqr': test_unrecognized_kwargs, diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 4edc87863..97ca17b58 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -317,7 +317,7 @@ def test_errors(): stepresp.plot(unknown=None) with pytest.raises(TypeError, match="unrecognized keyword"): - ct.ioresp_plot(stepresp, unknown=None) + ct.time_response_plot(stepresp, unknown=None) with pytest.raises(ValueError, match="unrecognized value"): stepresp.plot(plot_inputs='unknown') diff --git a/control/timeplot.py b/control/timeplot.py index fe983dc53..4e8388a9b 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -28,7 +28,7 @@ from . import config -__all__ = ['ioresp_plot', 'combine_traces'] +__all__ = ['time_response_plot', 'combine_traces'] # Default font dictionary _timeplot_rcParams = mpl.rcParams.copy() @@ -51,7 +51,7 @@ } # Plot the input/output response of a system -def ioresp_plot( +def time_response_plot( data, ax=None, plot_inputs=None, plot_outputs=True, transpose=False, combine_traces=False, combine_signals=False, legend_map=None, legend_loc=None, add_initial_zero=True, title=None, relabel=True, @@ -719,7 +719,7 @@ def get_axes(line_array): """Get a list of axes from an array of lines. This function can be used to return the set of axes corresponding to - the line array that is returned by `ioresp_plot`. This is useful for + the line array that is returned by `time_response_plot`. This is useful for generating an axes array that can be passed to subsequent plotting calls. diff --git a/control/timeresp.py b/control/timeresp.py index ffb495eb2..84829cf93 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -81,7 +81,7 @@ from . import config from .exception import pandas_check from .iosys import isctime, isdtime -from .timeplot import ioresp_plot +from .timeplot import time_response_plot __all__ = ['forced_response', 'step_response', 'step_info', @@ -690,7 +690,7 @@ def to_pandas(self): # Plot data def plot(self, *args, **kwargs): - return ioresp_plot(self, *args, **kwargs) + return time_response_plot(self, *args, **kwargs) # Process signal labels From 29054ec9bbec189b6c7078a56ff1b745a48c51b8 Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Fri, 30 Jun 2023 21:25:16 -0700 Subject: [PATCH 07/12] customizable line properties, combine_* -> overlay_*, documentation --- control/tests/kwargs_test.py | 17 ++- control/tests/timeplot_test.py | 81 ++++++++--- control/timeplot.py | 209 +++++++++++++++++------------ control/timeresp.py | 7 +- doc/plotting.rst | 37 ++--- doc/timeplot-mimo_ioresp-mt_tr.png | Bin 62546 -> 64394 bytes doc/timeplot-mimo_ioresp-ov_lm.png | Bin 57319 -> 61492 bytes doc/timeplot-mimo_step-pi_cs.png | Bin 31853 -> 31861 bytes 8 files changed, 224 insertions(+), 127 deletions(-) diff --git a/control/tests/kwargs_test.py b/control/tests/kwargs_test.py index b29fa2fa5..19f4bb627 100644 --- a/control/tests/kwargs_test.py +++ b/control/tests/kwargs_test.py @@ -75,7 +75,8 @@ def test_kwarg_search(module, prefix): # @parametrize messes up the check, but we know it is there pass - elif source and source.find('unrecognized keyword') < 0: + elif source and source.find('unrecognized keyword') < 0 and \ + source.find('unexpected keyword') < 0: warnings.warn( f"'unrecognized keyword' not found in unit test " f"for {name}") @@ -162,7 +163,21 @@ def test_matplotlib_kwargs(function, nsysargs, moreargs, kwargs, mplcleanup): function(*args, **kwargs, unknown=None) +@pytest.mark.parametrize( + "function", [control.time_response_plot, control.TimeResponseData.plot]) +def test_time_response_plot_kwargs(function): + # Create a system for testing + response = control.step_response(control.rss(4, 2, 2)) + + # Call the plotting function normally and make sure it works + function(response) + # Now add an unrecognized keyword and make sure there is an error + with pytest.raises(AttributeError, + match="(has no property|unexpected keyword)"): + function(response, unknown=None) + + # # List of all unit tests that check for unrecognized keywords # diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 97ca17b58..2ade00ec1 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -27,8 +27,8 @@ # @pytest.mark.parametrize("transpose", [False, True]) # @pytest.mark.parametrize("plot_inputs", [False, None, True, 'overlay']) # @pytest.mark.parametrize("plot_outputs", [True, False]) -# @pytest.mark.parametrize("combine_signals", [False, True]) -# @pytest.mark.parametrize("combine_traces", [False, True]) +# @pytest.mark.parametrize("overlay_signals", [False, True]) +# @pytest.mark.parametrize("overlay_traces", [False, True]) # @pytest.mark.parametrize("second_system", [False, True]) # @pytest.mark.parametrize("fcn", [ # ct.step_response, ct.impulse_response, ct.initial_response, @@ -90,7 +90,7 @@ def test_response_plots( # Save up the keyword arguments kwargs = dict( plot_inputs=pltinp, plot_outputs=pltout, transpose=trpose, - combine_signals=cmbsig, combine_traces=cmbtrc) + overlay_signals=cmbsig, overlay_traces=cmbtrc) # Create the response if fcn is ct.input_output_response and \ @@ -189,7 +189,7 @@ def test_response_plots( def test_axes_setup(): - get_axes = ct.timeplot.get_axes + get_plot_axes = ct.timeplot.get_plot_axes sys_2x3 = ct.rss(4, 2, 3) sys_2x3b = ct.rss(4, 2, 3) @@ -199,21 +199,21 @@ def test_axes_setup(): # Two plots of the same size leaves axes unchanged out1 = ct.step_response(sys_2x3).plot() out2 = ct.step_response(sys_2x3b).plot() - np.testing.assert_equal(get_axes(out1), get_axes(out2)) + np.testing.assert_equal(get_plot_axes(out1), get_plot_axes(out2)) plt.close() # Two plots of same net size leaves axes unchanged (unfortunately) out1 = ct.step_response(sys_2x3).plot() out2 = ct.step_response(sys_3x2).plot() np.testing.assert_equal( - get_axes(out1).reshape(-1), get_axes(out2).reshape(-1)) + get_plot_axes(out1).reshape(-1), get_plot_axes(out2).reshape(-1)) plt.close() # Plots of different shapes generate new plots out1 = ct.step_response(sys_2x3).plot() out2 = ct.step_response(sys_3x1).plot() - ax1_list = get_axes(out1).reshape(-1).tolist() - ax2_list = get_axes(out2).reshape(-1).tolist() + ax1_list = get_plot_axes(out1).reshape(-1).tolist() + ax2_list = get_plot_axes(out2).reshape(-1).tolist() for ax in ax1_list: assert ax not in ax2_list plt.close() @@ -221,14 +221,14 @@ def test_axes_setup(): # Passing a list of axes preserves those axes out1 = ct.step_response(sys_2x3).plot() out2 = ct.step_response(sys_3x1).plot() - out3 = ct.step_response(sys_2x3b).plot(ax=get_axes(out1)) - np.testing.assert_equal(get_axes(out1), get_axes(out3)) + out3 = ct.step_response(sys_2x3b).plot(ax=get_plot_axes(out1)) + np.testing.assert_equal(get_plot_axes(out1), get_plot_axes(out3)) plt.close() # Sending an axes array of the wrong size raises exception with pytest.raises(ValueError, match="not the right shape"): out = ct.step_response(sys_2x3).plot() - ct.step_response(sys_3x1).plot(ax=get_axes(out)) + ct.step_response(sys_3x1).plot(ax=get_plot_axes(out)) sys_2x3 = ct.rss(4, 2, 3) sys_2x3b = ct.rss(4, 2, 3) sys_3x2 = ct.rss(4, 3, 2) @@ -244,7 +244,7 @@ def test_legend_map(): response.plot( legend_map=np.array([['center', 'upper right'], [None, 'center right']]), - plot_inputs=True, combine_signals=True, transpose=True, + plot_inputs=True, overlay_signals=True, transpose=True, title='MIMO step response with custom legend placement') @@ -310,18 +310,55 @@ def test_combine_traces(): combresp6 = ct.combine_traces([resp1, resp]) +def test_linestyles(): + # Check to make sure we can change line styles + sys_mimo = ct.tf2ss( + [[[1], [0.1]], [[0.2], [1]]], + [[[1, 0.6, 1], [1, 1, 1]], [[1, 0.4, 1], [1, 2, 1]]], name="MIMO") + out = ct.step_response(sys_mimo).plot('k--', plot_inputs=True) + for ax in np.nditer(out, flags=["refs_ok"]): + for line in ax.item(): + assert line.get_color() == 'k' + assert line.get_linestyle() == '--' + + +def test_relabel(): + sys1 = ct.rss(2, inputs='u', outputs='y') + sys2 = ct.rss(1, 1, 1) # uses default i/o labels + + # Generate a plot with specific labels + ct.step_response(sys1).plot() + + # Generate a new plot, which overwrites labels + out = ct.step_response(sys2).plot() + ax = ct.get_plot_axes(out) + assert ax[0, 0].get_ylabel() == 'y[0]' + + # Regenerate the first plot + plt.figure() + ct.step_response(sys1).plot() + + # Generate a new plt, without relabeling + out = ct.step_response(sys2).plot(relabel=False) + ax = ct.get_plot_axes(out) + assert ax[0, 0].get_ylabel() == 'y' + + def test_errors(): sys = ct.rss(2, 1, 1) stepresp = ct.step_response(sys) - with pytest.raises(TypeError, match="unrecognized keyword"): + with pytest.raises(AttributeError, + match="(has no property|unexpected keyword)"): stepresp.plot(unknown=None) - with pytest.raises(TypeError, match="unrecognized keyword"): + with pytest.raises(AttributeError, + match="(has no property|unexpected keyword)"): ct.time_response_plot(stepresp, unknown=None) with pytest.raises(ValueError, match="unrecognized value"): stepresp.plot(plot_inputs='unknown') + if __name__ == "__main__": # # Interactive mode: generate plots for manual viewing @@ -344,8 +381,8 @@ def test_errors(): # Define and run a selected set of interesting tests # def test_response_plots( - # fcn, sys, plot_inputs, plot_outputs, combine_signals, - # combine_traces, transpose, second_system, clear=True): + # fcn, sys, plot_inputs, plot_outputs, overlay_signals, + # overlay_traces, transpose, second_system, clear=True): N, T, F = None, True, False test_cases = [ # response fcn system in out cs ct tr ss @@ -379,12 +416,12 @@ def test_errors(): ct.step_response(sys_mimo).plot() plt.savefig('timeplot-mimo_step-default.png') - # Step response with plot_inputs, combine_signals + # Step response with plot_inputs, overlay_signals plt.figure() ct.step_response(sys_mimo).plot( - plot_inputs=True, combine_signals=True, + plot_inputs=True, overlay_signals=True, title="Step response for 2x2 MIMO system " + - "[plot_inputs, combine_signals]") + "[plot_inputs, overlay_signals]") plt.savefig('timeplot-mimo_step-pi_cs.png') # Input/output response with overlaid inputs, legend_map @@ -412,3 +449,9 @@ def test_errors(): title="I/O responses for 2x2 MIMO system, multiple traces " "[transpose]") plt.savefig('timeplot-mimo_ioresp-mt_tr.png') + + # Reset line styles + plt.figure() + resp1.plot('g-') + resp2.plot('r--') + # plt.savefig('timeplot-mimo_step-linestyle.png') diff --git a/control/timeplot.py b/control/timeplot.py index 4e8388a9b..615ed2b6a 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -5,21 +5,8 @@ # functions can be called either as standalone functions or access from the # TimeDataResponse class. # -# Note: Depending on how this goes, it might eventually make sense to -# put the functions here directly into timeresp.py. -# -# Desired features (i = implemented but not tested, c = complete, w/ tests) -# [i] Step/impulse response plots don't include inputs by default -# [i] Forced/I-O response plots include inputs by default -# [ ] Ability to start inputs at zero (step functions only?) -# [i] Ability to plot all data on a single graph -# [i] Ability to plot inputs with outputs on separate graphs -# [i] Ability to plot inputs and/or outputs on selected axes -# [i] Multi-trace graphs using different line styles -# [i] Plotting function return Line2D elements -# [i] Axis labels/legends based on what is plotted (siso, mimo, multi-trace) -# [x] Ability to select (index) output and/or trace (and time?) -# [i] Legends should not contain redundant information (nor appear redundantly) +# Note: It might eventually make sense to put the functions here +# directly into timeresp.py. import numpy as np import matplotlib as mpl @@ -28,7 +15,7 @@ from . import config -__all__ = ['time_response_plot', 'combine_traces'] +__all__ = ['time_response_plot', 'combine_traces', 'get_plot_axes'] # Default font dictionary _timeplot_rcParams = mpl.rcParams.copy() @@ -43,19 +30,25 @@ # Default values for module parameter variables _timeplot_defaults = { - 'timeplot.line_styles': ['-', '--', ':', '-.'], - 'timeplot.line_colors': [ - 'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', - 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'], + 'timeplot.rcParams': _timeplot_rcParams, + 'timeplot.trace_props': [ + {'linestyle': s} for s in ['-', '--', ':', '-.']], + 'timeplot.output_props': [ + {'color': c} for c in [ + 'tab:blue', 'tab:orange', 'tab:green', 'tab:pink', 'tab:gray']], + 'timeplot.input_props': [ + {'color': c} for c in [ + 'tab:red', 'tab:purple', 'tab:brown', 'tab:olive', 'tab:cyan']], 'timeplot.time_label': "Time [s]", } # Plot the input/output response of a system def time_response_plot( - data, ax=None, plot_inputs=None, plot_outputs=True, transpose=False, - combine_traces=False, combine_signals=False, legend_map=None, - legend_loc=None, add_initial_zero=True, title=None, relabel=True, - **kwargs): + data, *fmt, ax=None, plot_inputs=None, plot_outputs=True, + transpose=False, overlay_traces=False, overlay_signals=False, + legend_map=None, legend_loc=None, add_initial_zero=True, + input_props=None, output_props=None, trace_props=None, + title=None, relabel=True, **kwargs): """Plot the time response of an input/output system. This function creates a standard set of plots for the input/output @@ -72,8 +65,8 @@ def time_response_plot( Axes for the current figure are used or, if there is no current figure with the correct number and shape of Axes, a new figure is created. The default shape of the array should be (noutputs + - ninputs, ntraces), but if `combine_traces` is set to `True` then - only one row is needed and if `combine_signals` is set to `True` + ninputs, ntraces), but if `overlay_traces` is set to `True` then + only one row is needed and if `overlay_signals` is set to `True` then only one or two columns are needed (depending on plot_inputs and plot_outputs). plot_inputs : bool or str, optional @@ -84,10 +77,10 @@ def time_response_plot( * True: plot the inputs on their own axes plot_outputs : bool, optional If False, suppress plotting of the outputs. - combine_traces : bool, optional + overlay_traces : bool, optional If set to True, combine all traces onto a single row instead of plotting a separate row for each trace. - combine_signals : bool, optional + overlay_signals : bool, optional If set to True, combine all input and output signals onto a single plot (for each). transpose : bool, optional @@ -97,6 +90,10 @@ def time_response_plot( signals are plotted from left to right, starting with the inputs (if plotted) and then the outputs. Multi-trace responses are stacked vertically. + *fmt : :func:`matplotlib.pyplot.plot` format string, optional + Passed to `matplotlib` as the format string for all lines in the plot. + **kwargs : :func:`matplotlib.pyplot.plot` keyword properties, optional + Additional keywords passed to `matplotlib` to specify line properties. Returns ------- @@ -107,11 +104,12 @@ def time_response_plot( Additional Parameters --------------------- - relabel : bool, optional - By default, existing figures and axes are relabeled when new data - are added. If set to `False`, just plot new data on existing axes. - time_label : str, optional - Label to use for the time axis. + add_initial_zero : bool + Add an initial point of zero at the first time point for all + inputs with type 'step'. Default is True. + input_props : array of dicts + List of line properties to use when plotting combined inputs. The + default values are set by config.defaults['timeplot.input_props']. legend_map : array of str, option Location of the legend for multi-trace plots. Specifies an array of legend location strings matching the shape of the subplots, with @@ -120,14 +118,38 @@ def time_response_plot( legend_loc : str Location of the legend within the axes for which it appears. This value is used if legend_map is None. - add_initial_zero : bool - Add an initial point of zero at the first time point for all - inputs with type 'step'. Default is True. - trace_cycler: :class:`~matplotlib.Cycler` - Line style cycle to use for traces. Default = ['-', '--', ':', '-.']. + output_props : array of dicts + List of line properties to use when plotting combined outputs. The + default values are set by config.defaults['timeplot.output_props']. + relabel : bool, optional + By default, existing figures and axes are relabeled when new data + are added. If set to `False`, just plot new data on existing axes. + time_label : str, optional + Label to use for the time axis. + trace_props : array of dicts + List of line properties to use when plotting combined outputs. The + default values are set by config.defaults['timeplot.trace_props']. + + Notes + ----- + 1. A new figure will be generated if there is no current figure or + the current figure has an incompatible number of axes. To + force the creation of a new figures, use `plt.figure()`. To reuse + a portion of an existing figure, use the `ax` keyword. + + 2. The line properties (color, linestyle, etc) can be set for the + entire plot using the `fmt` and/or `kwargs` parameter, which + are passed on to `matplotlib`. When combining signals or + traces, the `input_props`, `output_props`, and `trace_props` + parameters can be used to pass a list of dictionaries + containing the line properties to use. These input/output + properties are combined with the trace properties and finally + the kwarg properties to determine the final line properties. + + 3. The default plot properties, such as font sizes, can be set using + config.defaults[''timeplot.rcParams']. """ - from cycler import cycler from .iosys import InputOutputSystem from .timeresp import TimeResponseData @@ -138,10 +160,18 @@ def time_response_plot( # Set up defaults time_label = config._get_param( 'timeplot', 'time_label', kwargs, _timeplot_defaults, pop=True) - line_styles = config._get_param( - 'timeplot', 'line_styles', kwargs, _timeplot_defaults, pop=True) - line_colors = config._get_param( - 'timeplot', 'line_colors', kwargs, _timeplot_defaults, pop=True) + + input_props = config._get_param( + 'timeplot', 'input_props', kwargs, _timeplot_defaults, pop=True) + iprop_len = len(input_props) + + output_props = config._get_param( + 'timeplot', 'output_props', kwargs, _timeplot_defaults, pop=True) + oprop_len = len(output_props) + + trace_props = config._get_param( + 'timeplot', 'trace_props', kwargs, _timeplot_defaults, pop=True) + tprop_len = len(trace_props) # Set the title for the data title = data.title if title == None else title @@ -152,13 +182,6 @@ def time_response_plot( if plot_inputs not in [True, False, 'overlay']: raise ValueError(f"unrecognized value: {plot_inputs=}") - # Configure the cycle of colors and line styles - my_cycler = cycler(linestyle=line_styles) * cycler(color=line_colors) - - # Make sure we process alled of the optional arguments - if kwargs: - raise TypeError("unrecognized keyword(s): " + str(kwargs)) - # # Find/create axes # @@ -191,7 +214,7 @@ def time_response_plot( # # * Combining: inputs, outputs, and traces can be combined onto a # single set of axes using various keyword combinations - # (combine_signals, combine_traces, plot_inputs='overlay'). This + # (overlay_signals, overlay_traces, plot_inputs='overlay'). This # basically collapses data along either the rows or columns, and a # legend is generated. # @@ -225,11 +248,11 @@ def time_response_plot( "input plotting requested but no inputs in time response data") # Figure how how many rows and columns to use + offsets for inputs/outputs - if plot_inputs == 'overlay' and not combine_signals: + if plot_inputs == 'overlay' and not overlay_signals: nrows = max(ninputs, noutputs) # Plot inputs on top of outputs noutput_axes = 0 # No offset required ninput_axes = 0 # No offset required - elif combine_signals: + elif overlay_signals: nrows = int(plot_outputs) # Start with outputs nrows += int(plot_inputs == True) # Add plot for inputs if needed noutput_axes = 1 if plot_outputs and plot_inputs is True else 0 @@ -239,7 +262,7 @@ def time_response_plot( noutput_axes = noutputs if plot_outputs else 0 ninput_axes = ninputs if plot_inputs else 0 - ncols = ntraces if not combine_traces else 1 + ncols = ntraces if not overlay_traces else 1 if transpose: nrows, ncols = ncols, nrows @@ -261,10 +284,8 @@ def time_response_plot( if ax is None: with plt.rc_context(_timeplot_rcParams): ax_array = fig.subplots(nrows, ncols, sharex=True, squeeze=False) - for ax in np.nditer(ax_array, flags=["refs_ok"]): - ax.item().set_prop_cycle(my_cycler) - fig.set_tight_layout(True) - fig.align_labels() + fig.set_tight_layout(True) + fig.align_labels() else: # Make sure the axes are the right shape @@ -284,14 +305,14 @@ def time_response_plot( # variations. # - # Create the map from trace, signal to axes, accounting for combine_* + # Create the map from trace, signal to axes, accounting for overlay_* ax_outputs = np.empty((noutputs, ntraces), dtype=object) ax_inputs = np.empty((ninputs, ntraces), dtype=object) for i in range(noutputs): for j in range(ntraces): - signal_index = i if not combine_signals else 0 - trace_index = j if not combine_traces else 0 + signal_index = i if not overlay_signals else 0 + trace_index = j if not overlay_traces else 0 if transpose: ax_outputs[i, j] = \ ax_array[trace_index, signal_index + ninput_axes] @@ -300,8 +321,8 @@ def time_response_plot( for i in range(ninputs): for j in range(ntraces): - signal_index = noutput_axes + (i if not combine_signals else 0) - trace_index = j if not combine_traces else 0 + signal_index = noutput_axes + (i if not overlay_signals else 0) + trace_index = j if not overlay_traces else 0 if transpose: ax_inputs[i, j] = \ ax_array[trace_index, signal_index - noutput_axes] @@ -340,11 +361,11 @@ def _make_line_label(signal_index, signal_labels, trace_index): label = "" # start with an empty label # Add the signal name if it won't appear as an axes label - if combine_signals or plot_inputs == 'overlay': + if overlay_signals or plot_inputs == 'overlay': label += signal_labels[signal_index] # Add the trace label if this is a multi-trace figure - if combine_traces and ntraces > 1: + if overlay_traces and ntraces > 1: label += ", " if label != "" else "" label += f"trace {trace_index}" if data.trace_labels is None \ else data.trace_labels[trace_index] @@ -360,8 +381,18 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Plot the output for i in range(noutputs): label = _make_line_label(i, data.output_labels, trace) + + # Set up line properties for this output, trace + if len(fmt) == 0: + line_props = \ + output_props[i % oprop_len if overlay_signals else 0] | \ + trace_props[trace % tprop_len if overlay_traces else 0] | \ + kwargs + else: + line_props = kwargs + out[i, trace] = ax_outputs[i, trace].plot( - data.time, outputs[i][trace], label=label) + data.time, outputs[i][trace], *fmt, label=label, **line_props) # Plot the input for i in range(ninputs): @@ -374,8 +405,17 @@ def _make_line_label(signal_index, signal_labels, trace_index): else: x, y = data.time, inputs[i][trace] + # Set up line properties for this output, trace + if len(fmt) == 0: + line_props = \ + input_props[i % iprop_len if overlay_signals else 0] | \ + trace_props[trace % tprop_len if overlay_traces else 0] | \ + kwargs + else: + line_props = kwargs + out[noutputs + i, trace] = ax_inputs[i, trace].plot( - x, y, label=label) + x, y, *fmt, label=label, **line_props) # Stop here if the user wants to control everything if not relabel: @@ -387,7 +427,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Once the data are plotted, we label the axes. The horizontal axes is # always time and this is labeled only on the bottom most column. The # vertical axes can consist either of a single signal or a combination - # of signals (when combine_signal is True or plot+inputs = 'overlay'. + # of signals (when overlay_signal is True or plot+inputs = 'overlay'. # # Traces are labeled at the top of the first row of plots (regular) or # the left edge of rows (tranpose). @@ -403,7 +443,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): if transpose: # inputs on left, outputs on right # Label the inputs - if combine_signals and plot_inputs: + if overlay_signals and plot_inputs: label = overlaid_title if overlaid else "Inputs" for trace in range(ntraces): ax_inputs[0, trace].set_ylabel(label) @@ -414,7 +454,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): ax_inputs[i, trace].set_ylabel(label) # Label the outputs - if combine_signals and plot_outputs: + if overlay_signals and plot_outputs: label = overlaid_title if overlaid else "Outputs" for trace in range(ntraces): ax_outputs[0, trace].set_ylabel(label) @@ -425,7 +465,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): ax_outputs[i, trace].set_ylabel(label) # Set the trace titles, if needed - if ntraces > 1 and not combine_traces: + if ntraces > 1 and not overlay_traces: for trace in range(ntraces): # Get the existing ylabel for left column label = ax_array[trace, 0].get_ylabel() @@ -437,7 +477,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): else: # regular plot (outputs over inputs) # Set the trace titles, if needed - if ntraces > 1 and not combine_traces: + if ntraces > 1 and not overlay_traces: for trace in range(ntraces): with plt.rc_context(_timeplot_rcParams): ax_array[0, trace].set_title( @@ -445,7 +485,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): else data.trace_labels[trace]) # Label the outputs - if combine_signals and plot_outputs: + if overlay_signals and plot_outputs: ax_outputs[0, 0].set_ylabel("Outputs") else: for i in range(noutputs): @@ -453,7 +493,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): overlaid_title if overlaid else data.output_labels[i]) # Label the inputs - if combine_signals and plot_inputs: + if overlay_signals and plot_inputs: label = overlaid_title if overlaid else "Inputs" ax_inputs[0, 0].set_ylabel(label) else: @@ -487,13 +527,13 @@ def _make_line_label(signal_index, signal_labels, trace_index): if legend_loc == None: legend_loc = 'center right' if transpose: - if (combine_signals or plot_inputs == 'overlay') and combine_traces: + if (overlay_signals or plot_inputs == 'overlay') and overlay_traces: # Put a legend in each plot for inputs and outputs if plot_outputs is True: legend_map[0, ninput_axes] = legend_loc if plot_inputs is True: legend_map[0, 0] = legend_loc - elif combine_signals: + elif overlay_signals: # Put a legend in rightmost input/output plot if plot_inputs is True: legend_map[0, 0] = legend_loc @@ -503,20 +543,20 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Put a legend on the top of each column for i in range(ntraces): legend_map[0, i] = legend_loc - elif combine_traces: + elif overlay_traces: # Put a legend topmost input/output plot legend_map[0, -1] = legend_loc else: # Put legend in the upper right legend_map[0, -1] = legend_loc else: # regular layout - if (combine_signals or plot_inputs == 'overlay') and combine_traces: + if (overlay_signals or plot_inputs == 'overlay') and overlay_traces: # Put a legend in each plot for inputs and outputs if plot_outputs is True: legend_map[0, -1] = legend_loc if plot_inputs is True: legend_map[noutput_axes, -1] = legend_loc - elif combine_signals: + elif overlay_signals: # Put a legend in rightmost input/output plot if plot_outputs is True: legend_map[0, -1] = legend_loc @@ -526,7 +566,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Put a legend on the right of each row for i in range(max(ninputs, noutputs)): legend_map[i, -1] = legend_loc - elif combine_traces: + elif overlay_traces: # Put a legend topmost input/output plot legend_map[0, -1] = legend_loc else: @@ -715,7 +755,7 @@ def combine_traces(response_list, trace_labels=None, title=None): # Create vectorized function to find axes from lines -def get_axes(line_array): +def get_plot_axes(line_array): """Get a list of axes from an array of lines. This function can be used to return the set of axes corresponding to @@ -731,7 +771,7 @@ def get_axes(line_array): Returns ------- - axes_array : arra of list of Axes + axes_array : array of list of Axes A 2D array with elements corresponding to the Axes assocated with the lines in `line_array`. @@ -740,8 +780,5 @@ def get_axes(line_array): Only the first element of each array entry is used to determine the axes. """ + _get_axes = np.vectorize(lambda lines: lines[0].axes) return _get_axes(line_array) - - -# Utility function used by get_axes -_get_axes = np.vectorize(lambda lines: lines[0].axes) diff --git a/control/timeresp.py b/control/timeresp.py index 84829cf93..81349e2f4 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -185,7 +185,7 @@ class TimeResponseData: trace_labels : array of string, optional Labels to use for traces (set to sysname it ntraces is 0) - trace_labels : array of string, optional + trace_types : array of string, optional Type of trace. Currently only 'step' is supported, which controls the way in which the signal is plotted. @@ -227,8 +227,7 @@ def __init__( output_labels=None, state_labels=None, input_labels=None, title=None, transpose=False, return_x=False, squeeze=None, multi_trace=False, trace_labels=None, trace_types=None, - plot_inputs=True, - sysname=None + plot_inputs=True, sysname=None ): """Create an input/output time response object. @@ -428,7 +427,7 @@ def __init__( # Check and store trace labels, if present self.trace_labels = _process_labels( trace_labels, "trace", self.ntraces) - self.trace_types = trace_types + self.trace_types = trace_types # TODO: rename to kind? # Figure out if the system is SISO if issiso is None: diff --git a/doc/plotting.rst b/doc/plotting.rst index c86d3d49a..ddd44b56c 100644 --- a/doc/plotting.rst +++ b/doc/plotting.rst @@ -53,24 +53,25 @@ the data from the simulation:: for j in range(2): axs[i, j].plot(time, outputs[i, j]) -A number of options are available in the `plot` method to customize the -appearance of input output data. For data produced by the +A number of options are available in the `plot` method to customize +the appearance of input output data. For data produced by the :func:`~control.impulse_response` and :func:`~control.step_response` -commands, the inputs are not shown. This behavior can be changed using the -`plot_inputs` keyword. It is also possible to combine multiple traces onto -a single graph, using either the `combine_signals` keyword (which puts all -outputs out a single graph and all inputs on a single graph) or the -`combine_traces` keyword, which puts different traces (e.g., corresponding -to step inputs in different channels) on the same graph, with appropriate -labeling via a legend on selected axes. - -For example, using `plot_input=True` and `combine_signals=True` yields the +commands, the inputs are not shown. This behavior can be changed +using the `plot_inputs` keyword. It is also possible to combine +multiple lines onto a single graph, using either the `overlay_signals` +keyword (which puts all outputs out a single graph and all inputs on a +single graph) or the `overlay_traces` keyword, which puts different +traces (e.g., corresponding to step inputs in different channels) on +the same graph, with appropriate labeling via a legend on selected +axes. + +For example, using `plot_input=True` and `overlay_signals=True` yields the following plot:: ct.step_response(sys_mimo).plot( - plot_inputs=True, combine_signals=True, + plot_inputs=True, overlay_signals=True, title="Step response for 2x2 MIMO system " + - "[plot_inputs, combine_signals]") + "[plot_inputs, overlay_signals]") .. image:: timeplot-mimo_step-pi_cs.png @@ -113,15 +114,17 @@ following figure:: .. image:: timeplot-mimo_ioresp-mt_tr.png This figure also illustrates the ability to create "multi-trace" plots -using the :func:`~control.combine_traces` function. +using the :func:`~control.combine_traces` function. The line properties +that are used when combining signals and traces are set by the +`input_props`, `output_props` and `trace_props` parameters for +:func:`~control.time_response_plot`. - Plotting functions ================== .. autosummary:: :toctree: generated/ - ~control.ioresp_plot + ~control.time_response_plot ~control.combine_traces - control.timeplot.get_axes + ~control.get_plot_axes diff --git a/doc/timeplot-mimo_ioresp-mt_tr.png b/doc/timeplot-mimo_ioresp-mt_tr.png index e21ef1db42fdf1e13ea798a42364421c5e19c5cb..e4c800086ec7bb829814e2f0fcf474d2b928d320 100644 GIT binary patch literal 64394 zcmdSBWmuJ6)HQl^i7%I$QoPtgQ4Dt7Kaht0Hw~4GJQEDgLM#&&`O`EXZOB z$=b0(VkD54KKoGd$7OIo(sM91(d3(m<33w&%K3I&yy@S8#8|s$$BBcks~GesIB5Q@ zhFs)fl~S=gxLoA_^DQAZ5&VBYut59&`j@g8X+C%EU%!2m&K_RE_qmX%sBSlW-fx!f zg%+_ow6H*PR##C`kw4(}@+GcdM0*6a2=T5h*J~{;@Uh9Q_h_OVjr;Q}vGU2`F+a=} z;`fIuoe2^?-b1rKr#}o77Mt(yu4|V3u%i+aF+)53cm@QKttN^T=468eQ&UrGjt4{z zTafXWI)aHVdR4u%W@c=vAL5H1K;M-U{lda)^Xb#4 zYWn(k*~4EN8boiF&?QzscSn(6lHqY<%c z6-jz|iS4+Ez%vhd3i=z*7ecSDJidPY%IL`&=FJ5Y#8`5txj*;05BgEsL^ESH9`(= ze#fz@zkM5wFMa{(my(&KI+OnTIQ{52??XrI&CN~1pj(5&`ego}Kgz@;B)+RP`84sr zC1Pi^i?zV_Qa{F-z^v~GWEJhVi>qV6jD?qey-enh_VYtpIrZo*f8YH@zm)lW&T$al zeRmk?!wB_&x0NoDa9ESCa9CG#0Dp}zxnI_%cAZojgFacnmT4o^m4-V}IVUG4V9t3` zuVdLxKJxlF{a(2%f?6p|mf;Bt3*DriYpT=Y&h*dTiVuA~;Ooo04YQDt&{``xEu-k5 z(q!eYUopwHO^GHSK0Nq2t<2GUgQF&Zw_P}em}{J0_VwL`a^tl zU7he&QusrG7;qZ>wb@9Gt7m(Q-u{$-`7+$;{_1qQx6)$t%dk0Pwru#LNYNt<`}+Bj zTM`nIoXX0tAS9oCoZ@l-Z-shG-3ZnnMY83MvojxkK-Bn;H?hOnazu^#s$G$^s)#i} z5haB#`wZ@+!4Ar?kz%`FECZV@`ntE!5da~gfg$jKR*pv?5lWk>sHC6tp;8l(20 z4I8nfNF}y5HcV*#zMqbInFFGR%+4m>+2UUA*SqfPJ9Lt~K`h%VH8n|6cAe)*Nl7^y z31Xi7wIFbN=Uo?H0&I|%l7d|>-rpLm*a`NmbcP0xTRzT~i)5nxbRgB^<8P>;p%GQ^ zIxnXAcGniMgeE2?QMpR-gpu7cX>Kc+ue7!0kB*Of-$#luiG8oDOM>WTt8L?LtgNgU zpq{SqhnVzjLP(M`Gc!5&=l6yA`E&sorPza_$6=LtP=&{-rNiZVJW*`#^WVRJ_keRi zaaPN4yLS^@8E;sse!l1Lb5HJFY;~z<|nD5`dL-lcTlX4wGlmDJfJAhn-|f zrSm7ZYteEv^p}^Hj66KCH*3ri^eTC;Jw6#2(AI93)XRH&iz9Y8#c_as(fhjC$)~1S zMjAuN`$n+#?rK{>ON+F(x0n9-Z-4AvTH9?Cd2bNFU4{gx0YFSIc#roWxKt%>d0_+^ zD1xaf##K6qouYQ|x_WeUy?CFdp{W^NSopNUYLWx-8PA}o%u`m@UT{KtxAM|eNICVD zG3ZUUCyJl{7>@yP7B@CF76rg48sr2m9mlhs>5*d^K|6TE(Qnoc5iaYtLWokc;6inr@y1`vGq6$obku;y3)UF<`tXn?>wIwwV^nSz7%*M zjfk!eo9bB4{l<7IVW%%Uv(=Fx7-b2SX}vG#%cnn@^e6GH9W1x6twu^PefaRHYJEaejV2fIwQSL|37t>B{ox z56@r^A>4u1=U+iyj1p%f@237liJpk$^NXJ!r=K~@SmZ?)zpIY<_s_Dzs2#1s`_^Nt ze0q91r?gbH?rz#F{V|wrz{X{n*{{aN)D*9?X_MZV$2m<+`d8=0KYlQ{yStlQ9<7_) z-`$#koMAGMBDB_q&G|L$J=h||(JIodjnUB3iiu-=Ll`bAQ&O{nb#!w)82kITqC+>e zYt-DF?v^Vel7qvOW}(Rh3@uhOZoU2Mu2WZ!VzP|ayP z@dt_Q%J^O>VDFbIQu1L=QWNMw0fM@5P5LtJao-Xqm3hb{RxmcIXgrk$Y`h zx5f0#YJ#o8VwA~YbBO-G6HFd1yXC*B`9|->-#>{mF1s@?@My)A7r+rJqy7GWLehS> zYBFZN-Zd7Hqq4Fd9c>%j>s&Q%I|(0wjgLjFI*5Ry4T<}=9t-bm8{+7&bJX8Cj(Vr3^Wo|%^4p+OCeC(9sIdI)%_67^`(iFj_ghZW3 z0_6CUE+Mh>3z5hWkbqgU3$i#JWq9Dp*;x#L{^Y5Tzu>B=cYo5vl9dy<=v#W-mweHC z0x*d%=mWqm6GA2c5=L(O`};dS@+*}fInU!!3p45+g9#=Qlad0&x3I9Fhk8I1lRDue zGOzp1VK=gkCxFl1GNX3z7}3+Q*Csa?hsad^Y9AMy#9Al-`n~;W8vR)58;WkVVJniu zdfXeuMPxbfZk-%%PbXs)Vwq3{ZEly{)BdE2 z#HV=f)f%Pu84RVm%vh}L``n9w55g#T0*l^NtNen#Uc1Hi5+5P={<5CMfR4Hz+M+c2 z?9J7#$w^$P4_#kfUCFDcsIl9*rZ`U}sFm3pE3xHc{#5 zk?+Nxw4yAH_ezSK)WW#xDknMN47ONTqvW3!OI*3B#yFiv8 zJnBbO-O)tMDkyW_0M=vI`{IeDF%qAB2yyaWBTyd7zvV#{Av>RUrA0gvtnH`!+jA7j z9{i;01rJsL;FuR&NAb-!pTVgE>?yc?na-mztw^t4t8Q`KA$n!S_y`P2DBX5XeYb1t z!+Zw|kp~?>S_gnl`{RCr_q#Jyn_F9$+V4Ru!3I6grp>Yo z3$Xw{yguI#Qpsz7YnJ+WK0P@(^ytW8XR+C!uHU%a5DYMK4mhaH`}YhG9Wyg}C>duL zK#agz$Bh*LT`$1uw+xmUcZR^zjR0!pmzK(@s^XKfX~P#5^uuVxD3!jkwbt)9VMlf| zY`ZE>H~UBo2yLXmXaD8*w>tfdWpAQ&DtHZ~fu zZtgW4tL)5FVV5?ZCGBi9?f#lQ0Gx06cu*p!eYqv>jsBDCa!b)P0wjoja2xEZFM=ND zrMgh=HQ#%GIvsyA;w78?Ae5B74a6D-G*$i{-DPhsxHFUt8D7LQn~qq(hXOV@f--q2 z4p`6<$U-B|d1)SnC-*wVq_wrR35flEXJkYV$(z050C3&&=MRpy*-A(7kU1}``bE7> z5dyc7oA!Mso;dipI$)j&oB;S(1|<1~y8446EmrU2LbM z6dY-3Q`7G!BK^I+QU(SF%J+L=9c?IvAwNMvKpYy=pA-<6_l=vAlM_lYxpS?qpu-vl z;Adnm{b6BY@O}5RZUid=NuPRTav)ViT~qTj_xmn79v&i)p4zQS8v~8n1D65Dca0Ui z{!lHRVSCbQbMA9IxqS*dccdaan2Oi;z%=l={ZBv%EVv=Bc1OmCV7R4qXGe-t9`Nie zG(H50mn%`3g`K?NhtV5^{Qa)ErG0EAU5ov$oCD5BWbL zApQ^#>=p3U)f3GCqx;U&cP#pMAoZbLpv%sbFJN9NK6jTR&aDFl_tqz(2con`wSEsQ z^gJHw#be3bH%FTfI#vb{ZX=G%*1bR_c&D3#Ac+o=H@dzcEztsU-0hDqPOhdbWxyb_ ztNLSn1w=aj)Z*Rk_2JIXK_r5K(P#!aJ49@s@69IwEpT^|C-I`umCuKX?xHrsO!CLL zF^JuZ^XB{TU?S!fRi7)O-+g`RU^4a+ccrDv`jc(9)JLL`0P^rJTuY0JI$jFQ6L;DM zMdN@(W@`>cp#zxoCb8SwgUWSm|q+j@dJ!L zWA}NR{nb|9d%$!q{{1NBaz8R@xcc{FWYF$lsWn3a*(;kjxj#X`mgerFTVmzspm;k7 z@^Fy%`@HvnBe2xR*^E=O3)E`Jl^OJDr4(Qr$Xz~B$;l#1Ngx_l$(k=v_1%_H|D*^J zRnIvn!GXY70(z@MWWT{5@MvNn14AtFf#O7rB7T44h)DG6_c#tT_kaWuAf8s{xG?~q z1pxrav_Du<<9}lX^yv%|60`_hM1U3o$lSmQ&AmoA8x%aIOP|T~TM#1J5Px}~sMQcY zxs6+sc1Qg+E)G{v#^Ht6qu#+mbU4H;`pTfmP{NhP@Al>EH>DEgH+xyreSoZU16eJ4 zvE+}~U=W2tKysn!Is&S>600hXd36ESml~jWcz8JS*&7WFM!h#WIw3%JtpHDMCeG!wV!uW=4i#%YNLiE~6X{W#~H>7J`fyTx95wI26spCuuLr>(SsJ`3lOvAfFN(Zz6N649w==X zfd?K!O?LqI>A%ohrM-s+k6Ac5<0tZqi#x^6=llWfT&bGWZ%@BFVV(mj4nhgq0OzGE z=CRVjdc1-0#z3lerTK$Ed|HmGU%}4-CVb;Gh$wBoqm+xJ>FlQUp`xP$io@szJiCP< zQq-@}^V}F@R&byN4u)j#VFXu>fRXyNr-^ymt@S);xH;i2{}j;8gwo?Vo#Q^c3J;R3-LBol;Z1c<8}pdjd9b`eO`d_BLv zbn0Q>&o?PwEhqdFq^^s<$+l{*U;F?4YYK?MhrVx_RaGPagc%T0ib}`123lo;YI<;0n*kI z7`hW2KZ=tXZEx4%oew)x<$^9dgn0%cApEL5bw=Vf zW7Fl|hoW~Es~3Cq`*y&5YXJU*xuqr6RCV8a8$vS!*@=IDciyb7uI>v0pNKLX4OnV5 zs}Ul0VDpyS@g+K%yspbkdI?WXPL{eQ?zrIxK0)Ahp6lz=Ak^L`zykA2O1gj=jsUUo z5Ro_jnHe$qGOp7+lU_1FIht&~ivv+6BvtyZ+J;(azu{P3Ru&D|UnW;4Td>^AOpLfM z*T5Hw5pw)X@MB!@*|TRo09>DH4tarRn;=A;h)6Qve-0qX(HIv8ffBd@$o?4UiN`<; zo0yr!8r=SSBQ@JHwd-QcpWF)w8EGYMn8be5HAkjgWoD)?5E5Bb9oHWt8-ql0#Q zbjBVZ;7XZH6ukwzN(2nL0nuaSf)T)77at=$LZHDJ85sNlKE{HScaM4LiKT@i{iT7Q z3q04R#~JhR@eulTR_}GB_!SEUurn=eY`)Q)m-^g>f?=K369it!%l|QyYE-& z{vaJHvP=0%&3auB710&lAMejrt6mAI06B4V*i9S6jzs^Qg|V-{KYR-9FEE375_!z< zfCpm&MqUF4F?J7M3r@J@N`@oknK|dW=*1`?@TSnx>u;hNT1qEEoTUI=(_zRJ1>9u^ zpgR@MYjrsgiyK=}@eDCR!1WOC*HfZb546A>up~?Xg+|y3H#eUgK&nQ+xjkhb6Cb}x z^h?FQZ!QNx72U^CuWY&e3{b8k;4CZDeM`#>qV?AHNCROcmf_I^#213Y0Beua{9%H; zPtfV<=^Aj$qiG~OPRuKSTL6zhTlPi|TWftl_(&==+6knMAb?V2fJgXLR1a4`H;9vfqT zOtlQogS(>Y*S8IB+%vPYhhWcHr{7T!H{w|)@7eH0r-6@KzL1lXtEi5tKtyVpPBC&}GDRw^TdVIN&uB176XRSl-i!j{*6%d0A zmI)d74CxL3x3t0w-i+dZ$|)l_Owj*tf2mg?z@@S5PUGzC3{(fGdGsy}WB}PvQo;eM zCNkMZ>8jGL18;W9c$n~Ax{Uo(Io->SNklADxtXBV=YZ=eDk;S_hD#{{M_Ex(F{Uy6 z>*rL?^)en(8kerG;BUH3UA~GK;psv#OhF7lcY{3r@fYL1>A}$SbnwW?tF7~H3_KBo z^7erQ(J6{hT$iRb#CZA6T?tSa(b&kZ>5n^h-4HfrK+ym7xrD_3Ti+T9t0aO0e?39a z{t+)FF31L_QIn@FTluvJ1`u~Sd~7uiw|qX5-~vR9XU=;Dntd0-88SWw}?z= zRQe-7U((8oRV796Kbhw`XO9kSO`=MrE<-Rc#OC9mji^8zI+YlXfB*RQnqYa(19BJ! z>@Q&2{z>A)2L1{5_9hp(W|wa?QTlaTfL5Q3b#FU-l?B& zqc2~qfMflE3(A;W?<`$d_-v(R+l5}g9otAPOS!a;IpE{K;C*p3X}-Dn+S!^3@?WwO z%ow*cD%Z}L{mB223Qw-58&N%Tsn@#-$!#9)?WUER1-k!s&okxXl5^;%m#6ZzDscco zO3l8v)7|2IrtJm?RsC-F0WaTU&v#EEXEs9J8o)Q1r*Tzu`lsSgTzpRXgcrQXihb_U zsnUH)X6o8%Yw`6S@@Jf#&1#awTLZNh0g6|J1xGe`S|HHYes?9r(P|NEbH`~UO``yxl4G!V+ee^k-<@+Cat=U=FQ;nCb zTlduIUf*ZxaJn+PI2syv1)&zpvDQ8!(Npfe*$*A@k!So6#37ywc@)>hgk!eQf!v#& zpN|1*Cf{sk0c&P@nM8cVEt{?W&x}~fAp5L(0j)t_dq9*Zd%+ufNl;My8fUMrF2N_l zZS-zp7J~02+dS{Rzb1k*Rt@fv4&7pEi@(b49_N;88;b3VLXwMjUWL0q&+GSd?_Fuc zi)QNP0XIBo{P{2H>9z;;JgmfEQR?jPAGJsyZy%}vC|;SR<=QnB8=BG>52!m^VB8Pm z{(9N)>PumNqIUk(j0H0^ZzBMFwU*;gE%)bUAkegH9Ug-mTL#ovkwG(!z?_}T+}U{5 z;cEzfJ7Z-?#fSBGR23c4l(DsJtJmF}sd)eyHvgs62H9k$h|O(wc6gPUY9!nwm9srx z9fIDxeEG-fqP#yWU!Jje%+lA_l9=rv`DHNEh->V7_GGwBxU}UE_$>_siCvT>KM4hww)IQ>%6%_yZx*HJ$Ln(sUOj zJ5cwa3qbj#XV;3VU1Mh?N%9@cb*9Sdf1R9Uo4O}9p8qb-9zt+1g-r)X7&LJlKp?a4 zy7(h$s+4rz0Nbb`?B^g_-td=u2_k6dr}ev$v$&5j&P_NUK7cI>S41j1ODMBZzzoZl zLssL&*%9Z!;M>03K!$YX3di4`2SjlgCD~zBPEWU4I~To*%}imJ(}AE-In(x!LrBoT z!+3P);z}NSZo!x1-q3Wq;sXl@hpeL`4}z1kX_rCP*4Ff;_nn;Hz80h3AKL|O!ARhF zai*OgZUN#K$nQs_LeR0(B5joYjhi_e>4BJ7;pd*QfW2vlzZ4_Zq=%>(wu|Bi-l%wC z7w=h!s3dJ2c^V>YI=5>hFkdi%ZOWjf*P!|l9jPcvV?o_V!2>~QU9z3qNKLm}LHI!> zWoqM96kGk@{%Juie}-#EtcgNCmL;EV+PmAA8Ep#o;{_puGFN*D39DhbHkZ%cC*?Fz ziv7lO{h@7%t4#(1X)d#Y6qJ3Z&7aLu=I4ALYQ#9Ud0+`hCws)GOJfBi)+t)p#};kp zjZY@<0uMy5I*`zg3-T1Jw-JNqV;r~*)qAQ|{EGi(&cl=0+XH1pY}%(2=nCH+5N;kF z!!TA}9oFG8!%E3g^zmcK3D0@?3P!MG3E`ccLnIiUrbtnlXtR-6dy^C&nnc;c1KSH8 zw>><@8!n*00)ks%>&aI&FGW2LGN5V1ZwBvgR6Crvsr0boT)r96*3^Sv zEM%5xr1WdKeS`5R8F>nyomH_gkL%i`dvh5$$lOR4a2SVmbaC{2qte$cjKPbBkp>Yt zQ+q858Y(Je5b;zoVncx%5|Tmf+!>)S^2Kuz1<8_zBSl~d@vqcbp8S5vd^M*(#*00i z@;U*cN~*!5MH8hl-*MRtB14}u6aIh%wImwvvR!qk`hCYFYT0svohLG3c<#-1qZnol zuVV=*Xf!-&RYEn?=WuerEG*u(Ad$AHo6|K9lg(^FQOotMk#k~kMnxS8MN->UU7TpbL zs^5dyq|g9Dg6ewWxmFYwTm3-j&uU2=60{`)DsD+hhF_N-1^69^HWQWGyf`0r9-tbQi59&M3BczHN~St+bKlgk8B4}N_&gC2c)&o&0NDmUly`DA zYl~lF15Po*2dS}Ng)j!_2aod$3R;0w5H!@w9>&P#7MC_btD@vRN$(GCxls+lPa!Eb#R1vBj_=SeRKGv>tdV&D( zDyvB*iw&93_LtHZuFBq~AEwJ1ux)da|-uNiy&ZxnTJZ`Ee*i zQ4idfj7fc@GwBUWrO~4f8V12T`*Wyj$M0`K`wmZZW*LOxbyQMCg^wYzV!!LWa-B?W zaz=qM);lU3*&>Zp;*^BL&&Z2k_$cvKJ7!sf)E*!F8~>pWymL_DoC7sRHz3!dQ&Xvj z2FJ{Kv-0!huPStkffdvP^kbQ@44&L`bUP<+*|{`-%ofH~(MKm*+Xl)~+=@grV_R|G ziJR)*75>5@tymSrLyNoa;$F*)rIP%BG&DO*Uu#jf!)E@G{|U~HCd*jEEAzLTphZEZ zb%9H)%cOXglw4prR$$`N`b49`wP7UW&_^jv=MaC~G7^)|CwB$7&Ds;Nzi z`K7s|V`l$vERS%bN){dbysorSRO=F9dc&t9ye=Yw{xGU;h48pItf%*n2%sU;0*0}C z_*n3Dj#=#f9-8{5&a;vDZ1#COPfRv6_CT{le|;V+Wsbip>=EyBnHX;A0y63nv05&K z;05ZMQQy_LbIWIQ1*Y!gjSK6T)Mv4U-sJG;R)dv0hO2-}fD! zijL0g9`N!%C9@oZ{UM#0P|H)rkre}H@Eu1)#!;Q5VJ zUfdEO6~S|)@4q-!j0Wphlj-0FJrMd~hjz9Sg7qwhCvObnN0gi8CtOLa(;?@BcKlld)I*y(&$U;=;3(IOL z%(-X|RFeLJ!fbI*<40i%%FZrNugWBopIO}|wOa1JZJVJk4^@)>vZnINUg7?SMvnV6 zrV`(zX$~i!GW0A45_A1fdno3Lc(TspAGAV`*7zv1)sqsIRA5q%gD1G~GMY3l+#9T| z4_t6lJ2o}s2tVp`UhGY6z+Ok^9g@NM*YW7=g>xq)ovhQ#G&Z3Tv01Oi8Q!PsWMB^& z5JN~hW0SxSvG0+<7$oQ1QV`{%u#U|0ddtXeFV$$fP|pkw1Fp&moB}%ET6nNOPhtz; z`2pY9%U5=Z_39w>sE~rQsma{EOj(A0cCBKJ=QkOd{U@_Ljt~Ww5gr`_1(h|ahvK)+ z%Q(A4ZgS6T+8AaUo z6{-x8xD;wsF-CcD+Cv%eJiZ%;s4U5o@}{sVL3p$rqJfw#0gr+U2Btn!EuMbtmjt4c-PofyzSSy3C~pOE4KuvQZoUF0YJ=IsVG*WpG(e2_x?7*SyBU zQbi=I0UNC%DA8neI$L#kTEPQf(%u(00;0=yZ`)H|T0)dpd_le;QTw1iqMF%L1V%;D z-psH{b%zQHO_X~cMkp!XQ)OQ!{{gzxNORz^Z1FMdd_sDKw0mOfL$KCAXd?GH^0t%I z`_~L8%G8q0-=1noDIZ2m&GyN^pu44#3?DBvw_aF=I(WVx_PvZd`$Huui!=619i6Mm zNKkg=?ctq%<#~;LQ5Cw+P0rKlSxopZI7KS_w<8l28xT}y(HT9@tCH>8l#e0lK+UI6 zN!mwH+#U#{LLZq;Cd4foMP~MI`_A(Nn~bq$tVlGK~6L`f4NUfe$Z5*5+1(I#j2NoWzIhZ5*{B<>6thGds&y zhJkV*o*D4cnq+jb_Y8l%bsG!90ndc6E%2HF$}Y&RN7FH508UimYF@)LHC65ums?D1OZb zY~?>DwjZGDZIQ!J0hc8*+npBQz_G%yJr|Fm1%^)qlmjSBQ7e5i{Sf@Pdt>$FLEB~z zb=9uITr@tXs+|U#xH0__J=U^&jcOVS!RLghgx#&djmSi}BtqO_lVI@`s4?)UK~HgEqus;l^VKB@$W!yUZO7cjVpDHH zWeAirkYjtl?i8bxZM%t-ylte|w~_F5txj*@^SOJP``>%*MRb^W+3v2d$Wiet?GvuFx_&g5)L&mu2{@z>vwAWi!+3X2Z_- zYV==L))#9lmMfzy$OO-@E$VrsbhNBo)n)dWdiLImB)XarMgo?S)d2w)hC1&O` z8-{6@Z=lM-r=!7zWv1n-BDO)KV%df3B0_M&kZjaDwvLWkw${Ds#$KZzm^h$htZ9do zq)|D2ZmXjC3o+q5L7{q&M~AzAMrHxC>L%C!?)i_C;}%=l_+7QgW?f1voyH(TV|$Ck z+bT1lN@1>O)h<8 zLg$$S__bECinz9_So+H)^OlD;{@Pcto~eJew9i*}!=;LqI5-uc0RV&|%8V+N^N{p& zLKdE(m%|+IKhb|!*dHXiHlSy)1eTmfQ3>w~QCzp6=C0q|^`RR1r}(f@7xwZ%xc~mN z#7F8M^$99$22E7d)YKzytf~IGdAj?NH3=d?7t@`qh63B_Q5J2dJSgRtN0V}zJ_Fhr znwgz%3rK{`Sl%0?E?KIwksf_M)xlNlRN$<<;!mU^J?Hub$84d;c7{$rAEDAYLyfz; zOV@<=3Y{-sSVez=Y>2)t&Z=pR>42FDeV{gO4C`#OhH%X=kPd$SW^y{M)$~~~FW4v0e;+grNZZ$Z zOJaTW-`HMTk1FSXNB<=zfd7F}UAY+(yrxXXP0@}^#F1JTdh&HZ?y=5`>Y@3uufG&7 zf&)XItT_4A=&DOBFn@3R49_OB3?OLM6?6Upm%&uJ-w1KuZH<`Sl?6ShZfW=z_a=vD z{6=XPe0lgmof)w<61gly@3D*Q+}%ET(7E^TJ;BX_*ebZu?N}cCG0H|N6YfQdBJfjG z&v=Gzhq3Aitz%0@tY&bs5YVItSkP%Wf$cJpkd060yosFcPm*HB@FDy2P-a3#xv<)s1$p6+C7nwrI3+nFC#b&~% zCD#|XEjsW$?2~z^P>jYD0O;i-z&&uBcN^_O*tN_TXqT{$M}3Y>%A56jRH@?PVX^wj zQ5(u4u&J@JfFC7wSfrt-pzG@bw1N5QSGye=gR=sf#lTPHBwmFoF}IEoou`{?(%4*t z?BBo4;@bW^D9|N)LBh4H&SssJ4&!ve_P@rJ?~0QNZnX77_zK2`tAJFJo@94D|1zg9Zax zQ&T3>KMB#iu5a;pyKPNu3`0r&9gY0nH?c31`T|dR^_5~-@l;*}Rs-typbC*)TT7uT zdWeD$bH50dd*x`oh=J(>etMqoXYE{)Qh0 z{Z+=Hc>xe5;hFAc-!JyyaCeKl^!cKo=_qn$rtzq2O4I7uLs0U|&dx?gTr>GQm>yX| zY+dVA`S{`s-%}`=TBSy`w=Z&@L5oF|{JZy|Cd-H-Bus?|8Wr)teGqu3aqG?HF*l+M z1+-gZ&iYRdL^PtNmuN0)20zh}A76575ci_qwa@ zBvd(F-@+xfNKru_FefhAj*!y*?Eu9lFUIceKtO=290gZt;IOm4i&!Z?KhMl&{`K@Q$#j`7gKd(~ z&Qm22CYyTDBzwOb+p1zuH9r)Vp~IgWgiKz_L)!lp&7;KF@t@!MzheUd z{&)_jv@{Q^p9FS=6$(!G2wO0f|73Q6S2&pum8u0PncKoso@ux#P~FnfatO3vfvX~D zjRw6riFxAUUxMxc`MRy3481$UZQxek&A?mwGUtuEDx~57i;Y8{n%QmRwnsboO6Z=g zHBMKIlF`0QJ~aE=^k?e>#y9_f_tljt6QpKffM{7T0!^bv53_&oX6>^=!7r56VF^nF zWtAJ7R7x!y4jz=r8uPCU3IAsXlxJbR1+i@f-(cqo%VXLpFaC|ZMJst&^NY}xI}8dd zZwbi6Gx$OzK0r%$#~09ashPIpH@X^r-Q+hswT=Q2e=kR7Ip+&oaj8e#hgkug;{IYC zMHkx4{k$$`%eDquN{jpA!@juJS+<{DD*0-VF)l*9%uijjra6QcvX7q`3NYK8Iq6`6 zZY<%Y*K%fN%tcbV!HBLM&|3_yegV¥9;C-tva+RdZ=J``Q4>x7@{sYs^_6r(Hw|7mD=*cYu? z_P2=Z-d9bpg5aoYrs_~}66xW;_pr7dLx_%p>_QON5Cpc*=PGBq}-?kvx=faEXQBsPMThOx{3sDENz5HGfaThDV_n6SJNHY8fs z#)}J+yQXvjJwll!C3vL`Mn z9DI87PCzJz0TKwsyA*og?j!jsxsnjB^@9Wy01-VWpyjC?^gMzqN9drhi`ov+F%u4& z+uTHH8V13u7|Ut2n}gr^wbd122~L0VdTu9R8Zi*(eEYl{%fZLX zp-{mKiOY*xvbNL+6h)^R+<8Dr9z9##t95So#Lz07fTq#O_<`*D2SW{gG*Qvkc+I0l zWUEf5!S)@dP5-rwzh+pTwtFE>xN)y6-+9_)WMWgHr?4N}K4%9|hSc(ZHM7Ej)rR(| z4HQz%)O2;jK-J{GE+$awSJ%?|esLKm2)~O|GLhGuab&|YwBg7YhD7mIl|pCUDJdZG z%v$4T?C~qI_~#-skpU0B-BrugoB6a-7FAOLlVy-p0s4(?8%}nep_!)q4I(f;)Dt(N896PrfC)jLCcfZqA5RBbzR?oq9=g|55m^m{Y=r>krW0AxajWr*cNIx z-&yIvFkZGj0X35M{crd##6z^C#$asycz43fj?gMI)GRy~7Bsp0;$1biV;<=$nPZns zJIv?44h_ylD>4kK+RFTeLU7E&!pAiD4aIG=^!-v{q>j1a{kvljZ00V67rM#?Zt zZS5!5uSjJge#rS;C{&hu>_Bm>UuPH78Q-Pr%2}rfqE}5XKewvJ7NQ7rv*CtM(2$9W z!n!Yy+Q@s~*H7V@U&*IKImUKAUSxHtG$!N>eF-yK^lxf-nceU#8yum?D$wR+)g)8; zPTpVVSQB?)Q4>8`A<{GmJNxJvm#d|{Zkh;{JuZw^#Dy)b4_^`O9mdq?2oeF3dDYP0 z4y{babr=(uEq7|L^A#%YsDmtn;Cu_2X2j}O5$DVhN#a0wEy2K}jcS``8-3qd7d5bH zX$IM1?`NWo#xfb-xn-9q+L0&xyY7pIz!l_!e5zru= zsZ)+r!}}bgM$!p-SFgu?N*>nnZxAnYa<{Yc!CUP{J4)FNvyAEGw&=e$CghcFN9cKN z8A>(sOs9I7%*q@iT3H-ci~6va z8&#}rCnyF|S?qPa#Z(T<6N8R}th9QX?lj&HoZ)=~bj^tC=F!aD4|ixr%n2E>;*aPCcm zIwRD4do~+&E|l8)Bv0jo`2!TQXD`H11G1FL60(RyjdAaBK+fk*R=>KxGtjVlHkLWK+i5eL8LS0G{O)Vnh1}K7 z4XpD73IN&knJSG^z?wQv?DEgv1Q z^ztiZe)L!IXZ?;7deC!`Ef0Y^N<_K2xl*3@Wp;g%i~{VSb*VFpijjLfB?HiZ-hxmv z?7D`Ix^G(%oG4W2=v?|pLu`As0(B}k(GwpSBX_%Jmd^-@XTn~|zu|a)^x08sK4ogI zzl*~j2T*&34M~53yF6>(n?wz^fPnL~FLU_SC5`w2kZGe<;Tf)ML?`@=MnI>2+#21c>b%!3zkQ!NFw79#I$Z*Tj5Ze&51e349PlO!Nzlk`Rkm8)|D zs(2LjoPaa>uMh3w!*{-zWZnE+VPh*I<$lLu6)E|P7qT1JpXub12-zVEY;s^C^-HNk z-^g%@;Y6LL%b=8F=h49RuM)W=lPdP;{*Te1kxL-Vd{6dWWF69hNO`1DRQE?LF=F5H(G~_nSu^)f=Ug@#RK2M%8Ko z;0*{o#we1LK+9!=Vk-TMoC%vUh^F9)2DXCKx0vp*Gv>v`Ew5ss3pu=c;Q z)~ixugwj3tg#Np!rkHG>YPdwgsPkJ_%YCOnJnQBjNV!6L|ubf*bC$^rybQGA=_rvigZI}5I`8}=`{ZSZB4*inaYe|;rEa>CzxBE;XLeFg!`+tjF zOmS*2p$JMoEGS`{42^G&_r9Ast8ij_5{*fVmx5xcL*T-R0zF@HvMaabM%UctIyH??eO|C;~@S zL~y|^M+gqCpyCy;tYOH~#Uy{rD=Lj!gMKl#z;ZNO6kk}`aLjc_wvW!?w10VE`7!(f zQp9S2w^wRvOnxk~^XVFi@AGC3Gk*V3G}Vc}HxrKodN?REifw?~#Qtky=%#tIy_uM@ zA{$SoVavrmR{{4Umb^m&VK+2Vz}1?8R8~P>2{9s+a`Xe~79k2_o=uuls+K}oBim)~ z2$QTHm~Mp$Ciq7Pz+Fm|pmtw`Nal#gj*E-4+_jZowtm$O8w){twjc!mWLsKlUxkH4 zVCW7He)KJ>aP50yJBFm=iApLj+5i{AlXUNfCmy7^cPx5%apSx zbS)du1YmIB&iVah~OVo z7>6v65lz)nE~5^qfF^?Gn|01|mt7qbQ_~ehhw0>YC*uAQxRj4#jUQV=Af0oN=ODn& zO>bCWU)2h|Bz83Lm%7Ga%Ch^s{6^!!3r+Uo7R`EGoamn=2IhiH!@sFozAl?9;V0Fl zaGCRkJf$r_c57g-TZk%e!;*XzB*V;r&0POB(#U1mnPIG_CX?5u7I&M6 zG@hYnsW4Jm@A7lAbacvrH{)rRELRDRTewO~-yh=rn;PQQKMcf@B)xmdVZ#~8(9erPCGKkT z$%yHn$Q6R5j>_SE8qO!ZmjAXcOKLbx+6w#lrT`-#FfC}hKjaQ?CHN7#9k?5s4{oD? zdkR?4#s2-BtsoWNoP9Sn;%0^Y(VBuLzYuYTvEuu37Vn=~)+P=1czLgU3v$ruK7WQ2 zDY4ah#3W#CLs(`4NiOWK@C*aEtl1cLK3Vagb7@}icU?B$W{%3#U5RdPYI1V262El9 z!mvV0)rk0oLDKS#i=>6PfJFI=Xba^qj4gJ#;ua;5fRn16?IaveI^y^egEuW3>xB z6ezURoB6@{u|yx|1>Lju%JLKPud&rV@@#+_l|D2J*E*{+;@-?z_*jL>f@0xVCm+k6$EzDUkbEkWJ$QlUYjQdS}sTqq4*Z<6^FI^LT5sGBRVk z>lMn#!&;1vd-rvf(8EP!RwM=7CPLJu>GxloO(DtP1Z0;ivAejI5n=+cHF3ANZ6`QF zL?&Uv#f*DrX`2`|`)=;9v5_^rS_TvgONhE&HZyaL`%-Iq z)I1+KUjsT4ZS7TQjixd+L*m+1f2|Dj?$3A!gi2$U`FJ6n4j;%$IR6iE?;RA?+O>V| z?j|%j=O74zf*?7GL_w6C5y_w=$w5GrmLwoaML~j+1SF#*5wyvIL;*pN43ZTjh^X+b zKF>Vw`#m%Bel`D1)j3sEsr2r9?|p~0uIqQT9AlxtbRO%{eRygZ+pq0lsCP^yNO8vc zM+?8NW)JFi`E#8?A*Qm*O|MJd`L8)Z2n4f~oVqH;B`jJSU3sSEQ8)DcqnPgy+KJS| z6vxZoUsFr8Kp0~$wuc*hxx%uHbh`>nK0EztjI!avWo-TP3F5j`mDcBbq~x%1h~zKu z9i{`-#<PaL{`@Q~}F{#Cu@?iaSJpT#(aS8mEEo)zbvNwkr*a#%~UdeRb+qjc770>x7t{>)f={i9>- zK066=Qy=T_QZY`xQHrRvdczU+1YLRs$Doea%FaO{#fKz;AU56$#yj6p!%?>d-KgG+r)U;$Qg=XLl^A zd#O{0Lx_<;ZZA?;Rl6QEJ)SI0L`v6ap>fhOYpZeswZA`~G!GWxc97O=!OxC>W+13L z*D%X>rA+xQWDUeD6ts7tQsT7z6+KsRLDOzNa?k0)2kT?q$W&Gl z<_TT8avjm)9aJbx=1}Yxh-Vd7YuEseL@U@O?t%%yAfb?Tc(bYLW5y%BD9r)fvkc}! zA-fk|_Ii5fRe4xE%6V>I#>yR@zfwx4D`)Chg%yceV0M4cDlVvaBgMlm1pd%;%r~DH zx@K|L1uk!#&9%39OlB>}RrG!N(PST=Wj?c*4hX#nj2$pwgN11xm=hgPZS~&Yw0CkQ zC4U8Calp-hzn5X`l`{=N&<6H*E-;BE9mwB!wya{D$^b_V^0n^8_?Mj5l|Lm`(9{w1 zCu4!7T!@&$8Fl&q-^v&K$Qtz7U9>$=McrrL46U3uGc&_`1is0}N>$Agk z6!%f2>Cqc+`3$-E#Ii%j@GY(PAIniOqN0<>CAL>$df+TK`rbpF?}m-njs}l|&&9M_ z>G-xv`)6W%+bzcAjQv#KX{ho>I;&{gMls2YNAmwu85>i63tSXneL`jQMuXqq9-f#W zaPd2aOhNw>L9F~QsSexkf1ck)AL(bj zNUTR!{7KT(va;URimcuEWDf-!1XrRj3aJs01!vVX(k(TFRsLwWhkaZOC62f!k-6&rg8nlq#dkONwAkzd^PTg; zmJeysx0iG7R(j92#EdrWe!8M=gWSGRO$8mA_fo53+RsS_4k@*97_I3_kNzCWl^;!4ps>W}24(mQ(FQB0XPQ468!@3=B%V~djR=8-K&ZI0%<45g00iQL ztc%noEjFW!NBo9dTs}>VlecUaFRmEEs$w?5j<>BAD8TYt_nC`H4aP}5*$#=SadaQ! zJVh!tF5lW!imsj52!ajhahspu2p6!E?OJTg3P5n$f=tat#_z%dEzFK{s#KBMk(1$_ zvcyY9*k}4s;a8kDQr|k&SkCT-3=R$P#p3No4Z+9B&0})*>{&xgOLC-sA|G*FCi+xyP#zJO3Ra$q+f6s=11c8!agk^Iby`T!ELi!=^*G zdy_}4!G6N~{Wpk~dDmWlgR=gzOsazxb#}T#oWT4K#m0?|;%GON?M*gQEn~P+!s4weL zw-2M%wN$9Hr32s$9? z$E`by8c%|LG#GD9(Cp1O`uy5oiE_-fi6B?0OU)kLNU&5v<36}?}yle z*ZCrHxOgUvEQG4l$DWwyIW)sS^~}BZZIa?{D+-LhK<^;5QYt6%N=Png3_nGqv46*^ z1J5>cac$OC7l|Sxo>o-*w{LshJR8%A(JPEYaY@4F1DdsRM}M{-HY5en4phFbW3kfQ zznnH`GORgN`J{dlHzDG_VPXBj`xXU5)X++b&6}2{E-GoI@d+F($#EM3nH*PJnyiX2 zK@y4RWL?yjeT}8K*OVf`4hk4G44C+F0B5m-E5npq!}y= z?MKlR*HY$4hqN66zkveLpB*Y1*?FT}50UFD%t|`TQkhbh`AuWxJ@-NC3#za41l#94 zff_^r0c`GqC0WyI3HmVYK*-nv( z_U3?%(++5v*!A`6z!;Ii&t9o=h%ym-2}qYxnC0JIPn%yglzLPc zJ2VY#ONVBiOgTE>?}?ua1c84L++!agXVBDp0m0`Ve=P8Uo?oF1dVBt-Y}^GoCR!nX z>$^0a8pubRTW-?jB#2%~l+0OmX_HclFHSDnOmL<);smROnB^+S#{{mP9^t> zEx*pZ07>~?pz#oMGAcGe!Ijy+Eg_)K>WVKz-J30(#M-C*yRuV|hK1Xw>3 zEhH695+f0Py~G6>Q7&-WvqRS=iq-Tg(B+xj&n&hRPLnmv6x%#1vkXX?!7wn|mp!{NZv|F^7HlehDMb=_={O#BbLmBvw1ob8%A-gCoD+Q^-BrY-OswqtA5#U z^Jp9?hCQSvPrtQyX00yn6*IdBdidzZGu#!nlspg3&_9D6LKLY`g+@xQCrx}1{d2n} zR)L?d5*E8lm(cUy35L?KPQWNc?SJmS9Sy{(+-$t8T2WOM9rUmW0LbC77oc}T{P>6O=KTXZe zNwKX?gCM5>qKhNEvjl1gw7((_Mb3Y?XKUuTv_)-^pztMl(1IzD{ps;HY>x!Fd`=O$ z>dpRn2arHQ3yf9rnw@II&U-a_)qsdKJ8mnTo*@`!@axUqaT(ij{07LR_MbrzZ==7SQ=KQf1_w5}lRqQ)}598ZS9o_nAz+Dsr#>O7Iq2!Th}o#h`a0D&;o{r1oOj6_)KuB$zQEb3 z;VcXsVZ{IS+O3UkIY1}@Bckx9~&36{wytx{k zx+tBNCt?>{;B2rG$>Zsn2o`zDyeoT$*{9wMv06 zV5I)63$(BGzrO5~lDVxcXhO07ES4x+Xr6B>WKD#ySP;NKp6~t!Dgt}c;-%BYw$*Gf zuyS|X!u5;b!_XYF$i(-TBYBa^h|yGhwJMxoioiXuQcs` zF%`}X+1lV1&GllgOr+W|ex7GR>$S_{@iTIc>U0?wFLSW2B44lNe+nj#7NVX3j!g{k zuqaZk1KD1_dbI_o=~>vh>Na4vvJr$0iQw3bGFiYh1av|EpiID zYI3=eI2DpsHjcQlp77Ig(nOiX$4-Xl#37{>6`jCYAVGlm1T$0z(bvc}LUl)(M(z+T#Ss$r#s`j-<)Uaw$NEIv}w6H}q; z{NK#%1es>ZpKh{u&NqASDVAB46Z1gG?y2BM*7{~zw3!C-_|c;rVBf$j*b2!&pVYOC6Aoa?&~PS>kdVInBl zibR-UQd2L$Vd})^)!0K54~!&h-A&A@5VU{bWhRhyFYd9=3dp>FBAA)z%}Htvorr*dO&M9ti4(=8!qVktuRW+{7#_7P zqNgXRJkq+|q%U@EGg+5&Gr0}I#q!VPl?^{Sdrgo2F|?vR<}!XB2u>3kr$OsgodoM2 zto*brHbM5?ji>Hjy1;rJfWm5T=xWNEpx0XX64B{Rp0ty9RHs@+0^0|$4W_4&E~%C5 z(So;O4jq5SUtW(c5*;TPqD4#l9I!c-_6 z(fo<-a?UUAeO_z5c zMhk)EBz?r4c%Et0=%zoHMn)>>;g~q@b!#)`)TL#8g{Ku`EiZofAuEp3_C(ngMzZ6e zX{EONA%u${6n?&h9sR8b0CZKrn%QZa#((%O;((?g0F>&X&(yL(f}p^ejpp!7 zetUbr^_Y<54T6XH)wKlnE1WM~+LMbd^G5ckY^E0;G%A{YT2GRqIbHkT4p7emY=ACXN=nf(Am z0PhfZ6)l-A9+#y{2U_R#GNj8D}5)SQrl`R z++WewcT(y|+}n4WNcx&&qn@)njsV4H-pd@jpJ?I}{k{M69T4oaw`xB#F3+7w^aGyG_xQhwa(oSrAOT}u0jtpzx` z1+=;Q&ZX#Q=oz5K#-7{IVS7(k+Q}F%@*xJ&H{yzev4i>KN2vrQ72v0wacmZyM(3o-XIL^YN%T zFU%+B+s+tkUr_!7w)MPX|vEQ z%gKR%ge6`7f|V$({<8kds(RO*ac_AXsLgBg{1Cp{)L34x`{MgsaNv1JdNSdT_SSJ) zO^2#>IT{Oc)CEKNOdS(C93XYh0*5%hqeFAqKiu~%ylxRP(^rcq3I|m(_^L6R#Rev- z_b$3TwNcETdvHSze|AKB`5MvO_rxeaRNltOQkaKaVIuVMEkgOu5-DQusj$XIkmDZ; z)r7mQvU7UavBpOAVZO!Z(%3;s#->ipRG^F#59qUbSZGcm({^r91OdgL^ke7qDuuau z0#Uf_`5_{9MC!>CqoVYvJM*N@VhH=JzG9~F62*`v9}?wuRM{fYO~%*KAfb+j9+b#^ zBD+*y)Y#gOmRZKBnagz8)?*o$DNz?@k&l0rv!d0n#pyrFfm1|hJX-`1-HE>J!E6q^ z0;_~YHoDD(2xC#?1D2{}Lx?dOM`6 z@yopnaP9AyaW@`)K!*1Zmx)k%p>{?k{m6OPm86$LhEE(`sPtg`ArtX2M69Z! zz38=|-fSOrl~Oc|@#A7JZL08(@zX?^W{jU*u@=Fr*bTw7XHO0sXXx7rFrk1|6QE`T zx0VA)Yg8fDfDA2vcNhXp+T#EY1%+ih=z-}QC-&{{(E@Q`FO`>X{gouY<`09j7p}SV0qJ?B>@%Z;^EN_fJ;IVm$a!C zPBnzh8x+F`tTyngGb5?-CWx>o5?H4H(1YJ@`oiS$A`V2246 zpDkFN6dc;TfK9o)yqx^j&E4Jf*Xudef-b?ih1zh}HM&9^WiD+ctO&rglqAsk2)t`n zX*b5=l9H;>U%rG>K1`)CI7YOmyRj6to-ac2!*t@x$?A{)%%lwR36C7<+%n~Z(aF&I zp5Pi9k8jq8JzjyRAiKhWSa8sKyIVDRJ&!KY41r;|cL)$RY`^kRJ6*D4w^Ze-Emp@i=E6~(u zkf^2jf(DEFr{!E$)d$Lg47imGIlVEHf+^_eDwO-P?8to}k?_?bm%7h%{USmmsUxFIsJaC1n zxfNr8z^v^!%eoac%)g`b(B7|e1}W+iY+B}1Ae2=L~6P_&*Yebv_j zmJ|GWyYPXpi!DQAMK0CpjOf0kFsy}RO}HexY9;_7GVE#lY1OSmsWQ|fjhk%VX$}l7 zAuaQCAE_xZ%DWxHL_PQT1fKj(eaiSb_u%&v%TEuhM*8Lbk0VyP$_u>6i{FJK-VglbSV5%-n4{Bk_jUoL z83ncP%-aVm2oC6Rc~QGT+N?%~8jjZ;;>a&RyH!Bv^SktY%jQb8TAhr$NRp>qB?q;9I6PEh7h(mU;vt_R0&+NjJ!wZkZQk+%BLZ%PCw@OiibzMp z;yAg=$(`3JjOAi24Cbhl=0)wNkye&F=Otf9iu=RA45E-0AVCD!lF*nb9`H~*C>NKo;eo)|?fyew`Pl>l%DYcyh z5jY+lDX&N#X87OK2rY>pM!$rotGH~lV1{|`^Jc7y7b10(m{hdbABGF z9U`Am{fY>E!??WqEaun|kCG(%0MKD8t5W}9Q%KzrF3`&&hZD!=SI&ghj<-TYSU95H z;r;=~;NgWAabZ}w$3H?ZBFv0M4He#$HOG@p6m984v=T|HxqDflU zyUA5U9cR)o@3DH<;j;?Kq>?qkyxFf50mKuJx=E6UU6DXzVFi$=wMFVRu^jP?9J+g+ z4s<46w73u<N z`SnWEO}~fOhJO}p`h*}n{2UBj*FaB=70%16Kma7`6)w+h_jEF6>cOto)4A|5tdB--T01a4N-= zS@Rw3d}Jr=t;Kow<7_=k+KC2379-GGA+?s>8;}U%&i9((P|UJujZ^u^Vo7Agat~Q| zf=T23at*r^Yoz#{jr&B|!`Kiw6{&xn@Bg2dZB46;`TCgN`w5zS@rLmq<4BdnnX)o8 zE0!opTwc8#o-(r_fd`;xNw^d-;VB4p{Axlias|Ca`MaNs1o6^epL-xK#rpUJ7Juz7 zgD4G6gx=d!A0tMb#_2yFVpJZt<2=nP#=f4|alfoxmu#G#AzrU!LdixdM$cm9jRK4> zxB)SRL$UwY+Kh+V7OB-uVCRN{G6Zm*gnlS&p6|l>Ft@by^cF`_xJ7$P*uLzb<8_xl z`(g^bR{oD)Kfn|zK`OR4N3WMhmH{5!&*=c&9D4MH5(AY8>=v2AYbk%M*C&9D99PXy zz3YeEwBp`*9gM(!{UtbF383B}cscJsdKA^0Av+H!=f~e{8~k4k--8Sk3gus2`pNJ| zfLVp`7%WsmA~YY4zZ1QPfCzVFUNNC%7ob%mKN-o^f|q!I?j38Da13dAc173dS7?{d zYIR&Ou9fV=m{5Rx!xGOU{Ar?|8M(d+T7CtT7O`Va795C!_)#an?h{8a<5;WHRa1=> z>H|xX2{C36?nNH*EbLe>{Cv3!E)ID;IC(_9cp~+wMaZP!?`ohAt7|;nosPe~&#CeYJ+QI(T->|*L0U65>I|t^HB2OhI0RhX zko6aS?}A1ar{eBziz5Z_GvXqBhhj!4J_(@^B zhm4fNAW2g1dV5Z2+{XjKUq0P(QW=>lKUCATr?$fmu9hIz{BT2A^ibKMi^5o(vANKFVOjcHI5*`?CKGKWT(f-I~loo#$8}KLl(E*_gdU7oCQ6(uaFWH#R@HiBN;x2M|JCnzo9R$V_?3!+>*5ddiJ* zo;Mx%S#+_fiP7fsb4Z|&A5!zA*;@My(_``S57-1y+BrKr96u)ds*_69QT2) zQ4jh=AFw*+0q|VXxvvdmB%FKVp!)cyHvn=Qq78{EC-#5=_b98u$2_7uyhObKKXXPW z-@jgjS$1_p`$W~2oqB+rzJ~TL%B>-D=$aT|8YtJGcdZ?3Pw7XkFAWcF`u0%U#R$#l zT?Hka)c>~fJ#2a&lX8usU8U2KG?9{$gei^yhrts97@-J7sP76qBqNaAp%n6_QgjAF z{I-Bm&kFHRWM5q8X5^?pOVNnMAdH!+_SD{@6e!6D2{MADnS)qbbX~j+?i+(31X|9v z&NoSGKFD?;=cdtm=H(X7SkN2al&!{)ZxK;H$umbeZPEI{h%TnPZ_eO9R?GJ4uRj() z3=R(R-WvJzskqU7m+ihV7H|0kog9tRCR{0S(Z#NIGp_uG4Jx4>30o10kXt|>JN)}S zY#xqLDK&?7{%I)N0537pN{yZ)$+epItWJKoJ5m|MnbgqC`CDo4Ju-~Hl}jCseKrS> zi=9Cyi%2qYMH(-27O88qz51>>Br~HG{rW|}-UL=fr$QUxFPF-xI8^R1WfTwz zOtzF5r~>vZ+udx#()0hkYhF4;0aD|^vi2ne`Nq)6X9HbCn1L?KC2p^kEHSu+3ihH* z<`C-j(F?8B?DtN5?e;yQ_1>(Mra)b2S@F-+_YeJh6n4@uef|S#T{)pZdHC;#E-}1= zmhyML2kzHvEJ^EqA^ftE#C5USb5enjjdA%}YVhTM-GM@}(q31K@-iUgH$c}m@ z`Mj+V&{89n#k`yg`LV$58Fwi&+vMUxp$FCsno*4Hd?J0waF@vNMOxYFbKfd^gOX~<&+%*feS8%g#6P+Za?KWqnK^T7 zdU7%WQW+dU--;=Ru0EfP$9UxNs+;G5t4zo)0gAsOh*nfbkHu3<(!OP)mfycE zii52Ty?QL|UchMd4aB;W=uT1Z2gh3@(Q?h>HJe6CS!mJ$PnJ&`%bR5-Y5`RpPH1Nd zDys}~6=L^73fLABIHy$7Iw2x)*IVRYxU$KujX%p1QA-PQN+-u_SpfkRc9Vnz1gJT2 z-&_}mY7_<}h@9RV@HY5t&Zt6=0EUpC1JB=P8-xA~gnDSu2XfmMA(UScnE>+gkemcq z%;R{Xa7lMraNouq5n6HmWbysMYgbW7qG=vob+zXkFKZ?^{|^}XusQX!XIKx8 z$LFYDe#*0)2wYBwr!!c9D?3QBZ~Y&u1BA#M4GoQt5PgE1^t|wu_K%$zPu!c1@;j#( z1<$^~$jNcsdqulR+r}eFpjNfQFTJav8kN3WI{4c`RZ!{iPX<@QO6E9olEBv0dm34n z$AzPP>jZ`Czif|E?*N9?aFX*aZKN6bP`7=DN}t?3B?KV}FW(|C{@!;&=8&_`xZ#hk z{(Q8z9UYb_st4tiPkBJchagj*KA{-c|MZHP>2SFoim-~d&b9ESTBfUAq*+cW~TQaK1;VzA4iE2h z`btm&R8a8FBRuz+B<3nvI~2^WMr5r;gime|SpGYeNDV#QcJ~W{F6Qx0vlJub$Kx7Y zGn*fH0-e$7QHVq2XUZXaVSYx9U7mjdI??Ik+#KWEdU!iMe~9@kCy z^X|~y*k^?TCESBb`NXuh>Pleu$<31!*_#JQ1PxB`8nPz#IUfsT8#K;5!5EzB^8JzL z*+J2T6zXGbj>ND??kZLo4hscgVHDCa=t$piM$fy6$ z84)p8D#|m$)>kqF86|=<(%S=GASR-gZ0h&6qSQ?Ho1B$M@7{pn^5uv#OH>0#-k&n{t-1snL+>9Dt z1j?~uLc)x-=;oway{>DKnXLhWc*{zYuW9qnSZSTdxkT@49G@@H*bYT|D08rrXTxDs!LoVa@*3MGd+oB~*UaffKVVkrI= z!7hB04AhG$lykD~nm<^do?vVsj>c)A(xl~XBEV#%cGUp^0dfGbG4+!}WBhU|mLl=< z9RiN-@%-5gq;)s-WboGJG|0fcx>J^Q2L7w;`Yl5PJYUQV5WT$hMU9My7?&EPzZH!8 zu=%f)`G9iT$>X1(%(zGj>fx8R+%rmpOqm8wj!gLYH0)R8Q_L+vZBidc9~fz|uf~N4 z5^`gMy1wbg5;cPJ>0x!ziTF80!Kbj3YrLcsOz&w}v~u?p3r@;pP5v|XhILl`H?j6L zUrQ1H*J|~nLt_h9-qc%c!3+zr5^@A&Ffi2suQ}27z3}nNUxV>u*?n7GVxMr9GQO846+)R zLLq%bTY1IGT;#rHEB@PjjnVX_zningrM;|{JtrBAFmIK|ZIN0GQjlQx0uw*>zE_Or zLoO+=nntj$wk#F}W4~~P)R{(wfcr|wDW$Z0!_~HO{=4Thim_L>I1s#qhvm!K4lQ)U z@j+B+NyHn&lcff&s9{6W%GYe=yBug!W<(+ZmdxAK%!F*)&JlNEcg&NT8m#Dv1qY1;z+1V_yb{$dqnQDusP2btu zVD?3e3>6A`c*VEnondUV`Tleg*NK5Bk=6ntki}$=Vre{1pj6&4}T%#q2A zx3r%`PO%N2sgK_m_i$o{!?#}b&r7BRKzW29ez}p7aonPTf-kUxg*;~}f{J=Yz1@!b z2<^&`K&m34b3u7biIcN4N44h;dHZbZT_1>|!$T4v^q|IG`#FaP7K?uJ>&GB~wzt~< zzVr;ENHf2`bvmWsc*Jbz;FJEoTff0rz>}$07-X$i7~xZDptDd~O#jKO3zh$9y*!=W z-a7Ca8*e46f10%Bd$!3+eeZf@d7eK%bB)O#)Sl@W$hPuFevaIjn_$nGXkOua`JkR} zF+Twz!ok+%nAf|%wWaP*71bohl2KNPjBe)A9Z1Bz4c3Hr42pT^GzZyUCk3Hjt^trAorb>L)<%O6_&a z_8y4TmA(L{@J*1Ky+mC*D>_sBl9u>bXc60$M4+{m8b-X~Qys^uWa-@{>@(pg5g)Vx zDRqPm3V}Zd`*=clY@^MYx8NcpS~s!wfBpJ><>@ZSq@9e z=^t{-?+-k%#`DW0!q?Ih7F?vitU4Cwr5f$aijzM-Pl*#ghZ zqXkX5OzwD*N{6q@&3`p}wUid4o&ZWEI+f*zwx1+r#O+%DaV*{iT6xESLvJs}nm?fj zTHf`^H?j+k|JBfoYCQW5ao#Z%x(aGGisvWpJ3T#f)Tj@Dbq7m6*29(_iS5%PpGMMp zD>H)&yf!5J3_LtK2Ka{ZJ0EOE(a3W(sVzmkIm6xgLz68ICdO^O?dP>$0>2fhhLxuX zB2=nST)O^Oh>B1f{C6@1w5?nk>zEk|w&o2XlQl1(mz`BJUS+m|TWjy}$8@Ks72!9- z$mYky2ga_W%Cn5(L51I@e3+QHyLSKg{IQZ+Q6%NhN|K9375!t$Ybx`C>1^?KUxH^X zfEOTRDm@Q=0I?fFYaCq$cW-`;ziZQ)(>2?Y)X(*3edFY{_gFkw${90cJjg?))oIQ} zLVm5*o+W_|-um(LXR;FM>d7~RZXL8XQKPAkA9vsG3vxX7lM~Vp1V2x(R#QHLoAo)_ z?}Lb;vK}>?^V3*Lb1^>?#lc2fwUqVRe9F;1|irzL8`) z90Y4sxw-3t%$}5nJ91(p+NOdOA>>-Znbh`uCse_pQ&-2!&!@N^Dh}Ra$CLNXV1ep>m;OrL*6q%&ktF8udY=Q`D?n2{emoC$__i;G9tU+VELYF_64?= zFF)BiLMr`Nj36V&}U6yT}Wjd81WRlrF-yKSRLALr1LA8oh$e8Elgwf^(5Hm!t&n(LLLV!ztf;>AhD^ni<+l9Gbpq(nQey{d}f zLLW_2{T}9IJKA2PIqR5X?|fQe%-zBtf^)dmrB8<&ulM#l5l~OaknTY4Ve*_9I zdqPoBkzHP6IR3WmD*kp-j{Q51#mZ@Wm$C1fTw~wGrM3qG-fef+xYOM0@$DpMZGR9xZ&<-m2k9Vla|JJ3V7((Qim0Xa|MmBhk^g%T zHOI;D;Ljx3RUo|$lKn#7uMvdLE`!J6lL@+ff_R+1{{I#T^uOb2D@RRDOtPU2B&e5( zhqUX&v)}45z?UE!KjB#U@0S4s9dZ^C%SdQx;+-U-n!Z6zS`)Bg&_lS^n;r%4MO1)) zi|QB8oo`bNLm+n1)w23@wM|o^&%Byejb!pQucs`wU+^YJJpbI*%djv_|4l{JXA>Fg z9{H!?S1%5H`V@=m<%{Rrr zuZOLPa4OznZ&3Pmek5QrAwf=R$!Pf8PV%bS?85h_D!mD^%>g?_#cR|8!-}?p9~%Ni zsP&%R;qzN+F*RlwVvmia4Ug`;eGfBKFu$xz0TN){y~nI%(X`>FM^j0$G+~jl?@Dy{ z0$C$)HmNL0rPKGil0qZNXu@JR4u86vWUXJ?t2Khs@Bb-uDEDsyR3rzkIY;d5=0Nz7 z$pjxS(JswjlKcvq&eTb=sYN4?jlQ2#ci+@9b9pr-z>mfr)?OD#Ek{dLzXSEbx>lzq zfRw}SX@$%3=UOVkW4}eT^l7Z_QqS*O-+10w@@ebayMeuKVcbLl#4LILsOo&sbV4)y zGx%Vu2stinBb@XtTC7VDkeE6dIpPn`@*w*_vp8DqEyuF1l9hQ5B1{}lq4&&>UO=YIoa%Qi1QnwMMn(uhR{4lBZ5)ONl-cgNH4dm>kH z*(3z!KzLBbTLX{DZ(eWjA5I4>i$P?`$R}={qTsi=Ig9NqC^fsM;#`na&{wSPeSMs9 zs6QEt<#h=@3`SHs*1=+%b#zGE$9LhuYZ3SYh7+QHkAP_X$@r9|=CF;9TE`7A zCI$IyQHI{0CQh?-xNs$j{^fd55YBRNog4_wfWW+p3L3?J(m!Eg%<#$)d_}NET&ca@Oo#@J*e_rcf%BBN0K?1{ z{?=UN$73jDMuB-5d0jl>qw$4`3OAZ6wWi=p)K;QL?{SnVxzvm)F3q^aKM!99oNRFP zfevWAV`od?;v)q2t=INNx>B}4qCT;p!uErEIj{i>Y-d7n~U8F;?x$0C}JsGx$=ADl{0sK~2&MKJ&_uUAL6f)XtsEOic_Rb`X-dYzv=J^4DS= zTk|MH?-8fU&#id`X?=g65ZRGRQSP|9Fj>F0iXa6q3em_xbT%d}e*45-Pw`>*bGF#$ z=>ocuGRice`ZOW$ev5kcmk@QD+oF)tr7Tk9ed7#TCGXCwm-OErCS3f&#%H(*;9LP- z(}f3QQAir%M6~n}lOQ)R5Cv2yt$p)cMNY)L$VUUD{PHVJw+PjD zqV+TAf6Q~_L;o_*LBWm?Ndm#a`OCpnkT*2UfEz|t_dOK}tuV4l(PqR!H7fL`S&l<0 zE&9f-a|q9T=@SIe|2yz%?qLAn<*}+iKb0ZKn*0(%tCZrDc}oV#UV8I=e(wv!FStke zJ==7B`pr1w5%K(~aIJ5Xk3(+iIb(T)9M{CJ%YV#WZRnlU3kpJ0kpec21mW~rGu@Rx zeD$4QY0SERyob`)X8d#-4@EzF?CE><_`k2s_(T<-Bgp2rz<}dE5m^vV)YT&9%a6O0 zGhx9Ki9f-Na_XU<;+z!JFE$!nQ4;-Q&w5Ea`wZ=&g`%!*+~}^1Yy`+nH8I;S)P6JQ z^ZEJE-zj{{Jymc`r7*(vhto>nhm}H%K^;y@n-ZbVu9{6@WxLN!JF7nCwx9V z>8Z3KwQ{@WhvG=CIU{bT72Pf&5}@I(u)SA1|MBR^{brWi+NT>>hl=-}Y8Pw01C#1r zu%Hjuv%lAP7(f3pdQHc*1LuBSP3Q_u$S2^AM zae_FY78@3-0>JTZ#_-D4XC89AeINsXbSN!nMM|Deyy!l7^VhP67JXg0!?K4`Cb8Ck zUPYY+?9LGW78CThXRzh>*Se7xzq~dU$qsieGF>Y>AWA*5XOQ8JvCWSs!xO1)rw!98 z+8E}$YM2{pkD94kU23O zdWR3|nyeLAOtOvS5=c6X^-wbmvGEJO*{VfFnTlVcjpHOx$X(O)dV^_TUdkt`>qRGj znI11|3^2S6A(q+E=< z^gpO4@=CE{UjGs3cI$dE{nWFfn54Fy`=4jzW-QzR-Zkv=U}UaDz1ISOn#hdoku+VZ z-s#8*?aj@GCZ8vEEkqy=9J@ZV6M}TN;-{Dgbw4nv<3T+-wHL@sjaJFX+VER}w|QwN z=*mP}K>N9Sv+iD3+{QQ6iJc#vEV!f%A!DrG?<$gR(ozt?}+BTa0?>riyL$YS;W!mwAp} zS?LDj)B0~F&^aBmosQL?rzHnPpQ<;f;37(h3Ikxea-Kh-!~)%!3Jv98C4ln7!YT?k zLG|{^XNtTqEGq&?Chs@PauRcxELulSX`$u6(S}!%NRpWs5_E0BTFb*;oU#K|M96&F zAmpjoe;QO~%2so8N+jkxPr8}bjTSqrzQ392%#?{|zU#YGP;2V_TXUaGx!fQ5?lzXD(oCTCDQ(=LH$;h7rZ;HK70WGDYb4#h%V?D1VDeGtBjS&2m z>0>lMH`CxWcxTy!9yetsgb?2;=%qjZ=%b9-18qTaUD%0wYHE2beI&!LaBRCmt*?4xYo!hHOgOOHsfp8@4a1BMSYfvrQ zbNTS(V$+LSH31azA)j+GX&j`al~NP&4>(r=#${n@dP4V9u1=PMboTvo?Tfy%&_8ZH zf}FVXR)9Upef3ImM*GyX8O3*D=Y&2G?!7!FD^E;3Gwv0sN2#1PO_Crp6OYJM(yyE(S4lMX=>OaPTt+)9fNj>tbQHmg zzWKEZCFufdZD`Y)1`>0hYv7?oyKIO@Iv@OogdXtyk zE<$Z>wk0$i_2);_6aj9 zvm|~qDSGSCgO{IRkubFyZ=r@mFjgpT`uMBQyMZ>w=BiK zy<2BouKuA>&IwaG54+GX&puh$Uj_Pk&%vMpAGI>$s+*b#OvX5 zPA^FBD5YN7&VK~yutr1P3UQUnoSnaPKV2+4j9MWH==o8m$r@n!!XmG~H}8sl#oIj_ z)dg2M{558E{QsisJ%FOhqJQ1f-Q;8wCFh)x9KPFLshx|!h7^lxV-7!3vN#a_Upcg!rX+>F1P?U^#{DwtFPDYfI8gmLD#v4KYem0W=^rgJJo!Y zo_%K_O=o<%PDZ1;6$9Ci6rq{gH7HbG4)W6}(xZw5)H5);L%iXyMrDNloHwxYC7JJc zs}saF0(R^EoXOFlet zctLOveR%T?gOt&Au{(j(0ZrP0yyC2S5k3V{KD;vEBEqzB;#UrZ0S!(U<08Nux1U)nH@Xt!lBxnyCzu-b8@ zotZlvC{xGR6B;+XYu9?jGW)OB(ci$h%)1H@L!;gA?#l#y5-vN0Q%7D37d>tvrmm*H z_4o76!m#i{NRM5z+8aI~V!7~JUW6%Jn{s~4-xK42R1y1Td770{G0YVoNXnre8^I=# zQcA{34CBe7JX9`u>GcP{2&mrvt%A|I%L=l!Z!gA3?5pQryzd)7}OdxP&P|LXpS zmCGzp$Oo?MR*~HO7ohL$lr0GCG9}3zgd$JP^JaFyS{glLeY5%DL!wVx@Vx_K^Yk8% zqfly-gV0`()tSEo)$2DM99BM*%xg)Buu%`OE-w|&&WWWq3I+Bcs(9xGOpx`v_DI#U z3)YyBS6~7}v&x`w!N6Hu^Tn)|%`jYFCuI6L4mq0W_H)^rU|f)}>=poBc78AW|3`>B z&T%@(rO&#n8W?2$bm_EokSfS5V6aiNZTzb6i3|d!9D(Z5bjm@Dr*2cylcLcNvxh&} zc?Qwr!@tI^>66pI^;nH{j){~p3Z%pSg$v8N9Hs{pxy0eODSt`aw zSrFvq##UYRL_c$3zxzG#b%ZtY_MbU&hvo{h(wZ_D5PYSw`Ah!`SyvP$36jpvj_uc@ zXcEL1t(#GP^iapnJ)NkIJ5J9sOr#0=wRLmW8k1)GqI{XuQnzm2_i^o{Q7gu|C99+) z{hH#LJ?0Rg#D@mrh+`DDGjB5|ojik=-MnyDyVo%z8Wq$oXXND=H&vk+rXwtoKlJh% zNIQc0MIB9oJVjHd_UQSu%kzcWr7Ev^{m#&X_+Th$0(Wl0Qe+4bg)hpuvTE&1LySt~ z#5|6(3S>JS9Q>$@5(i9m}+6GqWs#CEZRpzsiYwN z!Cn3z{!MtAs@wJE_5+C`fU5b=aX0vpBk*B>{Y{&qn~v>3NdegDm8+ALz5w@VM{o|2 zmr>0W%}|{YvYr&=Y-xx~7avU*tTLvQJp#%#KSq+l1mbkr%vA+c?%Bm3f^rixeP}lj zJvul-$eqbO4l}-mqjPd`A;2O|Vp+#psiH*NHQo%*d+cVyb3c8D-M@W{?WTjKwiKxWnXxhsLhY} z0GItO11DC3HZwsw5bhlR2jI{m#*cslEIB!Dw6He$pm;#(f^kfP%^r|tY`u-Oqx94_ zGLr*X!)c@=Kr=Qp0nq-DJ{V~0NMCCa{nXIX1@f#`C5d$VmwbH3;#O#nUS$Xgu1 z^n|a8n6&fcM+6n^2AqtwosGo2)_an)lm48H+9BQJ(YKT`x+aLK!l-S9~~SGuqEw{0Eoz9?fq)S!w-Z z1(5#Qf-Cy$GY|+}x7&Rem*kJ$dwCdn9vAo~ab=!{cE8;YK%x^!zdq%;-W0D=_ojll z0`T0GSq42g+9->!@Bunezg8O?2Y2%>Nvkpy`Ztsfh7^QKqL2FSSpSLhl%#uO(_=r( zg)Zs(>PS|)0&KcRk5c@IZ?dxMK z3ICxva{xxznNyf=(gTc2o|qFJNdHvsE7lrSFZ+-Epft2_4GKNgBrBC|F*V@FF=$bw zt_i-nP)=4{Q&it?v-5{44z8A2fIX zMj*;5Xg(wXfwUP%JErPv3EQaR&%9Z8$jVjK8uIQT>G3_>E1_L=*-58yGz(1_(&ITiT*32J6FnyehD(GpZ2 zu5@j@r~^)WoUF|P_hc%_>0kLAUb3y_4K8i0tYlzgFPPKNuq`1-d5 z+nn~IifUf6`GjdnVx!beRtZ3LfbExFUYzFv#0vm2^~07;jg9R=bP1p%up}K&BLZ

=$~n=l_Us5|gCsIkdAd*BbmO`Ez%^l2R}J)$o}dhB@vE>Pl5AhYDlAGH35 zSi479ff;yT3&$6(%E&YQiT@@vaox|1Lodb?$#(nX>rtVBP8pewUnqPmLV8(lLiWdD zAdi1PxEk?4e7)^l4p}hXiEST#-TdEjm-xPsy}*IJ-2AyHX78x{f0lJ;Dk^mVyZC3- zHt*+3%R%gb84krR1ja@Z#DCE}0}*{-2n!X$h7S5iNt2`dZ&tHE;fed5l_{H(H%-I! zlx+=hTEvRO+d+p|;pL(L?Il`3^Kg2XC6}-g8Pm-rM(yR^ZH3HPNx^7wrVeiqTaD7& zR>NEDVm$XP0r=582sp$HDsv5VU=WZ5mo*WA(8DU@bW_}rkSzMfZ^0?P(}m?4-La{4 zU(Axozd@{CX8Zf6!{ALYurv&E?)beoJLa(vJfP0mYv_=;kf2%7o__V11_EsGnebpP zO8Ia#)@bFFsq3aH(4QS)z_01m`o_f(IWv1#>*FoRkbLa;IVSyDL=8 z(fx2Oa!RyE3}?0DTNqWqg?rF9Opp_?kal+*9U_celX^sK`?}$MKeW3^8Nh)srqj|a zQoo@@qf07+e>hwJq9VMLU2fterQP&o)#EX~jL)h}U|?YBYmu-00CVS|=oR&?=RkO2 zadG{LnQgQ><>l5VcZmVlcHHndmHg^Vu@=Vy8snk;N-(F`!F{(BL0f|qU7J7{%X#II z->TOm`mVB>oK1`oOlIcpKe`XboN7Y)-DUJe`o0&H4@{E_fK`aL>d>;15p(I2KT!Rq zYza5}^nfE4qm65Sb=0OTHc62Bmy_D)$Ew7-rC5zHq2r?vg(C?`7!(-y>;D|Bm3)`w=|Skb zbr;UvMkfK*sA22>f<*XsWTkWerL0|i@~5ka51|nX?0ojxF;3&AmDzbVxwpZv7@L~HD&-M{ znE!2Ji3i;eFt`N%*yO`)Vx}5buuK=_{CutBhrr)jt6kZriYMrklaph>>m%uk zSRaT3YNWEC5q-o?yF)3!nrhk2aL_@PU=(7lj)VaVTiRR`J8%dXOncvBZ5W51_ zNwytYQ{}_(XLe*1O)}d~R81*sSYh#dyu@$5Kv*nx?5M?WnWWqTM?cf&wLX@pPDkVs zA(dz5nEHrlkGca}A4w$aLY6Uvs5ldh&BkV<`bRYL)4=`2$8bvZ3mMK|ZyBy^yzOdKC3H$DC2puGkidum4q+Ho2GfO)C`$;e9=H zfa~klqUV!0G=zH|UZ6*LC@e!LbT3&lirLnTOFwMIO>o2-1c>8pL$3Tm(BE+OyK5^% zxTOpBmbcav!G(e4lV(q+&f zx#JMy+5s``!ArX1xHLVZd07DpCQKG#Ae8=`;Cr$QSZvbVx7|mGH7o1BR^v7{p=xo3 z;0Bz6F)z@2Q4F86&MZ=nS*fRJsf}idP+;;@is!aD$Loi0m^O>|PC=#bDAH+?_P9z? z=aOYjq!O&SKqe7QR;t!qHJIdR`AS3|Teh5ET>VIrDwxe5Kxg zg|y`M1TdQtkvqFPXzH}2_a62>b(J3yx zqr1A63HlaCKXAZXA6GLUrlTnUqkYTx7Mq$%AY)Pn04OYj8LX`FOsSmr)2b=Ja3A+$ zL@lo|gOr&_PSEhL8%n?irZ>A%r_ncME)ih)(NWF2!%-_F1&OB@XrMOvjB8Z0?7*3- zxl&-=5(6pvQ8#2f<`0UA^#JJBJaZx?Mu(-GmF1t{w6<8f{&|+aCklN;Zl$v_42>x6eu8e5az-oxYQ5h_HBI*0G<6bil+8}f{=D5J zoBtU4dYIaCq~s5&5Tdx))npgbvAxJTodxl&q285LR~5T2Nu z$1Z%G;828C2jcgGT#}c{*r2S45%AC%HftP$-E+^yMV>OdA(tpv_Bb5D$o{kLzHptS zQ{!;l0v!06Kf+^hw{|HwehRkWAvqVA5jcg&{xFX5d4XkftKYtj&m6J_n=HA-V&g}D z$QOq;@rLV;U*EBimfa{pgfyCj+yPAh!ZGkL0LE1*sA_|`8SFseG2j`1xka7hlK@w7 zcS0+`WmgrWu7JM$i**ly(Iz8!Meh04%AisH)3nq|AooeHawNUu%V`CTzyl!4JDm8U zgQZ5sbsr8NUx$A)K*Gs7gI)7?VCwVZrT=GBV@PpnkHtS`bT+(z7os%AfkRw;tkAp< zP0OlmzFp+Gi*<1cFck~Z0PDuX-J}iObX5R@6T{IN&W#e^Ljyk?JsT%~F1KyDShG(T^@v%t}dyim6aH%Kb8KLFVd6wXDJzX;5<`82`r_dA-kQ7T5XHd zMHP!(sW!*d0OF$w<+$?LK_j427I_h(kjv6B#J|wz#}ChBsE%6}NU1OixVz%$ny8D= zq;R@GkHVYGBA=-hc>CK$qIS9j1h(5X<-C2?hf415PBFD0962GZ)Xfp zuSMbtilyZadYwb_?HCP@S$N^L{ywzJkf~{7-P(QRnG_nJ!Bhj7-IsbgpO|1Pr zzChfR!|)c2G->SjUH!Xu>-xf$xa+&;SBFIpvW>TjE=#P!%*;+d>9$MAcRWlat~H>N zBqL`+p7Ky4_~rZ_hULsAU+Fiy}I=+;+{#+vj1|umC5I6*@)5xpZ?R}6T{PmlaD<;fgdO{i|sl2W$*2Q3$tP^ z$Nkmt6h`H9J+>@g5$)&qH1w`iglej<5MFlR4G71~YxohhySqCEWEQi7ZMcd^;yFwp zhKwtGlz(k%Fm&f9ndbCPTg|0!mbL^TM*e#rWlc$>oZ`iiO89}*=Yckti6bx&t@(Q= zwAj6@^f|T8k|H{PSyyOIrom*)#<)G0W_d2`y^DL-Z`*7;nLD#Rs-ETa{Ad_v!xzII z`Os}~NWG%UlTL%c>i+$hbo$TZuNDALT8fybQ&%(25;k_ymyOuf+l1OW|9RG<+X+zH zBsrc0<{msT07616BqVfp+8ouS%@boBKF*IO9lJtou&sT1E&7mr(^lmjPKKDt`TZ*> zRThoKQ$P294+nhuI-{BmFwQ*;3Uaf+B`WE)wA(pauF`45BahP<{PAbWGeIBeaupT& z)!_xNFu)lpCKlH3;Lc>ux#MO+r-zH9M7@8YQrS*9C2_70TD}PDFf}8lba50@1s&vO zm9dJ6>m~5Vd@Ol{d{x39^<{{*nJR;zB0v!MThBPDShQq3q0B0LQ)!#Y4>4^m27NI6WHcwKV&lLyO!$(J^3tPS38GhLwHgy8feMz4n#w@?*O z;jO64#Hg?N`ScficcKQsq_=2oIh!9}Y4CI5gD1J2HJ>sJ@kIlQZRb{qeodZ)o8o88 z3YCS63^Paa<$DiJ%?0b2fKe1E z*?D?G_g2-?NBFphp#x`88JR>NKidTE2Lx;24UI;;?FY=!C`hs7&L6F>fu;C}Xi>dK zhZZTju(8?`qMhz}j4hhSoWPv%X6`+SIP}%uS62*|R6a%^@p^fbaLayYs>m`&#M0R8 z;LjGd*HH`+gN_>?90n0jU<)fMY^cd`c6?Fk7G(lc+OqgANWxY}Ei4o&#uubv%Wj~s zvSE5SR^(;zrbT*8?#^~bNkXcZ5pQK4xVI_GaVeNkE^PMP>L1g7Zp>M2sIj`n=t6bB z<*F>+s$-_wGvO^&&58aHP|6vUY#a4{^ce+s?n;;Qay9c!eerCe{kxx@4uZfn(HY{(!x_hEe_q zqq65jGFC7G&pJmP>ve{l>D0udK?tsM-~IN zD4BU*gwurMkw?-mk4X!ImMmldt!C!K2Vw|2c{?k#{S#T&nq4M*A z49#UzqBB&qA!9-b$tDkM;=z1>&+MO7o~3h-F{ zp?m$OrU3T|mPUHTl51wR54e=eGT7RoWI{i65HaCDWR@EKK;5C?vS5xMP@X@~M| zawMo+pILW#2u|xaKpjhMeQN$ts`?w)Px`NrD-ui;Ame1wFYUMS=1~KjND6fI8k!fX zkqRM=D3+U@m8vJ|>b!$QR|wdEz}Z0(H!Nhuqh>wq^Iv8_p(kiwP7XR)Vxv#pc>cj> z@a%ZgZ$0k%e&=+#vTosyVcncv=yps9bg0qPA7s8(5Aw6vpi~w;_XEV z05uWd7qHa?2n~iZciYAtV+e(8HD#W3d$_pJ-MVT1<_(e*r}AJ6Gf@Z6vDU^tc;uK# zgz{H04*c4PeVw$n-WVlJeG(Qb(HrnILmAUauY&394iM6&E8gLPneRLS*keoG1MS)c z-P?|lYx=xI3A)9(nRiJTk@xI2iPbSDeIBd%hF_9{Swd`gWi3j!`aG&~2vIT07%=5% zG4lnAyf_|x_bTcZ7N-VbUc5XNIty3CVn{=NjPqd4VK!10-nD%2%pqeMY2ErIlP?Q| z%l>q+`8h3;o#=7WV`Phz*zkLALv5N0CdsJvycnj|}LAu5`oWrxIqn)X+hso4qg4nIz^>Hv5yOg(uDxU^jdH)7V+89(Xj?-c$v&$ zf^rL6^R3FMlL@y0*LVx6e<$uGT2$5*J9AA_$AbjM^UNVok4a#q#dEd2vyGx9>E7xW zIQ_^tY+bjpZL&Bh@1{V9elY@It0vbVqTd4FamR+Lc#I;;J`%b9A;qbqkO8e_K4VB) znqCBI_(k+0N#C13G~3qM0Yq29NCl@UdK z6K^XvcQLlWtN|BY7qWL#^ih7mRv{}W0IEKub;9>5^)KuZ*X37aj<;AE>!GP z3r-`wh`g@ng-B7#r1y;4%5;YarNDEQ7T<0^C_2QY_tWN@qZsoc;>X7mYbChoH4S#* zvhDyWiU#ynqtJ_C5|-p~eo=#5E8h4f@s3=!pKLTlY)c~HmP_-x;x}*vO@z$M4sP&` zm>MC_{L!hL!cez7;)wjkUF_Cn7846(hd>REVsy?Bu@! z!|&ty_v)`pmLuLZ1qkGQdyO10U}nT0YP>BIqV-O|Q&&#puJLvMonnNYv3s-LeC_AV;4O(@9ovB~r@7251da+&E5 z@0_|4!;){}xe#H7cBbFq#e)MR)idV_E6xs%q`G{1n?E`4JyY+`mw)^d*BHH;xMWz9 zx&?*05TU3y*EZnb>8Sk`e1Qc zk_6T{CfqeJtd_2pOtTIck0XFOespm%eb5 z24(HbM~?PqLUEm-BVbZ?c{ruEV8p{_G!zE8r7Rb-2}D`;Aa8F z0)euvfKJN!>A?YuDlQ8fB)CPUCH z{gkAV-+nWbA00$tG$)ryP#zJ{vZr4q&)B~WiMulvwlY$Fe8vBQiCVa~aTMHV)D9~* z5Xu<;kx3Y#(^qFgz%_hapd4qoCSpf)l`u_fhg&0b|J5>m1(Y?Ny})4rZIQdu0m)dr-# z=JEqeIY1U`MJ+mga@4xVZj4jTAb*Xh*=1^EZS7lw~{G<>#;g-!zJG6{Xc)6;4vn#+>q2&qRo&jlQBJBT4LbCY0Prp@|H4hs7D^|DOI*>zxZ{d z?(BEe)qRU)fCCBt-TPV6o2C29ys3lWa(0jZ`*eeq#-}!J?Y_Rw9=WfFwlXG>qE;V# zw$@r)Y^{90vG;x+a4E4a&o)$Wf{tcqnZfE>>-%2R&G8!%3M%FIVD{B`QP@wG6_35{ z0AhKt+&l{MKGZj-K-U*Y4CtEIA27QW`o+h8d`ek$f=-=)Wq+<$+r!BUpN0!pomAZ? zCqRnSiw*#*ydpDvX&i=w17keg6VvIq5qT8DVh`*)7R_NmF%uXS@NIV&1L)W-5r2cR zIn>rs=0USpe-_D?Nl8i9u^mhBL>t)HqyoGN)v{ew|NhR$h`#HPsFjjcS_pypQ|+B# z^Y-WB`~kegBJDSwy+jaW-x0i$(ZTNmJziyN@D+Tk%0 z;tlTpI^cjF6zAgD_t$9Ptlf+HYvpnIefw>}yzPs?y}6FxO&0BVl-xRFf2=`ltK|o2 zKI8DZ@l&7tIRjrqpE8on5x!c{Z51|F!H(NwW@Pr@cjFk!ULc-<#HbGr5bOg5H6}F! z)F>pTOoWVHZjct~UswXDjg8Cw;H=Pd>o-=T3lvPH0L2PMyyUQx$&3mi$i+dTAk${s zQ~+%*1PQvRtG}PIZk9FdI{R~Pp88ge2<_|ZOo|X@Z?oR{mYzrPr&4(4h%!c{O$GA< z{DPQGsz=ssgs4}OFCTjHc8cQ>T&Y_r%8@}``zd1iQDl+}+44BBS|fqH%d*7mWzT9p zRx}>$?4;z%ngR_X2qAC0WYQ*hp;sqG-^W6qfm-VAb3ENN2Q^k7a5@BwCc5p-7I??x zBFy=BlGBGPl}Y;t>XN+Z#H?}&O_P_2lZ{?oSL3z>WgB@pIcJ;Ym6iH~lRx2#-XD9Y z6Rxqu1Fh3zF6|bFLA(oKlo@tKCb^00jKaL{)`O1s2y$4$Xt;K6!IH|FZJ(` z*7hSu;`^xH3o3KLKk*A&hBm@ouWrhjz=2%UHQ)*=szZ$m7pW_o|1(dRrRF7stq8)JPT_a;o zp%{($sPWoJv-6!g4N#soC`9Dh=(k=d0|b90F38FH@-nJ%sz~xuCVo;N!1&6ffWd0x z-$AKzPJ2_=p|5xMMp=SiJlu&cczFXxe8+3yn8#2(oUu^xDoQ?ln;M;eM`+X!>sJl_ z{wWoZKm{T%un)Z5<&WI1{rU#=)faa^NMX-ySV(qBRnb797_N_aMSDn)s>5- z7cb*f63EtpE@|NF`*tA0jJ~{##7sa3=NYg&P#5Ocurlj8lN&w+k7eBIp3z@f| z0@MuH&nNHF>h)QgDalaZ;0}Iwh+ZU8t#}AA{?hdMvZD0|YJ*eKm7BcoQTP9My1WTy z+;!=4lE(`@8e_u?#d5w^zsS2`2&r?;*54yAUujo*+dv84M8rV8hSw~uSYKaVjhAa1 z$~UF>*BiSpyAP8A2JD}wr)5n|q^YS7wZQ?qWUb)yh3i}pNV~dwdk+=g4D$t1Gp*&f zg|gy@D|$8JPG@pf2ie9$A24H-9)g7hO$Opn*Kl~fzC^r+M6Zm=1|;WABXgGqheM16 zXRtP~=92X-y;^%YdH+)}C-s%TDIx#hDe_KFrrY;77V7z0{1B8)i>YcP5i7ZqW5ffhf7uA$R|KkhQA!-LTiHe}pwEykL;{aSH`+#P zjorQ^nYcgy0p@&g91}Bec8h7aPXgb3^tt3fXru3N2>#5$=?0**W1hMd%Wk{`cODm^ zO8-%a0v5B4eTn@)W#yyaudbNDGD`1v2pDXwu5anF^Z8&NSmgQL5Am-qPn&zb^HKU# zHCd|Si&{~-vv%t{i!!RIfl}WP3@26rQ!0|(O7V_|COU*PA3irX_mGr9${s8P9N&oX zVz4QSZ_^g;ZaVio1E*jq@@O^S>&~vP*#w{KHPA4nVL{3D^;$#~;OBGz$)XT|l{y6; zx1Zgl{e#tbwQoxd=JaBX^bHyoblbZ=CZ31?@IQ6lrfCa;J#gC2{&`*EF|fRl@!Toa zc~J7!br3rYcyK}&G;*UzBzY9ElVY@~Wt6k*a@y$~7z5pfQA?a7=y4Y+ZxCgOVznRrl@3G=J1Mpgu{sy^T_aJM) z1)CiAlu>)p{2;|v3VbB;2P7X+ma@5KPM&CBgaW)1Mr@k962XxBdq~*@*o`)4_*h+2>eQ|9*_Cz zvOep`(Fd|$IKZu@;1!Q}g?kYZ{R?qynIKfjB}pbMATS7oOQi2(tXB!+=v!$^I@_`c>u=Dp zr*6ss!8!>JdmDEu?;e6+$f}pb8QI*Zn_>`v#wrK~in-H20I2dznF{#7vK5K-*ZC1E zr!u0R_5o){7pMthf3k3}!^bwwkAb*t1Kjyj{16?0R>a?N9&@{#^v(WxV6 zjx5^6e04weq`Qq;(VS@uWD%(G>yn!!R)^4qDLzF`ntHRCB!55_8$(S zU<6RR>su|NP0Ddmx0Ib|6leZo1Ow5;y+t^y66889W_*JXC-M8uEX0^HM!hpy7QCOu zKZ(@L-YiR@pRGIil@OT39{7l~>OdzCQLD|62UOEY0RN`|T~XMJ52@I*6WCjgR%$*C zQwPnO2W?9w()Ws)Kj^%u`AZ`q-{r}CK1LBgWW>7n8D$Rf#-)lA|B^$7S+oo#*tOh4`O1Z9j% z`@{aIH+1;d??YQesB<-LLl)FiS#)CyhmpAZb32X|%naScwMiI>np0bH?i_jQv7w}& zN~;_i$O+C?mS5tb@?Oy=5Bmb);^Xz3Y{*#8R|`me&EkgSsdE7 zDzPPtMl1M@3+yh}I8U`K*omgAv7XD=p&x)x+Jd~RI_kmNYL65XTb`{BAY)}sTslgk zoC~Dl0Q;5)OF%WE5xqC1q}FE9YA(}tXnLk%V1Rasq;$U5<f#?T|9^74Wnt-R~noFvB1A7`Kup`Un3nAFn$Axvh8IPbzlyL9lOf|kIMRj z(VgMu$WsA8CUUkYG2dwQ{koRDnfZK{YpiMix0dXJ84qRjI)8 z^C-Mf1f$@lbIm-_bb8kFae@1b!N*m)ne^VWd3YNq=WQ=v0<&h1Ql!{=@XFdXH5XZs z#r(NSr2dxgDGr>I0HedUhW4vi+fCU@r+RxYf#XR!ks{SL{@J)$;XyKY) zSUU-}j}G2^3cziM)kdwKoFCa;o!Zf{)ZB+hva!VlJYWtNC762hQnS)fTGyu)k0q5z zx0+2FM=&b9Xs)G`Jp0G_9B~7TjMZww)JbR1j6?On*ZjxL>60_8LqMRp?}kg7t0Kcn zew=>-HIwK_l@SFz#~*T$lhc8I?bH$FO_^WT3SY-99eIE$;(qquTQBKc_hkF+AV_A^ zg{10GGUN!`)O*^wa?id^CMA9SSQFxJtbGD}=?p|ezd4-la%~=D$2X-`FHGgywjhNH zR?G0ch5D^9qW)snWW>%RCvt?qe2NfOa0ix-b?_Q3litF~)0kMelV0`-mi_9vHNL(c zS?M$eDO%Ke@p_=sQXqO0J`;W(g-*L`508dk0&NC)#3XhxwEzyf>&9 z^5?_T#rc2^`U6<)eM)!raQejKx23Q(tTWd4=dOYGN(UjOCl6!~9Pv;10_{`5p9x9VKnq*~$Jj|gurH5&{#*)Bvo-!0QWEJogS>DEuz>!2 zSI(DdWg>Hn0hbP^1O3G&|+CFM*=7jG*1u0HdW_t!}keq)tZM-6_sv6VIso&da+ zejC~sv1}(NOTen$tbsurt49%w_!H>;sgDjYDH*XzSzKb8FWw@qD&rE!DmMEi;gOPI zo0Q=YlK3Ykw4)7ZqwfWTDhZ45T$@jkohUcK`{1{^dxEZFMt@?T0^6CVFD>2g-MjNA z($^OWTG!e6do&z{R<@nO1-OFCu{THze_||c zgf0q39TR{3)JQ9(0Xf;7_roLw;G*Qd$V;;F>BhBs;qzZR3wu|CVv0(Tveqa#;HJKL z^QQ3Ya7vfUqYn3!+pLV*p*m7;TxgCO_O@?TnZOb~LD#Z9_cD;Eri|fN4x9 zvD9M62b+!yHf%Tv0GTXL&z=L96&QU@%?#-MC^0&)#y>v zwj+1bB|8|y&*oA&Sk z0gi{-;#%4wz@P94V6=D-jq$)#1kg7y^x%sd32#BJ!BE10A9>Av7E}($n4fZhr>rwE z>>BMmxT_4fIkY=L5pfYlHHx8bhx))>g(QkQ0)%06ej~U3Lp+zC5-gAs_TZ*zk(V*SJ4*{f^CpzU zBaQpgUn|tbiO(0J2EzT6M_!xB#`w>0SiFJ`#Hd!Rnpcb ze);1`^KPs6EJv?H`y9W0okP2hLtUv!GUM{&o%2{YWk4*N@N~%Sz;n88v%&z>Dxo2( zN!sY9=VaicsO-QffAHqYHpLLCb_bwgTV$oH%phy#@*Twrui-gw?GA*JRtL6Wze(be z$;WLro2q}}2NH*3vpL%3&^^YmC}1VTo|CtyiUds9@4j!tmHre`!8~zYsL;xltW+7i zVFq0#n=HR{<$$+Nj^EvFetTtRQz;7-d@<_7L);VMn1IlW1DfnDQSQ#d=GM?-gt@nI5?pkISXqzM#u1jZ?830lT!3qXvxePQ zW0$7G!^4*Mu~(wRG=duM!%`C|Mc|pa2;ODgEbw6VnGp9%WqCb4>!X4ThgUx5mrLa1 zyK1f{Dts%mqYBzan>dupOaMQwHv!#0Bv#75oy|zmI{57@j!I1hq6ic0YS$ zDkOMKEX&>Hu9plrYPP$Vi`qMCrGrkHvuO-JnofOElzZW|s^xP7-xxw!v_D_2tcz+Y zf&ij+3GVobdqWOQ%?Twx-uK7Hdq~c9t;P0y^C`l82_$5A@O{By>TJU9^6`I+9Z=F~ z9Q~n|T$scZE{LbdDq&+PM~E}ad*&PZ*V1#b90SW9n7AZivyYQaj_sZeV6^UohVqE) z1-ylPRF4|1~XcL-;fn<5TaN3!1 z*u`;rR0@}N&KjrysIVe2uPzT>ZGZ#p5NI(q|Mw|;JvSoSm@q?0Op&()(-!bEmW^>9 z-^9^5j~b4qf-kY*XT+gTcX{#%Ib3Ne_cMqj+u}T`0EC|%1g>6dkj&Cv^U8OQs3S5j zLzwdsVT>QxPtF2SvR}Cg6ny^H21c^`1)2iMOP25>SUwmh1OBuMP!0J0@~<$qFLM(l zZYq5}@uY>s7T$DQw=IEkyl*3mQ?-6mK0EUMd16GWwb}bb*@0CJAItkM7BsAc1aZ8L zDc%3O9O~VZ78tD^hn33me?gpK z)WBC)SNH5i)L-fT905X#fYZ6m-Rkkf)Zu68crk6U`T6V_It~YCvE)HU4g>*gonC|q zS=#h6ePasmL5B@}O%@>b z;dN4D6Wz$o;1zx+Bh%Rry=Sx+Pe2Fx{pSqp1Dtlv7yaPxU0>TKewx2@&zygz z=08uBW}F57!Gv7H;@77**8;e*`yj~C85+P)y`?uo$wXt~@+v-lT&sAhk{;X2`D>nm zq~_{{{(R%p&91Y?brLd;29)VOMULk6ep$qUNh~4|tSNQ=8 z;=!J`LIv$Q#{40Zu0Zspr;W!zVt9?-Qjal?VW6l|RVQ@{Cq&u|e+CnzVWr8Uze9Qc z+T{iMX(XMRLYCu;Zk2GNKpSF`z7fmLMC=-L1LQH|a(p!^qZGBFT?1S$TaGo52qZtcK%Vdzl(TmnmPcMQVtiUlN+>Q~6T}Y%CRkDu zqipoP0i*qTpqw8_h-`p8BUTFxIzzso)3@ImKKqzfPj|V+B8b3Tsqzu$3L|2)WpRm}U?0~VFHbvn9QLzr7eTHtakrqg{e#}3rvu6^9JB)$#tNN zdY3_p))aSj)9f1*oP^6N+^cqspKo2B40TvGg@CVojBPNtT9305R%+mc%a91Gy;3}d zi?;WUjXDxWK#Rt(311;Av1518i*%D#^sY|u(%eN5_q&4f6}L^p z_mzER%%Wq+3paCtj8CsO1fb*d@LFVYKP{NQKROSmV*wvfEFAQPMnU5w_qYetw>Lpe zVySQ1+CU&49r2prVPzgWX>YwaPZ+OkP~Ec0yuD?YX&?=Vy8QbB(J&awn5a;TQl_g*N4uJX&M&?B zuB1_M@tyqT2A#@r4~fI9di0Yf8?GKygo=Zz(=l_NAda;O>O2a(M9~vlTIZd?hn67< z#pKVdqoQspFyC2`?CtIK1F!zgXnf|emD5ddW8Aj0EBP4&zL!m;aK%xNx1p0?)!S0y zGVqe%h3<84 z1Lu47UyBlWsNc1_r3dzdN*6fNfj(VI_Q83$qBZEnVe9w4K#%Sc5ecSH9zA+gDI)IF z>U-=u!wKDP3;XSJF?j0&0omKzV^>iM+t59(i_xeHd~8AG^ToDwk9S+%xT&#&F_2c- zsF7A%uwY&*9krS-btY}F+Ul3RB+83(ynD*e-Ozwaze)LLEmMrtS)YEn`Wb18NNO+0 zT^TCBoU_0LH>lB{=FsA~!duGGIQCM)FV7r7(@FvC$q7JF6dZ52C!c2BxDufvTF>`- z_8OQ$TYWzED14QYUU&qGfqEs@=D00StuPQhuDuLnyj6JCXMk`3LPtMve1b#OcS_QP z_XkR--z)2SaJV0bMvA7kESTGnRNljTyR@wV(U9tNcz85Uh7wo?P{Ccpxba1=T3UR1 z*pbCMRYxs`xl=_|12SS?8zuTkhTI0Yf5kXOHS@E>fG6TV|1@C5VKrJ{fH*gM`Gx!vXaQdz&mvh;0(ASgY5axF`d&Z#TykR);CYTS-o*+SJAHjuvcs57eDKo(Ny~Z4SQrb)9JXm#JpZSk zQ}p8{PjQIypT8I9Cz8{+A~<Va4^l~2jrqafy)T`Dp(3_AgTjzkKRgC*>9(E?C6&(9# z%9xFlp+A4giE-==G7hwMwfporIyIc8SVv(lT0GIteo)m0MS_Wmnk#7ojvf*=N$$v| zTrT5q^-?PgMx#Ym3i6m(l`1G}VpD_QCoRri=mz0CEHL*3FPW*XR{1->y+Qb1zi?Oz zE7YE-?GGgrSw-9|XDX`yQ2)gevh1_<1@1|Gg3KvlnUU1D<0ljxnbkp+Mjz0MMxdy&*4_B3zAyF_a z0p9U^-A}k)?Wal>qLBGbuaTcPh(?sNteg z60v#j^p}=081RuZ&)t-7DF{CR_5kf2NquWL;RE}Z#%%ThuU=EG)S6@>XbEmtiJRSq z&oJ`R1-`}h(Md|C@k^$2v!Mnai;of>_3?7BJRuz~zWEI(&04;??R8+8)6z*5kL3_m z7>Su_&irM@q9VEAW1`P+VZCQZgbQV0lnuw!RwjIxh|rphwS-^2+YSm4^n z`+TiiP9>f&4v2rs;B;K;3yH@zRXNf$NN&0JIu192@7|GEH+1pJI!*oYuT?#`Xh}%B z4Ek7^bnBkxqzxlMW%2tr)#%!{Fh&zLs%x#%!Q7WJ!o@5aR6K?R=Fy0;5zJyiI0>V^ zGMRm~((;};Kt-yj(#JJ4zm#*5xrSscy}Z1v6p?i%TKv(Px3Aw67y+)l#E+x;AR0=R zEJKK!z_gtu^8ae>yW^?+|NgII-LxHdYp5eYrNmD>-B!Uo4~S?+4{$qj=Uviq&_EAHby{PM92hL2 zW?W=rc`jg#q%4%=`P89N%=etjI1QI8!hzcqB=lqrtGj8QZ%OE)f_(iL81NS;EL0Bn z)?~f6vBVNBw27=+UkI}O<$eu@o*XpxJMnlYN93xd7;g5rThS1)yaX@=! zaU9Uj+?aL64mi5ga+q<()s&uM&29~+cpxpIQ~Mm_5HW)NLSQ|FK{!9PJtn^A)4w#?w`wrSKm zT1sjG#4YIOlOm$EWrex;RgheO2rBD5hR|@yM{n-*(NxBgrAyQ#9Vs+QWD{d)wEb0JaKMuWEO$!SykbZEg-S@19?y%Qj8FI`n!}e(XXKmqtsbzruI|VU`4Pxmy z*^b=FG<=P`^86u4-#Jc|S$2&MZ(Z1S^|clw4WzvR$|LYr9C|{8J9BWf)-9iHh4ylPV(C4bR z+PkRVA^oJOvq*x@uP4g5>XQXN!bQ`OhlQ(z@6&$&(frY0Z+_0zsHKwcIK5_m!gu)Dx zawv31Q0XOC&|9gqTrbGRW<@DcaU=kqyEKcu9lk7Oc$(x=Yx;tpA8PMQ?H*M@K>_is z;AO-zSm|+6jCtSJf^BW?>LwEQ=F~a!0)VxbIl0K;zhhw@a^%x#FuJ>9%Bco^XiXU- zrlKb$ACAaND{Vy2g}zwVmja>LB`2cg6H&6n`TOm-+uo0}dXAnh^Y0SvHaQuu2VBx$ z42V!a=8ad7!oKa?F*4o&ye=uEb;kC-n*NniTb;#!)GD)M^S<)d{Un5s|#mA(Fggwj(p~to}&Q% zD605HY3|WyM64*kRj%!_JHj1Dy+~T$OOqa*msfPG5$R-!>AhheCJfqap9==kPCcP6P&6>Ms>feGY=v&g!3yaK8L8H zQD#}ZV-1e4-|`&eU_~Tk&>bEe@i*0V64e0BLUg!=rNhmUN)NBWMeXX-8i}TH;Y<&* z6DfZ8@R2EgxbZ;ghg&9X%R@qRVsKf`7GF6du9*`YK|9u7klJp_)ghR=>P8KA9?ECX z#cIwW{iS|NModdv*H;Z^!S_X8273juXL?QeP!eHJhG+~;2H_hW9TCLgwxHPU$;6is ze(FId8B(Zw|9I?Hs716yjoyH{qo#YF*Zy1`(0i^p(4!GOpnH=pD*sW$=5`y=8Kn|D z2WzFiEPm1Guwos5+1VaiMtfRHkcmWwKUn?5{8nQuR_VzzQ^O;*Iaf+8ZQ93Lk$^nOFq7pA*;VXAKb`kh zj}Gs1u9ev5Ph49UZ7K_@3JvDNouc7I#8OU{Hp_XqlNYJjROiAa`UQXZnBm+eG#!kM zE54N5bO}93W>S44J&UyK;8q4R6M1^GS>!zKbpP!J*Z6lL7Z)xin9X`pQTusum-wMf z%vTzVaw-T|m9MBt3JUs#<)E_Dk3{rb5deysw-t*HA7tE$Yv&2^_lf;ekUU_P=4(YE4|UWI$68 zl&f;|&L@a;cUQQ}P*KELjF>UFAwh4xk!8d(V}td0rUX~6-7MC@s%~Qcv>r6LB05MS z5-QO9qB;5w1@>Z@lO7|%)LcHlVKD7Z2h;qfUOZ2g$ya*iuHy^4&Y_*BA;Ro6`(g(C=^(>HNs$K>dEY;1N5eU8p>jxJ5l>B!vXoY1P!{Bv~z z2<8-4>y1(=Jt@NrY4p^jcJ5`JahDEIW-6yUciT0LR7SlnRmpjXDI}^EY(x(Vy zynGz_Cj7(-k!^KO$c3}dFj~rt>SDMy?O{|e1Ie9$lP+ECEU#|#eNZIqlteI-SV#(~f zwxm%auX>ps1oS7g-BI7yOv+^OzpS%-R;tg(9_BS)7x)^HWygu|dYcC#w|0E3MGoKe z;z%Sor*fvh;+1KvZXVV(-RZnac03I_p*R5SbZ-H?BmVSl%FV?eajUyTE~oF|mahxk zt~OH@)}xs~gq|zBWaVga8Wal-(h9AP0!2=U*NB6aS%1o0ye~tl-5zw)G>#p-vwJOm zgm=SN*RYa8x&!ebLy0b%lOlhJ~ft@824c0G_?8y`NO>kxCdtt#Drb-%#eGT;s zw`!0Hhj*EDlqj2)nYE0YCZ+j6%m0Xzn+zlB91t62zdgNbfBYNb$Y7~O>8II+y1Sq& zfm}bZwDu$TqJX!jD*95}9f2<7(6F@5%Z<%X1F@nWeQz9JzheI&{zHlh&v?f8%{BRJ z8DipA+k=-8d{(fKaI`!mZq!MSC^nezs^*h|`s`3nYX^mQNENRg!$J;7{RX3K;(GD4S^@(vBKSehA7U|lTU+c4nINB9iOYW&>=wOP)h={dVM zR9s9qCb=f4W_pxyoPAR?>qi5-q*yz2mIidPjXo^Ob}0~kGLjUlH*${M9N!qQ?09ep z5GyUkoyn+w%3okl(*!soP4g;15)qx5Z5f40J?`JP9w@RPu9HEDHOAE^uLqMC@_p@2 z-NM_(g||3fIyHw;x?GtsZ%gH${OCFtptT|(BZtvGfi%~?%crU=Qc8b9`nmriL+sFx zFLVJYD$<~E?u(D8d1&~>j46M#M3HJEXPo#_a$0y;@DD$@i>-Y8!D3l;jWMy0{6%z{ z!T+~{^8|BDD6GPhI17MdQ{pfnPQ-J%O@FNiyUUPe?->QJK`$pO{;~K@j`o#QHKeY> z{(k#rHWQ3Pd~kkzhw!@IIe&z4xu;UbEMmq>;}LmR?s;?5!YhQ>zc10*SDl~wi$`au zV~4v*G_uB$^#|t{+{(^0G-3Jrm28s{J$IG_R6CLde{ zk-CMA%#xDJyRIOa51`@lrz(3=sKM?edD>z+F4fiMi}_pcBsnSS1ACIo@dZ2Dg-M?R`v^%BNr8iUMAY z2gs_gmqxe|gTGZDou z1=(N9sWXs-%HatlpbQ|IY^8o`C@UhKeW|y^OnMlHA3rCaSdfrLNhmYHBfMv$7<`%H>(8(=M{%EhMXy$zjk=%ER7*_ zevLm0dO#|K4CkxWMb06r+DIaq(97eQs@A@yh3;)A#*|9!`{mA6#<*5Wr3W_(4xV{> zV7B^zBkaj}Oqc{Y?&$cGI($##C{iy$iy6>QjV^Sg7s|^ucixHDUZ5q=2e16{8EPoi zGxrR}S#H{Re8{reeM>(b5a1c%5#e2ufEmxTLbX50--`B1hDnv`d1+>pOb9tor` z9W8LwYRQ_Fj|jgQrp4jfFq}lEJ%0+C>}r(<5Q|Qb={?nsseFMj-pT8KSQ=V7{_6?@ zUjEfZx(SDX;g9;3bRTgw2yGN1P|Axr)0NS4isI7O7VGiv+m%D-*$aP%xx3?eILUYz zZ+vY37iJKd2jm$8 zQmmT1oG}_g0eDPJyhtTJNFl1RE~x4=N2IuPjNjP#EM5s z^KT`F#%j9>Gtw_eNvi85m)w(!LIMNNL~ua}1cMYu+bg$+^7gb?S@ep++JnI+Qx{QVoF{)kp zRORoRx$3&IJj~A8bxeG+zY!vU%m0C%Ot`e?_!@dhH%fX^Yh9)KDg>mYG5Z;E%^XaNB`IF znTx+e_&Zm%g)V>AuZ0Y0Vbo6*-+zNW0%-zS9`jvle^OQ_$MdrlB1j9&7{Ru7MYzzz zg}>d7=XiY3s-NjgA5xwa4#aZDM%~Z6ug#v86Nhk~3aJ57B>e;`s4vs20j-9euhH*~ zRiK;jt2yPrwzYCOqjQKAkMS(mO&dP1Ji`1gVq6RVy!q z#KZ&rO5f`tbDklc-_tF&(g=>cFGB&Ee9030#S!d+S4r0ty?>07@H}e}rU~4-vD>%j z6pj^?YC(Hl{i?=hW|3>Q)cZTPU~)!O^;#hI?94@G!q4_67K5-R2eO~&m*4R}f$wMN z26b~B-~`_m)j(^g1iS-4A!-7eob_Nc_e@*h#l9cA2uCc|((@Br<*NnxjowKQo0Ot2 zm8#WDXvA6Hrj=5)Zg1v`h-i@s8krrbW+T0~hXEx6NO#7R|GrXO4#VG!+Dp0G2pM{n0` z0z#r?Ce1gTm}vo1k7&x6*(CySU)(IW#XJ3|11An8(>Qf%)%dTG@oO{6TbvgCuLZ1j#Pd#o4!Al(i1&nk)L&oES&*z z=Ah~6JF=WB)7eCt$L7*V(xxO-;()@SV|l?P%}Yq^W_PvCPsJ&Y4%MkM*MMytM7kvB zwr;jnP?%l&NW4a)+#@u>J4GU^_^fpL(&mrsWk+kxtm#i2s}=kWzl+c6g_DZg^&220 zbp^i3ejK%@QCkv<~@_TEi!8n@KkAGx1(w_nU;*vaCg6xYNjT=zZ8Pj%qo zwd;Fm@Si8fpKtboA>3txZn&1G?@O#5H%^=JY`LW(`Nj=lbI-!1D0!j&n2DfkDY5(N z{+C*BOKIYIUeAm_;a94d+Y2UVJ0K7Fj4}t!TyybjZEv8~Cu;g-VkOMk1Q&GzvcP5uUJdk8R*s%1_wcrh537;r-*FVPGk^5;y1LwLlX*%rEdi6naz(N+&QhU(K z?!ude_x(iIaX^UkLm5+iT5|Dc4ae5cNB4$^o^7(a(uc1Z)7Q?^k*P5r19$p1K4^{8 zp~JTSIwvM25lLWLV5S96H$rKX^_B6-cBrhIJH?4$XT9mk)aU}#bue`>8lqz`DZjv# zPGp}8F)lI>hK}xqQDPCE=xKM!$S5G~aBt=TEFf?_8D6I^S9k6lNBi?q2E2IKBImvB zJoGmetUR)p^8h0V=hiXCMc+)8BH_=A&b%Z75}v&9VYI&pz+mG3DAFRi^8?1{;!&2r z`}Fx4YdPHV)~o4Kxis>YtLd;+)6NRo8mz3WAlH0`=}yoeZz(Jm-*zE!A^|=!lpz(% zCT~5Iz81p=couYI zmu~_@0|hRcK>W$QeB(s==riTcWl5#=sxF#+nx1pD96srz)(^vWM=sH$;qz*A8o_Eb zy#M--?`0#KVbFZlwVA|O_IekjH_c3Al)YLPeGehr=t=L2i+Ovk;J`swm z=y}is0&@d^2}OJoIe~9C;gq-DJvVcbCPl(JU5Z&a&L)g3y?)rGg^N|{&QXx~U75{_ z_(cSJ85kIRERSKyy_ggTx>0$uGs$i*oP42mx&kPmi8sFcCn02nf{qP2QMWMF^ZJ8M zw$O7ndcL#X%^7RAkGg;QHMt(PLcjrM;SWvFlY4e{kxo^>EZQM*Mk1=(RG_FbV+q`m zxxa9g)ok>*+&@mL&FCt@7OshnA7#s{4An`!M(}Xl z_Wr22_&NFLp;FiX@Ntl^B8J5Bjjb(^Ae^+*n!dHY9Q;^oHA6}WPH8@UO^{aJa-O)w zPaLwO2{MlCySuwU6BQcS1X`LEv{t=_V|IvQ=R^{zk3lW}PA7Pjrbv2p?!2H#k=TH( zAbR4H@B>z>7^tBVX=0t7bVO7Fk@9L%YJ2%(c`QrAI2O?DH%m;qN8=n}3driCKX< z*2E~Nih18Vac|hY=b|D$`_1By@-@YdHQ+N%I5;@$6cmUaK(}Pdy2Rx1Su@rD{&-iz zToesPL@~r!&3geui8@9c@@mnnP@MaZeMcGa|Lmd@Jc3dEXV+7PCuINg@D}*bD4~ro z{QGcJ&$F~5GK-4ZJ7 zv}H`zS$Uw?Jqoz2VW+dQ;iL!=RRo~rv+FywJj!8)`f}ucs;ZmTAcpMVaFU&agL;@P zgT?(5nm=RhJS%mIq~qXf4eIzAq9#}s;HQ4pJd$+z)wJjMR78F@j9ycHCKSs~3`2Cz zDA(;jI4F+IJqn-r15?C$Z+itSWE+8k_mntGqJ#}J&z&O$tik!YA!yBbPjHN?!VV#W z)G(M4#+z#gQxd-Qz>33wFcaXo?+zBL4Wxx)Y5&XVu>B#-xyYyNfn-MZGA);U6UZsf zJwog= z`wHkg66UQslFmk0mf16n_VvZMrrnVrB%J;)H?l2*&N;HPvlBszO+Y| zb6`5l0_Ak?v5LKe!)168!Po?op*>ptRK*hua;XpJPk4jeX1u(ID7@Ode-D4?d7c)4 z75=}suH+V!QwXdIo?_5u>+I{xnO_0tsljS5spFAocx_>b)|*gz>h+4#;5+xPD~;}k zcvJk(*NDXnqe5dG@B$*W$#{I$=^@$(FRTDbKm&Yi!Iu@@IlK73ssA+!bE6?7 z)G=63e0nD9I{EbK&N{GcIDm@%mizB~;hRi=TikfVLL^-LS?@96s5Z-_%aGD!#iU3y z*j|_pn^M3;VugX1KW!n-0*=b9_eLtuOq78$<@m{yC%y7|TFcAIrfh>WGX8zWjJs@E oI=ugybg-)Z-<^p63x_*Uk*;Q4Uhw51An>PiUSFd~-OB&}0Eb}F2LJ#7 literal 62546 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 MrmU@0q+k*JUl2~)(f|Me diff --git a/doc/timeplot-mimo_ioresp-ov_lm.png b/doc/timeplot-mimo_ioresp-ov_lm.png index cdeb800e0625753950c6c5f2d6b772b680d0a7b4..27dd891593f6ff0368fc013bbffab9f94d5ed583 100644 GIT binary patch literal 61492 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 z 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ⅅlIBBTDGZV!fxIbTco<7HCbC+bn)+Dnz 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 E0WpOWVgLXD diff --git a/doc/timeplot-mimo_step-pi_cs.png b/doc/timeplot-mimo_step-pi_cs.png index 72ff81bd3261b98d2b7f7f5c1c11e649ce11dd44..6046c8cce9e5a91b3f4d0a93e6ba7476371a05fe 100644 GIT binary patch literal 31861 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 Date: Sun, 2 Jul 2023 17:20:11 -0700 Subject: [PATCH 08/12] add trace_labels option to time_response_plot() --- control/tests/timeplot_test.py | 31 +++++++++++++--- control/timeplot.py | 51 +++++++++++++++++++-------- doc/plotting.rst | 14 +++++++- doc/timeplot-mimo_step-linestyle.png | Bin 0 -> 38704 bytes 4 files changed, 76 insertions(+), 20 deletions(-) create mode 100644 doc/timeplot-mimo_step-linestyle.png diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 2ade00ec1..9d2fc6da7 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -321,6 +321,22 @@ def test_linestyles(): assert line.get_color() == 'k' assert line.get_linestyle() == '--' + out = ct.step_response(sys_mimo).plot( + plot_inputs='overlay', overlay_signals=True, overlay_traces=True, + output_props=[{'color': c} for c in ['blue', 'orange']], + input_props=[{'color': c} for c in ['red', 'green']], + trace_props=[{'linestyle': s} for s in ['-', '--']]) + return None + # assert out.shape == (1, 1) # TODO: fix + assert out[0,0].get_color() == 'blue' and lines[0].get_linestyle() == '-' + assert out[0,1].get_color() == 'blue' and lines[0].get_linestyle() == '--' + assert out[1,0].get_color() == 'orange' and lines[0].get_linestyle() == '-' + assert out[1,1].get_color() == 'orange' and lines[0].get_linestyle() == '--' + assert out[2,0].get_color() == 'red' and lines[0].get_linestyle() == '-' + assert out[2,1].get_color() == 'red' and lines[0].get_linestyle() == '--' + assert out[3,0].get_color() == 'green' and lines[0].get_linestyle() == '-' + assert out[3,1].get_color() == 'green' and lines[0].get_linestyle() == '--' + def test_relabel(): sys1 = ct.rss(2, inputs='u', outputs='y') @@ -358,6 +374,11 @@ def test_errors(): with pytest.raises(ValueError, match="unrecognized value"): stepresp.plot(plot_inputs='unknown') + for kw in ['input_props', 'output_props', 'trace_props']: + propkw = {kw: {'color': 'green'}} + with pytest.warns(UserWarning, match="ignored since fmt string"): + out = stepresp.plot('k-', **propkw) + assert out[0, 0][0].get_color() == 'k' if __name__ == "__main__": # @@ -450,8 +471,10 @@ def test_errors(): "[transpose]") plt.savefig('timeplot-mimo_ioresp-mt_tr.png') - # Reset line styles plt.figure() - resp1.plot('g-') - resp2.plot('r--') - # plt.savefig('timeplot-mimo_step-linestyle.png') + out = ct.step_response(sys_mimo).plot( + plot_inputs='overlay', overlay_signals=True, overlay_traces=True, + output_props=[{'color': c} for c in ['blue', 'orange']], + input_props=[{'color': c} for c in ['red', 'green']], + trace_props=[{'linestyle': s} for s in ['-', '--']]) + plt.savefig('timeplot-mimo_step-linestyle.png') diff --git a/control/timeplot.py b/control/timeplot.py index 615ed2b6a..4795b03fb 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -12,6 +12,7 @@ import matplotlib as mpl import matplotlib.pyplot as plt from os.path import commonprefix +from warnings import warn from . import config @@ -48,7 +49,7 @@ def time_response_plot( transpose=False, overlay_traces=False, overlay_signals=False, legend_map=None, legend_loc=None, add_initial_zero=True, input_props=None, output_props=None, trace_props=None, - title=None, relabel=True, **kwargs): + trace_labels=None, title=None, relabel=True, **kwargs): """Plot the time response of an input/output system. This function creates a standard set of plots for the input/output @@ -161,14 +162,20 @@ def time_response_plot( time_label = config._get_param( 'timeplot', 'time_label', kwargs, _timeplot_defaults, pop=True) + if input_props and len(fmt) > 0: + warn("input_props ignored since fmt string was present") input_props = config._get_param( 'timeplot', 'input_props', kwargs, _timeplot_defaults, pop=True) iprop_len = len(input_props) + if output_props and len(fmt) > 0: + warn("output_props ignored since fmt string was present") output_props = config._get_param( 'timeplot', 'output_props', kwargs, _timeplot_defaults, pop=True) oprop_len = len(output_props) + if trace_props and len(fmt) > 0: + warn("trace_props ignored since fmt string was present") trace_props = config._get_param( 'timeplot', 'trace_props', kwargs, _timeplot_defaults, pop=True) tprop_len = len(trace_props) @@ -365,10 +372,14 @@ def _make_line_label(signal_index, signal_labels, trace_index): label += signal_labels[signal_index] # Add the trace label if this is a multi-trace figure - if overlay_traces and ntraces > 1: + if overlay_traces and ntraces > 1 or trace_labels: label += ", " if label != "" else "" - label += f"trace {trace_index}" if data.trace_labels is None \ - else data.trace_labels[trace_index] + if trace_labels: + label += trace_labels[trace_index] + elif data.trace_labels: + label += data.trace_labels[trace_index] + else: + label += f"trace {trace_index}" # Add the system name (will strip off later if redundant) label += ", " if label != "" else "" @@ -471,18 +482,28 @@ def _make_line_label(signal_index, signal_labels, trace_index): label = ax_array[trace, 0].get_ylabel() # Add on the trace title - label = f"Trace {trace}" if data.trace_labels is None \ - else data.trace_labels[trace] + "\n" + label + if trace_labels: + label = trace_labels[trace] + "\n" + label + elif data.trace_labels: + label = data.trace_labels[trace] + "\n" + label + else: + label = f"Trace {trace}" + "\n" + label + ax_array[trace, 0].set_ylabel(label) else: # regular plot (outputs over inputs) # Set the trace titles, if needed if ntraces > 1 and not overlay_traces: for trace in range(ntraces): + if trace_labels: + label = trace_labels[trace] + elif data.trace_labels: + label = data.trace_labels[trace] + else: + label = f"Trace {trace}" + with plt.rc_context(_timeplot_rcParams): - ax_array[0, trace].set_title( - f"Trace {trace}" if data.trace_labels is None - else data.trace_labels[trace]) + ax_array[0, trace].set_title(label) # Label the outputs if overlay_signals and plot_outputs: @@ -622,22 +643,22 @@ def _make_line_label(signal_index, signal_labels, trace_index): if fig is not None and title is not None: # Get the current title, if it exists old_title = None if fig._suptitle is None else fig._suptitle._text + new_title = title if old_title is not None: # Find the common part of the titles - common_prefix = commonprefix([old_title, title]) + common_prefix = commonprefix([old_title, new_title]) # Back up to the last space last_space = common_prefix.rfind(' ') if last_space > 0: common_prefix = common_prefix[:last_space] - title_suffix = title[len(common_prefix):] + common_len = len(common_prefix) # Add the new part of the title (usually the system name) - separator = ',' if len(common_prefix) > 0 else ';' - new_title = old_title + separator + title_suffix - else: - new_title = title + if old_title[common_len:] != new_title[common_len:]: + separator = ',' if len(common_prefix) > 0 else ';' + new_title = old_title + separator + new_title[common_len:] # Add the title with plt.rc_context(_timeplot_rcParams): diff --git a/doc/plotting.rst b/doc/plotting.rst index ddd44b56c..d0d7bdac9 100644 --- a/doc/plotting.rst +++ b/doc/plotting.rst @@ -77,7 +77,7 @@ following plot:: Input/output response plots created with either the :func:`~control.forced_response` or the -:func:`~control.input_output_response` include the input signals by +:func:`~control.input_output_response` functions include the input signals by default. These can be plotted on separate axes, but also "overlaid" on the output axes (useful when the input and output signals are being compared to each other). The following plot shows the use of `plot_inputs='overlay'` @@ -119,6 +119,18 @@ that are used when combining signals and traces are set by the `input_props`, `output_props` and `trace_props` parameters for :func:`~control.time_response_plot`. +Additional customization is possible using the `input_props`, +`output_props`, and `trace_props` keywords to set complementary line colors +and styles for various signals and traces:: + + out = ct.step_response(sys_mimo).plot( + plot_inputs='overlay', overlay_signals=True, overlay_traces=True, + output_props=[{'color': c} for c in ['blue', 'orange']], + input_props=[{'color': c} for c in ['red', 'green']], + trace_props=[{'linestyle': s} for s in ['-', '--']]) + +.. image:: timeplot-mimo_step-linestyle.png + Plotting functions ================== diff --git a/doc/timeplot-mimo_step-linestyle.png b/doc/timeplot-mimo_step-linestyle.png new file mode 100644 index 0000000000000000000000000000000000000000..9685ea6fac0cdebacb4ca235f454a247696ee099 GIT binary patch literal 38704 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 rAuaux2N@k{X`)8#`~N@x(G&H!_3`mt6Kr=B{PW Date: Sun, 2 Jul 2023 18:10:05 -0700 Subject: [PATCH 09/12] fix shape of output for time_reesponse_plot() --- control/tests/timeplot_test.py | 36 +++++++++++++------------ control/timeplot.py | 48 +++++++++++++++++----------------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 9d2fc6da7..f48f20db8 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -135,6 +135,13 @@ def test_response_plots( out = response.plot(**kwargs) + # Make sure all of the outputs are of the right type + nlines_plotted = 0 + for ax_lines in np.nditer(out, flags=["refs_ok"]): + for line in ax_lines.item(): + assert isinstance(line, mpl.lines.Line2D) + nlines_plotted += 1 + # Make sure number of plots is correct if pltinp is None: if fcn in [ct.forced_response, ct.input_output_response]: @@ -142,14 +149,9 @@ def test_response_plots( else: pltinp = False ntraces = max(1, response.ntraces) - nlines = (response.ninputs if pltinp else 0) * ntraces + \ + nlines_expected = (response.ninputs if pltinp else 0) * ntraces + \ (response.noutputs if pltout else 0) * ntraces - assert out.size == nlines - - # Make sure all of the outputs are of the right type - for ax_lines in np.nditer(out, flags=["refs_ok"]): - for line in ax_lines.item(): - assert isinstance(line, mpl.lines.Line2D) + assert nlines_plotted == nlines_expected # Save the old axes to compare later old_axes = plt.gcf().get_axes() @@ -326,17 +328,17 @@ def test_linestyles(): output_props=[{'color': c} for c in ['blue', 'orange']], input_props=[{'color': c} for c in ['red', 'green']], trace_props=[{'linestyle': s} for s in ['-', '--']]) - return None - # assert out.shape == (1, 1) # TODO: fix - assert out[0,0].get_color() == 'blue' and lines[0].get_linestyle() == '-' - assert out[0,1].get_color() == 'blue' and lines[0].get_linestyle() == '--' - assert out[1,0].get_color() == 'orange' and lines[0].get_linestyle() == '-' - assert out[1,1].get_color() == 'orange' and lines[0].get_linestyle() == '--' - assert out[2,0].get_color() == 'red' and lines[0].get_linestyle() == '-' - assert out[2,1].get_color() == 'red' and lines[0].get_linestyle() == '--' - assert out[3,0].get_color() == 'green' and lines[0].get_linestyle() == '-' - assert out[3,1].get_color() == 'green' and lines[0].get_linestyle() == '--' + assert out.shape == (1, 1) + lines = out[0, 0] + assert lines[0].get_color() == 'blue' and lines[0].get_linestyle() == '-' + assert lines[1].get_color() == 'orange' and lines[1].get_linestyle() == '-' + assert lines[2].get_color() == 'red' and lines[2].get_linestyle() == '-' + assert lines[3].get_color() == 'green' and lines[3].get_linestyle() == '-' + assert lines[4].get_color() == 'blue' and lines[4].get_linestyle() == '--' + assert lines[5].get_color() == 'orange' and lines[5].get_linestyle() == '--' + assert lines[6].get_color() == 'red' and lines[6].get_linestyle() == '--' + assert lines[7].get_color() == 'green' and lines[7].get_linestyle() == '--' def test_relabel(): sys1 = ct.rss(2, inputs='u', outputs='y') diff --git a/control/timeplot.py b/control/timeplot.py index 4795b03fb..76b4fa94e 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -48,7 +48,6 @@ def time_response_plot( data, *fmt, ax=None, plot_inputs=None, plot_outputs=True, transpose=False, overlay_traces=False, overlay_signals=False, legend_map=None, legend_loc=None, add_initial_zero=True, - input_props=None, output_props=None, trace_props=None, trace_labels=None, title=None, relabel=True, **kwargs): """Plot the time response of an input/output system. @@ -162,19 +161,19 @@ def time_response_plot( time_label = config._get_param( 'timeplot', 'time_label', kwargs, _timeplot_defaults, pop=True) - if input_props and len(fmt) > 0: + if kwargs.get('input_props', None) and len(fmt) > 0: warn("input_props ignored since fmt string was present") input_props = config._get_param( 'timeplot', 'input_props', kwargs, _timeplot_defaults, pop=True) iprop_len = len(input_props) - if output_props and len(fmt) > 0: + if kwargs.get('output_props', None) and len(fmt) > 0: warn("output_props ignored since fmt string was present") output_props = config._get_param( 'timeplot', 'output_props', kwargs, _timeplot_defaults, pop=True) oprop_len = len(output_props) - if trace_props and len(fmt) > 0: + if kwargs.get('trace_props', None) and len(fmt) > 0: warn("trace_props ignored since fmt string was present") trace_props = config._get_param( 'timeplot', 'trace_props', kwargs, _timeplot_defaults, pop=True) @@ -306,35 +305,33 @@ def time_response_plot( # Map inputs/outputs and traces to axes # # This set of code takes care of all of the various options for how to - # plot the data. The arrays ax_outputs and ax_inputs are used to map + # plot the data. The arrays output_map and input_map are used to map # the different signals that are plotted onto the axes created above. # This code is complicated because it has to handle lots of different # variations. # # Create the map from trace, signal to axes, accounting for overlay_* - ax_outputs = np.empty((noutputs, ntraces), dtype=object) - ax_inputs = np.empty((ninputs, ntraces), dtype=object) + output_map = np.empty((noutputs, ntraces), dtype=tuple) + input_map = np.empty((ninputs, ntraces), dtype=tuple) for i in range(noutputs): for j in range(ntraces): signal_index = i if not overlay_signals else 0 trace_index = j if not overlay_traces else 0 if transpose: - ax_outputs[i, j] = \ - ax_array[trace_index, signal_index + ninput_axes] + output_map[i, j] = (trace_index, signal_index + ninput_axes) else: - ax_outputs[i, j] = ax_array[signal_index, trace_index] + output_map[i, j] = (signal_index, trace_index) for i in range(ninputs): for j in range(ntraces): signal_index = noutput_axes + (i if not overlay_signals else 0) trace_index = j if not overlay_traces else 0 if transpose: - ax_inputs[i, j] = \ - ax_array[trace_index, signal_index - noutput_axes] + input_map[i, j] = (trace_index, signal_index - noutput_axes) else: - ax_inputs[i, j] = ax_array[signal_index, trace_index] + input_map[i, j] = (signal_index, trace_index) # # Plot the data @@ -361,7 +358,10 @@ def time_response_plot( inputs = data.u.reshape(data.ninputs, ntraces, -1) # Create a list of lines for the output - out = np.empty((noutputs + ninputs, ntraces), dtype=object) + out = np.empty((nrows, ncols), dtype=object) + for i in range(nrows): + for j in range(ncols): + out[i, j] = [] # unique list in each element # Utility function for creating line label def _make_line_label(signal_index, signal_labels, trace_index): @@ -402,7 +402,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): else: line_props = kwargs - out[i, trace] = ax_outputs[i, trace].plot( + out[output_map[i, trace]] += ax_array[output_map[i, trace]].plot( data.time, outputs[i][trace], *fmt, label=label, **line_props) # Plot the input @@ -425,7 +425,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): else: line_props = kwargs - out[noutputs + i, trace] = ax_inputs[i, trace].plot( + out[input_map[i, trace]] += ax_array[input_map[i, trace]].plot( x, y, *fmt, label=label, **line_props) # Stop here if the user wants to control everything @@ -457,23 +457,23 @@ def _make_line_label(signal_index, signal_labels, trace_index): if overlay_signals and plot_inputs: label = overlaid_title if overlaid else "Inputs" for trace in range(ntraces): - ax_inputs[0, trace].set_ylabel(label) + ax_array[input_map[0, trace]].set_ylabel(label) else: for i in range(ninputs): label = overlaid_title if overlaid else data.input_labels[i] for trace in range(ntraces): - ax_inputs[i, trace].set_ylabel(label) + ax_array[input_map[i, trace]].set_ylabel(label) # Label the outputs if overlay_signals and plot_outputs: label = overlaid_title if overlaid else "Outputs" for trace in range(ntraces): - ax_outputs[0, trace].set_ylabel(label) + ax_array[output_map[0, trace]].set_ylabel(label) else: for i in range(noutputs): label = overlaid_title if overlaid else data.output_labels[i] for trace in range(ntraces): - ax_outputs[i, trace].set_ylabel(label) + ax_array[output_map[i, trace]].set_ylabel(label) # Set the trace titles, if needed if ntraces > 1 and not overlay_traces: @@ -507,20 +507,20 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Label the outputs if overlay_signals and plot_outputs: - ax_outputs[0, 0].set_ylabel("Outputs") + ax_array[output_map[0, 0]].set_ylabel("Outputs") else: for i in range(noutputs): - ax_outputs[i, 0].set_ylabel( + ax_array[output_map[i, 0]].set_ylabel( overlaid_title if overlaid else data.output_labels[i]) # Label the inputs if overlay_signals and plot_inputs: label = overlaid_title if overlaid else "Inputs" - ax_inputs[0, 0].set_ylabel(label) + ax_array[input_map[0, 0]].set_ylabel(label) else: for i in range(ninputs): label = overlaid_title if overlaid else data.input_labels[i] - ax_inputs[i, 0].set_ylabel(label) + ax_array[input_map[i, 0]].set_ylabel(label) # # Create legends From 3290809621d52792061ec776b28cbf9ade2ed399 Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Sun, 2 Jul 2023 21:14:27 -0700 Subject: [PATCH 10/12] update line properties code for Python 3.8 --- control/tests/timeplot_test.py | 1 + control/timeplot.py | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index f48f20db8..1f120937d 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -312,6 +312,7 @@ def test_combine_traces(): combresp6 = ct.combine_traces([resp1, resp]) +@slycotonly def test_linestyles(): # Check to make sure we can change line styles sys_mimo = ct.tf2ss( diff --git a/control/timeplot.py b/control/timeplot.py index 76b4fa94e..44729c5dc 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -395,10 +395,11 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Set up line properties for this output, trace if len(fmt) == 0: - line_props = \ - output_props[i % oprop_len if overlay_signals else 0] | \ - trace_props[trace % tprop_len if overlay_traces else 0] | \ - kwargs + line_props = output_props[ + i % oprop_len if overlay_signals else 0].copy() + line_props.update( + trace_props[trace % tprop_len if overlay_traces else 0]) + line_props.update(kwargs) else: line_props = kwargs @@ -418,10 +419,11 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Set up line properties for this output, trace if len(fmt) == 0: - line_props = \ - input_props[i % iprop_len if overlay_signals else 0] | \ - trace_props[trace % tprop_len if overlay_traces else 0] | \ - kwargs + line_props = input_props[ + i % iprop_len if overlay_signals else 0].copy() + line_props.update( + trace_props[trace % tprop_len if overlay_traces else 0]) + line_props.update(kwargs) else: line_props = kwargs From 1a9e64fc4ea3ace4b20f7121fd95e449ab197c34 Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Mon, 3 Jul 2023 12:51:16 -0700 Subject: [PATCH 11/12] fix processing of custom font sizes (w/ unit test) --- control/tests/timeplot_test.py | 27 +++++++++++++++++++++++++++ control/timeplot.py | 10 ++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index 1f120937d..da8649b2f 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -341,6 +341,33 @@ def test_linestyles(): assert lines[6].get_color() == 'red' and lines[6].get_linestyle() == '--' assert lines[7].get_color() == 'green' and lines[7].get_linestyle() == '--' + +def test_rcParams(): + sys = ct.rss(2, 2, 2) + + # Create new set of rcParams + my_rcParams = { + 'axes.labelsize': 10, + 'axes.titlesize': 10, + 'figure.titlesize': 12, + 'legend.fontsize': 10, + 'xtick.labelsize': 10, + 'ytick.labelsize': 10, + } + + # Generate a figure with the new rcParams + out = ct.step_response(sys).plot(rcParams=my_rcParams) + ax = out[0, 0][0].axes + fig = ax.figure + + # Check to make sure new settings were used + assert ax.xaxis.get_label().get_fontsize() == 10 + assert ax.yaxis.get_label().get_fontsize() == 10 + assert ax.title.get_fontsize() == 10 + assert ax.xaxis._get_tick_label_size('x') == 10 + assert ax.yaxis._get_tick_label_size('y') == 10 + assert fig._suptitle.get_fontsize() == 12 + def test_relabel(): sys1 = ct.rss(2, inputs='u', outputs='y') sys2 = ct.rss(1, 1, 1) # uses default i/o labels diff --git a/control/timeplot.py b/control/timeplot.py index 44729c5dc..20df91b49 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -160,6 +160,8 @@ def time_response_plot( # Set up defaults time_label = config._get_param( 'timeplot', 'time_label', kwargs, _timeplot_defaults, pop=True) + timeplot_rcParams = config._get_param( + 'timeplot', 'rcParams', kwargs, _timeplot_defaults, pop=True) if kwargs.get('input_props', None) and len(fmt) > 0: warn("input_props ignored since fmt string was present") @@ -288,7 +290,7 @@ def time_response_plot( # Create new axes, if needed, and customize them if ax is None: - with plt.rc_context(_timeplot_rcParams): + with plt.rc_context(timeplot_rcParams): ax_array = fig.subplots(nrows, ncols, sharex=True, squeeze=False) fig.set_tight_layout(True) fig.align_labels() @@ -504,7 +506,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): else: label = f"Trace {trace}" - with plt.rc_context(_timeplot_rcParams): + with plt.rc_context(timeplot_rcParams): ax_array[0, trace].set_title(label) # Label the outputs @@ -629,7 +631,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): # Update the labels to remove common strings if len(labels) > 1 and legend_map[i, j] != None: - with plt.rc_context(_timeplot_rcParams): + with plt.rc_context(timeplot_rcParams): ax.legend(labels, loc=legend_map[i, j]) # @@ -663,7 +665,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): new_title = old_title + separator + new_title[common_len:] # Add the title - with plt.rc_context(_timeplot_rcParams): + with plt.rc_context(timeplot_rcParams): fig.suptitle(new_title) return out From bab5071da0292f3ba8860b3a0fdc05c8cd9661ba Mon Sep 17 00:00:00 2001 From: Richard Murray Date: Tue, 4 Jul 2023 10:34:10 -0700 Subject: [PATCH 12/12] rename combine_traces to combine_time_responses, updated trace labels --- control/tests/timeplot_test.py | 21 +++++++++++---------- control/timeplot.py | 7 +++---- control/timeresp.py | 14 +++++++------- doc/plotting.rst | 10 +++++----- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/control/tests/timeplot_test.py b/control/tests/timeplot_test.py index da8649b2f..7cdde5c54 100644 --- a/control/tests/timeplot_test.py +++ b/control/tests/timeplot_test.py @@ -250,7 +250,7 @@ def test_legend_map(): title='MIMO step response with custom legend placement') -def test_combine_traces(): +def test_combine_time_responses(): sys_mimo = ct.rss(4, 2, 2) timepts = np.linspace(0, 10, 100) @@ -261,7 +261,7 @@ def test_combine_traces(): U = np.vstack([np.cos(2*timepts), np.sin(timepts)]) resp2 = ct.input_output_response(sys_mimo, timepts, U) - combresp1 = ct.combine_traces([resp1, resp2]) + combresp1 = ct.combine_time_responses([resp1, resp2]) assert combresp1.ntraces == 2 np.testing.assert_equal(combresp1.y[:, 0, :], resp1.y) np.testing.assert_equal(combresp1.y[:, 1, :], resp2.y) @@ -269,13 +269,13 @@ def test_combine_traces(): # Combine two responses with ntrace != 0 resp3 = ct.step_response(sys_mimo, timepts) resp4 = ct.step_response(sys_mimo, timepts) - combresp2 = ct.combine_traces([resp3, resp4]) + combresp2 = ct.combine_time_responses([resp3, resp4]) assert combresp2.ntraces == resp3.ntraces + resp4.ntraces np.testing.assert_equal(combresp2.y[:, 0:2, :], resp3.y) np.testing.assert_equal(combresp2.y[:, 2:4, :], resp4.y) # Mixture - combresp3 = ct.combine_traces([resp1, resp2, resp3]) + combresp3 = ct.combine_time_responses([resp1, resp2, resp3]) assert combresp3.ntraces == resp3.ntraces + resp4.ntraces np.testing.assert_equal(combresp3.y[:, 0, :], resp1.y) np.testing.assert_equal(combresp3.y[:, 1, :], resp2.y) @@ -286,7 +286,8 @@ def test_combine_traces(): # Rename the traces labels = ["T1", "T2", "T3", "T4"] - combresp4 = ct.combine_traces([resp1, resp2, resp3], trace_labels=labels) + combresp4 = ct.combine_time_responses( + [resp1, resp2, resp3], trace_labels=labels) assert combresp4.trace_labels == labels # Automatically generated trace label names and types @@ -294,22 +295,22 @@ def test_combine_traces(): resp5.title = "test" resp5.trace_labels = None resp5.trace_types = None - combresp5 = ct.combine_traces([resp1, resp5]) + combresp5 = ct.combine_time_responses([resp1, resp5]) assert combresp5.trace_labels == [resp1.title] + \ ["test, trace 0", "test, trace 1"] assert combresp4.trace_types == [None, None, 'step', 'step'] with pytest.raises(ValueError, match="must have the same number"): resp = ct.step_response(ct.rss(4, 2, 3), timepts) - combresp = ct.combine_traces([resp1, resp]) + combresp = ct.combine_time_responses([resp1, resp]) with pytest.raises(ValueError, match="trace labels does not match"): - combresp = ct.combine_traces( + combresp = ct.combine_time_responses( [resp1, resp2], trace_labels=["T1", "T2", "T3"]) with pytest.raises(ValueError, match="must have the same time"): resp = ct.step_response(ct.rss(4, 2, 3), timepts/2) - combresp6 = ct.combine_traces([resp1, resp]) + combresp6 = ct.combine_time_responses([resp1, resp]) @slycotonly @@ -494,7 +495,7 @@ def test_errors(): U = np.vstack([np.cos(2*timepts), np.sin(timepts)]) resp2 = ct.input_output_response(sys_mimo, timepts, U) - ct.combine_traces( + ct.combine_time_responses( [resp1, resp2], trace_labels=["Scenario #1", "Scenario #2"]).plot( transpose=True, title="I/O responses for 2x2 MIMO system, multiple traces " diff --git a/control/timeplot.py b/control/timeplot.py index 20df91b49..6409a6660 100644 --- a/control/timeplot.py +++ b/control/timeplot.py @@ -16,7 +16,7 @@ from . import config -__all__ = ['time_response_plot', 'combine_traces', 'get_plot_axes'] +__all__ = ['time_response_plot', 'combine_time_responses', 'get_plot_axes'] # Default font dictionary _timeplot_rcParams = mpl.rcParams.copy() @@ -412,7 +412,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): for i in range(ninputs): label = _make_line_label(i, data.input_labels, trace) - if add_initial_zero and data.trace_types \ + if add_initial_zero and data.ntraces > i \ and data.trace_types[i] == 'step': x = np.hstack([np.array([data.time[0]]), data.time]) y = np.hstack([np.array([0]), inputs[i][trace]]) @@ -606,7 +606,6 @@ def _make_line_label(signal_index, signal_labels, trace_index): labels = [line.get_label() for line in ax.get_lines()] # Look for a common prefix (up to a space) - # TODO: fix error in 1x2, overlay, transpose (Fig 24) common_prefix = commonprefix(labels) last_space = common_prefix.rfind(', ') if last_space < 0 or plot_inputs == 'overlay': @@ -671,7 +670,7 @@ def _make_line_label(signal_index, signal_labels, trace_index): return out -def combine_traces(response_list, trace_labels=None, title=None): +def combine_time_responses(response_list, trace_labels=None, title=None): """Combine multiple individual time responses into a multi-trace response. This function combines multiple instances of :class:`TimeResponseData` diff --git a/control/timeresp.py b/control/timeresp.py index 81349e2f4..bc13ad0d1 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -427,7 +427,7 @@ def __init__( # Check and store trace labels, if present self.trace_labels = _process_labels( trace_labels, "trace", self.ntraces) - self.trace_types = trace_types # TODO: rename to kind? + self.trace_types = trace_types # Figure out if the system is SISO if issiso is None: @@ -1169,7 +1169,7 @@ def forced_response(sys, T=None, U=0., X0=0., transpose=False, tout, yout, xout, U, issiso=sys.issiso(), output_labels=sys.output_labels, input_labels=sys.input_labels, state_labels=sys.state_labels, sysname=sys.name, plot_inputs=True, - title="Forced response for " + sys.name, + title="Forced response for " + sys.name, trace_types=['forced'], transpose=transpose, return_x=return_x, squeeze=squeeze) @@ -1386,8 +1386,7 @@ def step_response(sys, T=None, X0=0, input=None, output=None, T_num=None, uout = np.empty((ninputs, ninputs, T.size)) # Simulate the response for each input - trace_labels = [] - trace_types = [] + trace_labels, trace_types = [], [] for i in range(sys.ninputs): # If input keyword was specified, only simulate for that input if isinstance(input, int) and i != input: @@ -1761,7 +1760,7 @@ def initial_response(sys, T=None, X0=0, output=None, T_num=None, response.t, yout, response.x, None, issiso=issiso, output_labels=output_labels, input_labels=None, state_labels=sys.state_labels, sysname=sys.name, - title="Initial response for " + sys.name, + title="Initial response for " + sys.name, trace_types=['initial'], transpose=transpose, return_x=return_x, squeeze=squeeze) @@ -1888,7 +1887,7 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, uout = np.full((ninputs, ninputs, np.asarray(T).size), None) # Simulate the response for each input - trace_labels = [] + trace_labels, trace_types = [], [] for i in range(sys.ninputs): # If input keyword was specified, only handle that case if isinstance(input, int) and i != input: @@ -1896,6 +1895,7 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, # Save a label for this plot trace_labels.append(f"From {sys.input_labels[i]}") + trace_types.append('impulse') # # Compute new X0 that contains the impulse @@ -1935,7 +1935,7 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, response.time, yout, xout, uout, issiso=issiso, output_labels=output_labels, input_labels=input_labels, state_labels=sys.state_labels, trace_labels=trace_labels, - title="Impulse response for " + sys.name, + trace_types=trace_types, title="Impulse response for " + sys.name, sysname=sys.name, plot_inputs=False, transpose=transpose, return_x=return_x, squeeze=squeeze) diff --git a/doc/plotting.rst b/doc/plotting.rst index d0d7bdac9..d762a6755 100644 --- a/doc/plotting.rst +++ b/doc/plotting.rst @@ -105,7 +105,7 @@ following figure:: U2 = np.vstack([np.cos(2*timepts), np.sin(timepts)]) resp2 = ct.input_output_response(sys_mimo, timepts, U2) - ct.combine_traces( + ct.combine_time_responses( [resp1, resp2], trace_labels=["Scenario #1", "Scenario #2"]).plot( transpose=True, title="I/O responses for 2x2 MIMO system, multiple traces " @@ -114,9 +114,9 @@ following figure:: .. image:: timeplot-mimo_ioresp-mt_tr.png This figure also illustrates the ability to create "multi-trace" plots -using the :func:`~control.combine_traces` function. The line properties -that are used when combining signals and traces are set by the -`input_props`, `output_props` and `trace_props` parameters for +using the :func:`~control.combine_time_responses` function. The line +properties that are used when combining signals and traces are set by +the `input_props`, `output_props` and `trace_props` parameters for :func:`~control.time_response_plot`. Additional customization is possible using the `input_props`, @@ -138,5 +138,5 @@ Plotting functions :toctree: generated/ ~control.time_response_plot - ~control.combine_traces + ~control.combine_time_responses ~control.get_plot_axes