diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..8c1af1507a5052492b53b2a0b4df17f0e2d411ae --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "01_Input/Vorlagen/LaTeX Vorlage"] + path = 01_Input/Vorlagen/LaTeX Vorlage + url = https://git-ce.rwth-aachen.de/ebc/ebc-general/templates/abschlussarbeiten-und-dissertationen.git +[submodule "01_Input/Vorlagen/MA Konrad Beeser"] + path = 01_Input/Vorlagen/MA Konrad Beeser + url = https://git-ce.rwth-aachen.de/ebc/projects/GGE_EBC0002_BMWi_MPCGeothermie_/data-driven-model-predictive-control.git +[submodule "01_Input/Vorlagen/Masterarbeit Konrad Beeser"] + path = 01_Input/Vorlagen/Masterarbeit Konrad Beeser + url = https://git-ce.rwth-aachen.de/ebc/projects/GGE_EBC0002_BMWi_MPCGeothermie_/data-driven-model-predictive-control.git +[submodule "01_Input/Vorlagen/MPC Minimalbeispiele"] + path = 01_Input/Vorlagen/MPC Minimalbeispiele + url = https://git-ce.rwth-aachen.de/ebc/ebc-general/controls/mpc-tool-examples.git diff --git a/01_Input/Masterarbeit Konrad Beeser/README.md b/01_Input/Masterarbeit Konrad Beeser/README.md new file mode 100644 index 0000000000000000000000000000000000000000..12cfd5ee90183fd96193977a3b22dcadaae66e9d --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/README.md @@ -0,0 +1,14 @@ +# Data Driven Model Predictive Control - DDMPC + +Framework for creating and investigating data-driven model predictive controllers. + +------------ + + +**ann_ddmpc:** Base framework and some examples for ANN based data-driven MPC + +**gpr_ddmpc:** gaussian process based ddmpc, framework needs to be adapted to ann_ddmpc framework + +**lsi_ddmpc:** base example for the use of linear system identification + +**vdp_example:** proof of concept for ann-based ddmpc for a van der pol oscillator diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/Boptest/test_boptest_base.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/Boptest/test_boptest_base.py new file mode 100644 index 0000000000000000000000000000000000000000..87bf1ac74e5a5128db3d775469d4332c6a11016c --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/Boptest/test_boptest_base.py @@ -0,0 +1,53 @@ +import requests +from urllib.parse import urljoin +import pandas as pd +import numpy as np + +url = "http://134.130.166.203:5000" + +""" Get Properties: """ +name = requests.get(url=urljoin(url,'name')).json() +inputs_meta = requests.get(url=urljoin(url,'inputs')).json() +measurements_meta = requests.get(url=urljoin(url,'measurements')).json() + + +""" Initialize: """ +init_params = {'start_time': 8*24*3600, + 'warmup_period': 7*24*3600} + +meas_dict = requests.put(url=urljoin(url, 'initialize'), data=init_params).json() + +step_size = requests.get(url=urljoin(url, 'step')).json() +print(step_size) + +new_step_size = {'step': 900} +requests.put(url=urljoin(url,'step'),data=new_step_size) + +# Setting a scenario resets the simulation to a given start time, +# also a predefined duration will be passed +scenario = {'electricity_price': 'dynamic', + 'time_period': 'peak_heat_day'} +scenario_return = requests.put(urljoin(url, 'scenario'), data=scenario).json() + + +""" Set Forecast parameters and get forecast""" +forecast_param = requests.get(urljoin(url, 'forecast_parameters')).json() +new_forecast_param = {'horizon': 32*900, + 'interval': 900} +requests.put(urljoin(url, 'forecast_parameters'),data=new_forecast_param) +print(requests.get(urljoin(url, 'forecast_parameters')).json()) + +forecast = requests.get(urljoin(url, 'forecast')).json() +forecast_pd = pd.DataFrame(data=forecast) + +""" Set Inputs and Advance""" +inputs={'oveHeaPumY_u':0.5} +y=requests.post(urljoin(url, 'advance'),inputs).json() + +""" get results and KPIs""" +res_req = {'point_name': 'oveHeaPumY_u', + 'start_time': -np.inf, + 'final_time': np.inf} +res = requests.put(url=urljoin(url,'results'),data=res_req).json() + +kpis = requests.get(url= urljoin(url,'kpi')).json() diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/Boptest/test_boptest_service.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/Boptest/test_boptest_service.py new file mode 100644 index 0000000000000000000000000000000000000000..74d40df189e44956a6a33fc8b5617e1bd7e49c0f --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/Boptest/test_boptest_service.py @@ -0,0 +1,8 @@ +import requests + +url = "http://134.130.166.203:80" + +testcase = 'bestest_hydronic_heat_pump' + +testid=requests.post('{0}/testcases/{1}/select'.format(url,testcase)).json()['testid'] +name = requests.get('{0}/name/{1}'.format(url, testid)).json() diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/2_generate_data.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/2_generate_data.py new file mode 100644 index 0000000000000000000000000000000000000000..722f7f09778ce4f2c5c596f11374080ba663ae62 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/2_generate_data.py @@ -0,0 +1,30 @@ +from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import * + +# PID controller for the BKT +BKT_PID = PID( + y=TAirRoom, + u=Q_flowTabs, + dt=60*15, + Kp=1, + Ti=600, + Td=0, +) + +# PID controller for the AHU +AHU_PID = PID( + y=TAirRoom, + u=TsetAHU, + dt=60 * 15, + Kp=1, + Ti=600, + Td=0, +) + +ThermalZone_Simulator.plotter.sub_folder_name = 'pid' +ThermalZone_FMU.setup(start_time=0) +ThermalZone_DataContainer = ThermalZone_Simulator.run(controllers=(AHU_PID, BKT_PID), + duration=60 * 60 * 24 * 6) +ThermalZone_DataContainers = ThermalZone_DataContainer.split_container(training_share=0.8,testing_share=0.1,validating_share=0.1) + +ThermalZone_DataHandler = DataHandler(containers=ThermalZone_DataContainers) +ThermalZone_DataHandler.save(pid_DataHandler_name, override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/3_train_anns.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/3_train_anns.py new file mode 100644 index 0000000000000000000000000000000000000000..449dd9529fa4dd479032aee4f547d44c6f8cfd41 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/3_train_anns.py @@ -0,0 +1,51 @@ +from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import * +ThermalZone_DataHandler = load_DataHandler(pid_DataHandler_name) +containers = load_DataHandler(pid_DataHandler_name).containers + +# ----------------------------------- TAirRoom NetworkTrainer ----------------------------------- + +TAirRoom_NetworkTrainer = NetworkTrainer( + inputs=( + # disturbances + Input(feature=dry_bul, lag=2), + Input(feature=rad_dir, lag=1), + + Input(feature=daily_sin, lag=2), + Input(feature=daily_cos, lag=2), + Input(feature=weekly_sin, lag=2), + Input(feature=weekly_cos, lag=2), + + # Stellgrößen + Input(feature=Q_flowTabs, lag=6), + + Input(feature=TsetAHU, lag=2), + # T air room + Input(feature=TAirRoom, lag=6), + + ), + output=Output(feature=d_TAirRoom), + step_size=60*15 +) + +TAirRoom_NetworkTrainer.load_data(containers=containers) +TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=10, epochs=500, batch_size=100) +TAirRoom_NetworkTrainer.save(d_TAirRoom_NetworkTrainer_name, override=True) + +# ----------------------------------- Q_flowAHU NetworkTrainer ----------------------------------- + +Q_flowAhu_NetworkTrainer = NetworkTrainer( + inputs=( + + # AHU + Input(feature=TAirRoom, lag=2), + Input(feature=TsetAHU, lag=2), + Input(feature=dry_bul, lag=2), + ), + output=Output(feature=Q_flowAhu), + step_size=60*15 +) + +Q_flowAhu_NetworkTrainer.clear_data() +Q_flowAhu_NetworkTrainer.load_data(containers=containers) +Q_flowAhu_NetworkTrainer.tune(layer_range=(1,), neurons_range=(4, 8), trials=10, epochs=500, batch_size=100) +Q_flowAhu_NetworkTrainer.save(Q_flowAHU_NetworkTrainer_name, override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/4_mpc_online.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/4_mpc_online.py new file mode 100644 index 0000000000000000000000000000000000000000..9b449e0e6419074d1a4117d7205015209d09aeb4 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/4_mpc_online.py @@ -0,0 +1,70 @@ +from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import * + +# load ann1 +TAirRoom_NetworkTrainer = load_NetworkTrainer(d_TAirRoom_NetworkTrainer_name) +TAirRoom_NetworkTrainer.load_best_ann(loc=0) + +# load ann2 +Q_flowAhu_NetworkTrainer = load_NetworkTrainer(Q_flowAHU_NetworkTrainer_name) +Q_flowAhu_NetworkTrainer.load_best_ann(loc=0) + +TAirRoom.mode = 'economic' + +ThermalZone_MPC = ModelPredictive( + dt=60*15, + N=32, + objectives=( + Objective(feature=TAirRoom, weight=500, k_0_offset=1), + Objective(feature=Q_flowTabs, weight=1, norm=5, k_N_offset=-1), + Objective(feature=d_Q_flowTabs, weight=2, norm=5, k_N_offset=-1), + Objective(feature=Q_flowAhu, weight=1, norm=5, k_N_offset=-1), + Objective(feature=d_TsetAHU, weight=2, norm=5, k_N_offset=-1), + ), + constraints=( + Constraint(features=(Q_flowTabs,), lb=-5, ub=5, k_N_offset=-1), + Constraint(features=(TsetAHU,), lb=273.15 + 18, ub=273.15 + 25, k_N_offset=-1), + ), + model=ThermalZone_Model, + disturbances_df=ThermalZone_FMU.load_disturbances(), + network_trainers=(TAirRoom_NetworkTrainer, Q_flowAhu_NetworkTrainer), + solver_options= {'verbose': False, + 'ipopt': {'print_level': 2, + 'linear_solver': 'ma57'}} +) + +ThermalZone_Simulator.plotter.sub_folder_name = 'online_mpc' +ThermalZone_FMU.setup(start_time=60*60*24*0) + +ThermalZone_MPC_DataHandler = DataHandler() + +# online mpc loop +for repetition in range(3): + + # run mpc and add to DataHandler + ThermalZone_DataContainer = ThermalZone_Simulator.run( + controllers=(ThermalZone_MPC,), + duration=60 * 60 * 24 * 3, + ) + + # split data into training, testing and validating + ThermalZone_DataContainers = ThermalZone_DataContainer.split_container(testing_share=0.15,training_share=0.7,validating_share=0.15) + ThermalZone_MPC_DataHandler.add_containers(ThermalZone_DataContainers) + + # online learning + ThermalZone_Simulator.retrain_anns( + containers=ThermalZone_DataContainers, + network_trainer=TAirRoom_NetworkTrainer, + epochs=500, + batch_size=250, + clear_data=False, + ) + ThermalZone_Simulator.retrain_anns( + containers=ThermalZone_DataContainers, + network_trainer=Q_flowAhu_NetworkTrainer, + epochs=500, + batch_size=250, + clear_data=False, + ) + ThermalZone_MPC.reinitialize_mpc = True + +ThermalZone_MPC_DataHandler.save(MPC_DataHandler_name, override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/5_analyse_data.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/5_analyse_data.py new file mode 100644 index 0000000000000000000000000000000000000000..6dcfc453ad08f620194947c48aa34e08e3771468 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/5_analyse_data.py @@ -0,0 +1,14 @@ +from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import * + +TAirRoom_DataHandler_online = load_DataHandler(MPC_DataHandler_name) +complete_df_online = DataContainer.merge_containers(TAirRoom_DataHandler_online.containers) + +# comparison of online and offline learning +complete_df_online = abs(complete_df_online.rolling(window=4*6*24*7, center=False).mean()) +plt.plot(complete_df_online['TAirRoom error_bounds'], color=fmt.red, label='TAirRoom error_bounds mean online') +plt.legend() +plt.show() + +# exit() +TAirRoom_NetworkTrainer = load_NetworkTrainer('d_TAirRoom') +TAirRoom_NetworkTrainer.evaluate_data(containers=TAirRoom_DataHandler_online.containers) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/configuration.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/configuration.py new file mode 100644 index 0000000000000000000000000000000000000000..79c304f1fde7177ee4c6d27112f88757549639b2 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/configuration.py @@ -0,0 +1,143 @@ +import numpy as np +import pandas as pd +from ddmpc.controller import * +from ddmpc.modeling import * +from ddmpc.utils import * + + +# ---------------------------------------------- names ----------------------------------------------- +pid_DataHandler_name = 'ThermalZone_PID_Data' +d_TAirRoom_NetworkTrainer_name = 'd_TAirRoom_NetworkTrainer' +Q_flowAHU_NetworkTrainer_name = 'Q_flowAHU_NetworkTrainer' +MPC_DataHandler_name = "Online_Learning_MPC" +# -------------------------------------------- FEATURES -------------------------------------------- + +time = Time(dis_name='Simulation Time', var_name='SimTime') + +dry_bul = Temperature(dis_name='Außentemperatur', var_name='weaBus.TDryBul', plt_opts=PlotOptions(color=blue, line=line_solid, label='Außentemperatur')) +rad_dif = Radiation(dis_name='Horizontale diffuse Strahlung', var_name='weaBus.HDifHor', plt_opts=PlotOptions(color=light_red, line=line_solid, label='Strahlung')) +rad_dir = Radiation(dis_name='Direkte normale Strahlung', var_name='weaBus.HDirNor', plt_opts=PlotOptions(color=red, line=line_dashdot, label='')) +rad_glo = Radiation(dis_name='Horizontale globale Strahlung', var_name='weaBus.HGloHor', plt_opts=PlotOptions(color=dark_red, line=line_dotted, label='')) +int_gain_human = Percentage(dis_name='Personen', var_name='internalGains.y[1]', plt_opts=PlotOptions(color=light_grey, line=line_solid, label='Interne Gewinne')) +int_gain_elect = Percentage(dis_name='Verbraucher', var_name='internalGains.y[2]', plt_opts=PlotOptions(color=grey, line=line_dashdot, label='')) +int_gain_light = Percentage(dis_name='Licht', var_name='internalGains.y[3]', plt_opts=PlotOptions(color=dark_grey, line=line_dotted, label='')) + +Q_flowTabs = HeatFlowSetPoint(dis_name='Wärmestrom', var_name='QFlowTabsSet', lb=-5, ub=5, plt_opts=PlotOptions(color=red, line=fmt.line_solid)) +d_Q_flowTabs = Change(base_feature=Q_flowTabs) +d_d_Q_flowTabs = Change(base_feature=d_Q_flowTabs) + +Q_flowCold = HeatFlowMeas(dis_name='Wärmestrom_kalt', var_name='QFlowCold', plt_opts=PlotOptions(color=red, line=fmt.line_solid)) +Q_flowHot = HeatFlowMeas(dis_name='Wärmestrom_warm', var_name='QFlowHeat', plt_opts=PlotOptions(color=red, line=fmt.line_solid)) + +TsetAHU = TemperatureSetPoint(dis_name='Tsoll AHU', var_name='TAhuSet', lb=290.15, ub=299.15,default=290, plt_opts=PlotOptions(color=red, line=fmt.line_solid)) +d_TsetAHU = Change(base_feature=TsetAHU) +d_d_TsetAHU = Change(base_feature=d_TsetAHU) + +TsetAHU_movsum = MovingSum(base_feature=TsetAHU, n=3) +d_TsetAHU_movsum = MovingSum(base_feature=TsetAHU, n=2) + +TAirRoom = Controlled( + dis_name='Raumlufttemperatur', + var_name='TAirRoom', + mode='random', + plt_opts=PlotOptions(color=red, line=line_solid), + day_start=8, + day_end=18, + day_target=295.15, + day_lb=294.15, + day_ub=296.15, + night_lb=290.15, + night_ub=300.15, + night_target=295.15 +) +TAirIn = Temperature(dis_name='Einlasstemperatur', var_name='Bus.ahuBus.TSupAirMea') + +TsetAHU_minus_dry_bul = Subtraction(base_feature_one=TsetAHU, base_feature_two=dry_bul) +d_TsetAHU_minus_dry_bul = Change(base_feature=TsetAHU_minus_dry_bul) +TsetAHU_minus_TAirRoom = Subtraction(base_feature_one=TsetAHU, base_feature_two=TAirRoom) +d_TsetAHU_minus_TAirRoom = Change(base_feature=TsetAHU_minus_TAirRoom) +dry_bul_minus_TAirRoom = Subtraction(base_feature_one=dry_bul, base_feature_two=TAirRoom) +d_dry_bul_minus_TAirRoom = Change(base_feature=dry_bul_minus_TAirRoom) + +d_dry_bul = Change(base_feature=dry_bul) +d_rad_dir = Change(base_feature=rad_dir) +d_TAirRoom = Change(base_feature=TAirRoom) +d_TAirIn = Change(base_feature=TAirIn) + +daily_sin = PeriodicTime(name='Daily Sin', time=time, function=np.sin, frequency=60 * 60 * 24) +daily_cos = PeriodicTime(name='Daily Cos', time=time, function=np.cos, frequency=60 * 60 * 24) +weekly_sin = PeriodicTime(name='Weekly Sin', time=time, function=np.sin, frequency=60 * 60 * 24 * 7) +weekly_cos = PeriodicTime(name='Weekly Cos', time=time, function=np.cos, frequency=60 * 60 * 24 * 7) + +t_1 = Temperature(dis_name='AHU_hot_in', var_name='Bus.ahuBus.heaterBus.hydraulicBus.TFwrdInMea') +t_2 = Temperature(dis_name='AHU_hot_out', var_name='Bus.ahuBus.heaterBus.hydraulicBus.TRtrnOutMea') +t_3 = Temperature(dis_name='AHU_cold_in', var_name='Bus.ahuBus.coolerBus.hydraulicBus.TFwrdInMea') +t_4 = Temperature(dis_name='AHU_cold_out', var_name='Bus.ahuBus.coolerBus.hydraulicBus.TRtrnOutMea') + +f_1 = MassFlow(dis_name='AHU_hot', var_name='Bus.ahuBus.heaterBus.hydraulicBus.VFlowInMea', temperature_in=t_1, temperature_out=t_2) +f_2 = MassFlow(dis_name='AHU_cold', var_name='Bus.ahuBus.coolerBus.hydraulicBus.VFlowInMea', temperature_in=t_3, temperature_out=t_4) + +Q_flowAhu = EnergyBalance(name='Q_flow_Ahu', flows=[f_1, f_2]) + +# ------------------------------------------- Model ------------------------------------------- + +ThermalZone_Model = Model( + t=time, + X=( + TAirRoom, + Q_flowAhu, + ), + U=( + Q_flowTabs, + TsetAHU + ), + D=( + dry_bul, + rad_dir, + daily_sin, + daily_cos, + weekly_sin, + weekly_cos, + ), + C=( + d_TAirRoom, + TsetAHU_minus_dry_bul, + TsetAHU_minus_TAirRoom, + d_TsetAHU, + d_Q_flowTabs, + ), + T=( + Q_flowCold, + Q_flowHot, + t_1, + t_2, + t_3, + t_4, + f_1, + f_2 + ), +) + +# ------------------------------------------- Plotter ------------------------------------------- + +ThermalZone_Plotter = Plotter( + SubPlot(features=(TAirRoom,), y_label='Raumlufttemperatur in °C', shift=273.15), + SubPlot(features=(Q_flowTabs,), y_label='Sollwert Wärmestrom BKT', step=True), + SubPlot(features=(TsetAHU,), y_label='Sollwert Einlasstemperatur', shift=273.15, lb=14, ub=31, step=True), + SubPlot(features=(Q_flowAhu,), y_label='Ist Wärmestrom AHU', step=True), + SubPlot(features=(dry_bul, rad_dir), y_label='Störgrößen in %', normalize=True), + size=(8, 8) +) + + +# ---------------------------------------------- FMU ----------------------------------------------- + +ThermalZone_FMU = FMUSystem(model= ThermalZone_Model, + step_size=60 * 15, + fmu_name='ashrae140_900_set_point_fmu.fmu') +# ------------------------------------------ Simulator ------------------------------------------ +ThermalZone_FMU.load_disturbances() +ThermalZone_Simulator = Simulator( + system=ThermalZone_FMU, + plotter=ThermalZone_Plotter +) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/learn_mpc.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/learn_mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..29f7c095a6dc8c546c2e6d5ceae4c4e427cc5ecd --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/learn_mpc.py @@ -0,0 +1,37 @@ +from Examples.ashrae140_900_set_point_ctrl_predicting_energy_consumption.configuration import * + +# ----------------------------------- TsetAHU NetworkTrainer ----------------------------------- + +TAirRoom_NetworkTrainer = NetworkTrainer( + inputs=( + + # disturbances + Input(feature=dry_bul, lag=2), + Input(feature=rad_dir, lag=1), + Input(feature=d_dry_bul, lag=2), + Input(feature=d_rad_dir, lag=1), + + Input(feature=daily_sin, lag=1), + Input(feature=daily_cos, lag=1), + Input(feature=weekly_sin, lag=1), + Input(feature=weekly_cos, lag=1), + + # Stellgrößen + Input(feature=Q_flowTabs, lag=6), + Input(feature=TsetAHU, lag=3), + + Input(feature=d_Q_flowTabs, lag=5), + Input(feature=d_TsetAHU, lag=2), + + # T air room + Input(feature=TAirRoom, lag=1), + Input(feature=d_TAirRoom, lag=1), + ), + output=Output(feature=TsetAHU), + step_size=60*15 +) + +containers = load_DataHandler('ThermalZone_MPC_online').containers +TAirRoom_NetworkTrainer.load_data(containers=containers) +TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=5, epochs=500, batch_size=100) +TAirRoom_NetworkTrainer.save('TsetAHU', override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/load_res.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/load_res.py new file mode 100644 index 0000000000000000000000000000000000000000..7bfe3cac48a00e369f4ec4eb9e18433820eb025d --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/load_res.py @@ -0,0 +1,24 @@ +from ddmpc import * +import pandas as pd + +ThermalZone_DataHandler = read_pkl(r"C:\Users\Administrator\Documents\data-driven-model-predictive-control\DataDrivenMPC\ashrae140_900_set_point_ctrl\stored_data\Res_6\MPC_one_year_8h_no_online_learning_reduced_features.pkl") + +training = ThermalZone_DataHandler[0].df +training.index = training['SimTime'] +for i in range(1,12): + container = ThermalZone_DataHandler[i].df + container.index = container['SimTime'] + container = container[1:] + training = training.append(container) + +mpc_res = ThermalZone_DataHandler[12].df +mpc_res.index = mpc_res['SimTime'] +for i in range(13,49): + container = ThermalZone_DataHandler[i].df + container.index = container['SimTime'] + container = container[1:] + mpc_res = mpc_res.append(container) + +write_pkl(data={'Training':training,'MPC':mpc_res},filename="DDMPC_one_year_8h_online_learning_reduced_features") +mpc_res.to_csv("data_driven_mpc_one_year_8h_prediction_online_learning_reduced_features.csv") +training.to_csv("data_driven_mpc_one_year_8h_prediction_online_learning_reduced_features_training.csv") \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/stored_data/FMUs/ashrae140_900_set_point_fmu.fmu b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/stored_data/FMUs/ashrae140_900_set_point_fmu.fmu new file mode 100644 index 0000000000000000000000000000000000000000..0265b7df25c3f1f0b5aa34baf192864938306b5a Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/ashrae140_900_set_point_ctrl_predicting_energy_consumption/stored_data/FMUs/ashrae140_900_set_point_fmu.fmu differ diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/2_generate_data_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/2_generate_data_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..4f47b39690abdf33e53f00af13d833429e3a65d4 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/2_generate_data_boptest.py @@ -0,0 +1,31 @@ +from Examples.boptest_hydronic_heat_pump_cost_based.configuration_boptest import * + +# PID controller for the HP +HP_PID = PID( + y=TAirRoom, + u=u_hp_rel, + dt=900, + Kp=0.05, + Ti=300, + Td=0, +) + + +TAirRoom.mode = 'random' + +hydronic_hp_Simulator.plotter.sub_folder_name = 'pid' +hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600) +hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate':1}) +hydronic_hp_DataContainer_random = hydronic_hp_Simulator.run(controllers=(HP_PID,), + duration=60 * 60 * 24 * 14) +TAirRoom.mode = 'steady' +hydronic_hp_DataContainer_steady = hydronic_hp_Simulator.run(controllers=(HP_PID,), + duration=60 * 60 * 24 * 14) +hydronic_hp_DataContainers_random = hydronic_hp_DataContainer_random.split_container(training_share=0.7,testing_share=0.15,validating_share=0.15) +hydronic_hp_DataContainers_steady = hydronic_hp_DataContainer_steady.split_container(training_share=0.7,testing_share=0.15,validating_share=0.15) + +hydronic_hp_DataHandler = DataHandler() +hydronic_hp_DataHandler.add_containers(*hydronic_hp_DataContainers_random) +hydronic_hp_DataHandler.add_containers(*hydronic_hp_DataContainers_steady) + +hydronic_hp_DataHandler.save(pid_DataHandler_name, override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/3_train_anns_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/3_train_anns_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..a452659cb2301e1f3328b1bb7a8e47553b992570 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/3_train_anns_boptest.py @@ -0,0 +1,62 @@ +from Examples.boptest_hydronic_heat_pump_cost_based.configuration_boptest import * + +containers = load_DataHandler(pid_DataHandler_name).containers + + +# ------------------ P_el Networktrainer + +P_el_NetworkTrainer = NetworkTrainer( + inputs=( + # disturbances + Input(feature=t_amb, lag=3), + + # Stellgrößen + Input(feature=u_hp_rel, lag=3), + + # T air room + Input(feature=TAirRoom, lag=3), + + ), + output=Output(feature=power_hp), + step_size=60*15, +) + +P_el_NetworkTrainer.load_data(containers=containers) +P_el_NetworkTrainer.tune(layer_range=(1,), + neurons_range=(8, 16), + trials=5, + epochs=1000, + batch_size=100, + output_scale=6000, + loss='mse') +P_el_NetworkTrainer.save(P_hp_el_NetworkTrainer_name, override=True) + +# ----------------------------------- TAirRoom NetworkTrainer ----------------------------------- + +TAirRoom_NetworkTrainer = NetworkTrainer( + inputs=( + # disturbances + Input(feature=t_amb, lag=2), + Input(feature=rad_dir, lag=1), + + Input(feature=daily_sin, lag=2), + Input(feature=daily_cos, lag=2), + Input(feature=weekly_sin, lag=2), + Input(feature=weekly_cos, lag=2), + + # Stellgrößen + Input(feature=u_hp_rel, lag=4), + + # T air room + Input(feature=TAirRoom, lag=4), + + ), + output=Output(feature=d_TAirRoom), + step_size=60*15 +) + +TAirRoom_NetworkTrainer.load_data(containers=containers) +TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=5, epochs=1000, batch_size=100) +TAirRoom_NetworkTrainer.save(d_TAir_NetworkTrainer_name, override=True) + + diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/4_mpc_online_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/4_mpc_online_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..415b026d9a87384b9b98fa2603c78b820d195daf --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/4_mpc_online_boptest.py @@ -0,0 +1,74 @@ +from Examples.boptest_hydronic_heat_pump_cost_based.configuration_boptest import * + +MPC_DataHandler_name = 'mpc_online_2' +# load ann1 +TAirRoom_NetworkTrainer = load_NetworkTrainer(d_TAir_NetworkTrainer_name+'online_learning') +TAirRoom_NetworkTrainer.load_best_ann(loc=0) + +# load ann2 +P_el_NetworkTrainer = load_NetworkTrainer(P_hp_el_NetworkTrainer_name+'online_learning') +P_el_NetworkTrainer.load_best_ann(loc=0) +TAirRoom.mode = 'economic' + +hydronic_MPC = ModelPredictive( + dt=60*15, + N=96, + objectives=( + Objective(feature=TAirRoom, weight=25, k_0_offset=1), + Objective(feature=costs_el, weight=10, norm=1000, k_N_offset=-1, cost_order=CostOrder.linear), + Objective(feature=d_u_hp_rel, weight=1, norm=1 ,k_N_offset=-1), + ), + constraints=( + Constraint(features=(u_hp_rel,), lb=0, ub=1, k_N_offset=-1), + ), + + model=hydronic_hp_model, + disturbances_df=pd.DataFrame(), + network_trainers=(TAirRoom_NetworkTrainer, P_el_NetworkTrainer,), + solver_options={'verbose': False, + 'ipopt': {'print_level': 2, + 'linear_solver': 'ma27'}} +) + +hydronic_hp_Simulator.plotter.sub_folder_name = 'online_mpc' +hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600) +hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate': 1}) + +hydronic_hp_MPC_DataHandler = DataHandler() + +# online mpc loop +for repetition in range(12): + + # run mpc and add to DataHandler + hydronic_DataContainer = hydronic_hp_Simulator.run( + controllers=(hydronic_MPC,), + duration=60 * 60 * 24 * 6, + ) + + # split data into training, testing and validating + hydronic_DataContainers = hydronic_DataContainer.split_container(testing_share=0.2,training_share=0.6,validating_share=0.2) + hydronic_hp_MPC_DataHandler.add_containers(*hydronic_DataContainers) + hydronic_MPC.reinitialize_mpc = True + + # online learning + hydronic_hp_Simulator.retrain_anns( + containers=hydronic_DataContainers, + network_trainer=TAirRoom_NetworkTrainer, + epochs=500, + batch_size=250, + clear_data=False, + ) + hydronic_hp_Simulator.retrain_anns( + containers=hydronic_DataContainers, + network_trainer=P_el_NetworkTrainer, + epochs=500, + batch_size=250, + clear_data=False, + ) + + +hydronic_hp_MPC_DataHandler.save(MPC_DataHandler_name, override=True) +TAirRoom_NetworkTrainer.save_ann() +P_el_NetworkTrainer.save_ann() +TAirRoom_NetworkTrainer.save(d_TAir_NetworkTrainer_name+'_online_learning_2', override=True) +P_el_NetworkTrainer.save(P_hp_el_NetworkTrainer_name+'_online_learning_2', override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/configuration_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/configuration_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..6663e2165d68ae669e1b6acbe45178c2cfb550d9 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_cost_based/configuration_boptest.py @@ -0,0 +1,119 @@ +import numpy as np +import pandas as pd +from ddmpc.controller import * +from ddmpc.modeling import * +from ddmpc.utils import * + + +# ---------------------------------------------- names ----------------------------------------------- +pid_DataHandler_name = 'hydronic_PID_Data' +d_TAir_NetworkTrainer_name = 'd_TAir_NetworkTrainer' +P_hp_el_NetworkTrainer_name = 'P_hp_el_NetworkTrainer' +MPC_DataHandler_name = "Online_Learning_MPC" +# -------------------------------------------- FEATURES -------------------------------------------- +time = Time(dis_name='Simulation Time', var_name='SimTime') + +t_amb = Temperature(dis_name='Ambient temperature_', + var_name='TDryBul', + plt_opts=PlotOptions(color=blue, + line=line_solid, + label='Ambient Temperature')) +rad_dir = Radiation(dis_name='direct radiation', + var_name='HDirNor', + plt_opts=PlotOptions(color=light_red, line=line_solid, label='Radiation')) + +TAirRoom = Controlled( + dis_name='TAir', + var_name='reaTZon_y', + mode='random', + plt_opts=PlotOptions(color=red, line=line_solid), + day_start=8, + day_end=18, + day_target=295.15, + day_lb=294.15, + day_ub=296.15, + night_lb=290.15, + night_ub=300.15, + night_target=295.15, + random_step_size=3600*4 +) + +d_TAirRoom = Change(base_feature=TAirRoom) + +u_hp_rel = RelPower(var_name='oveHeaPumY_u', + dis_name='u_hp', + plt_opts=PlotOptions(color=blue, line=line_solid, label='u_hp'), + lb=0, + ub=1, + default=0) +d_u_hp_rel = Change(base_feature=u_hp_rel) + +daily_sin = PeriodicTime(name='Daily Sin', time=time, function=np.sin, frequency=60 * 60 * 24) +daily_cos = PeriodicTime(name='Daily Cos', time=time, function=np.cos, frequency=60 * 60 * 24) +weekly_sin = PeriodicTime(name='Weekly Sin', time=time, function=np.sin, frequency=60 * 60 * 24 * 7) +weekly_cos = PeriodicTime(name='Weekly Cos', time=time, function=np.cos, frequency=60 * 60 * 24 * 7) + +power_fan = PowerMeas(var_name='reaPFan_y', dis_name='el. Power Fan', plt_opts=PlotOptions(color=blue, line=line_dotted, label='P_fan'),) +power_hp = PowerMeas(var_name='reaPHeaPum_y', dis_name='el. Power HP', plt_opts=PlotOptions(color=red, line=line_solid, label='P_hp'),) +power_ec = PowerMeas(var_name='reaPPumEmi_y', dis_name='el. Power emission circuit', plt_opts=PlotOptions(color=grey, line=line_dashdot, label='P_ec'),) + +price_el = Price(var_name='PriceElectricPowerHighlyDynamic', dis_name='el. Power Price', plt_opts=PlotOptions(color=black, line=line_solid, label='P_ec')) + +costs_el = Product(base_feature_one=price_el, base_feature_two=power_hp,plt_opts=PlotOptions(color=black, line=line_solid, label='P_ec')) +# ------------------------------------------- Model ------------------------------------------- + +hydronic_hp_model = Model( + t=time, + X=( + TAirRoom, + power_hp, + ), + U=( + u_hp_rel, + ), + D=( + t_amb, + rad_dir, + daily_sin, + daily_cos, + weekly_sin, + weekly_cos, + price_el, + ), + C=( + d_TAirRoom, + d_u_hp_rel, + costs_el, + + ), + T=( + power_fan, + power_ec, + ), +) + +# ------------------------------------------- Plotter ------------------------------------------- + +plotter_hydronic = Plotter( + SubPlot(features=(TAirRoom,), y_label='Room temperature in °C', shift=273.15), + SubPlot(features=(u_hp_rel,), y_label='Modulation hp', step=True), + SubPlot(features=(t_amb,), y_label='Ambient temperature in °C', normalize=False, shift=273.15), + SubPlot(features=(power_fan, power_hp, power_ec), y_label='el. Power in W', normalize=False), + SubPlot(features=(price_el,), y_label='el. Price in €', normalize=False), + size=(8, 8) +) + + +# ---------------------------------------------- FMU ----------------------------------------------- + +hydronic_hp_system = BOPTESTSystem(model=hydronic_hp_model, + step_size=60 * 15, + url='http://134.130.166.203:5000', + name='simple_test') + +# ------------------------------------------ Simulator ------------------------------------------ + +hydronic_hp_Simulator = Simulator( + system=hydronic_hp_system, + plotter=plotter_hydronic +) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/2_generate_data_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/2_generate_data_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..615edd1414dfc85913232ca9332f397d022d67a9 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/2_generate_data_boptest.py @@ -0,0 +1,24 @@ +from Examples.boptest_hydronic_heat_pump_hp_ctrl.configuration_boptest import * + +# PID controller for the HP +HP_PID = PID( + y=TAirRoom, + u=u_hp_rel, + dt=60*30, + Kp=0.05, + Ti=300, + Td=0, +) + + +TAirRoom.mode = 'random' + +hydronic_hp_Simulator.plotter.sub_folder_name = 'pid' +hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600) +hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate':1}) +hydronic_hp_DataContainer = hydronic_hp_Simulator.run(controllers=(HP_PID,), + duration=60 * 60 * 24 * 7) +hydronic_hp_DataContainers = hydronic_hp_DataContainer.split_container(training_share=0.7,testing_share=0.15,validating_share=0.15) + +hydronic_hp_DataHandler = DataHandler(containers=hydronic_hp_DataContainers) +hydronic_hp_DataHandler.save(pid_DataHandler_name, override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/3_train_anns_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/3_train_anns_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..a40ff4858884745e0ce18171c0f21023a6e55b3f --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/3_train_anns_boptest.py @@ -0,0 +1,32 @@ +from Examples.boptest_hydronic_heat_pump_hp_ctrl.configuration_boptest import * +hydronic_DataHandler = load_DataHandler(pid_DataHandler_name) +containers = load_DataHandler(pid_DataHandler_name).containers + +# ----------------------------------- TAirRoom NetworkTrainer ----------------------------------- + +TAirRoom_NetworkTrainer = NetworkTrainer( + inputs=( + # disturbances + Input(feature=t_amb, lag=2), + Input(feature=rad_dir, lag=1), + + Input(feature=daily_sin, lag=2), + Input(feature=daily_cos, lag=2), + Input(feature=weekly_sin, lag=2), + Input(feature=weekly_cos, lag=2), + + # Stellgrößen + Input(feature=u_hp_rel, lag=6), + + # T air room + Input(feature=TAirRoom, lag=6), + + ), + output=Output(feature=d_TAirRoom), + step_size=60*30 +) + +TAirRoom_NetworkTrainer.load_data(containers=containers) +TAirRoom_NetworkTrainer.tune(layer_range=(1,), neurons_range=(8, 16), trials=10, epochs=1000, batch_size=100) +TAirRoom_NetworkTrainer.save(d_TAir_NetworkTrainer_name, override=True) + diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/4_mpc_online_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/4_mpc_online_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..8985c1377fe92f13f79ae56a509d1e4112be39fd --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/4_mpc_online_boptest.py @@ -0,0 +1,56 @@ +from Examples.boptest_hydronic_heat_pump_hp_ctrl.configuration_boptest import * + +# load ann1 +TAirRoom_NetworkTrainer = load_NetworkTrainer(d_TAir_NetworkTrainer_name) +TAirRoom_NetworkTrainer.load_best_ann(loc=0) + +TAirRoom.mode = 'economic' + +hydronic_MPC = ModelPredictive( + dt=60*30, + N=32, + objectives=( + Objective(feature=TAirRoom, weight=50, k_0_offset=1), + Objective(feature=u_hp_rel, weight=1, norm=1, k_N_offset=-1, cost_order=CostOrder.linear), + Objective(feature=d_u_hp_rel, weight=0.01, norm=1 , k_N_offset=-1), + ), + constraints=( + Constraint(features=(u_hp_rel,), lb=0, ub=1, k_N_offset=-1), + ), + + model=hydronic_hp_model, + disturbances_df=pd.DataFrame(), + network_trainers=(TAirRoom_NetworkTrainer,), +) + +hydronic_hp_Simulator.plotter.sub_folder_name = 'online_mpc' +hydronic_hp_system.setup(start_time=0,warmup_period=7*24*3600) +hydronic_hp_system.activate_ctrl_layer({'oveHeaPumY_activate':1}) + +hydronic_hp_MPC_DataHandler = DataHandler() + +# online mpc loop +for repetition in range(1): + + # run mpc and add to DataHandler + hydronic_DataContainer = hydronic_hp_Simulator.run( + controllers=(hydronic_MPC,), + duration=60 * 60 * 24 * 3, + ) + + # split data into training, testing and validating + hydronic_DataContainers = hydronic_DataContainer.split_container(testing_share=0.15,training_share=0.7,validating_share=0.15) + hydronic_hp_MPC_DataHandler.add_containers(hydronic_DataContainers) + + # online learning + hydronic_hp_Simulator.retrain_anns( + containers=hydronic_DataContainers, + network_trainer=TAirRoom_NetworkTrainer, + epochs=500, + batch_size=250, + clear_data=False, + ) + hydronic_MPC.reinitialize_mpc = True + + +hydronic_hp_MPC_DataHandler.save(MPC_DataHandler_name, override=True) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/configuration_boptest.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/configuration_boptest.py new file mode 100644 index 0000000000000000000000000000000000000000..8a326a47d132cc4b59a00fa43eddf29c06307e33 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/Examples/boptest_hydronic_heat_pump_hp_ctrl/configuration_boptest.py @@ -0,0 +1,113 @@ +import numpy as np +import pandas as pd +from ddmpc.controller import * +from ddmpc.modeling import * +from ddmpc.utils import * + + +# ---------------------------------------------- names ----------------------------------------------- +pid_DataHandler_name = 'hydronic_PID_Data' +d_TAir_NetworkTrainer_name = 'd_TAir_NetworkTrainer' +P_hp_el_NetworkTrainer_name = 'P_hp_el_NetworkTrainer' +MPC_DataHandler_name = "Online_Learning_MPC" +# -------------------------------------------- FEATURES -------------------------------------------- +time = Time(dis_name='Simulation Time', var_name='SimTime') + +t_amb = Temperature(dis_name='Ambient temperature ', + var_name='TDryBul', + plt_opts=PlotOptions(color=blue, + line=line_solid, + label='Ambient Temperature')) +rad_dir = Radiation(dis_name='direct radiation', + var_name='HDirNor', + plt_opts=PlotOptions(color=light_red, line=line_solid, label='Radiation')) + +TAirRoom = Controlled( + dis_name='TAir', + var_name='reaTZon_y', + mode='random', + plt_opts=PlotOptions(color=red, line=line_solid), + day_start=8, + day_end=18, + day_target=295.15, + day_lb=294.15, + day_ub=296.15, + night_lb=290.15, + night_ub=300.15, + night_target=295.15, + random_step_size=3600*4 +) + +d_TAirRoom = Change(base_feature=TAirRoom) + +u_hp_rel = RelPower(var_name='oveHeaPumY_u', + dis_name='u_hp', + plt_opts=PlotOptions(color=blue, line=line_solid, label='u_hp'), + lb=0, + ub=1, + default=0) +d_u_hp_rel = Change(base_feature=u_hp_rel) + +daily_sin = PeriodicTime(name='Daily Sin', time=time, function=np.sin, frequency=60 * 60 * 24) +daily_cos = PeriodicTime(name='Daily Cos', time=time, function=np.cos, frequency=60 * 60 * 24) +weekly_sin = PeriodicTime(name='Weekly Sin', time=time, function=np.sin, frequency=60 * 60 * 24 * 7) +weekly_cos = PeriodicTime(name='Weekly Cos', time=time, function=np.cos, frequency=60 * 60 * 24 * 7) + +power_fan = PowerMeas(var_name='reaPFan_y', dis_name='el. Power Fan', plt_opts=PlotOptions(color=blue, line=line_dotted, label='P_fan'),) +power_hp = PowerMeas(var_name='reaPHeaPum_y', dis_name='el. Power HP', plt_opts=PlotOptions(color=red, line=line_solid, label='P_hp'),) +power_ec = PowerMeas(var_name='reaPPumEmi_y', dis_name='el. Power emission circuit', plt_opts=PlotOptions(color=grey, line=line_dashdot, label='P_ec'),) + +# ------------------------------------------- Model ------------------------------------------- + +hydronic_hp_model = Model( + t=time, + X=( + TAirRoom, + ), + U=( + u_hp_rel, + ), + D=( + t_amb, + rad_dir, + daily_sin, + daily_cos, + weekly_sin, + weekly_cos, + ), + C=( + d_TAirRoom, + d_u_hp_rel, + + ), + T=( + power_fan, + power_hp, + power_ec, + ), +) + +# ------------------------------------------- Plotter ------------------------------------------- + +plotter_hydronic = Plotter( + SubPlot(features=(TAirRoom,), y_label='Room temperature in °C', shift=273.15), + SubPlot(features=(u_hp_rel,), y_label='Modulation hp', step=True), + SubPlot(features=(t_amb, rad_dir), y_label='disturbances in %', normalize=True), + SubPlot(features=(power_fan, power_hp, power_ec), y_label='el. Power in W', normalize=False), + size=(8, 8) +) + + +# ---------------------------------------------- FMU ----------------------------------------------- + +hydronic_hp_system = BOPTESTSystem(model=hydronic_hp_model, + step_size=60 * 30, + url='http://134.130.166.203:5000', + name='simple_test') + +# ------------------------------------------ Simulator ------------------------------------------ + +hydronic_hp_Simulator = Simulator( + system=hydronic_hp_system, + plotter=plotter_hydronic +) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__init__.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..38966758dcf659f96f225eac86ddd1343507f1f7 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__init__.py @@ -0,0 +1,7 @@ +import ddmpc.utils +import ddmpc.modeling +import ddmpc.controller + + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__pycache__/__init__.cpython-38.pyc b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc414658b7b61d44fc12378066b524397f9398dc Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__pycache__/__init__.cpython-38.pyc differ diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__pycache__/__init__.cpython-39.pyc b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..783edfab405e961b15d27b38d24d7a23404d01ea Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/__pycache__/__init__.cpython-39.pyc differ diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/__init__.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5d457daa4d87b0959efefbcf50b6086d3c15c003 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/__init__.py @@ -0,0 +1,3 @@ +from ddmpc.controller.controllers import * +from ddmpc.controller.casadi_neural_network import * +from ddmpc.controller.mpc import * diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/casadi_neural_network.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/casadi_neural_network.py new file mode 100644 index 0000000000000000000000000000000000000000..34b4dfedd700c1753682ad7ab2662efc0abff9c6 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/casadi_neural_network.py @@ -0,0 +1,386 @@ +from keras import models, layers, Sequential +from casadi import * + + +class Layer: + """ + Single layer of an artificial neural network. + """ + + def __init__(self, layer: layers.Layer): + + self.config = layer.get_config() + + # name + if 'name' in self.config: + self.name = self.config['name'] + + # units + if 'units' in self.config: + self.units = self.config['units'] + + # activation function + if 'activation' in self.config: + self.activation = self.get_activation(layer.get_config()['activation']) + + # input / output shape + self.input_shape = layer.input_shape[1:] + self.output_shape = layer.output_shape[1:] + + # update the dimensions to two dimensions + self.update_dimensions() + + # symbolic input layer + self.input_layer = MX.sym('input_layer', self.input_shape[0], self.input_shape[1]) + + def __str__(self): + + ret = '' + + if hasattr(self, 'units'): + ret += f'\tunits:\t\t\t\t{self.units}\n' + if hasattr(self, 'activation'): + ret += f'\tactivation:\t\t\t{self.activation.__str__()}\n' + if hasattr(self, 'recurrent_activation'): + ret += f'\trec_activation:\t\t{self.recurrent_activation.__str__()}\n' + ret += f'\tinput_shape:\t\t{self.input_shape}\n' + ret += f'\toutput_shape:\t\t{self.output_shape}\n' + + return ret + + def update_dimensions(self): + """ + CasADi does only work with two dimensional arrays. So the dimensions must be updated. + """ + + if len(self.input_shape) == 1: + self.input_shape = (1, self.input_shape[0]) + elif len(self.input_shape) == 2: + self.input_shape = (self.input_shape[0], self.input_shape[1]) + else: + raise ValueError("Please check input dimensions.") + + if len(self.output_shape) == 1: + self.output_shape = (1, self.output_shape[0]) + elif len(self.output_shape) == 2: + self.output_shape = (self.output_shape[0], self.output_shape[1]) + else: + raise ValueError("Please check output dimensions.") + + @staticmethod + def get_activation(function: str): + blank = MX.sym('blank') + + if function == 'sigmoid': + return Function(function, [blank], [1 / (1 + exp(-blank))]) + + elif function == 'tanh': + return Function(function, [blank], [tanh(blank)]) + + elif function == 'relu': + return Function(function, [blank], [fmax(0, blank)]) + + elif function == 'exponential': + return Function(function, [blank], [exp(blank)]) + + elif function == 'softplus': + return Function(function, [blank], [log(1 + exp(blank))]) + + elif function == 'gaussian': + return Function(function, [blank], [exp(-blank ** 2)]) + + elif function == 'linear': + return Function(function, [blank], [blank]) + + else: + raise ValueError(f'Unknown activation function: "{function}"') + + +class Dense(Layer): + """ + Fully connected layer. + """ + + def __init__(self, layer: layers.Dense): + + super(Dense, self).__init__(layer) + + # weights and biases + self.weights, self.biases = layer.get_weights() + self.biases = self.biases.reshape(1, self.biases.shape[0]) + + # check input dimension + if self.input_shape[1] != self.weights.shape[0]: + raise ValueError(f'Please check the input dimensions of this layer. Layer with error: {self.name}') + + def forward(self, input): + + # forward pass + f = self.activation(input @ self.weights + self.biases) + + return f + + def inspect(self): + + print('Weights') + print(self.weights) + print('Biases') + print(self.biases) + + +class Flatten(Layer): + + def __init__(self, layer: layers.Flatten): + + super(Flatten, self).__init__(layer) + + def forward(self, input): + + # flattens the input + f = input[0, :] + for row in range(1, input.shape[0]): + f = horzcat(f, input[row, :]) + + return f + + +class BatchNormalising(Layer): + """ + Batch Normalizing layer. Make sure the axis setting is set to two. + """ + + def __init__(self, layer: layers.BatchNormalization): + + super(BatchNormalising, self).__init__(layer) + + # weights and biases + self.gamma = np.vstack([layer.get_weights()[0]]*self.input_shape[0]) + self.beta = np.vstack([layer.get_weights()[1]]*self.input_shape[0]) + self.mean = np.vstack([layer.get_weights()[2]]*self.input_shape[0]) + self.var = np.vstack([layer.get_weights()[3]] * self.input_shape[0]) + self.epsilon = layer.get_config()['epsilon'] + + # check Dimensions + if self.input_shape != self.gamma.shape: + axis = self.config['axis'][0] + raise ValueError(f'Dimension mismatch. Normalized axis: {axis}') + + # symbolic input layer + self.input_layer = MX.sym('input_layer', self.input_shape[0], self.input_shape[1]) + + def forward(self, input): + + # forward pass + f = (input - self.mean) / (sqrt(self.var + self.epsilon)) * self.gamma + self.beta + + return f + + def inspect(self): + + print('gamma:') + print(self.gamma) + print('beta:') + print(self.beta) + print('mean:') + print(self.mean) + print('var:') + print(self.var) + print('epsilon:') + print(self.epsilon) + + +class LSTM(Layer): + """ + Long Short Term Memory cell. + """ + + def __init__(self, layer: layers.LSTM): + + super(LSTM, self).__init__(layer) + + # recurrent activation + self.recurrent_activation = self.get_activation(layer.get_config()['recurrent_activation']) + + # load weights and biases + W = layer.get_weights()[0] + U = layer.get_weights()[1] + b = layer.get_weights()[2] + + # weights (kernel) + self.W_i = W[:, :self.units] + self.W_f = W[:, self.units: self.units * 2] + self.W_c = W[:, self.units * 2: self.units * 3] + self.W_o = W[:, self.units * 3:] + + # weights (recurrent kernel) + self.U_i = U[:, :self.units] + self.U_f = U[:, self.units: self.units * 2] + self.U_c = U[:, self.units * 2: self.units * 3] + self.U_o = U[:, self.units * 3:] + + # biases + self.b_i = np.expand_dims(b[:self.units], axis=0) + self.b_f = np.expand_dims(b[self.units: self.units * 2], axis=0) + self.b_c = np.expand_dims(b[self.units * 2: self.units * 3], axis=0) + self.b_o = np.expand_dims(b[self.units * 3:], axis=0) + + # initial memory and output + self.h_0 = np.zeros((1, self.units)) + self.c_0 = np.zeros((1, self.units)) + + def forward(self, input): + + # check input shape + if input.shape != self.input_shape: + print('Dimension mismatch!') + + # initial + c = self.c_0 + h = self.h_0 + + # number of time steps + steps = self.input_shape[0] + + # forward pass + for i in range(steps): + + # input for the current step + x = input[i, :] + + # calculate memory(c) and output(h) + c, h = self.step(x, c, h) + + # here the output has to be transposed, because of the dense layer implementation + return h + + def step(self, x_t, c_prev, h_prev): + + # gates + i_t = self.recurrent_activation(x_t @ self.W_i + h_prev @ self.U_i + self.b_i) + f_t = self.recurrent_activation(x_t @ self.W_f + h_prev @ self.U_f + self.b_f) + o_t = self.recurrent_activation(x_t @ self.W_o + h_prev @ self.U_o + self.b_o) + c_t = self.activation(x_t @ self.W_c + h_prev @ self.U_c + self.b_c) + + # memory and output + c_next = f_t * c_prev + i_t * c_t + h_next = o_t * self.activation(c_next) + + return c_next, h_next + + +class Rescaling(Layer): + + def __init__(self, layer: layers.Rescaling): + super(Rescaling, self).__init__(layer) + + # weights and biases + self.offset = layer.offset + self.scale = layer.scale + + def forward(self, input): + + # forward pass + f = input * self.scale + self.offset + + return f + + def inspect(self): + + print('offset:') + print(self.offset) + print('scale:') + print(self.scale) + + +class NeuralNetwork: + """ + Generic implementations of sequential Keras models in CasADi. + """ + + def __init__(self, model: models): + """ + Supported layers: + - Dense (Fully connected layer) + - Flatten (Reduces the input dimension to 1) + - BatchNormalizing (Normalization) + - LSTM (Recurrent Cell) + :param model: Sequential Keras Model + """ + + # list with all layers + self.layers = [] + + # forward function + self.predict = None + + # construct from keras model + self.construct(model) + + def __str__(self): + + ret = '\n--------------------- Casadi Neural Network ---------------------\n\n' + + for layer in self.layers: + ret += f'{layer.__class__.__name__}\n' + ret += f'{layer.__str__()}\n' + + ret += '--------------------- Casadi Neural Network ---------------------\n' + + return ret + + @property + def input_shape(self): + return self.layers[0].input_shape + + @property + def output_shape(self): + return self.layers[-1].output_shape + + def construct(self, model: models): + + # Add layers one by + for layer in model.layers: + + # get the name of the layer + name = layer.get_config()['name'] + + # recreate the matching layer + if 'dense' in name: + self.add_layer(Dense(layer)) + elif 'flatten' in name: + self.add_layer(Flatten(layer)) + elif 'batch_normalization' in name: + self.add_layer(BatchNormalising(layer)) + elif 'lstm' in name: + self.add_layer(LSTM(layer)) + elif 'rescaling' in name: + self.add_layer(Rescaling(layer)) + else: + raise NotImplementedError(f'Type "{name}" is not supported.') + + # update the predict function + self.update_forward() + + def update_forward(self): + + # create symbolic input layer + input_layer = self.layers[0].input_layer + + # initialize + f = input_layer + + # pass forward through all layers + for layer in self.layers: + f = layer.forward(f) + + # create the prediction function + self.predict = Function('forward', [input_layer], [f]) + + def add_layer(self, layer): + + # append layer + self.layers.append(layer) + + def inspect(self): + for layer in self.layers: + layer.inspect() diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/controllers.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/controllers.py new file mode 100644 index 0000000000000000000000000000000000000000..4aa1632dc56855ee11aa756a661b6872444f6104 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/controllers.py @@ -0,0 +1,142 @@ +from ddmpc.modeling import * +from ddmpc.utils import * +import pandas as pd + +class Controller: + """ + Super Class for every controller. + """ + + def __init__(self, + dt: int, + N: int = 1): + + + + # step size + self.dt = dt + self.N = N + + def __call__(self, df: pd.DataFrame) -> dict: + """ + This function is called during the simulation. + :param df: The DataFrame contains the current simulation data. + """ + raise NotImplementedError() + + def set_disturbances(self,disturbance_df: pd.DataFrame): + """ + Set Disturbance DataFrame + :param disturbance_df: disturbance dataFrame + :return: + """ + self.disturbances_df = disturbance_df + + + +class PID(Controller): + + def __init__( + self, + y: Controlled, + u: Control, + dt: int, + Kp: float, + Ti: float, + Td: float, + reverse_act: float = False, + + ): + """ + Simple PID controller + :param y: Controlled feature. + :param u: Control feature. + :param dt: Step size. Must be a multiple of the step size of the FMU. + :param Kp: Pproportional + :param Ti: Integral + :param Td: Differential + :param reverse_act: Reverse the control action + :param clamp_i_high: Clamps the integrator + :param clamp_i_low: Clamps the integrator + """ + super(PID, self).__init__( + dt=dt, + N=16) + + # control and controlled feature + self.u = u + self.y = y + + # PID parameters + self.Kp = Kp + self.Ti = Ti + self.Td = Td + + # integrator value + self.i = 0 + + # last error + self.e_last = 0 + + # reverse action + self.reverse_act = reverse_act + + def __str__(self): + + return f'{self.__class__.__name__} - {self.y} controlled by {self.u}' + + def __repr__(self): + return f'{self.__class__.__name__}' + + def __call__(self, df: pd.DataFrame) -> dict: + """ + This function is called during the simulation of the FMU. + It returns the control actions. + :param df: Data Frame with current simulation data. + :return: Dict with control action. + """ + + # empty control dict + control_dict = dict() + + # set default value + control_dict[self.u.col_name] = self.u.default + + # control difference depending on control direction + e = self.y.current_error + + # reverse action if reverse_act is true + if self.reverse_act: + e = -e + + # Integral + if self.Ti > 0: + self.i += 1 / self.Ti * e * self.dt + + else: + self.i = 0 + + # Differential + if self.dt > 0 and self.Td: + de = self.Td * (e - self.e_last) / self.dt + else: + de = 0 + + # PID output + output = self.Kp * (e + self.i + de) + + # update e_last + self.e_last = e + + # Limiter + if output < self.u.lb: + output = self.u.lb + elif output > self.u.ub: + output = self.u.ub + + # Anti wind up + self.i = output / self.Kp - e + + control_dict[self.u.col_name] = output + + return control_dict diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/mpc.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..b2c410b1b9aaabd184642d26cec4f69a681790d1 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/controller/mpc.py @@ -0,0 +1,615 @@ +from ddmpc.controller.controllers import Controller +from ddmpc.modeling import * +from ddmpc.modeling.features import Change, MovingSum, Subtraction +import ddmpc.controller.casadi_neural_network as cnn +import ddmpc.utils.formatting as fmt + +import pandas as pd +from casadi import * + +import time +from enum import Enum, auto + +debug_mode = False +print_solution = False +print_nlp = False + + +class CostOrder(Enum): + linear = auto() + quadratic = auto() + +class Objective: + + def __init__( + self, + feature: Feature, + weight: float, + weight_offset: float = 0, + norm: float = 1, + k_0_offset: int = 0, + k_N_offset: int = -1, + cost_order: CostOrder = CostOrder.quadratic, + ): + """ + + :param feature: feature to be considered in the cost function + :param weight: weighting of the featurer + :param weight_offset: offset + :param norm: normalization + :param k_0_offset: offset for the first value(s) of the Feature (e.g. first state is measured and cannot be + changed -> therefore no consideration in cost function) + :param k_N_offset: offset for the last value(s) of the feature (e.g. last input has no effect) + :param cost_order: order of the cost term ['linear','quadratic'] to be implemented: abs_relaxed (currently only + for not controlled features implemented) + """ + self.feature = feature + + self.weight = weight + self.weight_offset = weight_offset + + self.norm = norm + + self.k_0_offset = k_0_offset + self.k_N_offset = k_N_offset + + self.cost_order = cost_order + + def __str__(self): + return f'Objective(feature={self.feature}, weight={self.weight})' + + +class Constraint: + + def __init__( + self, + features: tuple, + lb: float, + ub: float, + k_0_offset: int = 0, + k_N_offset: int = -1, + ): + self.features = features + + self.k_0_offset = k_0_offset + self.k_N_offset = k_N_offset + + self.lb = lb + self.ub = ub + + def __str__(self): + return f'Constraint(features={self.features}, lb={self.lb}, ub={self.ub})' + + +class ModelPredictive(Controller): + + def __init__( + self, + dt: int, + N: int, + objectives: tuple, + constraints: tuple, + model: Model, + disturbances_df: pd.DataFrame, + network_trainers: tuple, + solver_options: dict, + ): + + super(ModelPredictive, self).__init__( + dt=dt, + ) + + self.model = model + + self.network_trainers = network_trainers + self.N = N + self.objectives = objectives + self.constraints = constraints + + # list with g constraints + self.g = list() + self.lbg = list() + self.ubg = list() + + # list with par & opt vars + self.PAR_LIST = list() + self.OPT_LIST = list() + + # nlp solver + self.nlp_solver = None + self.solver_options = solver_options + + # data frame with future disturbances + self.disturbances_df = disturbances_df + + # list with warm start values + self.warm_start = None + + self.reinitialize_mpc = True + + # print self + print(self.__str__()) + + def __str__(self): + + ret = 'ModelPredictive(\n' + ret +='\tObjectives:\n' + for objective in self.objectives: + ret += f'\t\t{objective}\n' + ret +='\tConstraints:\n' + for constraint in self.constraints: + ret += f'\t\t{constraint}\n' + ret += ')\n' + return ret + + def __call__(self, df: pd.DataFrame) -> dict: + + # start when the initialization is finished + + if (df['SimTime'].iloc[-1] - df['SimTime'].iloc[0]) <= self.dt * self.max_lag: + return {} + + if self.reinitialize_mpc: + self.create_nlp_solver() + self.reinitialize_mpc = False + + + # get the par vars + PAR_VARS = self.get_par_vars(df) + + start_time = time.time() + + # call the solver + if self.warm_start is None: + solution = self.nlp_solver( + lbg=vertcat(*self.lbg), + ubg=vertcat(*self.ubg), + p=PAR_VARS, + ) + else: + solution = self.nlp_solver( + lbg=vertcat(*self.lbg), + ubg=vertcat(*self.ubg), + p=PAR_VARS, + x0=self.warm_start + ) + + for controlled in self.model.controlled: + controlled.df['solver_call'].iloc[-1] = time.time() - start_time + + self.warm_start = solution['x'] + + # extract the optimal controls from the solver solution + control_dict = {} + for i, dct in enumerate(self.OPT_LIST): + + # optimal control + for u in self.model.U: + + if u == dct.get('feature') and dct.get('k') == 0: + control_dict[u.col_name] = float(solution['x'].toarray()[i]) + + # predicted value + # for j in range(1, self.N): + # for controlled in self.controlled: + # if self.y_con == dct.get('object') and dct.get('k') == j: + # predicted = float(solution['x'].toarray()[i]) + # self.trajectory_and_bounds.df.loc[self.trajectory_and_bounds.df['SimTime'] == t + dt * j, f'predicted_trajectory_+{j}'] = predicted + + # debug mode + if debug_mode: + + print('\nSOLVER INFO:') + print('\t', self.nlp_solver) + print('\t len(self.ubg):', len(self.ubg)) + print('\t len(self.lbg):', len(self.lbg)) + print('\t self.PAR_LIST:', len(self.PAR_LIST)) + print('\t self.OPT_LIST:', len(self.OPT_LIST)) + print('\t time_steps :', self.dt) + + print('\nPAR_VARS:') + for x, y in zip(self.PAR_LIST, PAR_VARS.toarray()): + print(f'\t{x}={np.round(y, decimals=3)}') + + # print solution + if print_solution: + + # solver status + if self.nlp_solver.stats()['return_status'] != 'Solve_Succeeded': + print( + f'{fmt.FAIL}Solver return status: {self.nlp_solver.stats()["return_status"]}){fmt.ENDC}') + else: + print( + f'{fmt.BOLD}Solver return status: {self.nlp_solver.stats()["return_status"]}){fmt.ENDC}') + + # solution + print('\nSOLUTION:') + for x, y in zip(self.OPT_LIST, solution['x'].toarray()): + print(f'\t{x.get("object")}[k={x.get("k")}]={np.round(y, decimals=3)}') + + print(f'control_dict: {control_dict}') + + # print optimal controls + print('\nOptimal controls:') + for u, value in control_dict.items(): + print(f'\t{u}={round(value, 5)}') + + return control_dict + + @property + def max_lag(self): + return max([trainer.max_lag for trainer in self.network_trainers]) + + def create_nlp_solver(self): + + # ------------------------ initialization --------------------------- + + obj = list() # objective + self.g = list() # constraints + self.lbg = list() # lbg + self.ubg = list() # ubg + + self.PAR_LIST = list() # PAR LIST + self.OPT_LIST = list() # OPT LIST + + PAR_VARS = list() # PAR VARS + OPT_VARS = list() # OPT VARS + VARS_DICT = dict() # Dict with variables as keys + + # ------------------------ par_vars & opt_vars --------------------------- + + for x in self.model.X: # state + VARS_DICT[x] = {} + for k in range(-self.max_lag, 1): + symbolic = MX.sym(f'PAR X {x}[k={"%+d" % k}]', 1) + VARS_DICT[x][k] = symbolic + PAR_VARS.append(symbolic) + self.PAR_LIST.append({'feature': x, 'info': 'value', 'k': k}) + + for k in range(1, self.N + 1): + symbolic = MX.sym(f'OPT X {x}[k={"%+d" % k}]', 1) + VARS_DICT[x][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': x, 'info': 'value', 'k': k}) + + for u in self.model.U: # controls + VARS_DICT[u] = {} + for k in range(-self.max_lag, 0): + symbolic = MX.sym(f'PAR U {u}[k={"%+d" % k}]', 1) + VARS_DICT[u][k] = symbolic + PAR_VARS.append(symbolic) + self.PAR_LIST.append({'feature': u, 'info': 'value', 'k': k}) + + for k in range(0, self.N): + symbolic = MX.sym(f'OPT U {u}[k={"%+d" % k}]', 1) + VARS_DICT[u][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': u, 'info': 'value', 'k': k}) + + for d in self.model.D: # disturbances + VARS_DICT[d] = {} + for k in range(-self.max_lag, self.N): + symbolic = MX.sym(f'PAR D {d}[k={"%+d" % k}]', 1) + VARS_DICT[d][k] = symbolic + PAR_VARS.append(symbolic) + self.PAR_LIST.append({'feature': d, 'info': 'value', 'k': k}) + + for c in self.model.C: # constructed + VARS_DICT[c] = {} + + for k in range(-self.max_lag, self.N + 1): + + if isinstance(c, Change): + + if k in VARS_DICT[c.base_feature] and (k - 1) in VARS_DICT[c.base_feature]: + + symbolic = MX.sym(f'OPT Change {c}[k={"%+d" % k}]', 1) + VARS_DICT[c][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': c, 'k': k}) + + elif isinstance(c, MovingSum): + + if k in VARS_DICT[c.base_feature] and (k - c.n) in VARS_DICT[c.base_feature]: + symbolic = MX.sym(f'OPT MovingSum {c}[k={"%+d" % k}]', 1) + VARS_DICT[c][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': c, 'k': k}) + + elif isinstance(c, Subtraction): + + if k in VARS_DICT[c.base_feature_one] and k in VARS_DICT[c.base_feature_one]: + + symbolic = MX.sym(f'OPT Subtraction {c}[k={"%+d" % k}]', 1) + VARS_DICT[c][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': c, 'k': k}) + + elif isinstance(c, Addition): + + if k in VARS_DICT[c.base_feature_one] and k in VARS_DICT[c.base_feature_one]: + symbolic = MX.sym(f'OPT Addition {c}[k={"%+d" % k}]', 1) + VARS_DICT[c][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': c, 'k': k}) + + elif isinstance(c, Product): + + if k in VARS_DICT[c.base_feature_one] and k in VARS_DICT[c.base_feature_one]: + symbolic = MX.sym(f'OPT Product {c}[k={"%+d" % k}]', 1) + VARS_DICT[c][k] = symbolic + OPT_VARS.append(symbolic) + self.OPT_LIST.append({'feature': c, 'k': k}) + + else: + raise NotImplementedError(f'Please contact Max. {c}') + + if print_nlp: + print(f'\n{fmt.BOLD}VARS_DICT: (max_lag={self.max_lag}, N={self.N}){fmt.ENDC}') + for feature in VARS_DICT: + print(f'\n\t{feature}:') + for lag in VARS_DICT[feature]: + print('\t\t', f'k={"%+d" % lag}:', VARS_DICT[feature][lag].__repr__()) + + # ----------------------- connect constructed vars ----------------------- + + for c in self.model.C: # constructed + for k in range(-self.max_lag, self.N + 1): + + if isinstance(c, Change): + + if k in VARS_DICT[c]: + + dC = VARS_DICT[c] + C = VARS_DICT[c.base_feature] + + # dc = c[k] - c[k-1] + self.add_constraint(dC[k] - (C[k] - C[k - 1])) + + elif isinstance(c, MovingSum): + + if k in VARS_DICT[c]: + + # mov_sum[k] = feature[k-0] + feature[k-1] +...+ feature[k-n] + mov_sum = VARS_DICT[c][k] + for i in range(k-c.n, k+1): + mov_sum -= VARS_DICT[c.base_feature][i] + + self.add_constraint(mov_sum) + + elif isinstance(c, Subtraction): + + if k in VARS_DICT[c]: + + lhs = VARS_DICT[c][k] + rhs = VARS_DICT[c.base_feature_one][k] - VARS_DICT[c.base_feature_two][k] + self.add_constraint(lhs - rhs) + + elif isinstance(c, Addition): + + if k in VARS_DICT[c]: + + lhs = VARS_DICT[c][k] + rhs = VARS_DICT[c.base_feature_one][k] + VARS_DICT[c.base_feature_two][k] + self.add_constraint(lhs - rhs) + + elif isinstance(c, Product): + + if k in VARS_DICT[c]: + + lhs = VARS_DICT[c][k] + rhs = VARS_DICT[c.base_feature_one][k] * VARS_DICT[c.base_feature_two][k] + self.add_constraint(lhs - rhs) + + else: + raise NotImplementedError('Please contact Max.') + + # ----------------------------- g constraints ---------------------------- + + for constraint in self.constraints: + + for k in range(constraint.k_0_offset, self.N + 1 + constraint.k_N_offset): + + product = 1 + for feature in constraint.features: + try: + product *= VARS_DICT[feature][k] + except: + raise ValueError(f'Feature {feature}({feature.__repr__()}) at k={k}') + + self.add_constraint(product, lbg=constraint.lb, ubg=constraint.ub) + + # ---------------------------- ann predictions ---------------------------- + + for network_trainer in self.network_trainers: + + keras_ann = network_trainer.ann + assert keras_ann is not None, f'Please make sure to provide an ANN for "{network_trainer.output.name}"' + + ca_ann = cnn.NeuralNetwork(model=keras_ann) + + if debug_mode: + ca_ann.inspect() + + for k in range(1, self.N + 1): + + if debug_mode: + print(f'\n--------- k={k} ---------') + print(f'{fmt.BOLD}Output:{fmt.ENDC}') + print('\t', VARS_DICT[network_trainer.output.feature][k]) + print(f'{fmt.BOLD}Inputs:{fmt.ENDC}') + + # get the input for the ann + input_for_ann = list() + for inp in network_trainer.inputs: + for i in range(k-1, k-inp.lag-1, -1): + input_for_ann.append(VARS_DICT[inp.feature][i]) + + if debug_mode: + print('\t', VARS_DICT[inp.feature][i]) + + input_for_ann = vertcat(*input_for_ann).T + + prediction = ca_ann.predict(input_for_ann) + + self.add_constraint(VARS_DICT[network_trainer.output.feature][k] - prediction) + + # ------------------------------ objectives ------------------------------- + + for objective in self.objectives: + + for k in range(objective.k_0_offset, self.N + 1 + objective.k_N_offset): + + if objective.feature.is_controlled: + + if objective.feature.mode == 'economic': + + # eps lb + eps_lb = MX.sym(f'OPT {objective.feature} eps lb [k={"%+d" % k}]', 1) + OPT_VARS.append(eps_lb) + self.OPT_LIST.append({'feature': objective.feature, 'info': 'lb', 'k': k}) + + # eps ub + eps_ub = MX.sym(f'OPT {objective.feature} eps ub [k={"%+d" % k}]', 1) + OPT_VARS.append(eps_ub) + self.OPT_LIST.append({'feature': objective.feature, 'info': 'ub', 'k': k}) + + # Xk + Xk = VARS_DICT[objective.feature][k] + + # lb / ub + lb_k = MX.sym(f'PAR {objective.feature} lb [k={"%+d" % k}]', 1) + ub_k = MX.sym(f'PAR {objective.feature} ub [k={"%+d" % k}]', 1) + PAR_VARS.append(lb_k) + PAR_VARS.append(ub_k) + self.PAR_LIST.append({'feature': objective.feature, 'info': 'lb', 'k': k}) + self.PAR_LIST.append({'feature': objective.feature, 'info': 'ub', 'k': k}) + + # constraints + self.add_constraint(Xk - lb_k + eps_lb, 0, inf) + self.add_constraint(Xk - ub_k + eps_ub, -inf, 0) + + # objective + obj.append((eps_lb / objective.norm) ** 2 * objective.weight) + obj.append((eps_ub / objective.norm) ** 2 * objective.weight) + + elif objective.feature.mode == 'steady': + + # target + target_k = MX.sym(f'PAR {objective.feature} target [k={"%+d" % k}]', 1) + PAR_VARS.append(target_k) + self.PAR_LIST.append({'feature': objective.feature, 'info': 'target', 'k': k}) + + # Xk + Xk = VARS_DICT[objective.feature][k] + + # objective + obj.append(((Xk - target_k) / objective.norm) ** 2 * objective.weight) + + + + else: + raise NotImplementedError(f'Mode {objective.feature.mode} is not implemented yet.') + + else: + + # Xk + Xk = VARS_DICT[objective.feature][k] + + # objective + if objective.cost_order == CostOrder.quadratic: + obj.append(((Xk - objective.weight_offset) / objective.norm) ** 2 * objective.weight) + elif objective.cost_order == CostOrder.linear: + obj.append(((Xk - objective.weight_offset) / objective.norm) ** 1 * objective.weight) + else: + print('Passed Cost Function is not implemented') + + + # -------------------------------- print nlp ------------------------------ + if print_nlp: + print('\n------------------------------- NLP SUMMARY -------------------------------\n') + fmt.print_lists(PAR_VARS, statement='PAR_VARS:') + fmt.print_lists(OPT_VARS, statement='OPT_VARS:') + fmt.print_lists(self.g, self.lbg, self.ubg, statement='CONSTRAINTS:') + fmt.print_lists(obj, statement='OBJECTIVES:') + print('\n------------------------------- NLP SUMMARY -------------------------------\n') + + # -------------------------------- create solver -------------------------- + + nlp = { + 'x': vertcat(*OPT_VARS), + 'f': sum(obj), + 'g': vertcat(*self.g), + 'p': vertcat(*PAR_VARS), + } + + + # save the controller + self.nlp_solver = nlpsol('solver', 'ipopt', nlp, self.solver_options) + + def add_constraint(self, constraint, lbg: float = 0.0, ubg: float = 0.0): + + self.g.append(constraint) + + self.lbg.append(lbg) + self.ubg.append(ubg) + + def get_par_vars(self, df): + + # calculate the par vars + t = df['SimTime'].iloc[-1] + + # get the par vars from the dicts + PAR_VARS = list() + for dct in self.PAR_LIST: + + feature = dct['feature'] + k = dct['k'] + info = dct['info'] + + if info == 'value': + + # extract the disturbances from the disturbances df + if feature.col_name in self.disturbances_df.columns: + PAR_VAR = self.disturbances_df.loc[self.disturbances_df['SimTime'] == t + self.dt * k, feature.col_name].values + + # extract the state vars from the actual simulation + else: + + # if the feature must be constructed, construct it. + if feature.col_name not in df.columns: + + if isinstance(feature, Constructed): + + df = feature.process(df.tail(self.max_lag+1).copy(deep=True)) + + else: + raise ValueError('Something went wrong.') + + + PAR_VAR = df.loc[df['SimTime'] == t + self.dt * k, feature.col_name].values + + assert len(PAR_VAR) != 0, f'Please provide sufficient Disturbance data! Error occured at t={t} {feature} {k} {info} {df}' + + PAR_VARS.append(PAR_VAR) + + elif info == 'lb': + + PAR_VAR_lb, PAR_VAR_ub = feature.get_bounds(t + self.dt * k) + PAR_VARS.append(PAR_VAR_lb) + + elif info == 'ub': + + PAR_VAR_lb, PAR_VAR_ub = feature.get_bounds(t + self.dt * k) + PAR_VARS.append(PAR_VAR_ub) + + elif info == 'target': + PAR_VAR_target = feature.get_target(t + self.dt * k) + PAR_VARS.append(PAR_VAR_target) + + else: + raise NotImplementedError() + + PAR_VARS = vertcat(*PAR_VARS) + + return PAR_VARS diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/__init__.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..176c98bf71c40525c1330dfe9c09b5d5ec21526d --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/__init__.py @@ -0,0 +1,7 @@ +from ddmpc.modeling.data_handling import * +from ddmpc.modeling.features import * +from ddmpc.modeling.keras_tuner import * +from ddmpc.modeling.modeling import * +from ddmpc.modeling.system_base_class import * +from ddmpc.modeling.training_networks import * +from ddmpc.modeling.systems import * \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/data_handling.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/data_handling.py new file mode 100644 index 0000000000000000000000000000000000000000..279641bcabe47848b5be5a3188a8268afa624bb5 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/data_handling.py @@ -0,0 +1,276 @@ +import pandas as pd +from ddmpc.utils.pickle_handler import write_pkl, read_pkl +from ddmpc.modeling.modeling import Model +from ddmpc.utils.plotting import Plotter +import ddmpc.utils.formatting as fmt + + +class DataContainer: + """ + The DataContainer stores training data and additional information. + """ + + def __init__( + self, + df: pd.DataFrame, + tag: str, + ): + """ + :param df: [pd.DataFrame] Simulated data. + :param tag: [Str] 'Training', 'Examples' or 'Validating'. + """ + + self.df = df + self._tag = tag + + def __str__(self): + return f'DataContainer({self.info})' + + def __repr__(self): + return f'DataContainer({self._tag})' + + @property + def info(self): + return f"Day {int(self.start_time/(60*60*24))} to {int(self.stop_time/(60*60*24))} - {self._tag}" + + @property + def tag(self): + return self._tag + + @tag.setter + def tag(self, value: str): + value = value.lower() + assert value in ['training', 'testing', 'validating', None] + self._tag = value + + @property + def start_time(self): + return self.df['SimTime'].iloc[0] + + @property + def stop_time(self): + return self.df['SimTime'].iloc[-1] + + @property + def duration(self): + return self.stop_time - self.start_time + + @property + def step_size(self): + return self.df['SimTime'].iloc[1] - self.df['SimTime'].iloc[0] + + @staticmethod + def merge_containers(containers: list, tag: str = None, directory: str = None): + """ + Merges the data frames from several data containers to a single DataFrame. + :param containers: List of DataContainers. + :param directory: directory to store the DataContainer. + :param tag: tag for the merged DataContainer + """ + + if tag is None: + tag = 'training' + + if directory is None: + directory = 'stored_data\\RawData' + + assert all(isinstance(container, DataContainer) for container in containers), \ + 'Please make sure to pass a list of DataContainers' + + # make sure stop and start time do match + for i in range(len(containers)-1): + + assert containers[i].stop_time == containers[i+1].start_time,\ + f'Stop time of container {containers[i]} (t={containers[i].stop_time}) ' \ + f'does not match start time of container {containers[i+1]} (t={containers[i].stop_time})' + + # make list with copies of the data frames + df_lst = list() + for container in containers: + + df = container.df.copy(deep=True) + df_lst.append(df) + + df = pd.concat(df_lst) + df = df.drop_duplicates(subset=['SimTime'], keep='first') + df = df.reset_index(drop=True) + + return DataContainer(df=df, tag=tag) + + def split_container( + self, + training_share: float = 0.5, + validating_share: float = 0.25, + testing_share: float = 0.25, + ) -> list: + """ + Splits a single DataContainer into three new DataContainers. + :param container: Initial DataContainer + :param testing_share: 0.0 - 1.0 + :param validating_share: 0.0 - 1.0 + :param training_share: 0.0 - 1.0 + """ + + assert training_share + validating_share + testing_share == 1, \ + 'Make sure training, testing and validation split add up to one.' + + # round up or down to the nearest multiplier of the step_size + first_split = round(len(self.df) * training_share) + second_split = round(len(self.df) * (training_share + validating_share)) + + # assign to new DataFrames + split_containers = list() + if training_share > 0: + training_container = DataContainer( + df=self.df.iloc[0:first_split + 1], + tag='training', + ) + split_containers.append(training_container) + + if validating_share > 0: + validating_container = DataContainer( + df=self.df.iloc[first_split:second_split + 1], + tag='validating' + ) + split_containers.append(validating_container) + + if testing_share > 0: + testing_container = DataContainer( + df=self.df.iloc[second_split:], + tag='testing', + ) + split_containers.append(testing_container) + + return split_containers + + def calculate_statistics(self, model: Model) -> dict: + """ + Returns a statistic dict with important benchmark information. + """ + statistics = dict() + + statistics['start_time'] = self.duration + statistics['stop_time'] = self.stop_time + statistics['duration'] = self.duration + + for feature in model.features: + + statistics[feature] = dict() + statistics[feature]['mean'] = self.df[feature.col_name].mean() + statistics[feature]['lb'] = self.df[feature.col_name].min() + statistics[feature]['ub'] = self.df[feature.col_name].max() + statistics[feature]['sum'] = self.df[feature.col_name].sum() + + for x in model.X: + + if f'{x.col_name} error_target' in self.df.columns: + + statistics[x]['target_mae'] = abs(self.df[f'{x.col_name} error_target']).mean() + statistics[x]['target_mse'] = (self.df[f'{x.col_name} error_target'] ** 2).mean() + + if f'{x.col_name} error_bounds' in self.df.columns: + statistics[x]['bounds_mae'] = abs(self.df[f'{x.col_name} error_bounds']).mean() + statistics[x]['bounds_mse'] = (self.df[f'{x.col_name} error_bounds'] ** 2).mean() + + if f'{x.col_name} solver_call' in self.df.columns: + statistics[x]['average_solver_call'] = self.df[f'{x.col_name} solver_call'].mean() + statistics[x]['minimum_solver_call'] = self.df[f'{x.col_name} solver_call'].min() + statistics[x]['maximum_solver_call'] = self.df[f'{x.col_name} solver_call'].max() + + return statistics + + def plot(self, plotter: Plotter, save_plot: bool = True, show_plot: bool = True): + """ + Plots the DataFrame. + """ + plotter.plot(df=self.df, name=self.info, save_plot=save_plot, show_plot=show_plot) + + +class DataHandler: + """ + Stores a list of DataContainers. + """ + + def __init__( + self, + containers: list = None, + directory: str = 'stored_data\\DataHandlers', + disturbances_directory: str = 'stored_data\\Disturbances', + + ): + """ + :param fmu: Instance of FMU + :param model: Instance of Model + :param plotter: Instance of Plotter + """ + + # containers + if containers is None: + containers = list() + self.containers = containers + + # directories + self.directory = directory + self.disturbances_directory = disturbances_directory + + def __str__(self) -> str: + + ret = f'{fmt.BOLD}DataHandler:{fmt.ENDC} \n' + if len(self.containers) == 0: + ret += '\tNone' + for container in self.containers: + ret += f'\t{container} \n' + + return ret + + def split_container( + self, + index: int, + training_share: float = 0.5, + validating_share: float = 0.25, + testing_share: float = 0.25, + ): + + # locate container to split + container_to_split = self.containers[index] + + # split the container + testing, training, validating = container_to_split.split_container( + training_share=training_share, + validating_share=validating_share, + testing_share=testing_share, + ) + + # append to + self.containers.extend([testing, training, validating]) + + # delete old container + del self.containers[index] + + # print data handler + print(self) + + def add_containers(self, *containers): + self.containers.extend(containers) + + def remove_container(self, index: int): + del self.containers[index] + + def clear(self): + """ + Clears the list with the DataContainers. + """ + del self.containers + self.containers = list() + + def save(self, filename: str, override: bool = False): + write_pkl(self, filename, self.directory, override) + + def add_container(self, data_container: DataContainer): + self.containers.append(data_container) + + +def load_DataHandler(filename: str, directory: str = 'stored_data\\DataHandlers') -> DataHandler: + dh = read_pkl(filename, directory) + print(dh) + return dh diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/features.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/features.py new file mode 100644 index 0000000000000000000000000000000000000000..17b7bc07d1036be2b09b1b40464d47b22f60628b --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/features.py @@ -0,0 +1,639 @@ +from ddmpc.utils.plotting import PlotOptions +from ddmpc.modeling.modeling import * + + +class Temperature(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions = None, + ): + + # standard plot options + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.red, + line=fmt.line_solid, + label=dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + +class Radiation(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions = None, + ): + + # standard plot options + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.light_red, + line=fmt.line_dotted, + label=dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + +class Price(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions = None, + ): + + # standard plot options + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.light_red, + line=fmt.line_dotted, + label=dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + +class MassFlow(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + temperature_in: Temperature, + temperature_out: Temperature, + cp: float = 4.18, + den: float = 1000, + plt_opts: PlotOptions = None, + ): + + # plot options + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.green, + line=fmt.line_solid, + label=dis_name, + ) + + # temperature + self.temperature_in = temperature_in + self.temperature_out = temperature_out + + # heat capacity + self.cp = cp + + # density + self.den = den + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + +class Percentage(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions = None, + ): + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.light_grey, + line=fmt.line_solid, + label=dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + +class HeatFlowMeas(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions = None, + ): + + # standard plot options + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.light_red, + line=fmt.line_dotted, + label=dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + +class PowerMeas(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions = None, + ): + + # standard plot options + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.light_red, + line=fmt.line_dotted, + label=dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + +class Time(BaseVariable): + + def __init__( + self, + var_name: str = 'SimTime', + dis_name: str = 'Time', + ): + + # plot options + plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + label = dis_name, + ) + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + +class Valve(Control): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions, + lb: float = 0.0, + ub: float = 1.0, + default: float = 0 + ): + """ + :param lb: lower bound + :param ub: upper bound + """ + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + lb=lb, + ub=ub, + default=default, + ) + +class RelPower(Control): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions, + lb: float = 0.0, + ub: float = 1.0, + default: float = 0, + ): + """ + :param lb: lower bound + :param ub: upper bound + """ + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + lb=lb, + ub=ub, + default=default, + ) + + +class HeatFlowSetPoint(Control): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions, + lb: float = 0, + ub: float = 10000, + default: float = 0, + ): + """ + :param lb: lower bound + :param ub: upper bound + """ + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + lb=lb, + ub=ub, + default=default + ) + + +class TemperatureSetPoint(Control): + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions, + lb: float = 273.15 + 15, + ub: float = 273.15 + 30, + default: float = 273.15 + 20, + ): + """ + :param lb: lower bound + :param ub: upper bound + """ + + # super call + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + lb=lb, + ub=ub, + default=default, + ) + + +class Change(Constructed): + """ + Used to calculate the change over time. + """ + def __init__( + self, + base_feature: Feature, + plt_opts: PlotOptions = None, + ): + + # feature to calculate the change + self.base_feature = base_feature + + # default plot options + self.plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + ) + + # super call + super().__init__( + name=f'{self.__class__.__name__}({self.base_feature})', + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + # make sure the feature is included in the columns + assert self.base_feature.col_name in df.columns, f'The feature {self.base_feature.col_name} is not included in the data frame.' + + # define the new feature + col_loc = df.columns.get_loc(self.base_feature.col_name) + 1 # next column + col_name = self.col_name + col_value = df[self.base_feature.col_name] - df[self.base_feature.col_name].shift(1) # change between last two values + + # insert the feature + df.insert(loc=col_loc, column=col_name, value=col_value) + + return df + + +class MovingSum(Constructed): + """ + Used to calculate the moving sum of a given Feature. + """ + def __init__( + self, + base_feature: Feature, + n: int, + plt_opts: PlotOptions = None, + ): + + # feature to calculate the change + self.base_feature = base_feature + + # n + self.n = n + + # default plot options + self.plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + ) + + # super call + super().__init__( + name=f'{self.__class__.__name__}({self.base_feature}, n={n})', + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + df[self.col_name] = df[self.base_feature.col_name].rolling(self.n).sum() + + return df + + +class MovingAverage(Constructed): + """ + Used to calculate the moving average of a given Feature. + """ + def __init__( + self, + base_feature: Feature, + n: int, + plt_opts: PlotOptions = None, + ): + # feature to calculate the change + self.base_feature = base_feature + + # n + self.n = n + + # default plot options + self.plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + ) + + # super call + super().__init__( + name=f'{self.__class__.__name__}({self.base_feature})', + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + df[self.col_name] = df[self.base_feature.col_name].rolling(self.n).mean() + + return df + + +class Subtraction(Constructed): + """ + Subtraction of two Features. + """ + def __init__( + self, + base_feature_one: Feature, + base_feature_two: Feature, + plt_opts: PlotOptions = None, + ): + + # feature to calculate the change + self.base_feature_one = base_feature_one + self.base_feature_two = base_feature_two + + # default plot options + self.plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + ) + + # super call + super().__init__( + name=f'{self.__class__.__name__}({self.base_feature_one} minus {self.base_feature_two})', + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + df[self.col_name] = df[self.base_feature_one.col_name] - df[self.base_feature_two.col_name] + + return df + + +class Addition(Constructed): + """ + Addition of two Features. + """ + def __init__( + self, + base_feature_one: Feature, + base_feature_two: Feature, + plt_opts: PlotOptions = None, + ): + + # feature to calculate the change + self.base_feature_one = base_feature_one + self.base_feature_two = base_feature_two + + # default plot options + self.plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + ) + + # super call + super().__init__( + name=f'{self.__class__.__name__}({self.base_feature_one} plus {self.base_feature_two})', + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + df[self.col_name] = df[self.base_feature_one.col_name] + df[self.base_feature_two.col_name] + + return df + +class Product(Constructed): + """ + Multiplication of two Features. + """ + def __init__( + self, + base_feature_one: Feature, + base_feature_two: Feature, + plt_opts: PlotOptions = None, + ): + + # feature to calculate the change + self.base_feature_one = base_feature_one + self.base_feature_two = base_feature_two + + # default plot options + self.plt_opts = PlotOptions( + color=fmt.black, + line=fmt.line_solid, + ) + + # super call + super().__init__( + name=f'{self.__class__.__name__}({self.base_feature_one} times {self.base_feature_two})', + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + df[self.col_name] = df[self.base_feature_one.col_name] * df[self.base_feature_two.col_name] + + return df + +class PeriodicTime(Constructed): + """ + Periodic function of time. + """ + def __init__( + self, + name: str, + time: Time, + function: np.ufunc, + frequency: int, + plt_opts: PlotOptions = None, + ): + + # settings + self.time = time + self.function = function + self.frequency = frequency + + # super call + super().__init__( + name=name, + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + # make sure the feature is included in the columns + assert self.time.col_name in df.columns, 'The feature SimTime is not included in the data frame.' + + # define the new feature + col_loc = df.columns.get_loc(self.time.col_name) + 1 # next column + col_name = self.col_name + col_value = self.function(2 * np.pi * df[self.time.col_name] / self.frequency) # change between last two values + + # insert the feature + df.insert(loc=col_loc, column=col_name, value=col_value) + + return df + + +class EnergyBalance(Constructed): + """ + Used to calculate energy consumption via MassFlows. + """ + def __init__(self, + name: str, + flows: list, + plt_opts: PlotOptions = None, + ): + + # check, that all flows are of type MassFlow + assert all([isinstance(feature, MassFlow) for feature in flows]) + + # flows + self.flows = flows + + super().__init__( + name=name, + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + + # calculate the energy balance + df[self.col_name] = sum([df[feature.var_name] * + (df[feature.temperature_in.var_name] - df[feature.temperature_out.var_name]) * + feature.cp * + feature.den + for feature in self.flows]) + + return df + + +class LowerBound(Constructed): + + def __init__(self, base_feature: Controlled, plt_opts: PlotOptions = None): + self.base_feature = base_feature + + name = f'{self.base_feature.col_name}_ub' + + if plt_opts is None: + plt_opts = PlotOptions(color=fmt.black, line=fmt.line_solid) + + super(LowerBound, self).__init__( + name=name, + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + return df + + +class UpperBound(Constructed): + + def __init__(self, base_feature: Controlled, plt_opts: PlotOptions = None): + self.base_feature = base_feature + + name = f'{self.base_feature.col_name}_ub' + + if plt_opts is None: + plt_opts = PlotOptions(color=fmt.black, line=fmt.line_solid) + + super(UpperBound, self).__init__( + name=name, + plt_opts=plt_opts, + ) + + def process(self, df: pd.DataFrame) -> pd.DataFrame: + return df diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/keras_tuner.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/keras_tuner.py new file mode 100644 index 0000000000000000000000000000000000000000..084467d90294e44c108af034b236f006f94c795f --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/keras_tuner.py @@ -0,0 +1,143 @@ +import random +import re + +from keras.layers import Dense, BatchNormalization, Rescaling +from keras import Sequential + + +class TunerLayer: + + def __init__(self, optional: bool = True): + + self.optional = optional + + def build_keras_layer(self): + raise NotImplementedError() + + +class TunerDense(TunerLayer): + + def __init__(self, units: tuple = None, activations: tuple = None, optional: bool = False): + """ + :param units: Tuple with the number of neurons the layer can have. Default = (8, 16,) + :param activations: Tuple with activation functions to pick from. Default = ('sigmoid',) + :param optional: Is the layer optional? + """ + super().__init__(optional=optional) + + # default of 8 or 16 neurons + if units is None: + units = (8, 16,) + + # default activation is sigmoid + if activations is None: + activations = ('sigmoid',) + + self.units = units + self.activations = activations + + def build_keras_layer(self): + + units = random.choice(self.units) + activation = random.choice(self.activations) + + return Dense(units=units, activation=activation) + + +class TunerBatchNormalizing(TunerLayer): + + def __init__(self, axis: int = 1, optional: bool = False): + + super().__init__(optional=optional) + + self.axis = axis + + def build_keras_layer(self): + + return BatchNormalization(axis=self.axis) + + +class TunerRescaling(TunerLayer): + + def __init__(self, scale: float, offset: float, optional: bool = False): + + super().__init__(optional=optional) + + self.scale = scale + self.offset = offset + + def build_keras_layer(self): + + return Rescaling(scale=self.scale, offset=self.offset) + + +class TunerModel: + """ + Blueprint for a Sequential Keras model. + Layers can be made optional by setting optional to True. + """ + + def __init__( + self, + *layers: TunerLayer, + name: str, + optimizer: str = 'adam', + loss: str = 'mse', + ): + + self.layers = layers + self.optimizer = optimizer + self.loss = loss + + # check if the name is valid + assert re.match("^[A-Za-z0-9_-]*$", name), 'Please make sure you set a valid TunerModel name.' \ + 'Allowed characters: A-Z, a-z, 0-9, _, -' + self.name = name + + def __str__(self): + return f'TunerModel(name={self.name}, ' \ + f'optimizer={self.optimizer}, ' \ + f'loss={self.loss}, ' \ + f'max_layers={self.max_layers}, ' \ + f'min_layers={self.min_layers})' + + def __repr__(self): + return f'TunerModel(name={self.name}))' + + @property + def max_layers(self): + return len(self.layers) + + @property + def min_layers(self): + return len([layer for layer in self.layers if layer.optional == False]) + + def build_sequential(self) -> Sequential: + + # create random ann id + ann_id = random.randint(1000, 9999) + + # ann name + name = f'{self.name}_{ann_id}' + + # create sequential keras model + keras_model = Sequential(name=name) + + # iterate over every layer + for layer in self.layers: + + # check if the layer is optional and maybe skip it + if layer.optional and random.getrandbits(1): + continue + + # add layer + keras_model.add(layer.build_keras_layer()) + + # output layer + keras_model.add(Dense(units=1, activation='linear')) + + # compile the model + keras_model.compile(optimizer=self.optimizer, loss=self.loss) + + + return keras_model diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/modeling.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/modeling.py new file mode 100644 index 0000000000000000000000000000000000000000..9fd922b799257f229e6c30c1a6f46f0562339dfe --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/modeling.py @@ -0,0 +1,551 @@ +from ddmpc.utils.plotting import PlotOptions +from ddmpc.utils import formatting as fmt +from abc import abstractmethod +import pandas as pd +import numpy as np +import random + + +class Feature: + """ + Abstract representation of one variable. + There are two types of Features: + + -> BaseVariable + -> Constructed + + Every Feature consists of a name and plot options. + """ + + def __init__( + self, + name: str, + plt_opts: PlotOptions = None, + ): + """ + :param name: Representative name. + :param plt_opts: Holds information for the plotting of this feature. + """ + if plt_opts is None: + plt_opts = PlotOptions( + color=fmt.red, + line=fmt.line_solid, + ) + + if plt_opts.label is None: + plt_opts.label = name + + self.name = name.replace(" ", "_") + self.plt_opts = plt_opts + + def __str__(self): + return self.name + + def __repr__(self): + return self.name + + def __eq__(self, other): + if isinstance(other, Feature): + return object and hash(self) == hash(other) + else: + return False + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return hash(self.name) + + @property + def is_base_variable(self): + if isinstance(self, BaseVariable): + return True + else: + return False + + @property + def is_constructed(self): + if isinstance(self, Constructed): + return True + else: + return False + + @property + def is_control(self): + if isinstance(self, Control): + return True + else: + return False + + @property + def is_controlled(self): + if isinstance(self, Controlled): + return True + else: + return False + + @property + @abstractmethod + def col_name(self): + pass + + +class BaseVariable(Feature): + """ + BaseVariables represent a variable from the FMU file in Python. + The var_name must match the variable name in the FMU. + BaseVariable objects inherit from Feature. + """ + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions, + ): + self.var_name = var_name + self.dis_name = dis_name + + super().__init__( + name=f'{self.__class__.__name__}({dis_name})', + plt_opts=plt_opts, + ) + + @property + def col_name(self): + return self.var_name + + +class Constructed(Feature): + """ + Every Feature that is not contained in the FMU file but should be included in the MPC is from the type Constructed. + Constructed objects inherit from Feature. + """ + def __init__( + self, + name: str, + plt_opts: PlotOptions + ): + super().__init__( + name=name, + plt_opts=plt_opts, + ) + + @property + def col_name(self): + return self.name + + @abstractmethod + def process(self, df: pd.DataFrame) -> pd.DataFrame: + pass + + +class Controlled(BaseVariable): + """ + Feature that will be controlled by the Controllers. + """ + + def __init__( + self, + var_name: str, + dis_name: str, + plt_opts: PlotOptions, + + mode: str = 'steady', + + day_start: int = 8, + day_end: int = 16, + day_target: float = 273.15 + 20, + night_target: float = 273.15 + 18, + day_lb: float = 273.15 + 19, + night_lb: float = 273.15 + 16, + day_ub: float = 273.15 + 21, + night_ub: float = 273.15 + 24, + random_step_size: int = 60 * 60 * 2, + + ): + + """ + :param mode: [str] 'steady', 'random' or 'economic'. + :param day_start: [int] Time at which the day starts. + :param day_end: [int] Time at which the day ends. + :param day_target: [float] Target value day. + :param night_target: [float] Target value night. + :param day_lb: [float] Lower bound day. + :param night_lb: [float] Lower bound night. + :param day_ub: [float] Upper bound day. + :param night_ub: [float] Upper bound night. + """ + + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + # target type + self.mode = mode + + # settings + self.day_start = day_start + self.day_end = day_end + self.day_target = day_target + self.night_target = night_target + self.day_lb = day_lb + self.night_lb = night_lb + self.day_ub = day_ub + self.night_ub = night_ub + self.random_step_size = random_step_size + + # current values + self.current_time = None # current time of the simulation + self.current_target = None # current target trajectory + self.current_error = None # current error to either the target trajectory or the bounds + self.current_delta = None # current delta between this and last step + + # data frame, that keeps track of the trajectory and bounds + self.df: pd.DataFrame = pd.DataFrame() + + @property + def mode(self): + """ + 'steady' -> follows the day_target at day and night_target at night. + 'random' -> follows a random step function. + 'economic' -> keeps the temperature in range of the comfort bounds. + """ + return self._mode + + @mode.setter + def mode(self, mode): + modes = ['random', 'steady', 'economic'] + assert mode in modes, f'{mode} is not a valid mode. Please choose from {modes}' + self._mode = mode + + def add_sub_features(self, df: pd.DataFrame) -> pd.DataFrame: + + # replace column name with right names + self.df.columns = ['SimTime'] + [f'{self.col_name}_{col}' for col in self.df.columns if col is not 'SimTime'] + + # merge the data frames + df = pd.merge(df, self.df, on='SimTime') + + # return merged data frame + return df + + def update(self, df: pd.DataFrame): + """ + This function updates the current values + :param df: [pd.DataFrame] DataFrame with the latest simulation results + :param col_name: [str] Column name of the regular variable + """ + + # current time + self.current_time = df['SimTime'].iloc[-1] + + # get the row with the current time + current_row = self.df['SimTime'] == self.current_time + + # actual value + actual_value = df[self.col_name].iloc[-1] + self.df.loc[current_row, 'actual'] = actual_value + + # delta between last and current step + self.current_delta = df[self.col_name].iloc[-2] - df[self.col_name].iloc[-1] + + if self._mode == 'economic': + + # error bounds + lb = float(self.df.loc[current_row, 'lb']) + ub = float(self.df.loc[current_row, 'ub']) + + error_bounds = -max(min(0, actual_value - lb), max(0, actual_value - ub), key=abs) + self.df.loc[current_row, 'error_bounds'] = error_bounds + + self.current_error = float(error_bounds) + + else: + + # error_target + error_target = self.df.loc[current_row, 'target'] - actual_value + self.df.loc[current_row, 'error_target'] = error_target + + self.current_error = float(error_target) + + def plan_simulation(self, start_time: int, stop_time: int, step_size: int): + """ + This function generates a DataFrame, in which the trajectory and bounds are stored. + This happens before the simulation acually starts. + + :param start_time: Start time of the simulation. + :param stop_time: Stop time of the simulation. + :param step_size: Step size of the simulation. + """ + + del self.df + self.df = pd.DataFrame() + + df = pd.DataFrame() + + # setup + df['SimTime'] = np.arange(start_time, stop_time + 1, step_size) + df['total_hours'] = np.floor(df['SimTime'] / (60 * 60)) + 1 + df['toal_days'] = np.floor(df['SimTime'] / (60 * 60 * 24)) + 1 + df['total_weeks'] = np.floor((df['toal_days'] - 1) / 7) + 1 + df['is_weekend'] = df['toal_days'] - (df['total_weeks'] - 1) * 7 > 5 + + # boolean + df['day'] = (self.day_start < df['total_hours'] - (df['toal_days'] - 1) * 24) & (df['total_hours'] - (df['toal_days'] - 1) * 24 <= self.day_end) + df['working'] = (df['day'] & (df['is_weekend'] == False)) + + # bounds + df['lb'] = np.where(df['day'] & (df['is_weekend'] == False), self.day_lb, self.night_lb) + df['ub'] = np.where(df['day'] & (df['is_weekend'] == False), self.day_ub, self.night_ub) + + # target + df['steady_target'] = np.where(df['day'] & (df['is_weekend'] == False), self.day_target, self.night_target) + df['random_target'] = 0 + + # empty columns + df['target'] = np.nan + df['actual'] = np.nan + df['error_target'] = np.nan + df['error_bounds'] = np.nan + df['solver_call'] = np.nan + + # generates a random step function within the comfort bounds + time_counter = np.inf + for i in range(0, len(df) - 1): + if time_counter > self.random_step_size or not (df.loc[i, 'lb'] <= df.loc[i, 'random_target'] <= df.loc[i, 'ub']): + time_counter = 0 + df.loc[i, 'random_target'] = random.uniform(df.loc[i, 'lb'], df.loc[i, 'ub']) + df.loc[i + 1, 'random_target'] = df.loc[i, 'random_target'] + time_counter += step_size + + # delete used columns + del df['day'] + del df['working'] + del df['is_weekend'] + del df['total_hours'] + del df['toal_days'] + del df['total_weeks'] + + # write target type + df['target_type'] = self._mode + + # write actual target + if self._mode != 'economic': + df['target'] = df[f'{self._mode}_target'] + + self.df = df + + def get_bounds(self, time: int): + """ + Returns the bounds for a given point in time. + """ + + assert self.df is not None,\ + f'Please call "plan_simulation" for feature {self} before running the simulation.' + + lb = self.df.loc[self.df['SimTime'] == time, 'lb'].values + ub = self.df.loc[self.df['SimTime'] == time, 'ub'].values + + if len(lb) == 0: + lb = self.night_lb + if len(ub) == 0: + ub = self.night_ub + + return lb, ub + + def get_target(self, time: int): + """ + Returns the target for a given point in time. + """ + + assert self.df is not None,\ + 'Please call "plan_simulation" before simulating.' + + target = self.df.loc[self.df['SimTime'] == time, 'target'].values + + if len(target) == 0: + target = self.night_target + + return target + + +class Control(BaseVariable): + + def __init__( + self, + var_name: str, + dis_name: str, + lb: float, + ub: float, + default: float, + plt_opts: PlotOptions, + ): + super().__init__( + var_name=var_name, + dis_name=dis_name, + plt_opts=plt_opts, + ) + + self.lb = lb + self.ub = ub + + self.default = default + + def correct_bounds(self, value: float): + + if value < self.lb: + return self.lb + elif value > self.ub: + return self.ub + else: + return value + + +class Model: + """ + This Cass represents the FMU Model in Python. + It stores all Features. + """ + def __init__( + self, + t: Feature, + X: tuple, + U: tuple, + D: tuple, + C: tuple, + T: tuple, + ): + """ + This Cass represents the variables of the fmu file in Python. + :param X: State + :param U: Controlled + :param D: Disturbances + :param C: Constructed + :param T: Tracked + """ + + # tuples with features + self.t = (t,) + self.X = X + self.U = U + self.D = D + self.C = C + self.T = T + + # check for duplicates + duplicates = [feature for n, feature in enumerate(self.features) if feature in self.features[:n]] + assert len(duplicates) == 0,\ + f'Dublicates:\n' \ + f'\t{duplicates}\n' \ + f'\t{[f.name for f in duplicates]}\n' \ + f'\t{[f for f in duplicates]}' + + # print the model + print(self) + + def __str__(self): + + rows = [['\t', '', 'name', 'is_control', 'is_constructed', 'is_base_variable', 'is_controlled']] + rows += [['\t', 'X', f.name, f.is_control, f.is_constructed, f.is_base_variable, f.is_controlled] for f in self.X] + rows += [['\t', '']] + rows += [['\t', 'U', f.name, f.is_control, f.is_constructed, f.is_base_variable, f.is_controlled] for f in self.U] + rows += [['\t', '']] + rows += [['\t', 'D', f.name, f.is_control, f.is_constructed, f.is_base_variable, f.is_controlled] for f in self.D] + rows += [['\t', '']] + rows += [['\t', 'C', f.name, f.is_control, f.is_constructed, f.is_base_variable, f.is_controlled] for f in self.C] + rows += [['\t', '']] + rows += [['\t', 'T', f.name, f.is_control, f.is_constructed, f.is_base_variable, f.is_controlled] for f in self.T] + + print(f'{fmt.BOLD}Model:{fmt.ENDC}') + fmt.print_table(rows=rows) + + return '' + + def __repr__(self): + return f'Model' + + def __contains__(self, item): + return item in self.features + + @property + def features(self): + return self.t + self.X + self.U + self.D + self.C + self.T + + @property + def names(self) -> list: + return [f.name for f in self.features] + + @property + def col_names(self) -> list: + """ + Returns a list with the col_names of all features. + """ + return [f.col_name for f in self.features] + + @property + def var_names(self) -> list: + """ + Returns a list with the var_names of every BaseVariables in the Model. + """ + return [f.var_name for f in self.features if isinstance(f, BaseVariable)] + + @property + def controlled(self) -> list: + return [feature for feature in self.features if isinstance(feature, Controlled)] + + @property + def controls(self) ->list: + return [feature for feature in self.features if isinstance(feature, Control)] + + @property + def constructed(self) -> list: + return [feature for feature in self.features if feature.is_constructed] + + @property + def base_variables(self) -> list: + return [feature for feature in self.features if isinstance(feature, BaseVariable)] + + def feature_creation(self, df: pd.DataFrame, copy: bool = False) -> pd.DataFrame: + """ + Creates all Constructed Features. + :param df: DataFrame with all BaseFeatures. + :param copy: Should the returned DataFrame be copy of the initial DataFrame? + :return: DataFrame with all Base and Constructed Features + """ + + constructed_features = [feature for feature in self.features if feature.is_constructed] + + if copy: + df = df.copy(deep=True) + + # create the features + for feature in constructed_features: + + feature: Constructed + + df = feature.process(df) + + return df + + def plan_simulation(self, start_time: int, stop_time: int, step_size: int): + """initialize data frames of the controlled variables""" + for y in self.controlled: + y.plan_simulation(start_time=start_time, stop_time=stop_time, step_size=step_size) + + def add_controlled_data_to_df(self, df: pd.DataFrame) -> pd.DataFrame: + + # add simulation plan to df + for controlled in self.controlled: + df = controlled.add_sub_features(df=df) + + return df + + def get_feature_by_name(self, name: str): + + for feature in self.features: + if name in feature .name: + return feature + + raise ValueError(f'Did not find feature with name {name}.') diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/system_base_class.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/system_base_class.py new file mode 100644 index 0000000000000000000000000000000000000000..2fa32e2bf1e864829e35b4859fa333f45d3d52f1 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/system_base_class.py @@ -0,0 +1,303 @@ +import pandas as pd +from abc import ABC, abstractmethod +from pathlib import Path +from ddmpc.modeling.data_handling import DataContainer +from ddmpc.modeling.modeling import Model +from ddmpc.modeling.training_networks import NetworkTrainer +from ddmpc.utils.plotting import Plotter + +""" +ToDo: - implement BOPTESTsystem + - implement ENERGYMsystem + - implement REALsystem + - The MPC modul should get a Trigger for recreation after retraining + - The run method is only implemented in the simulator class. This method should be initialized with a DataFrame to avoid the writing default values after retraining +""" + + +class System(ABC): + """ + Implements abstract system class to allow a modular access to the controller developement + Contains the relevant functions to interact with a system. The controller should be passed in the simulator class. + """ + + def __init__(self, + system_name: str, + directory: Path, + step_size: int, + model: Model): + """ + Initialize System, e.g. load relevant information + :param system_name: Identifier of the System + :param directory: Directory to load + :param step_size: Step_size of the system + :param model: Ontology of the system, passed as model class + """ + + # Pass initial values + self.system_name = system_name + self.directory = directory + self.step_size = step_size + self.model = model + + # times + self.start_time = None + self.stop_time = None + self.current_time = None + + + def __str__(self): + ret = f'{self.__class__}\n' + ret += f'\tstep_size = {self.step_size}s \n' + ret += f'\tsystem_name = "{self.system_name}" \n' + return ret + + @abstractmethod + def setup(self, **kwargs): + """ + Setup the system, e.g. load and initialize fmu, initialize communication to real system + (this Method is not generic and needs to be adapted for each system and called before the simulation) + :return: + """ + ... + + + @abstractmethod + def close(self): + """ + Close the system e.g. close fmu or connection / shut down docker container + :return: + """ + + @abstractmethod + def do_step(self) -> bool: + """ + In this method on simulation step is performed (in a real system we just wait for x-sec) + system time is updated + :return: + """ + ... + + @abstractmethod + def read_values(self,var_names:list) -> dict: + """ + Read Values from System and return DataFrame + :return: + """ + ... + + @abstractmethod + def write_values(self,control_dict:dict): + """ + Write control values to system + :return: + """ + ... + + @abstractmethod + def get_forecast(self, + n: int, + sampling_time: int, + meas_df: pd.DataFrame) -> pd.DataFrame: + """ + get disturbance forecast (weather etc.) + :param meas_df: measurements from before to take lags into account + :param n: Prediction Horizon of the forecast + :param sampling_time: sampling time of the forecast in s + :return: pd.DataFrame of forecast + """ + ... + + @abstractmethod + def get_system_time(self): + """ + Return the time of the system (Data type needs to be refined) + :return: + """ + ... + + @property + def output_names(self)->list: + """ + Return list of outputs + :return: + """ + return [] + + +class Simulator: + """ + Run simulation or experiments with given controller and system, Retrain Networks if possible + """ + + def __init__(self, + system:System, + plotter:Plotter): + """ + Initialize Simulator with given System + :param System: + """ + self.system = system + self.plotter = plotter + self.control_dict={} + for control in self.system.model.controls: + self.control_dict.update({control.col_name: control.default}) + + self.last_df = pd.DataFrame() + + def __str__(self): + return f'Simulator(System={self.system.system_name})' + + def run(self, + controllers, + duration: int, + save_plot: bool = True, + show_plot: bool = True, + show_time: bool = True, + tag: str = None + ): + """ + Run simulation / experiment with given properties + :param controllers: Tuple of controllers to be used + :param duration: duration of the experiment + :param save_plot: should the plot be saved? + :param show_plot: should the plot be shown? + :return: + """ + # assertions + assert self.system is not None,\ + 'Please make sure to call the function "setup()" first.' + + for controller in controllers: + assert self.system.step_size <= controller.dt,\ + f'Please make sure the dt of the controller (dt={controller.dt})' \ + f' is greater or equal to the step_size of the fmu (step_size={self.system.step_size}).' + assert controller.dt % self.system.step_size == 0,\ + f'The dt of the controller (dt={controller.dt}) ' \ + f'must be multiple of the step_size of the fmu (step_size={self.system.step_size}).' + + # update start and stop time + self.system.start_time = self.system.current_time + self.system.stop_time = self.system.current_time + duration + # write default values + self.system.write_values(self.control_dict) + # plan the simulation + self.system.model.plan_simulation(start_time=self.system.start_time, stop_time=self.system.stop_time, step_size=self.system.step_size) + + # initialize data frame + if self.last_df.empty: + df = pd.DataFrame(self.system.read_values(self.system.output_names), columns=['SimTime', *self.system.output_names], index=[0]) + else: + df = self.last_df + + # simulation loop + while self.system.do_step(): + + if self.system.current_time % self.system.step_size == 0: + + # print time + if show_time: + display_time(self.system.current_time, + self.system.system_name) + + # get the current state of the System + df = df.append(pd.DataFrame(self.system.read_values(self.system.output_names), index=[0]), ignore_index=True) + + # update the target and bounds dataframe + for y in self.system.model.controlled: + y.update(df=df) + + # calculate the controls and write them + for controller in controllers: + + if self.system.current_time % controller.dt == 0: + controller.set_disturbances(self.system.get_forecast(n=controller.N, + sampling_time=controller.dt, + meas_df=df)) + # calculate the controls + controls = controller(df) + + # add the controls to the control dictionary + for key, value in controls.items(): + self.control_dict.update({key: value}) + + self.system.write_values(self.control_dict) + + # delete last row to append last row with valid control + df.drop(df.tail(1).index, inplace=True) + + # read variables and add to the data frame + df = df.append(pd.DataFrame(self.system.read_values(self.system.output_names), index=[0]), ignore_index=True) + + # end line + print('\n') + self.last_df = df.copy(deep=True) + # remove data before the start_time + df = df.loc[self.system.start_time <= df['SimTime']] + + # feature creation + df = self.system.model.feature_creation(df=df) + + # add simulation plan data to df (bounds, error bounds, ...) + df = self.system.model.add_controlled_data_to_df(df=df) + + # create DataContainer + dc = DataContainer(df=df, tag=tag) + + # plotting via Plotter + dc.plot(plotter=self.plotter, save_plot=save_plot, show_plot=show_plot) + + # add to the DataHandler + return dc + + def retrain_anns(self, + containers: list, + network_trainer: NetworkTrainer, + epochs: int = 100, + batch_size: int = 50, + clear_data: bool = True): + """ + + :param containers: + :param network_trainer: + :param epochs: + :param batch_size: + :param clear_data: + :return: + """ + + # online learning + if clear_data: + network_trainer.clear_data() + network_trainer.load_data(containers=containers) + network_trainer.train_ann(epochs=epochs, batch_size=batch_size) + network_trainer.test_ann() + + def set_last_df(self, last_df: pd.DataFrame): + """ + sets raw DataFrame with former simulation results + """ + self.last_df = last_df + + + +def display_time(seconds:int, system_name:str): + result = [] + if seconds % 60 == 0: + for name, count in (('weeks', 604800), # 60 * 60 * 24 * 7 + ('days', 86400), # 60 * 60 * 24 + ('hours', 3600), + ('minutes', 60), + ): + value = seconds // count + if value: + seconds -= value * count + if value == 1: + name = name.rstrip('s') + result.append("{} {}".format(value, name)) + result = ' - '.join(result) + print(f'\r\tSimulating {system_name}: {result}', end='',) + + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/__init__.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2fc1283ac810594bd47d5ba57a94758baa0c8910 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/__init__.py @@ -0,0 +1,3 @@ +from ddmpc.modeling.systems.fmu_system import * +from ddmpc.modeling.systems.boptest_system import * +from ddmpc.modeling.systems.energym_system import * \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/boptest_system.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/boptest_system.py new file mode 100644 index 0000000000000000000000000000000000000000..5ae9786029a6eadc30a8e948517cb9929f9509cf --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/boptest_system.py @@ -0,0 +1,222 @@ +import shutil +import requests +import numpy as np +import pandas as pd +from os.path import isfile +from pathlib import Path +from urllib.parse import urljoin +from abc import ABC, abstractmethod +from ddmpc.modeling.modeling import Model, Constructed +from ddmpc.modeling.system_base_class import System, display_time +from ddmpc.utils.pickle_handler import write_pkl, read_pkl + + +class BOPTESTSystem(System): + """ + This Boptest class implements functionalities to interact with the Boptest-base Framework + (To interact with the Boptest-Service Branch the functionalities need to be extended) + """ + + def __init__(self, + model: Model, + step_size: int, + url: str, + name: str, + directory: Path = Path('stored_data', 'boptest') + ): + """ + Initialize Boptest System, get list of inputs and measurements, set step size + :param model: ontology model of the Problem + :param step_size: time step size of one simulation step + :param url: url and port where the boptest framework is hosted + :param name: name of the experiment (gets added to the boptest testcase) + :param directory: directory to store additional information + """ + # set up super + self.url = url + testcase = requests.get(url=urljoin(self.url, 'name')).json()['name'] + super().__init__(system_name=testcase + name, + directory=directory, + step_size=step_size, + model=model) + # get variable lists + self.inputs_meta = requests.get(url=urljoin(url, 'inputs')).json() + self.outputs_meta = requests.get(url=urljoin(url, 'measurements')).json() + self._input_names = list(self.inputs_meta.keys()) + self._forecast_keys = list(self._get_forecast_keys()) + self._output_names = list(self.outputs_meta.keys())+self._forecast_keys + + # set step size + new_step_size = {'step': self.step_size} + requests.put(url=urljoin(url, 'step'), data=new_step_size) + + # initialize controls and measurements + self.measurement_dict = {} + self.input_dict = {} # could also be filled with the activation variables at the beginning + + # initialize parameter dict for forecast + self.forecast_param = {} + + def setup(self, start_time: int, warmup_period: int, scenario: dict = None): + """ + Set up the simulation with a defined start time, warmup_period and a scenario. + If a scenario is given, the start time will be overwritten by the start time defined in the scenario + :param warm_up_time: simulation time of the system with a base controller before the start + :param scenario: dict with a given simulation scenario {'electricity_price':,'time_period':} + :param start_time: start time of the simulation in s + :return: + """ + init_params = {'start_time': start_time, + 'warmup_period': warmup_period} + self.measurement_dict = requests.put(url=urljoin(self.url, 'initialize'), data=init_params).json() + + if scenario is not None: # if a scenario is available it is set. This step overwrites the start time + ret = requests.put(urljoin(self.url, 'scenario'), data=scenario).json() + self.measurement_dict = ret['time_period'] + + self.scenario = requests.get(url=urljoin(self.url, 'scenario')).json() + self.current_time = self.measurement_dict['time'] + self.start_time = self.current_time + + def do_step(self) -> bool: + """ + Perform one simulation step by calling the advance endpoint of the boptest api. Simulation is stopped if either + the stop time is reached or if the scenario is finished (signalised by passing an empty dataframe). Update + measurements by the return of the function + :return: + """ + if self.current_time < self.stop_time: + y = requests.post(urljoin(self.url, 'advance'), self.input_dict).json() + if y: + self.measurement_dict.update(y) + self.current_time = self.measurement_dict['time'] + return True + else: + return False + else: + return False + + + def write_values(self, control_dict: dict): + """ + just update control dict with new inputs + :param control_dict: + :return: + """ + self.input_dict.update(control_dict) + + def read_values(self, var_names: list) -> dict: + """ + update SimTime in measurement dict + :param var_names: + :return: + """ + self.measurement_dict.update({'SimTime': + self.measurement_dict['time']}) + forecast_dict = requests.get(urljoin(self.url, 'forecast')).json() + for key in self._forecast_keys: + self.measurement_dict.update({key:forecast_dict[key][0]}) + + return self.measurement_dict + + + + def get_system_time(self): + """ + Return current system time + :return: + """ + return self.current_time + + def _get_forecast_keys(self): + """ + Returns List of Forecast parameters + :return: + """ + return list(requests.get(urljoin(self.url, 'forecast')).json().keys()) + + def get_forecast(self, + n: int, + sampling_time: int, + meas_df:pd.DataFrame) -> pd.DataFrame: + """ + call forecast endpoint + transformation to pd + :param N: + :param sampling_time: + :return: + """ + + if not self.forecast_param: + self.forecast_param.update({'horizon': n*sampling_time, + 'interval': sampling_time}) + requests.put(urljoin(self.url, 'forecast_parameters'), data=self.forecast_param) + + forecast_raw = requests.get(urljoin(self.url, 'forecast')).json() + pd_boptest = pd.DataFrame(data=forecast_raw) + forecast = pd.DataFrame() + backcast = pd.DataFrame() + + for feature in self.model.D: + if feature.is_constructed == False: + key = feature.col_name + backcast[key] = meas_df[key] + forecast[key] = pd_boptest[key] + forecast['SimTime'] = pd_boptest['time'] + backcast['SimTime'] = meas_df['SimTime'] + + forecast.drop(forecast.head(1).index,inplace=True) + forecast = pd.concat([backcast,forecast],ignore_index=True) + forecast.index = forecast['SimTime'] + + # Construct features + for feature in self.model.D: + if feature.is_constructed: + feature: Constructed + forecast = feature.process(forecast) + + return forecast + + def close(self): + """ + :return: + """ + print('Disconnected to Boptest') + + @property + def output_names(self) -> list: + """ + Return list of outputs + :return: + """ + return self._output_names + + def get_results(self): + """ + Create Pandas DataFrame with complete Simulation Results + :return: + """ + df_res = pd.DataFrame() + for datapoint in self._output_names: + res_req = {'point_name': datapoint, + 'start_time': -np.inf, + 'final_time': np.inf} + res = requests.put(url=urljoin(self.url, 'results'), data=res_req).json() + df_res = pd.concat((df_res, pd.DataFrame(data=res[datapoint], + index=res['time'], columns=[datapoint])), axis=1) + return df_res + + def get_kpis(self): + """ + Get KPIs at the end of the Simulation + :return: + """ + return requests.get(url=urljoin(self.url, 'kpi')).json() + + def activate_ctrl_layer(self,base_ctrl:dict): + """ + In Boptest the controlled layer needs to be defined. Therefore we use this function to activate first. + ToDo: is there a better way to deal with this? + :param base_ctrl: + :return: + """ + self.input_dict.update(base_ctrl) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/energym_system.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/energym_system.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/fmu_system.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/fmu_system.py new file mode 100644 index 0000000000000000000000000000000000000000..26a6ac3c944d87978d3ffdb9e9dda9954d15daa8 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/systems/fmu_system.py @@ -0,0 +1,376 @@ +import shutil +import fmpy +import fmpy.fmi2 +import pandas as pd +from os.path import isfile +from pathlib import Path +from abc import ABC, abstractmethod +from ddmpc.modeling.modeling import Model +from ddmpc.modeling.system_base_class import System, display_time +from ddmpc.utils.pickle_handler import write_pkl, read_pkl + + + +class FMUSystem(System): + """ + This FMU class implements functionalities to interact with FMUs + """ + + # ------------ Implementation of abstract functions ----------------- + def __init__(self, + model: Model, + step_size: int, + fmu_name: str, + instance_name: str = 'fmu', + sim_tolerance: float = 0.0001, + system_name: str = "fmu_system", + directory: Path = Path('stored_data', 'FMUs') + ): + """ + initialize FMU System class + :param model: Model Ontology + :param step_size: time step size of the fmu + :param fmu_name: name of the fmu (must match with stored name) + :param instance_name: name of the instance to create + :param sim_tolerance: simulation tolerance + :param system_name: name of the system to control + :param directory: directory where the fmu file is stored + """ + # initialize parent class + super().__init__(system_name = system_name, + directory = directory, + step_size= step_size, + model= model) + + # technical settings + self.sim_tolerance = sim_tolerance + self.instance_name = instance_name + + # initialization + self.fmu = None + self.fmu_name = fmu_name + self.fmu_path = Path(directory,fmu_name) + + # description + self.description = self._read_description() + + # variables + self.variable_dict = self._get_variable_dict() + + # outputs: + self._output_names=[var_name for var_name in self.model.var_names if var_name in self.variable_dict.keys()] + # disturbances + self.disturbances_df = pd.DataFrame() + + def setup(self, start_time: int, **kwargs): + """ + Setup the FMU environment for a given start time + :param start_time: Time at which the simulation is started (in s of the year) + :return: + """ + + assert self.fmu is None, 'Please make sure the simulation was closed' + assert start_time >= 0, 'Please make sure the start time is greater or equal to zero.' + + # start time + self.current_time = start_time + + # create a slave + self.fmu = fmpy.fmi2.FMU2Slave( + guid=self.description.guid, + unzipDirectory=fmpy.extract(self.fmu_path), + modelIdentifier=self.description.coSimulation.modelIdentifier, + instanceName=self.instance_name + ) + + # create an instance of the fmu + self.fmu.instantiate() + + # reset the fmu + self.fmu.reset() + + # start new experiment + self.fmu.setupExperiment( + startTime=start_time, + tolerance=self.sim_tolerance + ) + + self.fmu.enterInitializationMode() + self.fmu.exitInitializationMode() + if self.check_for_disturbances_file()!= True: + print('Please generate Disturbance File first') + + def close(self): + """ + Closes the simulation and clears the fmu object. + """ + + self.fmu.terminate() + self.fmu.freeInstance() + shutil.rmtree(fmpy.extract(self.fmu_path)) + + self.__init__( + step_size=self.step_size, + fmu_name=self.fmu_name, + sim_tolerance=self.sim_tolerance, + instance_name=self.instance_name, + model=self.model) + print('FMU released') + + def do_step(self) -> bool: + """ + Simulates one step. + """ + # return finish status + if self.current_time < self.stop_time: + + self.fmu.doStep( + currentCommunicationPoint=self.current_time, + communicationStepSize=self.step_size + ) + + # increment time + self.current_time += self.step_size + return True + + else: + return False + + def read_values(self,var_names:list) -> dict: + """ + # read current variable values and store in dict + :param var_names: List with names of variables to read + :return: + """ + res = {} + + for var_name in var_names: + assert var_name in self.variable_dict.keys(), f'{var_name} not available in FMU' + res[var_name] = self._read_value(var_name) + + # add current time to results + res['SimTime'] = self.current_time + return res + + def _read_value(self, var_name: str): + """ + Get a single variable. + """ + + variable = self.variable_dict[var_name] + vr = [variable.valueReference] + + if variable.type == 'Real': + return self.fmu.getReal(vr)[0] + elif variable.type in ['Integer', 'Enumeration']: + return self.fmu.getInteger(vr)[0] + elif variable.type == 'Boolean': + value = self.fmu.getBoolean(vr)[0] + return value != 0 + else: + pass + raise Exception("Unsupported type: %s" % variable.type) + + def write_values(self,control_dict:dict): + """ + Writes Values of control dict to fmu + :param control_dict: + :return: + """ + if control_dict: + for var_name, value in control_dict.items(): + self._write_value(var_name, value) + else: + self._write_default_values(self.model) + + def get_forecast(self, + n: int, + sampling_time: int, + meas_df: pd.DataFrame) -> pd.DataFrame: + """ + Get forecast for the current prediction horizon (In case of the FMU system we are lazy and just provide the pregenerated file) + :return: + """ + return self.disturbances_df + + def get_system_time(self): + return self.current_time + + # ------------ Additional Functions ------------ + @property + def disturbances_filepath(self): + return f'{self.directory}/{self.fmu_name}_disturbances_dt_{self.step_size}.pkl' + + @property + def output_names(self) ->list: + """ + Return list of outputs + :return: + """ + return self._output_names + + def check_for_disturbances_file(self): + """ + This function checks whether there are already matching disturbances. If not so they must be generated. + """ + # check if the disturbances already exist. + if isfile(self.disturbances_filepath): + return True + + # otherwise simulate them. + else: + return False + + def load_disturbances(self,start_time: int = 0, stop_time: int = 60 * 60 * 24 * 380,controllers: tuple = tuple()) -> pd.DataFrame: + + if self.check_for_disturbances_file(): + self.disturbances_df = read_pkl(filename=self.disturbances_filepath) + else: + self.simulate_disturbances(model=self.model, + start_time=start_time, + stop_time=stop_time, + controllers=controllers) + self.disturbances_df = read_pkl(filename=self.disturbances_filepath) + assert self.disturbances_df is not None, 'Please make sure to generate the disturbances before running the MPC.' + + return self.disturbances_df + + def simulate_disturbances(self, model: Model, start_time: int = 0, stop_time: int = 60 * 60 * 24 * 380,controllers: tuple = tuple()): + """ + Simulates the fmu file without a controller and then extracts only the disturbances from it. + Afterwards the DataFrame is stroed at the disturbances_filepath + :param model: Model instance + :param start_time: Start of the disturbances DataFrame + :param stop_time: End of the disturbances DataFrame + """ + # combine run and simulate disturbances script from Max + # setup the data simulator + print("------------------------------------------") + print(f"Simulating disturbances for System {self.system_name}") + print("------------------------------------------") + self.setup(start_time) + self.stop_time=stop_time + # write default values + self._write_default_values(model=model) + # plan the simulation + model.plan_simulation(start_time=start_time, stop_time=stop_time, step_size=self.step_size) + # extract var_names that are included in the fmu + var_names = [var_name for var_name in model.var_names if var_name in self.variable_dict.keys()] + # initialize data frame + df = pd.DataFrame(self.read_values(var_names), columns=['SimTime', *var_names], index=[0]) + while self.do_step(): + + if self.current_time % self.step_size == 0: + + # print time + display_time(self.current_time,self.system_name) + + # get the current state of the System + df = df.append(pd.DataFrame(self.read_values(var_names), index=[0]), ignore_index=True) + + # update the target and bounds dataframe + for y in model.controlled: + y.update(df=df) + + # calculate the controls and write them + control_dict = dict() + for controller in controllers: + + if self.current_time % controller.dt == 0: + + # calculate the controls + controls = controller(df) + + # add the controls to the control dictionary + for key, value in controls.items(): + if key in control_dict.keys(): + control_dict[key] += value + else: + control_dict[key] = value + + self.write_values(control_dict) + + # delete last row to append last row with valid control + df.drop(df.tail(1).index, inplace=True) + + # read variables and add to the data frame + df = df.append(pd.DataFrame(self.read_values(var_names), index=[0]), ignore_index=True) + + df = model.feature_creation(df=df) + self.close() + disturbances = [feature.col_name for feature in model.t + model.D] + df = df[disturbances] + # save as pickle + write_pkl(df, self.disturbances_filepath, override=True) + + # ------------ Additonal Functions for internal use only ------------ + def _read_description(self): + """ + Read the description of the given fmu file + :return: model_description + """ + + # open fmu file + self.fmu_path: Path + if self.fmu_path.is_file(): + file = open(self.fmu_path) + + else: + raise AttributeError(f'FMU file with path "{self.fmu_path}" does not exist.') + + # read model description + model_description = fmpy.read_model_description(self.fmu_path.as_posix()) + + # close fmu file + file.close() + + # return model description + return model_description + + def _get_variable_dict(self) -> dict: + """ + get dict of the variables included in the fmu + :return: dict with variables included in the fmu + """ + + assert self.description is not None, 'Please make sure to read model description first.' + + # collect all variables + variables = dict() + for variable in self.description.modelVariables: + variables[variable.name] = variable + + return variables + + def _write_value(self, var_name: str, value): + """ + Write a single control value + :param var_name: Name of the variable to write + :param value: value to be written + :return: + """ + + variable = self.variable_dict[var_name] + vr = [variable.valueReference] + + if variable.type == 'Real': + self.fmu.setReal(vr, [float(value)]) + elif variable.type in ['Integer', 'Enumeration']: + self.fmu.setInteger(vr, [int(value)]) + elif variable.type == 'Boolean': + self.fmu.setBoolean(vr, [value == 1.0 or value == True or value == "True"]) + else: + raise Exception("Unsupported type: %s" % variable.type) + + def _write_default_values(self, model: Model): + """writes default control values""" + for control in model.controls: + self._write_value(control.col_name, control.default) + + + def _update_times(self, duration: int): + """updates the start and stop time""" + self.start_time = self.current_time + self.stop_time = self.current_time + duration + + diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/training_networks.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/training_networks.py new file mode 100644 index 0000000000000000000000000000000000000000..6dfa2136ce5f9808fe82d2267aac356e50ac598e --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/modeling/training_networks.py @@ -0,0 +1,649 @@ +import random +import matplotlib.pyplot as plt + +import numpy as np +import pandas as pd + +from keras import Sequential, models +from keras.layers import Dense, BatchNormalization, Rescaling + +from ddmpc.modeling.features import Feature +from ddmpc.utils.pickle_handler import read_pkl, write_pkl +from ddmpc.utils import formatting as fmt +from ddmpc.modeling.keras_tuner import TunerModel +from ddmpc.modeling.data_handling import DataContainer + + +class Node: + + def __init__(self, feature: Feature): + + self.feature = feature + + def __str__(self): + return f'{self.__class__.__name__}({self.feature.__str__()})' + + def __repr__(self): + return f'{self.__class__.__name__}({self.feature.__repr__()})' + + def __eq__(self, other): + return other and self.feature == other.feature + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return hash(self.feature) + + @property + def name(self): + return self.feature.col_name + + +class Input(Node): + + def __init__(self, feature: Feature, lag: int): + assert lag > 0 + self.lag = lag + + super(Input, self).__init__(feature=feature) + + def __str__(self): + return f'Input({self.feature.__str__()} - lag: {self.lag})' + + def __repr__(self): + return f'Input({self.feature.__repr__()} - lag: {self.lag})' + + def col_name(self, k: int): + return f'Input({self.feature.name}_{-k})' + + +class Output(Node): + + def __init__(self, feature: Feature): + + super(Output, self).__init__(feature=feature) + + def col_name(self): + return f'Output({self.feature})' + + @property + def name(self): + return self.col_name() + + +class NetworkTrainer: + + def __init__( + self, + inputs: tuple, + output: Output, + step_size: int, + directory='stored_data\\NetworkTrainers', + show_plot: bool = True, + save_plot: bool = False, + ): + """ + Used to train Artificial Neural networks with Keras. + :param inputs: List of inputs. + :param output: List of Outputs. + """ + + assert all([type(i) == Input for i in inputs]), 'Make sure all inputs are from type "Input".' + assert type(output) == Output, 'Make sure the output is from type "Output".' + + # directory to save the network trainer at + self.directory = directory + self.show_plot = show_plot + self.save_plot = save_plot + + # define the in and output Features + self.inputs = inputs + self.output = output + + # training data + self.x_train = None + self.y_train = None + + self.x_test = None + self.y_test = None + + self.x_validate = None + self.y_validate = None + + # step size + self.step_size = step_size + + # DataFrame with all neural networks + self.df_networks = pd.DataFrame(columns=[ + 'ann_name', + 'layers', + 'neurons', + 'batch_normalizing', + 'output_scale', + 'optimizer', + 'loss', + 'metric', + 'score', + ]) + + # currently loaded ann + self.ann = None + + print(self) + + def __str__(self): + + print(f'{fmt.BOLD}NetworkTrainer:{fmt.ENDC}') + print('\tINPUTS:') + for input in self.inputs: + print(f'\t\t{input}') + print('\tOUTPUT:') + print(f'\t\t{self.output}') + + return '' + + def __repr__(self): + return f'NetworkTrainer(Output={self.output})' + + @property + def in_and_outputs(self): + return list(self.inputs + (self.output,)) + + @property + def input_col_names(self): + names = list() + for input in self.inputs: + for k in range(0, input.lag): + names.append(input.col_name(k)) + return names + + @property + def output_col_name(self): + return [self.output.col_name()] + + @property + def lag_list(self): + return [input.lag for input in self.inputs] + + @property + def cum_lag_list(self): + return [sum(self.lag_list[0:x:1]) for x in range(0, len(self.lag_list) + 1)] + + @property + def max_lag(self): + return max(self.lag_list) + + @property + def sum_lag(self): + return sum(self.lag_list) + + @property + def n_inputs(self): + return sum(self.lag_list) + + def load_ann(self, ann_name: str, folder: str = 'KerasTuner'): + ann = models.load_model(filepath=f'stored_data\\{folder}\\{ann_name}') + self.ann = ann + + def save_ann(self, ann: Sequential = None, folder: str = 'KerasTuner'): + if ann is None: + ann = self.ann + ann.save(filepath=f'stored_data\\{folder}\\{ann.name}') + + def load_best_ann(self, loc: int = 0): + """ + Loads the ann with the best score. + """ + assert len(self.df_networks) > 0, 'Please make sure to train a neural network first.' + assert 0 <= loc < len(self.df_networks), f'Invalid loc={loc}.' + + self.sort_df_networks() + best_ann_name = self.df_networks['ann_name'].iloc[loc] + print(f'Loaded ann with name: {best_ann_name}') + + self.load_ann(ann_name=best_ann_name) + + def sort_df_networks(self): + + self.df_networks.sort_values('score', inplace=True) + self.df_networks.reset_index(drop=True, inplace=True) + + def train_ann(self, ann: Sequential = None, epochs: int = 250, batch_size: int = 250, verbose: int = 2): + + if ann is None: + ann = self.ann + assert ann is not None, 'Please make sure to load an ANN before training.' + + assert self.x_train is not None or self.y_train is not None, 'Please generate training data first.' + + if self.x_validate is not None and self.y_validate is not None: + + ann.fit(x=self.x_train, + y=self.y_train, + validation_data=(self.x_validate, self.y_validate), + epochs=epochs, + batch_size=batch_size, + verbose=verbose, + ) + + else: + ann.fit(x=self.x_train, + y=self.y_train, + epochs=epochs, + batch_size=batch_size, + verbose=verbose, + ) + + def test_ann(self, ann: Sequential = None, metric: str = 'mse', on_training_data: bool = False): + """ + Tests a given ANN + :param ann: ANN to test. + :param metric: Metric to calculate the error. + :param on_training_data: Should the test be performed on the training data? + :return Score + """ + + if ann is None: + ann = self.ann + assert ann is not None, 'Please make sure to load an ANN before testing.' + + if self.x_test is None or self.y_test is None or on_training_data: + print('No test data available for testing. Proceeding with training data.') + x_test = self.x_train + y_test = self.y_train + else: + x_test = self.x_test + y_test = self.y_test + + assert metric in ['mse', 'mae'] + + df = pd.DataFrame() + + df['y_real'] = y_test.squeeze() + df['y_pred'] = ann.predict(x_test).squeeze() + + if metric == 'mae': + df['error'] = df['y_pred'] - df['y_real'] + elif metric == 'mse': + df['error'] = (df['y_pred'] - df['y_real']) ** 2 + else: + raise ValueError('Please select a proper metric.') + + score = df['error'].mean() + + df = df.sort_values('y_real', ignore_index=True) + + if self.show_plot: + # plt.axhline(y=0, color='black', linestyle=fmt.line_solid) + plt.scatter(df.index, df['y_pred'], s=0.4, c=fmt.blue, label='predicted') + plt.scatter(df.index, df['y_real'], s=0.4, c=fmt.red, label='real') + # plt.scatter(df.index, df['error'], s=0.5, c=fmt.black, label=metric) + plt.legend(loc='upper right') + plt.title(f'{self.output.feature} - {metric}={score:.5f}') + plt.gca().yaxis.grid(linestyle='dotted') + plt.show() + + + return score + + def load_data(self, containers: list): + """ + This function loads data to train anns with. + :param containers: [list] List of DataContainers that contain the training data. + """ + + # progress bar + print(f'{fmt.BOLD}NetworkTrainer:{fmt.ENDC}') + assert len(containers) > 0, 'Please generate data first.' + fmt.print_progress_bar(iteration=0, total=len(containers), length=20, prefix='\tLoading DataContainers') + + for i, container in enumerate(containers): + + assert container.step_size % self.step_size == 0,\ + f'Make sure the step_size of the NetworkTrainer {self.step_size} ist ' \ + f'a multiple of the step_size of the FMU {container.step_size}.' + + # reduces the step size to the desired size + df = self.reduce_step_size(container.df) + + # create all inputs + df = self.create_lag(df) + + # batch + x = df[self.input_col_names].values + y = df[self.output_col_name].values + + # add data + self.add_data(x, y, tag=container.tag) + + # progress bar + fmt.print_progress_bar(iteration=i+1, total=len(containers), length=20, prefix='\tLoading DataContainers') + + def reduce_step_size(self, df: pd.DataFrame): + """ + In case the step size of the MPC does not match the step size of the FMU the step size has to be reduced. + """ + return df[(df['SimTime'] - df['SimTime'].iloc[0]) % self.step_size == 0] + + def create_lag(self, df: pd.DataFrame) -> pd.DataFrame: + """ + This function creates lag to a pandas data frame. + """ + ret_df = pd.DataFrame() + + # inputs + for input in self.inputs: + + assert input.feature.col_name in df.columns, f'Please make sure {input.feature.col_name} is contained in {df.columns}.' + + for k in range(0, input.lag): + ret_df[input.col_name(k)] = df[input.feature.col_name].shift(k) + + # output + assert self.output.feature.col_name in df.columns, 'Please make sure the output of the ann is also an input.' + ret_df[self.output.col_name()] = df[f'{self.output.feature.col_name}'].shift(-1) + + # drop na + ret_df = ret_df.dropna(axis=0) + + return ret_df + + def add_data(self, x, y, tag: str): + + if tag == 'training': + if self.x_train is None: + self.x_train = x + self.y_train = y + else: + self.x_train = np.concatenate((self.x_train, x), axis=0) + self.y_train = np.concatenate((self.y_train, y), axis=0) + + elif tag == 'testing': + if self.x_test is None: + self.x_test = x + self.y_test = y + else: + self.x_test = np.concatenate((self.x_test, x), axis=0) + self.y_test = np.concatenate((self.y_test, y), axis=0) + + elif tag == 'validating': + if self.x_validate is None: + self.x_validate = x + self.y_validate = y + else: + self.x_validate = np.concatenate((self.x_validate, x), axis=0) + self.y_validate = np.concatenate((self.y_validate, y), axis=0) + + elif tag == 'none': + # dont load the data if the tag is none + return 0 + + else: + raise ValueError(f'Please select a propper tag. {tag}') + + def print_data(self): + + print('\tSuccessfully loaded data:') + if self.x_train is None: + x = self.x_train + else: + x = self.x_train.shape + + if self.y_train is None: + y = self.y_train + else: + y = self.y_train.shape + + print(f'\t\tTraining: x={x} \t y={y}') + + if self.x_test is None: + x = self.x_test + else: + x = self.x_test.shape + + if self.y_test is None: + y = self.y_test + else: + y = self.y_test.shape + + print(f'\t\tTesting: x={x} \t y={y}') + + if self.x_validate is None: + x = self.x_validate + else: + x = self.x_validate.shape + + if self.y_validate is None: + y = self.y_validate + else: + y = self.y_validate.shape + + print(f'\t\tValidating: x={x} \t y={y}') + + def clear_data(self): + + self.x_train = None + self.y_train = None + + self.x_test = None + self.y_test = None + + self.x_validate = None + self.y_validate = None + + def clear_trainer(self): + """ + Clears the saved ann names and scores. + """ + # DataFrame with all neural networks + self.df_networks = pd.DataFrame(columns=[ + 'ann_name', + 'layers', + 'neurons', + 'batch_normalizing', + 'output_scale', + 'optimizer', + 'loss', + 'metric', + 'score', + ]) + + def batch_data(self, df: pd.DataFrame) -> (np.ndarray, np.ndarray): + """ + This function translates a pandas DataFrames to numpy arrays. + + df -> x, y + + """ + n_rows = len(df) + + n_inputs = self.n_inputs + max_lag = self.max_lag + input_str_list = self.input_col_names + lag_list = self.lag_list + cum_lag_list = self.cum_lag_list + + # check that enough data is available + assert n_rows > max_lag, 'Please make sure there is sufficient data in the DataContainer.' + + # calculate y + y = np.array(df.loc[max_lag:n_rows, self.output.name]) + + # create empty array for x + x = np.zeros(shape=(n_rows - max_lag, n_inputs)) + + # fill x with values + for row in range(max_lag, n_rows): + + for name, lag, cum_lag in zip(input_str_list, lag_list, cum_lag_list): + + # insert the mini batch + x[row - max_lag, cum_lag:cum_lag + lag] = np.array(df.loc[row - lag + 1:row, name]) + + return x, y + + def evaluate_data(self, containers: list): + + dfs = list() + + for i, container in enumerate(containers): + + # create all inputs + df = self.create_lag(container.df) + + # add to list + dfs.append(df) + + # concat + df = pd.concat(dfs) + + # Correlation + print(df.corr()[self.output_col_name].to_string()) + + # box plot + i = 0 + for inp in self.inputs: + columns = df.columns[i:i+inp.lag].to_list() + i +=inp.lag + + df.boxplot(column=columns, + rot=20, + showfliers=False, + notch=False) + plt.show() + + @staticmethod + def build_dense(output_name: str, + layers: int, + neurons: int, + batch_normalizing: bool = True, + output_scale: float = None, + output_offset: float = 0, + optimizer: str = 'adam', + loss: str = 'mse', + ann_id: int = None, + ): + + if ann_id is None: + ann_id = random.randint(1000, 9999) + + # set the name + for char in ['.', '(', ')', '{', '}', '<', '>']: + output_name = output_name.replace(char, '') + + name = f'{output_name}_{ann_id}Id' + + # instantiate a new Sequential keras model + keras_model = Sequential(name=name) + + # batch normalizing layer to normalize the inputs + if batch_normalizing: + keras_model.add(BatchNormalization(axis=1)) + + # n Dense layers + for layer in range(layers): + keras_model.add(Dense(units=neurons, activation='sigmoid')) + + # output layer + keras_model.add(Dense(units=1, activation='linear')) + + # scale the output if necessary + if output_scale is not None: + keras_model.add(Rescaling(scale=output_scale, offset=output_offset)) + + # compile the model + keras_model.compile(optimizer=optimizer, loss=loss) + + return keras_model + + def freeze_layer(self, layer_i: int, freeze: bool = True): + """ + :param layer_i: Layer to freeze. + :param freeze: True / False + """ + + assert self.ann is not None, 'Please load ANN first.' + + print(f'Freezing layer {layer_i}.') + + self.ann.layers[layer_i].trainable = not freeze + + def tune(self, + layer_range: tuple, + neurons_range: tuple, + batch_normalizing: bool = True, + output_scale: float = None, + output_offset: float = 0, + trials: int = 10, + epochs: int = 500, + batch_size: int = 200, + optimizer: str = 'adam', + loss: str = 'mse', + metric: str = 'mse', + verbose: int = 0, + ): + + # tuner + for trial in range(1, trials+1): + # choose a random layer and neuron count + layers = random.choice(layer_range) + neurons = random.choice(neurons_range) + + ann = self.build_dense( + output_name=self.output.feature.col_name, + layers=layers, + neurons=neurons, + batch_normalizing=batch_normalizing, + output_scale=output_scale, + output_offset=output_offset, + optimizer=optimizer, + loss=loss, + ) + + # train the ann + self.train_ann(ann=ann, epochs=epochs, batch_size=batch_size, verbose=verbose) + + # test the ann + score = self.test_ann(ann, metric=metric) + + # save the keras model + self.save_ann(ann=ann) + + # stats + stats = {'ann_name': ann.name, + 'layers': layers, + 'neurons': neurons, + 'batch_normalizing': batch_normalizing, + 'output_scale': output_scale, + 'optimizer': optimizer, + 'loss': loss, + 'metric': metric, + 'score': score + } + + # add to the dict + self.df_networks = self.df_networks.append(stats, ignore_index=True) + + # print ann + print(f'\n{fmt.BOLD}ANN {trial} of {trials}:{fmt.ENDC}') + for stat, value in stats.items(): + print(f'\t{stat}: {value}') + + # evaluation + self.evaluate_tuner() + + def evaluate_tuner(self): + self.sort_df_networks() + print(self.df_networks.to_string()) + + def save(self, filename: str, override: bool = False): + del self.ann + self.ann = None + write_pkl(self, filename, self.directory, override) + + +def load_NetworkTrainer(filename: str, directory='stored_data\\NetworkTrainers') -> NetworkTrainer: + network_trainer = read_pkl(filename, directory) + print(network_trainer) + return network_trainer diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/__init__.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0f8223d6084b596f9ffbb06f2127100493896ad1 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/__init__.py @@ -0,0 +1,3 @@ +from ddmpc.utils.formatting import * +from ddmpc.utils.pickle_handler import * +from ddmpc.utils.plotting import * \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/formatting.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/formatting.py new file mode 100644 index 0000000000000000000000000000000000000000..991f986a5631eb61cc65d248abe311d441a6a5b1 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/formatting.py @@ -0,0 +1,95 @@ +import time +import numpy as np + +# plt colors +dark_red = [172 / 255, 43 / 255, 28 / 255] +red = [221 / 255, 64 / 255, 45 / 255] +light_red = [235 / 255, 140 / 255, 129 / 255] +green = [112 / 255, 173 / 255, 71 / 255] +light_grey = [217 / 255, 217 / 255, 217 / 255] +grey = [157 / 255, 158 / 255, 160 / 255] +dark_grey = [78 / 255, 79 / 255, 80 / 255] +light_blue = [157 / 255, 195 / 255, 230 / 255] +blue = [0 / 255, 84 / 255, 159 / 255] +black = [0, 0, 0] +ebc_palette_sort_1 = [dark_red, red, light_red, dark_grey, grey, light_grey, blue, light_blue, green] +ebc_palette_sort_2 = [red, blue, grey, green, dark_red, dark_grey, light_red, light_blue, light_grey] + +# linestyles +line_solid = '-' +line_dotted = ':' +line_dashed = '--' +line_dashdot = '-.' + +# console colors +HEADER = '\033[95m' +OKBLUE = '\033[94m' +OKCYAN = '\033[96m' +OKGREEN = '\033[92m' +WARNING = '\033[93m' +FAIL = '\033[91m' +ENDC = '\033[0m' +BOLD = '\033[1m' +UNDERLINE = '\033[4m' + + +def print_progress_bar(iteration, total, prefix='', suffix='', decimals=1, length=100, fill='█', printEnd=''): + """ + Call in a loop to create terminal progress bar + @params: + iteration - Required : current iteration (Int) + total - Required : total iterations (Int) + prefix - Optional : prefix string (Str) + suffix - Optional : suffix string (Str) + decimals - Optional : positive number of decimals in percent complete (Int) + length - Optional : character length of bar (Int) + fill - Optional : bar fill character (Str) + printEnd - Optional : end character (e.g. "\r", "\r\n") (Str) + """ + percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) + filledLength = int(length * iteration // total) + bar = fill * filledLength + '-' * (length - filledLength) + print(f'\r{prefix} |{bar}| {percent}% {suffix}', end=printEnd,) + # Print New Line on Complete + if iteration == total: + print() + + +def print_lists(*lst, statement): + print(f'{BOLD}{statement}{ENDC}') + for i, elements in enumerate(zip(*lst)): + print('\t', "%03d" % i, *elements) + + +def generate_matrix(rows): + max_length = max([len(row) for row in rows]) + for row in rows: + for i in range(max_length - len(row)): + row.append(0) + return rows + + +def print_table_line(row: list, max_lengths: list, space_char: str = ' '): + print_string = str() + + for x in list(zip(row, max_lengths)): + value = str(x[0]) + max_length = int(x[1]) + + print_string += value + print_string += space_char * (max_length - len(value)) + print_string += '\t' + + print(print_string) + + +def print_table(rows: list, space_char: str = ' '): + lengths = list() + + for row in rows: + lengths.append([len(str(value)) for value in row]) + + max_lengths = list(np.amax(generate_matrix(lengths), axis=0)) + + for row in rows: + print_table_line(row, max_lengths, space_char) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/pickle_handler.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/pickle_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..7dceeb98150635c7ecb6424787f652249a63c8ee --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/pickle_handler.py @@ -0,0 +1,86 @@ +import pickle +import os + + +def read_pkl(filename: str, directory: str = None): + """ + Reads data from a pickle file. + :param filename: The name of the file. + :param directory: The directory the file is located. + :return: Pickle object. + """ + + path = _get_path(filename, directory) + + if os.path.exists(path): # check for the existance of the path + pkl_file = open(path, 'rb') # open path + pkl_data = pickle.load(pkl_file) # read data + pkl_file.close() # close path + return pkl_data # return data + else: + ValueError(f'The path {path} does not exist.') + + +def write_pkl(data, filename: str, directory: str = None, override: bool = False): + """ + Writes data to a pickle file. + :param data: The object that is supposed to be saved. + :param filename: The name of the file. + :param directory: The directory the file will be saved to. + :param override: Boolean. + """ + + path = _get_path(filename, directory) + + # make sure the directory does exist + if directory is not None: + if not os.path.exists(directory): + os.mkdir(directory) + + # make sure the file does not already exist + if os.path.exists(path) and not override: + if not _get_bool(f'The file "{path}" already exists. Do you want to override it?\n'): + return 0 + + # open the path and writhe the file + pkl_file = open(path, 'wb') + pickle.dump(data, pkl_file) + + # close file + pkl_file.close() + + +def _get_path(filename: str, directory: str): + """ + Returns the full path for a given filename and directory. + """ + if '.pkl' not in filename: # check for file extension + filename += '.pkl' # add file extension + + if directory is not None: # check if directory is none + if not os.path.exists(directory): # check if path exists + os.makedirs(directory) # create new directory + return str(directory + '\\' + filename) # calculate full path + else: + return filename + + +def _get_bool(message: str, true: list = None, false: list = None): + + if false is None: + false = ['no', 'nein', 'false', '1', 'n'] + if true is None: + true = ['yes', 'ja', 'true', 'wahr', '0', 'y'] + + val = input(message).lower() + if val in true: + return True + elif val in false: + return False + else: + print('Please try again.') + print('True:', true) + print('False:', false) + _get_bool(message, true, false) + + return val diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/plotting.py b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/plotting.py new file mode 100644 index 0000000000000000000000000000000000000000..69d38a93c3895aa7f57c6a850f5f05a0c07fd169 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/ddmpc/utils/plotting.py @@ -0,0 +1,253 @@ +import os +import time +import locale +import datetime +import matplotlib +import matplotlib.pyplot as plt +import matplotlib.dates as dates + +import pandas as pd +from .pickle_handler import write_pkl, read_pkl + + +class PlotOptions: + + def __init__( + self, + color: list, + line: str, + label: str = None, + ): + """ + :param color: Line color for the plotting + :param line: Line style for the plotting + :param label: Label for the plotting + """ + self.color = color + self.line = line + self.label = label + + def __str__(self): + return f'{self.__class__.__name__}(color={self.color}, line_style={self.line}, label={self.label})' + + def __repr__(self): + return f'{self.__class__.__name__}(color={self.color}, line_style={self.line}, label={self.label})' + + +class SubPlot: + """ + A sub plot takes a tuple of Features. + """ + def __init__( + self, + features: tuple, + y_label: str, + step: bool = False, + lb: float = None, + ub: float = None, + factor: float = 1, + shift: float = 0, + normalize: bool = False, + ): + self.features = features + self.y_label = y_label + self.step = step + self.lb = lb + self.ub = ub + self.n_features = len(features) + + self.factor = factor + self.shift = shift + self.normalize = normalize + + def convert(self, values: pd.Series): + + if self.normalize: + values = (values - values.min()) / (values.max() - values.min()) + + values = values * self.factor - self.shift + + return values + + +class Plotter: + """ + This class is used to plot the simulated data. + The SubPlots are stacked vertically. + """ + def __init__( + self, + *sub_plots: SubPlot, + size: tuple, + language: str = 'de_DE', + directory: str = 'stored_data//Plots', + sub_folder_name: str = None, + ): + + # SubPlots + self.sub_plots = sub_plots + + # settings + self.size = size + + #locale.setlocale(locale.LC_TIME, language) + + self.directory = directory + self.sub_folder_name = sub_folder_name + + # set locale + #locale.setlocale(locale.LC_TIME, language) + + def __str__(self): + return f'Plotter: \n\t SubPlots: {len(self.sub_plots)}\n\t Size: {self.size}' + + @staticmethod + def setup(): + + matplotlib.rcParams['mathtext.fontset'] = 'custom' + matplotlib.rcParams['mathtext.rm'] = 'Bitstream Vera Sans' + matplotlib.rcParams['mathtext.it'] = 'Bitstream Vera Sans:italic' + matplotlib.rcParams['mathtext.bf'] = 'Bitstream Vera Sans:bold' + + matplotlib.rcParams['mathtext.fontset'] = 'stix' + matplotlib.rcParams['font.family'] = 'STIXGeneral' + + matplotlib.rcParams['savefig.dpi'] = 200 + matplotlib.rcParams['figure.dpi'] = 200 + + @property + def n_sub_plots(self): + return len(self.sub_plots) + + def plot_filepath(self, name: str): + if self.sub_folder_name is None: + return f'{self.directory}//{time.strftime("%Hh %Mm %Ss", time.localtime())} - {name}.pdf' + else: + return f'{self.directory}//{self.sub_folder_name}//{time.strftime("%Hh %Mm %Ss", time.localtime())} - {name}.pdf' + + def build(self, df: pd.DataFrame): + + df = df.copy(deep=True) + + # figure and axis + fig, axs = plt.subplots(self.n_sub_plots, sharex=True) + fig.set_size_inches(self.size[0], self.size[1]) + + # timescale + step_size = int(df['SimTime'].iloc[1] - df['SimTime'].iloc[0]) + start_date = datetime.datetime(2020, 1, 6) + datetime.timedelta(seconds=int(df['SimTime'].iloc[0])) + date_list = [start_date + datetime.timedelta(seconds=step_size) * rows for rows in range(0, len(df.index))] + + # iterate over all sub_plots + for index, sub_plot in enumerate(self.sub_plots): + + # set the y label + axs[index].set(ylabel=sub_plot.y_label) + + # set the lower and upper bound + + if sub_plot.lb is not None: + axs[index].set_ylim(bottom=sub_plot.lb- 0.4) + if sub_plot.ub is not None: + axs[index].set_ylim(top=sub_plot.ub + 0.4) + + # iterate over all features + for feature in sub_plot.features: + + assert feature.col_name in df.columns,\ + f'Plotting error! Feature with col_name {feature.col_name} not in df.' + + values = sub_plot.convert(df[feature.col_name]) + + if sub_plot.step: + axs[index].step( + date_list, + values, + label=feature.plt_opts.label, + color=feature.plt_opts.color, + linestyle=feature.plt_opts.line, + ) + + else: + axs[index].plot( + date_list, + values, + label=feature.plt_opts.label, + color=feature.plt_opts.color, + linestyle=feature.plt_opts.line, + ) + + # target + if f'{feature.col_name}_target' in df.columns: + + target = sub_plot.convert(df[f'{feature.col_name}_target']) + axs[index].step(date_list, + target, + label='', + color='black', + linestyle='--', + ) + + # lb + if f'{feature.col_name}_lb' in df.columns: + lb = sub_plot.convert(df[f'{feature.col_name}_lb']) + axs[index].step(date_list, + lb, + label='', + color='black', + linestyle='-', + ) + + # ub + if f'{feature.col_name}_ub' in df.columns: + lb = sub_plot.convert(df[f'{feature.col_name}_ub']) + axs[index].step(date_list, + lb, + label='', + color='black', + linestyle='-', + ) + + # label + axs[index].legend(loc='upper right') + + # major and minor locator + if len(df.index) <= int((60 * 60 * 24 * 2 + 1) / step_size): + axs[-1].xaxis.set_major_locator(dates.DayLocator()) + axs[-1].xaxis.set_major_formatter(dates.DateFormatter('%a')) + axs[-1].xaxis.set_minor_locator(dates.HourLocator(interval=4)) + axs[-1].xaxis.set_minor_formatter(dates.DateFormatter('%H:%M')) + else: + axs[-1].xaxis.set_major_locator(dates.MonthLocator()) + axs[-1].xaxis.set_major_formatter(dates.DateFormatter('%b')) + axs[-1].xaxis.set_minor_locator(dates.DayLocator()) + axs[-1].xaxis.set_minor_formatter(dates.DateFormatter('%a')) + + def plot(self, df: pd.DataFrame, name: str, save_plot: bool = True, show_plot: bool = True): + + # setup plot + self.setup() + + # build plot + self.build(df) + + # save plot + if save_plot: + if not os.path.exists(self.directory): + os.mkdir(self.directory) + if self.sub_folder_name is not None: + if not os.path.exists(f'{self.directory}//{self.sub_folder_name}'): + os.mkdir(f'{self.directory}//{self.sub_folder_name}') + + plt.savefig(self.plot_filepath(name)) + + # show plot + if show_plot: + plt.show(block=False) + + def save(self, filename: str, directory: str = 'stored_data\\Plotter', override: bool = False): + write_pkl(self, filename, directory, override) + + +def load_Plotter(filename: str, directory: str = 'stored_data\\Plotter') -> Plotter: + return read_pkl(filename, directory) diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/readme.md b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..3b88469a7f8ea6e9df394f821861c6c0d858b581 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/readme.md @@ -0,0 +1,16 @@ +# Data Driven Model Predictive Control - DDMPC + +A brief explanation of the most important modules of the **ddmpc** package: + +- **controller**: contains the core controller functionalities +- **modeling**: modules for modeling, feature mapping and data handling. +Simulation interface can be accessed via abstract system class +- **utils**: utilities for formatting, plotting and pickle handling + +# Step by step manual: + +1. Create new folder for the system to be controlled +2. Create **configuration** file, defining the system, the causalities and the variable mapping +3. Define the training strategy as displayed in **2_generate_data** +4. Define the structure and hyperparameters of the anns to be used in **3_train_anns** +5. Configure the DDMPC and the online learning loop in **4_mpc_online** \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/requirements.txt b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..2a9bad3c63b8a34b872535668f28aef9ad4ab279 Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/ann_ddmpc/requirements.txt differ diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/GPR_mpc.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/GPR_mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..e377abae12e6aca36dc864b293c7ce5683c7ea29 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/GPR_mpc.py @@ -0,0 +1,1095 @@ +import numpy as np +import matplotlib.pyplot as plt +import matplotlib +#matplotlib.use('TKAgg') +import pandas as pd +import os +import datetime +from casadi import * +from pickle_handler import * +from data_manager import * +from GP_regression import * +#from ThermalZoneControllerPyomo import * +import pyDOE + + + +class lhs_ctrl: + def __init__(self, DataHandler, intervall = 6): # 9 + print('lhs controller') + self.intervall = intervall + self.DataHandler = DataHandler + self.start_time = self.DataHandler.fmu.start_time + self.stop_time = self.DataHandler.fmu.stop_time + self.sim_time = self.stop_time - self.start_time + print(self.sim_time) + self.timepoints = self.sim_time / DataHandler.step_size + print(self.timepoints) + self.u_values = pyDOE.lhs(2, int(self.timepoints/intervall +2), criterion = 'c') # with zero insertion /2 ! + # np.save("lhs_27_04_new3", self.u_values) + # self.u_values = np.load("lhs_27_04_new2.npy") # u_values # *(1-0.01)+0.01 New FMU does not require >0.01 + ''' + Einbauen, dass nach jeder control row 4x zero kommt bzw gekühlt wird, um zu gewährleisten, dass Temperatur + wieder absinkt ''' + print(self.u_values) + self.call_counter = 0 + self.control_row = -1 + self.counter_2 = 0 + + def __call__(self, *args): + if self.call_counter % self.intervall == 0: + self.control_row += 1 + control_dict = {} + for index, feature in enumerate(self.DataHandler.model.U): + control_dict[feature.var_name] = self.u_values[self.control_row,index] * (feature.ub - feature.lb) + feature.lb + self.call_counter += 1 + return control_dict + + # Call with zero insertion : + """def __call__(self, *args): + if self.call_counter % self.intervall == 0: + self.counter_2 +=1 + if self.call_counter % (self.intervall*2) ==0 : + self.control_row +=1 + control_dict = {} + for index, feature in enumerate(self.DataHandler.model.U): + if self.counter_2 % 2 == 0: + control_dict[feature.var_name] = self.u_values[self.control_row,index] + else: + control_dict[feature.var_name] = 0 + self.call_counter += 1 + return control_dict""" + + def description(self): + return f'LHS controller from {self.start_time/86400} until {self.stop_time/86400} (timepoints = {self.timepoints})' + + +class zero_ctrl: + + def __init__(self, DataHandler): + + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.start_time = self.DataHandler.fmu.start_time + self.stop_time = self.DataHandler.fmu.stop_time + self.sim_time = self.stop_time - self.start_time + self.timepoints = self.sim_time / DataHandler.step_size + + def __call__(self, *args, **kwargs): + T_out = args[0]['weaBus.TDryBul'].iloc[-1] - 293.15 + control_dict = {} + control_dict['TsetAHU'] = T_out + control_dict['Q_flowTabs'] = 0 + return control_dict + + def description(self): + return f'ZERO controller from {self.start_time/86400} until {self.stop_time/86400} (timepoints = {self.timepoints})' + + +class variance_tracker: + + def __init__(self, DataHandler, GPR_Model, df, incl_derivative=False): + """ + Variance Tracker Class. + own class to avoid overhead of creating MPC controller + Online Learning prob. better as function of GPR MPC track variance can simply be copied though + --> difference: df with whole data exists already here + for real online learning: use "live" df. + """ + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + if not incl_derivative: # --- bitte schlauer implementieren als über flag arg ! + self.df = self.DataHandler.insert_derivative(df) + self.df = self.DataHandler.keep_features(df) + print('df\n') + print(self.df) + else: + self.df = df + + def track_variance(self, start_int = 25, end_int = None, normalise = True): + variances = [] + time_indexes = [] + if end_int is None: + end_int = len(df.index) + loc = start_int + while loc <= end_int: + print(loc) + col_chunks = [] + for feature in self.regressor_list: + col_chunks.append(np.array(self.df.iloc[loc - feature.lag: loc+1][ feature.var_name])) # size(appendix) = lag+1 + x_test = np.hstack(col_chunks) + y, variance = self.gp.GP_eval(x_test=x_test.reshape(1,-1), normalise=normalise, with_variance=True) + variances.append(float(variance)) + time_indexes.append(loc) + loc += 1 + + ret = [variances, time_indexes] + self.variances = np.array(variances) + self.time_indexes = time_indexes + return ret + + def extend_GPR(self, number_of_timepoints, path, save = True): + var_indexes = (-self.variances).argsort()[:number_of_timepoints] + print(var_indexes) + time_marks = [] + for index in var_indexes: + time_marks.append(self.time_indexes[index]) + print(var_indexes) + ''' + ACHTUNG ! loc und iloc ! + ''' + df = self.df + X_train = np.empty((0, sum([feature.lag + 1 for feature in self.model.regressor_list])), float) + Y_train = np.empty((0, len(self.model.target_list)), float) + for i in time_marks: + col_chunks = [] + for feature in self.model.regressor_list: + col_chunks.append(np.array(df.iloc[i - feature.lag: i + 1][feature.var_name])) # size(appendix) = lag+1 + X_train = np.append(X_train, [np.hstack(col_chunks)], axis=0) + + target_values = [] + for target_name in self.model.target_list_str: # target_name = var_name + " (t+1)" + target_values.append(np.array(df.iloc[i][target_name])) # size(appendix) = 1 + # y_k+1 @ index i is corresponding to x_k @ index i + Y_train = np.append(Y_train, [np.hstack(target_values)], axis=0) + + #print(self.gp.X_train) + #print(X_train) + X_train_norm = self.gp.normalise_X(X_train, casadi_eval=False) + Y_train_norm = self.gp.normalise_Y(Y_train, casadi_eval=False) + print(self.gp.X_train) + #print(X_train_norm) + + X_train_new_full = np.vstack((self.gp.X_train, X_train_norm)) + Y_train_new_full = np.vstack((self.gp.Y_train, Y_train_norm)) + print(X_train_new_full.shape) + print(Y_train_new_full.shape) + + self.gp.set_new_data(X_train_new_full, Y_train_new_full) + self.gp.set_up_reg() + + if save is True: + self.gp.save_GPR(path=path) + ''' + GP-Setup + New Hyperparam ?! -> Beides testen + GP save_GPR + ''' + + +class GPR_MPC_comfort: + + def __init__(self, DataHandler, GPR_Model, N=8): # --- maybe pass disturbances df as argument instead of loading from DataHandler + self.comp_times = [] + self.N = N + #self.ref = 295 + + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + # --- load disturbances (pre known for whole time horizon) + self.disturbances_df = self.DataHandler.disturbances_df + + # --- time steps and horizon + self.step_size = self.DataHandler.step_size + + # --- working hours and comfort temperatures + self.working_hours = [6, 18] + self.comfort_limits_day = [273.15 + 20 , 273.15 + 22] + self.comfort_limits_night = [273.15 + 17, 273.15 + 26] + + # --- feature (regressor) lists by type of feature (U,D,Y,C) + self.U = [feature for feature in self.model.U if feature.is_regressor] + self.D = [feature for feature in self.model.D if feature.is_regressor] + try: + self.D.extend([feature for feature in + self.model.c_D]) # if (feature.is_regressor and feature.feature in self.model.D)]) + except AttributeError: + print('no disturbance derivative in Model') + + self.Y = [feature for feature in self.model.Y if feature.is_regressor] + self.C = [feature for feature in self.model.C if (feature.is_regressor and feature.feature in self.model.Y)] + + self.nY = len(self.Y) + self.nU = len(self.U) + + self.create_controller() + + def get_comfort_limit(self, current_time): + + L_limits = [] + U_limits = [] + for t in range(self.N): + time_dict = self.get_time_dict(current_time + (t+2) * self.step_size ) + # append limits to the target data frame + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + L_limits.append(self.comfort_limits_day[0]) + U_limits.append(self.comfort_limits_day[1]) + else: + L_limits.append(self.comfort_limits_night[0]) + U_limits.append(self.comfort_limits_night[1]) + + return L_limits, U_limits + + @staticmethod + def get_time_dict(seconds: int): + result = dict() + + intervals = ( + ('weeks', 604800), + ('days', 86400), + ('hours', 3600), + ('minutes', 60), + ) + + for name, count in intervals: + value = seconds // count + seconds -= value * count + result[name] = value + return result + + def __call__(self, *args): + + df = args[0].copy() # --- "live" beschriebenes df mit features + print(df) + current_time = df['SimTime'].iloc[-1] # int(df['SimTime'][-1:].values) + + regressor_lags = [feature.lag for feature in self.regressor_list] + if len(df.index) <= max(regressor_lags) + 1: + print('Waiting for regressor to be simulated... ') + T_out = args[0]['weaBus.TDryBul'].iloc[-1] - 293.15 + control_dict = {} + control_dict['TsetAHU'] = T_out + control_dict['Q_flowTabs'] = 0 + return control_dict + + # --- obtain already known values to be passed as PARVARS to solver + loc_d = current_time / self.step_size # + 1 # via SIMTIME ? oder über current_time und step_size + values_D = [] + for feature in self.D: + values_D.extend(list(self.disturbances_df.loc[loc_d - feature.lag: loc_d + self.N, feature.var_name])) + print(feature.var_name) + loc = -1 + # VLL für alle lieber iloc verwenden, falls nicht bei 0 anfängt zu zählen + values_U = [] + for feature in self.U: + values_U.extend(list(df.iloc[loc - feature.lag:-1][feature.var_name])) + + values_Y = [] + for feature in self.Y: + values_Y.extend(list(df.iloc[loc - feature.lag::][feature.var_name])) + + ''' + only valid for c = dy_1 = T_AirRoom + ''' + values_C = [] + for c in self.C: + values_aux1 = list(df.iloc[loc - c.lag::][self.Y[0].var_name]) + values_aux2 = list(df.iloc[loc - c.lag - 1: loc][self.Y[0].var_name]) + + for i in range(c.lag + 1): + values_C.append(values_aux1[i] - values_aux2[i]) + + L_limits, U_limits = self.get_comfort_limit(current_time) + print(L_limits) + print(U_limits) + values_limit = [*L_limits, *U_limits] + print('values_limit') + print(values_limit) + print(values_D) + print(values_C) + print(values_Y) + print('hallo') + # obtain controls + control_dict = self.get_controls(values_D, values_U, values_Y, values_C, values_limit) + + return control_dict + + def create_controller(self): + N = self.N + # --- initialization + PARVARS = [] + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] LIMITS[0:N] + OPTVARS = [] + # --- OPTVARS order: + self.g = [] + self.lbg = [] + self.ubg = [] + + # --- fill PARVARS with symbolics, order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1], Y[0] is set via constraint + # --- Also: build list with lists of symbolic VARS for each feature to build x_test from this list + VARS_regressorlist = [] + for index, feature in enumerate(self.D): + VARS_feature = [] + for k in range(-feature.lag, N + 1): + D_k = SX.sym('par D_' + str(index) + str(k), 1) + VARS_feature.append(D_k) + PARVARS.append(D_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.U): + VARS_feature = [] + for k in range(-feature.lag, 0): + U_k = SX.sym('par U_' + str(index) + str(k), 1) + VARS_feature.append(U_k) + PARVARS.append(U_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.Y): + VARS_feature = [] + for k in range(-feature.lag, 1): + Y_k = SX.sym('par Y_' + str(index) + str(k), 1) + VARS_feature.append(Y_k) + PARVARS.append(Y_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.C): + VARS_feature = [] + for k in range(-feature.lag, 1): + C_k = SX.sym('par C_' + str(index) + str(k), 1) + VARS_feature.append(C_k) + PARVARS.append(C_k) + VARS_regressorlist.append(VARS_feature) + + # --- add limitations to PARVARS: + LB_syms = [] + for k in range (N): # vll N+1 + lb_T_k = SX.sym('par LB_' + str(k), 1) + LB_syms.append(lb_T_k) + PARVARS.append(lb_T_k) + UB_syms = [] + for k in range (N): + ub_T_k = SX.sym('par UB_' + str(k), 1) + UB_syms.append(ub_T_k) + PARVARS.append(ub_T_k) + + # --- constraint initial state + Y_0_opt = SX.sym('Y_0_opt', 1) + OPTVARS.append(Y_0_opt) + self.constraint(Y_k - Y_0_opt) + + # --- initialize MPC Multiple Shooting loop + obj = 0 + + self.Q_val = 1000 # 000 + self.R_val = [1, 1] # , 8, 4] + self.dR_val = [10, 10] # , 4, 4] + Q = diag(self.nY) * self.Q_val # old FMU Q = diag(self.nY) * 50 + R = diag(self.R_val) * 1 # old FMU : R = diag([10, 5, 2, 2]) * 1 + dR = self.dR_val # old FMU: dR = [15, 15, 10, 10] + + # --- Multiple Shooting Loop: + for k in range(self.N): + print('MPC_loop:') + print(k) + Uk = [] + + U_k = SX.sym('U_' + str(k), self.nU) + OPTVARS.append(U_k) + # for index, feature in enumerate(self.U): + for i in range(self.nU): + VARS_regressorlist[i + len(self.D)].append(U_k[i]) + + self.constraint(U_k[i], self.U[i].lb, self.U[i].ub) # 0.02 + + Y_k = SX.sym('Y_' + str(k + 1), self.nY) + OPTVARS.append(Y_k) + + C_k = SX.sym('C_' + str(k + 1), 1) + OPTVARS.append(C_k) + + EPS_k = SX.sym('EPS_' + str(k + 1), 1) + OPTVARS.append(EPS_k) + + print(VARS_regressorlist) + print(U_k[0]) + print(VARS_regressorlist[0][4 + k]) + #quit() + # self.constraint(Y_k - Y_pred) + + # --- build input vector x_test: + # --- order in regressor list: D U Y C + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + col_chunks = [] + for index, feature in enumerate(self.regressor_list): + # print(str(index)) + # print(VARS_regressorlist[index]) + col_chunk = np.array([VARS_regressorlist[index][ + k: k + 1 + feature.lag]]) # --- in meiner STR indizierung, nicht listenindex! + print('chunk len:') + print(len(VARS_regressorlist[index][k: k + feature.lag + 1])) + print(VARS_regressorlist[index][k: k + feature.lag + 1]) + + # absolute position in der jeweiligen Unterliste von VARS_regressorlist + col_chunks.append(col_chunk) + # print(col_chunks) + x_test = np.hstack(col_chunks) + print('x_test') + print(x_test.shape) + + dY_pred = self.gp.GP_eval(x_test.reshape(1, -1)) + # --- get last value from Y-list within VARS_regressorlist, which is previous Y_k + Y_pred = VARS_regressorlist[len(self.D) + len(self.U)][-1] + dY_pred + + self.constraint(Y_k - Y_pred) + self.constraint(C_k - dY_pred) + # for index, feature in enumerate(self.Y): + for i in range(self.nY): + VARS_regressorlist[i + len(self.D) + len(self.U)].append(Y_k[i]) + VARS_regressorlist[len(self.D) + len(self.U) + len(self.Y)].append(C_k) + + self.constraint(Y_pred + EPS_k - LB_syms[k], 0, inf) + self.constraint(Y_pred + EPS_k - UB_syms[k], -inf, 0) + + obj = obj + EPS_k.T @ Q @ EPS_k # + U_k.T @ R @ U_k hier adden, das [T_AHU, Q_CCA]_ref = [Tdrybul, 0] , TdryBul erster Wert in D. über N iterieren + # Tdrybul[k] = VARS_regressorlist[0][feature.lag + k] + ref = [VARS_regressorlist[0][self.regressor_list[0].lag + k] - 293.15, 0] #4 + # ref = [0,0] + for i in range(self.nU): + obj = obj + (U_k[i] - ref[i]) **2 * self.R_val[i] + obj = obj + (VARS_regressorlist[i + len(self.D)][-2] - VARS_regressorlist[i + len(self.D)][-1]) ** 2 * \ + dR[i] + # dU über vars_regressor_list[i+len(self.D)] realisieren + + # --- create NLP + nlp = {'x': vertcat(*OPTVARS), + 'f': obj, + 'g': vertcat(*self.g), + 'p': vertcat(*PARVARS) + } + self.optvars4print = vertcat(*OPTVARS) + opts_ipopt = {'verbose': False, 'ipopt': {'max_iter': 3000, 'print_level': 4}} + + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + def get_controls(self, values_D, values_U, values_Y, values_C, values_LIM): + PARVARS_values = [*values_D, *values_U, *values_Y, *values_C, *values_LIM] + call_time = time.time() + solution = self.controller(lbg=vertcat(*self.lbg), ubg=vertcat(*self.ubg), p=vertcat(*PARVARS_values)) + self.comp_times.append(time.time() - call_time) + print(solution) + print(solution['x']) + control_dict = self.control2dict(solution['x']) + # u_opt = self.process_controls(solution['x']) + return control_dict + + def constraint(self, eq, lb=0, ub=0): + ''' + :param eq: equation / term for constraint + :param lb: lower bound, default = 0 -> equality constraint + :param ub: upper bound, default = 0 -> equality constraint + :return: + ''' + self.g.append(eq) + self.lbg.append(lb) + self.ubg.append(ub) + + def control2dict(self, solution): + print(solution) + print(self.optvars4print) + control_dict = {} + # for i in range(self.N): + temperatures = [] + temperatures = solution[::5] + for index, feature in enumerate(self.U): + control_dict[feature.var_name] = solution[1 + index].full()[0][0] # --- hier nochmal genau schauen! + print(control_dict) + print(solution) + # quit() + return control_dict + + +class GPR_MPC_comfort_SS: + + def __init__(self, DataHandler, GPR_Model, N=8): # --- maybe pass disturbances df as argument instead of loading from DataHandler + self.comp_times = [] + self.N = N + # self.ref = 295 + + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + # --- load disturbances (pre known for whole time horizon) + self.disturbances_df = self.DataHandler.disturbances_df + + # --- time steps and horizon + self.step_size = self.DataHandler.step_size + + # --- working hours and comfort temperatures + self.working_hours = [6, 18] + self.comfort_limits_day = [273.15 + 20, 273.15 + 22] + self.comfort_limits_night = [273.15 + 17, 273.15 + 26] + + # --- feature (regressor) lists by type of feature (U,D,Y,C) + self.U = [feature for feature in self.model.U if feature.is_regressor] + self.D = [feature for feature in self.model.D if feature.is_regressor] + try: + self.D.extend([feature for feature in + self.model.c_D]) # if (feature.is_regressor and feature.feature in self.model.D)]) + except AttributeError: + print('no disturbance derivative in Model') + + self.Y = [feature for feature in self.model.Y if feature.is_regressor] + self.C = [feature for feature in self.model.C if (feature.is_regressor and feature.feature in self.model.Y)] + + self.nY = len(self.Y) + self.nU = len(self.U) + + self.create_controller() + + def get_comfort_limit(self, current_time): + + L_limits = [] + U_limits = [] + for t in range(self.N): + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size ) + # append limits to the target data frame + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + L_limits.append(self.comfort_limits_day[0]) + U_limits.append(self.comfort_limits_day[1]) + else: + L_limits.append(self.comfort_limits_night[0]) + U_limits.append(self.comfort_limits_night[1]) + + return L_limits, U_limits + + @staticmethod + def get_time_dict(seconds: int): + result = dict() + + intervals = ( + ('weeks', 604800), + ('days', 86400), + ('hours', 3600), + ('minutes', 60), + ) + + for name, count in intervals: + value = seconds // count + seconds -= value * count + result[name] = value + return result + + def __call__(self, *args): + + df = args[0].copy() # --- "live" beschriebenes df mit features + print(df) + current_time = df['SimTime'].iloc[-1] # int(df['SimTime'][-1:].values) + + regressor_lags = [feature.lag for feature in self.regressor_list] + if len(df.index) <= max(regressor_lags) + 1: + print('Waiting for regressor to be simulated... ') + T_out = args[0]['weaBus.TDryBul'].iloc[-1] - 293.15 + control_dict = {} + control_dict['TsetAHU'] = T_out + control_dict['Q_flowTabs'] = 0 + return control_dict + + # --- obtain already known values to be passed as PARVARS to solver + loc_d = current_time / self.step_size # + 1 # via SIMTIME ? oder über current_time und step_size + values_D = [] + for feature in self.D: + values_D.extend(list(self.disturbances_df.loc[loc_d - feature.lag: loc_d + self.N, feature.var_name])) + print(feature.var_name) + loc = -1 + # VLL für alle lieber iloc verwenden, falls nicht bei 0 anfängt zu zählen + values_U = [] + for feature in self.U: + values_U.extend(list(df.iloc[loc - feature.lag:-1][feature.var_name])) + + values_Y = [] + for feature in self.Y: + values_Y.extend(list(df.iloc[loc - feature.lag::][feature.var_name])) + + ''' + only valid for c = dy_1 = T_AirRoom + ''' + values_C = [] + for c in self.C: + values_aux1 = list(df.iloc[loc - c.lag::][self.Y[0].var_name]) + values_aux2 = list(df.iloc[loc - c.lag - 1: loc][self.Y[0].var_name]) + + for i in range(c.lag + 1): + values_C.append(values_aux1[i] - values_aux2[i]) + + L_limits, U_limits = self.get_comfort_limit(current_time) + print(L_limits) + print(U_limits) + values_limit = [*L_limits, *U_limits] + print('values_limit') + print(values_limit) + print(values_D) + print(values_C) + print(values_Y) + print('hallo') + # obtain controls + control_dict = self.get_controls(values_D, values_U, values_Y, values_C, values_limit) + + return control_dict + + def create_controller(self): + N = self.N + # --- initialization + PARVARS = [] + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] LIMITS[0:N] + OPTVARS = [] + # --- OPTVARS order: + self.g = [] + self.lbg = [] + self.ubg = [] + + # --- fill PARVARS with symbolics, order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1], Y[0] is set via constraint + # --- Also: build list with lists of symbolic VARS for each feature to build x_test from this list + VARS_regressorlist = [] + for index, feature in enumerate(self.D): + VARS_feature = [] + for k in range(-feature.lag, N + 1): + D_k = SX.sym('par D_' + str(index) + str(k), 1) + VARS_feature.append(D_k) + PARVARS.append(D_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.U): + VARS_feature = [] + for k in range(-feature.lag, 0): + U_k = SX.sym('par U_' + str(index) + str(k), 1) + VARS_feature.append(U_k) + PARVARS.append(U_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.Y): + VARS_feature = [] + for k in range(-feature.lag, 1): + Y_k = SX.sym('par Y_' + str(index) + str(k), 1) + VARS_feature.append(Y_k) + PARVARS.append(Y_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.C): + VARS_feature = [] + for k in range(-feature.lag, 1): + C_k = SX.sym('par C_' + str(index) + str(k), 1) + VARS_feature.append(C_k) + PARVARS.append(C_k) + VARS_regressorlist.append(VARS_feature) + + # --- add limitations to PARVARS: + LB_syms = [] + for k in range (N): # vll N+1 + lb_T_k = SX.sym('par LB_' + str(k), 1) + LB_syms.append(lb_T_k) + PARVARS.append(lb_T_k) + UB_syms = [] + for k in range (N): + ub_T_k = SX.sym('par UB_' + str(k), 1) + UB_syms.append(ub_T_k) + PARVARS.append(ub_T_k) + + # --- constraint initial state + Y_0_opt = SX.sym('Y_0_opt', 1) + OPTVARS.append(Y_0_opt) + self.constraint(Y_k - Y_0_opt) + + # --- initialize MPC Single Shooting loop + obj = 0 + + self.Q_val = 1000 # 000 + self.R_val = [0.1, 0.1] # , 8, 4] + self.dR_val = [100, 100] # , 4, 4] + Q = diag(self.nY) * self.Q_val # old FMU Q = diag(self.nY) * 50 + R = diag(self.R_val) * 1 # old FMU : R = diag([10, 5, 2, 2]) * 1 + dR = self.dR_val # old FMU: dR = [15, 15, 10, 10] + + # --- Single Shooting Loop: + for k in range(self.N): + print('MPC_Single_Shooting_loop:') + print(k) + Uk = [] + + U_k = SX.sym('U_' + str(k), self.nU) + + OPTVARS.append(U_k) + # for index, feature in enumerate(self.U): + for i in range(self.nU): + VARS_regressorlist[i + len(self.D)].append(U_k[i]) + self.model.U[i].lb, self.model.U[i].ub + self.constraint(U_k[i],self.model.U[i].lb, self.model.U[i].ub) # 0.02 + + EPS_k = SX.sym('EPS_' + str(k + 1), 1) + OPTVARS.append(EPS_k) + + #print(VARS_regressorlist) + # self.constraint(Y_k - Y_pred) + + # --- build input vector x_test: + # --- order in regressor list: D U Y C + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + col_chunks = [] + for index, feature in enumerate(self.regressor_list): + + col_chunk = np.array([VARS_regressorlist[index][ + k: k + 1 + feature.lag]]) # --- in meiner STR indizierung, nicht listenindex! + print('chunk len:') + print(len(VARS_regressorlist[index][k: k + feature.lag + 1])) + # print(VARS_regressorlist[index][k: k + feature.lag + 1]) + print(feature.var_name) + print(col_chunk.shape) + # absolute position in der jeweiligen Unterliste von VARS_regressorlist + col_chunks.append(col_chunk.reshape(1, -1)) + # print(col_chunks) + #quit() + x_test = np.hstack(col_chunks) + print('x_test') + print(x_test.shape) + + dY_pred = self.gp.GP_eval(x_test.reshape(1, -1)) + # --- get last value from Y-list within VARS_regressorlist, which is previous Y_k and add dY_pred + Y_pred = VARS_regressorlist[len(self.D) + len(self.U)][-1] + dY_pred + + # self.constraint(Y_k - Y_pred) + # self.constraint(C_k - dY_pred) + # for index, feature in enumerate(self.Y): + for i in range(self.nY): + VARS_regressorlist[i + len(self.D) + len(self.U)].append(Y_pred) + VARS_regressorlist[len(self.D) + len(self.U) + len(self.Y)].append(dY_pred) + + self.constraint(Y_pred + EPS_k - LB_syms[k], 0, inf) + self.constraint(Y_pred + EPS_k - UB_syms[k], -inf, 0) + + obj = obj + EPS_k.T @ Q @ EPS_k # + U_k.T @ R @ U_k + ref = [VARS_regressorlist[0][4 + k] - 293.15, 0] + for i in range(self.nU): + obj = obj + (U_k[i] - ref[i]) **2 * self.R_val[i] + obj = obj + (VARS_regressorlist[i + len(self.D)][-2] - VARS_regressorlist[i + len(self.D)][-1]) ** 2 * \ + dR[i] + # dU über vars_regressor_list[i+len(self.D)] realisieren + # --- create NLP + nlp = {'x': vertcat(*OPTVARS), + 'f': obj, + 'g': vertcat(*self.g), + 'p': vertcat(*PARVARS) + } + self.optvars4print = vertcat(*OPTVARS) + opts_ipopt = {'verbose': False, 'ipopt': {'max_iter': 3000, 'print_level': 4}} + + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + def get_controls(self, values_D, values_U, values_Y, values_C, values_LIM): + PARVARS_values = [*values_D, *values_U, *values_Y, *values_C, *values_LIM] + call_time = time.time() + solution = self.controller(lbg=vertcat(*self.lbg), ubg=vertcat(*self.ubg), p=vertcat(*PARVARS_values)) + self.comp_times.append(time.time() - call_time) + print(solution) + print(solution['x']) + + control_dict = self.control2dict(solution['x']) + # u_opt = self.process_controls(solution['x']) + return control_dict + + def constraint(self, eq, lb=0, ub=0): + ''' + :param eq: equation / term for constraint + :param lb: lower bound, default = 0 -> equality constraint + :param ub: upper bound, default = 0 -> equality constraint + :return: + ''' + self.g.append(eq) + self.lbg.append(lb) + self.ubg.append(ub) + + def control2dict(self, solution): + print(solution) + print(self.optvars4print) + control_dict = {} + # for i in range(self.N): + temperatures = [] + temperatures = solution[0] # --- single shooting ! + for index, feature in enumerate(self.U): + control_dict[feature.var_name] = solution[1 + index].full()[0][0] # --- hier nochmal genau schauen! + print(control_dict) + print(solution) + #quit() + return control_dict + + + +class GPR_MPC: + + def __init__(self, DataHandler, GPR_Model, N = 5, control = True) : # --- maybe pass disturbances df as argument instead of loading from DataHandler + + self.N = N + self.ref = 295 + + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + # --- load disturbances (pre known for whole time horizon) + try: + self.disturbances_df = self.DataHandler.disturbances_df + + except AttributeError: + print('Default disturbance data is used ! ') + self.disturbances_df = read_pkl("C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_14-03_15_03\\disturbances.pkl" ) + + # --- time steps and horizon + self.step_size = self.DataHandler.step_size + + # --- feature (regressor) lists by type of feature (U,D,Y,C) + self.U = [feature for feature in self.model.U if feature.is_regressor] + self.D = [feature for feature in self.model.D if feature.is_regressor] + try: + self.D.extend( [feature for feature in self.model.c_D]) #if (feature.is_regressor and feature.feature in self.model.D)]) + except AttributeError: + print('no disturbance derivative in Model') + self.Y = [feature for feature in self.model.Y if feature.is_regressor] + self.C = [feature for feature in self.model.C if (feature.is_regressor and feature.feature in self.model.Y)] + print(self.D) + print(len(self.C)) + + self.nY = len(self.Y) + self.nU = len(self.U) + + if control is True: + self.create_controller() + + + def __call__(self, *args): + + df = args[0].copy() # --- "live" beschriebenes df mit features + print(df) + current_time = int(df['SimTime'][-1:].values) + + regressor_lags = [feature.lag for feature in self.regressor_list] + if len(df.index) <= max(regressor_lags) + 1: + print('Waiting for regressors to be simulated... ') + return dict() + + # --- obtain already known values to be passed as PARVARS to solver + loc_d = current_time / self.step_size #+ 1 # via SIMTIME ? oder über current_time und step_size + values_D = [] + for feature in self.D: + values_D.extend(list(self.disturbances_df.loc[loc_d-feature.lag: loc_d + self.N, feature.var_name])) + loc = -1 + # VLL für alle lieber iloc verwenden, falls nicht bei 0 anfängt zu zählen + values_U = [] + for feature in self.U: + values_U.extend(list(df.iloc[loc-feature.lag:-1][ feature.var_name])) + + values_Y = [] + for feature in self.Y: + values_Y.extend(list(df.iloc[loc-feature.lag::][ feature.var_name])) + + ''' + only valid for c = dy_1 = T_AirRoom + ''' + + values_C = [] + for c in self.C: + # if c.feature in D andere Behandlung, vll eigene Liste values_C_d + print(c) + values_aux1 = list(df.iloc[loc-c.lag::][ self.Y[0].var_name]) + values_aux2 = list(df.iloc[loc-c.lag-1: loc][ self.Y[0].var_name]) + print('aux') + print(values_aux1) + print(values_aux2) + for i in range(c.lag+1): + values_C.append(values_aux1[i] - values_aux2[i]) + + print(values_D) + print(values_C) + print(values_Y) + # obtain controls + control_dict = self.get_controls(values_D, values_U, values_Y, values_C ) + + return control_dict + + def create_controller(self): + N = self.N + # --- initialization + PARVARS = [] + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + OPTVARS = [] + # --- OPTVARS order: + self.g = [] + self.lbg = [] + self.ubg = [] + + # --- fill PARVARS with symbolics, order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1], Y[0] is set via constraint + # --- Also: build list with lists of symbolic VARS for each feature to build x_test from this list + VARS_regressorlist = [] + for index, feature in enumerate(self.D): + VARS_feature = [] + for k in range(-feature.lag, N+1): + D_k = SX.sym('par D_' + str(index) + str(k), 1) + VARS_feature.append(D_k) + PARVARS.append(D_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.U): + VARS_feature = [] + for k in range(-feature.lag, 0): + U_k = SX.sym('par U_' + str(index) + str(k), 1) + VARS_feature.append(U_k) + PARVARS.append(U_k) + VARS_regressorlist.append(VARS_feature) + + + for index, feature in enumerate(self.Y): + VARS_feature = [] + for k in range(-feature.lag, 1): + Y_k = SX.sym('par Y_' + str(index) + str(k), 1) + VARS_feature.append(Y_k) + PARVARS.append(Y_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.C): + VARS_feature = [] + for k in range(-feature.lag, 1): + C_k = SX.sym('par C_' + str(index) + str(k), 1) + VARS_feature.append(C_k) + PARVARS.append(C_k) + VARS_regressorlist.append(VARS_feature) + + # --- constraint initial state + Y_0_opt = SX.sym('Y_0_opt', 1) + OPTVARS.append(Y_0_opt) + self.constraint(Y_k - Y_0_opt) + + # --- initialize MPC Multiple Shooting loop + ''' bester Run bisher: mit 0703 21 46 Datenset + Q = diag(self.nY) * 50 + R = diag([500,10,20,10]) * 1 + dR = [50,50,50,50] + ''' + obj = 0 + + self.Q_val = 20 + self.R_val = [1, 1, 1, 1] + self.dR_val = [8, 8, 8, 8] + Q = diag(self.nY) * self.Q_val # old FMU Q = diag(self.nY) * 50 + R = diag(self.R_val) * 1 # old FMU : R = diag([10, 5, 2, 2]) * 1 + dR = self.dR_val # old FMU: dR = [15, 15, 10, 10] + + print('initialize MPC_loop:') + # --- Multiple Shooting Loop: + for k in range(self.N): + + print('\n\nloop '+str(k)+' of '+str(self.N)+ '\nload symbolic GPR inputs:\n') + Uk = [] + + U_k = SX.sym('U_' + str(k), self.nU) + OPTVARS.append(U_k) + #for index, feature in enumerate(self.U): + for i in range(self.nU): + VARS_regressorlist[i + len(self.D)].append(U_k[i]) + self.constraint(U_k[i], 0.02, 1) # 0.02 + + Y_k = SX.sym('Y_' + str(k + 1), self.nY) + OPTVARS.append(Y_k) + + C_k = SX.sym('C_' + str(k+1), 1) + OPTVARS.append(C_k) + + # --- build input vector x_test: + # --- order in regressor list: D U Y C + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + col_chunks = [] + for index, feature in enumerate(self.regressor_list): + # print(str(index)) + # print(VARS_regressorlist[index]) + col_chunk = np.array([VARS_regressorlist[index][k : k+1+feature.lag]]) # --- in meiner STR indizierung, nicht listenindex! + # print('chunk len:') + # print(len(VARS_regressorlist[index][k : k + feature.lag+ 1])) + print(VARS_regressorlist[index][k : k + feature.lag+ 1]) + + # absolute position in der jeweiligen Unterliste von VARS_regressorlist + col_chunks.append(col_chunk) + #print(col_chunks) + x_test = np.hstack(col_chunks) + print('\ndim(x_test): ' + str(x_test.shape)) + + dY_pred = self.gp.GP_eval(x_test.reshape(1,-1)) + # --- get last value from Y-list within VARS_regressorlist, which is previous Y_k + Y_pred = VARS_regressorlist[len(self.D) + len(self.U)][-1] + dY_pred + + self.constraint(Y_k-Y_pred) + self.constraint(C_k-dY_pred) + # for index, feature in enumerate(self.Y): + for i in range(self.nY): + VARS_regressorlist[i + len(self.D) + len(self.U)].append(Y_k[i]) + VARS_regressorlist[len(self.D) + len(self.U) + len(self.Y)].append(C_k) + + obj = obj + (Y_pred - self.ref).T @ Q @ (Y_pred - self.ref) + U_k.T @ R @ U_k + for i in range(self.nU): + obj = obj + (VARS_regressorlist[i + len(self.D)][-2] - VARS_regressorlist[i + len(self.D)][-1])**2 * dR[i] + # dU über vars_regressor_list[i+len(self.D)] realisieren + + # --- create NLP + nlp = {'x': vertcat(*OPTVARS), + 'f': obj, + 'g': vertcat(*self.g), + 'p': vertcat(*PARVARS) + } + self.optvars4print = vertcat(*OPTVARS) + opts_ipopt = {'verbose': False, 'ipopt':{'max_iter': 3000, 'print_level':5}} + + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + def get_controls(self, values_D, values_U, values_Y, values_C): + PARVARS_values = [*values_D, *values_U, *values_Y, *values_C] + + solution = self.controller(lbg=vertcat(*self.lbg), ubg=vertcat(*self.ubg), p=vertcat(*PARVARS_values)) + print(solution) + print(solution['x']) + control_dict = self.control2dict(solution['x']) + #u_opt = self.process_controls(solution['x']) + return control_dict + + def constraint(self, eq, lb=0, ub=0): + ''' + :param eq: equation / term for constraint + :param lb: lower bound, default = 0 -> equality constraint + :param ub: upper bound, default = 0 -> equality constraint + :return: + ''' + self.g.append(eq) + self.lbg.append(lb) + self.ubg.append(ub) + + def control2dict (self, solution): + print(solution) + print(self.optvars4print) + control_dict = {} + #for i in range(self.N): + temperatures = [] + temperatures = solution[::6] + for index, feature in enumerate(self.U): + control_dict[feature.var_name] = solution[1+index].full()[0][0] # --- hier nochmal genau schauen! + print(control_dict) + print(solution) + #quit() + return control_dict + + def description(self): + a = self.DataHandler.fmu.start_time + b = self.DataHandler.fmu.stop_time + c = (a-b)/ self.step_size + return f'MPC-ref controller from {a/86400} until {b/86400} (timepoints = {c})' + + + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/GP_regression.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/GP_regression.py new file mode 100644 index 0000000000000000000000000000000000000000..13fa8fb2895157ffb1bd76252d7547480356f518 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/GP_regression.py @@ -0,0 +1,175 @@ +import GPy +import numpy as np +import time +import datetime +from pickle_handler import * +#from casadi import * +'''' +universal GP Regression class +''' + +class GP_Regression: + + def __init__(self, X_train, Y_train, abs = True, ARD=True): + ''' + :param X_train_abs: Regressor training data, npArray, shape: (N, D) (D: number of regressors, N: number of samples) + :param Y_train_abs: Target training data, npArray, shape: (N, number_of_targets) + :param abs: set True for absolute values + :param ARD: set True for automatic relevance detection kernel + ''' + self.X_train = X_train + self.x_min = np.amin(self.X_train, axis = 0) + self.x_max = np.amax(self.X_train, axis = 0) + + self.Y_train = Y_train + self.y_min = np.amin(self.Y_train, axis=0) + self.y_max = np.amax(self.Y_train, axis=0) + + if abs: + self.X_train = self.normalise_X(self.X_train, casadi_eval=False) + self.Y_train = self.normalise_Y(self.Y_train, casadi_eval=False) + + self.N = self.X_train.shape[0] + self.D = self.X_train.shape[1] + + self.ARD = ARD + + def set_new_data(self, X_train, Y_train): + + self.X_train = X_train + self.Y_train = Y_train + self.N = self.X_train.shape[0] + self.D = self.X_train.shape[1] + + + + def opt_hyperparam(self, restarts = 1, induce = False): + ''' + yields Theta, an array of hyperparams (length_params, kernel variance, noise variance) + GPy is used for optimization, it may be outdated, but offers and has a simple interface for this operation + (i.e. ARD GPR kernel not possible with scikit learn) + ''' + # m.kern.variance.prior = GPy.priors.Gamma(1, 0.1) + print('optimize hyperparameters') + kernel = GPy.kern.RBF(input_dim=self.D, ARD=self.ARD) + if induce is True: + m = GPy.models.SparseGPRegression(self.X_train, self.Y_train, kernel=kernel,num_inducing=300) + else: + m = GPy.models.GPRegression(self.X_train, self.Y_train, kernel, noise_var=1e-6) # NOISE VAR mal austesten + m.optimize( messages = True, max_iters = 200) # (optimizer='scg', + m.optimize_restarts(num_restarts=restarts, messages=True, max_iters=200) + print(m) + len_scales = [kernel.lengthscale[i] for i in range(self.D)] + + theta = [len_scales, kernel.variance[0], m.Gaussian_noise.variance[0]] + self.theta = theta + + def set_up_reg(self): + ''' + calculates values needed for actual regression + ''' + self.K = self.kernel(self.X_train, self.X_train) # --- without kernel noise, dim(K) = NxN (#datapoints) + # --- Idee: while Schleife, bis kein error + # --- Idee: scipy linalg statt numpy + #self.jitter = self.theta[2]**2 + self.jitter = 0 + counter = 1 + while True: + if self.jitter > 1e-3: + print('\n'+str(self.jitter)+' was not enough noise.') + break + try: + self.L = np.linalg.cholesky(self.K + np.eye(self.N) * self.jitter) + print('Cholesky succeeded!') + break + except np.linalg.LinAlgError: + print('Matrix numerically not p. sd. ... adding noise') + self.jitter = self.theta[2] * 10**(counter) + print(str(counter)+', new jitter: '+str(self.jitter)) + counter+=1 + + self.alpha = np.linalg.solve(self.L.T, np.linalg.solve(self.L, self.Y_train)) + + def kernel(self, a, b, eval=False): + # --- RBF ARD kernel function + kernelParameter_l = self.theta[0] + kernelParameter_sigma = self.theta[1] # **2 + + a = a / kernelParameter_l + b = b / kernelParameter_l + + sqdist = np.sum(a ** 2, axis=1).reshape(-1, 1) + np.sum(b ** 2, 1) - 2 * np.dot(a, b.T) + # --- multidim. binomial equation, (a-b).T*(a-b) = a^2 + b^2 - 2ab.T + + if eval: + return kernelParameter_sigma * np.exp(-0.5 * sqdist) # bc kronecker delta ;) + else: + return kernelParameter_sigma * np.exp(-0.5 * sqdist) + np.eye(self.N) * self.theta[2] # **2 + + def normalise_X(self, X, reverse = False, casadi_eval = True): + if reverse: + x_out = self.x_min + (self.x_max - self.x_min)*X + else: + x_out = (X - self.x_min) / (self.x_max - self.x_min) + if not casadi_eval: + if np.isnan(np.sum(x_out)): + print('Constant value in training data!\nWill set Nan to zero.') + x_out = np.nan_to_num(x_out) + return x_out + + def normalise_Y(self, Y, reverse = False, casadi_eval = True): + + self.norm_amplitude = 0.5 + if reverse: + # y_out = self.y_min + (self.y_max - self.y_min)*Y # [0,1] + y_out = self.y_min + (self.y_max - self.y_min) * (Y + self.norm_amplitude) / (2*self.norm_amplitude) + else: + # y_out = (Y - self.y_min) / (self.y_max - self.y_min)# [0,1] : + y_out = ( (Y - self.y_min) *2*self.norm_amplitude / (self.y_max - self.y_min) ) - self.norm_amplitude + #if not casadi_eval: + # if np.isnan(np.sum(y_out)): + # print('Constant value in training data!\nWill set Nan to zero.') + # x_out = np.nan_to_num(y_out) + return y_out + + def GP_eval(self, x_test, normalise = True, with_variance = False): + print(normalise) + ''' + :param x_test: input vector, shape: amount_of_test_points,D (normally 1 test point) + :param normalise: set False if normalising procedure ill for Casadi MPC + :return: corresponding GPR output to x_test + ''' + + if normalise: + x_test = self.normalise_X(x_test) + k_star = self.kernel(self.X_train, x_test, eval=True) + #print(k_star) + f_mean = np.dot(k_star.T, self.alpha) + + if with_variance: + # --- output variance as 2nd output, variance = covariance of random var with itself + v = np.linalg.solve(self.L, k_star) + #print(v) + variance = self.kernel(x_test, x_test, eval = True) - np.dot(v.T, v) #+noise variance if wanted + + std_dev = np.sqrt(variance) # --- mean + 1,2,3 sigma = 68,95,99.7 % f +- 2sigma -> 95 % interval + if normalise: + # --- inverse normalisation + f_mean = self.normalise_Y(f_mean, reverse = True) + std_dev = std_dev*(self.y_max - self.y_min) /(2*self.norm_amplitude) # ??? Aber müsste so stimmen + return f_mean, 2*std_dev + else: + if normalise: + # --- inverse normalisation + f_mean = self.normalise_Y(f_mean, reverse = True) + return f_mean + + def save_GPR(self, path: str): + + write_pkl(self, 'GPR_{date:%m-%d_%H_%M}'.format(date=datetime.datetime.now()), path) + + + + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/controllers.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/controllers.py new file mode 100644 index 0000000000000000000000000000000000000000..622a92d746d3ffc97e6a47ee6cb0b02fb76bc8ca --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/controllers.py @@ -0,0 +1,288 @@ +import time +import scipy.stats +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import math +import random +import pickle_handler +import fmu_handler +import tensorflow.keras +from data_manager import * +from tensorflow.keras import models +#from casadi_neural_network import * + + +class controller: + + def __init__(self, data_handler): + + self.debug_mode = False + + # data handler and step size + self.data_handler = data_handler + self.step_size = data_handler.step_size + + # current time + self.current_time = None + + # define target Temperatures + self.target_day = 273.15 + 21 + self.target_night = 273.15 + 18 + + # define target Temperatures + self.comfort_limits_day = [273.15 + 20, 273.15 + 22] + self.comfort_limits_night = [273.15 + 17, 273.15 + 26] + + # define working hours + self.working_hours = [6, 18] + + # trackcomfort + self.comfort_error_list = list() + self.current_comfort = list() + + # track target + self.target_error_list = list() + self.target_list = list() + self.current_target = self.target_night + + # create control dict + self.control_dict = dict() + + def get_disturbances(self, current_time: int, past_steps: int, future_steps: int): + """ + returns disturbances data frame for a specific time window + """ + + start_time = current_time - self.step_size * past_steps + stop_time = current_time + self.step_size * future_steps + + # load disturbances + df = self.data_handler.disturbances_df + df = df[((df['SimTime'] >= start_time) & (df['SimTime'] <= stop_time))] + + if len(df.index) < past_steps: + raise ValueError('Please make sufficient weather data is available.') + + return df + + def get_comfort_limitations(self, current_time: int, future_steps=1): + """ + returns comfort limitations for current time and future steps + """ + assert current_time is not None and future_steps > 0 + + limitations = list() + for t in range(future_steps): + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size) + + # append limits to the target data frame + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + limitations.append(self.comfort_limits_day) + else: + limitations.append(self.comfort_limits_night) + + if self.debug_mode: + print('limits:', limitations) + + return limitations + + def get_random_target(self, current_time): + + assert type(current_time) is not None + + limits = self.get_comfort_limitations(current_time) + + ret = random.uniform(limits[0][0], limits[0][1]) + + return ret + + def get_target(self, current_time: int, future_steps=1): + + assert type(current_time) is not None and future_steps > 0 + + debug_mode = False + + ret = list() + + for t in range(future_steps): + + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size) + + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + ret.append(self.target_day) + else: + ret.append(self.target_night) + + if debug_mode: + print('Target_list:', ret) + + return ret + + @staticmethod + def get_time_dict(seconds: int): + result = dict() + + intervals = ( + ('weeks', 604800), + ('days', 86400), + ('hours', 3600), + ('minutes', 60), + ) + + for name, count in intervals: + value = seconds // count + seconds -= value * count + result[name] = value + return result + + @staticmethod + def get_casadiANN(keras_model_name): + """ + returns the casadi ann object + """ + + KerasModel = models.load_model(keras_model_name) + # construct casadi ann + casadiANN = NeuralNetwork('ANN') + casadiANN.construct(KerasModel) + + return casadiANN + + def update(self, df: pd.DataFrame): + + # current time + self.current_time = df['SimTime'].iloc[-1] + + # return empty control dict, when + if len(df.index) < 2: + return False + + # chreck for refresh + self.check_refresh() + + # append target + self.target_list.append(self.current_target) + + # current limitations + self.current_comfort = self.get_comfort_limitations(current_time=self.current_time) + + # current error + y = df[self.data_handler.model.Y[0].var_name].iloc[-1] + error = max([min([0, y - self.current_comfort[0][0]]), max([0, y - self.current_comfort[0][1]])], key=abs) + self.comfort_error_list.append(error) + + self.target_error_list.append(y - self.current_target) + + return True + + def check_refresh(self): + + # refresh, when comfort changes + f_limits = self.get_comfort_limitations(current_time=self.current_time-self.step_size, future_steps=2) + + if f_limits[0] != f_limits[1]: + self.refresh() + + def refresh(self): + + return 0 + + + +class pid_target(controller): + + def __init__(self, data_handler, no_control_name = None, random_target=False): + self.no_control_name = no_control_name + # call super + super(pid_target, self).__init__(data_handler) + self.start_time = self.data_handler.fmu.start_time + self.stop_time = self.data_handler.fmu.stop_time + self.sim_time = self.stop_time - self.start_time + self.timepoints = self.sim_time / data_handler.step_size + self.ki = dict() + self.kp = dict() + self.kd = dict() + + # new parameters + + for u in self.data_handler.model.U: + #if 'Ahu' in u.display_name: + self.kp[u.var_name] = 0.1 #0.0001 + self.ki[u.var_name] = 0.00005 #.01 + self.kd[u.var_name] = 0.01 #.001 + + + self.integral = 0 + print('random_target:' + str(random_target)) + self.random_target = random_target + self.refresh_rate = 1 + + + def __call__(self, *args, **kwargs): + + # update controller + if not self.update(args[0]): + return dict() + + # new target + if self.random_target is True: + # get new random target via refresh + if self.current_time % self.refresh_rate == 0: + self.refresh_rnd() + else: + self.current_target = self.get_target(self.current_time)[0] + + # update integral (i[0] = i[-1] + e * dt + self.integral += self.target_error_list[-1] * self.step_size + + # error + error = self.target_error_list[-1] + + # delta + delta = args[0][self.data_handler.model.Y[0].var_name].iloc[-1] - args[0][self.data_handler.model.Y[0].var_name].iloc[-2] + + for u in self.data_handler.model.U: + + kp = self.kp[u.var_name] + ki = self.ki[u.var_name] + kd = self.kd[u.var_name] + + if u.info == 'cooler': + self.control_dict[u.var_name] = u.lb + (kp * error + ki * self.integral + kd * delta) * (u.ub - u.lb) + elif u.info == 'heater': + self.control_dict[u.var_name] = u.lb - (kp * error + ki * self.integral + kd * delta) * (u.ub - u.lb) + + if self.control_dict[u.var_name] > u.ub: + self.control_dict[u.var_name] = u.ub + elif self.control_dict[u.var_name] < u.lb: + self.control_dict[u.var_name] = u.lb + + if self.no_control_name is not None: + for name in self.no_control_name: + self.control_dict[name] = 0 + + return self.control_dict + + def __str__(self): + + avrg_err = round(np.abs(np.array(self.comfort_error_list)).mean(), 4) + + return f'PID Regler (avrg_err={avrg_err}K)' + + def refresh_rnd(self): + + # refresh rate in hours + self.refresh_rate = 4*3600 + + # new target + self.current_target = self.get_random_target(self.current_time) + + + print('New target:', round(self.current_target, 4)) + + def description(self): + return f'PID controller from {self.start_time/86400} until {self.stop_time/86400} (timepoints = {self.timepoints})' + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/data_manager.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/data_manager.py new file mode 100644 index 0000000000000000000000000000000000000000..1f03f2710fe8d21d6bea1a11806619224c75f9bb --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/data_manager.py @@ -0,0 +1,446 @@ +import matplotlib +import datetime +import pyDOE +import os +import matplotlib.dates as mdates +import matplotlib.pyplot as plt +import pandas as pd +import numpy as np + +from pickle_handler import * +import controllers +from fmu_handler import FMU +from GP_regression import * +from GPR_mpc import * +from ebc_colors import * + + +class Feature: + + def __init__(self, + display_name: str, + var_name: str, + lag=0, + is_regressor = True, + is_target = False, + unit = '',): + ''' + :param var_name: Name as used in FMU + ''' + self.display_name = display_name + self.var_name = var_name + self.lag = lag + self.is_regressor = is_regressor + self.is_target = is_target + self.unit = unit + + def __str__(self): + return f'[{self.var_name}]' #{self.display_name} + + +class Control(Feature): + + def __init__(self, + display_name: str, + var_name: str, + lb: float, + ub: float, + info: str, + lag=0, + is_regressor = True, + is_target = False, + unit = '' + ): + + super(Control, self).__init__(display_name, var_name, lag, is_regressor, is_target) + + self.lb = lb + self.ub = ub + self.info = info + +class Derivative(Feature): + + def __init__(self, feature, is_regressor = True, is_target = False, lag = 0, operator = 'd'): + + self.feature = feature + var_name = f'd {self.feature.var_name}' + display_name = f'd {self.feature.display_name}' + unit = self.feature.unit + super(Derivative, self).__init__(display_name, var_name, lag, is_regressor, is_target) + +class Model: + + def __init__(self, D, c_D, U, Y, C): + + for u in U: + if type(u) is not Control: + raise ValueError('U must be a List of Control type objects!') + + # List of Features + self.D = D # disturbances + self.c_D = c_D # derivatives of D + self.U = U # controls + self.Y = Y # controlled + # self.c_Y + self.C = C # derivative of Y + + self.create_lists() + + + def description(self): + lines = [] + #print('\n' + lines.append('List of regressors in model (also order of regressors in X_train/GPR input) :') + for feature_list in [self.regressor_list, self.target_list]: + for index, feature in enumerate(feature_list): + lines.append('\t'+str(index)+str(feature)+' lag: '+str(feature.lag) + '\tRegressor: '+str(feature.is_regressor)+'\tTarget: '+str(feature.is_target)) + if feature_list==self.regressor_list: + lines.append('\n Targets:') + # lines.append('Order of regressors (for matching lenghtscale):') + # lines.append(str()) + return lines + + def create_lists(self): # --- create ? + + self.regressor_list = [feature for feature in self.all() if feature.is_regressor] + self.target_list = [feature for feature in self.all() if feature.is_target] + + self.regressor_list_str = [feature.var_name for feature in self.all() if feature.is_regressor] + self.list_all_str = [feature.var_name for feature in self.all() if feature.is_regressor or feature.is_target] + ''' GEFÄHRLICH WENN NICHT AUTOREGRESSIVE VARIABLE GELERNT WIRD ''' + self.target_list_str = [feature.var_name + ' (t+1)' for feature in self.all() if feature.is_target] + + def all(self): + return self.D + self.c_D + self.U + self.Y + self.C + + +class DataHandler: + + def __init__(self, model: Model, fmu: FMU): + + self.model = model + self.controller = None + self.controller_desc = [] + + self.fmu = fmu + self.step_size = self.fmu.step_size + + # data storage + self.raw_data = [] # --- list with df's from FMU + self.processed_data = [] + self.reg_data = None # --- final list of np arrays X_train, Y_train with shape (N,D) + + # --- flags: + self.GP_setup_done = False + + def simulate(self, start_time: int, stop_time: int, controller = None): + + # set start/stop time + self.fmu.start_time = start_time + # --- maybe add settling time + self.fmu.stop_time = stop_time + # --- set controller and add to list + if controller == 'lhs': + self.controller = lhs_ctrl(self) # class in GPR_mpc script + elif controller == 'zero': + self.controller = zero_ctrl(self) # class in GPR_mpc script + elif controller == 'PID': + self.controller = controllers.pid_target(self) # class in controllers script. Variant from Max original controller + elif controller == 'PID_random': + self.controller = controllers.pid_target(self, random_target=True) + elif controller == 'PID_no_AHU': + self.controller = controllers.pid_target(self, no_control_name=["valveHeaterSet","valveAHUCoolerSet"]) + elif controller == 'PID_no_CCA': + self.controller = controllers.pid_target(self, no_control_name=["valveTabsHotSet","valveTabsColdSet"]) + else: + self.controller = controller + if self.controller == None: + print('please pass controller or valid controller name') + quit() + + # run the FMU + try: + variables = [feature.var_name for feature in self.model.all()] + except AttributeError: + print('no disturbance derivative in Model') + variables = [feature.var_name for feature in self.model.D + self.model.U + self.model.Y + self.model.C] + print(variables) + df = self.fmu.run(features=variables, controller=self.controller) + + self.raw_data.append(df) + try: + self.controller_desc.append(self.controller.description()) + except AttributeError: + pass + # a, b = follow_up_slave(df, datagen=True, controller=self.controller) + return df + + + def simulate_for_disturbances(self, start_time: int, stop_time: int): + ''' + Runs FMU to obtain disturbance values over simulation time + :return: data frame with obtained disturbances + ''' + self.fmu.start_time = start_time + self.fmu.stop_time = stop_time + + # collect variable names for all disturbances + variables = [] + for feature in self.model.D: + variables.append(feature.var_name) + + for feature in self.model.C: + if type(feature.feature) in self.model.D: + variables.append(feature.var_name) + + # run the fmu without a controller + disturbances_df = self.fmu.run(variables) + + if len(self.model.c_D) is not 0: + disturbances_df = self.insert_derivative(disturbances_df) # --- CHECK IF USEFUL ! + # --- method checks, if derivative wanted + + # save the generated df + self.disturbances_df = disturbances_df + + return disturbances_df + + def insert_derivative(self, df): + ''' + inserts derivative of feature to dataframe if part of model.C or model.c_D + ''' + + for c in [*self.model.c_D,*self.model.C]: + name = c.feature.var_name + if name in df.columns: + # create corresponding derivative + col_loc = df.columns.get_loc(name) + 1 + col_value = df[name] - df[name].shift(1) # --- discr. derivative: diff(last 2 values) + + df.insert(loc=col_loc, column=c.var_name, value=col_value) + + # delete first row + df = df[1:] + + return df + + def process_data(self): # NECESSARY ? + self.processed_data = [] + + for df in self.raw_data: + df = df.copy() + + df = self.insert_derivative(df) + df = self.keep_features(df) + + self.processed_data.append(df) + + def build_GPR(self, number_of_time_marks: int, method='linspace'): + # --- pack regression data into np.array X_train and Y_train + # --- Arrays NOT normalized, done in GPR_class + df = pd.concat(self.processed_data) + self.number_of_time_marks = number_of_time_marks + self.method = method + if method == 'lhs': + time_marks = pyDOE.lhs(1, number_of_time_marks, "m").ravel() * len(df.index) + elif method == 'linspace': + time_marks = np.linspace(1, len(df.index)-1, number_of_time_marks) + elif method == 'all': + time_marks = np.linspace(1, len(df.index)-1, len(df.index)-1) + else: + print('invalid method: choose lhs, linspace or all') + quit() + time_marks = time_marks.astype(int) + + for feature in self.model.regressor_list: + while np.amin(time_marks) <= feature.lag: + time_marks[np.argmin(time_marks)] += 1 + + time_marks = np.unique(time_marks) + self.time_marks = time_marks + + if np.amax(time_marks) > len(df.index): + print('Lag is larger than simulated time steps !') + quit() + else: + X_train = np.empty( (0, sum([feature.lag +1 for feature in self.model.regressor_list])), float ) + Y_train = np.empty( (0, len(self.model.target_list)), float ) + for i in time_marks: + col_chunks = [] + for feature in self.model.regressor_list: + col_chunks.append(np.array(df.iloc[i-feature.lag: i+1][feature.var_name]) ) # size(appendix) = lag+1 + X_train = np.append(X_train, [np.hstack(col_chunks)], axis = 0) + + target_values = [] + for target_name in self.model.target_list_str: # target_name = var_name + " (t+1)" + target_values.append( np.array(df.iloc[i][target_name]) ) # size(appendix) = 1 + # y_k+1 @ index i is corresponding to x_k @ index i + Y_train = np.append( Y_train, [np.hstack(target_values)], axis = 0) + + self.X_train = X_train + self.Y_train = Y_train + # instantiate GPR + self.my_GPR = GP_Regression(X_train, Y_train, abs = True) + return self.my_GPR + + def set_up_GPR(self, GPR_object): + GPR_object.opt_hyperparam() + GPR_object.set_up_reg() + self.my_GPR = GPR_object + self.GP_setup_done = True + + def keep_features(self, df, add_target = True): + """ + Deletes all irrelevant features from the data frame + if add_target is true, target variable is shifted, as prediction (k+1) is actual target + """ + + # only keep the selected features ACHTUNG, vgl. line 120 + # df = df[self.model.regressor_list_str].copy() + df = df[self.model.list_all_str].copy() + + # Deletes the first few columns ? ROW ? + df = df[1:].reset_index(drop=True) + + if add_target is True: + # Add output dimension + for feature in self.model.all(): + if feature.is_target: + + df[feature.var_name + ' (t+1)'] = df[feature.var_name].shift(-1) + + # Delete last row + df = df[:-1] + + return df + + def save(self, start_time): + + directory_name = 'stored_data\\data_{date:%d-%m_%H_%M}'.format(date=datetime.datetime.now()) + self.directory_name = directory_name + if not os.path.exists(directory_name): + os.makedirs(directory_name) + #else Sekunde dazu ? + + write_pkl(self, 'DataHandler', directory_name) + # write_pkl(self.disturbances_df, 'disturbances', directory_name) + + with open(directory_name+"\\model.txt", "w") as desc: + desc.write(self.method + 'sampling with ' + str(self.time_marks.size)+' datapoints\n'+ + ' @ dt='+str(self.step_size)+ ', start time: ' + str(int(start_time/86400)) + 'days\n' + + '\n'.join(self.controller_desc) +'\n\n'+'\n'.join(self.model.description())) + print('model description saved') + + if len(self.raw_data) != 0: + write_pkl(pd.concat(self.raw_data),'raw_data', directory_name) + if len(self.processed_data) != 0: + write_pkl(pd.concat(self.processed_data), 'processed', directory_name) + pd.concat(self.processed_data).to_excel(directory_name + "\\new_fmu_processed_test.xlsx") + + if self.GP_setup_done is True: + write_pkl(self.my_GPR, 'GPR_is_opt', directory_name) + else: + write_pkl(self.my_GPR, 'GPR_not_opt', directory_name) + + def load_disturbances(self): + self.disturbances_df = read_pkl('disturbances') + + +if __name__ == '__main__': + for lag in [4,8]: + #if True: + my_lag = lag + # define features + d_1 = Feature('T dry bulb', 'weaBus.TDryBul', lag = my_lag, unit = '°C') + + d_5 = Feature('H diffuse horizontal', 'weaBus.HDifHor', lag = my_lag, unit = 'W/m^2') + d_6 = Feature('H direct normal', 'weaBus.HDirNor', lag = my_lag, unit = 'W/m^2') + d_7 = Feature('H global horizontal', 'weaBus.HGloHor', lag = my_lag, unit = 'W/m^2') + + #d_13 = Feature('H diffuse horizontal', 'weaBus.TDewPoi', lag=4, unit='W/m^2') + #d_14 = Feature('H diffuse horizontal', 'weaBus.relHum', lag=4, unit='W/m^2') + #d_15 = Feature('H diffuse horizontal', 'weaBus.pAtm', lag=4, unit='W/m^2') + #d_16 = Feature('H diffuse horizontal', 'weaBus.HHorIR', lag=4, unit='W/m^2') + #d_17= Feature('H diffuse horizontal', 'weaBus.winDir', lag=4, unit='W/m^2') + #d_18 = Feature('H diffuse horizontal', 'weaBus.winSpe', lag=4, unit='W/m^2') + + + d_10 = Feature('humans', 'internal_gain_1', lag = my_lag) + d_11 = Feature('devices', 'internal_gain_2', lag = my_lag ) + d_12 = Feature('lights', 'internal_gain_3', lag = my_lag ) + + u_1 = Control('T_Ahu', 'TsetAHU', lb=-10, ub=10, info='heater', lag = my_lag ) # during Training auf 293 bezogen. + u_2 = Control('Q_cca', 'Q_flowTabs', lb=-3, ub=3, info='heater', lag = my_lag ) + + + y_1 = Feature('T Air', 'TAirRoom', lag = my_lag, unit = '°C', is_target=False) + dy_1 = Derivative(feature=y_1, is_target=True, is_regressor=True, lag = my_lag) + + + # instantiate Model + My_Model = Model(D=[d_1, d_5, d_6, d_7, d_10, d_11, d_12], + c_D = [], + U=[u_1, u_2], + Y=[y_1], + C=[dy_1], + ) + # --- SETTINGS + dt = 60 * 15 + start_time = 60 * 60 * 24 * 65*0 + stop_time = 60 * 60 * 24 * 20 + controller_interval = 60 * 60 * 24 *1 + data_points = 2880 + + # instantiate FMU + My_FMU = FMU(start_time=start_time, # overwritten anyways + stop_time=stop_time, # overwritten anyways + step_size= dt, + sim_tolerance=0.00001, + #fmu_file="C:\\Users\\arman\MA\\modelica_files\\ASHRAE140_900_Thermal_Zone\\ashrae140_900_simpleTabs_ctrl_fmu.fmu", + fmu_file = "C:\\Users\\arman\\MA\\modelica_files\\ASHRAE140_900_Thermal_Zone\\ashrae140_900_simpleTabs_no_ig_ctrl_fmu.fmu", + intgains_file='C:\\Users\\arman\MA\\modelica_files\\Benchmark_thermal_zone\\internal_gains.csv') + + # instantiate DataHandler + My_DataHandler = DataHandler(My_Model, My_FMU) + '''My_DataHandler.set_controller("all_zero") + df = My_DataHandler.simulate_for_disturbances(start_time, stop_time) + write_pkl(df, "dist_new", "stored_data\\dist") + df.to_excel('dist_new.xlsx') + quit()''' + # --- simulate data + with_MPC = False + if with_MPC is True: + folder_path_model = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_21-03_21_48\\" + My_GPR = read_pkl(folder_path_model + "GPR_is_opt.pkl") + MPC_controller = GPR_MPC(My_DataHandler,My_GPR) + + + My_DataHandler.simulate(start_time=start_time + 0 * controller_interval, + stop_time=start_time + 5 * controller_interval, + controller='PID_random') + + My_DataHandler.simulate(start_time=start_time + 5 * controller_interval, + stop_time=start_time + 10 * controller_interval, + controller='lhs') + quit() + """My_DataHandler.simulate(start_time=start_time + 21 * controller_interval, + stop_time=stop_time, + controller = 'zero')""" + + """#Um verschiedene lags zu testen: + folder_path_model = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\simple_tabs\\stored_data\\data_28-05_00_59\\" + My_DataHandler = read_pkl(folder_path_model + "DataHandler.pkl") + My_DataHandler.model = My_Model""" + + + My_DataHandler.process_data() + + GPR = My_DataHandler.build_GPR(data_points) + #My_DataHandler.set_up_GPR(GPR) + My_DataHandler.save(start_time) + a = [] + for i in GPR.theta[0]: + a.append(i.round(1)) + print(a) + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/fmu_handler.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/fmu_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..b16a123db82d9b256789ae82f103deff470ee2d7 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/fmu_handler.py @@ -0,0 +1,341 @@ +import matplotlib.pyplot as plt +import math +import pandas as pd +import fmpy +import fmpy.fmi2 +import shutil +import time +import pickle_handler + + +class FMU: + """ + The fmu handler class + """ + + def __init__(self, + start_time: int, + stop_time: int, + step_size: int, + sim_tolerance: float, + fmu_file: str, + intgains_file=None, + instanceName='fmu1', + ): + """[summary] + + Args: + start_time ([int]): Start time in sec usually 0 + sim_date ([datetime]): the datetime of the simulation time + stop_time ([int]): Stop time in sec + step_size ([int]): The time step size after which data is exchanged + sim_tolerance ([float]): The numeric tolerance of the solver usual 0.001 + fmu_file ([string]): The name of the FMU file + instanceName ([type]): A name of the FMU instance. FMPY specific can be random + """ + + assert start_time < stop_time + assert sim_tolerance > 0 + + self.start_time = start_time # start time + self.stop_time = stop_time # stop time + self.step_size = step_size # The macro time step + self.sim_tolerance = sim_tolerance # The total simulation tolerance + self.fmu_file = fmu_file + self.instanceName = instanceName + + # load internal gains data + self.intgains_file = intgains_file + self.df_intgains = None + if self.intgains_file is not None: + self.df_intgains = pd.read_csv(self.intgains_file, header=None) + + # read the model description + self.model_description = fmpy.read_model_description(self.fmu_file) + + # Collect all variables + self.variables = {} + for variable in self.model_description.modelVariables: + self.variables[variable.name] = variable + + # extract the FMU + self.unzipdir = fmpy.extract(self.fmu_file) + + def run(self, features: list, controller=None): + """ + :param features: List of all variables that are supposed to be tracked + :param controller: Controller from controller.py + :return: Returns simulated data + """ + + self.__init__(self.start_time, + self.stop_time, + self.step_size, + self.sim_tolerance, + self.fmu_file, + self.intgains_file, + 'fmu1') + + # keep only features, that are part of the fmu + ''' + Die Begrenzung evlt rausnehmen bzw erweitern, wenn Stellgrößenreduktion umgesetzt wird + oder "per Hand" zu df hinzufügen + ''' + features = [feature for feature in features if feature in self.variables] + + # initialize fmu + self.setup() + self.initialize() + + # initialize internal gains + self.write_variables(self.get_intgains(self.current_time)) + + # initialize data frame + df = pd.DataFrame(self.read_variables(features), columns=['SimTime', *features], index=[0]) + + while not self.do_step(): + + # update internal gains + self.write_variables(self.get_intgains(self.current_time)) + + if self.current_time % self.step_size == 0: + + # print time + self.display_time(self.current_time) + + # get the current state of the System + df = df.append(pd.DataFrame(self.read_variables(features), index=[0]), ignore_index=True) + + # set variables + if controller is not None: + mydict = controller(df) + if bool(mydict) is True: + mydict["TsetAHU"] = mydict["TsetAHU"] + 293.15 #290 + mydict["Q_flowTabs"] = mydict["Q_flowTabs"] * 1000 + else: + print("empty control dict") + self.write_variables(mydict) + #self.write_variables(controller(df)) + # delete last row to append last row with valid control + df.drop(df.tail(1).index, inplace=True) + + # read variables and add to data frame + df = df.append(pd.DataFrame(self.read_variables(features), index=[0]), ignore_index=True) + + # delete the fmu instance + self.close() + + return df + + def setup(self): + + # create fmu obj + self.fmu = fmpy.fmi2.FMU2Slave(guid=self.model_description.guid, + unzipDirectory=self.unzipdir, + modelIdentifier=self.model_description.coSimulation.modelIdentifier, + instanceName=self.instanceName) + + # instantiate fmu + self.fmu.instantiate() + + # The current simulation time + self.current_time = self.start_time + + # initialize model + self.fmu.reset() + self.fmu.setupExperiment( + startTime=self.start_time, stopTime=self.stop_time, tolerance=self.sim_tolerance) + + def initialize(self): + self.fmu.enterInitializationMode() + self.fmu.exitInitializationMode() + + def find_vars(self, start_str: str): + """ + Retruns all variables starting with start_str + """ + key = list(self.variables.keys()) + key_list = [] + for i in range(len(key)): + if key[i].startswith(start_str): + key_list.append(key[i]) + return key_list + + def get_value(self, var_name: str): + """ + Get a single variable. + """ + + variable = self.variables[var_name] + vr = [variable.valueReference] + + if variable.type == 'Real': + return self.fmu.getReal(vr)[0] + elif variable.type in ['Integer', 'Enumeration']: + return self.fmu.getInteger(vr)[0] + elif variable.type == 'Boolean': + value = self.fmu.getBoolean(vr)[0] + return value != 0 + else: + raise Exception("Unsupported type: %s" % variable.type) + + def set_value(self, var_name, value): + """ + Set a single variable. + var_name: str + """ + + variable = self.variables[var_name] + vr = [variable.valueReference] + + if variable.type == 'Real': + self.fmu.setReal(vr, [float(value)]) + elif variable.type in ['Integer', 'Enumeration']: + self.fmu.setInteger(vr, [int(value)]) + elif variable.type == 'Boolean': + self.fmu.setBoolean(vr, [value == 1.0 or value == True or value == "True"]) + else: + raise Exception("Unsupported type: %s" % variable.type) + + def do_step(self): + # check if stop time is reached + if self.current_time < self.stop_time: + # do simulation step + status = self.fmu.doStep( + currentCommunicationPoint=self.current_time, + communicationStepSize=self.step_size) + # augment current time step + self.current_time += self.step_size + finished = False + else: + print('Simulation finished') + finished = True + + return finished + + def close(self): + self.fmu.terminate() + self.fmu.freeInstance() + shutil.rmtree(self.unzipdir) + + del self.fmu + print('FMU released') + + def read_variables(self, vrs_list: list): + """ + Reads multiple variable values of FMU. + vrs_list as list of strings + Method retruns a dict with FMU variable names as key + """ + res = {} + # read current variable values ans store in dict + for var in vrs_list: + res[var] = self.get_value(var) + + # add current time to results + res['SimTime'] = self.current_time + + # add addierte inputs bei Inputreduktion + res['TsetAHU'] = res['TsetAHU'] - 293.15 # 290 + res['Q_flowTabs'] = res['Q_flowTabs'] / 1000 + ''' + ... res[u_AHU] = AHU_hot - AHU_cold ... + ''' + return res + + def write_variables(self, var_dict: dict): + ''' + Sets multiple variables. + var_dict is a dict with variable names in keys. + ''' + + for key in var_dict: + self.set_value(key, var_dict[key]) + return "Variable set!!" + + @staticmethod + def display_time(seconds, granularity=2): + result = [] + + if seconds % 3600 == 0: + for name, count in (('weeks', 604800), # 60 * 60 * 24 * 7 + ('days', 86400), # 60 * 60 * 24 + ('hours', 3600), # 60 * 60 + ('minutes', 60), + ('seconds', 1),): + value = seconds // count + if value: + seconds -= value * count + if value == 1: + name = name.rstrip('s') + result.append("{} {}".format(value, name)) + print(', '.join(result[:granularity])) + + def get_intgains(self, SimTime: int): + + if self.df_intgains is None: + return dict() + + while SimTime > 604740: + SimTime -= 604740 + + row = self.df_intgains[(self.df_intgains[0] <= SimTime)].tail(1) + + dict_intgains = {'internal_gain_1': row.iloc[0, 1], + 'internal_gain_2': row.iloc[0, 2], + 'internal_gain_3': row.iloc[0, 3], + } + + return dict_intgains + + def __enter__(self): + self.fmu.terminate() + self.fmu.freeInstance() + + +if __name__ == '__main__': + + fmpy.dump('FMU/thermal_zone_valve_ctrl_wea_base_solver.fmu') + exit() + + # create fmu object + My_FMU = FMU(start_time=3600 * 24 * 0, + stop_time=3600 * 24 * 365, + step_size=60 * 60 * 6, + sim_tolerance=0.0001, + fmu_file='FMU/thermal_zone_valve_ctrl_wea_base_solver.fmu', + intgains_file='internal_gains.csv') + + # print(My_FMU.find_vars('')) + + # create fmu instance + variables = ['TAirRoom', + 'weaBus.TDryBul', + 'weaBus.HDifHor', + 'weaBus.HDirNor', + 'weaBus.HGloHor', + 'weaBus.HHorIR', + 'weaBus.TBlaSky', + 'weaBus.TDewPoi', + 'internal_gain_1', + 'internal_gain_2', + 'internal_gain_3', + ] + + df = My_FMU.run(variables) + + # pickle_handler.write_pkl(My_FMU, filename='My_FMU') + + df[['TAirRoom']].plot() + plt.show() + + df[['weaBus.HDifHor', 'weaBus.HDirNor', 'weaBus.HGloHor']].plot() + plt.show() + + df[['weaBus.TDewPoi', 'weaBus.TDryBul', 'weaBus.TBlaSky']].plot() + plt.show() + + df[['internal_gain_1', 'internal_gain_2', 'internal_gain_3']].plot() + plt.show() + + df.to_excel('Weather.xlsx') diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/main.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/main.py new file mode 100644 index 0000000000000000000000000000000000000000..20356e2fdea42eb9d8eb2fe7b8b1817fd6266428 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/main.py @@ -0,0 +1,63 @@ +from pickle_handler import * +from data_manager import * +from GP_regression import * +from GPR_mpc import * +from ebc_colors import * +import pandas as pd +import matplotlib.pyplot as plt + +#names = ['13_05' ... ] +#for folder_ending in names ... folder path model = ... und abfahrt + +# --- load data +folder_path_model = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\simple_tabs\\stored_data\\data_28-05_18_07\\" +My_DH = read_pkl(folder_path_model + "DataHandler.pkl") +My_GPR = read_pkl(folder_path_model + "GPR_is_opt.pkl") + +# My_GPR = read_pkl(folder_path_model + "GPR_04-06_10_52.pkl") +print(My_GPR.X_train) +print(My_GPR.K.shape) +print(My_GPR.X_train.shape) +print(My_GPR.Y_train.shape) +#quit() +#My_GPR.opt_hyperparam() +#My_GPR.set_up_reg() +#My_GPR.save_GPR(path=folder_path_model) +dist = read_pkl("C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\dist\\dist_900.pkl" ) +print(dist) +print(My_DH.step_size) +My_DH.disturbances_df = dist + +# --- set controller +#My_DH.controller = GPR_MPC_comfort(My_DH, My_GPR) + +days = [] +mean_errors = [] +max_errors = [] + +start_day = 21 +while start_day<22: + #if (start_day-19)%7==0: + # start_day+=2 + start_time = 60 * 60 * 24 * start_day + stop_time = 60 * 60 * 24 * (start_day+7) + # controller_interval = (stop_time - start_time) / 2 + + # --- simulate data + controller = GPR_MPC_comfort_SS(My_DH, My_GPR, N=8) + my_df = My_DH.simulate(start_time=start_time, + stop_time=stop_time, controller = controller) + # my_df.to_excel(folder_path_model + "gpr_mpc_test_plot_Test"+str(start_day)+".xlsx") + # write_pkl(my_df, 'res_df', folder_path_model) + days.append(start_day) + + a, b = follow_up_slave(my_df, datagen=False, controller = My_DH.controller, path = folder_path_model, week = True) + mean_errors.append(a) + max_errors.append(b) + start_day+=1 + #write_pkl(my_df, "online_learning_bitch", folder_path_model) + +for i, day in enumerate(days): + print('Day '+ str(day) + ', Mean Abs Error and Max Abs Error:') + print(mean_errors[i]) + print(max_errors[i]) diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/pickle_handler.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/pickle_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..7d03aabbceae05107de604af9781fc7e23578b29 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/pickle_handler.py @@ -0,0 +1,35 @@ +import pickle +import os +import datetime + +spare_directory_name = 'stored_data\\data_SPARE_{date:%d-%m_%H_%M}'.format(date=datetime.datetime.now()) + +def read_pkl(fullpath: str): + fullpath = fullpath + if os.path.exists(fullpath): + pkl_file = open(fullpath, 'rb') + pkl_data = pickle.load(pkl_file) + pkl_file.close() + print('\nFile:', '"' + fullpath + '"', 'loaded.') + return pkl_data + else: + ValueError(fullpath + ' does not exist.') + + +def write_pkl(data, filename: str, directory_name: str): + + fullpath = directory_name + '\\' + filename + '.pkl' + + # make sure directory exists + if not os.path.exists(directory_name): + print('hallo') + os.makedirs(directory_name) + + # Open Data + pkl_file = open(fullpath, 'wb') + pickle.dump(data, pkl_file) + + # Print Status + print('\nFile:', '"' + fullpath + '"', 'saved.') + + pkl_file.close() diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/variance_test.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/variance_test.py new file mode 100644 index 0000000000000000000000000000000000000000..fb05e7b675044f2641effab44a92a72f1242c3e6 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_simple_tabs_skripte/variance_test.py @@ -0,0 +1,139 @@ +from pickle_handler import * +from data_manager import * +from GP_regression import * +from GPR_mpc import * +from ebc_colors import * +import pandas as pd +import matplotlib.pyplot as plt + + +if True: + f = lambda x: np.sin(0.9 * x).flatten() + x = np.arange(-5, 5, 0.1) + plt.plot(x, f(x)) + plt.axis([-5, 5, -1.5, 1.5]) + + # --- "Training" data and target definition + N = 8 # number of existing observation points (training points). + X = np.random.uniform(-5, 5, size=(N, 1)) # N training points + y = f(X) + print(X.shape) + y = y.reshape(-1, 1) + print(y) + plt.plot(X, y, 'k+', ms=18) + plt.show() + + + +if False: + X_train = np.array([[-0.9],[1.1],[1.5]]) + Y_train = np.array([[-1.08],[-0.31],[-2.45]]) + My_GPR = GP_Regression(X_train, Y_train, abs = False) + My_GPR.opt_hyperparam(restarts = 0) + My_GPR.set_up_reg() + n = 10000 # test points + x_test = np.linspace(-1.5, 3, n) # .reshape(-1,1) # np.array([0.3]) + print(x_test) + values = [] + devs = [] + for x in x_test: + x = x.reshape(1, -1) + #print(x) + #print('hallo') + f_test, std_dev = My_GPR.GP_eval(x, normalise = False, with_variance = True) + values.append(float(f_test)) + devs.append(float(std_dev)) + + print(devs) + values = np.array(values) + devs = np.array(devs) + plt.plot(list(x_test), values) + plt.gca().fill_between(x_test.flat, values-2*devs, values+2*devs, color="#dddddd") + plt.ylim(-4,3.25) + plt.show() + quit() + +if False: + f = lambda x: np.sin(0.9 * x).flatten() + x = np.arange(-5, 5, 0.1) + plt.plot(x, f(x)) + plt.axis([-5, 5, -1.5, 1.5]) + + # --- "Training" data and target definition + N = 5 # number of existing observation points (training points). + X = np.random.uniform(-5, 5, size=(N, 1)) # N training points + y = f(X) + print(X.shape) + y = y.reshape(-1,1) + print(y) + plt.plot(X, y, 'k+', ms=18) + #plt.show() + + My_GPR1 = GP_Regression(X,y,abs=False) + My_GPR1.opt_hyperparam(restarts=0) + My_GPR1.set_up_reg() + + print('hallo') + My_GPR2 = GP_Regression(X, y, abs=True) + My_GPR2.opt_hyperparam(restarts=2) + My_GPR2.set_up_reg() + + n = 50 # test points + x_test = np.linspace(-5, 5, n).reshape(-1, 1) # np.array([0.3]) + print(x_test) + std1 = [] + std2 = [] + f_mean1 = [] + f_mean2 = [] + for x in x_test: + x = x.reshape(1, -1) + # print(x) + # print('hallo') + f_test1, std_dev1 = My_GPR1.GP_eval(x, normalise = False, with_variance = True) + f_test2, std_dev2 = My_GPR2.GP_eval(x, normalise = True, with_variance = True) + std1.append(float(2*std_dev1)) + f_mean1.append(float(f_test1)) + std2.append(float(2*std_dev2)) + f_mean2.append(float(f_test2)) + print('this is x and std_dev w/o and w/ normal') + print(x) + print(4*std_dev1) + print(4*std_dev2) + plt.plot(x_test, f_mean1, 'r-') + plt.plot(x_test, f_mean2, 'g-') + plt.show() + plt.plot(x_test, std1, 'r') + plt.plot(x_test, std2, 'g') + plt.show() + +if False: + model_paths = [] + normalise = [] + # model_paths.append("C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_30-03_20_39\\") + # normalise.append(False) + # model_paths.append("C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_06-04_01_00\\") + folder_path_model = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\simple_tabs\\stored_data\\data_28-05_18_07\\" + normalise.append(True) + model_paths.append(folder_path_model) + bla_list = [] + for i, folder_path_model in enumerate(model_paths): + My_DH = read_pkl(folder_path_model + "DataHandler.pkl") + My_GPR = read_pkl(folder_path_model + "GPR_is_opt.pkl") + + folder_path_data = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_for_mining_PID_300\\" + #df = read_pkl(folder_path_data + "DataHandler.pkl").processed_data[0] + df = read_pkl(folder_path_model+ "online_learning_bitch.pkl") + print(type(df)) + print(len(df.index)) + tracker = variance_tracker(My_DH, My_GPR, df) + bla = tracker.track_variance(start_int=5, end_int=1900, normalise=normalise[i]) + tracker.extend_GPR(400, path = folder_path_model, save=True) + bla = np.array(bla[0]) + # bla.reshape(-1,1) + print(My_GPR.theta[1],My_GPR.theta[2]) + bla_list.append(bla) + + for bla in bla_list: + plt.plot(np.linspace(0, bla.size - 1, bla.size), bla) + print(bla) + plt.show() diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/GPR_mpc.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/GPR_mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..94ad005e1d54b0b71e1951acbc76aa96ad3473d0 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/GPR_mpc.py @@ -0,0 +1,1083 @@ +import numpy as np +import matplotlib.pyplot as plt +import matplotlib +#matplotlib.use('TKAgg') +import pandas as pd +import os +import datetime +from casadi import * +from pickle_handler import * +from data_manager import * +from GP_regression import * +import pyDOE + + +class lhs_ctrl: + def __init__(self, DataHandler, intervall = 6): #9 + print('lhs controller') + self.intervall = intervall + self.DataHandler = DataHandler + self.start_time = self.DataHandler.fmu.start_time + self.stop_time = self.DataHandler.fmu.stop_time + self.sim_time = self.stop_time - self.start_time + print(self.sim_time) + self.timepoints = self.sim_time / DataHandler.step_size + print(self.timepoints) + self.u_values = pyDOE.lhs(4, int(self.timepoints/intervall +2), criterion = 'c') # with zero insertion /2 ! + np.save("lhs_27_04_new5", self.u_values) + #self.u_values = np.load("lhs_27_04_new2.npy") # u_values # *(1-0.01)+0.01 New FMU does not require >0.01 + ''' + Einbauen, dass nach jeder control row 4x zero kommt bzw gekühlt wird, um zu gewährleisten, dass Temperatur + wieder absinkt ''' + print(self.u_values) + self.call_counter = 0 + self.control_row = -1 + self.counter_2 = 0 + + def __call__(self, *args): + if self.call_counter % self.intervall == 0: + self.control_row += 1 + control_dict = {} + for index, feature in enumerate(self.DataHandler.model.U): + control_dict[feature.var_name] = self.u_values[self.control_row,index] + self.call_counter += 1 + return control_dict + """ + + # Call with zero insertion : + def __call__(self, *args): + if self.call_counter % self.intervall == 0: + self.counter_2 +=1 + if self.call_counter % (self.intervall*2) ==0 : + self.control_row +=1 + control_dict = {} + for index, feature in enumerate(self.DataHandler.model.U): + if self.counter_2 % 2 == 0: + control_dict[feature.var_name] = self.u_values[self.control_row,index] + else: + control_dict[feature.var_name] = 0 + self.call_counter += 1 + return control_dict +""" + def description(self): + return f'LHS controller from {self.start_time/86400} until {self.stop_time/86400} (timepoints = {self.timepoints})' + + +class zero_ctrl: + + def __init__(self, DataHandler): + + self.DataHandler = DataHandler + self.start_time = self.DataHandler.fmu.start_time + self.stop_time = self.DataHandler.fmu.stop_time + self.sim_time = self.stop_time - self.start_time + self.timepoints = self.sim_time / DataHandler.step_size + + def __call__(self, *args, **kwargs): + control_dict = {} + return control_dict + + def description(self): + return f'ZERO controller from {self.start_time/86400} until {self.stop_time/86400} (timepoints = {self.timepoints})' + + +class variance_tracker: + + def __init__(self, DataHandler, GPR_Model, df, incl_derivative=True): + """ + Variance Tracker Class. Not yet suited for Online Learning! + own class to avoid overhead of creating MPC controller + Online Learning prob. better as function of GPR MPC track variance can simply be copied though + --> difference: df with whole data exists already here + for online learning: use "live" df. + """ + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + if not incl_derivative: # --- bitte schlauer implementieren als über flag arg ! + self.df = self.DataHandler.insert_derivative(df) + print('df\n') + print(self.df) + else: + self.df = df + + def track_variance(self, start_int = 25, end_int = None, normalise = True): + variances = [] + time_indexes = [] + if end_int is None: + end_int = len(df.index) + loc = start_int + while loc <= end_int: + print(loc) + col_chunks = [] + for feature in self.regressor_list: + col_chunks.append(np.array(self.df.iloc[loc - feature.lag: loc+1][ feature.var_name])) # size(appendix) = lag+1 + x_test = np.hstack(col_chunks) + y, variance = self.gp.GP_eval(x_test=x_test.reshape(1,-1), normalise=normalise, with_variance=True) + variances.append(float(variance)) + time_indexes.append(loc) + loc += 1 + + ret = [variances, time_indexes] + self.variances = np.array(variances) + self.time_indexes = time_indexes + return ret + + def extend_GPR(self, number_of_timepoints, path, save = True): + var_indexes = (-self.variances).argsort()[:number_of_timepoints] + print(var_indexes) + time_marks = [] + for index in var_indexes: + time_marks.append(self.time_indexes[index]) + print(var_indexes) + ''' + ACHTUNG ! loc und iloc ! + ''' + df = self.df + X_train = np.empty((0, sum([feature.lag + 1 for feature in self.model.regressor_list])), float) + Y_train = np.empty((0, len(self.model.target_list)), float) + for i in time_marks: + col_chunks = [] + for feature in self.model.regressor_list: + col_chunks.append(np.array(df.iloc[i - feature.lag: i + 1][feature.var_name])) # size(appendix) = lag+1 + X_train = np.append(X_train, [np.hstack(col_chunks)], axis=0) + + target_values = [] + for target_name in self.model.target_list_str: # target_name = var_name + " (t+1)" + target_values.append(np.array(df.iloc[i][target_name])) # size(appendix) = 1 + # y_k+1 @ index i is corresponding to x_k @ index i + Y_train = np.append(Y_train, [np.hstack(target_values)], axis=0) + + #print(self.gp.X_train) + #print(X_train) + X_train_norm = self.gp.normalise_X(X_train, casadi_eval=False) + Y_train_norm = self.gp.normalise_Y(Y_train, casadi_eval=False) + print(self.gp.X_train) + #print(X_train_norm) + + X_train_new_full = np.vstack((self.gp.X_train, X_train_norm)) + Y_train_new_full = np.vstack((self.gp.Y_train, Y_train_norm)) + print(X_train_new_full.shape) + print(Y_train_new_full.shape) + + self.gp.set_new_data(X_train_new_full, Y_train_new_full) + self.gp.set_up_reg() + + if save is True: + self.gp.save_GPR(path=path) + ''' + GP-Setup + New Hyperparam ?! -> Beides testen + GP save_GPR + ''' + + +class GPR_MPC_comfort: + + def __init__(self, DataHandler, GPR_Model, N=6): # --- maybe pass disturbances df as argument instead of loading from DataHandler + + self.N = N + #self.ref = 295 + + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + # --- load disturbances (pre known for whole time horizon) + self.disturbances_df = self.DataHandler.disturbances_df + + # --- time steps and horizon + self.step_size = self.DataHandler.step_size + + # --- working hours and comfort temperatures + self.working_hours = [6, 18] + self.comfort_limits_day = [273.15 + 20, 273.15 + 22] + self.comfort_limits_night = [273.15 + 17, 273.15 + 26] + + # --- feature (regressor) lists by type of feature (U,D,Y,C) + self.U = [feature for feature in self.model.U if feature.is_regressor] + self.D = [feature for feature in self.model.D if feature.is_regressor] + try: + self.D.extend([feature for feature in + self.model.c_D]) # if (feature.is_regressor and feature.feature in self.model.D)]) + except AttributeError: + print('no disturbance derivative in Model') + + self.Y = [feature for feature in self.model.Y if feature.is_regressor] + self.C = [feature for feature in self.model.C if (feature.is_regressor and feature.feature in self.model.Y)] + + self.nY = len(self.Y) + self.nU = len(self.U) + + self.create_controller() + + def get_comfort_limit(self, current_time): + + L_limits = [] + U_limits = [] + for t in range(self.N): + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size ) + # append limits to the target data frame + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + L_limits.append(self.comfort_limits_day[0]) + U_limits.append(self.comfort_limits_day[1]) + else: + L_limits.append(self.comfort_limits_night[0]) + U_limits.append(self.comfort_limits_night[1]) + + return L_limits, U_limits + + @staticmethod + def get_time_dict(seconds: int): + result = dict() + + intervals = ( + ('weeks', 604800), + ('days', 86400), + ('hours', 3600), + ('minutes', 60), + ) + + for name, count in intervals: + value = seconds // count + seconds -= value * count + result[name] = value + return result + + def __call__(self, *args): + + df = args[0].copy() # --- "live" beschriebenes df mit features + print(df) + current_time = int(df['SimTime'][-1:].values) + + regressor_lags = [feature.lag for feature in self.regressor_list] + if len(df.index) <= max(regressor_lags) + 1: + print('Waiting for regressor to be simulated... ') + return dict() + + # --- obtain already known values to be passed as PARVARS to solver + loc_d = current_time / self.step_size # + 1 # via SIMTIME ? oder über current_time und step_size + values_D = [] + for feature in self.D: + values_D.extend(list(self.disturbances_df.loc[loc_d - feature.lag: loc_d + self.N, feature.var_name])) + print(feature.var_name) + loc = -1 + # VLL für alle lieber iloc verwenden, falls nicht bei 0 anfängt zu zählen + values_U = [] + for feature in self.U: + values_U.extend(list(df.iloc[loc - feature.lag:-1][feature.var_name])) + + values_Y = [] + for feature in self.Y: + values_Y.extend(list(df.iloc[loc - feature.lag::][feature.var_name])) + + ''' + only valid for c = dy_1 = T_AirRoom + ''' + values_C = [] + for c in self.C: + values_aux1 = list(df.iloc[loc - c.lag::][self.Y[0].var_name]) + values_aux2 = list(df.iloc[loc - c.lag - 1: loc][self.Y[0].var_name]) + + for i in range(c.lag + 1): + values_C.append(values_aux1[i] - values_aux2[i]) + + L_limits, U_limits = self.get_comfort_limit(current_time) + print(L_limits) + print(U_limits) + values_limit = [*L_limits, *U_limits] + print('values_limit') + print(values_limit) + print(values_D) + print(values_C) + print(values_Y) + print('hallo') + # obtain controls + control_dict = self.get_controls(values_D, values_U, values_Y, values_C, values_limit) + + return control_dict + + def create_controller(self): + N = self.N + # --- initialization + PARVARS = [] + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] LIMITS[0:N] + OPTVARS = [] + # --- OPTVARS order: + self.g = [] + self.lbg = [] + self.ubg = [] + + # --- fill PARVARS with symbolics, order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1], Y[0] is set via constraint + # --- Also: build list with lists of symbolic VARS for each feature to build x_test from this list + VARS_regressorlist = [] + for index, feature in enumerate(self.D): + VARS_feature = [] + for k in range(-feature.lag, N + 1): + D_k = SX.sym('par D_' + str(index) + str(k), 1) + VARS_feature.append(D_k) + PARVARS.append(D_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.U): + VARS_feature = [] + for k in range(-feature.lag, 0): + U_k = SX.sym('par U_' + str(index) + str(k), 1) + VARS_feature.append(U_k) + PARVARS.append(U_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.Y): + VARS_feature = [] + for k in range(-feature.lag, 1): + Y_k = SX.sym('par Y_' + str(index) + str(k), 1) + VARS_feature.append(Y_k) + PARVARS.append(Y_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.C): + VARS_feature = [] + for k in range(-feature.lag, 1): + C_k = SX.sym('par C_' + str(index) + str(k), 1) + VARS_feature.append(C_k) + PARVARS.append(C_k) + VARS_regressorlist.append(VARS_feature) + + # --- add limitations to PARVARS: + LB_syms = [] + for k in range (N): # vll N+1 + lb_T_k = SX.sym('par LB_' + str(k), 1) + LB_syms.append(lb_T_k) + PARVARS.append(lb_T_k) + UB_syms = [] + for k in range (N): + ub_T_k = SX.sym('par UB_' + str(k), 1) + UB_syms.append(ub_T_k) + PARVARS.append(ub_T_k) + + # --- constraint initial state + Y_0_opt = SX.sym('Y_0_opt', 1) + OPTVARS.append(Y_0_opt) + self.constraint(Y_k - Y_0_opt) + + # --- initialize MPC Multiple Shooting loop + obj = 0 + + self.Q_val = 150 + self.R_val = [50, 100, 100, 50] + self.dR_val = [100, 100, 100, 100] + + Q = diag(self.nY) * self.Q_val # old FMU Q = diag(self.nY) * 50 + R = diag(self.R_val) * 1 # old FMU : R = diag([10, 5, 2, 2]) * 1 + dR = self.dR_val # old FMU: dR = [15, 15, 10, 10] + + # --- Multiple Shooting Loop: + for k in range(self.N): + print('MPC_loop:') + print(k) + Uk = [] + + U_k = SX.sym('U_' + str(k), self.nU) + OPTVARS.append(U_k) + # for index, feature in enumerate(self.U): + for i in range(self.nU): + VARS_regressorlist[i + len(self.D)].append(U_k[i]) + print('halo') + self.constraint(U_k[i], self.model.U[i].lb, self.model.U[i].ub) # 0.02 + Y_k = SX.sym('Y_' + str(k + 1), self.nY) + OPTVARS.append(Y_k) + + C_k = SX.sym('C_' + str(k + 1), 1) + OPTVARS.append(C_k) + + EPS_k = SX.sym('EPS_' + str(k + 1), 1) + OPTVARS.append(EPS_k) + + print(VARS_regressorlist) + # self.constraint(Y_k - Y_pred) + + # --- build input vector x_test: + # --- order in regressor list: D U Y C + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + col_chunks = [] + for index, feature in enumerate(self.regressor_list): + + col_chunk = np.array([VARS_regressorlist[index][ + k: k + 1 + feature.lag]]) # --- in meiner STR indizierung, nicht listenindex! + print('chunk len:') + print(len(VARS_regressorlist[index][k: k + feature.lag + 1])) + print(VARS_regressorlist[index][k: k + feature.lag + 1]) + + # absolute position in der jeweiligen Unterliste von VARS_regressorlist + col_chunks.append(col_chunk) + # print(col_chunks) + x_test = np.hstack(col_chunks) + print('x_test') + print(x_test.shape) + + dY_pred = self.gp.GP_eval(x_test.reshape(1, -1)) + # --- get last value from Y-list within VARS_regressorlist, which is previous Y_k + Y_pred = VARS_regressorlist[len(self.D) + len(self.U)][-1] + dY_pred + + self.constraint(Y_k - Y_pred) + self.constraint(C_k - dY_pred) + # for index, feature in enumerate(self.Y): + for i in range(self.nY): + VARS_regressorlist[i + len(self.D) + len(self.U)].append(Y_k[i]) + VARS_regressorlist[len(self.D) + len(self.U) + len(self.Y)].append(C_k) + + self.constraint(Y_pred + EPS_k - LB_syms[k], 0, inf) + self.constraint(Y_pred + EPS_k - UB_syms[k], -inf, 0) + + obj = obj + EPS_k.T @ Q @ EPS_k + U_k.T @ R @ U_k + + for i in range(self.nU): + obj = obj + (VARS_regressorlist[i + len(self.D)][-2] - VARS_regressorlist[i + len(self.D)][-1]) ** 2 * \ + dR[i] + # dU über vars_regressor_list[i+len(self.D)] realisieren + + # --- create NLP + nlp = {'x': vertcat(*OPTVARS), + 'f': obj, + 'g': vertcat(*self.g), + 'p': vertcat(*PARVARS) + } + self.optvars4print = vertcat(*OPTVARS) + opts_ipopt = {'verbose': False, 'ipopt': {'max_iter': 3000, 'print_level': 4}} + + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + def get_controls(self, values_D, values_U, values_Y, values_C, values_LIM): + PARVARS_values = [*values_D, *values_U, *values_Y, *values_C, *values_LIM] + + solution = self.controller(lbg=vertcat(*self.lbg), ubg=vertcat(*self.ubg), p=vertcat(*PARVARS_values)) + print(solution) + print(solution['x']) + control_dict = self.control2dict(solution['x']) + # u_opt = self.process_controls(solution['x']) + return control_dict + + def constraint(self, eq, lb=0, ub=0): + ''' + :param eq: equation / term for constraint + :param lb: lower bound, default = 0 -> equality constraint + :param ub: upper bound, default = 0 -> equality constraint + :return: + ''' + self.g.append(eq) + self.lbg.append(lb) + self.ubg.append(ub) + + def control2dict(self, solution): + print(solution) + print(self.optvars4print) + control_dict = {} + # for i in range(self.N): + temperatures = [] + temperatures = solution[::5] + for index, feature in enumerate(self.U): + control_dict[feature.var_name] = solution[1 + index].full()[0][0] # --- hier nochmal genau schauen! + print(control_dict) + print(solution) + # quit() + return control_dict + + +class GPR_MPC: + + def __init__(self, DataHandler, GPR_Model, N = 5, control = True) : # --- maybe pass disturbances df as argument instead of loading from DataHandler + + self.N = N + self.ref = 295 + + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + # --- load disturbances (pre known for whole time horizon) + try: + self.disturbances_df = self.DataHandler.disturbances_df + + except AttributeError: + print('Default disturbance data is used ! ') + self.disturbances_df = read_pkl("C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_14-03_15_03\\disturbances.pkl" ) + + # --- time steps and horizon + self.step_size = self.DataHandler.step_size + + # --- feature (regressor) lists by type of feature (U,D,Y,C) + self.U = [feature for feature in self.model.U if feature.is_regressor] + self.D = [feature for feature in self.model.D if feature.is_regressor] + try: + self.D.extend( [feature for feature in self.model.c_D]) #if (feature.is_regressor and feature.feature in self.model.D)]) + except AttributeError: + print('no disturbance derivative in Model') + self.Y = [feature for feature in self.model.Y if feature.is_regressor] + self.C = [feature for feature in self.model.C if (feature.is_regressor and feature.feature in self.model.Y)] + print(self.D) + print(len(self.C)) + + self.nY = len(self.Y) + self.nU = len(self.U) + + if control is True: + self.create_controller() + + + def __call__(self, *args): + + df = args[0].copy() # --- "live" beschriebenes df mit features + print(df) + current_time = int(df['SimTime'][-1:].values) + + regressor_lags = [feature.lag for feature in self.regressor_list] + if len(df.index) <= max(regressor_lags) + 1: + print('Waiting for regressors to be simulated... ') + return dict() + + # --- obtain already known values to be passed as PARVARS to solver + loc_d = current_time / self.step_size #+ 1 # via SIMTIME ? oder über current_time und step_size + values_D = [] + for feature in self.D: + values_D.extend(list(self.disturbances_df.loc[loc_d-feature.lag: loc_d + self.N, feature.var_name])) + loc = -1 + # VLL für alle lieber iloc verwenden, falls nicht bei 0 anfängt zu zählen + values_U = [] + for feature in self.U: + values_U.extend(list(df.iloc[loc-feature.lag:-1][ feature.var_name])) + + values_Y = [] + for feature in self.Y: + values_Y.extend(list(df.iloc[loc-feature.lag::][ feature.var_name])) + + ''' + only valid for c = dy_1 = T_AirRoom + ''' + + values_C = [] + for c in self.C: + # if c.feature in D andere Behandlung, vll eigene Liste values_C_d + print(c) + values_aux1 = list(df.iloc[loc-c.lag::][ self.Y[0].var_name]) + values_aux2 = list(df.iloc[loc-c.lag-1: loc][ self.Y[0].var_name]) + print('aux') + print(values_aux1) + print(values_aux2) + for i in range(c.lag+1): + values_C.append(values_aux1[i] - values_aux2[i]) + + print(values_D) + print(values_C) + print(values_Y) + # obtain controls + control_dict = self.get_controls(values_D, values_U, values_Y, values_C ) + + return control_dict + + def create_controller(self): + N = self.N + # --- initialization + PARVARS = [] + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + OPTVARS = [] + # --- OPTVARS order: + self.g = [] + self.lbg = [] + self.ubg = [] + + # --- fill PARVARS with symbolics, order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1], Y[0] is set via constraint + # --- Also: build list with lists of symbolic VARS for each feature to build x_test from this list + VARS_regressorlist = [] + for index, feature in enumerate(self.D): + VARS_feature = [] + for k in range(-feature.lag, N+1): + D_k = SX.sym('par D_' + str(index) + str(k), 1) + VARS_feature.append(D_k) + PARVARS.append(D_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.U): + VARS_feature = [] + for k in range(-feature.lag, 0): + U_k = SX.sym('par U_' + str(index) + str(k), 1) + VARS_feature.append(U_k) + PARVARS.append(U_k) + VARS_regressorlist.append(VARS_feature) + + + for index, feature in enumerate(self.Y): + VARS_feature = [] + for k in range(-feature.lag, 1): + Y_k = SX.sym('par Y_' + str(index) + str(k), 1) + VARS_feature.append(Y_k) + PARVARS.append(Y_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.C): + VARS_feature = [] + for k in range(-feature.lag, 1): + C_k = SX.sym('par C_' + str(index) + str(k), 1) + VARS_feature.append(C_k) + PARVARS.append(C_k) + VARS_regressorlist.append(VARS_feature) + + # --- constraint initial state + Y_0_opt = SX.sym('Y_0_opt', 1) + OPTVARS.append(Y_0_opt) + self.constraint(Y_k - Y_0_opt) + + # --- initialize MPC Multiple Shooting loop + ''' bester Run bisher: mit 0703 21 46 Datenset + Q = diag(self.nY) * 50 + R = diag([500,10,20,10]) * 1 + dR = [50,50,50,50] + ''' + obj = 0 + + self.Q_val = 20 + self.R_val = [1, 1, 1, 1] + self.dR_val = [8, 8, 8, 8] + Q = diag(self.nY) * self.Q_val # old FMU Q = diag(self.nY) * 50 + R = diag(self.R_val) * 1 # old FMU : R = diag([10, 5, 2, 2]) * 1 + dR = self.dR_val # old FMU: dR = [15, 15, 10, 10] + + print('initialize MPC_loop:') + # --- Multiple Shooting Loop: + for k in range(self.N): + + print('\n\nloop '+str(k)+' of '+str(self.N)+ '\nload symbolic GPR inputs:\n') + Uk = [] + + U_k = SX.sym('U_' + str(k), self.nU) + OPTVARS.append(U_k) + #for index, feature in enumerate(self.U): + for i in range(self.nU): + VARS_regressorlist[i + len(self.D)].append(U_k[i]) + self.constraint(U_k[i], 0.02, 1) # 0.02 + + Y_k = SX.sym('Y_' + str(k + 1), self.nY) + OPTVARS.append(Y_k) + + C_k = SX.sym('C_' + str(k+1), 1) + OPTVARS.append(C_k) + + # --- build input vector x_test: + # --- order in regressor list: D U Y C + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + col_chunks = [] + for index, feature in enumerate(self.regressor_list): + # print(str(index)) + # print(VARS_regressorlist[index]) + col_chunk = np.array([VARS_regressorlist[index][k : k+1+feature.lag]]) # --- in meiner STR indizierung, nicht listenindex! + # print('chunk len:') + # print(len(VARS_regressorlist[index][k : k + feature.lag+ 1])) + print(VARS_regressorlist[index][k : k + feature.lag+ 1]) + + # absolute position in der jeweiligen Unterliste von VARS_regressorlist + col_chunks.append(col_chunk) + #print(col_chunks) + x_test = np.hstack(col_chunks) + print('\ndim(x_test): ' + str(x_test.shape)) + + dY_pred = self.gp.GP_eval(x_test.reshape(1,-1)) + # --- get last value from Y-list within VARS_regressorlist, which is previous Y_k + Y_pred = VARS_regressorlist[len(self.D) + len(self.U)][-1] + dY_pred + + self.constraint(Y_k-Y_pred) + self.constraint(C_k-dY_pred) + # for index, feature in enumerate(self.Y): + for i in range(self.nY): + VARS_regressorlist[i + len(self.D) + len(self.U)].append(Y_k[i]) + VARS_regressorlist[len(self.D) + len(self.U) + len(self.Y)].append(dY_pred) #C_k dY_pred + + obj = obj + (Y_pred - self.ref).T @ Q @ (Y_pred - self.ref) + U_k.T @ R @ U_k + for i in range(self.nU): + obj = obj + (VARS_regressorlist[i + len(self.D)][-2] - VARS_regressorlist[i + len(self.D)][-1])**2 * dR[i] + # dU über vars_regressor_list[i+len(self.D)] realisieren + + # --- create NLP + nlp = {'x': vertcat(*OPTVARS), + 'f': obj, + 'g': vertcat(*self.g), + 'p': vertcat(*PARVARS) + } + self.optvars4print = vertcat(*OPTVARS) + opts_ipopt = {'verbose': False, 'ipopt':{'max_iter': 3000, 'print_level':5}} + + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + def get_controls(self, values_D, values_U, values_Y, values_C): + PARVARS_values = [*values_D, *values_U, *values_Y, *values_C] + + solution = self.controller(lbg=vertcat(*self.lbg), ubg=vertcat(*self.ubg), p=vertcat(*PARVARS_values)) + print(solution) + print(solution['x']) + control_dict = self.control2dict(solution['x']) + #u_opt = self.process_controls(solution['x']) + return control_dict + + def constraint(self, eq, lb=0, ub=0): + ''' + :param eq: equation / term for constraint + :param lb: lower bound, default = 0 -> equality constraint + :param ub: upper bound, default = 0 -> equality constraint + :return: + ''' + self.g.append(eq) + self.lbg.append(lb) + self.ubg.append(ub) + + def control2dict (self, solution): + print(solution) + print(self.optvars4print) + control_dict = {} + #for i in range(self.N): + temperatures = [] + temperatures = solution[::6] + for index, feature in enumerate(self.U): + control_dict[feature.var_name] = solution[1+index].full()[0][0] # --- hier nochmal genau schauen! + print(control_dict) + print(solution) + #quit() + return control_dict + + def description(self): + a = self.DataHandler.fmu.start_time + b = self.DataHandler.fmu.stop_time + c = (a-b)/ self.step_size + return f'MPC-ref controller from {a/86400} until {b/86400} (timepoints = {c})' + + +class GPR_MPC_comfort_SS: + + def __init__(self, DataHandler, GPR_Model, N=8): # --- maybe pass disturbances df as argument instead of loading from DataHandler + + self.N = N + #self.ref = 295 + + # --- load needed objects + self.gp = GPR_Model + self.DataHandler = DataHandler + self.model = self.DataHandler.model + self.regressor_list = self.model.regressor_list + + # --- load disturbances (pre known for whole time horizon) + self.disturbances_df = self.DataHandler.disturbances_df + + # --- time steps and horizon + self.step_size = self.DataHandler.step_size + + # --- working hours and comfort temperatures + self.working_hours = [6, 18] + self.comfort_limits_day = [273.15 + 20, 273.15 + 22] + self.comfort_limits_night = [273.15 + 17, 273.15 + 26] + + # --- feature (regressor) lists by type of feature (U,D,Y,C) + self.U = [feature for feature in self.model.U if feature.is_regressor] + self.D = [feature for feature in self.model.D if feature.is_regressor] + try: + self.D.extend([feature for feature in + self.model.c_D]) # if (feature.is_regressor and feature.feature in self.model.D)]) + except AttributeError: + print('no disturbance derivative in Model') + + self.Y = [feature for feature in self.model.Y if feature.is_regressor] + self.C = [feature for feature in self.model.C if (feature.is_regressor and feature.feature in self.model.Y)] + + self.nY = len(self.Y) + self.nU = len(self.U) + + self.create_controller() + + def get_comfort_limit(self, current_time): + + L_limits = [] + U_limits = [] + for t in range(self.N): + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size ) + # append limits to the target data frame + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + L_limits.append(self.comfort_limits_day[0]) + U_limits.append(self.comfort_limits_day[1]) + else: + L_limits.append(self.comfort_limits_night[0]) + U_limits.append(self.comfort_limits_night[1]) + + return L_limits, U_limits + + @staticmethod + def get_time_dict(seconds: int): + result = dict() + + intervals = ( + ('weeks', 604800), + ('days', 86400), + ('hours', 3600), + ('minutes', 60), + ) + + for name, count in intervals: + value = seconds // count + seconds -= value * count + result[name] = value + return result + + def __call__(self, *args): + + df = args[0].copy() # --- "live" beschriebenes df mit features + print(df) + current_time = int(df['SimTime'][-1:].values) + + regressor_lags = [feature.lag for feature in self.regressor_list] + if len(df.index) <= max(regressor_lags) + 1: + print('Waiting for regressor to be simulated... ') + return dict() + + # --- obtain already known values to be passed as PARVARS to solver + loc_d = current_time / self.step_size # + 1 # via SIMTIME ? oder über current_time und step_size + values_D = [] + for feature in self.D: + values_D.extend(list(self.disturbances_df.loc[loc_d - feature.lag: loc_d + self.N, feature.var_name])) + print(feature.var_name) + loc = -1 + # VLL für alle lieber iloc verwenden, falls nicht bei 0 anfängt zu zählen + values_U = [] + for feature in self.U: + values_U.extend(list(df.iloc[loc - feature.lag:-1][feature.var_name])) + + values_Y = [] + for feature in self.Y: + values_Y.extend(list(df.iloc[loc - feature.lag::][feature.var_name])) + + ''' + only valid for c = dy_1 = T_AirRoom + ''' + values_C = [] + for c in self.C: + values_aux1 = list(df.iloc[loc - c.lag::][self.Y[0].var_name]) + values_aux2 = list(df.iloc[loc - c.lag - 1: loc][self.Y[0].var_name]) + + for i in range(c.lag + 1): + values_C.append(values_aux1[i] - values_aux2[i]) + + L_limits, U_limits = self.get_comfort_limit(current_time) + print(L_limits) + print(U_limits) + values_limit = [*L_limits, *U_limits] + print('values_limit') + print(values_limit) + print(values_D) + print(values_C) + print(values_Y) + print('hallo') + # obtain controls + control_dict = self.get_controls(values_D, values_U, values_Y, values_C, values_limit) + + return control_dict + + def create_controller(self): + N = self.N + # --- initialization + PARVARS = [] + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] LIMITS[0:N] + OPTVARS = [] + # --- OPTVARS order: + self.g = [] + self.lbg = [] + self.ubg = [] + + # --- fill PARVARS with symbolics, order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1], Y[0] is set via constraint + # --- Also: build list with lists of symbolic VARS for each feature to build x_test from this list + VARS_regressorlist = [] + for index, feature in enumerate(self.D): + VARS_feature = [] + for k in range(-feature.lag, N + 1): + D_k = SX.sym('par D_' + str(index) + str(k), 1) + VARS_feature.append(D_k) + PARVARS.append(D_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.U): + VARS_feature = [] + for k in range(-feature.lag, 0): + U_k = SX.sym('par U_' + str(index) + str(k), 1) + VARS_feature.append(U_k) + PARVARS.append(U_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.Y): + VARS_feature = [] + for k in range(-feature.lag, 1): + Y_k = SX.sym('par Y_' + str(index) + str(k), 1) + VARS_feature.append(Y_k) + PARVARS.append(Y_k) + VARS_regressorlist.append(VARS_feature) + + for index, feature in enumerate(self.C): + VARS_feature = [] + for k in range(-feature.lag, 1): + C_k = SX.sym('par C_' + str(index) + str(k), 1) + VARS_feature.append(C_k) + PARVARS.append(C_k) + VARS_regressorlist.append(VARS_feature) + + # --- add limitations to PARVARS: + LB_syms = [] + for k in range (N): # vll N+1 + lb_T_k = SX.sym('par LB_' + str(k), 1) + LB_syms.append(lb_T_k) + PARVARS.append(lb_T_k) + UB_syms = [] + for k in range (N): + ub_T_k = SX.sym('par UB_' + str(k), 1) + UB_syms.append(ub_T_k) + PARVARS.append(ub_T_k) + + # --- constraint initial state + Y_0_opt = SX.sym('Y_0_opt', 1) + OPTVARS.append(Y_0_opt) + self.constraint(Y_k - Y_0_opt) + + # --- initialize MPC Multiple Shooting loop + obj = 0 + + self.Q_val = 10 + self.R_val = [2, 2, 2, 2] #, 0] + self.dR_val = [5, 5, 5, 5] + Q = diag(self.nY) * self.Q_val # old FMU Q = diag(self.nY) * 50 + R = diag(self.R_val) * 1 # old FMU : R = diag([10, 5, 2, 2]) * 1 + """R = np.array([ + [20, 50, 50, 0], + [0, 20, 0, 50], + [0, 0, 20, 50], + [0, 0, 0, 20], + ])""" + dR = self.dR_val # old FMU: dR = [15, 15, 10, 10] + + # --- Single Shooting Loop: + for k in range(self.N): + print('MPC_Single_Shooting_loop:') + print(k) + Uk = [] + + U_k = SX.sym('U_' + str(k), self.nU) + + OPTVARS.append(U_k) + # for index, feature in enumerate(self.U): + for i in range(self.nU): + VARS_regressorlist[i + len(self.D)].append(U_k[i]) + self.model.U[i].lb, self.model.U[i].ub + self.constraint(U_k[i],self.model.U[i].lb, self.model.U[i].ub) # 0.02 + ''' + cross constraints: + ''' + self.constraint(U_k[0]*U_k[1], -0.0001,0.0001 ) + self.constraint(U_k[2]*U_k[3], -0.0001,0.0001 ) + self.constraint(U_k[1] * U_k[3], -0.0001, 0.0001) + self.constraint(U_k[0] * U_k[2], -0.0001, 0.0001) + + + + EPS_k = SX.sym('EPS_' + str(k + 1), 1) + OPTVARS.append(EPS_k) + + #print(VARS_regressorlist) + # self.constraint(Y_k - Y_pred) + + # --- build input vector x_test: + # --- order in regressor list: D U Y C + # --- PARVARS order: D[-lag:N] U[-lag:0] Y[-lag:1] C[-lag:1] + col_chunks = [] + for index, feature in enumerate(self.regressor_list): + + col_chunk = np.array([VARS_regressorlist[index][ + k: k + 1 + feature.lag]]) # --- in meiner STR indizierung, nicht listenindex! + print('chunk len:') + print(len(VARS_regressorlist[index][k: k + feature.lag + 1])) + # print(VARS_regressorlist[index][k: k + feature.lag + 1]) + print(feature.var_name) + print(col_chunk.shape) + # absolute position in der jeweiligen Unterliste von VARS_regressorlist + col_chunks.append(col_chunk.reshape(1, -1)) + # print(col_chunks) + #quit() + x_test = np.hstack(col_chunks) + print('x_test') + print(x_test.shape) + + dY_pred = self.gp.GP_eval(x_test.reshape(1, -1)) + # --- get last value from Y-list within VARS_regressorlist, which is previous Y_k and add dY_pred + Y_pred = VARS_regressorlist[len(self.D) + len(self.U)][-1] + dY_pred + + # self.constraint(Y_k - Y_pred) + # self.constraint(C_k - dY_pred) + # for index, feature in enumerate(self.Y): + for i in range(self.nY): + VARS_regressorlist[i + len(self.D) + len(self.U)].append(Y_pred) + VARS_regressorlist[len(self.D) + len(self.U) + len(self.Y)].append(dY_pred) + + self.constraint(Y_pred + EPS_k - LB_syms[k], 0, inf) + self.constraint(Y_pred + EPS_k - UB_syms[k], -inf, 0) + + obj = obj + EPS_k.T @ Q @ EPS_k + U_k.T @ R @ U_k + + for i in range(self.nU): + obj = obj + (VARS_regressorlist[i + len(self.D)][-2] - VARS_regressorlist[i + len(self.D)][-1]) ** 2 * \ + dR[i] + # dU über vars_regressor_list[i+len(self.D)] realisieren + # --- create NLP + nlp = {'x': vertcat(*OPTVARS), + 'f': obj, + 'g': vertcat(*self.g), + 'p': vertcat(*PARVARS) + } + self.optvars4print = vertcat(*OPTVARS) + opts_ipopt = {'verbose': False, 'ipopt': {'max_iter': 3000, 'print_level': 4}} + + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + def get_controls(self, values_D, values_U, values_Y, values_C, values_LIM): + PARVARS_values = [*values_D, *values_U, *values_Y, *values_C, *values_LIM] + + solution = self.controller(lbg=vertcat(*self.lbg), ubg=vertcat(*self.ubg), p=vertcat(*PARVARS_values)) + print(solution) + print(solution['x']) + + control_dict = self.control2dict(solution['x']) + # u_opt = self.process_controls(solution['x']) + return control_dict + + def constraint(self, eq, lb=0, ub=0): + ''' + :param eq: equation / term for constraint + :param lb: lower bound, default = 0 -> equality constraint + :param ub: upper bound, default = 0 -> equality constraint + :return: + ''' + self.g.append(eq) + self.lbg.append(lb) + self.ubg.append(ub) + + def control2dict(self, solution): + print(solution) + print(self.optvars4print) + control_dict = {} + # for i in range(self.N): + temperatures = [] + temperatures = solution[0] # --- single shooting ! + for index, feature in enumerate(self.U): + control_dict[feature.var_name] = solution[1 + index].full()[0][0] # --- hier nochmal genau schauen! + print(control_dict) + print(solution) + #quit() + return control_dict + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/GP_regression.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/GP_regression.py new file mode 100644 index 0000000000000000000000000000000000000000..074c3718f93ad0803381284eb3881e9cc6deffa4 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/GP_regression.py @@ -0,0 +1,175 @@ +import GPy +import numpy as np +import time +import datetime +from pickle_handler import * +#from casadi import * +'''' +universal GP Regression class +''' + +class GP_Regression: + + def __init__(self, X_train, Y_train, abs = True, ARD=True): + ''' + :param X_train_abs: Regressor training data, npArray, shape: (N, D) (D: number of regressors, N: number of samples) + :param Y_train_abs: Target training data, npArray, shape: (N, number_of_targets) + :param abs: set True for absolute values + :param ARD: set True for automatic relevance detection kernel + ''' + self.X_train = X_train + self.x_min = np.amin(self.X_train, axis = 0) + self.x_max = np.amax(self.X_train, axis = 0) + + self.Y_train = Y_train + self.y_min = np.amin(self.Y_train, axis=0) + self.y_max = np.amax(self.Y_train, axis=0) + + if abs: + self.X_train = self.normalise_X(self.X_train, casadi_eval=False) + self.Y_train = self.normalise_Y(self.Y_train, casadi_eval=False) + + self.N = self.X_train.shape[0] + self.D = self.X_train.shape[1] + + self.ARD = ARD + + def set_new_data(self, X_train, Y_train): + + self.X_train = X_train + self.Y_train = Y_train + self.N = self.X_train.shape[0] + self.D = self.X_train.shape[1] + + + + def opt_hyperparam(self, restarts = 2, induce = False): + ''' + yields Theta, an array of hyperparams (length_params, kernel variance, noise variance) + GPy is used for optimization, it may be outdated, but offers and has a simple interface for this operation + (i.e. ARD GPR kernel not possible with scikit learn) + ''' + # m.kern.variance.prior = GPy.priors.Gamma(1, 0.1) + print('optimize hyperparameters') + kernel = GPy.kern.RBF(input_dim=self.D, ARD=self.ARD) + if induce is True: + m = GPy.models.SparseGPRegression(self.X_train, self.Y_train, kernel=kernel,num_inducing=300) + else: + m = GPy.models.GPRegression(self.X_train, self.Y_train, kernel, noise_var=1e-6) # NOISE VAR mal austesten + m.optimize( messages = True, max_iters = 200 ) # (optimizer='scg', 300 iters + m.optimize_restarts(num_restarts=restarts, messages=True, max_iters=150) + print(m) + len_scales = [kernel.lengthscale[i] for i in range(self.D)] + + theta = [len_scales, kernel.variance[0], m.Gaussian_noise.variance[0]] + self.theta = theta + + def set_up_reg(self): + ''' + calculates values needed for actual regression + ''' + self.K = self.kernel(self.X_train, self.X_train) # --- without kernel noise, dim(K) = NxN (#datapoints) + # --- Idee: while Schleife, bis kein error + # --- Idee: scipy linalg statt numpy + #self.jitter = self.theta[2]**2 + self.jitter = 0 + counter = 1 + while True: + if self.jitter > 1e-3: + print('\n'+str(self.jitter)+' was not enough noise.') + break + try: + self.L = np.linalg.cholesky(self.K + np.eye(self.N) * self.jitter) + print('Cholesky succeeded!') + break + except np.linalg.LinAlgError: + print('Matrix numerically not p. sd. ... adding noise') + self.jitter = self.theta[2] * 10**(counter) + print(str(counter)+', new jitter: '+str(self.jitter)) + counter+=1 + + self.alpha = np.linalg.solve(self.L.T, np.linalg.solve(self.L, self.Y_train)) + + def kernel(self, a, b, eval=False): + # --- RBF ARD kernel function + kernelParameter_l = self.theta[0] + kernelParameter_sigma = self.theta[1] # **2 + + a = a / kernelParameter_l + b = b / kernelParameter_l + + sqdist = np.sum(a ** 2, axis=1).reshape(-1, 1) + np.sum(b ** 2, 1) - 2 * np.dot(a, b.T) + # --- multidim. binomial equation, (a-b).T*(a-b) = a^2 + b^2 - 2ab.T + + if eval: + return kernelParameter_sigma * np.exp(-0.5 * sqdist) # bc kronecker delta ;) + else: + return kernelParameter_sigma * np.exp(-0.5 * sqdist) + np.eye(self.N) * self.theta[2] # **2 + + def normalise_X(self, X, reverse = False, casadi_eval = True): + if reverse: + x_out = self.x_min + (self.x_max - self.x_min)*X + else: + x_out = (X - self.x_min) / (self.x_max - self.x_min) + if not casadi_eval: + if np.isnan(np.sum(x_out)): + print('Constant value in training data!\nWill set Nan to zero.') + x_out = np.nan_to_num(x_out) + return x_out + + def normalise_Y(self, Y, reverse = False, casadi_eval = True): + + self.norm_amplitude = 0.5 + if reverse: + # y_out = self.y_min + (self.y_max - self.y_min)*Y # [0,1] + y_out = self.y_min + (self.y_max - self.y_min) * (Y + self.norm_amplitude) / (2*self.norm_amplitude) + else: + # y_out = (Y - self.y_min) / (self.y_max - self.y_min)# [0,1] : + y_out = ( (Y - self.y_min) *2*self.norm_amplitude / (self.y_max - self.y_min) ) - self.norm_amplitude + #if not casadi_eval: + # if np.isnan(np.sum(y_out)): + # print('Constant value in training data!\nWill set Nan to zero.') + # x_out = np.nan_to_num(y_out) + return y_out + + def GP_eval(self, x_test, normalise = True, with_variance = False): + print(normalise) + ''' + :param x_test: input vector, shape: amount_of_test_points,D (normally 1 test point) + :param normalise: set False if normalising procedure ill for Casadi MPC + :return: corresponding GPR output to x_test + ''' + + if normalise: + x_test = self.normalise_X(x_test) + k_star = self.kernel(self.X_train, x_test, eval=True) + #print(k_star) + f_mean = np.dot(k_star.T, self.alpha) + + if with_variance: + # --- output variance as 2nd output, variance = covariance of random var with itself + v = np.linalg.solve(self.L, k_star) + #print(v) + variance = self.kernel(x_test, x_test, eval = True) - np.dot(v.T, v) #+noise variance if wanted + + std_dev = np.sqrt(variance) # --- mean + 1,2,3 sigma = 68,95,99.7 % f +- 2sigma -> 95 % interval + if normalise: + # --- inverse normalisation + f_mean = self.normalise_Y(f_mean, reverse = True) + std_dev = std_dev*(self.y_max - self.y_min) /(2*self.norm_amplitude) # ??? Aber müsste so stimmen + return f_mean, 2*std_dev + else: + if normalise: + # --- inverse normalisation + f_mean = self.normalise_Y(f_mean, reverse = True) + return f_mean + + def save_GPR(self, path: str): + + write_pkl(self, 'GPR_{date:%m-%d_%H_%M}'.format(date=datetime.datetime.now()), path) + + + + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/controllers.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/controllers.py new file mode 100644 index 0000000000000000000000000000000000000000..efb1c442712a96d84145c8f1636614817a663d5a --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/controllers.py @@ -0,0 +1,298 @@ +import time +import scipy.stats +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +import math +import random +import pickle_handler +import fmu_handler +import tensorflow.keras +from data_manager import * +from tensorflow.keras import models +#from casadi_neural_network import * + + +class controller: + + def __init__(self, data_handler): + + self.debug_mode = False + + # data handler and step size + self.data_handler = data_handler + self.step_size = data_handler.step_size + + # current time + self.current_time = None + + # define target Temperatures + self.target_day = 273.15 + 21 + self.target_night = 273.15 + 18 + + # define target Temperatures + self.comfort_limits_day = [273.15 + 20, 273.15 + 22] + self.comfort_limits_night = [273.15 + 17, 273.15 + 26] + + # define working hours + self.working_hours = [6, 18] + + # trackcomfort + self.comfort_error_list = list() + self.current_comfort = list() + + # track target + self.target_error_list = list() + self.target_list = list() + self.current_target = self.target_night + + # create control dict + self.control_dict = dict() + + def get_disturbances(self, current_time: int, past_steps: int, future_steps: int): + """ + returns disturbances data frame for a specific time window + """ + + start_time = current_time - self.step_size * past_steps + stop_time = current_time + self.step_size * future_steps + + # load disturbances + df = self.data_handler.disturbances_df + df = df[((df['SimTime'] >= start_time) & (df['SimTime'] <= stop_time))] + + if len(df.index) < past_steps: + raise ValueError('Please make sufficient weather data is available.') + + return df + + def get_comfort_limitations(self, current_time: int, future_steps=1): + """ + returns comfort limitations for current time and future steps + """ + assert current_time is not None and future_steps > 0 + + limitations = list() + for t in range(future_steps): + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size) + + # append limits to the target data frame + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + limitations.append(self.comfort_limits_day) + else: + limitations.append(self.comfort_limits_night) + + if self.debug_mode: + print('limits:', limitations) + + return limitations + + def get_random_target(self, current_time): + + assert type(current_time) is not None + + limits = self.get_comfort_limitations(current_time) + + ret = random.uniform(limits[0][0], limits[0][1]) + + return ret + + def get_target(self, current_time: int, future_steps=1): + + assert type(current_time) is not None and future_steps > 0 + + debug_mode = False + + ret = list() + + for t in range(future_steps): + + time_dict = self.get_time_dict(current_time + (t+1) * self.step_size) + + if time_dict['days'] < 5 and (self.working_hours[0] < time_dict['hours'] < self.working_hours[1]): + ret.append(self.target_day) + else: + ret.append(self.target_night) + + if debug_mode: + print('Target_list:', ret) + + return ret + + @staticmethod + def get_time_dict(seconds: int): + result = dict() + + intervals = ( + ('weeks', 604800), + ('days', 86400), + ('hours', 3600), + ('minutes', 60), + ) + + for name, count in intervals: + value = seconds // count + seconds -= value * count + result[name] = value + return result + + @staticmethod + def get_casadiANN(keras_model_name): + """ + returns the casadi ann object + """ + + KerasModel = models.load_model(keras_model_name) + # construct casadi ann + casadiANN = NeuralNetwork('ANN') + casadiANN.construct(KerasModel) + + return casadiANN + + def update(self, df: pd.DataFrame): + + # current time + self.current_time = df['SimTime'].iloc[-1] + + # return empty control dict, when + if len(df.index) < 2: + return False + + # chreck for refresh + self.check_refresh() + + # append target + self.target_list.append(self.current_target) + + # current limitations + self.current_comfort = self.get_comfort_limitations(current_time=self.current_time) + + # current error + y = df[self.data_handler.model.Y[0].var_name].iloc[-1] + error = max([min([0, y - self.current_comfort[0][0]]), max([0, y - self.current_comfort[0][1]])], key=abs) + self.comfort_error_list.append(error) + + self.target_error_list.append(y - self.current_target) + + return True + + def check_refresh(self): + + # refresh, when comfort changes + f_limits = self.get_comfort_limitations(current_time=self.current_time-self.step_size, future_steps=2) + + if f_limits[0] != f_limits[1]: + self.refresh() + + def refresh(self): + return 0 + + def check_bounds(self): + for u in self.data_handler.model.U: + if self.control_dict[u.var_name] > u.ub: + self.control_dict[u.var_name] = u.ub + elif self.control_dict[u.var_name] < u.lb: + self.control_dict[u.var_name] = u.lb + + + + +class pid_target(controller): + + def __init__(self, data_handler, no_control_name = None, random_target=False): + self.no_control_name = no_control_name + # call super + super(pid_target, self).__init__(data_handler) + self.start_time = self.data_handler.fmu.start_time + self.stop_time = self.data_handler.fmu.stop_time + self.sim_time = self.stop_time - self.start_time + self.timepoints = self.sim_time / data_handler.step_size + self.ki = dict() + self.kp = dict() + self.kd = dict() + + # new parameters + + for u in self.data_handler.model.U: + if 'AHU' in u.display_name: + self.kp[u.var_name] = 0.05 + self.ki[u.var_name] = 0.000001 + self.kd[u.var_name] = 0.002 + elif 'CCA' in u.display_name or 'BKT' in u.display_name: + self.kp[u.var_name] = 0.045 + self.ki[u.var_name] = 0.0000008 + self.kd[u.var_name] = 0.003 + + self.integral = 0 + print('random_target:' + str(random_target)) + self.random_target = random_target + self.refresh_rate = 1 + + + def __call__(self, *args, **kwargs): + + # update controller + if not self.update(args[0]): + return dict() + + # new target + if self.random_target is True: + # get new random target via refresh + if self.current_time % self.refresh_rate == 0: + self.refresh_rnd() + else: + self.current_target = self.get_target(self.current_time)[0] + + # update integral (i[0] = i[-1] + e * dt + self.integral += self.target_error_list[-1] * self.step_size + + # error + error = self.target_error_list[-1] + + # delta + delta = args[0][self.data_handler.model.Y[0].var_name].iloc[-1] - args[0][self.data_handler.model.Y[0].var_name].iloc[-2] + + for u in self.data_handler.model.U: + + kp = self.kp[u.var_name] + ki = self.ki[u.var_name] + kd = self.kd[u.var_name] + value = (self.kp[u.var_name] * error + self.ki[u.var_name] * self.integral + self.kd[u.var_name] * delta) + value = value #/ (self.step_size*100) + + # reset + self.control_dict[u.var_name] = u.lb + + if u.info == 'cooler' and value > 0: + self.control_dict[u.var_name] = u.lb + abs(value) * (u.ub - u.lb) + + if u.info == 'heater' and value < 0: + self.control_dict[u.var_name] = u.lb + abs(value) * (u.ub - u.lb) + + self.check_bounds() + + if self.no_control_name is not None: + for name in self.no_control_name: + self.control_dict[name] = 0 + + return self.control_dict + + def __str__(self): + + avrg_err = round(np.abs(np.array(self.comfort_error_list)).mean(), 4) + + return f'PID Regler (avrg_err={avrg_err}K)' + + def refresh_rnd(self): + + # refresh rate in hours + self.refresh_rate = 4*3600 #random.randint(3, 5) * 3600 + + # new target + self.current_target = self.get_random_target(self.current_time) + + + print('New target:', round(self.current_target, 4)) + + def description(self): + return f'PID controller from {self.start_time/86400} until {self.stop_time/86400} (timepoints = {self.timepoints})' diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/data_manager.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/data_manager.py new file mode 100644 index 0000000000000000000000000000000000000000..2e5000f96a9c64b5b3a8f04dd940df914bd7b1ed --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/data_manager.py @@ -0,0 +1,440 @@ +import matplotlib +import datetime +import pyDOE +import os +import matplotlib.dates as mdates +import matplotlib.pyplot as plt +import pandas as pd +import numpy as np + +from pickle_handler import * +import controllers +from fmu_handler import FMU +from GP_regression import * +from GPR_mpc import * +from ebc_colors import * + + +class Feature: + + def __init__(self, + display_name: str, + var_name: str, + lag=0, + is_regressor = True, + is_target = False, + unit = '',): + ''' + :param var_name: Name as used in FMU + ''' + self.display_name = display_name + self.var_name = var_name + self.lag = lag + self.is_regressor = is_regressor + self.is_target = is_target + self.unit = unit + + def __str__(self): + return f'[{self.var_name}]' #{self.display_name} + + +class Control(Feature): + + def __init__(self, + display_name: str, + var_name: str, + lb: float, + ub: float, + info: str, + lag=0, + is_regressor = True, + is_target = False, + unit = '' + ): + + super(Control, self).__init__(display_name, var_name, lag, is_regressor, is_target) + + self.lb = lb + self.ub = ub + self.info = info + +class Derivative(Feature): + + def __init__(self, feature, is_regressor = True, is_target = False, lag = 0, operator = 'd'): + + self.feature = feature + var_name = f'd {self.feature.var_name}' + display_name = f'd {self.feature.display_name}' + unit = self.feature.unit + super(Derivative, self).__init__(display_name, var_name, lag, is_regressor, is_target) + +class Model: + + def __init__(self, D, c_D, U, Y, C): + + for u in U: + if type(u) is not Control: + raise ValueError('U must be a List of Control type objects!') + + # List of Features + self.D = D # disturbances + self.c_D = c_D # derivatives of D + self.U = U # controls + self.Y = Y # controlled + # self.c_Y + self.C = C # derivative of Y + + self.create_lists() + + + def description(self): + lines = [] + #print('\n' + lines.append('List of regressors in model (also order of regressors in X_train/GPR input) :') + for feature_list in [self.regressor_list, self.target_list]: + for index, feature in enumerate(feature_list): + lines.append('\t'+str(index)+str(feature)+' lag: '+str(feature.lag) + '\tRegressor: '+str(feature.is_regressor)+'\tTarget: '+str(feature.is_target)) + if feature_list==self.regressor_list: + lines.append('\n Targets:') + # lines.append('Order of regressors (for matching lenghtscale):') + # lines.append(str()) + return lines + + def create_lists(self): # --- create ? + + self.regressor_list = [feature for feature in self.all() if feature.is_regressor] + self.target_list = [feature for feature in self.all() if feature.is_target] + + self.regressor_list_str = [feature.var_name for feature in self.all() if feature.is_regressor] + self.list_all_str = [feature.var_name for feature in self.all() if feature.is_regressor or feature.is_target] + ''' GEFÄHRLICH WENN NICHT AUTOREGRESSIVE VARIABLE GELERNT WIRD ''' + self.target_list_str = [feature.var_name + ' (t+1)' for feature in self.all() if feature.is_target] + + def all(self): + return self.D + self.c_D + self.U + self.Y + self.C + + +class DataHandler: + + def __init__(self, model: Model, fmu: FMU): + + self.model = model + self.controller = None + self.controller_desc = [] + + self.fmu = fmu + self.step_size = self.fmu.step_size + + # data storage + self.raw_data = [] # --- list with df's from FMU + self.processed_data = [] + self.reg_data = None # --- final list of np arrays X_train, Y_train with shape (N,D) + + # --- flags: + self.GP_setup_done = False + + def simulate(self, start_time: int, stop_time: int, controller = None): + + # set start/stop time + self.fmu.start_time = start_time + # --- maybe add settling time + self.fmu.stop_time = stop_time + # --- set controller and add to list + if controller == 'lhs': + self.controller = lhs_ctrl(self) + elif controller == 'zero': + self.controller = zero_ctrl(self) + elif controller == 'PID': + self.controller = controllers.pid_target(self) + elif controller == 'PID_random': + self.controller = controllers.pid_target(self, random_target=True) + elif controller == 'PID_no_AHU': + self.controller = controllers.pid_target(self, no_control_name=["valveHeaterSet","valveAHUCoolerSet"]) + elif controller == 'PID_no_CCA': + self.controller = controllers.pid_target(self, no_control_name=["valveTabsHotSet","valveTabsColdSet"]) + else: + self.controller = controller + if self.controller == None: + print('please pass controller or valid controller name') + quit() + + # run the FMU + try: + variables = [feature.var_name for feature in self.model.all()] + except AttributeError: + print('no disturbance derivative in Model') + variables = [feature.var_name for feature in self.model.D + self.model.U + self.model.Y + self.model.C] + print(variables) + df = self.fmu.run(features=variables, controller=self.controller) + + self.raw_data.append(df) + try: + self.controller_desc.append(self.controller.description()) + except AttributeError: + pass + a, b = follow_up_slave(df, datagen=True, controller=self.controller) + return df + + + def simulate_for_disturbances(self, start_time: int, stop_time: int): + ''' + Runs FMU to obtain disturbance values over simulation time + :return: data frame with obtained disturbances + ''' + self.fmu.start_time = start_time + self.fmu.stop_time = stop_time + + # collect variable names for all disturbances + variables = [] + for feature in self.model.D: + variables.append(feature.var_name) + + for feature in self.model.C: + if type(feature.feature) in self.model.D: + variables.append(feature.var_name) + + # run the fmu without a controller + disturbances_df = self.fmu.run(variables) + + if len(self.model.c_D) is not 0: + disturbances_df = self.insert_derivative(disturbances_df) # --- CHECK IF USEFUL ! + # --- method checks, if derivative wanted + + # save the generated df + self.disturbances_df = disturbances_df + + return disturbances_df + + def insert_derivative(self, df): + ''' + inserts derivative of feature to dataframe if part of model.C or model.c_D + ''' + + for c in [*self.model.c_D,*self.model.C]: + name = c.feature.var_name + if name in df.columns: + # create corresponding derivative + col_loc = df.columns.get_loc(name) + 1 + col_value = df[name] - df[name].shift(1) # --- discr. derivative: diff(last 2 values) + + df.insert(loc=col_loc, column=c.var_name, value=col_value) + + # delete first row + df = df[1:] + + return df + + def process_data(self): # NECESSARY ? + self.processed_data = [] + + for df in self.raw_data: + df = df.copy() + + df = self.insert_derivative(df) + df = self.keep_features(df) + + self.processed_data.append(df) + + def build_GPR(self, number_of_time_marks: int, method='linspace'): + # --- pack regression data into np.array X_train and Y_train + # --- Arrays NOT normalized, done in GPR_class + df = pd.concat(self.processed_data) + self.number_of_time_marks = number_of_time_marks + self.method = method + if method == 'lhs': + time_marks = pyDOE.lhs(1, number_of_time_marks, "m").ravel() * len(df.index) + elif method == 'linspace': + time_marks = np.linspace(1, len(df.index)-1, number_of_time_marks) + elif method == 'all': + time_marks = np.linspace(1, len(df.index)-1, len(df.index)-1) + else: + print('invalid method: choose lhs, linspace or all') + quit() + time_marks = time_marks.astype(int) + + for feature in self.model.regressor_list: + while np.amin(time_marks) <= feature.lag: + time_marks[np.argmin(time_marks)] += 1 + + time_marks = np.unique(time_marks) + self.time_marks = time_marks + + if np.amax(time_marks) > len(df.index): + print('Lag is larger than simulated time steps !') + quit() + else: + X_train = np.empty( (0, sum([feature.lag +1 for feature in self.model.regressor_list])), float ) + Y_train = np.empty( (0, len(self.model.target_list)), float ) + for i in time_marks: + col_chunks = [] + for feature in self.model.regressor_list: + col_chunks.append(np.array(df.iloc[i-feature.lag: i+1][feature.var_name]) ) # size(appendix) = lag+1 + X_train = np.append(X_train, [np.hstack(col_chunks)], axis = 0) + + target_values = [] + for target_name in self.model.target_list_str: # target_name = var_name + " (t+1)" + target_values.append( np.array(df.iloc[i][target_name]) ) # size(appendix) = 1 + # y_k+1 @ index i is corresponding to x_k @ index i + Y_train = np.append( Y_train, [np.hstack(target_values)], axis = 0) + + self.X_train = X_train + self.Y_train = Y_train + # instantiate GPR + self.my_GPR = GP_Regression(X_train, Y_train, abs = True) + return self.my_GPR + + def set_up_GPR(self, GPR_object): + GPR_object.opt_hyperparam() + GPR_object.set_up_reg() + self.my_GPR = GPR_object + self.GP_setup_done = True + + def keep_features(self, df, add_target = True): + """ + Deletes all irrelevant features from the data frame + if add_target is true, target variable is shifted, as prediction (k+1) is actual target + """ + + # only keep the selected features ACHTUNG, vgl. line 120 + # df = df[self.model.regressor_list_str].copy() + df = df[self.model.list_all_str].copy() + + # Deletes the first few columns ? ROW ? + df = df[1:].reset_index(drop=True) + + if add_target is True: + # Add output dimension + for feature in self.model.all(): + if feature.is_target: + + df[feature.var_name + ' (t+1)'] = df[feature.var_name].shift(-1) + + # Delete last row + df = df[:-1] + + return df + + def save(self, start_time): + + directory_name = 'stored_data\\data_{date:%d-%m_%H_%M}'.format(date=datetime.datetime.now()) + self.directory_name = directory_name + if not os.path.exists(directory_name): + os.makedirs(directory_name) + #else Sekunde dazu ? + + write_pkl(self, 'DataHandler', directory_name) + # write_pkl(self.disturbances_df, 'disturbances', directory_name) + + with open(directory_name+"\\model.txt", "w") as desc: + desc.write(self.method + 'sampling with ' + str(self.time_marks.size)+' datapoints\n'+ + ' @ dt='+str(self.step_size)+ ', start time: ' + str(int(start_time/86400)) + 'days\n' + + '\n'.join(self.controller_desc) +'\n\n'+'\n'.join(self.model.description())) + print('model description saved') + + if len(self.raw_data) != 0: + write_pkl(pd.concat(self.raw_data),'raw_data', directory_name) + if len(self.processed_data) != 0: + write_pkl(pd.concat(self.processed_data), 'processed', directory_name) + pd.concat(self.processed_data).to_excel(directory_name + "\\new_fmu_processed_test.xlsx") + + if self.GP_setup_done is True: + write_pkl(self.my_GPR, 'GPR_is_opt', directory_name) + else: + write_pkl(self.my_GPR, 'GPR_not_opt', directory_name) + + def load_disturbances(self): + self.disturbances_df = read_pkl('disturbances') + + +if __name__ == '__main__': + lags = [4] + for lag in lags: + #if True: + my_lag = lag + # define features + d_1 = Feature('T dry bulb', 'weaBus.TDryBul', lag = my_lag, unit = '°C') + + d_5 = Feature('H diffuse horizontal', 'weaBus.HDifHor', lag = my_lag, unit = 'W/m^2') + d_6 = Feature('H direct normal', 'weaBus.HDirNor', lag = my_lag, unit = 'W/m^2') + d_7 = Feature('H global horizontal', 'weaBus.HGloHor', lag = my_lag, unit = 'W/m^2') + + d_10 = Feature('humans', 'internal_gain_1', lag = my_lag) + d_11 = Feature('devices', 'internal_gain_2', lag = my_lag ) + d_12 = Feature('lights', 'internal_gain_3', lag = my_lag ) + + u_1 = Control('CCA hot', 'valveTabsHotSet', lb=0, ub=1, info='heater', lag = my_lag ) + u_2 = Control('CCA cold', 'valveTabsColdSet', lb=0, ub=1, info='cooler', lag = my_lag ) + #u_3 = Control('AHU hot', 'valveAHUCoolerSet', lb=0.01, ub=1, info='heater', lag = 4 ) + #u_4 = Control('AHU cold', 'valveHeaterSet', lb=0.01, ub=1, info='cooler', lag = 4 ) + u_3 = Control('AHU cold', 'valveAHUCoolerSet', lb=0, ub=1, info='cooler', lag=my_lag) + u_4 = Control('AHU hot', 'valveHeaterSet', lb=0, ub=1, info='heater', lag=my_lag) + + + y_1 = Feature('T Air', 'TAirRoom', lag = my_lag, unit = '°C', is_target=False) + dy_1 = Derivative(feature=y_1, is_target=True, is_regressor=True, lag = my_lag) + + + # instantiate Model + My_Model = Model(D=[d_1, d_5, d_6, d_7, d_10, d_11, d_12], + c_D = [], + U=[u_1, u_2, u_3, u_4], + Y=[y_1], + C=[dy_1], + ) + # --- SETTINGS + dt = 60 * 15 # 20 + start_time = 60 * 60 * 24 * 95 + stop_time = 60 * 60 * 24 * 125 + controller_interval = 60 * 60 * 24 *1 + data_points = 3840 + + # instantiate FMU + My_FMU = FMU(start_time=start_time, # overwritten anyways + stop_time=stop_time, # overwritten anyways + step_size= dt, + sim_tolerance=0.00001, + #fmu_file="C:\\Users\\arman\MA\\modelica_files\\Benchmark_thermal_zone\\thermal_zone_valve_ctrl_wea_base_solver.fmu", + fmu_file = "C:\\Users\\arman\\MA\\modelica_files\\ASHRAE140_900_Thermal_Zone\\Benchmark_thermal_zone_ASHRAE140_900_Thermal_Zone_ashrae140_900_valve_ctrl_fmu.fmu", + intgains_file='C:\\Users\\arman\MA\\modelica_files\\Benchmark_thermal_zone\\internal_gains.csv') + + # instantiate DataHandler + My_DataHandler = DataHandler(My_Model, My_FMU) + + # --- simulate data + with_MPC = False + if with_MPC is True: + folder_path_model = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_21-03_21_48\\" + My_GPR = read_pkl(folder_path_model + "GPR_is_opt.pkl") + MPC_controller = GPR_MPC(My_DataHandler,My_GPR) + + + My_DataHandler.simulate(start_time=start_time + 0 * controller_interval, + stop_time=stop_time, + controller='PID_random') + + """My_DataHandler.simulate(start_time=start_time + 20 * controller_interval, + stop_time=start_time + 30 * controller_interval, + controller='lhs') + + My_DataHandler.simulate(start_time=start_time + 30 * controller_interval, + stop_time=stop_time, + controller = 'zero')""" + + My_DataHandler.process_data() + + + # Um verschiedene lags zu testen: + #data_names = ["12_57","14_17","21_19","22_46"] + #for name in data_names: + # folder_path_model = "C:\\Users\\arman\\MA\\MA_code\\GP_therm_zone_v2\\stored_data\\data_26-05_"+name+"\\" + # My_DataHandler = read_pkl(folder_path_model + "DataHandler.pkl") + # My_DataHandler.model = My_Model + + GPR = My_DataHandler.build_GPR(data_points) + #My_DataHandler.set_up_GPR(GPR) + My_DataHandler.save(start_time) + a = [] + for i in GPR.theta[0]: + a.append(i.round(1)) + print(a) + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/fmu_handler.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/fmu_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..6bd9f5bdafec441c4cb7e5087dcb7716e9e859d4 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/fmu_handler.py @@ -0,0 +1,333 @@ +import matplotlib.pyplot as plt +import math +import pandas as pd +import fmpy +import fmpy.fmi2 +import shutil +import time +import pickle_handler + + +class FMU: + """ + The fmu handler class + """ + + def __init__(self, + start_time: int, + stop_time: int, + step_size: int, + sim_tolerance: float, + fmu_file: str, + intgains_file=None, + instanceName='fmu1', + ): + """[summary] + + Args: + start_time ([int]): Start time in sec usually 0 + sim_date ([datetime]): the datetime of the simulation time + stop_time ([int]): Stop time in sec + step_size ([int]): The time step size after which data is exchanged + sim_tolerance ([float]): The numeric tolerance of the solver usual 0.001 + fmu_file ([string]): The name of the FMU file + instanceName ([type]): A name of the FMU instance. FMPY specific can be random + """ + + assert start_time < stop_time + assert sim_tolerance > 0 + + self.start_time = start_time # start time + self.stop_time = stop_time # stop time + self.step_size = step_size # The macro time step + self.sim_tolerance = sim_tolerance # The total simulation tolerance + self.fmu_file = fmu_file + self.instanceName = instanceName + + # load internal gains data + self.intgains_file = intgains_file + self.df_intgains = None + if self.intgains_file is not None: + self.df_intgains = pd.read_csv(self.intgains_file, header=None) + + # read the model description + self.model_description = fmpy.read_model_description(self.fmu_file) + + # Collect all variables + self.variables = {} + for variable in self.model_description.modelVariables: + self.variables[variable.name] = variable + + # extract the FMU + self.unzipdir = fmpy.extract(self.fmu_file) + + def run(self, features: list, controller=None): + """ + :param features: List of all variables that are supposed to be tracked + :param controller: Controller from controller.py + :return: Returns simulated data + """ + + self.__init__(self.start_time, + self.stop_time, + self.step_size, + self.sim_tolerance, + self.fmu_file, + self.intgains_file, + 'fmu1') + + # keep only features, that are part of the fmu + ''' + Die Begrenzung evlt rausnehmen bzw erweitern, wenn Stellgrößenreduktion umgesetzt wird + oder "per Hand" zu df hinzufügen + ''' + features = [feature for feature in features if feature in self.variables] + + # initialize fmu + self.setup() + self.initialize() + + # initialize internal gains + self.write_variables(self.get_intgains(self.current_time)) + + # initialize data frame + df = pd.DataFrame(self.read_variables(features), columns=['SimTime', *features], index=[0]) + + while not self.do_step(): + + # update internal gains + self.write_variables(self.get_intgains(self.current_time)) + + if self.current_time % self.step_size == 0: + + # print time + self.display_time(self.current_time) + + # get the current state of the System + df = df.append(pd.DataFrame(self.read_variables(features), index=[0]), ignore_index=True) + + # set variables + if controller is not None: + self.write_variables(controller(df)) + + # delete last row to append last row with valid control + df.drop(df.tail(1).index, inplace=True) + + # read variables and add to data frame + df = df.append(pd.DataFrame(self.read_variables(features), index=[0]), ignore_index=True) + + # delete the fmu instance + self.close() + + return df + + def setup(self): + + # create fmu obj + self.fmu = fmpy.fmi2.FMU2Slave(guid=self.model_description.guid, + unzipDirectory=self.unzipdir, + modelIdentifier=self.model_description.coSimulation.modelIdentifier, + instanceName=self.instanceName) + + # instantiate fmu + self.fmu.instantiate() + + # The current simulation time + self.current_time = self.start_time + + # initialize model + self.fmu.reset() + self.fmu.setupExperiment( + startTime=self.start_time, stopTime=self.stop_time, tolerance=self.sim_tolerance) + + def initialize(self): + self.fmu.enterInitializationMode() + self.fmu.exitInitializationMode() + + def find_vars(self, start_str: str): + """ + Retruns all variables starting with start_str + """ + key = list(self.variables.keys()) + key_list = [] + for i in range(len(key)): + if key[i].startswith(start_str): + key_list.append(key[i]) + return key_list + + def get_value(self, var_name: str): + """ + Get a single variable. + """ + + variable = self.variables[var_name] + vr = [variable.valueReference] + + if variable.type == 'Real': + return self.fmu.getReal(vr)[0] + elif variable.type in ['Integer', 'Enumeration']: + return self.fmu.getInteger(vr)[0] + elif variable.type == 'Boolean': + value = self.fmu.getBoolean(vr)[0] + return value != 0 + else: + raise Exception("Unsupported type: %s" % variable.type) + + def set_value(self, var_name, value): + """ + Set a single variable. + var_name: str + """ + + variable = self.variables[var_name] + vr = [variable.valueReference] + + if variable.type == 'Real': + self.fmu.setReal(vr, [float(value)]) + elif variable.type in ['Integer', 'Enumeration']: + self.fmu.setInteger(vr, [int(value)]) + elif variable.type == 'Boolean': + self.fmu.setBoolean(vr, [value == 1.0 or value == True or value == "True"]) + else: + raise Exception("Unsupported type: %s" % variable.type) + + def do_step(self): + # check if stop time is reached + if self.current_time < self.stop_time: + # do simulation step + status = self.fmu.doStep( + currentCommunicationPoint=self.current_time, + communicationStepSize=self.step_size) + # augment current time step + self.current_time += self.step_size + finished = False + else: + print('Simulation finished') + finished = True + + return finished + + def close(self): + self.fmu.terminate() + self.fmu.freeInstance() + shutil.rmtree(self.unzipdir) + + del self.fmu + print('FMU released') + + def read_variables(self, vrs_list: list): + """ + Reads multiple variable values of FMU. + vrs_list as list of strings + Method retruns a dict with FMU variable names as key + """ + res = {} + # read current variable values ans store in dict + for var in vrs_list: + res[var] = self.get_value(var) + + # add current time to results + res['SimTime'] = self.current_time + + # add addierte inputs bei Inputreduktion + ''' + ... res[u_AHU] = AHU_hot - AHU_cold ... + ''' + return res + + def write_variables(self, var_dict: dict): + ''' + Sets multiple variables. + var_dict is a dict with variable names in keys. + ''' + + for key in var_dict: + self.set_value(key, var_dict[key]) + return "Variable set!!" + + @staticmethod + def display_time(seconds, granularity=2): + result = [] + + if seconds % 3600 == 0: + for name, count in (('weeks', 604800), # 60 * 60 * 24 * 7 + ('days', 86400), # 60 * 60 * 24 + ('hours', 3600), # 60 * 60 + ('minutes', 60), + ('seconds', 1),): + value = seconds // count + if value: + seconds -= value * count + if value == 1: + name = name.rstrip('s') + result.append("{} {}".format(value, name)) + print(', '.join(result[:granularity])) + + def get_intgains(self, SimTime: int): + + if self.df_intgains is None: + return dict() + + while SimTime > 604740: + SimTime -= 604740 + + row = self.df_intgains[(self.df_intgains[0] <= SimTime)].tail(1) + + dict_intgains = {'internal_gain_1': row.iloc[0, 1], + 'internal_gain_2': row.iloc[0, 2], + 'internal_gain_3': row.iloc[0, 3], + } + + return dict_intgains + + def __enter__(self): + self.fmu.terminate() + self.fmu.freeInstance() + + +if __name__ == '__main__': + + fmpy.dump('FMU/thermal_zone_valve_ctrl_wea_base_solver.fmu') + exit() + + # create fmu object + My_FMU = FMU(start_time=3600 * 24 * 0, + stop_time=3600 * 24 * 365, + step_size=60 * 60 * 6, + sim_tolerance=0.0001, + fmu_file='FMU/thermal_zone_valve_ctrl_wea_base_solver.fmu', + intgains_file='internal_gains.csv') + + # print(My_FMU.find_vars('')) + + # create fmu instance + variables = ['TAirRoom', + 'weaBus.TDryBul', + 'weaBus.HDifHor', + 'weaBus.HDirNor', + 'weaBus.HGloHor', + 'weaBus.HHorIR', + 'weaBus.TBlaSky', + 'weaBus.TDewPoi', + 'internal_gain_1', + 'internal_gain_2', + 'internal_gain_3', + ] + + df = My_FMU.run(variables) + + # pickle_handler.write_pkl(My_FMU, filename='My_FMU') + + df[['TAirRoom']].plot() + plt.show() + + df[['weaBus.HDifHor', 'weaBus.HDirNor', 'weaBus.HGloHor']].plot() + plt.show() + + df[['weaBus.TDewPoi', 'weaBus.TDryBul', 'weaBus.TBlaSky']].plot() + plt.show() + + df[['internal_gain_1', 'internal_gain_2', 'internal_gain_3']].plot() + plt.show() + + df.to_excel('Weather.xlsx') diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/pickle_handler.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/pickle_handler.py new file mode 100644 index 0000000000000000000000000000000000000000..7d03aabbceae05107de604af9781fc7e23578b29 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/pickle_handler.py @@ -0,0 +1,35 @@ +import pickle +import os +import datetime + +spare_directory_name = 'stored_data\\data_SPARE_{date:%d-%m_%H_%M}'.format(date=datetime.datetime.now()) + +def read_pkl(fullpath: str): + fullpath = fullpath + if os.path.exists(fullpath): + pkl_file = open(fullpath, 'rb') + pkl_data = pickle.load(pkl_file) + pkl_file.close() + print('\nFile:', '"' + fullpath + '"', 'loaded.') + return pkl_data + else: + ValueError(fullpath + ' does not exist.') + + +def write_pkl(data, filename: str, directory_name: str): + + fullpath = directory_name + '\\' + filename + '.pkl' + + # make sure directory exists + if not os.path.exists(directory_name): + print('hallo') + os.makedirs(directory_name) + + # Open Data + pkl_file = open(fullpath, 'wb') + pickle.dump(data, pkl_file) + + # Print Status + print('\nFile:', '"' + fullpath + '"', 'saved.') + + pkl_file.close() diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_1200.pkl b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_1200.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3e1a7cc89460bcc571ed6ed83e6826c4524fb78e Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_1200.pkl differ diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_900.pkl b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_900.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3e1a7cc89460bcc571ed6ed83e6826c4524fb78e Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_900.pkl differ diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_new.pkl b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_new.pkl new file mode 100644 index 0000000000000000000000000000000000000000..95ba8c4d0031db0ba0ab24792ef5527b81f91f45 Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_valve_skripte/stored_data/dist/dist_new.pkl differ diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/GP_csd.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/GP_csd.py new file mode 100644 index 0000000000000000000000000000000000000000..5dc30b9301f9b14def85e8b368ecc056a761fb29 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/GP_csd.py @@ -0,0 +1,90 @@ +''' +very simple script of 1D Gaussian Process Regression +shows, that Casadi can be coupled with "handwritten" GPregression +''' + +from __future__ import division +import numpy as np +import matplotlib.pyplot as plt +from casadi import * + +class GP_regression: + def __init__(self): + # --- just for visualisation + self.f = lambda x: np.sin(0.9*x).flatten() + x = np.arange(-5, 1, 0.1) + plt.plot(x, self.f(x)) + plt.axis([-5, 1, -1.5, 1.5]) + + + # --- "Training" data and target definition + N = 8 # number of existing observation points (training points). + self.X = np.random.uniform(-5, 1, size=(N,1)) # N training points + self.y = self.f(self.X) + plt.plot(self.X, self.y, 'k+', ms=18) + + # --- Matrices that allow calculation for any evaluation + self.K = self.kernel(self.X, self.X) + self.L = np.linalg.cholesky(self.K) + + def kernel(self,a,b): + # --- kernel function + kernelParameter_l = 0.5 + kernelParameter_sigma = 1.0 + sqdist = np.sum(a**2,axis=1).reshape(-1,1) + np.sum(b**2,1) - 2*np.dot(a, b.T) + return kernelParameter_sigma*np.exp(-0.5 * (1/kernelParameter_l) * sqdist) + + def GP_eval(self, x_test): + # --- actual evaluating Algorithm, Rasmussen 2006 page 19 + x_test = x_test.reshape(-1,1) + alpha = np.linalg.solve(self.L.T, np.linalg.solve(self.L, self.y)) + k_star = self.kernel(self.X, x_test) + f_mean = np.dot(k_star.T, alpha) + + return f_mean + +if __name__ == '__main__' : + + GP = GP_regression() + + example_num = True + example_casadi = True + + if example_num == True: + n = 50 #test points + x_test = np.linspace(-5, 1, n).reshape(-1,1) #np.array([0.3]) + print(x_test) + + f_test = GP.GP_eval(x_test) + print(f_test) + + plt.plot(x_test, f_test, 'r--', ms=20) + + if example_casadi == True: + + x = SX.sym('x') + x_test_c = np.array([x]) + obj = GP.GP_eval(x_test_c) + OPTVARS = x + nlp = {'x': OPTVARS, 'f': obj} #, 'g': vertcat(*g), 'p': self.PARVARS} + + solver = nlpsol('S', 'ipopt', nlp) + res = solver(x0 = -3) + + f_sol = res['f'] + x_sol = res['x'] + + plt.plot(x_sol, f_sol, 'r*', ms=20) + + + + + + + + + + + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/gpy_test.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/gpy_test.py new file mode 100644 index 0000000000000000000000000000000000000000..c09344551bffdcbcb368b457dd496aa79e80aa99 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/gpy_test.py @@ -0,0 +1,65 @@ +import GPy +import numpy as np +import matplotlib.pyplot as plt +from vdp_gp import * + +dt = 0.5 +N_data = 500 +new_data = False + +vdp1 = vdp_model(dt) # --- from vdp_gp script +gp = GP_regression(vdp1) + + + +def get_new_data(N_data_arg=N_data): + X_train, Y_train = gp.set_up_data(N_data_arg) + np.save('X_train.npy', X_train) + np.save('Y_train.npy', Y_train) + + +if new_data == True: + print('New Data is set True. Generating new Training Data with N_data = ' + str(N_data)) + get_new_data(N_data) + +try: + X_train = np.load('X_train.npy') + Y_train = np.load('Y_train.npy') + print('Existing or created data used, N_data = ' + str(X_train.shape[0])) + time.sleep(5) +except FileNotFoundError: + print('No data created so far. Generating new Training Data with N_data = ' + str(N_data)) + get_new_data(N_data) + time.sleep(5) +X_train, Y_train = gp.set_up_data(300) + +np.save('X_train.npy', X_train) +np.save('Y_train.npy', Y_train) + +#X_train = np.load('X_train.npy') +#Y_train = np.load('Y_train.npy') + + +kernel = GPy.kern.RBF(input_dim = 3, ARD=True) +print(kernel) +#kernel.plot() +print(kernel.lengthscale) +m = GPy.models.GPRegression(X_train, Y_train, kernel) + +print(m) +m.optimize(messages = True) +#m.optimize_restarts(num_restarts = 10) +print(m) +print(kernel.lengthscale) +print(kernel.lengthscale[1]) + + +kernel = GPy.kern.RBF(input_dim = 3) + +m = GPy.models.GPRegression(X_train, Y_train, kernel) + +m.optimize(messages = False) +#m.optimize_restarts(num_restarts = 10) +print(m) +print(kernel.lengthscale) + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/vdp_GP_MPC.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/vdp_GP_MPC.py new file mode 100644 index 0000000000000000000000000000000000000000..b5b4905f34374cdbfc65d24a4f8ca4bacaab11d8 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/vdp_GP_MPC.py @@ -0,0 +1,210 @@ + +""" +Skript to check on performance of GP surrogate Model for MPC of an VdP Osc. + +""" +import numpy as np +from casadi import * +import matplotlib.pyplot as plt +from vdp_gp import * #--- This module contains the GP model + + +class vdp: # --- mathematical model of vdp oscillator + + def __init__(self): + # Declare model variables + x1 = SX.sym('x1') + x2 = SX.sym('x2') + x = vertcat(x1, x2) + u = SX.sym('u') + + self.nx = x.shape[0] + self.nu = u.shape[0] + + # Model equations + xdot = vertcat((1 - x2 ** 2) * x1 - x2 + u, x1) + + self.dae = {'x': x, 'p': u, 'ode': xdot} + self.model = None + + def apply_ctrl(self, x0, u, dt): + opts = {'tf': dt} + F = integrator('F', 'rk', self.dae, opts) + Fk = F(x0=x0, p=u) + return Fk['xf'] + + +class GP_MPC: + + def __init__(self, N = 10): #takes certain GP,(self.gp) gp is specified in main, allows for different gp regression to be examined + self.setpoint = np.zeros((2,1)) # Ruhelage vdp, =/=f(t) + self.N = N # Control horizon + + def create_controller(self, opts_ipopt = None): + # --- Initialization + OPTVARS = [] + PARVARS = [] + g = [] + self.ubg = [] + self.lbg = [] + + Xk = SX.sym('X0', vdp.nx) + X0 = SX.sym('X_0', vdp.nx) + g.append(X0 - Xk) + for i in range(vdp.nx): + self.lbg.append(0) + self.ubg.append(0) + OPTVARS.append(Xk) + PARVARS.append(X0) + + obj = 0 + + # --- Q,R weights for objective + Q = diag(2) + R = 1 + + # --- Multiple Shooting Loop over control horizon N + for k in range(self.N): + + Uk = SX.sym('U' + str(k), 1) # controls at k + + # "Integrator" -> Pred from GP + + X_pred = gp.GP_eval(np.array([Xk[0],Xk[1],Uk[0]]).reshape(1,-1)).reshape(2,1) + # to be improved :D + + Xk = SX.sym('X' + str(k + 1), 2) # states at k + + # Objective Function + obj = obj + (X_pred -self.setpoint).T @ Q @ (X_pred -self.setpoint) + Uk.T @ R @ Uk + + OPTVARS.append(Xk) + OPTVARS.append(Uk) + + g.append(Xk - X_pred) + for j in range(vdp.nx): + self.lbg.append(0) + self.ubg.append(0) + + self.OPTVARS = vertcat(*OPTVARS) + self.PARVARS = vertcat(*PARVARS) + + + # Create NLP and controller + nlp = {'x': self.OPTVARS, 'f': obj, 'g': vertcat(*g), 'p': self.PARVARS} + + if opts_ipopt == None: + self.controller = nlpsol('solver', 'ipopt', nlp) + else: + self.controller = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + + def get_control(self, x0): + + self.res = self.controller( lbg = vertcat(*self.lbg), ubg = vertcat(*self.ubg), p=vertcat(*x0)) + x_test = self.res['x'] + + new_x_pred = self.res['x'][vdp.nx : vdp.nx * 2] + u_opt = self.res['x'][vdp.nx * 2] + + return new_x_pred, u_opt + + + + +if __name__ == '__main__' : + + ''' settings ''' + # --- simulation + dt = 0.5 + sim_time = 10 + + # --- data + new_data = False + N_data = 1000 + + # --- mpc solver + my_solver_opts = False + my_opts_ipopt = {'verbose': False,'ipopt': {'max_cpu_time': dt/10 }} + + ''' Initialize GP ''' + vdp1 = vdp_model(dt) # --- from vdp_gp script + gp = GP_regression(vdp1) + + ''' setting up data and regression ''' # --- maybe outsourced at some point + def get_new_data(N_data_arg = N_data): + X_train, Y_train = gp.set_up_data(N_data_arg) + np.save('X_train.npy', X_train) + np.save('Y_train.npy', Y_train) + + if new_data == True: + print('New Data is set True. Generating new Training Data with N_data = ' + str(N_data)) + get_new_data(N_data) + + try: + X_train = np.load('X_train.npy') + Y_train = np.load('Y_train.npy') + print('Existing or created data used, N_data = ' + str(X_train.shape[0])) + time.sleep(5) + except FileNotFoundError: + print('No data created so far. Generating new Training Data with N_data = ' + str(N_data)) + get_new_data(N_data) + time.sleep(5) + + gp.set_up_reg(X_train, Y_train) + + ''' Run MPC ''' + + # --- initialize objects + vdp = vdp() + mpc = GP_MPC() + + # --- initialize MPC + + if my_solver_opts == True: + mpc.create_controller(my_opts_ipopt) + else: + mpc.create_controller() + + x0_init = [1,2] + U_st = [0] + X_st = [x0_init] + X_pred_st = X_st + + i = 0 + t_sim = 0 + while t_sim < sim_time: + + x_opt, u_opt = mpc.get_control(X_st[i]) + + x_new = np.array(vdp.apply_ctrl(X_st[i], u_opt, dt)) + + U_st.append(u_opt) + + X_st = np.append(X_st, x_new.reshape(1, 2), axis=0) + + x_opt = np.array(x_opt) + X_pred_st = np.append(X_pred_st, x_opt.reshape(1, 2), axis=0) + #stores prediction of the next X value + + i +=1 + t_sim += dt + + x_axis = np.linspace(0, sim_time, i+1) + plt.plot(x_axis, X_st[:,0], label = 'x1') + plt.plot(x_axis, X_st[:,1], label = 'x2') + plt.step(x_axis, U_st[:], label='u') + + plt.plot(x_axis, X_pred_st[:,0], label = 'x1_pred') + plt.plot(x_axis, X_pred_st[:,1], label = 'x2_pred') + + plt.legend() + plt.xlabel('time') + plt.title('VdP GP_MPC (dt = ' + str(dt) +') ' ) + plt.show() + + + + + + \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/vdp_gp.py b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/vdp_gp.py new file mode 100644 index 0000000000000000000000000000000000000000..971120dc6ae0a6ed8e17b4e759df8bfe11d83aa8 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/GPR_vdp/vdp_gp.py @@ -0,0 +1,151 @@ +import numpy as np +import matplotlib.pyplot as plt +import pyDOE +from casadi import * +import time + +class vdp_model: # --- mathematical model of vdp oscillator + + def __init__(self, dt = 0.5): + # Declare model variables + x1 = MX.sym('x1') + x2 = MX.sym('x2') + x = vertcat(x1, x2) + u = MX.sym('u') + + self.nx = x.shape[0] + self.nu = u.shape[0] + + # Model equations + xdot = vertcat((1 - x2 ** 2) * x1 - x2 + u, x1) + self.dt = dt + self.dae = {'x': x, 'p': u, 'ode': xdot} + self.model = None + + def apply_ctrl(self, x0, u): + + opts = {'tf': self.dt} + F = integrator('F', 'rk', self.dae, opts) + Fk = F(x0=x0, p=u) + x_new = np.array(Fk['xf']) + return x_new + + def generate_data(self,N, u_min = 0, u_max = 0 , x_min = 0 , x_max = 0): + # --- generate random inputs and corresponding outputs + U = pyDOE.lhs(self.nu, samples = N, criterion = 'maximin') + X = pyDOE.lhs(self.nx, samples = N, criterion = 'maximin') + # --- scale data + Y = np.zeros((N,self.nx)) + + for k in range(N): + U[k,:] = U[k,:] * (u_max - u_min) + u_min + X[k,:] = X[k,:] * (x_max - x_min) + x_min + Y[k,:] = self.apply_ctrl( (float(X[k,0]), float(X[k,1])) , float(U[k,:]) ).flatten() + + return U, X, Y + + +class GP_regression: + + def __init__(self, vdp): + self.vdp = vdp + + def set_up_data(self, N = 200): + # --- set up data for regression, new data with each call + self.u_min = -3 + self.u_max = 3 + self.x_min = np.array([-3,-4]) + self.x_max = np.array([3,4]) + self.N = N + + + # --- "training" data, more like auxiliary data + U,X,Y = self.vdp.generate_data(self.N, self.u_min, self.u_max, self.x_min, self.x_max) + X = np.hstack([X, U]) + Y = Y + return X, Y + + def set_up_reg(self, X_train, Y_train): + self.X = X_train + self.Y = Y_train + + # --- Matrices that allow calculation for any evaluation + self.K = self.kernel(self.X, self.X) + + try: + self.L = np.linalg.cholesky(self.K) + print('Matrix is p. sd. for this data') + except np.linalg.LinAlgError: + print('Matrix not p. sd. ... adding noise') + self.K = self.K + np.eye(self.N)*0.000005 # --- add noise to K + self.L = np.linalg.cholesky(self.K) + #time.sleep(10) + self.alpha = np.linalg.solve(self.L.T, np.linalg.solve(self.L, self.Y)) + + + def kernel(self,a,b, ARD = True): + # --- kernel function + if ARD == True: + kernelParameter_l = [2.36, 0.942, 10.5] + kernelParameter_sigma = 2.366 + else: + kernelParameter_l = 1.6 + kernelParameter_sigma = 1.7 + + a = a / kernelParameter_l + b = b / kernelParameter_l + + sqdist = np.sum(a**2,axis=1).reshape(-1,1) + np.sum(b**2,1) - 2*np.dot(a, b.T) + # --- multidim. binomial equation, (a-b).T*(a-b) + + return kernelParameter_sigma*np.exp(-0.5 * sqdist) + + + + def GP_eval(self, x_test): + # --- actual evaluating Algorithm, Rasmussen 2006 page 19 + + k_star = self.kernel(self.X, x_test) + + f_mean = np.dot(k_star.T, self.alpha) + + return f_mean + +''' no main part intended actually. Just access from external module + Main part written for test purposes + ''' +if __name__ == '__main__': + # --- initialize + # --- + vdp = vdp_model() + gp = GP_regression(vdp) + + + #gp.set_up_reg(X_test, Y_test) + + #X_test = np.hstack([X_test, U_test]) + + gp_error_list=[] + gp_err_mean = 0 + X_train = np.load('X_train.npy') + Y_train = np.load('Y_train.npy') + + gp.set_up_reg(X_train,Y_train) + + for i in range(1): + # --- test inputs, evaluate + + X_test, Y_test = gp.set_up_data(N=2000) + #X_test = np.array([1,1,1]).reshape(1,-1) + f_test = gp.GP_eval(X_test) + #print(Y_test) + #print(f_test) + gp_err = np.sum([f_test, Y_test*(-1)], axis=0)#**2 + gp_err_mean += gp_err.mean(axis=0) + gp_error_list.append(list(gp_err.mean(axis=0))) + + print(gp_err_mean) + print(gp_error_list) + + + diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/Readme.txt b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/Readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..43b8fe8518337174b172d157838cd91bece4fc8a --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/Readme.txt @@ -0,0 +1,7 @@ +.py files: +controllers : Max Datei mit Reglern, enthält nur noch PID Regler, den ich zum in der Arbeit beschriebenen PID mit random target programmiert habe. Weitere Regler wurden gelöschht. controller Überklasse enthält entsprechenden Overhead! +data_manager: Set Up des ML-Modells sowie Ausführung der Simulationen, weitere Eigenschaften an Funktionen kommentiert. +fmu_handler: angepasster FMU handler (Beachte Skalierung bei Simple Tabs Stellgrößen!) +GP_regression: Enthält Machine Learning Klasse +GPR_mpc: Enthält GPR basierte MPC sowie lhs-"Regler" und zero-"Regler" +main: unaufgeräumtes Skript zum Starten und Verwerten der Simulationen diff --git a/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/alle_Regler_MA.png b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/alle_Regler_MA.png new file mode 100644 index 0000000000000000000000000000000000000000..bde717c04fec467ef323277aed1a59f90165a0cb Binary files /dev/null and b/01_Input/Masterarbeit Konrad Beeser/gpr_ddmpc/alle_Regler_MA.png differ diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/.gitignore b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e7e9d11d4bf243bffe4bb60b4ac1f9392297f4bf --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/LSI.iml b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/LSI.iml new file mode 100644 index 0000000000000000000000000000000000000000..d0876a78d06ac03b5d78c8dcdb95570281c6f1d6 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/LSI.iml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="PYTHON_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/inspectionProfiles/profiles_settings.xml b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ +<component name="InspectionProjectProfileManager"> + <settings> + <option name="USE_PROJECT_PROFILE" value="false" /> + <version value="1.0" /> + </settings> +</component> \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/misc.xml b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..0f4a5d0b8972b3e1130dc506783d7e1bacb6320b --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/misc.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="ES6" /> + </component> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (python-system-identifikation-mpc)" project-jdk-type="Python SDK" /> +</project> \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/modules.xml b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..249f1515e4df1922c36c2a3ee34da4d79545cca5 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/LSI.iml" filepath="$PROJECT_DIR$/.idea/LSI.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/vcs.xml b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c0b8635858dc7ad44b93df54b762707ce49eefc --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARMAX.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARMAX.py new file mode 100644 index 0000000000000000000000000000000000000000..e35d6718a3c1648ccb862f5f73535a1c5a426865 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARMAX.py @@ -0,0 +1,206 @@ +#!/usr/bin/env python +# coding: utf-8 +""" +ARMAX Example + +@author: Giuseppe Armenise +""" + +from __future__ import division +from past.utils import old_div +from sippy import functionset as fset +from sippy import * +import numpy as np +import control.matlab as cnt +import matplotlib.pyplot as plt + +# ## Define sampling time and Time vector + +sampling_time = 1. # [s] +end_time = 400 # [s] +npts = int(old_div(end_time, sampling_time)) + 1 +Time = np.linspace(0, end_time, npts) + +# ## Define pseudo random binary sequence as input signal and white noise as noise signal + +switch_probability = 0.08 # [0..1] +[Usim,_,_] = fset.GBN_seq(npts, switch_probability) +white_noise_variance = [0.005] +e_t = fset.white_noise_var(Usim.size, white_noise_variance)[0] + +# ## Define the system + +# ### Numerator of noise transfer function has only one root: nc = 1 + +NUM_H = [1., 0.3, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.] + +# ### Common denominator between input and noise transfer functions has 4 roots: na = 4 + +DEN = [1., -2.21, 1.7494, -0.584256, 0.0684029, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.] + +# ### Numerator of input transfer function has 3 roots: nb = 3 + +NUM = [1., -2.07, 1.3146] + +# ### Define transfer functions + +g_sample = cnt.tf(NUM, DEN, sampling_time) +h_sample = cnt.tf(NUM_H, DEN, sampling_time) + +# ## Time responses + +# ### Input reponse + +Y1, Time, Xsim = cnt.lsim(g_sample, Usim, Time) +plt.figure(0) +plt.plot(Time, Usim) +plt.plot(Time, Y1) +plt.xlabel("Time") +plt.title("Time response y(t)=g*u(t)") +plt.legend(['u(t)', 'y(t)']) +plt.grid() +plt.show() + +# ### Noise response + +Y2, Time, Xsim = cnt.lsim(h_sample, e_t, Time) +plt.figure(1) +plt.plot(Time, e_t) +plt.plot(Time, Y2) +plt.xlabel("Time") +plt.title("Time response y(t)=h*e(t)") +plt.legend(['e(t)', 'y(t)']) +plt.grid() +plt.show() + +# ## Compute total output +# $$Y_t = Y_1 + Y_2 = G.u + H.e$$ + +Ytot = Y1 + Y2 +Utot = Usim + e_t +plt.figure(2) +plt.plot(Time, Utot) +plt.plot(Time, Ytot) +plt.xlabel("Time") +plt.title("Time response y_t(t)=g*u(t) + h*e(t)") +plt.legend(['u(t) + e(t)', 'y_t(t)']) +plt.grid() + +# ## Perform system identification from collected data + +Id_sys = system_identification(Ytot, Usim, 'ARMAX', IC='BIC', na_ord=[2, 5], nb_ord=[1, 5], + nc_ord=[0, 2], delays=[10, 13], ARMAX_max_iterations=300) + +# ## Check that output of the identified system is consistent + +Y_id1, Time, Xsim = cnt.lsim(Id_sys.G, Usim, Time) +Y_hid1, Time, Xsim = cnt.lsim(Id_sys.H, e_t, Time) +Y_idTot = Y_id1 + Y_hid1 + +plt.figure(3) +plt.plot(Time, Usim) +plt.ylabel("Input GBN") +plt.xlabel("Time") +plt.title("Input, validation data (Switch probability=0.08)") +plt.grid() +plt.show() + +plt.figure(4) +plt.plot(Time, Ytot) +plt.plot(Time, Y_idTot) +plt.grid() +plt.xlabel("Time") +plt.ylabel("y_tot") +plt.title("Gu+He (identification data)") +plt.legend(['Original system', 'Identified system']) +plt.show() + +plt.figure(5) +plt.plot(Time, Y1) +plt.plot(Time, Y_id1) +plt.ylabel("y_out") +plt.grid() +plt.xlabel("Time") +plt.title("Gu (identification data)") +plt.legend(['Original system', 'Identified system']) + +plt.figure(6) +plt.plot(Time, Y2) +plt.plot(Time, Y_hid1) +plt.ylabel("y_err") +plt.grid() +plt.xlabel("Time") +plt.title("He (identification data)") +plt.legend(['Original system', 'Identified system']) +plt.show() + +# # Validation of the identified system: +# ## Generate new time series for input and noise + +switch_probability = 0.07 # [0..1] +input_range = [0.5, 1.5] +[U_valid,_,_] = fset.GBN_seq(npts, switch_probability, Range = input_range) +white_noise_variance = [0.01] +e_valid = fset.white_noise_var(U_valid.size, white_noise_variance)[0] + +# ## Compute time responses for true system with new inputs + +Yvalid1, Time, Xsim = cnt.lsim(g_sample, U_valid, Time) +Yvalid2, Time, Xsim = cnt.lsim(h_sample, e_valid, Time) +Ytotvalid = Yvalid1 + Yvalid2 + +# ## Compute time responses for identified system with new inputs + +Yidvalid1, Time, Xsim = cnt.lsim(Id_sys.G, U_valid, Time) +Yidvalid2, Time, Xsim = cnt.lsim(Id_sys.H, e_valid, Time) +Yidtotvalid = Yidvalid1 + Yidvalid2 + +# ## Check responses are almost equal + +plt.figure(7) +plt.plot(Time, U_valid) +plt.ylabel("Input GBN") +plt.xlabel("Time") +plt.title("Input, validation data (Switch probability=0.07)") +plt.grid() +plt.show() + +plt.figure(8) +plt.plot(Time, Ytotvalid) +plt.plot(Time, Yidtotvalid) +plt.xlabel("Time") +plt.ylabel("y_tot") +plt.legend(['Original system', 'Identified system']) +plt.grid() +plt.show() + +rmse = np.round(np.sqrt(np.mean((Ytotvalid - Yidtotvalid) ** 2)), 2) +plt.title("Validation: Gu+He | RMSE = {}".format(rmse)) + +plt.figure(9) +plt.plot(Time, Yvalid1) +plt.plot(Time, Yidvalid1) +plt.grid() +plt.xlabel("Time") +plt.ylabel("y_out") +plt.title("Gu (Validation)") +plt.legend(['Original system', 'Identified system']) +plt.show() + +plt.figure(10) +plt.plot(Time, Yvalid2) +plt.plot(Time, Yidvalid2) +plt.grid() +plt.xlabel("Time") +plt.ylabel("y_err") +plt.title("He (Validation)") +plt.legend(['Original system', 'Identified system']) +plt.show() + +plt.figure(11) +_ = cnt.bode([h_sample, Id_sys.H]) +plt.show() + +plt.figure(12) +_ = cnt.bode([g_sample, Id_sys.G]) +plt.show() diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARMAX_MIMO.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARMAX_MIMO.py new file mode 100644 index 0000000000000000000000000000000000000000..a0fa0baed7fddb629b5d93a7dfdc0878a17b6805 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARMAX_MIMO.py @@ -0,0 +1,493 @@ +# -*- coding: utf-8 -*- +""" +Created + +@author: Giuseppe Armenise +example armax mimo +case 3 outputs x 4 inputs + +""" +from __future__ import division + +from past.utils import old_div + +# Checking path to access other files +try: + from sippy import * +except ImportError: + import sys, os + + sys.path.append(os.pardir) + from sippy import * + +import numpy as np +import control.matlab as cnt +from sippy import functionset as fset + +# generating transfer functions in z-transf. +var_list = [50., 100., 1.] +ts = 1. + +NUM11 = [4, 3.3, 0., 0.] +NUM12 = [10, 0., 0.] +NUM13 = [7.0, 5.5, 2.2] +NUM14 = [-0.9, -0.11, 0., 0.] +DEN1 = [1., -0.3, -0.25, -0.021, 0., 0.] # +H1 = [1., 0.85, 0.32, 0., 0., 0.] +na1 = 3 +nb11 = 2 +nb12 = 1 +nb13 = 3 +nb14 = 2 +th11 = 1 +th12 = 2 +th13 = 2 +th14 = 1 +nc1 = 2 +# +DEN2 = [1., -0.4, 0., 0., 0.] +NUM21 = [-85, -57.5, -27.7] +NUM22 = [71, 12.3] +NUM23 = [-0.1, 0., 0., 0.] +NUM24 = [0.994, 0., 0., 0.] +H2 = [1., 0.4, 0.05, 0., 0.] + +na2 = 1 +nb21 = 3 +nb22 = 2 +nb23 = 1 +nb24 = 1 + +th21 = 1 +th22 = 2 +th23 = 0 +th24 = 0 +nc2 = 2 + +DEN3 = [1., -0.1, -0.3, 0., 0.] +NUM31 = [0.2, 0., 0., 0.] +NUM32 = [0.821, 0.432, 0.] +NUM33 = [0.1, 0., 0., 0.] +NUM34 = [0.891, 0.223] +H3 = [1., 0.7, 0.485, 0.22, 0.] + +na3 = 2 +nb31 = 1 +nb32 = 2 +nb33 = 1 +nb34 = 2 +th31 = 0 +th32 = 1 +th33 = 0 +th34 = 2 +nc3 = 3 + +# transfer function G, H +g_sample11 = cnt.tf(NUM11, DEN1, ts) +g_sample12 = cnt.tf(NUM12, DEN1, ts) +g_sample13 = cnt.tf(NUM13, DEN1, ts) +g_sample14 = cnt.tf(NUM14, DEN1, ts) + +g_sample22 = cnt.tf(NUM22, DEN2, ts) +g_sample21 = cnt.tf(NUM21, DEN2, ts) +g_sample23 = cnt.tf(NUM23, DEN2, ts) +g_sample24 = cnt.tf(NUM24, DEN2, ts) + +g_sample31 = cnt.tf(NUM31, DEN3, ts) +g_sample32 = cnt.tf(NUM32, DEN3, ts) +g_sample33 = cnt.tf(NUM33, DEN3, ts) +g_sample34 = cnt.tf(NUM34, DEN3, ts) + +H_sample1 = cnt.tf(H1, DEN1, ts) +H_sample2 = cnt.tf(H2, DEN2, ts) +H_sample3 = cnt.tf(H3, DEN3, ts) + +# +tfin = 400 +npts = int(old_div(tfin, ts)) + 1 +Time = np.linspace(0, tfin, npts) +# #INPUT# +Usim = np.zeros((4, npts)) +Usim_noise = np.zeros((4, npts)) +[Usim[0, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [-0.33, 0.1]) +[Usim[1, :],_,_] = fset.GBN_seq(npts, 0.03) +[Usim[2, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [2.3, 5.7]) +[Usim[3, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [8., 11.5]) + +# Adding noise +err_inputH = np.zeros((4, npts)) + +err_inputH = fset.white_noise_var(npts, var_list) + +err_outputH1, Time, Xsim = cnt.lsim(H_sample1, err_inputH[0, :], Time) +err_outputH2, Time, Xsim = cnt.lsim(H_sample2, err_inputH[1, :], Time) +err_outputH3, Time, Xsim = cnt.lsim(H_sample3, err_inputH[2, :], Time) + +# OUTPUTS +Yout = np.zeros((3, npts)) + +Yout11, Time, Xsim = cnt.lsim(g_sample11, Usim[0, :], Time) +Yout12, Time, Xsim = cnt.lsim(g_sample12, Usim[1, :], Time) +Yout13, Time, Xsim = cnt.lsim(g_sample13, Usim[2, :], Time) +Yout14, Time, Xsim = cnt.lsim(g_sample14, Usim[3, :], Time) +Yout21, Time, Xsim = cnt.lsim(g_sample21, Usim[0, :], Time) +Yout22, Time, Xsim = cnt.lsim(g_sample22, Usim[1, :], Time) +Yout23, Time, Xsim = cnt.lsim(g_sample23, Usim[2, :], Time) +Yout24, Time, Xsim = cnt.lsim(g_sample24, Usim[3, :], Time) +Yout31, Time, Xsim = cnt.lsim(g_sample31, Usim[0, :], Time) +Yout32, Time, Xsim = cnt.lsim(g_sample32, Usim[1, :], Time) +Yout33, Time, Xsim = cnt.lsim(g_sample33, Usim[2, :], Time) +Yout34, Time, Xsim = cnt.lsim(g_sample34, Usim[3, :], Time) + +Ytot1 = Yout11 + Yout12 + Yout13 + Yout14 +Ytot2 = Yout21 + Yout22 + Yout23 + Yout24 +Ytot3 = Yout31 + Yout32 + Yout33 + Yout34 + +Ytot = np.zeros((3, npts)) + +Ytot[0, :] = (Ytot1 + err_outputH1).squeeze() +Ytot[1, :] = (Ytot2 + err_outputH2).squeeze() +Ytot[2, :] = (Ytot3 + err_outputH3).squeeze() + +##identification parameters +ordersna = [na1, na2, na3] +ordersnb = [[nb11, nb12, nb13, nb14], [nb21, nb22, nb23, nb24], [nb31, nb32, nb33, nb34]] +ordersnc = [nc1, nc2, nc3] +theta_list = [[th11, th12, th13, th14], [th21, th22, th23, th24], [th31, th32, th33, th34]] + +# IDENTIFICATION +Id_sys = system_identification(Ytot, Usim, 'ARMAX', + ARMAX_orders=[ordersna, ordersnb, ordersnc, theta_list], + ARMAX_max_iterations=20) # + +# Generating transfer functions from NUMERATOR and DENOMINATOR +# you can use directly Id_sys.G for the G*u term, see the arx_MIMO example. +gid11 = cnt.tf(Id_sys.NUMERATOR[0][0], Id_sys.DENOMINATOR[0][0], 1.) +gid12 = cnt.tf(Id_sys.NUMERATOR[0][1], Id_sys.DENOMINATOR[0][1], 1.) +gid13 = cnt.tf(Id_sys.NUMERATOR[0][2], Id_sys.DENOMINATOR[0][2], 1.) +gid21 = cnt.tf(Id_sys.NUMERATOR[1][0], Id_sys.DENOMINATOR[1][0], 1.) +gid22 = cnt.tf(Id_sys.NUMERATOR[1][1], Id_sys.DENOMINATOR[1][1], 1.) +gid23 = cnt.tf(Id_sys.NUMERATOR[1][2], Id_sys.DENOMINATOR[1][2], 1.) +gid14 = cnt.tf(Id_sys.NUMERATOR[0][3], Id_sys.DENOMINATOR[0][3], 1.) +gid24 = cnt.tf(Id_sys.NUMERATOR[1][3], Id_sys.DENOMINATOR[1][3], 1.) +gid31 = cnt.tf(Id_sys.NUMERATOR[2][0], Id_sys.DENOMINATOR[2][0], 1.) +gid32 = cnt.tf(Id_sys.NUMERATOR[2][1], Id_sys.DENOMINATOR[2][1], 1.) +gid33 = cnt.tf(Id_sys.NUMERATOR[2][2], Id_sys.DENOMINATOR[2][2], 1.) +gid34 = cnt.tf(Id_sys.NUMERATOR[2][3], Id_sys.DENOMINATOR[2][3], 1.) + +hid1 = cnt.tf(Id_sys.NUMERATOR_H[0][0], Id_sys.DENOMINATOR_H[0][0], 1.) +hid2 = cnt.tf(Id_sys.NUMERATOR_H[1][0], Id_sys.DENOMINATOR_H[1][0], 1.) +hid3 = cnt.tf(Id_sys.NUMERATOR_H[2][0], Id_sys.DENOMINATOR_H[2][0], 1.) + +# output of the identified model +Yout_id11, Time, Xsim = cnt.lsim(gid11, Usim[0, :], Time) +Yout_id12, Time, Xsim = cnt.lsim(gid12, Usim[1, :], Time) +Yout_id13, Time, Xsim = cnt.lsim(gid13, Usim[2, :], Time) +Yout_id14, Time, Xsim = cnt.lsim(gid14, Usim[3, :], Time) +Yout_id21, Time, Xsim = cnt.lsim(gid21, Usim[0, :], Time) +Yout_id22, Time, Xsim = cnt.lsim(gid22, Usim[1, :], Time) +Yout_id23, Time, Xsim = cnt.lsim(gid23, Usim[2, :], Time) +Yout_id24, Time, Xsim = cnt.lsim(gid24, Usim[3, :], Time) +Yout_id31, Time, Xsim = cnt.lsim(gid31, Usim[0, :], Time) +Yout_id32, Time, Xsim = cnt.lsim(gid32, Usim[1, :], Time) +Yout_id33, Time, Xsim = cnt.lsim(gid33, Usim[2, :], Time) +Yout_id34, Time, Xsim = cnt.lsim(gid34, Usim[3, :], Time) +Yerr1, Time, Xsim = cnt.lsim(hid1, err_inputH[0, :], Time) +Yerr2, Time, Xsim = cnt.lsim(hid2, err_inputH[1, :], Time) +Yerr3, Time, Xsim = cnt.lsim(hid3, err_inputH[2, :], Time) + +######plot +# +import matplotlib.pyplot as plt + +plt.close('all') +plt.figure(0) +plt.subplot(4, 1, 1) +plt.plot(Time, Usim[0, :]) +plt.grid() +plt.ylabel("Input 1 GBN") +plt.xlabel("Time") +plt.title("Input (Switch probability=0.03) (identification data)") + +plt.subplot(4, 1, 2) +plt.plot(Time, Usim[1, :]) +plt.grid() +plt.ylabel("Input 2 GBN") +plt.xlabel("Time") + +plt.subplot(4, 1, 3) +plt.plot(Time, Usim[2, :]) +plt.ylabel("Input 3 GBN") +plt.xlabel("Time") +plt.grid() + +plt.subplot(4, 1, 4) +plt.plot(Time, Usim[3, :]) +plt.ylabel("Input 4 GBN") +plt.xlabel("Time") +plt.grid() + +plt.figure(3) +plt.subplot(3, 1, 1) +plt.plot(Time, Ytot1) +plt.plot(Time, Yout_id11 + Yout_id12 + Yout_id13 + Yout_id14) +plt.ylabel("y_1,out") +plt.grid() +plt.xlabel("Time") +plt.title("Gu (identification data)") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 2) +plt.plot(Time, Ytot2) +plt.plot(Time, Yout_id21 + Yout_id22 + Yout_id23 + Yout_id24) +plt.ylabel("y_2,out") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 3) +plt.plot(Time, Ytot3) +plt.plot(Time, Yout_id31 + Yout_id32 + Yout_id33 + Yout_id34) +plt.ylabel("y_3,out") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.figure(5) +plt.subplot(3, 1, 1) # +plt.plot(Time, err_outputH1) +plt.plot(Time, Yerr1) +plt.ylabel("y_1,err") +plt.grid() +plt.title("He (identification data)") +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 2) +plt.plot(Time, err_outputH2) +plt.plot(Time, Yerr2) +plt.ylabel("y_2,err") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 3) +plt.plot(Time, err_outputH3) +plt.plot(Time, Yerr3) +plt.ylabel("y_3,err") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.figure(6) +plt.subplot(3, 1, 1) +plt.plot(Time, Ytot[0, :].squeeze()) +plt.plot(Time, + Yout_id11 + Yout_id12 + Yout_id13 + Yout_id14 + Yerr1) +plt.xlabel("Time") +plt.ylabel("y_1,tot") +plt.title("Gu+He (identification data)") +plt.legend(['Original system', 'Identified system']) +plt.grid() + +plt.subplot(3, 1, 2) +plt.plot(Time, Ytot[1, :]) +plt.plot(Time, + Yout_id21 + Yout_id22 + Yout_id23 + Yout_id24 + Yerr2) +plt.xlabel("Time") +plt.ylabel("y_2,tot") + +plt.legend(['Original system', 'Identified system']) + +plt.grid() + +plt.subplot(3, 1, 3) +plt.plot(Time, Ytot[2, :]) +plt.plot(Time, + Yout_id31 + Yout_id32 + Yout_id33 + Yout_id34 + Yerr3) +plt.xlabel("Time") +plt.ylabel("y_3,tot") + +plt.legend(['Original system', 'Identified system']) + +plt.grid() + +################################################################################# +################################################################################### +####################################VALIDATION############################################ +################################################################################## +####################################################################################à + + +tfin = 400 +npts = int(old_div(tfin, ts)) + 1 +Time = np.linspace(0, tfin, npts) +# #INPUT# +Usim = np.zeros((4, npts)) +Usim_noise = np.zeros((4, npts)) +[Usim[0, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [0.33, 0.7]) +[Usim[1, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [-2., -1.]) +[Usim[2, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [1.3, 2.7]) +[Usim[3, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [1., 5.2]) +err_inputH = np.zeros((4, npts)) + +err_inputH = fset.white_noise_var(npts, var_list) + +err_outputH1, Time, Xsim = cnt.lsim(H_sample1, err_inputH[0, :], Time) +err_outputH2, Time, Xsim = cnt.lsim(H_sample2, err_inputH[1, :], Time) +err_outputH3, Time, Xsim = cnt.lsim(H_sample3, err_inputH[2, :], Time) + +Yout = np.zeros((3, npts)) + +Yout11, Time, Xsim = cnt.lsim(g_sample11, Usim[0, :], Time) +Yout12, Time, Xsim = cnt.lsim(g_sample12, Usim[1, :], Time) +Yout13, Time, Xsim = cnt.lsim(g_sample13, Usim[2, :], Time) +Yout14, Time, Xsim = cnt.lsim(g_sample14, Usim[3, :], Time) +Yout21, Time, Xsim = cnt.lsim(g_sample21, Usim[0, :], Time) +Yout22, Time, Xsim = cnt.lsim(g_sample22, Usim[1, :], Time) +Yout23, Time, Xsim = cnt.lsim(g_sample23, Usim[2, :], Time) +Yout24, Time, Xsim = cnt.lsim(g_sample24, Usim[3, :], Time) +Yout31, Time, Xsim = cnt.lsim(g_sample31, Usim[0, :], Time) +Yout32, Time, Xsim = cnt.lsim(g_sample32, Usim[1, :], Time) +Yout33, Time, Xsim = cnt.lsim(g_sample33, Usim[2, :], Time) +Yout34, Time, Xsim = cnt.lsim(g_sample34, Usim[3, :], Time) + +Ytot1 = Yout11 + Yout12 + Yout13 + Yout14 +Ytot2 = Yout21 + Yout22 + Yout23 + Yout24 +Ytot3 = Yout31 + Yout32 + Yout33 + Yout34 + +Ytot = np.zeros((3, npts)) # + +Ytot[0, :] = (Ytot1 + err_outputH1).squeeze() +Ytot[1, :] = (Ytot2 + err_outputH2).squeeze() +Ytot[2, :] = (Ytot3 + err_outputH3).squeeze() + +###############################################################################plot + + +Yout_id11, Time, Xsim = cnt.lsim(gid11, Usim[0, :], Time) +Yout_id12, Time, Xsim = cnt.lsim(gid12, Usim[1, :], Time) +Yout_id13, Time, Xsim = cnt.lsim(gid13, Usim[2, :], Time) +Yout_id14, Time, Xsim = cnt.lsim(gid14, Usim[3, :], Time) +Yout_id21, Time, Xsim = cnt.lsim(gid21, Usim[0, :], Time) +Yout_id22, Time, Xsim = cnt.lsim(gid22, Usim[1, :], Time) +Yout_id23, Time, Xsim = cnt.lsim(gid23, Usim[2, :], Time) +Yout_id24, Time, Xsim = cnt.lsim(gid24, Usim[3, :], Time) +Yout_id31, Time, Xsim = cnt.lsim(gid31, Usim[0, :], Time) +Yout_id32, Time, Xsim = cnt.lsim(gid32, Usim[1, :], Time) +Yout_id33, Time, Xsim = cnt.lsim(gid33, Usim[2, :], Time) +Yout_id34, Time, Xsim = cnt.lsim(gid34, Usim[3, :], Time) +Yerr1, Time, Xsim = cnt.lsim(hid1, err_inputH[0, :], Time) +Yerr2, Time, Xsim = cnt.lsim(hid2, err_inputH[1, :], Time) +Yerr3, Time, Xsim = cnt.lsim(hid3, err_inputH[2, :], Time) + +plt.figure(7) +plt.subplot(3, 1, 1) +plt.plot(Time, Ytot1) +plt.plot(Time, Yout_id11 + Yout_id12 + Yout_id13 + Yout_id14) +plt.ylabel("y_1,out") +plt.grid() +plt.xlabel("Time") +plt.title("Gu (validation data)") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 2) +plt.plot(Time, Ytot2) +plt.plot(Time, Yout_id21 + Yout_id22 + Yout_id23 + Yout_id24) +plt.ylabel("y_2,out") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 3) +plt.plot(Time, Ytot3) +plt.plot(Time, Yout_id31 + Yout_id32 + Yout_id33 + Yout_id34) +plt.ylabel("y_3,out") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.figure(8) +plt.subplot(3, 1, 1) # +plt.plot(Time, err_outputH1) +plt.plot(Time, Yerr1) +plt.ylabel("y_1,err") +plt.grid() +plt.title("He (validation data)") +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 2) +plt.plot(Time, err_outputH2) +plt.plot(Time, Yerr2) +plt.ylabel("y_2,err") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 3) +plt.plot(Time, err_outputH3) +plt.plot(Time, Yerr3) +plt.ylabel("y_3,err") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.figure(9) +plt.subplot(3, 1, 1) +plt.plot(Time, Ytot[0, :].squeeze()) +plt.plot(Time, + Yout_id11 + Yout_id12 + Yout_id13 + Yout_id14 + Yerr1) +plt.xlabel("Time") +plt.ylabel("y_1,tot") +plt.title("Gu+He (validation data)") +plt.legend(['Original system', 'Identified system']) +plt.grid() + +plt.subplot(3, 1, 2) +plt.plot(Time, Ytot[1, :]) +plt.plot(Time, + Yout_id21 + Yout_id22 + Yout_id23 + Yout_id24 + Yerr2) +plt.xlabel("Time") +plt.ylabel("y_2,tot") + +plt.legend(['Original system', 'Identified system']) + +plt.grid() + +plt.subplot(3, 1, 3) +plt.plot(Time, Ytot[2, :]) +plt.plot(Time, + Yout_id31 + Yout_id32 + Yout_id33 + Yout_id34 + Yerr3) +plt.xlabel("Time") +plt.ylabel("y_3,tot") +plt.legend(['Original system', 'Identified system']) +plt.grid() + +plt.figure(10) +plt.subplot(4, 1, 1) +plt.plot(Time, Usim[0, :]) +plt.grid() +plt.ylabel("Input 1 GBN") +plt.xlabel("Time") +plt.title("Input (Switch probability=0.03) (validation data)") + +plt.subplot(4, 1, 2) +plt.plot(Time, Usim[1, :]) +plt.grid() +plt.ylabel("Input 2 GBN") +plt.xlabel("Time") + +plt.subplot(4, 1, 3) +plt.plot(Time, Usim[2, :]) +plt.ylabel("Input 3 GBN") +plt.xlabel("Time") +plt.grid() + +plt.subplot(4, 1, 4) +plt.plot(Time, Usim[3, :]) +plt.ylabel("Input 4 GBN") +plt.xlabel("Time") +plt.grid() + +plt.show() diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARX_MIMO.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARX_MIMO.py new file mode 100644 index 0000000000000000000000000000000000000000..52e9e51561e9acfa47bd5fcb696684f340e154d5 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/ARX_MIMO.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +""" +Created + +@author: Giuseppe Armenise +example armax mimo +case 3 outputs x 4 inputs + +""" +from __future__ import division + +from past.utils import old_div + +# Checking path to access other files +try: + from sippy import * +except ImportError: + import sys, os + + sys.path.append(os.pardir) + from sippy import * + +import numpy as np +import control.matlab as cnt +from sippy import functionset as fset + + +# generating transfer functions in z-transf. +var_list = [50., 100., 1.] +ts = 1. + +NUM11 = [4, 3.3, 0., 0.] +NUM12 = [10, 0., 0.] +NUM13 = [7.0, 5.5, 2.2] +NUM14 = [-0.9, -0.11, 0., 0.] +DEN1 = [1., -0.3, -0.25, -0.021, 0., 0.] # +H1 = [1., 0., 0., 0., 0., 0.] +na1 = 3 +nb11 = 2 +nb12 = 1 +nb13 = 3 +nb14 = 2 +th11 = 1 +th12 = 2 +th13 = 2 +th14 = 1 + +# +DEN2 = [1., -0.4, 0., 0., 0.] +NUM21 = [-85, -57.5, -27.7] +NUM22 = [71, 12.3] +NUM23 = [-0.1, 0., 0., 0.] +NUM24 = [0.994, 0., 0., 0.] +H2 = [1., 0., 0., 0., 0.] + +na2 = 1 +nb21 = 3 +nb22 = 2 +nb23 = 1 +nb24 = 1 + +th21 = 1 +th22 = 2 +th23 = 0 +th24 = 0 + +DEN3 = [1., -0.1, -0.3, 0., 0.] +NUM31 = [0.2, 0., 0., 0.] +NUM32 = [0.821, 0.432, 0.] +NUM33 = [0.1, 0., 0., 0.] +NUM34 = [0.891, 0.223] +H3 = [1., 0., 0., 0., 0.] + +na3 = 2 +nb31 = 1 +nb32 = 2 +nb33 = 1 +nb34 = 2 +th31 = 0 +th32 = 1 +th33 = 0 +th34 = 2 + +# transfer function G, H +g_sample11 = cnt.tf(NUM11, DEN1, ts) +g_sample12 = cnt.tf(NUM12, DEN1, ts) +g_sample13 = cnt.tf(NUM13, DEN1, ts) +g_sample14 = cnt.tf(NUM14, DEN1, ts) + +g_sample22 = cnt.tf(NUM22, DEN2, ts) +g_sample21 = cnt.tf(NUM21, DEN2, ts) +g_sample23 = cnt.tf(NUM23, DEN2, ts) +g_sample24 = cnt.tf(NUM24, DEN2, ts) + +g_sample31 = cnt.tf(NUM31, DEN3, ts) +g_sample32 = cnt.tf(NUM32, DEN3, ts) +g_sample33 = cnt.tf(NUM33, DEN3, ts) +g_sample34 = cnt.tf(NUM34, DEN3, ts) + +H_sample1 = cnt.tf(H1, DEN1, ts) +H_sample2 = cnt.tf(H2, DEN2, ts) +H_sample3 = cnt.tf(H3, DEN3, ts) + +# +tfin = 400 +npts = int(old_div(tfin, ts)) + 1 +Time = np.linspace(0, tfin, npts) +# #INPUT# +Usim = np.zeros((4, npts)) +Usim_noise = np.zeros((4, npts)) +[Usim[0, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [-0.33, 0.1]) +[Usim[1, :],_,_] = fset.GBN_seq(npts, 0.03) +[Usim[2, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [2.3, 5.7]) +[Usim[3, :],_,_] = fset.GBN_seq(npts, 0.03, Range = [8., 11.5]) + +# Adding noise +err_inputH = np.zeros((4, npts)) + +err_inputH = fset.white_noise_var(npts, var_list) + +err_outputH = np.ones((3, npts)) +err_outputH1, Time, Xsim = cnt.lsim(H_sample1, err_inputH[0, :], Time) +err_outputH2, Time, Xsim = cnt.lsim(H_sample2, err_inputH[1, :], Time) +err_outputH3, Time, Xsim = cnt.lsim(H_sample3, err_inputH[2, :], Time) + +Yout11, Time, Xsim = cnt.lsim(g_sample11, Usim[0, :], Time) +Yout12, Time, Xsim = cnt.lsim(g_sample12, Usim[1, :], Time) +Yout13, Time, Xsim = cnt.lsim(g_sample13, Usim[2, :], Time) +Yout14, Time, Xsim = cnt.lsim(g_sample14, Usim[3, :], Time) +Yout21, Time, Xsim = cnt.lsim(g_sample21, Usim[0, :], Time) +Yout22, Time, Xsim = cnt.lsim(g_sample22, Usim[1, :], Time) +Yout23, Time, Xsim = cnt.lsim(g_sample23, Usim[2, :], Time) +Yout24, Time, Xsim = cnt.lsim(g_sample24, Usim[3, :], Time) +Yout31, Time, Xsim = cnt.lsim(g_sample31, Usim[0, :], Time) +Yout32, Time, Xsim = cnt.lsim(g_sample32, Usim[1, :], Time) +Yout33, Time, Xsim = cnt.lsim(g_sample33, Usim[2, :], Time) +Yout34, Time, Xsim = cnt.lsim(g_sample34, Usim[3, :], Time) + +Ytot1 = Yout11 + Yout12 + Yout13 + Yout14 + err_outputH1 +Ytot2 = Yout21 + Yout22 + Yout23 + Yout24 + err_outputH2 +Ytot3 = Yout31 + Yout32 + Yout33 + Yout34 + err_outputH3 + +Ytot = np.zeros((3, npts)) + +Ytot[0, :] = Ytot1.squeeze() +Ytot[1, :] = Ytot2.squeeze() +Ytot[2, :] = Ytot3.squeeze() + +##identification parameters +ordersna = [na1, na2, na3] +ordersnb = [[nb11, nb12, nb13, nb14], [nb21, nb22, nb23, nb24], [nb31, nb32, nb33, nb34]] +theta_list = [[th11, th12, th13, th14], [th21, th22, th23, th24], [th31, th32, th33, th34]] + +# IDENTIFICATION +Id_sys = system_identification(Ytot, Usim, 'ARX', ARX_orders=[ordersna, ordersnb, theta_list]) # + +# output of the identified model +# you can build g11, g12, etc. separately using the NUMERATOR and DENOMINATOR attributes +# see how in the armax_MIMO example +Yout_id, Time, Xsim = cnt.lsim(Id_sys.G, Usim, Time) + +######plot +# +import matplotlib.pyplot as plt + +plt.close('all') +plt.figure(0) +plt.subplot(4, 1, 1) +plt.plot(Time, Usim[0, :]) +plt.grid() +plt.ylabel("Input 1 GBN") +plt.xlabel("Time") +plt.title("Input (Switch probability=0.03)") + +plt.subplot(4, 1, 2) +plt.plot(Time, Usim[1, :]) +plt.grid() +plt.ylabel("Input 2 GBN") +plt.xlabel("Time") + +plt.subplot(4, 1, 3) +plt.plot(Time, Usim[2, :]) +plt.ylabel("Input 3 GBN") +plt.xlabel("Time") +plt.grid() + +plt.subplot(4, 1, 4) +plt.plot(Time, Usim[3, :]) +plt.ylabel("Input 4 GBN") +plt.xlabel("Time") +plt.grid() + +plt.figure(1) +plt.subplot(3, 1, 1) +plt.plot(Time, Ytot1) +plt.plot(Time, Yout_id[:, 0]) +plt.ylabel("y_1,out") +plt.grid() +plt.xlabel("Time") +plt.title("Gu (identification data)") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 2) +plt.plot(Time, Ytot2) +plt.plot(Time, Yout_id[:, 1]) +plt.ylabel("y_2,out") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.subplot(3, 1, 3) +plt.plot(Time, Ytot3) +plt.plot(Time, Yout_id[:, 2]) +plt.ylabel("y_3,out") +plt.grid() +plt.xlabel("Time") +plt.legend(['Original system', 'Identified system']) + +plt.show() diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/SS.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/SS.py new file mode 100644 index 0000000000000000000000000000000000000000..af292b1b82f388fd356908902073e0506bc21c13 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/SS.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Jan 19 2018 + +@author: Giuseppe Armenise + +In this test, no error occurs. +Using method='N4SID','MOESP' or 'CVA', if the message +"Kalman filter cannot be calculated" is shown, it means +that the package slycot is not well-installed. + +""" +from __future__ import division + +from past.utils import old_div + +# Checking path to access other files +try: + from sippy import * +except ImportError: + import sys, os + + sys.path.append(os.pardir) + from sippy import * + +import numpy as np +from sippy import functionset as fset +from sippy import functionsetSIM as fsetSIM + +ts = 1.0 + +A = np.array([[0.89, 0.], [0., 0.45]]) +B = np.array([[0.3], [2.5]]) +C = np.array([[0.7, 1.]]) +D = np.array([[0.0]]) + +tfin = 500 +npts = int(old_div(tfin, ts)) + 1 +Time = np.linspace(0, tfin, npts) + +# Input sequence +U = np.zeros((1, npts)) +[U[0],_,_] = fset.GBN_seq(npts, 0.05) + +##Output +x, yout = fsetSIM.SS_lsim_process_form(A, B, C, D, U) + +# measurement noise +noise = fset.white_noise_var(npts, [0.15]) + +# Output with noise +y_tot = yout + noise + +##System identification +method = 'N4SID' +sys_id = system_identification(y_tot, U, method, SS_fixed_order=2) +xid, yid = fsetSIM.SS_lsim_process_form(sys_id.A, sys_id.B, sys_id.C, sys_id.D, U, sys_id.x0) + +import matplotlib.pyplot as plt + +plt.close("all") +plt.figure(0) +plt.plot(Time, y_tot[0]) +plt.plot(Time, yid[0]) +plt.ylabel("y_tot") +plt.grid() +plt.xlabel("Time") +plt.title("Ytot") +plt.legend(['Original system', 'Identified system, ' + method]) +plt.show() + +plt.figure(1) +plt.plot(Time, U[0]) +plt.ylabel("input") +plt.grid() +plt.xlabel("Time") + +plt.show() diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/example_CST.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/example_CST.py new file mode 100644 index 0000000000000000000000000000000000000000..d469ccb5b7b12882a6c3c30a6e2787b246098a1e --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/example_CST.py @@ -0,0 +1,323 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 28 13:03:03 2018 + +@author: Riccardo Bacci di Capaci + +CST example + +A Continuous Stirred Tank to be identified from input-output data + +""" + +# import package +from __future__ import division # compatibility layer between Python 2 and Python 3 +from past.utils import old_div +from sippy import functionset as fset +from sippy import functionsetSIM as fsetSIM +from sippy import * +# +# +import numpy as np +import control.matlab as cnt +import matplotlib.pyplot as plt + +# sampling time +ts = 1. # [min] + +# time settings (t final, samples number, samples vector) +tfin = 4000 +npts = int(old_div(tfin,ts)) + 1 +Time = np.linspace(0, tfin, npts) + +# Data +V = 10.0 # tank volume [m^3] --> assumed to be constant +ro = 1100.0 # solution density [kg/m^3] --> assumed to be constant +cp = 4.180 # specific heat [kJ/kg*K] --> assumed to be constant +Lam = 2272.0 # latent heat [kJ/kg] --> assumed to be constant (Tvap = 100°C, Pvap = 1atm) +# initial conditions +# Ca_0 +# Tin_0 + + +# VARIABLES + +# 4 Inputs +# - as v. manipulated +# Input Flow rate Fin [m^3/min] +# Steam Flow rate W [kg/min] +# - as disturbances +# Input Concentration Ca_in [kg salt/m^3 solution] +# Input Temperature T_in [°C] +# U = [F, W, Ca_in, T_in] +m = 4 + +# 2 Outputs +# Output Concentration Ca [kg salt/m^3 solution] (Ca = Ca_out) +# Output Temperature T [°C] (T = T_out) +# X = [Ca, T] +p = 2 + + +# Function with System Dynamics +def Fdyn(X,U): + # Balances + + # V is constant ---> perfect Level Control + # ro*F_in = ro*F_out = ro*F --> F = F_in = F_out at each instant + + # Mass Balance on A + # Ca_in*F - Ca*F = V*dCA/dt + # + dx_0 = (U[2]*U[0] - X[0]*U[0])/V + + # Energy Balance + # ro*cp*F*T_in - ro*cp*F*T + W*Lam = (V*ro*cp)*dT/dt + # + dx_1 = (ro*cp*U[0]*U[3] - ro*cp*U[0]*X[1] + U[1]*Lam)/(V*ro*cp) + + fx = np.append(dx_0,dx_1) + + return fx + +# Build input sequences +U = np.zeros((m,npts)) + +# manipulated inputs as GBN +# Input Flow rate Fin = F = U[0] [m^3/min] +prob_switch_1 = 0.05 +F_min = 0.4 +F_max = 0.6 +Range_GBN_1 = [F_min,F_max] +[U[0,:],_,_] = fset.GBN_seq(npts, prob_switch_1, Range = Range_GBN_1) +# Steam Flow rate W = U[1] [kg/min] +prob_switch_2 = 0.05 +W_min = 20 +W_max = 40 +Range_GBN_2 = [W_min,W_max] +[U[1,:],_,_] = fset.GBN_seq(npts, prob_switch_2, Range = Range_GBN_2) + +# disturbance inputs as RW (random-walk) + +# Input Concentration Ca_in = U[2] [kg salt/m^3 solution] +Ca_0 = 10.0 # initial condition +sigma_Ca = 0.01 # variation +U[2,:] = fset.RW_seq(npts, Ca_0, sigma = sigma_Ca) +# Input Temperature T_in [°C] +Tin_0 = 25.0 # initial condition +sigma_T = 0.01 # variation +U[3,:] = fset.RW_seq(npts, Tin_0, sigma = sigma_T) + + +##### COLLECT DATA + +# Output Initial conditions +Caout_0 = Ca_0 +Tout_0 = (ro*cp*U[0,0]*Tin_0 + U[1,0]*Lam)/(ro*cp*U[0,0]) +Xo1 = Caout_0*np.ones((1,npts)) +Xo2 = Tout_0*np.ones((1,npts)) +X = np.vstack((Xo1,Xo2)) + +# Run Simulation +for j in range(npts-1): + # Explicit Runge-Kutta 4 (TC dynamics is integrateed by hand) + Mx = 5 # Number of elements in each time step + dt = ts/Mx # integration step + # Output & Input + X0k = X[:,j] + Uk = U[:,j] + # Integrate the model + for i in range(Mx): + k1 = Fdyn(X0k, Uk) + k2 = Fdyn(X0k + dt/2.0*k1, Uk) + k3 = Fdyn(X0k + dt/2.0*k2, Uk) + k4 = Fdyn(X0k + dt*k3, Uk) + Xk_1 = X0k + (dt/6.0)*(k1 + 2.0*k2 + 2.0*k3 + k4) + X[:,j+1] = Xk_1 + +# Add noise (with assigned variances) +var = [0.001, 0.001] +noise = fset.white_noise_var(npts,var) + +# Build Output +Y = X + noise + + +#### IDENTIFICATION STAGE + +# ARX - mimo +na_ords = [5,5] +nb_ords = [[3,1,3,1], [3,3,1,3]] +theta = [[0,0,0,0], [0,0,0,0]] +# call id +Id_ARX = system_identification(Y, U, 'ARX', centering = 'MeanVal', ARX_orders = [na_ords, nb_ords, theta]) + +# ARMAX - mimo +na_ords = [5,5] +nb_ords = [[2,2,2,2], [2,2,2,2]] +nc_ords = [3,3] +theta = [[1,1,1,1], [1,1,1,1]] +# Number of iterations +n_iter = 300 +# call id +Id_ARMAX = system_identification(Y, U, 'ARMAX', centering = 'InitVal', ARMAX_orders = [na_ords, nb_ords, nc_ords, theta], ARMAX_max_iterations = n_iter) + +# SS - mimo +# choose method +method = 'PARSIM-K' +SS_ord = 2 +Id_SS = system_identification(Y, U, method, SS_fixed_order = SS_ord) + +# GETTING RESULTS (Y_id) +# ARX +Y_arx = Id_ARX.Yid +# ARMAX +Y_armax = Id_ARMAX.Yid +# SS +x_ss, Y_ss = fsetSIM.SS_lsim_process_form(Id_SS.A,Id_SS.B,Id_SS.C,Id_SS.D,U,Id_SS.x0) + + +##### PLOTS + +# Input +plt.close('all') +plt.figure(1) + +str_input = ['F [m$^3$/min]', 'W [kg/min]', 'Ca$_{in}$ [kg/m$^3$]', 'T$_{in}$ [$^o$C]'] +for i in range(m): + plt.subplot(m,1,i+1) + plt.plot(Time,U[i,:]) + plt.ylabel("Input " + str(i+1)) + plt.ylabel(str_input[i]) + plt.grid() + plt.xlabel("Time") + plt.axis([0, tfin, 0.95*np.amin(U[i,:]), 1.05*np.amax(U[i,:])]) + if i == 0: + plt.title('identification') + +# Output +plt.figure(2) +str_output = ['Ca [kg/m$^3$]', 'T [$^o$C]'] +for i in range(p): + plt.subplot(p,1,i+1) + plt.plot(Time,Y[i,:],'b') + plt.plot(Time,Y_arx[i,:],'g') + plt.plot(Time,Y_armax[i,:],'r') + plt.plot(Time,Y_ss[i,:],'m') + plt.ylabel("Output " + str(i+1)) + plt.ylabel(str_output[i]) + plt.legend(['Data','ARX','ARMAX','SS']) + plt.grid() + plt.xlabel("Time") + if i == 0: + plt.title('identification') + + +#### VALIDATION STAGE + +# Build new input sequences +U_val = np.zeros((m,npts)) + +# manipulated inputs as GBN +# Input Flow rate Fin = F = U[0] [m^3/min] +prob_switch_1 = 0.05 +F_min = 0.4 +F_max = 0.6 +Range_GBN_1 = [F_min,F_max] +[U_val[0,:],_,_] = fset.GBN_seq(npts, prob_switch_1, Range = Range_GBN_1) +# Steam Flow rate W = U[1] [kg/min] +prob_switch_2 = 0.05 +W_min = 20 +W_max = 40 +Range_GBN_2 = [W_min,W_max] +[U_val[1,:],_,_] = fset.GBN_seq(npts, prob_switch_2, Range = Range_GBN_2) + +# disturbance inputs as RW (random-walk) +# Input Concentration Ca_in = U[2] [kg salt/m^3 solution] +Ca_0 = 10.0 # initial condition +sigma_Ca = 0.02 # variation +U_val[2,:] = fset.RW_seq(npts, Ca_0, sigma = sigma_Ca) +# Input Temperature T_in [°C] +Tin_0 = 25.0 # initial condition +sigma_T = 0.1 # variation +U_val[3,:] = fset.RW_seq(npts, Tin_0, sigma = sigma_T) + +#### COLLECT DATA + +# Output Initial conditions +Caout_0 = Ca_0 +Tout_0 = (ro*cp*U[0,0]*Tin_0 + U[1,0]*Lam)/(ro*cp*U[0,0]) +Xo1 = Caout_0*np.ones((1,npts)) +Xo2 = Tout_0*np.ones((1,npts)) +X_val = np.vstack((Xo1,Xo2)) + +# Run Simulation +for j in range(npts-1): + # Explicit Runge-Kutta 4 (TC dynamics is integrateed by hand) + Mx = 5 # Number of elements in each time step + dt = ts/Mx # integration step + # Output & Input + X0k = X_val[:,j] + Uk = U_val[:,j] + # Integrate the model + for i in range(Mx): + k1 = Fdyn(X0k, Uk) + k2 = Fdyn(X0k + dt/2.0*k1, Uk) + k3 = Fdyn(X0k + dt/2.0*k2, Uk) + k4 = Fdyn(X0k + dt*k3, Uk) + Xk_1 = X0k + (dt/6.0)*(k1 + 2.0*k2 + 2.0*k3 + k4) + X_val[:,j+1] = Xk_1 + +# Add noise (with assigned variances) +var = [0.01, 0.05] +noise_val = fset.white_noise_var(npts,var) + +# Build Output +Y_val = X_val + noise_val + + +# MODEL VALIDATION + +# ARX +Yv_arx = fset.validation(Id_ARX,U_val,Y_val,Time) + +# ARMAX +Yv_armax = fset.validation(Id_ARMAX,U_val,Y_val,Time) + + +# SS +x_ss, Yv_ss = fsetSIM.SS_lsim_process_form(Id_SS.A,Id_SS.B,Id_SS.C,Id_SS.D,U_val,Id_SS.x0) + + +##### PLOTS + +# Input +plt.figure(3) +str_input = ['F [m$^3$/min]', 'W [kg/min]', 'Ca$_{in}$ [kg/m$^3$]', 'T$_{in}$ [$^o$C]'] +for i in range(m): + plt.subplot(m,1,i+1) + plt.plot(Time,U_val[i,:]) + # plt.ylabel("Input " + str(i+1)) + plt.ylabel(str_input[i]) + plt.grid() + plt.xlabel("Time") + plt.axis([0, tfin, 0.95*np.amin(U_val[i,:]), 1.05*np.amax(U_val[i,:])]) + if i == 0: + plt.title('validation') + +# Output +plt.figure(4) +str_output = ['Ca [kg/m$^3$]', 'T [$^o$C]'] +for i in range(p): + plt.subplot(p,1,i+1) + plt.plot(Time,Y_val[i,:],'b') + plt.plot(Time,Yv_arx[i,:],'g') + plt.plot(Time,Yv_armax[i,:],'r') + plt.plot(Time,Yv_ss[i,:],'m') + # plt.ylabel("Output " + str(i+1)) + plt.ylabel(str_output[i]) + plt.legend(['Data','ARX','ARMAX','SS']) + plt.grid() + plt.xlabel("Time") + if i == 0: + plt.title('validation') diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/test_armax.ipynb b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/test_armax.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..6a1d34685a64e930892460f426e2a587de93da2a --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/Examples/test_armax.ipynb @@ -0,0 +1,8677 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import division\n", + "from past.utils import old_div\n", + "from sippy import functionset as fset\n", + "from sippy import *\n", + "import numpy as np\n", + "import control.matlab as cnt\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import rcParams\n", + "\n", + "rcParams['figure.figsize'] = (9.0, 5.0)\n", + "%matplotlib nbagg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define sampling time and Time vector" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "sampling_time = 1. # [s]\n", + "end_time = 400 # [s]\n", + "npts = int(old_div(end_time, sampling_time)) + 1\n", + "Time = np.linspace(0, end_time, npts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define pseudo random binary sequence as input signal and white noise as noise signal" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# make input signal\n", + "switch_probability = 0.08 # [0..1]\n", + "Usim = fset.GBN_seq(npts, switch_probability)\n", + "\n", + "# make noise for input signal\n", + "white_noise_variance = [0.005]\n", + "e_t = fset.white_noise_var(Usim.size, white_noise_variance)[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Define the system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerator of noise transfer function has only one root: nc = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "NUM_H = [1., 0.3, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Common denominator between input and noise transfer functions has 4 roots: na = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "DEN = [1., -2.21, 1.7494, -0.584256, 0.0684029, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerator of input transfer function has 3 roots: nb = 3" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "NUM = [1., -2.07, 1.3146]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define transfer functions" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g()\n" + ] + }, + { + "data": { + "text/latex": [ + "$$\\frac{z^2 - 2.07 z + 1.315}{z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10}\\quad dt = 1.0$$" + ], + "text/plain": [ + "\n", + " z^2 - 2.07 z + 1.315\n", + "---------------------------------------------------------\n", + "z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10\n", + "\n", + "dt = 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "h()\n" + ] + }, + { + "data": { + "text/latex": [ + "$$\\frac{z^14 + 0.3 z^13}{z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10}\\quad dt = 1.0$$" + ], + "text/plain": [ + "\n", + " z^14 + 0.3 z^13\n", + "---------------------------------------------------------\n", + "z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10\n", + "\n", + "dt = 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "g_sample = cnt.tf(NUM, DEN, sampling_time)\n", + "h_sample = cnt.tf(NUM_H, DEN, sampling_time)\n", + "print(\"g()\")\n", + "display(g_sample)\n", + "print(\"h()\")\n", + "display(h_sample)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time responses" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Input reponse" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydBXTUxxaHv40ACQGCu0vQEAgS3N21OG0ptNCW4i0ULVYK9JUqUooVd7fi7hbcJUCwKPFk35n/NkZswyYhdO+c885r2Jk7M9/cZH47cken1+v1SBICQkAICAEhIASEgBAwGwI6EYBmM9bSUSEgBISAEBACQkAIaAREAIojCAEhIASEgBAQAkLAzAiIADSzAZfuCgEhIASEgBAQAkJABKD4gBAQAkJACAgBISAEzIyACEAzG3DprhAQAkJACAgBISAERACKDwgBISAEhIAQEAJCwMwIiAA0swGX7goBISAEhIAQEAJCQASg+IAQEAJCQAgIASEgBMyMgAhAMxtw6a4QEAJCQAgIASEgBEQAig8IASEgBISAEBACQsDMCIgANLMBl+4KASEgBISAEBACQkAEoPiAEBACQkAICAEhIATMjIAIQDMbcOmuEBACQkAICAEhIAREAIoPCAEhIASEgBAQAkLAzAiIADSzAZfuCgEhIASEgBAQAkJABKD4gBAQAkJACAgBISAEzIyACEAzG3DprhAQAkJACAgBISAERACKDwgBISAEhIAQEAJCwMwIiAA0swGX7goBISAEhIAQEAJCQASg+IAQEAJCQAgIASEgBMyMgAhAMxtw6a4QEAJCQAgIASEgBEQAig8IASEgBISAEBACQsDMCIgANLMBl+4KASEgBISAEBACQkAEoPiAEBACQkAICAEhIATMjIAIQDMbcOmuEBACQkAICAEhIAREAIoPCAEhIASEgBAQAkLAzAiIADSzAZfuCgEhIASEgBAQAkJABKD4gBAQAkJACAgBISAEzIyACEAzG3DprhAQAkJACAgBISAERACKDwgBISAEhIAQEAJCwMwIiAA0swGX7goBISAEhIAQEAJCQASg+IAQEAJCQAgIASEgBMyMgAhAMxtw6a4QEAJCQAgIASEgBEQAig8IASEgBISAEBACQsDMCIgANLMBl+4KASEgBISAEBACQkAEoPiAEBACQkAICAEhIATMjIAIQDMbcOmuEBACQkAICAEhIAREAIoPCIFkJHDx4kVmzZrF/v37efz4sVZTvnz5qF+/Pn379qVSpUrJWHt00/fu3aNw4cJMnz6dYcOGxah3xowZDB8+nLt371KoUKEka9eh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zPhBuor1C93GefPmtbC3crkQEAJCwPYERADanrHcQQgIATsTsKUADAsLU9bCWbNmoW3btnYeqdxeCAgBIWAeARGA5nGSq4SAENAwAVsKQGIZMmSIygAeN24cqlWrhocPH2LPnj1IkyYNuN+gFCEgBISAoxEQAehoMyL9EQJCINkJ2FoAchuYSZMmYerUqbh48aJyH5ctWxaDBg1C9erVk3080qAQEAJCwFoCIgCtJSj1hYAQEAJCQAgIASGgMQIiADU2YdJdISAEhIAQEAJCQAhYS0AEoLUEpb4QEAJCQAgIASEgBDRGQASgxiZMuisEhIAQEAJCQAgIAWsJiAC0lqDUFwJCQAgIASEgBISAxgiIANTYhEl3hYAQEAJCQAgIASFgLQERgNYSlPpCQAgIASEgBISAENAYARGAGpsw6a4QEAJCQAgIASEgBKwlIALQWoJSXwgIASEgBISAEBACGiMgAlBjEybdFQJCQAgIASEgBISAtQREAFpLUOoLASEgBISAEBACQkBjBEQAamzCpLtCQAgIASEgBISAELCWgAhAawlKfSEgBISAEBACQkAIaIzA/wE9iZ1lBx5anQAAAABJRU5ErkJggg==\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Y1, Time, Xsim = cnt.lsim(g_sample, Usim, Time)\n", + "plt.figure()\n", + "plt.plot(Time, Usim, label=\"u(t)\")\n", + "plt.plot(Time, Y1, label=\"y(t)\")\n", + "plt.xlabel(\"Time\")\n", + "plt.title(\"Time response y(t)=g*u(t)\")\n", + "plt.legend()\n", + "plt.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Noise response" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydBXSUxxbH/+u7CQQP7u5evHiBoi20xVoKLdAWWorEhRAXCAS3FncohVLk4e7uEtyTEBJINuvvzJduSIjt7rfxO+dwXl8yd+Q3d3f+GbkjMBgMBlAiAkSACBABIkAEiAARKDAEBCQAC8xYU0eJABEgAkSACBABIsARIAFIjkAEiAARIAJEgAgQgQJGgARgARtw6i4RIAJEgAgQASJABEgAkg8QASJABIgAESACRKCAESABWMAGnLpLBIgAESACRIAIEAESgOQDRIAIEAEiQASIABEoYARIABawAafuEgEiQASIABEgAkSABCD5ABEgAkSACBABIkAEChgBEoAFbMCpu0SACBABIkAEiAARIAFIPkAEiAARIAJEgAgQgQJGgARgARtw6i4RIAJEgAgQASJABEgAkg8QASJABIgAESACRKCAESABWMAGnLpLBIgAESACRIAIEAESgOQDRIAIEAEiQASIABEoYARIABawAafuEgEiQASIABEgAkSABCD5ABEgAkSACBABIkAEChgBEoAFbMCpu0SACBABIkAEiAARIAFIPkAEiAARIAJEgAgQgQJGgARgARtw6i4RIAJEgAgQASJABEgAkg8QASJABIgAESACRKCAESABWMAGnLpLBIgAESACRIAIEAESgOQDRIAIEAEiQASIABEoYARIABawAafuEgEiQASIABEgAkSABCD5ABEgAkSACBABIkAEChgBEoAFbMCpu0SACBABIkAEiAARIAFIPkAEiAARIAJEgAgQgQJGgARgARtw6i4RIAJEgAgQASJABEgAkg8QASJABIgAESACRKCAESABWMAGnLpLBIgAESACRIAIEAESgOQDRIAIEAEiQASIABEoYARIABawAafuEgEiQASIABEgAkSABCD5ABEgAkSACBABIkAEChgBEoAFbMCpu0SACBABIkAEiAARIAFIPkAEiAARIAJEgAgQgQJGgARgARtw6i4RIAJEgAgQASJABEgAkg8QASJABIgAESACRKCAESABWMAGnLpLBIgAESACRIAIEAESgOQDRCAPELhy5QrCwsJw6NAhPH/+nGtxhQoV0KVLF4wePRotWrSwai80Gg0aNmyI77//Hs7OzlzZy5cvx8iRI/HgwQNUqVIl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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Y2, Time, Xsim = cnt.lsim(h_sample, e_t, Time)\n", + "plt.figure()\n", + "plt.plot(Time, e_t, label=\"e(t)\")\n", + "plt.plot(Time, Y2, label=\"y(t)\")\n", + "plt.xlabel(\"Time\")\n", + "plt.title(\"Time response y(t)=h*e(t)\")\n", + "plt.legend()\n", + "plt.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute total output \n", + "$$Y_t = Y_1 + Y_2 = G.u + H.e$$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Ytot = Y1 + Y2\n", + "Utot = Usim + e_t\n", + "plt.figure()\n", + "plt.plot(Time, Ytot, label=\"y_t(t)\")\n", + "plt.plot(Time, Utot, label=\"u(t) + e(t)\")\n", + "plt.xlabel(\"Time\")\n", + "plt.title(\"Time response y_t(t)=g*u(t) + h*e(t)\")\n", + "plt.legend()\n", + "plt.grid()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Perform system identification from collected data" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Armax model:\n", + "- Params:\n", + " na: 4 (2, 5)\n", + " nb: 4 (1, 5)\n", + " nc: 2 (0, 2)\n", + " delay: 10 (10, 13)\n", + " dt: 1.0 \n", + " method: BIC \n", + " max iterations: 1000 \n", + "- Output:\n", + " G: \n", + " 0.00527 z^3 + 1.001 z^2 - 2.078 z + 1.321\n", + "-----------------------------------------------------------\n", + "z^14 - 2.215 z^13 + 1.763 z^12 - 0.5889 z^11 + 0.06359 z^10\n", + "\n", + "dt = 1.0\n", + " \n", + " H: \n", + " z^14 + 0.3018 z^13 - 0.02355 z^12\n", + "-----------------------------------------------------------\n", + "z^14 - 2.215 z^13 + 1.763 z^12 - 0.5889 z^11 + 0.06359 z^10\n", + "\n", + "dt = 1.0\n", + " \n", + " Variance: 0.00011141138008015731 \n", + " Max reached: False\n" + ] + } + ], + "source": [ + "Id_sys = system_identification(Ytot, Usim, 'ARMAX', IC='BIC', na_ord=[2, 5], \\\n", + " nb_ord=[1, 5], nc_ord=[0, 2], delays=[10, 13], \\\n", + " ARMAX_max_iterations=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check that output of the identified system is consistent" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "Y_id1, Time, Xsim = cnt.lsim(Id_sys.G, Usim, Time)\n", + "Y_hid1, Time, Xsim = cnt.lsim(Id_sys.H, e_t, Time)\n", + "Y_idTot = Y_id1 + Y_hid1" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuxdB5QUxdq9LDlHkZxzlLjknI2AoqIoKFkEQYkCklFQMT2S+gMiORrIOWeWZckgOeecF/5ze7eWmt6eme6enp0Fqs7hvOdOdXXVreqqW1+M8/jx48dQRSGgEFAIKAQUAgoBhYBC4LlBII4igM/NXKuBKgQUAgoBhYBCQCGgENAQUARQLQSFgEJAIaAQUAgoBBQCzxkCigA+ZxOuhqsQUAgoBBQCCgGFgEJAEUC1BhQCCgGFgEJAIaAQUAg8ZwgoAvicTbgarkJAIaAQUAgoBBQCCgFFANUaUAgoBBQCCgGFgEJAIfCcIaAI4HM24Wq4CgGFgEJAIaAQUAgoBBQBVGtAIaAQUAgoBBQCCgGFwHOGgCKAz9mEq+EqBBQCCgGFgEJAIaAQUARQrQGFgEJAIaAQUAgoBBQCzxkCigA+ZxOuhqsQUAgoBBQCCgGFgEJAEUC1BhQCCgGFgEJAIaAQUAg8ZwgoAvicTbgarkJAIaAQUAgoBBQCCgFFANUaUAgoBBQCCgGFgEJAIfCcIaAI4HM24Wq4CgGFgEJAIaAQUAgoBBQBVGtAIaAQUAgoBBQCCgGFwHOGgCKAz9mEq+EqBBQCCgGFgEJAIaAQUARQrQGFgEJAIaAQUAgoBBQCzxkCigA+ZxOuhqsQUAgoBBQCCgGFgEJAEUC1BhQCCgGFgEJAIaAQUAg8ZwgoAvicTbgarkJAIaAQUAgoBBQCCgFFANUaUAgoBBQCCgGFgEJAIfCcIaAI4HM24Wq4CgGFgEJAIaAQUAgoBBQBVGtAIaAQUAgoBBQCCgGFwHOGgCKAz9mEq+EqBBQCCgGFgEJAIaAQUARQrQGFgEJAIaAQUAgoBBQCzxkCigA+ZxOuhqsQUAgoBBQCCgGFgEJAEUC1BhQCCgGFgEJAIaAQUAg8ZwgoAvicTbgarkJAIaAQUAgoBBQCCgFFANUaUAgoBBQCCgGFgEJAIfCcIaAI4HM24Wq4CgGFgEJAIaAQUAgoBBQBVGtAIaAQUAgoBBQCCgGFwHOGgCKAz9mEq+EqBBQCCgGFgEJAIaAQUARQrQGFgEJAIaAQUAgoBBQCzxkCigA+ZxOuhqsQUAgoBBQCCgGFgEJAEUC1BhQCCgGFgEJAIaAQUAg8ZwgoAvicTbi74Y4fPx4tWrTAli1bULp06ViBypAhQ1CoUCG88cYbsaI/7ES/fv3Qv39/PH78OKpP1apV0/7/ypUrPfbz6NGjyJkzJ8aNG4fmzZtbGtOePXswffp07bkcOXK4PMu/8d1sPzYUf43TibGtWbMGtWrVwoEDB5A9e3atyQcPHuD//u//8Ntvv+G///7D3bt38cILL+Cll17S8G7YsKFPrzZaMyNHjkSSJEksrwN2ROA7fPhwfPHFFz71LSYe5vdx8eJF7Nq1y7HX8RsoUqQI/v33X8vfnNjrjhw5EvUtGX1Dgdx/zp8/j27dumnju337NooXL45BgwahZs2apjA8fPiwtjaWL1+Ohw8fonz58vjmm29QsmRJl+evX7+u/X3GjBk4efIkUqdOjQoVKmj7XOHChaPq/v777+jbt6/23SRNmtRUH1Sl2I+AIoCxf45ipIexkQAmS5YMb775Jti32FKMDnOSMxaSVU/FF2I0c+ZMvPXWW1ixYgUE4RTvImnhRl6iRIlYAZO/xunr4EjaebnhYfjLL79ENffOO+9g9uzZ+OyzzzRsEyZMCB6gCxcu1Ijg6NGjfXo1D1b+K1euXFQ7JC/p0qXzemkwerEigNCImxkCeO/ePYSEhCB37tzaXLIYEUCjbyhQ+w/7zHV69epVfP3110ifPj3+97//Yd68eVi6dCmqVq3qcT1euHBBu7yQzA0YMACJEiXC0KFDERoaql3w8+fPH/U829q6datG+PhOrlM+c+7cOYSFhUVdkkgiub+9++672gVYlWcDAUUAn4159HkUigCag9CIAJp78onkxo4E0BMBNPv+mKoXWwngggUL0KBBA+zbty/qEKQUKFeuXJp0w+hge/ToEYKCghyH7mkmgJRIUXpptgRSAmjURyMCaFQvUASQ0uFPPvkE69ev1y4rLCRglAKyT5s2bfIIPSWHP/zwAw4ePBhF4HhBJAmuUaMGpk2bpj1/6NAh5M2bF71798bAgQOj2tywYYMmBfz+++/RuXPnqL9/9913Wr3Tp09bmn+z60TVi3kEFAGMecxj5RuNCCDVIiQeO3bsQMeOHbF69WrtVtmkSRNQPUJJCYs48KlKoDptzJgxoAqDhxz/Jqst3Kkr9cQqTpw40XDibdWbmlV+iBKdX3/9FWfOnEGKFClc2nv77be1tnjjjR8/vrYpUs3BWy9v3pQwvP766+jTp4+LysOsCpibJN9P0kECUa9ePW0z5YYuE0Devr/99lts3LhRu3W/+OKLWh3e/IWKUsyNHhDRjhGmVGOS0EydOhWnTp3SpB9UpQ8ePBipUqWKakpIUjp06IBevXph79692nt5iHz00Ude12pMjnPJkiWa5G7btm2aSjFLliza2uKYKE3zVl577TWcPXsWmzdvjqpK/MuUKYNRo0ahbdu2bpug9DBDhgyaRJrSGJbw8HDtvdeuXdPWGOeOhQcn8WMfibV+zRDzY8eOubyLmAsVPtcfD9o5c+Zoc5cyZUpNOsN2CxQo4KIC5tr6+eefQalP0aJFMWLECBdJoycCtHjxYkyePBl//fUXKHUiOfjxxx81QiyKIG8kJT169ND2AuLIdUVyzLVL9TmJNPvJdc69gXOjb4MYd+3aVZNEpUmTRltfxCZu3LhRdblm58+fr5EXkp48efJoZIh15T1BrNuPP/4YX331laaazJQpk/bNca8SxegyYkYF7G7/4bPsE+enZ8+eLvByf+QeRVMNSuvtltq1a+PEiRPaRUUulOLxG+WelTlzZrfNk9SR7FGCLZc2bdpg4sSJmrYgXrx42hokjnpTAu4BlPZxztu1axfVBL8dYkxTCTN7g93xq+diDgFFAGMO61j9JncEcMqUKdpmwo2WagVuctz8uHFTasIiNtmsWbNq5IFEh4fDsGHDtANj1apVUTdZswSQhIgHUvXq1TUSxkIS503NKoO8c+dO7dZMEtiyZcuon3jA8jDnwcJbLQvta3i7zpcvn0b4uPmSvHKDpB2NKGYI4J07d1CqVCntpsx22SbVN3PnzsXx48ddCCAJNkkn1bc8FEkkeFBSrcx/JBg83LnpcvMn+RB2PEKtpceUZKV+/fpYtmyZdkhVrlwZxIIHJfvCG74g7xwfiQyx5QFPEsN30SaI81alShW36zamx0lVLOeOtkkkG1x3JEUku8SQRN5duX//vkbGPv30U21eRbl165ZGVqgmI/moU6dONBtLUZfqr+3bt2P//v3anyiJoVo3ceLEGmZNmzbV/k4p46VLl6IkNfo1Q5UkiSTHwEOWhfPBNXDjxg3tW+HYunfvjuDgYNy8eVP77ngh4fcgvjfOHQmhIK78TkgOBBlzh4X41vm9kmyQrJBwUBLEfnCtiEsCCSCx5TdBUstLHUkn1wUJxdixY8HLwyuvvKL1i30glsRJkHK2Qfs/ts01RhUkv4effvpJ+wZldTztkLles2XLpnWf+wAJJZ8T+w3/zrGTIJI8El9+z5MmTdL+yYTGLgH0tP80atRIu4TQTEAmr7wYr1u3TiNWJFj8DvltmSmsL0rGjBk1DEgk5ULMiPOiRYu0dWpU+E1yrmj/x/1XLtw7OFdcv9wHWHgppFr4zz//1C5CXD/8RkiouXfzwi8X7r8FCxbErFmzzAxL1YnlCCgCGMsnKKa6544ATpgwIdqN9uWXX9aM5cUNVWyyvB3y7zwAWHiYcaMmYaH0hsUsAWRdJ1QwJGLsDzdmUUiw2rdvrx1sPND0RWzcVMHwRk+JRbFixbRqZgggiQpvzpSsUFoiSuvWrTUy6kkFzAODhIZEjAefkGZ4UgHrMeUBQUkMDwBKXEThgULJJw/tVq1aaX/m/FDyyENBHLp8PyUMJAae7N9iepzyPIk5IsnmpUOPtX5OKfUjmaLkihjIhRKnDz/8UJPYsaRNm1a7fDRr1gyvvvpqVFVKiHmRIIkneaLkkQcnD1M+Q0kYJeA8NDt16qT97m7NuFMB83JFosPvhc4qRkV8b5T4kUwKEsKDvGzZsuCljXaN7or41uncQttHUbjeK1asqF1avvzyS+3PJG+8CPAyQUxE4bdPIsDvSEhE+ZvAmZcVMX7RhtH3QExJWMXak/vMSyT/UfJFySQvQkIyx3XLeeD4eckThcSIxJwXKaqp7RJAtudu/6HmgEScElrhoCbWIQmwIKqintuJkH6QHVISJEigSdj0355QzVJqy8uIUWE/+O0SM5JmuXBd8JIiq5a5XknCuS+Jwr2Oc6V3NuPv77//vmaHSGmgKk8/AooAPv1z6MgI3BHAP/74Q/NCE6SOL6NUiTYmvG2yiE2Wt0uqo+RCcsKNh23woIppAkjpAm+0st0XD0lxWIm+8jZPCQilfVRfy16+MmkwQwBJMKj6papFLuJAkAkgpTs89HmjJo6yxICSHZJVFisEkJIjkj+OQxi+sw2OKXny5JoUgWNi4SZPiQMPF7lQCkUpEMfhrsT0ODkeHq6UhPCgIzkQhSpzjttdofSVhIfzy8NbX7iWSZx5USCJIR7icBQSKqEyI9GjpIrEhoclVW7Em1I0oQaU32O0ZtwRQNpeUXoopIxG4xHfGw94HvSiUI3L79QbFuJb55pq3Lixyyu4Hqji5CHPwjFSInj58mWXeuISRawoOZILpUSUKFOKJtqgRNDd90C1JIkFC3HjxYdkVl+fpEOo2dlPrmVe4uQixkZv70qVKvmFAPJ91Ibw2xIXW65L4k5SSmkkCy/AnuZR7jfXEYkfC/+XGhfx7Yt6ggB6IviCABqtAUEA2Y5wSOKFhkSWxJUXdWJMCSrXIB3OhBmK6EOXLl20vZ8SdVlq6fbDUz/EagQUAYzV0xNznfNkA0iSIhf9gSYOJFlyIOrzkKLKjao7qrximgBeuXJFIzhUS/OwpFqVKkTZvoXjo1qKhyfJLSU6lB7wQKe6RyZsZgggJTckC7RjkouQmsjtUUJI6Qo3YB6kPDgp5aAakf+EB7QVAshNnZJbEhh94eHOUDTi4HLnTWkmtE1MjpNkjwcUDzhiRekXVV38Ow8zqrc5N+6KkfTD09fFg5xqdK4Xqi9FSAziR0kiJSaU9HFe+DeSHs4vVZC0i+O6E2p2KwSQZJLSMK4Jd8WTFzDXjjcsxLe+du1aTeInF2IpPGcFeaPkbffu3S71+K1zHviNyPZ+rKRfF1xLtGV09z2QUFBiSjJJAsz6lJazXZIhkndKE2UpGdctsRLrWHSOdm+cNz5Dlbk/JIB8Fy8B/M5oL0ebSc4ZLxaUzokS21XAAiuae9AkQRRhA80LE/cquVCyy32U5JYSUlWebgQUAXy658+x3jtBAM1IACnVonqBKhq58FmqkmTJmxMqYL6DkioedjzUSUgp0eH7hZ3T33//rR0WlNDJIRYoBaGNlFUCaFYyRucBkgge2PwnCg9gkhtKRewQQG8SQKo1SYhYfCGAMTlOYc9JPKiuFUV4MnojPSQKVA8yrhpNGMwUqh3pVEAHIdp3sdDujeuXa4LknZIxSqKoduPlgQSA/01poihWCKAVCaBRHEArBNCsBNAohp83CSAve0KqTEJnRgJI6RLbJXmWNQ6UzBsRwEBKAGkmQTMAqmJJmt977z1tj5EJtV0VMNcpiTXJpVwo1eMaI5mmuY27wgss7YP10nvuvdToCCcQ0R5Jsl7SR6cjriVKYuXCNvgNcvyqPP0IKAL49M+hIyNwggC6swGkcbtQKXHToX0RJTlCnUN1AiUsPMxlAki7KkoTRNgCuwMVN10SPUoW9Df1f/75RzvMZdUI30UbOB6SVgmgWds4bsQ8KPX2OsJYm0RHEEDRR9qrUcIhF71Uld6ddevWjRbGQUgRZacYXwhgTI6Tqj6qyfTqL9o4UuLmjQDSuJ0HNkmd7CVKSQYPOiNpBg87erQLdSIxp7SEZJCHNM0a+BvLBx98oB3MVAFThSnbXhoRQNqmUoWmD+khbAD1NnfyfDslAXRnA8g+kHSxuAvhQtUmHVCIJTEVRdgh8hunlFC0QTtCbzaAn3/+uWafSlItHHqomud7eHnTSwDd2QBS9UxVpq82gN72H46Rl0lKImm6QXtEudhVAQtyzXFQ2sxChxeqnblOhWrd3X7ICyClqtxPueZZ2BcRBkaYf5AMco/R28VS/UstAT3sqR6WC9c9LwQk9Ko8/QgoAvj0z6EjI3CCAAovYN7kqZqj6pebIm/C4mbMTZzqVv43D0neJOkNKDZ4fYYN3oLpYUk1Lm/8IoipMFA2k/2CfRE3XBIBEiRK9kThhidUbyQSPHyoyqOnH9VWVgkgiQFJL50rKLlg2yRu3Ez1XsCUOFLFKDyOeVDSMJ4HH6WSggCKeHU0OudBSQkJN2keUu68gGlPxUOKWAsvYPZF7wVsFFDXjAo4JsdJ1TidDngQkjDTY5qkmJI9eix6I4Ccax6APFBlNR3DwJAs02mCc8F1RgkU7QxJRogDyZiIBci1QtsvrlN6DQuDf3GY8j08HOWg3EYEkHPGg5eqeqoQOZ9UawsvYJoQUFpNe1WuBa4L2m7KXsC+SgD5vfJAF17AXCtc+1wrxNcTAeRvlIbyMkH1LS8lwguYqm9+91ybog3hBSxMLPg9kDjSWUp4QnO9knRQHcmLGrEmuedFid+hngDKXsCcNzrk8Lvlt0SPZRZfVMCce3f7D9sm4RfeyNyjaLfnRKEGgBcEjlsEgiZGXO/6QNDEi2uDWIhClT0dY+iFzaDOnA+2wzmhmp2EmoWmL/z2+R7OPU0sqBnhuuKFi++Sg85zH+W64DhF9AQnxqvaCBwCigAGDvtY9WYnCCA3XhI6Hgo02KdUjxuPPmQBVRO0JaEUgRs3CSM3LX2KNXrf0kONGxfJhhwHkIcwba/0zgvuQOUGR8kMDz0eCvrgvmyHxIrvpPqV5IsejtwUrRJAcTjwYKQqkBImYsD2qeKT2+MhwnoiZRPJGg89qim5+cpZUHhg8h9JJCUO3uIAkniQZFDaysOA5JEYGMUB1KfUMkMAY3qcPIyJFSUglJ5ROsyDiPZXZgggyZpQ/wv7PNo7UeJK/LkeuQ5JgkiUSUS4NhnmRS5cE1yTdBjhfLII43uSHtlblb8ZEUASPJIcrjuSPn0cQD7DCwMPZJoJ0D6UY+UFyCkJIC9CdMAgsSDpILnk+uJ3JYqnIM4iDqDw5BVxAEnQjeIAEmeGJyG5IJGgIw2/edmZgGua+wjHSLU6vdWZCYOkQ08ASV7YBueeBJEaCEok5eDFvhBAT/uPwIeYkTDzYqlfJ75s8Lw8yqngKP2jZFbvGS48rOWLM9/LaAz6VHB0VNKngqOklJdUakk4Bs4LLy+UAMuZa9imIOi8GOvb8WWs6tnAIaAIYOCwf2beHNOpqYQjhxV7rmcGbDUQ2wiQpFFqSmmdPhSM7UafwgdjY9afpxBG7ZJL4s4oA/qYe0/jeLz1mWGRGC1BDqnl7Rn1e+xGQBHA2D0/T0XvYpoAUpJAVQ/jWamiELCCAO2jKIFmkFt/pHiz0pdA1VUE0DfkKSkjEaKqlFIxmiB4yszh29tix9OUKNIEg+NleB1Vng0EFAF8NuYxoKOIaQIY0MGqlz/VCFDdyuwhDLQrDOSf6gHZ6LwigDZAkx6hep62dbT/41oSwaB9azV2P82YgFSz02xBlWcHAUUAn525VCNRCCgEFAIKAYWAQkAhYAoBRQBNwaQqKQQUAgoBhYBCQCGgEHh2EFAE8NmZSzUShYBCQCGgEFAIKAQUAqYQUATQFEyqkkJAIaAQUAgoBBQCCoFnBwFFAJ+duVQjUQgoBBQCCgGFgEJAIWAKAUUATcFkXImBUBlbjBkqGOxXFYWAQkAhoBBQCCgEYj8CDJ7NqAAMIP68hoRSBNCHdSryi/rQhHpUIaAQUAgoBBQCCoEAIXDixAmXzDUB6kZAXqsIoA+wX7t2TUurxQXEXKVOlgcPHmg5a5lCTCRGd7L9QLelxhfoGfD9/WoOfccwkC086/NHbJ/1Marx2f+CmAOZsUCZDpJpDJ/HogigD7POBcSFQyLoDwLIhOkNGjR4ZgmgGp8Piy8WPMrDR81hLJgIm1141udPEEC1Rm0ukFjwmD/XqD/P71gAnakuKAJoCibjSv5cQP5c+D4M2bFH1fgcgzJgDak5DBj0jrz4WZ8/RQAdWSYBbcSfa9Sf53dAQbPwckUALYClr+rPBeTPhe/DkB17VI3PMSgD1pCaw4BB78iLn/X5UwTQkWUS0Eb8uUb9eX4HFDQLL1cE0AJYigD6AJbuUX9+2M710n5Lz/r41OFqf23ElifVGo0tM2G/H8/6HPpzfIoAAooA2v/24M8F5M+F78OQHXtUjc8xKAPWkJrDgEHvyIuf9flTlxRHlklAG/HnGvXn+R1Q0Cy8XBFAC2ApCaAPYCkJoHPgxZKW/Lk5x4YhqvHFhlnwrQ9qDn3DL9BP+3P+FAFUEkCf1rc/F5A/F75Pg3boYTU+h4AMYDNqDgMIvgOvftbnT0kAHVgkAW7Cn2vUn+d3gGEz/XolATQNVfSK/lxA/lz4PgzZsUfV+ByDMmANqTkMGPSOvPhZnz9FAB1ZJgFtxJ9r1J/nd0BBs/ByRQAtgKWv6s8F5M+F78OQHXtUjc8xKAPWkJrDgEHvyIuf9flTBNCRZRLQRvy5Rv15fgcUNAsvVwTQAliKAPoAlu5Rf37YzvXSfkvP+vjU4Wp/bcSWJ9UajS0zYb8fz/oc+nN8igA+JTaAq1evxvDhw7Ft2zacOXMGc+bMwRtvvOHxq1m1ahW6dOmC3bt3a8meu3XrhrZt27o8M3LkSK1dtlm4cGH88MMPqFy5sumv0Z8LyJ8L3/QA/VhRjc+P4MZQ02oOYwhoP73mWZ8/dUnx08KJwWb9uUb9eX7HIEQ+veqpkAAuWLAA69atQ8mSJdG4cWOvBPDIkSMoUqQIWrVqhTZt2mjPtm/fHlOmTNGeZ5k2bRqaNWsGksCKFStizJgx+O2337Bnzx5ky5bNFKj+XED+XPimBufnSmp8fgY4BppXcxgDIPvxFc/6/CkC6MfFE0NN+3ON+vP8jiF4fH7NU0EA5VHGiRPHKwHs3r07/v77b+zduzfqUUr/QkNDsWHDBu1vwcHBGqEcNWpUVJ2CBQtqksWhQ4eaAtafC8ifC9/U4PxcSY3PzwDHQPNqDmMAZD++4lmfP0UA/bh4Yqhpf65Rf57fMQSPz695JglglSpVUKJECfz4449RAFFt3KRJE9y+fRuPHz9GkiRJMGPGDDRs2DCqTqdOnbBjxw5QfWxU7t27B/4ThQsoa9asuHjxIlKkSOHzZIgGFu0+h4W7z+L82TPo9kZZFM+WxnLbxy7fxq9rjuDO/UeWn42JBx49fqSp3jNmzIigOEFInyIhOtXIjUTx4zr2es7z/1YexpGLty21mTlVInSskRu37ofj5xX/4cqtB5aeZ2X9+PQNlMqeCk3LZrXcrqcHLt26j/+t+A/X7jy03G7BjMnRslIOw+dmbDsJIA7eKpXZ5XduzkuWLEHt2rURP358y+/09YFdp65j4qbjeBj+WGsqbtw4aFomC17KmspS0/vO3sD4Dcfw4GFEO6JwDpPfPo0+79XyaXxzd5zGmoOXkDNdEnxSLRd4idWXv0PPYNWBi5b6bVS5ct60eOOlTNF+4rcwevURHDp/y2V88jfo88sBxI8XBx+Uy4ZNR64gQ4qEqF8kg61mHz2K+HaPXjL37crjPnHlNsasPoo798O9foe2OmfyITHfF27ex8iVh3HjrvXvkq/KliYxPq2eG0FB0deNu2/QaL7FvhYvbpA2AtYZu+YoDpy76XVEdQunR51CL0bVO3v9LkatOoybd8O9PquvUCJbSrwf7F7LNi/sLJbvu6A9JvbRD6oXQ4Ni0de15ZdLD/D8TpcuHa5du+bo+e1Ln2L62WeSAObLlw/NmzdHr169ovBcv369puo9ffq0tvAzZ86sqYYrVKgQVWfIkCGYMGEC9u/fbzgP/fr1Q//+/aP9NnnyZI1QOlUWnIiDhScjiFDR1I/QsoB1EjfnaBBWnon40J+W0ip/OIqkcT2Efen76VvANzvj2Wri00IPceFuHEw97BwhlTsSB4/xdZlwJLLXPcMxrToTB7OP2u/vVyUfIk1C16YfPAK6bYpoc1hwOOLHoiX1274ghF1x7VCBlI/QrpC172XCgSBsv2Q8sCA89mncjx8Dn2+Ki/DHEYd392IPkSlp9Onruiku7j+KfsBbXbzx4jzGt8Hh0HPMc3eAITscXGweOpYz+WMcuREHSeM9xpAy1gkCmz55Cxhu4duVx/3XsSAsPx07Firne8/VOPjnuP3vknh0KfIQ2ZObXw3u5pv7Wp6UEe1cvAsMDDG3JlLEf4yBpZ/M5aKTcTD/hP0xDSn9EEnd3Bl7bI6LO+Gu30K9LOGon9W5s4HjpzCoadOmigCaX1aBr2lGBUwC2KJFC/Ts2TOqwyR7lSpV0qROjx490gggSWH58uWj6gwePBgTJ07Evn37DAcaUxLAkONX0fefPdh39iYq5U6Dcc1LWwa+z997MHXLSVTOkxaV86az/Ly/HwgPD9eIdv78+TFl6ykcv3wHPzYphgZF7UkMjPq748RVvDV2M1ImjodPquU2NaTf1x3Fuev38PsHJXHk4i0Mmr8fBTMkR8MS1m6f8vjixnXdKIcsiLhgbOxRDWmTJjDVLzOVxqw+gm+XHESxzCnwSrGMZh7R6ny/9CDuPniEhR0rIvcLruzk5r2HKDFouVZvR+8aSJrwyYERaAlgiwnbsPbQJbxSNAPixwvCnJDTKJMjNSZ/XNX7EoAAACAASURBVMb02Fmx3aQQLN13AfUKv4iS2SKkh/cfPtKwZNnSozJSJU1sqU1ROfzRYxT4aknUszPbBKN4lsgTWGoxb5/F2n91rJ4byWzcCm7fD8cPyw5pbezvXzuatGj36et4Y9RGJEsYT5Nus3hao3YGG3riGubtOqutof8u3EKSBHER2qemnaaw7dgVvPPbFqROEh/tquZy24bRuPv/uxd/bjqBirnTolLu1FH7jP47tNUxkw/9suI/XL/7EJzvlfsv4JeVh1EqWyrULfxEimamqdGrD+PyrQf486PSCM4ZXRPk7hvUz7e8r1WJPA/2n72BV/63AUkTxEWnmnkMu3Pp5n2MWXMEyRPFw/Yva0TV+W7JQU2iXDp7KhfJoLcxDV24H7wUre1aBS+mSGRYvVC/JXgQ/hgdquVC0gRB2vw1qVEGZXI5e44pCeBT4gUsrxIzBNBfKmD9avWnDcGMLcfQddYuVMqTFn+2LOftu4r2e8/ZYZiy+Ti61M6HjjXzWn7e3w/Ith3Nxm3FxsOX8fO7JfBqcWtEy1M/tx+/gkYj1yNL6sRY2/3J5uXpmVd+XgOqFse1KIMjF25hwL97tD6xb1aKJ9uVHD3maU1t7V0L6ZLpRG5WXqKr+78VhzB80X68VSoLhr9V3HRLxfsvxrU7D7C0SxXkSe8qZrhx9wGK9osgJ7v619UIhCj+tM8x0/lmv2/CmoMX8X2T4prpQPtJ21E2RxpMb/vkUmemnZYTtmLp3nMY0rAomkaqpqg+LNh3ofZ4SO8aSJ3MHgF8GP4Ieb5cENWNOe0roES21NG6JdbEli9r4YXk1tfElVv3UWJgBNH8b0gDxNWpC8NOXsOrv6xFhhSJsLFXBClzev6mbzmBbrN2ItcLSXH4wi0kjh8XewfWMzMF0epsOXoZb43egJzpkmLFF9XctmE07j5zd2HixmPoWCMPPq2eC/Pnz0eDBg18UuNbHUTFr5fj1NU74Hyv2HcePy0/hA/KZ8eA14tYaqrmdys1Mj2lVTmUz5022rPu5lA/3/K+Vj1/eq2dvWeuo/6Pa7Q9iHuRUTl84SZqfLcKyRPGQ1j/ulFVvlm4D6NW/ocWFXPgq1cLmx5T7l7zwUvRxp41kSGlMQHM02s+HkbWSZskrt/mz5/nt2lAAlzxmVQB0wnkn3/+0Tx6RWnXrp1m3yc7gZQqVUrzAhalUKFCeP3112OFE8jMLcfwxaxd2i12Uis7BHAnpmw+gc9r58OnsZwAfjBuGzYcvoSf3i2B1xwkgJQiNB61HlnTJMaabuYI4Ks/r0XYqWsY17wMDl+8hYH/7tH6xL5ZKWYIoN3D3l0/BAFsUjoLhr1pngC+NGAxrt5+gCWdqyDvi64E8PrdBygWSQDD+tVB8kRP9DZOEwgr+LLu+79twtpDFzHi7eJIFC8u2k3arkkAZ7R9YtZhps2WE7Zg6d7zGNqoKN4tG2GbdPdBOAr0iSCAlHykSW6PAD4If4S8EgGc3b4CSuoIIE1Scvacr73L7qXg6u37eGlABAE8NLg+hJ2XGP/Ok1fx2i/rkDFlImzo6ScCuPUEus3cqZE2Ss8TxQ/CvoH1zUxBtDqbj1xGkzEbkCtdUiz3QACNxt17bhj+3Hhcu/h+Wi2n3wiEp4FV+mY5Tl65A843CeDPyw/hw/LZ0d8iAaz1/SocOn8Tk1sFo0Lu6BIwd9+gfr7lfa16gQgCuOf0dTT4aY124eBeZFQ4j9W/Xald/HgBFOXrBfswetV/+KhiTvR9tZDpORbkbkPPGsiY0vibEiRxU6+aSJNYEUDT4Nqo+FQQwJs3b+LQoQj1Bp07vv/+e1SvXh1p0qTRQrZQ1Xvq1Cn88ccfWh0RBoYhYBgKhqSPXsBGYWBGjx6tqYHHjh2LX3/9VYsbmD17dlNQ+vMGMXPrcXwxM8xnAvhFnXzoUCN2SwA/HL8N6//zHwHMliYJVnerbmpOX/tlLXaedCWAr7+UCT++4xwBzNlznqYG8RcBfLt0VnzzZjFT49W+qQGLceUpJoA/vP2SRjba/ukbAfy6UVG8E2ACuK13LaS1IRW+dvsBig+IkNR6IoCZUibCej8RwBlbT6DrzJ3IkTaJ5rzhCAF8ISmWf+5eAmg0bkEAO9XMiw4BIoCVhy3HicuuBLB5hRzo95p5aRnnsvb3q3DQBwIo5lve1/QEMH3yhNjshgAevXgL1TwQwI8r5USfV8wTwLxfztfUu2YI4OZeNZFaEUDT+7idik8FAVy5cqVG+PTlww8/xPjx4zWHj6NHj4L1RKEnb+fOnaMCQVMqaBQIetiwYZpdIOMGjhgxAlQfmy0xQQAr5E6Dya2sqbTY/x6zdmLqlhPoWjc/PqlubN9hdpz+qCffXJtP2IZ1hy7hx3dewusvuXqa+vLubccuo/GoDcieNglWdTVHAF//ZS1CT17D/zUvramxBs3bq3lV/uAgAczVcx4ePQY2f1kT6ZMbq0HsjPuX5Qfx7eIDeKdMVnzd2DwBLDlwCS7fuo/Fnasgn04CSNUwVcQsO/vVQYpYJAF877eNUesmYby4aPvnNpTOnhoz21mTAH48fguW7TuPbxoXxdtlIiSA9x6GI39vIQGsjjTJ7Tl50ZYwX+8nKuBZ7SqgVHZXFTA9XnP1ipAAbu9TG2ls2IXK83RwcH3Ej/T0FOso9MRVvP6/dcicKjHW9YiQhjstwZ257SS+mBGqfW/HLt1GwnhB2D/IngRw0+FLeHvsRs2ecJknAiitTzHuL+eEYdKm4/isVl58UjUwEsAqw1bg+OXb4HxTAvjLikOwQwDrjFileelObhmMCnnMSwD18y3vazUKRNgh7j59DS//tBYvpkiITb2MJYDHLt1C1eErNTvB3QOeqPOHLtiLMasOo2WlnOhtgQDm+3IB7oc/wvoeNZAplbEEUN4fUydSEkA7Z4HZZ54KAmh2MDFdz58EcNbW4/h8Zhgq5EqDya2tE8DuM3diGm/kzzEB3Hr0Mt4cbY8A/v5h6QgnEH8SwF41kd6NIbSdtfzzsoP4bol9ArjosyrIn8FVBSxLWEK/qoOUiWOPCrjprxs1yTEvDoIAklzx0LVSPhq/Bcs9EMBtvaojbQp7BFAmkuzTrHblUSq7qzE/baKo9nKKAB4YVB8J4rl6wdIh6o0YIoA0uaD0i31gX+yUjYcv4R2LBFCMu9ecMEyONQSwvLa2GJ7JFwI4qWUwKloggPr5FgSQ+1rNghEEcNepa3jlZ3MEkA49e2QCOH8vxqy2TwB5CeFlxKgIDQkvyIoA2vl6zD+jCKB5rKLV9CcBnL3tOLrMCEP5XGkwxQYB7DYzFNO3nnwqCGCLCds1Wy6q8t4o4ZwEUBiSUyW10qwE8H/rwNvzbx9EEMDB8/eiYYnMGPH2S5ZWiifpimzj4s4TztLLIiv/tOwgvl9yAO+WzYqhjcxLAEsNXALGEFz4WWUUyOAaz1K2sQrtWwcpk8QeAvju2I2a7SgJIJ1A2kzcpnnxzm5f0RJ8LcZtxor9FzCscTE0KRMRm1GW3G3tVR3pbBJA2ZaQ7c5sWx6lc7gSQNlRJKRPbaS2IQGUbTX3D6qnEWK5hBy/goYj1/tVAjhr20l8PiNUewcdIBLEDcKBwfYI4Ib/LuHdXzciT/pkWNqlqtv5NBq3cIDrXCsf2lfNERAbwKrDV2hSUM43CeBIGw4THHTdEaux/9wN/PlxMCoZRHNwt8/o55vSX7Gv1YqM5ycIoOwYpAf6+KXbqDJ8RTSHniHz92Ls6sNoVTknvnzZvAqY0nB+W2u7V0eW1MaXKtkhKlWiIL/Nnz/Pb0sbUAArKwLoA/j+XEBzth1H5xlhKJczNaa2sSbR4JC6zggFA/h2q5cf7avFbhXwR39s17w5aczfsEQWH2bE9VFhSO7Nk1B+ilIS3p5/1QjgTQyZvw+NSmTG9w4SQNnLzZ0nnB0Qflx6ECOWkgBm0xwazJbSg5bg4s37WNCpMgpmdCWAspfljr61kSrJk7A1TqsQzfZX1Htn7AbNe5wOOoniBaH1xG0okS0V5lgkgM3HbdZCdQx7sxialI4ggLLzxpae1fFCSnsSQD0BnNG2PMroCKD8Lj3GZjGRvbX3DawXLaC6kUe80/M3e/tJdJkeCtqdnb52F/HjxsHBwQ3MDsGl3vr/LqLpr5uQN30yLPFAAI3G3XN2hAMcIyC0qxIYAlht+ArNDpLzTQJIj1mrDhMEpN4Pq8FA5RM/LovKeV+IhqW7OdTPt7yv1Y4kgMJTWHYM0r/gxOXbqDxsRTR7zsHz9miJBlpXyYVeDQqanuP8vRfg3sNHWNOtOrKm8UwA6RCVMqEigKbBtVFREUAboIlH/EkA524/gc+m70RwztSYZoMA0haHNjnd6xVAO5Mx8HyAwvKj8sYlCCDDeTQq6RwBFHZE3jwJ5c43HLkOjMM4tlkpTQI4dME+NCqZGd83cU4CaMYQ2jKgAH5YegA/LD2ohTJhSBOzpfSgpbh48x7md6yMQplcCSBtA2kjyKKXTjlNIMz2V9R7e8wGbDoSET6IEsBWf2zVsoDM/cSaBPDD/9uMVQcuYPibxfBWJAGUpXKbe1ZD+pQG0ZtNdFgOJ8Pq09uUR1ldPDdZ2qiXspp4hVaF8RqLfLVI+/9GBNDII97p+ZsTchKdp4VqoWaYKSJeUBwcGmKTAB66iKa/bUK+F5NhcWf3EkCjcQv7Z0ZAaBsgAkjPWe4fnG8SQHrMWnWYkAngHx+VRZV85gmgfr7lfa1O4YhYq8JTWHYMckcA9facg/7dg9/WHkGbKrnQ0wIBLNBngRZz1B0BlD3i6RCVQhFAs1uArXqKANqCLeIhfxLAv7afQKfpO1E2R2pMtxjWgn37fHooZm0/iR71C6BtVXNBkH2AwvKj8uHz8cQQrD5wAd+9VRyNSzlHAIUdEeOSefIklDvfaOQ6bD9+FWMiCSDDHTQumQXfNTEfVoXteTpczRhCWwYUwIglB/DjsoN4LzgbBlsggGUGL8WFG/cwr2MlFM7kGqT40s17KDVoqdYdvYOC0wTC6pgZJoRS3l+aUgIYFy3/2IriWVPhL4sE8IP/26ytv2/fKo43I9efbJe3qUc1vJjKHgG8ff8hCvWNIGYs01qXQ3Au13husp2g3s7SLCa37j1E4UgCuHdAPSRO4KoCFg5Rske80/M3N+QUPpu2A/QqPX/jnhaLkDEJ7ZR1hy7ivd82If+LybGos3vHPKNxC/tnRkBoUzkwEsAa367UwkhxvpfvP2/LYYK4MU4f4/VN+KgsqloigBEOcGK+5X2tbiQBNHIM0s/VySu3UembFdHsORke63cSwKq50LO+eQlgwT4LcedBOFZ3rY5saaNLAPUOUckTxFEqYDsfkMlnFAE0CZRRNX8SwL9DTqDjNN8JYM/6BdAmlhPAlhNDNAmMvwigN09CeW4ZN5C3Z5kAkhSQHFgpHglgpB2MJ084K+8SdQUBfL9cNgx6w7wEsOzgpdqB/bQSwP81LampqD6e4BsBlNeffBDFJAHUe1qbXQcy0fREAGWPeKcJ4F87TqHT1B1aYGFKlJ0ggAUyJMfCz9wTQKNxyw5wrStl9xuB8DQ3Nb5bqUURkAmgVXs5tt/gxzXY4wMBFPMt72tWCCBtORnUWu/QIwgghQsUMpgthfouBLO3mCGA1DgkUwTQLLS26ikCaAu2iIdiggDaCWzLvnWZvgOzt59CrwYF0LpK7JYAtvozRLPBkiUwPkxL1KNmDcnld705aj22HruC0e9HqIAZ8d5qZg225+lwFXYwnjzh7IyfDiB0BGlWLjsGvmE+40DwkKVa+rt/P62EIpldJYA8yKkiZtHHqHOaQFgdc5PRG7D56GWMfC+CAH40fquWZu2vDpUsNSVnFBEmCLIqiin7MtiUAMoSKnZqautyKKeTAMp2gvpg22YHIqua9wyoiyQJXHO8Co942SHK6fl7QgATaDalTEZyeOjLZofgUm/twYt4//dN8EYAjcYtO8AFigCKDB6cb4aBocesVXs5AvLyT2vAtG7jW5RBtcgMHjJQ7uZQP9/yvlavSIQKWHgKe8qUdPrqHVQgAdQ59Az4Zw/+b90RzbyIZkZmS+G+C3HrfjhWda2G7GmjS9VlyTvtYZPGVxJAs9jaqacIoB3UIp+JCQLIXIsz21mzadII4LQdmB3ydBFA2QbLh2mJelQYknvzJDQmgCU1Fc6whdZTq5klgJ484eyM//vF+7WUU04SQKqGqSJm0WepcJpAWB3zW6PXY8vRKy4EsFiWlPjbaQLYvSoypE5mtXtafdlGjf9tlNLLaQK4u39dl5zNfK+RR7zT8ycIIPNb06s8ThzgiE0CuObgBTT7fbMlAijGLRzgGAIr0ASQ871i/3nNY9YXAsjUlCKFmxkCqJ/vJwSwJOoVicgTLjyFzRBAvUNP/392Y9y6o7YJ4MovqiFHuugEULa9VQTQ1pZj6SFFAC3B5VrZnwTwnx0n8enUUC3Zth0C2HnaDswJOYUvGxREqyruk6n7MHyfHpUPn9Z/hkSE4ZC8MH1qPPLh9ZGG5N48CeV3CVIx6r0IAsjculZTq3kjgN4Moe2O/bvF+7WUU1ZzjpYbskwz2v+nQyUUzeIqATx/4y7KDl6mdUmfucRpAmF13OJQ41zRCaTF+C0omjkl/vnUmgRQTikne6GLcBQbuldFRpsEUPZS5fiMUnrJUix9vmWzmMgk0qgNI494p+fv79DT6DglBKmTxNcyy7Ac/dqeBJA2mbTNpFc6vdPdFaNxCwc4RkBoVTEwKmA5hRslgPSYteowwTFH5fBtXgYig4cZAqifb3lfq180ggAKT2FPqTLPXLuD8kOXR3Po6ff3boxffxTtq+VGNwsSQDoq8VLE/M6MzqAvskc8HaIYdcpfuZz9eX6b/W4DXU8RQB9mwJ8L6N8dJ9FhaihKZUuFWRbDWnBIn00Nwdwdp9H75YJoWTl2E8A2k3ZonnJyHDYfpiXqUWFI7s2TUH6XrFakCpgE0GpqNW8EUBhCewqFYGf83y7ar2UcsJpztPzQZThz7S7+7lARxbKkcnn1+et3UXZIBAHUZy5xmkBYHbOwaxr9fkkkJAEctwVFMqfAv5+6JwxG7xAZRfRxKAUBXN+tKjKlsScBlOPUaQTQIKODbMdmJL0zg4s3KaKRR7zT8/dP6Gl8OiVECxbOzCS+EEDaBNM7u1DGFJhvkgAK9blwgKNqsmXFbH4jEJ7mJSqFW8tgbW/TPGYtOkywfZHDl5mJRAYPMwRQP9/yvtYgkgAKT2FPqTLPXruLckOXRbPnFATwk+q50bWueRVw0a8W4ca9h1j+eVXkeiH6N+XiEf9VHSSJpwigme/fbh1FAO0i52cbwHmhJ/HJlFBbgW05pE5TQ/DXU0IA207aES0Vlw/TEvWosCPy5knoQgAjPUvpWMA4gHZSq3kjgN4Moe2OffiifbYyDlQYukyL20bvWXrRyuXc9bsIFgRQl7nEaQJhddzCs5H2mrQBbD5uCwpnSoF5Ha0RQDmjiJyKUGQkWNetKjLbJIByijaOzyijg2wnaGS/ZwYX2ZPYyJHEyCPe6fn7d+dpdJgcguSJ4uHG3Ydat48MbYA41AVbLCv3nzc1n0bjFvbPdE74uEJgCKBI4cb5JgGkx6xVhwlCJnL4yhk8zBBA/XwLj3nuay8Xi5AAmkmVKb5/vT3nV3/twoQNx9Cheh58UTe/6dkt2m+RtjaWfV4VuQ0IoH4+E8dVBNA0uDYqKgJoAzTxiD8lgPNDT6H9lB0okTUl5nxiTaXF/lEVQ5UME3Uz/lRsK/Lh027yDizdex5fNyqKd8pG5GJ1opi1I5LfJWLLMbTIkQu3tNRqVjNreCOA3gyh7Y592MJ9WsYBqymn6OVHbz/Gz2McPbkICQD/tqlXTciZS5wmEFbHLWKb0WObKmAzEiOjd8gZRWQCKHKSru1aBVnSuqbIM9tXOZUenzHK6CDbCRp58Jp5l15yIqfs4/PCIUr2iHd6/ubtPINPJm9HsoTxNDUfy+EhDRBE9mCx0G7OjETXaNzC/pkRED4KEAGUM3iQANpxmCBkIoUbMxOJDB4ylO7mUD/f8r72SrFMWhNGjkH6aRIaAL09Z9+/duGPDcfwaY08+LyOeQJYrN8iXL/7UMvuQttsfdFLshMpAmjxy7FWXRFAa3i51PYnAVyw8xRIjHwlgH1fKYSPYj0BDMXSvediBQEU2SVcCaC1zBreCKCwg3HnCWd3SQoC2KJiDnz1amHTzTztBJBBu0kAaTPmTWXoiQAyo8hrxSMORxaRsi8mCaBREGczE+liO6XL2SwTQNkhymkCOD/sDNpP2g7mjWWoDycIoDebTqNxyw5wLcoHRgIoMniQ8AsCaNVeTiOABincrBBAMd/yvqYngJ4yJQkbYHcEsGONPOhigQAW779YMw8wQwBpy5ow6LHfVPj+PL/NfLOxoY4igD7Mgj8XkCCAL2VNibk2JIC0xaFNzlevFkKLirFbAth+SiiW7DmnpS9jGjOnillDcvl9QhrE7BK0AWRoFauZNbwRQGEH484Tzu74GbLGTsqpSt8sx8krdzCnfQWUyJba5fXCCJx/3NizJuTUdU4TCKvjltNbUQVMr1FvTgNG7xCHI+f8VYkAipR9a7pWQVabEkA5lzLfbZTSy1saNzO4yN6TRtlEjFKrOT1/C8LOoN2k7VreWAb7ZWEgaMYDtFroOEGnHm9e3Ubjlh3gmpfP6jcC4WlMcgo3EkB6zFq1l2P7RinczBBA/XzL+5pY48JT2FOmJDkKgOzQ02fuLkzceAwda+bVUu6ZLS8NWIyrt0kAqyBP+uhSdVkCSHvYBIoAmoXWVj1FAG3BFvGQPwngwp2n0HbyDltxzdi3DpO349+dZ54qAsj0ZSRbThVhSG6FFIiNktIgqoCZW9dfBNCdJ5zd8TNrCVNOWc05Kgjg7PYVUFJHAEUcMPZpQ88ayJgycVT3nCYQVsctpCPM2ywIoLe4cUbvkFPKGRHA1V9UQbZ09lTAci5lvtsopZfsKGJXAqgPnyHnbOZ7jTzinZ4/QQA5F0z3xXJocH3EixtkdWqxfN85La6jFQIo8igLBzhGQAg0AeR8kwDSY9YXAkgpt0jhZooA6iIgyPuakHILT2E7BLD33DD8ufG4bQK4pHMV5H0x+jcle8QrAmj5s7H8gCKAliF78oBfCWDYKdA5oliWFPi7gzWjdvaQtji0yen3aiE0j+USQDq7LN5zDoMbFsF7wdl9mBHXR4UhuRW1oOwQQAkgc+taTa3GXng6XIUhtDtPOLsADF2wV0s5ZTXnaOVhy3Hi8h3MalcBpbK7SgBFJgCNRPSogUypYhEB/GUtQk9eA+2jqAI2EzjYCFs5pZxQj7GeyNnsCwGUcymzTaOUXrKjyP5B9ZAwnmsaNzPrQQ6gq8/ZzOeNPOKdJoALd51B2z+3a1kjaJvHcnBwfcS3QQCX7T0XkdnFS2Bvo3HLDnAflguMBFBO4UZpJgmgVYcJ4ifbuYoMHmYIoH6+jRydojyFPaTKlAPByw49X84Jw6RNx9GpZl50tiABLDFgsRYiaHHnKshnQABlj3g6RMWPo1TAZr5/u3UUAbSLnJ8lgIt2nUabP0NQLHMK/G0xrIVGACdtx7ywM+j/WmF8WCGHD6P0z6Py4cNwN4t2n8OgN4rg/XLOEUBhSG7FM1SEBPnxnZe0VE7MrWs1tZo3AigMod15wtlFfOj8vVrGgZaVcqL3K4VMN1Nl2Aocv3wbs9qVR6nsaVyeE7lANRLRowYyxyICKHtIkgCayR1rSAAjM4rIHpIyAVz1eWVkfyGFaTzlinIuZf7dKKOD7ChyYFB9jUBZLfocqmmSJnBpwsgj3nkCeBZt/9wGBg1+EP5Ye7/d8Szdc85UbmejcQsHOIbAChQBFCncON8kgPSYteowQfxkT3eRwcMMAdTPt7yvCUcn4SnsKVWmvH5lh55ec8IwedNxfFYrLz6rZV4FXHLgEvBStOizKsifIboEUJ/bOV6cR35T4ftTgGP1+w1UfUUAfUDenwto8a7TYIDkoplT4B8bBLD9pG2YH3YWA14vjA/Kx24C+OnUnVi4+6yWvoxZLJwqwo7ISmw4ERSYMeEYCNpOajVvBNCbIbTd8Q+Zv1fLOGA152jV4Stw7NJtzGxbHqVzuBLAE5dvo/KwFVqX9JlLnCYQVsctx0hLFC8umv62CVZiPor3yRlFRIw0/pYvMmfzys8rI4dNAihLUNimUUYH2U7QrsRMTl2nT9nH9xp5xDs9f4t2n0Wbids0mz9K5ljsSjRpE9zqj62aVzq9090Vo3EL+2dGQPggOIvfCISn9SpSuHG+uQ/RY9aqwwTbl2NdigweZgigfr7lfe2NEpm1JsykypQl2LI9Z8/ZYZiy+Tg618qHTrXymv50Sw1comWJWfhZZRTIEP1SJXvE0xwiLhQBNA2ujYqKANoATTziTwK4ZPdptJoYgiKZUuBfi3HN2L92f27Dgl1nMfD1wmgWywlgx2k7/dJXYUfkzZNQXgIiL+yIt4trNoBMrWY1s4Y3AujNENrukhw8b4+WccBqyqlqw1fg6KXbmNG2PMp4IID6wNVOEwir45azJCSMH4Smv26Clawv4n1yRhGRJYG/iZzNK7pURs709iSAshG9RgANMjrIdoJ2bebYtghcrU/Zx9+EQ5RsI+n0/C3efRatJ27TUsA9juB/sGvTKNoqkS0V5ngJhK8ft7B/ZgSEZgEigPLapA2gHYcJ4udubYq1624O9fMt72si242RY5D+G3S3NnvO3okpm09oDiB0BDFbSg9aouWJZnYX2mbri94hShFAs8jaq6cIoD3ctKf8SQCX7j6NlhNDUDhTcszrWMVyL9tO3OYXqZrljrh5QN64Ok3f6RdppVlDciMC+H2T4poXMFOrWc2s4Y0ACjsYd4bQdjEWBNBqZDPNfQAAIABJREFUyqnq367Uxvq0EUBZykIJ4Lu/btRiizHEhJVilCeVz4uUfb4QQDmVnhkCaNdrViaA+pR9/M3IIcppAiikdjL2dgmgkCaWzJYKs00SQDFu2QHu/bKBkQAK6TQJ/7J95zSHCav2csTRnXTaGwHUz7cggNzXGpXMoj0uHIM8Sc1l6bR8OREE8PPa+fCpJQK4FJSKuyOAskMUpcdBj5UE0MpeZrWuIoBWEZPqPw0E0Gm7Oh/gcnlUPnw+mx6m2Ss6ra42a0gud4yx5Hh7lgmg1cDK3gigsINxmgAO+nePrZRTNb5dqam7p7cpj7I5XVXAxy/dRpXhESrg2CYBFASQdla0AXxnrD0C+ETNVgqynVXBPgtw58EjLO9SCbnSu+ZINvsd6AmgUUovWc1mN3Ay+yMyl3gigLJDlNMEUNjtOUkA6ZRE5yRPRT9u2QHuvQARQGGfyvmmBJAE0Kq9HMdslMJNxsLdHOpT6cn7mp4AesqUJNunyuYJPWbtxNQtJ/BFnXzoUMO8BLDM4KWgVHx+x8oolCm6BFAmgLQfjfM43G8qfH+e32b3h0DXUwTQhxnw5wJatucMPv5jOwplTI75naxLANtM3OoXxwof4PJKAJ12WIkyJPfiSWhEAL97K0ICyNy6/iKA7jzh7GI88N89WsopqzlHBQGc1rocgnOldXn9sUu3UHX4Su1vq7tWR7a0SaJ+d5pAWB23bGgvCKAng3Z37bsztBcEcFnnSsj9ok0CKOVS5vuNUnq5M7S3iocgQvqczWzHyCPe6fkzIoB2M5ss3BXhUGKFAIpxCwc4RkAINAHkfJMA0mPWFwKod1ASa8PdHOrnWxBA7muNS0VIAIWnsFkCKDv0dJ+5E9O22ieA8zpWQuFM0b8p2SNeEUCrO4D1+ooAWscs6gl/EsDle87goz+2o2CG5FjwmXUC2PqPrX4JreIDXO4J4Iwwv4SsESop5rdlnlszhenEeHv+ViOAN23l1uV7PB2uwhDanSecmX4a1Rnwzx4t5ZTVnKM1vlupeTxPbV0O5XQE8OjFW6j2bQQB1GcucZpAWB23HGojUbwgvD12I3J5CGnhrn13oTZEzualnSshj00CKOdS5vuNUnq5C7VhFQ+Rum6zLmcz2zHyiHd6/oTEXe633dzGIqRM6eypMdOLBFA/buEAxwtl0zKZ/SZB8jQ/cgq35fvPax6zVh0m2L67EEXeCKB+vuV97c1IAig8hT3FznQXoqjbzFBM33oSXevmxyfV85heqmUHL8X5G/fw76eVUCSzAQG8/QDFByzW2qPEEY+UBNA0uDYqKgJoAzTxiF8J4N4z+GjCdtgJbMv+0YOOBMjp4Mo+wOWWAHaeEeaXoNXCkNybJ6HcsebjNmPl/gsY/mYxTQLI3LpWU6t5I4DCENqdJ5xdjPv/s1vLONCuWm50r1fAdDM1v1uJ/y7cwpRW5VA+t6sEkBjQRpBFn7nEaQJhusORFUW2BQbbpQSQh6WnoLbu2hfZFvTBdkXO5qWfVUKeDPYkgHIuZb6fQatrF3rRpSvusi1YxUOkrtPnbNYIYGRmDdkj3un5Eza3cr8ZzDdpwnhWhwIRVLpMjtSY0dazClg/buEAR5OSd0sHiABGpnDjfFMCSI9Zqw4TBM1dkHKvBFA33/K+9lbprNrjZnKluwtS3nVGKGZss04Ag4csxbnr7gmg3ubwsSKAlr8dKw8oAmgFLV1dfxLAFXvPosWEbSjwYjIs7GzNqJ3dbDlhq5Zf1+n0aj7A5ZYAdpm5S0tb53TeYmFIbsaTUHSuxbjNWLH/AoZFEkA7qdW8E0DPhtB2Me73924t4KzVnKO1vl+FQ+dvYnKrYFTInc7l9Ycv3ESN71Zpf9NnLnGaQFgdt5xuiwTwrdEb4Cmvqbv25YwiMjkr/NVC3LoXjiWfVUTeDKmsdk+rL6fS438bZXSQ7QTldFtWXyhS1+lT9rEdI494p+dPkEy538znmswGARR5hcvmSIPpbct7hEI/7igHuNcL450AEUD5UkFpHD1mrTpMcNAiTaE+T7U3Aqifb3lfaxJJAM2kynSXpvCLGaGYue0kutXLj/bVzEsAyw1ZhrPX7+KfDpVQNEv0S5XsdUyHqEfhD/0mwfXn+W312w1UfUUAfUDenwto5b6zaD5+G/K/mAyLbBHALVi69zy+blQU7ziYX9cHuNwSwM9n7sLfoafBuF3MYuFUEXZEZjwJxTs/Gr9Fu7EPa1xMc4xgajWrmTW8EUBvhtB2xy8IoNWUU7W/X4WDJIAtg1EhjysB/O/CTdSMJID6zCVOEwir4647YjX2n7uBPz8O1lLBvTl6A3KkTYKVXatbakpW19WSpHNFvloExiVb3Kki8mW0RwDlVHrs1JhmpaDP6HA+0k6Q4VOODH3ZUt/lyiJziT5lH+sI9aycWs3p+RNqR7lPYf3qIHmi+JbHxCxGdOagUxKdkzwV/biF/TPjir5TKpPfCISnPslmBSTGdhwm2L5I4cbA9CKAs/xed3Oon295X2tSJkICqHcUMRqPHJdPtuf8fHooZm0/qWkaqHEwW8oPXYYz1+7i7w4VUSxL9G9K7xAVrgigWWht1VME0BZsEQ/5kwCu2ncWH47fhnzpk2GxxbAW7NvH47dg2b7z+KZxUbxdxrn8uj7A5ZYAfjFrF/7acRqM3N+yci6nXgErhuTipTJuJIBMrWY1s4Y3AijsYNwZQtsFQBBAqymn6oxYhQPnnj4CKPo9qWUEAWw8agOyp02CVTYJoN5BQ6Ts84UAyqn0vBHAoDjAYR8IYL4vF+B++KNoKfv4XiOHKKcJoHA8kNfvzn51kMIGAfx352l0mByC4JxpMM0LAdSPW3aAeztABFA4FpHwL997XnOYsGovRxyNUriZIYD6+TY6D8R8ecqUpM/MkThBRJpCQQB71C+g2RybLRWGLsNpDwRQdohi6rmHD5UE0Cy2duopAmgHtchnngYCSEmWuPH5MFTHH5UPn66zdmGuXwhgRG5SM4bkYoAtJ0RITkmcBQG0mlnDGwEUdjBOE8Cv/tplK+WUkKSRSFXUSQCpGqaKmEWfus5pAmF1kcnENWH8uFrWBDsEUA7ZUaPAE/s8kbJvUceKyJ/JngRQTwBHv+8aaoZjFo4izKBBtZfdIjKX6HM2uxBAySHK6fkTEiUnCWC5XGkwtbVnCaB+3LIDXJOSgZEAyqGFKAG0SwCNUrhZIoCR8y3va0IgIAigp0xJ+ty8SRJE2HN2mb4Ds7efQs/6BdDGAgGs+PVy8JugUx6d8/RFJoA0h3B6jcrv8+f5bfcbjunnFAH0AXF/LqDV+8/ig3HbkDd9UizpUs1yL41E/pYb8eMDMUEAhSG5HQJI1TkdIJhb118E0J0nnF3Y+/61S0s5ZTXnqKxKrZTXVQV86PwN1Pp+tdYlBlhmoGVR/Lk5m8FAVl0LApgtTRKs7mZNBSynlDMigAs7VkQBmwRQzqXMMY1+vyT0Kb2Eo4hTBFCfs5nvNfKId3r+jAhg6Fd1kDKxdRUwbYKZ0s0KARTjFg5wgxsWQeAJYEnNpMSOxyznTRBApqYUKdzMEED9fAsCKJsECZW9WQIoO/R0mbYDs0PsE0Cm96Nznr7IHvGKAJrZBX2rowigD/j5kwCu2X8OzcZtRZ4XkmLp59YJoJHRrw9DdfxR+fDpNns35oScwpcNCqJVFedUwMKQ3IwnoRig7DxDAsjculZTq7EtT4erMIR2mgD2mbsrIuVUjTzoUie/6TmTnSkq533B5bmD526g9ghBAKsgT/onCdydJhCmOxxZUXZeoRNIo5HrkTVNYqzpVsNSU3LaruoF0kc9W7z/Ily78xALPq2AgplTW2pTVJZzKfNvo94rCTndHP8mHEXiBcXBIR8kgCJ1nT5nM99h5BHv9PwJpwIZqNC+dZAyiXUCSJvgjlNCUD5XWkxpXc4j9vpxi2+YERDeKpkxIDaAcgo3EkB6zFp1mOCgRQ5fpqYUKdzMEED9fBs5BQqnHU+pMu/cD0fBvgu1V8oOPZ2n7dD27F4NCqB1FfMqYCEBnNO+Akpki/5N6T3inV6jMnb+PL9tbRYBeEgRQB9A9+cCWnvgHN7/v62wE9iWQzJy+/dhqI4/Kn/Y3Wfv1m6TVjcTb52KMiQ34Uko2pLD5zAOIHPrWk2t5o0ACkNod55w3sbl7vfec8O0jAPMzcmQE2aLHE6lSj5XAnjg3A3UiSSA+swl/tyczfRdDl9DG8CGI9cjS+rEWNvdGgGUU8pVz/+EAL7UfzGu3nmA+Z9WQCGHCODI90qiQdGMLsMTjiLx48bBwcH2VcAidZ0+YwtfZuQR7/T8ibAi8uB29K2NVEkSmJlOlzp/7TiFTlN3oELutJjcyjMB1I9bSLsYAeHNEoEhgHIKNxJAesxadZggIEYp3MwQQP18G4UFM5Mq8+6DcBToE0EAZYeez6aGaGY7Vi/tlb5ZjpNX7mB2+wooaUAAhUe8cIhyeo0qAuj6KSoCaHlrevJATBBAO3HN2EOjwJ8+DNXxR10I4JzdtuxJvHVKGJKb8SQUbcn2Q0cu3LKVWs0bAfRmCO1tXO5+/3JOmJZxwGrOUTmgclUdAdx/9gbq/hAhAdRnLvHn5mwGAzmANSWADL2ROVViUBVopcgZRapJBFDkbJ7foQIKZbEnAZRT6bFPRhkdhJ1ggrhBOMDgtzZLwT4LcedBeLSUfWzOyCPe6fkTgYXl7of0qY3USe0TwIp50mJSS88EUD9u4fBAdWfjABFAkcKN800CSI9Zqw4TMgGUM3iYIYD6+TZKDGAmVaZMAGWHnk5TQ2w57lUethwnLt/R0vsxy4u+CI944RDl9BpVBPApJYAjR47E8OHDcebMGRQuXBg//PADKleubLhVVqtWDatWRRiuy6VBgwaYN2+e9qfmzZtjwoQJLr8HBwdj48aNprdffxLAdQfP4b3ftyJXuiRY/oU1myYOwCj1j+mBxUBF+cPuMWeP7Q3SU1eFHZEZT0LRjuxBSBUwU6tZzazBtjxtXN4Moe3C32tOmJZxwGrKKXcEiP3Yd/Y66v2wRuuSPnOJPzdnMxjIKexIABnPzw4BdEeABQGc16E8CmdxzZFspn+sI6fS43//0rQEXimWyeVxYSeYIF4QmP7KbhGZS/Qp+9ieyKwhp1Zzev5EajG5/9v71EYaGwRwbsgpfDZtByrlSYc/WwZ7hEQ/bmH/TEeuRi8FRgIoZ/AgAbTjMCHv48xMJDJ4yGC4m0P9fBulBo3yFPaQKenew3Dk7x0hAZTtOamep5reauSGKsNW4Pjl25jVrjxKZY/+TekdopxeozJ2/jy/7X7DMf3cUyEBnDZtGpo1awaSwIoVK2LMmDH47bffsGfPHmTLFj3EyeXLl3H//v0oLC9duoTixYtrz5D4CQJ47tw5jBs3LqpeggQJkCaN+Y3enwto/cHzaPr7FuRMmwQrLIa14IC8qQ5ieqHp3yd/2D3n7rGtIjFDAM0Ykot2ooLIvlEElAAytZrVzBpmCaA7Q2i7cyMIoNWUU0IFOr5FGcgSsNhOAJmhhCSdceKoAn7tl3XIlDIR1vesaQlCQQCZUURWgZccuBiXbz2ALwRQTqXnjQAmjBeE/T4QQJG5RJ+yj+81cohy+nBdf+gimv62yQX7bb1rIW2yhJbmg5XnhJxE52mhqJw3HSZ+7JkA6sctO8A1fClDQGwARQYPEn6GgbFr4iI0OcxMJDJ4mCGA+vmW97Vm5bJrTQhHEU+Zku4/fAR6WbsjgFZjt1YdvgLHLrkngMIhStjDOr1GFQF0/RSfCgJIyVzJkiUxatSoqN4XLFgQb7zxBoYOHep1c6G0sG/fvpr0MGnSpFEE8OrVq5g7d67X591VeBoIoDvjYduDduhB+cPuNXePZiRtx0bGU3esGJKLdkQaKQaRFQTQamYNbwRQ2ME4TQB7zg6zlXIqygmiRRnINnAcx94z10GCxKJPXefPzdnMMhMEcEbb8kgULy5e/WWtLQLozglG5Gz+95PyKJLV/MVQ7rueAP78bgm8WtxVAigcRUhi9w20LwEUgas9EUDZIcrp+Vv/30U0/TXmCaB+3LIDXMPigSGAIoMH55vOFiSAVu3luI682XK7m0N9Kj15X9MTQE+Zkh6EP0LeLyMJoOTQQw9tO9mbqg1fgaOXbmNm2/IonSP6NyUIoLCHdXqNKgL4lBFASvKSJEmCGTNmoGHDhlG979SpE3bs2GGo6tUfHkWLFkX58uUxduzYqJ8oCST5o9QvVapUqFq1KgYPHoz06Z8YgevbuXfvHvhPFBLArFmz4uLFi0iRIoWZM8t0nY3/XUCz8SHIniYxlnY2VnV7aoxZRNb9dwnfvlkUrxd3NTo33Qk/VuSHvWTJEtSuXRt9/t2PWdtP44vaedGminOZQP7ZeQZdZoShfK40+KNFaVOj6TBlBxbtOY9+rxTAkUu3MWHDcbSrkhNdauc19byoJI8vfnxXL8jq363Gyat3MaN1WcNQCJZeJFXu/dduTNt6Cp/VzINPqpn3pm44aiN2nb6OX5uVQDWdDeDeMzfw2sgN2lv++aS8lpvazBjtjsHKc7VGrMWxy7cxtWUZJIwXFw1Hb0SGFAmxpqu11Imv/LIe+8/dxPjmpVBRyoVc7uuVuHTrPua0KYMiNm0Aj166hdo/rIsa1oi3iuKVYq7f44krt1Hj+7VIHD8IO/vWsgKBS90Sg5ZrmUuYu5jxEOWyYNdZdJy2E6Wzp8KUlmW1nzytUTud2Hj4sha5QC4bu1e1JQGkgwHjg1bKkxbjPizlsTv6cbf8YztWHbyIrxsWxmtF00ftM/rv0M4YzT7T7P+2YOORK+B8rzxwEX+FnkGPevnwccUcZpvQ6rWcuB2rDlzE0IaF8WbJzNGedTeH+vmW97X3giO0Zox32m7yDryUNSVmtDaWsj4Mf4SC/ZZq9bf0rI5UkR7dn03biXm7zqJ3g/z4sHyERNFMqf3DWo0ATmlZRovPqi/MElLl29UgAdzTr7bja1R+H8/vdOnS4dq1a46f32awiA11Yr0E8PTp08icOTPWrVuHChWeJAUfMmSIZsO3f/9+jzhu3rwZlCBu2rQJZctGbHwsVCsnS5YM2bNnx5EjR9CnTx8t6vi2bduQMKGxyqJfv37o379/tPdNnjxZI6lOlsPXgR93x0O6RI/Rp0S45ab/tycIB64FoVmecJR+4bHl52PygcmHgrDpQhBeyRaO2pmd6+vWC3Ew8VBc5E3xCB0KPzI1pHH7g7DjchDezBmO83fiYPXZINTO/AivZDP3vJmXDNgeF5fuxUHnIg+R4wmfMvOoxzpT/wvChvNBaJA1HHWzmMfx251xceJWHLQuEI7CqV2fO3kLGL4zIvhrt2IPkTlCgB4rysDtcXHxXhx0KvwQ8YOAb8PiIWWCxxhQytr38vWOuDhzJw7aFwxH/lRPxt97a1zceBDHp3GfvwMM3hGBH8sHecNRKp0rxhfvAgND4iFB0GMMD7bWd3kium+Oi7vhcfDlSw+RPrHrFIVcioPxB+Iid/LH6FjE/js8TfzBa3Hwy56ITBGiDCz1ECms+4Bg84U4mHQoLgqkfIR2hTx/e/pxj94bhL1Xg9A0dziC05v/Dpxc1L/sDsLB60HafO++EgfbLgbhjezhqJ7JWn/G7A3CnqtBeDd3OMpZGIt+vuV9rXKGiD7svBwHv++PixzJHqNzUeM1Ef4Y6LIxYv0OKf0QSSPvsuMPBCHkUhAa5QhH1YzmxzQoJC4u3I2DjoUfIreBzOTKPaDf9niIG+cxvi/nn3Uq5vn27dto2rSpIoBOLnyn2xIEcP369ZoUTxRK6yZOnIh9+/Z5fGWbNm3AZ8PCwjzWo3qYZHDq1Klo1KiRYd2YlABuPnwR743bjqypE2N5F+sSwA/HbcX6w5fx3ZtF8VoslwB+Ne8AZmw7hS618qBdVfOSK29rjbfuL2aGoUKuNJhgUgLYcWooFuw+h74vR0gAJ248jnZVc6JLLeckgDW+X4MTV+5gequyoPrFqdJr7m4Nx84186C9BQlgo9EbEXbqOsa8XwI18ruGgdl9+jreGBXhGPVX+3IolPHJru20BMkqDgLHaa3KgvZz7OeLyRNibTdrEsAGP6/DwfO3MKF5KS3siCjlv1mJizfvY1br0ihmUwV8+MIt1P3piQTQ6HukFJPSzCQJ4iK0jzX7RRmzkoOX48bdiNzFOdO5MvX5YWfRafpOUAU8+eMy2mNOz9+mI5e10FVyWd+tKl5Ibt0GkCpThoeqkjctfv/AswRQP+6PJmzDmkOX8E2jwni1SGAkgB+M24oNkfvvygMX8M/Os+hVPz9aVDAvLSOOrSZu1ySIQ94ohLdKZYn2ibibQ/18y/tas3IREsDFe87hkymhYK50fkNGJfzRYxT4aon206Ye1aIcekR7fV4ugA8i2zPz/db5Ya22r076uDTKGqiAGRKp6ndrQIeo3V/VcnyNyn1UEkAg1ksAfVEBk+FnzJgRAwYMAFXG3krevHnRsmVLdO/e3VtV7Xd/2gBu/u8Cmvy6WSOAayzGNWPfvOWQNDVAP1aSbTv6/L3XdrJ0T10UhuRmPAlFO0xAz/iB/V4tpDkYTLCRWUMcrvPnzwc9z/WqJ2+G0HZh7zYz1FbGgdd/WYvQk9fw2welUavQk1Ro7MeuU9fwys9rtS7pA1f70z7HDAZySAnaz73801qkT54Qm7+0pkaVM4pUkFLhiZzNc9uVw0vZnxBDM30TdeRUevybUUYHYSeYNEFc7B5Qz0rzLnVF6jp9yj5WMvKId3r+Nh2+hLfHukZR2NyrJtKnSGR5TDOYO3fmTlTL/wLGtzAmJ6JR/biFAxxDp7xW7MWAOIHIGTzoBUx7ZKsOExyfHNLmnbLRHR7dzaF+vuV9rXnFCDMb4SnsKVPSo0ePkavXfK2+7NDTftI2kGT2f60wPqxgXq0th24qlyv6NyU84oVDlNNrVE8AU6ZMqSSAlr/OGH6AKtxSpUppXsCiFCpUCK+//rpHJ5Dx48ejbdu2OHXqFNKm9byB01OYqmbaCX7wwQemRuhXAnj4ApqM3WwrsC07/+7Yjdhw+BJ+ercEXtMZnZsanJ8ryR9233/2YsrmE/i8dj58WtOapM1TN2dvP4ku0815Eop2Okzejn93nsFXkQSQqdWsZtbwRgC9GULbhb7rjFDNmcZq0nmGTwk9cRW/flAatXUEMOzkNc25IjYSQDmoLJ1AGvy0RpM2bbFIAOWMIhVyP0mFFzx4Kc7duAffCOCTVHrE0MgpixcNOrQkSxhPy7ZgtxTvvxjX7jyIlrKP7QmHKNkj3unDdfORy2D4E7ls6lUTL9oggNO3nkC3mTtRPf8LGOeFAOrHLUdAeLVoYAignMFj+b4LthwmiKMc1PpdCwRQP9/yvtYikgDqHUWM1t3jx4+Rs2cEAdzauxbSRXp0C6eSAa8XxgflzRNAOXh7eUnaLt6td4hyeo0qAug6y7FeAsjuijAwo0ePjnLm+PXXX7F7925NbUvCRvKm9whmnED+nWpdudy8eRO052vcuLEmITx69Ch69eqF48ePY+/evUie3Jxhlj8J4JbDF/AWCWCqRFjbw7paSPZC03sd2j1gnHzOlQDus+W96q0/dgig7N3Gg1lLrWYxs4Y3Aih7r5YxUIN4G5e73wUBtJpyigGUdzyFBFBOK8U4gPRW5gHFg8pKEQRwSqtykA+l4CFLce66bwRQTqXnjQAmTxgPYT4QwJcGLMbV2ySArin7+F6RWUNOreb04brl6GW8NdqVAG7sWRMZUlqXAE7fcgLdZu1EjQLp8X/NI1TW7op+3IIAkmy/UiQwBFDuw7K956MulYJ8mV2fclq7ppHOG/Kz7uZQP99GXrsiVSZVsdPbPjGv0vctR4+I2LlGBHDg64XRzAIBdPet6Qlg4vhxsXdgPY/xVM1i6K6eP89vX/sWU88/FQSQYFD6N2zYMC2US5EiRTBixAhUqVJFw4mBn3PkyAFK/EQ5cOAA8ufPj8WLF2uepnK5c+eOFkImJCQEDAVDEli9enUMHDhQ8+o1W/y5gJwigEaBZ82Oz5/15I3rq3/3aQGMmb6MZMupMmvbSXw+I1SL7cYYb2aKCHDa95UIFTAJoNXMGnyPp8NVBDBm+BInCeAXM0JtxVNsOHIdQo5fxdhmpVCncAYXmHaevKrF12PRp65zmkCYmR+5jiCADKdDFTADVtshgEIqMbV1OchqqXJDluLs9XuY07YcSuSwpwLWE8DvmxRHo5KutlyHL9xEje9WIXmieAjrZ18CKAJXeyKAcmo1p+dv69HLeNNhAlizQHr87oUA6sctpG9Ut79cJH1AVMCyFJIqYGoVaFYi1K9m17pRCjcrBFDMt7yvfVQpQgUcRQBzptFiaborggBSsi7sOY3iCpoZU5S5RatgyNJ28ayQANIeds8ARQDNYOpLnaeGAPoySH89608CuPXIRbw5ZhMyp0qEdTYkgCIQqVHqKX/hYaVdIwJoNYCxt/cx/yZJEdObTbBIAGmvw1zAzK1rNbOGWQLITZdp6pwqn08PtZVRpdHIddh+/CrGNCuFujoCSNUwVcQsf3eoiGJZnjitOE0grOIgZ1RJGEUAE2Brb9cLn7d2hV3StNblECzZJYmczbPbBqNkjieqYW/tyb/LuZT5d6OUXv9duIma361CikTxsNMHAlhy4BJcvnUf+pzNfK+QCMmp1ZyePyMCuKFnDWRMqXNJNgHgtC3H0X1WGMwQQP24hf3dj++8hAaFA0MA5UxMy/efj7IrtkoAjVK4WSGAYr4FAZTtEKNypXshgDl7zsPjx8DmL2siffIIaa5RZhET04o6I1bhwLmbmNwyGLK9rXhWpE5UBNAMmr7XUQTQBwz9SQC3HbmIxmM22QpsyyGJVERPAwHs9+8+LYetHaLlafqEIbkVAijnuKQKR8TCAAAgAElEQVQE0G6/PEoAv1sJeofqCYcPS1F7tMv0HVrKKas5RwUBHP1+KdQr4ioBpGqYKmKNRHxSEcWzxh4CKHIqs19UATNncdqkCbCtj0UC+O1KHL4YfT4EAZzVJhilctojgHIuZWJolNJLOIo4RQD1OZv5XpFazZ8EcNuxy2g8ylUFvL5HDWRKZZ0ATt18HD1mh6FWwfT47UPPKmBBAMW4ZQe4QBNAzjcDQc8LO2PZYYLzJgjgoDeK4P3IDB5mCKB+vo1y94pc6d5SZUYRQMmhx1u/3O1lggBOahmMipLDlagvUicKhyinLylyv/x5fvu6l8fU84oA+oC0PxfQ9qMX0Wj0JmRMmQgbLKa20gjg6A3YfPQyRr5XEg2Kxs5A0MJLtv+8fZqkzY6q1dP0CUNyM56Eop3PpoaAQWiZ45KkgKppO5JJTxuXO5WjD0sxggBO26FlHOhZvwDaVM1turnGo9Zj27ErGP1+SdQr4rpWQo5fQcOR67W29JlL/Lk5m+m8IGiUTJIA1hmxWgtTwfyzVoqcUk6WyAqCObNNMErbJIByLmX2ySil16HzEY4iKRPH1/Kt2i0ic4k+ZzPbM/KId3r+uIa4luSyrkcNLT+z1TJl83Ews02tgi/itw89B3HXj1s4wAVSAiincFux/7zmMWvVYYKYCUkbMxOJDB5mCKB+vuV9rWXliFBbwlPYW6rMXD3n4dFjQHboEarpwQ2L4L1g86Ft6o5Yjf3nbuDPj4NRKW/0S5XwiBcOUU6vUUUAXb9ERQCt7kxSfX8SwJCjl6IyG2zsZc2onV18a/R6bDl6BaPeK4n6sZwADpi337azhUcCGGlIbsaTULTTedoOzIlM20QCyIPIjm2ip43LmyG03SUp+t6rQQG0rmKeAL45aj22HjNeK9uPX0GjSAI4p30FlMj2JHq/PzdnMxiUG7IMZ6/f1WwTaQNYe8RqpE4SHyF9rZEo4ZWtt8ms+PUynIrM2FIml2t8RDP9Yx05lR7/e9ibxdCktKudsbATZJaFHRb7Lvej9KAlWtxCfco+1jFyiHJ6/uS1Ivq1tnt1ZEltPUg+L17MbU2vdHqneyr6cQsHOEZAqF/ohYDYAIoUbpxvSgCZmcOqwwTHHGVr58bZwt0c6udb3tdaVYkggGZTZebuNR+MByg79HhzTnE3X+7SLor6wiNeOEQ5vUYVAVQE0Oze7bWePwngjmOXIgLbpkiITTYIoDjUjaQ6XgcWAxXkD3vg/P2wG27FU1eFHZEZT0LRjpCikURxM7IbnsbTxuXNENou/OKWbzXnqLgsGEmLZanO7PYVUDIWEUDhpcv4hCSAlKLZIVEiLqM+P2mlr5dpKfumty6LsjYJ4J7T17XwNKIMa1wMTcq4EkBhJ2iHvLoSwKW4ePMeFnSqjIJSwG7WEQ5RlfOmw8SPI9J+OX24ytJi0a813aojaxrrBHDSpmP4cs4u1Cn0IsZ6JYCu4xb2z8zDWy9ABDAqH3HjYqATyMLdZ+FOiufpe/cWbsXdHOrnW97XxOVQ2IXKjkFGfcnTaz4ePnoM2Z7TW3gabwSQTnl0ztMXvUOU02tUEUBFAO2er9GeixECmDwhNlmMa8aOPlHrRbfrcgwAHxqSP+xB8/fbDrhshgCaMSSPIoCRdnRUo5IATt1yAl/UyYcONax5J3vauLwZQtuF1UjNY6YtT+YCsZkAikDNEQQwLihZtaNGdReYW8QZ9IUA7j59TQtQbYYA2lFfy/NbZvBSXLhxD/M7VkahTK55toRDlOwR7/ThKtuL+koA/9x4DL3n7kLdwi9iTDPPEkD9uAUBZASEugUDIwH8aPwWjfiR8C/bdw6Ldp+DOzs+T9+ot4DL7uZQP9/CPlg2DzFyDDLqS94v5+NBuDEB/LpRURgFqHY3JoZqolTcHQHUO0Q5vUYVAVQE0MyZaKrO00AAjTw7TQ3Oz5XkD3vwggMYv/4oPq2RB5/Xye/Ym60YkouXCk9amQBaDazMtjxtXMIOxp0nnF0AjAy9zbTlyWFINuyf1a4CSkkJ3P25OZvptyCA8zpGEEB60tohgFWGrcDxy7ehH1/lb5ZHpewrm9ueClhPAL9pXBRvl3HN6CAcRew4sMg4CTw8EUDZIcrp+ZM9xp0igPUKZ8DoZp5TwenHLa/nOgXTBUQFLDJ4cL5JBEkArdrLEcNPJm336EDijQCK+Zb3NWEfLAigt0xJ+b5cgPvhjyA79Mjj069nT99ugx/XYM+Z61pUBvZNXwQBFN+x02tUEUBFAM2cLabq+JMAhh6/hNdHbrSV2oqdF56dRrHdTA3Oz5WMCGCH6nnwRV3nCKAVQ3I9AaQn7RF66jIlVd38+KR6HkuImCGA7jzhLL1IqmwU6sFMW7LE5JVimVwekUN7zGpXHqWyPwlb48/N2Uy/ZckPw8DYDaUiUsrpVdxVhi3H8ct3tDypwTYJoJxKj2MykpgIR5F0yayHsJFxEipxEuLCmVK6QGiUWs3p+TMigKu7Vke2tNZVwIy/2WfuLpghgPpxyxLt2gUCQwCFipTzTQLIvLu2CKCUmtIohIy7OdTPt1GIKOEp7JUA9l6A+w8fQXbokSWcepMGT9/uyz+tAfOLj29RBtXyp49WVXjEKwJoZgf0vY5yAvEBQ38SwJ3HL+O1kRvwQrIE2GIxrhmH5Cm4rw9DduxRIwL4SfXc6Fq3gGPvEIbkZjwJxUvlYMqMAzh9q/XUamzL0+EqDKHdecLZBUBE+7eac1S2mdJnjZGzO+ht5JwmEFbHXXpQhO0XJV60AbQbTFlOKSfbOAoCOLVlGZTLE/2wMtNfPQEc2qgo9Cm9hKOIUwRQn7OZ/TTyiHd6/uSg4QKbVV2rIXvapGagcqkzccNR9PlrN+oXyYBR73uWAMq2oEUyp4xygKNNa6AJIOebBHDJnnMY0rAojLJ5eAJH5PBlakqjLCLu5lA/30ZB4oWnsGwXatSXfJEE8P/Z+w7wKoru/TcJCGIBBOm9QxJIaIEAoYWOUgWlg4AoSNNPpfciKEWRLlWpgiJSAqGE3jtJqKFDCL2XJPyfszcnmbvZe7fcvdzw+995Hp/vI3d2dmbO7Oy7Z857XpHQI8Y4GgGAczuWQ3VFAGhhxHMsr9lrVByfM9/fuhe8iy5wA0AHJt6ZC+j45Tv46LfdMPpSsCfv5cCQTbtUfLBHrz+NuTsv4KtqBfFdXfMAIAeSa2ES8sBEOTXyAJK2rl5pNa0AcOHn5VGlsLGjRSVDsN4nqZhwtn8tBhNZk3LdaFHfVc6SdebmrKXfzP4k0gMdAVM6FyNyaqKknMhyrjpuCy7eeYLFncuhokEAKGop05iUQAATRYyomIjzxKxoRQCowIg3237ysVLftn5bDfky6weAC3ZfwOBVJ1HfNxumtrYPAOXjFlntwS7zAB5AaIQF9BEApP+vBP7V1rnaM20TAMrsrSQTqVUqs+jAdXgeGw+R0COynOWsdntjavjrdpy4+gBzO5RD9WLJP6qYEc+EKLPXqBsAWlvHDQDVnkA7vzsTAJ64fAcNf9ttKLEtdZnUG+hIZna7sggukdWBUTrnUvHBHrP+DObsjMKX1QriexMBIAeSa2ES8ii/++tootePSCAUTE19or7pKfY2LrVAaD33EeuqeQtstSvmTWvkl9Oq2t7zt9Fy5h7pb3LlEmduzlrmgPO/UdqTtKm8UO2nreD8YVqu5zqipJyfkOia08Ms+rwcAgsb8wDKvWJKx4AcJ0gyWyS3ZbRwXkS5ZB+1p8SIN9t+cm8n3XfLt9WQ3wAAnL/rAob8exINfLPjt9al7U6JfNxiXsuaRV1zBCzmyaM0MKERNxWP/9VsrebVt2VDub3FfY3DWbRKZRYbtA7PXloDQDHP4SeytEb2xvTRrztw/Op9zOlQFjWKJX8vMSOeCVFmr1E3AHQDQLVnTvPvzgSAJ6/cQYMpu/HBO6lxaJC+vGYSAJyyA0ev3Mfv7cuiZvGUDQDHhpzB7zui0K1qQUnFwqzCcURamIR8z+//OpYY90dqHSsOXdGtrEFt2du41AKhjY6fA8b1ao6KyglyALjn/G18mgAA5colztyctcwBK0BQ4mM6Aq46fitYQUDL9VxHVBQRlU6qj9+CqNtP8OfnZVGpsLFnSB4Xp8QEZeCU5b002OcAAORxyCX7aJxMiBIZ8WbbTwkAbv6mKgp8+K4ec0h15+2MwtDV4WhQMjtIzchekY9bVLapWTSTS0ggolIGAcBNkTehRABSmxiO66XE9JzAWbzGlg3l9hb3NQaAWqUyiw9aj6cv4yDGc7LUnZKyjb0xfTxlB47ZeS/JCVFmr1E3AHQDQLVnTvPvzgSA4Vfuov6UXYYS29IA+EGz9aWleZBOqig+2D+GnMHsHVH4omoB9KtX3LQ76gkk55v+sOJYYuoXSgRN0mp6lTXUAKBaILTRCVBjDNpqV9ROfZMAoP/wDbj75CVIAow8gEHjt4A1RPXMoS3gVOOnLTh/yzEAKE+NYg8AGs35yWMVtZFFIEu/JxGikqTVzH65yhnPdN9N31RFQQMAcO7OKAxbHY6GJbNjigoAlI9b1LauUcQ1AFDUyqUjYE4JoydejuZPjdlvy4Zye4v7Gqe0UiIGKT03JQavx5MXygBQSdva3rOn5piQE6LMXqNuAOgGgHreDXbrvgkA0FashWmTYLAh8cEet+EMZm13AgDUEUjOw+i38piU/Jly/zEA1KusoQYAOQ7GFhPO4JSCc4bplZxqM3svdpy9hUkt/dDY3/oIePe52/hsluUIeEnXCqhQIFNi95y5OWuZAwaAGwkApvZClXHGAKCto9MaCRrBf3Qqi8pFjHkA5QBQKRkwe86yvZ8We/rX1DJ0xTraAGCStJrZ9pMnvTYDABIpiRI62yvycYsEuOouAoCJCh6NfSQlEAkAKqjAqBlbLbenOgC02Fvc1+QAUE0pyXvwejx+EQeR0NP2973YfuYWJrQohaalc6kNI/F3tdCkJACYBgcGBpuerNwNAN0AUPNiVavoVAB49S7q/2rcA8ixFrbYVmpjc/bvigAwqAD61TfPA6gnkFwOAL+pVURKBE3aunqVNbQCQLNtw6oBeiWneDOf2LIUmvhbb+a7zt1Cq1l7pelZ3KUCKhZMOQDQb/gG3HvyEqF9g5AmlQUAvp3aCxEj6upavrbIE6zZ7AgAlKtjKNmGyRNGdb95sMxmlms20+9K0mqvAwCG9q2KQln0HwHP2RGF4f+FQwsAlI9bJMBVK/yBS46AxWeRwN+WUzGGAKCShJu4uG3ZUG5vBoC0r31d05LUnpnCagDQZ0gIHj2PtSL02Nsz7D18auTEJEa8GwDq2sQMVnaTQAxOHF3mTAAYcfUu6v26CxneTo0jBgTiE9lWNuj2DgzblEvFjWv8xrOYue08ugYVQH8TASAHkmthEiYBwOOJ+r8EAFkXmPUztQ7e3ss1EZzbYMJpvYe8nppuqK127X3N7zp7C61mWwDgoi4BCCyYJOBuNoDQO+5Swzbg/lNrAEixgJEj6ulqSp5GhC9mALiwY1lUKWrMAyjXx1XyzjJRxCwAKNdspvEoMeLNtp9c95juS+C8UJb3dNmDKlNM8Ij/wkGsdNL0tVcYAPK42ctEGsKuBoBkbwKAW0/FYHzzktBDmKAxq+l727Kh3N79Vibtaz0ZACYwhdWkMhkAioQePjVQ+mjUAgBt5adlLzITosxeo2LfnPn+1r3gXXSBGwA6MPHOXECR1+6h7i87kf7tVDg6pI7uXjorzkx3R2xcID7YP208ixnbzqNLlfwY0KCEWbdICiTXwCTkm5IAPX099wkmD+Aj/HPkGmwFYNvrqL2Ny1nxmRx3pFdzlAGgUjzPzrO30JoBYOcABBZKOQCw5NAQPHgWC/IyEfCr/OMWpEnliVMj9QFAUVKO8shxCf55K87GPMaCjmUQVDSboXUpSulRA8M+9kb7wHxWbTFRJEf6tNjVz/gRsK2E1nQzJUa82S9XPr4TB0fH84Wz6geAs7efx8g1EWjklwOTP7UPAOXj5jgzyoBQ1UUeQFHCjQBg2OkY6CVM0Dyyhq+tOGRbNpTbW9zXegVbPIDMFFaTyvQdEoKHz2MhEno4blgpbMTeg8LH87YUqjiOlAlRZq9RNwC0to4bABra1i0XORMAnrp2D3V+2Yn306bCsaH6AaCzmKYOTJfVpVYAMPQsZoSdR+fK+TGwoXkAkAPJtTAJuXMD/j6OP/deQu/gwtIR8ConAEC1QGijcywyD9tUyKu5GXuMvh1nbqHN7xYPoFy5xJmbs5bO+w4NwcNnsRLRgGIAKRbsrVSeOK0TALKiiFxBo9aErThz8zHmdyiDqsWMAsA7aDZtd+JwlBjaHCeYM8PbktqC0WJL0o7aU2LEm20/ZnCK/SeCThEHAGBjvxyYpAIA5eMWmaZBhVxzBCwy8jefisG20zHQS5iQAGCCNjllR6AsCfJiy4Zye4v7Wu/gIlIzWqUyxeeMCT32MgfYW78iQ7uuT/JniuNhmRBl9hp1A0A3ADS6vya7zpkA8PT1e6g9eSfeS5sKxw0AQGflmjNr8sQH++fQc5gedg6fV84PUrEwq3AckRYmId9z4D/H8ceeS+hV0wIA/z16TeoT9U1PsbdxqQVC67mPWFfMPdY6QDsAtJfTa/uZGLT9fZ90G7lyiTM3Zy1zIHomCAAGEgD08sTpUfo8gKKiSIkc7yfeuvaEMJy++QjzOpRBNYMAUJTSo4aVFB04TtBRAFh1/BZcvE2axtaSfRIATCBEidJqZtuPc7iJtqMUPUWz6fcAztp2HqPWRqCJf05MbOlndznIxy3mmqtS0EUAMEHCjexNHkAjhAkaNEu42cpFahMAyuwt7mt9alkAoFapTNHTzvGc9nKH2jOWmKOxrk/2ZFXlhCiz16gbALoBoJZ3i6Y6zgSAZ27cQ61JOw0ltqXOs9yY2WoTmiZGQyXxwZ6w6RymbT2HTpXyY/BH5gNALYHk3GXSH6WvZ4qTIQC4+ug16FXWoLbsbVxqgdAapk+xCgNAvZJTnNVfKUYpJQNAMTaJjoArjtmM1F4eODOqvq4pZABIiiLFsycBwDoTw3Aq2jEAKErpqQHAXBnfxo7vjXsAOXG1XLKP7suEKFFazeyXK6s4iJNPSbqLZUuaU62GmbntHEavjURT/5yYoAIA5eMWY2wrF8zoEhIIK3iIAFBvvBzNFUu42VIjsmVDub3Ffa1vAgBUIgYp2Scp1jaJ0MMAkOIz5epB9mzMKi3T25SGEgCUE6LMXqNuAOgGgFr3INV6bwIANFtvVnVSNFYQH+yJm85hqhMAoJ5Acu724FUnsGD3RfSsUUhKA/PfseuKXhu1YdrbuDgOhoLUSabOrNJ5vkV+Sq/kVKKup0KaCjq6oiNiKvKPCWduzlrmRGQnkgewwphNBgHgRtx69AJysFJ3Yhgiox9hbvsyqF7c2BGwHAAqfUwwUST3B29j+3fGASBJ4UnqNd0qomy+D6ymUIkRb7b9zt606LiaCgBL58SEFvY9gPJxiwS4ygVcAwBZwYPsTR5AW2mW1Na5koSbeI0aAGQCXOK+VrMw5ABQTSlJZNszoYflIylFj1w/3N6YPpm+C/sv3MW01qVRzze5B5ABIMfDmr1G3QDQDQDVnjnNvzsTAJ69cR/Bk3bgnTReODlMX1oLGgB7AOVxW5oH5+SKSgCwY6V8GPKRt2l31hNIbg8A6lXWoLa0AEBbTDijE9B5/n5DklOd5u23maiWgtfpiJjKgk7lEVQkSbvYmZuzljkQ85NRGhgCgKk8PXB2tD4PIEvKyY8r+Rma0740ahRP/rLS0kdRS5nqK4UTMFEkzwfpsO276lqaVazDeQvlms1UWUlazWz7KQFAuVdV6+BmhJ3DmHWRaKoBAMrHLRLgKrkIALKCB9mb8gAaBYBKEm5aAKDc3uKHbd/aRaUmmCmsBgDFfJtM6Gk5Yzf2Rt3BlFb+aFgyh1azosX03dh34Q6mti6N+goAkBnxbgCoeUodqugmgTgwfU4FgNH3ETxxhyFpKxpSnYnbcCr6YbLAfQeGa+ql4stn0uZz+G3LOXQIzIehH7sWAA5ZdQLzd1/E1wkewDXHrsNsACgqFdTxNuZZUjLG5/P2S5JTY5v64tPyeTTbiwGgklTV1lM30WHufqmt+Z3Ko2oKAoCsUEAJaskDGDB6E7w8PXBOJwAUJeXEeLVEANiuNGqUMAYARS1lmkMlRvnBixaiiFkAUK7ZTPdNlFYTGPHmA8BHCJ4QZrXu1vasAjGuUuuipJjgsesi0ax0LvzcopTdyxgA8riZAEeJ1l0NAMneW07dxM6ztzH5Uz/IlXbU5sMoAJTbW9zXvkkAgMwUVpPKFBV3mNDTYsZu0MeNUQBI8n5EzpMXZsRzPKzZa1S8nzPf32p2TSm/uwGgA5Zw5gI6F30fNSfuMCRtRUOqPTEMp6MfYZEsdYcDwzX1UvHBnrz5PKZsOWs6AORAci1MQh7c0H9PYt6uC+hRvZB0nLbm+HXF1B1qk2Fv40oKhC4DJSacWtu2frcH5Oy1aQ840surYwIAlCuXOHNz1jIHokYpxQCWH70Jnh7A+TENtFyeWEfpBUc/1pu0DRE3HuL3dqVR0yAAFLWUbQFAJorkzZQOYf9zwAP481aQfrVcs5nuq8SIN9t+52IeoebP1gBQzqzWahiKCf5xfSSal8klpU+xV2rIxs0EOPpgCcyfwSUxgKKEGx0B7zpnDACyhi8pE7GChzgXtmwot7e4r31bx+IB1CqVqfSBxJ48W0DOlr3UgKOcEW/2GnUDQGvLuAGg1h1JoZ4zAeD5m/dRY8IOvJ3aExE6E9tSV2tNCMOZm4+SJe91YLimXio+2L9sOY9fN59F+4p5MayRj2n34UByLUxCOQDsXr2gBADXHr8BvdJq1Ja9jUstENroBCTG8jUrCT2ao3x0rBQ7SMdXHedZPIBy5RJnbs5a5qDYoHV49jIe27+rjjQEAEdtgocHEKUTAHKMkzxnXf3J2xB+/SFmt/VHsLf2Yy6x76KUHv1dSVWG4wTzZUqHrQ4AQE5cLZfso/sqMeLNtt/5mEeoIQOA/31dGWJuRS12pTpTt57FuPWn8EmZXBivAgDl42bPLYUsVHQRAGQJN7I3AcDd529LCa31ECZoHljDV1Tw0AIA5fZmAEj72v/qFLMAQI1SmRwiIcbIciyfraNcW3bmo2NbsYPMiGdClNlr1A0A3QBQ6x6kWs+ZADDq5gNUn7BdSnCrV9mAOk5HMWdvPkom36U6qNdUQXywf91yHr9sPot2FfNiuIkAMDGOSAOTkIc9bPVJzN15AV9VswDAdSduQK+0mhoAVAuENmoCZvPq1Rxl8ogSe3hzZDQ6zTtgAYAy5RJnbs5a5qDowHV4HmsBgHQETPn8qFwYq88DKCqKiKoVDX7ZhpPXHmJWW3/UMggARSk96puSrjTHCebP/A5IbcFosffMMyFKZMSbbT96XoiQIRajAPC3LWcxPuQUWpTNhXHN7XsA5eMWMyBUyOcaD6Co4EEAcM/5O5KmsR7CBM0jS7gRcYMVPLQAQLm9xX3tu7oWAKhVKrPsSAtJSozn5I9YW2QOW2uYySO2wLCcEGX2GnUDQDcANLq/JrvOmQDwQswDVPt5uyFlA+qoPW+AaRPgQENWAHBrFH7ZdAZtK+QFqViYVfQEkvM9h68Ox5ydUfiSAGDMY6w/eUPqE/VNT7G3cakFQuu5j1jXXjoXe23aSx+TkgFgkYHr8CI2Hju+twBASufiGAC01q1t+Mt2nLj2wDEAKEjpqQHAApnfwWYHAKA9rz8TokRpNbNfrhduPUY1GQBc3aMyfHMlqatoXdsMAFuWzY0fm5e0e5l83AwAKQNCQL70LjkCZgUPAvybIm4aIkxYAKBFwo2UiVjBQwsAlNtb3NcopyAVJWKQ0kQrpUkyeoqhlj5GTogye426AaAbAGrdg1TrvQ4AaETZgDouj4tRHcxrriA+2FO2RmHypjNoUyEPRjb2Na0negLJ+aakP0pfz5R1n6TgQk5GY2RjH+hR1qC27ALAhABqvfEzahPDCZ31Sk6xgsioJj6QJ5DeFBGNz+dbPIBzOpRFjWJJaWucuTmrjZV+LzJgHV7ExUvqGWlTeaJMAgCMGlMfHnQWrLFwoltSFGGlA7r0o1+34/jVB5jZxh+1fYwdAYtSetILvV4xfCFTdGCiSIEP38Hmb4x7AO3F/Sox4s2238Xbj1F1vLUH8N8elVAyVwaNlkiqNmXzGfy04TQ+LZcbY5vZB4DycYsEuPJ5XQQAExQ8yN5EzCIvr5HnnSXcSJmIFTz0AECW0hP3NVIVoZJIFCmZXeqbrcJKOSKhx2gcs5qCCBOiOB7W7DXqBoBuAKh7M7J1gTMB4MWYB6j683ZD0lYiAFRiBJo2AQ409DoAoJ5AcnsAUAkYqQ3dFQCQJd30Sk6xhrAS0A0Nj0bnBRYA+Hv7sqhZPOUBwF0/1JA85UYBIEtdiVqnNN6Pf92OY1cfYEYbf9QxCQAqSXoxUaTgh+9gkwMAkIGPEvGLAaBIiDL75eoqACgftwgIy7kIALKCB9mbjoCNAkAlCTc9AJDt7QgAZK1skdBjNJMBawjbYkS7AaDam8Xc390kEAfm05kA8NKthwj6aZuhxLYSAPxpq5TI+E0AgL+FRWFS6Bm0DsiDUU3M8wByILkWJiEvg5H/hWP2jih8UbWAdAS8ITwaZgNAozm01JZq29/3SpJTRgGg0lH3xvBo0BExldntyiJYSFxtNoBQG5/898ID1uJl3CsQAKQjYGIrUjk/uj48iQ6ssSiJ3YsAcHprP9T1zamxNetqopYy/aIk6cVEEbMAoFLuTyVGvNn2u3T7CYLGb7GagFXdK6FUbv0ewF83ncHPG0/js/K5MaapfQ+gPOVV4pFw5wC4GgCSvYlIZS/3nb2FxXLHSn4AACAASURBVACQpClZwk0LAJTbW9zX+tUrLjXBTGE1qUwGgGI8Jyezn9G2DPSksmIAOKmlHxr7J3+mmBHPhCiz16g4d858fxvaLFxwkRsAOjDpzlxAjgJAzo6vlBTWgSGbdqn4YE8Nu4CJoafRKiAPiIhgVuE4Ii1MQr7nqDXhmLU9Cl8EFZAANAEgvdJq1Ja9jctoFn21eWEAOKFFKTQtnUuteuLv3RYetMQ6NvJG24r5rK7bcPIGui48KP1NrlzizM1ZS+cL9V+L2PhX2N2PjoC94J8AACkPIOUD1FpESTkiYnD5eMp2HLvyANNb+aFuSWMAUJTSo3aVJL2YKEI6q6F9q2rtdrJ6Yuxb5cKZrX5XYsSbbb/Ld56gyjhrAPhP90rwMwAAKSZ4ggQA80jKNvaKfNxMClnUJQDl8rjmCFiUcCMAaE/9wt7YWMOXCCCs4KEFAMrtLe5r/epbACAzhdWkMgNGhyL6wXOIAJDlLPUms28ze6+UFNuWLB4z4pkQZfYadQNA69XmBoCGt1vAmQDw8u2HqDJ+myFlAxqSPV1QB4Zs2qXigz1t2wXNm72eDuhhEnK7o9dGYOa28+hKADDmsSFpNTUAqBYIrWeMYl21zdVWu1/+cVBiOyuluwk5eQNfJABA+WbvzM1ZyxwU7L8WcfGvsKdfTYkt7zfc4gE8O6oeUnl5amlCqsOKIlu/rYZ8AgBsNGUHjl65j2mt/FDPIAAUpfToXv+rUxTdqxey6tuuBKJI4SzvYqMJAFBJ/1uJEW+2/ZQA4N9fBcI/T0bNtuCKk0PPaP4olOueMwFucZcKKJvnfZeQQFjCjexNAPDAxbuwpX9rb3ISNXxrFAIreGgBgHJ7i/ta/wQAqFUqs8LoTbjx4BlEQk+j33aCkjbrlbNU+0hlRjwTosxeo24A+IYCwKlTp2L8+PG4fv06vL29MWnSJFSpUkXx2Zk3bx46duyY7LenT58ibdq0iX/X06bSjZwJAK/cfojK47cZUjagvlYdvwUXbz/Bii8rokxea11Q3buxEy4QH+zp2y5oPu7R0xUOJNfCJOR2x6yNwIxt59GlSn4pDUxohH5lDTUAqBYIrWeMYl214xVb7X7150Ep3+Gwj73RPtDaA7j+xA10+8PiAZQf9zhzc9YyBwX6rUH8K2Bv/5qSB7DU8A3SZWdG1UNqHQBQVBTJmynJA9j4tx04cvk+pn7mh/qljHkARSk9WwCQiSJFsr6LDX2MewA5AbJcso/uy4QoUVrNbPtdufsElX+09gCu/CoQpQ0AwEmhpzWHhcjHzQQ4yodYJrdrAKCo4EExgMRund5Gf+J3lnAjZSJW8NACAOX2Fve1AQ1KSE1olcqsOGYTrt9/BpHQwx9H8rAQtedWLUxFTogye426AeAbCACXLl2Ktm3bggBbpUqVMGPGDMyePRvh4eHIkye55BUBwF69euHUqVNWo82WLUl2S2+brxsAXr3zCJXGhRlSNqC+Bo3bgkt3CAAGokxe/V/gag+yo7+LD/aM7Rc0M/703FcPkzARAK6LwIyw8+hc2QIAicGnJJGm1g97G5daILRa27Z+N9pu9z8P2VQ8SckAMH+/NXj1CtjXvybSpPYC5fOjcnpkPYk8pbUwANz2v+rIkyld4mVNftuBww4CQFFKTw0AFs36HkL6BGntdrJ6LIEml+yjikyIEqXVzH65Xr33FJXGbrbql9H9Z+LG05ozA8jHLWZAKO0iAMgKHuQBJCb9oUv3kn1AaTE0S7iRMhEreGgBgHJ7jxH2tYENrQGgmlJS4JhNuGYDAMqJYWpjUiOqyQlRZq9RNwB8AwFgQEAASpcujWnTpiX2vnjx4mjcuDHGjBmTbM0RAOzduzfu3btncz3qbdNVANCIsgH1tcq4zbh85ymMfoGrPciO/i4+2DN3XJSSvurx1Gm5v55Acm6P9Efp6/nzBABIX+/jdCprUFv2Ni4+qrUVCK1lbEp1jHoWuy86BFuax+tPXEe3Pw5Jt5N7MJy5OWuZg3w/rJGq7RtAR8BeKDnUAgBPjayLNKm8tDQh1WFJOUoonfuDJADITMffPiuFBqW0x1SKNxal9OjvSpJeTBQplu09rO9tHAA2+GU7Tl57ALlkH91XiRBltv2u3XuKwGQA0NgJBMX/ac0NKh+3SIDzz/WeS46AWcGD7E0fkYcv3YPeeDmym5KChxYAKLe3uK8NSgCATBRRU0oiUE/gXiT0fDxlB45duZ8sNZTaQ6eWqooJURwPa/YadQPANwwAvnjxAunSpcPy5cvRpEmTxN6Th+/IkSMIC7PWnqQKBAA7d+6MnDlzIi4uDn5+fhgxYgT8/f2l6420Sdc9f/5c+o8LHQHnzp0bt27dwvvvv6+29nX9fu3uI1SdsAsUyn56RG1d11JlUhG5cvcplnctbygIW/cNdV5AD/bGjRtRq1YtzN51GRNCz+KTMjkxurG3zpZsV5+y5Rwmbz6HlmVzYWQjy1evWhm/4TRmbr+AjoF5JQ/g1tO3MKaJN5qX1ncEKI4vderUVrdtP+8Adp27g5+a+6JRqeSC6Gp9tPV72zn7sSfqLiZ+4gti9mktvZcew5oTNzCwflFJjk8s609G4+slR6U/Tfm0FEg4nou9MWq9tyP1Cg+yAL7d31eV0sCUHmU5fjwxJFj6t9biOzxUkpTb0rcKSIKKS8uZe3Ho8n1M/sQH9UsaywNIR8CdFx5ObLN3zULoXq2AVdd2nL2NjvMPoljWd7G6R6DWbier13jabkm5hLSLg2QkkBnbovDTxjNoVjoHxjaxJFs32350TEiZC8SytEt5lM6jnwU8edNZTNl6Hq3L58bQjyykBVtFPu5ak3bgwu0nWNy5HErleDdxn5E/h4YnWsOFA1edxNIDV0H23no6RgoloFjS4OJZNFydVGXEmkgs2HMJXwblR99ahZNda8uGcnuL+1r/ehYt4N93XsDY9aelPYj2Ilul2s/bcPXeM/z1RQBKJST1bjJtT2KS9GpFPtQ8ps4LDiHszC2MbeKNZgp76t6oO2gz5wCIEb++ZyXT16jYUXp/Z86cGffv3zf9/a15QlxcMcWTQK5duyYBuZ07dyIwMGlzHD16NObPn5/smJfmc8+ePTh79ix8fX0losbkyZOlr8CjR4+icOHCMNImtTt06FAMGzYsmckWLVokgVQzy4MXwKCDqaQmJ1eM1d30sENeuPPcA318YpHvPd2Xv9YLNl71wH+XvBDwYTxaFYo37d7rL3tg3RUvBGaJR8uC2tpdfdETodc8UTV7PGKeAuH3PPFZwThUyPLKtH5NDffEqfueaFMoDuU+NK/dX0964uwDT7QvHIfSmbW3O++0Jw7f9kSTfHGolt36uiO3PTD3tMWb1rFIHPwyaW/XtAmz0VCv3ZbnY0SZWLzlCXy/3/LvnwJikVo7/sO3e7zw8pUHBvvHIlNSiDAmnfBC1EMPh8Z98q4HZkYmeSPr545DnVzWcxh5zwPTIryQI90rfF8qzvC0jT/mhSuPPfBFsTiUyGh9D2c9Y2Jn7z0Hhhyy2IBLL+9YFDDwbbz2kidCrnqiStZ4NC9g/9mVj3vEYS/ceuaBnt6xKGjg3oYNIFy45Jwndt/0BNn75F1PXHzkgc5F4+D7gb7nZ0WUJ7bd8ERwznh8lEfbHkbdkNtb3Nea5rO0s/maB1Zd9EK5zPFoU9h220rvEp7zrsXi4C1ba/bmb3qEJyLs7Kln7ntgSrgXsr39Cv38jD8LWmz45MkTtGrVyg0AtUyWq+owWNu1axcqVqyY2I1Ro0Zh4cKFiIyMVO1afHy8dIQcFBSEX375JREA6m3zdXoAb9x7jCo/75TGdsaAB1Dpq011ol5jBfHLdc7uK8m8E2Z05dfN5/DLlnP4tFwujPhYmwfw541nMH1bFNpXzIMLt57Y/Vq110d73hXy9pDXZ3wzH1D8jVml9e/7se/CXUxqURINfJPiXdXa773sGNYcvwHyDJDnUyzEDu659Jj0p19alkQ9n6R2zfYgqfVT/P3Vq1coMtjC+t1DHsDUXvAfaYk/Oz7YciSstXgPC5Uk5bZ+UwU5MyT3AE5s7o2GBkkgW07FoOsfSR7AnjUK4uvqBa26RrkbOy04BDoCXt09aY/T2n+uZ88rMy3svORlJ082ebSpmG0/YopS5gKxkBeurIEY5ImhZzE17DzaBuTG4Ib2PYDycdecuB2X7jzFks7lUNJlHsBwLD1wBWRv8gBK6YRa+6FmMX0ewJFrIzF/9yV8USU/vq2t3QMot7e4rw2sb1ECmbUjCuNCzqCJX3aMa2bbA1j95224cu8ZlnUtD/+ElD6Npu5G+PWHmN3WH1X1eAAXHkLY6VvSSQ+d+MjL7vO30W7uQRTO8g7Wfu32AOrdA/TWT/EeQKPHtfKJ6NKlC65cuYJ169YZPgKWt+lMFjABwApjLbJKeqWt6BqluA29i8OZ9cXYjtk7L+HH9ZHQk7BZS984kFxPgunxIZH4bcs5dAjMJx0B0xGeXmk1frmS17l+/fqQHz2pBUJrGZtSnRYJEnNTWvmjoY4jy56LD+Pfo9cwsEFxdK5ifTz537Fr6LHIAmDkUlbOjM9Rm4P4+Fco0H+tVO3gwGAJ8HkPCZH+HTG8Lt5+SzsAFCXlRADYfNpOHLh4TwK+H/vnVuuS4u+ilB5VUJL0YqJIiezvY20v5cwGWm5uLy5LiRFvtv2iHzxDwOhNVl01moj+p5BTmLLlrPQcDv3YfliIfNxJBLiKKJnDNTGAooQbpYGhdEJ6CRM0kazhS9KULOEmTrAtG8rtLe5rPJ9apTI5nlwk9DDxRine1N5a7TRvv6SMYotYx4x4JkSZvUbFvjnz/a3leU0JdVI8AKRJIsJGmTJlJBYwlxIlSqBRo0aKJBD5xJK3oHz58tKR8Jw5c6SfHW2T2nDmAoq+9xgBCQBQr7IB9U2JuZUSFhz3QXywf991CRSkLDIUzegrB5Lr0RgWXzyUCJryuOlV1lADgGqB0EbH3mL6bklxQK/maK8lh7HqiDIAXH30Gr5ebAGAcmDpzM1ZbQ4o/x/lAaRyaFAtKQ9gicEWABg+vA7SvWV9FGmvPVFRJIfgAfxk+i4pge/kFiXRqLQxAChK6VEflBQdmCjineN9rOlpHAByag4loMGEKFFb12z73XzwDOVlAHBp1woIKJBJzZzJflcCLLYakY9bBCzkAbT1Iaa7UzouEBU8yL5GCBN0O5ZwI2UiVvAQu2HLhnJ7KwFqrVKZIqDmlGKcekeJcW5vmj6ft18ixYxt6otPyyfP4CEnRJm9RsW+OfP9rWOpuLTqGwEAOWXL9OnTpWPgmTNnYtasWTh58iTy5s2Ldu3aSXGCzAimOL0KFSpI8X5kZDr2peNiiiMkIEhFrU0tVnHmArp5/zHKj7F4APUqG9A1nLtJTN6pZUyvq474YM/ZdQlj1kVCzFFmRj/0MAn5fj9vOIVfN5+VyBAEAOl4Tq+yhhoA7DB3H7aeisH45iXxSVljwEJpfhgATm1dGvV9dZBAlhzGP28YAIyNi0ehAeukaTgsAUAvFB+8Xvr3yWF18E4a/QCQFEWyp086Am4xfZd0pO4IABSl9NQAoE/O9/Hf1w4AwITkvEq52ZKUNZKk1cx+ud58+AzlR1l7ACkXXwUDAHDc+khM3XoOHSvlw5CP7HsAOSkxj1vMgOCb3TUAkBU8CPCTx+v41fuY26Ecqus9AmZpyqACYAUPLQBQbm9xXxvWyEICYqawmlKSUk5Zezkn7e3dnefvt5tblZVzmBFv9hp1A0Br67wRAFBarFOnYty4cVIiaB8fH0ycOFGK6aNSrVo15MuXT2L/UunTpw9WrlyJGzduIH369BL7lwgcYgyhWptaAMjrAoB6lQ2o75y9XZTv0TKm11VHfLDn7r6E0Wsj0dQ/Jya09DOtCxM2nMIvm8+iXcW8GJ6w6ak1Ll5DR8AEAG3JFtlry97G1XHuPlBs2LjmJdHCRADIHqtprUujng4A2GfpEfx9+CoG1C+OLkHWR8B0NExHxFR+/cwfJBvFxZmbs5qdXsbFo3ACADwy2AIAiw2yAMATw+rgXR0AkCXlSFEkW/okFkjLGbuwN8oSU9nYoAdQlNKjvilJetERYcd5++GbMz1Wf11Zbeg2f2d5LiV1BlbWEKXVzLZfzMPnKDcq1Kp/pMZRsaB+DyCFhJCHqlOl/Bj8kf34Xfm4K/+4WcqAQCokPi4CgIkKHhIAjMaJqw8wt2M5VC+qLwaQJdxImYgVPLQAQLm9lfZCrUpJSqpScvUVrYu28/wDdtWVWDmnePb3sa5XFbvptLTe01Y9Z76/He3b67r+jQGAr2tC9NzHmQso5v4TlBtjSWvhBoB6rJJUV+mrV60lJQBoJF+fKwBg82m7DElO9V16BCsPX0X/+sXQNciaoLDqyFX0WnJEmrZfPvPHxykQAB4dXBtpUnsaBoAsKUeKIlnfTwKAn87YlZhWp0mZ5MdVamuJfk8GABUkvQggdJp3ACVzpce/PYwDwCZTd0r55uwBQFFv+/8KAJSPm+OfSYfYO9s7LjkCZgWPnjUKYfOpm4YBoJKEmx4AyPZ2BAAq6crb052291x0WXDArr66GwBq2VXMq+MGgA7MpTMB4K0HT1B2tAUA6pW2omtYwHtNz8rwzpHegVE651Lx5TNv92WMWhsBtYSkenuiJ5Cc2xaPjckDSMLlkz/1QyM//XkAbcUecSC0kQTT9uag2bRdhiSn+i47gpWHrqJfvWL4oqptACifB7MBhB77Emu3yEDLEfDRIbWlvH/sATw+tDbeS2ude9Fe2ywpR4oiWQQA+NnM3dh9/g4mfOKLpgYBoKilTH1QkvRiogjlWFvlAADkxNVKCYeVpNXMtt+tR89RdqS1B3BRlwAEFsysx7RSXaXExbYakY9bJMCVcBEAZAUPsjcdAdtK0K02MUoSbloAoNzeSuEw7AFUS8AvJtYun98iK1pn4jacin6IPzsHoFIh7fbtuuAANoRHY1QTH7QOsM44QO2ydCITosxeo+LcOfP9rWbXlPK7GwA6YAlnLqDbD56gTAIA1CttRUMqPyoUNx8+x5sAAOfvuYyRayKklCiTPrUk6zaj6Akk5/uJElQEAHeevW06AORAaCMSc/bmhV+EejVHGQASy5DYhmL55/BV9F5q8QCmJAD4PDYORQdajnwJABIJhP99bGhtvK8DAIqSckoA8OfmvmhW1pgHUJTSo74qSXoxUcQsACjXbKb7KjHizX653n70HGXkALBzAAJ1AARee0rSZWoAkMfNBDhSrnA1ACR7EwAMv/4AegkTNF4GgCRNyRJuWgCg3N5K0npapTIZAIqEntoTw3A6+pFhADiysQ/aVEgOAJkRz4Qos9eoGwBaP0VuAOgA0nAmALzz8EmisoFeaSsaEsXiUEzO2p5VUCKHi7Kh2plb8cFmANjILwcmmwgAOZBcSyoJ7qr45UwAcNc58wGgWiC00SXJR2FKAMBem98sO4oVh67g+7rF8GU1awD49+Er6LPUogQiPwp35uasNgfPXsYlevwI8KVN5WXlEUz/tnYPoCgpl+W9pCPgVjN3Y9d5i2JLc8MAMElKj8bUvXpB/K+OJQ8bFyaKlMqdQZLbMlrseYCVGPFm2+/O4xcoPcKSm5GLXg9RIgBcG4EZ286jS5X8GNDAfgygfNxMgPu3RyUUz+qaI2BRwm1zZAwirj/Agk7lEaQjZ54EABM0fEmakiXctABAub2VPMBapTJZW1kk9NSaEIYzNx9hkU6A/8XCAwg5GY0RjX3QVgEAMiOeCVFmr1E3AHQDQKP7a7LrnAsAn6L0KEti28gRdXUltqVr6CiGjmQokJYCalNaER/sBXuvSOkOKL6M4szMKhxIroVJyPfk4GmKnYmKeQxKTCqPfdPSP3sbl1ogtJb2lepwMLxezdFvlx/FXwev4Lu6RfFVtUJWTa88dAV9l1kAoJwM48zNWW0ORABIR75EAmFSCMUEpk+nHwDuHxCMD99Lk3jrVrN2WyT7mvmgebnk3gq1PtLv645fx5d/WrSUqXxVrSC+q2sNADlO0C93BlDcmtFiLwaUY8DopUsvXypm2+/u4xfwlwHAPz4PQGWZLJ2W8anFvoltyMfNBDjKgFAsazqXxAAyACR7kwcw8sZDLPy8PKoU1i6bRmPko3BbZBhbNpTbW9zXRjexJH1OYgrnwZimthNB1/x5K87FPIZI6AmeEIazBAB1HvF3W3gQ60/ewIhG3mhbMV+ypSAnRJm9RsUbOvP9rWWNp4Q6bg+gA1Zw5gK6++hporKBMQC4EbcevcD63lVQLFvKBoAL917B8P/CJYYpMU3NKnqYhHxPcVOMuvUIe87fScZ+1dI/exuXWiC0lvaV6thjgdpr83/Lj2L5GwYAn76IS0z7QqzftKk8E9PCECs4Q7q3NE8jewAPDAxG5neTAGDrWXuw89xthwDg2uPX8ZVGAOifJwP+/so4ALTHAmdClMiIN/vleu/JC/gNt/YAGgE9ZDhmv35hI/2JaFz5uMUMCEWzuAYADlt9EnN3XpAAPwNAI2BY7SPWlg3l9lYCe0qgUOmhYbCnBAD1sry//OMgSF3IFgCUE6LMXqNuAGhtYTcA1PyaSF7xdQFAvcoG1NMyIzbi9uMXCOkdhKLZUp4YsPhg/7HvCoatDkfDktkxpVVpByxifameQHK+UjwWOR/zGCROrldZQ827ohYIbXQC5PnQtLbz3V9HsezAFfyvTlF0r27tAVxx8Aq+WW7xAMrzITpzc1br+5MXsYmJnynvH3kAOTE05QXM+I42AEhJ4vP3S1IUySQAwDaz9yRK9n1i0AO45th1dF+U5AGkI3Y6ahcLE0VK58mAlQ4AQHt5IJkQRfktOQ+c2fa7/+QlSg3fYDU2I8ee1MBIzn9nIwGyeBP5uJkARymwXAUAWcGD7L054qYhwgSNUS2MxZYN5fZWOu5VOhZWeu4Sj3sFbx97BfXmefzqz4NYe/wGhjfyRjsFD6CcEGX2GnUDQDcAVHu3aP7dmQDw3qOn8EvQNnUEAG7oE4QiWf//BIB6AsntAUC9yhouA4BTdhiSnPr+r2NYeuCyIgCko2E6IqYiV0Rx5uas9hCKAJCUP9KkMgYARUk5UhT5QACObWfvwfaztzGuqQ9alDd2BCwHgEqSXkwUKZM3I0huy2hhKUClROBKjHiz7ecyAJgggcjjFglwRT50jQeQFTzI3nSsaYQxS+tAjcimBgA5/tkRAMiEDzHej+MC9Sq9dP/zENYcv45hH3ujfWDyI2A3ADT69Bu7zu0BNDZv0lXOBID3Hz9FqRGWGEC90lZ0DQVjU1D2xj5BKJzCAeCf+65g6OpwNCiZXZIxM6uopVBQuo/IjCMlkH1Rd6BXWUMNAHIgtC0mnNHx29OCtdfmDyuOYcn+y/i2dhH0qGEtOL+cgOFfx6TL5ZrIZgMIPeN+/DzWSvuX0sCwNrAcyNlrV5SUk3sO2/2+B9vO3MaPTb3Rsnzyl5WW/opaylRfSdJr/QkLUaRs3oz4ywEA2HLGbsljrfTBogQkzLbf/acvUWqYtQfQCPOV5kkEUEoauOLcy8ctEuAKf/i2S2IARQ8mAUBizOolTEjPnIomsi0byu2txPhVYgYrrWmllC9KqWG0PA/kDaePoqEflUCHSvmTXZLIiE8gRJm9RsUbOvP9rWUuUkIdNwB0wArOXEAPHj9DyREWWSW90lZ0jf/wDbj75OUbAQAX7b+KIf+eRAPf7PittXkAkAPJtTAJeRmIubGIBUzaumYDwMRAaBtMOKNL8qNfd0iSU3M6lEWNYlk1N8MA8JtaRfB1TWsAuOzAZXyXAADl0nXO3JzVOv/oeSx8hli0f8lDTmlgbB3l2mtLLiknHh0zABzbxBufBhgDgKKWsgQAFWLamChiFgBUCllQOko0234Pnr1EyaHWAHBex3KoplP9guZJPEKVH5nL7ckAkMfNBDjKgOByABhUQIoBlBizOgkTIgAUj+7F8duyodzeSjn/tEplMgAUYxg5OfSyLyqCcwOqPbP0OwPAIR+VQEcFAMiMeCZEmb1G3QDQ2kpuAKhl1dqo40wA+PDJM/gOtwBAvdJWdI3f8A249+QlQvsGoVCWlH0EvPjAVQxedRL1fbNhausyDljE+lI1GSWlG4nySAQA91+4C73SatSuvY1LLRDa6AQ0/HW7RXFAp+Zov5XHsHjfZfStVUSSKhPLsv2X8d0KiwdQLl3nzM1ZbQ4ePnsJ3wSwwSQpW2QOe23JJeVE8kj73/ci7MwtjGnijc8MAkBRSo/6oSTpxUSRcvkyYnk340fAn87cbZO0pEQmMNt+ok14zo3In9G1IolCzpqW21M+7rIjLQQ4yoBQKLNrPIDi3kMAkBizegkTNE4l8o4WACi3t5Lsm1apTCXZN5aHW96tIsrlsySH1lJ6LDqE/45dx+CGJdCpcnIPIDPimRBl9hp1A0A3ANSyTjXVcSYAfPTkGXwSAKBeZQPqPB3F0JFMaN+qKJTlXU3jeZ2VxAd7yYGrGLTqJOr5ZMO0NuYBwMRjGA1MQh67KJBOAPDAxbuY3qY06vpk1zU99jYutUBoXTcSKjf4ZbukOKD3pdtv5XEs3ncJfYKLoFewNQBcuv8Svl9x3AIAm5VEi3K5E+/ozM1ZbQ5Eb5McAMrTudhry0pRRJY+pv2cvQg7fQujG3ujVQVjHkBRSo/6oeSN5jjB8vk+wLJuFdWGbvP3z2busZm2SCmdiNn2E72yiQBQ58cIXyfm0ZPnTZRPgHzcTICjDAgFM7kGAIqnDwQAKY2KXsIEjVMpfY8WACi3t7ivjf+klNSEVqlMBoAioafq+C24ePsJ/upWEWV1AMCvFx8GecUppyHlNpQXOSHK7DXqBoBuAGh4g5Vf6FQA+PQ5fIZZZJX0KhvQNSWHhuDBs1hs+qYqCn6Y98LIJAAAIABJREFUwgHgwWsg8fS63tkwva0TAKAGJiHblgTo6eu5eZlcIAB4UAKAZVDXJ5uudWNv41ILhNZ1IwUAqPfYrf/fx7Fo75sFAMV4M06UnqjoMaAmxITOmgHgkNoQE0h3mLMXW18nAMz/AehIzWhpNWuPzcTlSgmFzX65inGZPAa94QhyAKiknCKfH/m4xQwIBTKldUkMoBh/vCnyJiijgF7ChAQAN56W8vW1qZAHIxsnz9Vny4Zye4v7GsXyUlGLL+R5rjd5e7JE1gwAV3xZEWXyavcA9lx8GOQVtwUA5YQos9eoGwC6AaDR/TXZda8LAJLUlR5lA+qo79AQPHwWi83fVEWBFA4Alx68hoH/nEAd76yY0basafbRE0jON50edk5KvtqsNAHARzh06R70KmtQW3YBoEogtNEJqD95uyHJqQF/H8efey+hd3Bh9A4uYnX7Jfsu4YeVFg+gXLrOmZuz2hyIjFOWSrSl6WuvLVFSTv6h1XHuXmw5RR7AEmhVIbm3Qq2P9LsopUf/VpL0YqJIQP4PsNQBANh69h6b0oVKkmJm209kZvPc/N6+LGoW1x6PyteJWrrf1C5qd6rl42YCHGVAyP+BiwBggoIH2Zs8gEQo0xsvR4NWkvATJ8MmAExQUuH1Ju5rP7ewAEA1hjHfR2lfCRq3BZfuPJFY68Re11p6LTmMVUeuYWCD4uhcpUCyy+SEKLPXqBsAugGg1rWqWs+ZAPDx0+fwTvAAOgIAt3xbDfkzv6M6ltddQXywnQUA9QSS2wOAepU1XAUAlb7Utdh14D/H8ceeS+hVszD61LIGgHQ0TEfEVMY29cWn5ZM0cZ25Oav1WwSAZ0bVQ2ovTxgBgHJFkfcEDeFOc/dh86kYjGpUAq0rmgMAlSS9mChSocAHWNLVuAewzey92HH2lqJ2tRIj3mz7uQoAysctEuDyuQgAijlIiQVsFACq5epTA4AccuAIAOTQEvFkocq4zbh85ylWfhWI0nm0A8DeSw7jHzcAVNveXtvvbhKIA1PtTAD45NlzlBhqOQLWK21F1/gOCcHD57HY+m015EvhAHDZoWsY8PcJ1C6RFTPbmecB1BNIzstgRtg5jFkXiaalc0pHwIcv3cOsdmVRq4Q+L4a9lysHQttiwhldkkrB2lraouP3hXsuSgQQIoKIhY6G6YiYCslFfZZCAKCoOnF2VD2k8vKUEkFTWpe9/Wsi6/tJmr725kAEgHKy1efz9mFTZAxGNiqBNgYBoKilTP1QkvRiokjFApmwuGsFLSZTrNP2973YfuZWMs1mqqwkrWY2ABTVWbiDs9uVRbDOZ4euHbzqBBbsvoieNQqhr4oHUD5ukQCXN6NrPICiChHp29JeopcwQfOgptZhy4Zye4v72oQWfpJ5mCmsJpWZSC7rWA7VExjdlX/cjCt3n+LvrwLhrwMA9ll6BH8fvooB9YujS1ByDyAz4pkQZfYaFR8cZ76/DT/Er/lCNwB0YMKduYCePnuO4gkAUK+0FQ2JUmRQUPabAACXH7ougQwCWQS2zCqiHqcak5DvOXPbOYxeG4mm/jmlr/Yjl80HgBwIbYsJZ3T8DgNAhZftn3svSuBcAhFNfEEayVycuTmrzYGoO8sAsFD/tYiNf4U9/WoiW3ptAFAuKfdumlSJt2YAOOLjEmgbaMwDKGopU8NKL1smipgFAOWazXRfJUa82fYTwTRPopGPJ7rW3keJfG0wAORxJxHgguBqAEj2Jg/gBQOECREA0oeXkl6vLRvK7S3uaxNaWgCgVqlMpewClcZuxtV7xgFg//rF0DWoYLLHnBnxTIgye426AaD1lLsBoNqbxs7vzgSAz56/QLEhFl1NPdJW3F3vwevx+EUcwv5XDXkzpewj4L8OX5eOGYOLZ8Xs9uYDwO7VC0KNSZj4wtp2HqPWRqBJAgA8evkejHgx7G1caoHQRpekUr4uLW2xt+XrGoUgj7f6Y89FKT5TAhFNfNA6IEkRw5mbs1q/Kck5xXpROTe6Prw8PVB4wFq8jHuF3f1qIHv6t9WakH6XS8q9IwDAzvP2ITQyBsM/Lo52gcm9FVpuIErpUX1WZhCvZQAYWDATFnVx3AMol+yjeykx4s22nxIANBI+Qf21F5ZgCwDyuJkARxkQ8mZM4xISiJiHjzyAxJjVS5igcSZp+ObGmKYlky05WzaU23uWsK9NTACAWqUylfKLMgD8p3slUM4+raXv0iNYefgq+tUrhi+qJgeAiYz4BEKU2WvUDQDdAFDrWlWt50wA+Pz5CxRNAIB6lA240yUGr8eTF3HY9r/qyJMpnepYXncF8cFecfi6RDQILp4Fs9uXM60rHEiuhUnIN529/TxGrolAY78c0rHN0Sv3YSSQ3d7GpRYIbXQCWLLpz84BqFQos+Zm7M0THQ2TN0YCEY190KZCygCAtx89R5mRlhCJ86Prw9PTA0UGrMOLuHjs+qEGcmTQBgBF5qpccafL/P3YGHETwz4qjvaVjAFAUUrPFgBkokilQpnwZ2fjALDdnH3YdjommWQf3ZcJUaISidkvV5FQw4vPCIGKrrVHTJIvbPm4mQBHGRDyZHANABQJFkQCMUKYoHGyhNun5XJjbDPtAFBub3Ffm/SpvzSFWqUyWWFI3AcDx2zCtfvPsKp7JZTSAwCXHcHKQ1dB6i4kkycvckKU2WvUDQDdAFDzi1GtojMB4IsXL1BksMXDcXBgMESRerV+0e/FB63H05dx2P5ddeT+IGUDwJVHrku55moWy4LfO5gPAJU8W7bmkDfKRgkA8NgV/coa1La9jUstEFqLfZXqKGl2ammLj8qVgHJKBYC3Hj0HKT5QiRpTHx4eHigycB0or9/OH2ogpwEAKNfcNgMAilJ6agCwcqHM+KNzgBaTKdZpP2cfwk7HJJPso8pMiBK1iM1+uYo5FbmDRlIo0bX2UhPJBy8ft5gBIbeLAKCYYmVTZLQhwgSNkyXcWpbNjR+baweAcnuL+9pkBoAJTGE1paRGChrjDAD/7VEJJXNp9wB+s+woVhy6YhMAyglRZq9RNwB0A0DDG6z8wtcFAA8MDEbmd9Po6nexQevw7GX8GwEA/z5yQ1KbqFEsC+aYCAD1BJLz5P6+I0rylnxcyuIBJGk1vcoaagBQLRBal6GFyrUmhBmSnLKXdHfh7gtSkm4qI2TSdc7cnNXmIObhc5DmK5ULYxtI/1t04Do8j43Hju+rI1dGbR89YvJiTijN9+66YD82hN/E0I+Ko4NBD6AopUftKkl6MVGkSuHMWPi5cQDYYe4+bD0VA7lkH92XCVFfVisIllYz236iqkoSANSfRJ2u5eTkSuo08rUhHzcT4CgDQq70b7nkCFhMskx5AI0QJmicSgoe4vht2VBub3Ff++UziwdQiRik9Nw1+m0n5KEwFcdswvX7z7C6R2X45kqv9rgm/v7t8qMgrzitQVqL8iInRJm9Rt0A0A0ANS9WtYrOBIC08AsPsuhqOgIA9bwM1cZr5u/ig+0sAKgnkJzHpggABfab1jmwt3E5CwAGTwgzJDlljy29YPcFSaZPAoCNvNG2YpIihjM3Z7V5NgsAKknK8b2/WLAfIQQAGxZDh8rJX1ZqfaTf5QCwXcW8GN7Ix+pSJoo4CgA7zt2HLSoA8KtqBcGEKLPt5yoAKB+3SIDL6SIAKMqs0RGwqwAg29sRANj4t53JyHAVRm/CjQfP8N/XleGTUzsA/N/yo1h+8Aq+q1sUX1Ur5AaAWjYRJ9Zxk0AcmNzXBQD1SFvxcNgbouc4zIGp0H2pFQA8egPf/XUM1Yt+iLkdy+tuy9YFegLJuY05O6Iw/L9wfCR5AB9J2rp6lTWoLXsvVw6EtsWEMzoBNX/eakhyyl6+xPm7LmDIvxYAOLyRN9qlEAB48+EzlB+1CR4edARs8QAa8XqLknKsKMLz323hAaw/GY0hDYuho1EAKGgpU7ttK+SVPKliYaJIUJEPQXJbRkunefulpMNyzWZqT8nLazYAjI2LR6EB66y6b0RHmxpgfepvahXB1zJ9avn8yMctEuByvO8aDyAreJC9ySbEmNVLmKBxKkm4ieO3ZUO5vcV97dcEDyAzhb9QkcpsMnWnlA5LJPQEjA5F9IPnugHgd38dxbIDV/C/OkXRvXpyACgnRJm9RsW5c+b72+gz/LqvcwNAB2bcmQuIFn6RQSF4BQ/s0yFtxcMxEg/lwFTovlR8sP85egP/++sYqhX9EPNMBIAcSK6U4NhWh+fujMKw1eFoWDK7dARM2rqmA8CEQGhbTDjdk5lwQY2ft0qSU3o1R5Xiw7gP83ZGYejqcOmfwz72RvvAlOEBvPngGcqPtgaARuJelSTl5ABwcINi6FTFmAdQ1FKmdpUkvZgoYhoAlGk2vy4ASDkYKRejWKa2Lo36vvp0tOn6H1Ycw5L9l/Ft7SLoUcNan9omAEwYNxPgKAOCqwEg2XtLZIwEAPUSJkQASNKULOFmBACK+9qUVqWlJhKZwipSmQwARUJP+VGhuPnQeQCQCVFuAGj0baDtOjcA1DZPirVeGwDsXxNZNCa2TQSABhiRDkyF7kvFB3vVsWhQbEjVIh9ivgMeEHknOJBcSeLMVocZ8DQgABjz2JC0GrVtb+NSC4TWPZkMAH/aKuUu1Ks5qsQQ5T7wi0MCER+VQIdKSfnwnLk5q81B9INnCBi9CZ4ewPkED6AR5ruSpBzf+8uFB7DuZDQGNSiGzw0CQFFKj9ptHZAHo5pYa7oyUcTR9f/5vP2geDO5ZB/dV4npbbb94uNfoYAMAP7WqjToWdJbvv/rGJYeuGzTUyS2Jx83fwhQBoTs76d2SQygKOFGeQCJMauXMEFjZA1fkqZkCTctAFBub3FfI5tQ0SqV2XTqTkkSUyT0UPwthWGs6VkZ3jm0HwGzXW0Be2bEMyHK7DUqzp0z399617ur6rsBoAMz78wFRAu/6KAQxMNDl7IBD8dITjQHpkL3peKD/e+xaHyz/Cgc9YDIO8GB5H2Ci6BXsH0vAl/LR54NfLNLYCri+gPpWI76pqfY27jUAqH13EesW/2nrZLXUq/mqFKOOG6Xj44kEPFRCXRMIQDwxv1nqDBmk5T/j/IAUjGS+1JUFGFJOR77V38cwNoT0RhYvyg6ByU/rtJiJ1FKj+pTIm1KqC0WjhN01APeef5+hEbcTCbZR/dSyvVo9sv11atXyN/P2gM4pZU/GpbMoWWqrOqoHRWKleXjFkMBsr3nGgDIEm5kbwKARggTNEaWcCNlIlbw0AIA5fYW97XfWlsAoFapzGbTduHgxbuY3iaJ0EMMfGLir+1ZBSVyvK/ZvuzZtXW0LydEmb1G3QDQ2lRuAKh56Sav6HQAODgE8a88dCkbcC+NqCI4MBW6LxUf7NXHo9F32VE4GgRvCwBqYRLytUx6qO+bTTpOjbzxEAs/L48qhc0DgGqB0LonM+ECBoB6JafsxQKlVAB4/f5TVByzGak8PXA2AQAaUb9RkpTj+e/+x0GsOXHDIQAoSumpAUBHY2A7zz+A0IjoZJJ9dN9EQpSg9uKMl2u+H9ZYLV+KN6N4Wr1FzzMiH3dKAICihNvmiJuGCBM0Z4kSbv45wQoeWgCg3N7ivja1dRmpCa1Smc2n7cIBGwBwXa8qKJ5dOwBUi+2UE6KcsUZ5/pz5/ta73l1V3w0AHZh5Zy4gyQOYAAD1KBvwcIzoojowFbovFR/s/05Eo89SZwDAY1i87zK0BJLzADjtST2fbJI3jQDgH58HoHJh7YmVqS17G5ce74aeia02foshySl76SCYPUj9kEvXOXNzVhv3tXtPETh2M1J7eeDMKIsHUEz/kV+j/rUoKceKIokA8M+DWHP8BgbUL4ouBj2AopQetask6bUsgSjiaBqkLgsOYGN4dDLJProvE6JEvWdn2E8OACnlCKVU0lv0eMnl4xbTAWV91zUewCQFjzzYHBltiDBBc8YSbqRMxAoeWgCg3N7ivjatjQUA2kv/JN7jk+m7sP/CXYiEnrIjN+LWoxdY37sKimXTAwCPg7zitj7K5YQoZ6xRNwBMsq4bAOrdmYT6zgaAxQaHIO6Vhy5pKzkA3GcgftCBKdF86esAgHoCyeUAsK63BQCein4IvcoargKAVcdvMSQ5NcZOQlhOIEtjGtSwBD6vnDJiABkAvuXlidOj6hkGgKKkHCuK8Fro8edB/Hf8BvrXK4quVY0dAScHgMklvZgo4mgi9K4LDmCDCgAUCVHOeLm6AgDKxy0S4LK8k8olMYCs4PFZ+dzYFHHTEGGC1qGShJseAMj2dgQAtpi+G/su3IFI6CkzYiNuP36BkN5BKJrtPc37vlqCbzcA1DyVplR0A0AHpvF1AUA90lY8nAL91iD+FQwxiB2YEs2Xii+fNSduovfSI3BUCUF+cz2B5IkAMEH6TASAizoHIFCHtJoaADTSLy0TGzRuiyHJKXuSUCIAHNigODpXSZJEcwaA0DJOqkOsStIjfSuVJ06PTACAQ0Pw8FksNn9TFQU+fFdTU6KkHCuK8IVfLzqI1cccA4CiljK1qyTpxUQRR6UQv1h4ACEno5NpNtN9laTVnGG//P3W4NWrpKmf/KkfGvnl1GQLsZIeopR83KIk4IcuAoCs4EH2pjQwxJjVS5ig+VCScNMCAOX2ZkUf2temt7X2AKpJZbaYsRv7ou5AJPSQDjd9PG3oE4QiWbUDQDWJP2bEMyHKGWuU58+Z72/dC95FF7gBoAMT78wFRAu/+OAQxL7y0CVtxcPhjdhIChkHpkTzpeKDvfbkTfRacgSOaqHKb27kqJVf2HW8s0oewNPRj2A2ADTimdQysVXGbZYkp1Z8GYgyeTNquUSqwwCQvHvk5RMLeyDobykJAF65+wSVf9xiBQBLDg3Bg2exIA3YghoBoJKknBwA9qtbBF9U00Yikk+6KKVHvylJejFRxCwAKNdspvsqMeKd8XLlD0+eB6MAsK+OVEkMAHncTICjD2dXA0Cy9+ZTNyXGrF7ChAgASZqSJdy0AEC5vcV9bUbbslITzBRWk8pkACgSevyHb8DdJy8NA0BbqbmYEc+EKGesUTcATFpBbgCo+TWZvKKzAWCJwSF4+cpDl7QV95KPYowkkXZgSjRfqgQAAwtmwqIuFTS3oVaRA8ltJR1Vup6P7GqXsADAMzcfYVGXAAQWNC8GUC0QWm1ctn6v/ONmSXFg5VeBKJ1HOwAcuy5SYht2qpQfgz+yBoAcg0T3HFC/OLoEpQwP4OU7T1Bl3BakSeWJUwkewFLDNoDy+oX2rYpCWbR5AJUURXh+ey46hH+PXccPdYugm1EAKEjpUbstyubCuOalrEzIRJHg4lkxu73l5WykdFt4EOtP3kgm2UdtKTHinfFy5dhj7v+kln5o7K/fA6gnWbp83EyAo9jpzOlccwQsSrhtjoyRGLN6CRMiAKQ4SpZw0wIA5fYW97WZ7SxrTKtUZssZu7E36g5EQo/f8A249+QlNvYJQmEdHkClWFRxPMyIZ0KUM9aoGwC+gQBw6tSpGD9+PK5fvw5vb29MmjQJVapUUdwnZ82ahQULFuDEiRPS72XKlMHo0aNRvnxSlv0OHTpg/vz5VtcHBARgz549mvdepwPAISF4Ge9hSM+XAaARGTnNE+BARfHBXhceg56LD6NigUxY3NU8AMiB5LZkh5S6zy/jWgkA8OzNR1jcpQIqFsyka7T2Ni49Oqd6bkpHonQ0+vdXgfDXAQB/XB8p5RvrWCkfhnzkbXVLZiHSH+XKJc7cnNXGzQAwbWpPRI6wHAHzSym0bxAKZdF2LMWKInQ9awrzvXstPoRVR6/j+zpF8GV1Yx5AUUqP2v2kTC6M/8QaAPLLmdbcrISXs9r4lX7/8o+DWHfiRjLJPgsAtBCixOB7Z9iPwRf3b2LLUmjin0v3cPTIJcrHzSB0T7+ayJTOyyUxgAwAyd5bTt00RJigSWMSFjGpWcFDGwC0tre4r/Ea0yqV+enM3dhz/o4EQJnQk/Sxpf1Zo34rsdGtAKCMEOWMNeoGgG8YAFy6dCnatm0LAoGVKlXCjBkzMHv2bISHhyNPnjzJNpfWrVtL9QIDA5E2bVqMGzcOK1euxMmTJ5Ezp+VrlABgdHQ05s6dm3j9W2+9hQ8++EDzZuVsAOg9JAQvDABAMR/XwYHByPRuGs1jel0VxQd7fXgMvl58GBUKfIAlXSua1gU9TEK+adJxHHkAHxmSVqO27G1caoHQRieAAaBeyalx6yMx9Q0DgJduP0HQ+C14O7UXIkbUlaaMj6X0eCWUJOV4/nsvPoR/HASAopSeGgAkrzN7Z4ysga/+PIi1x28kk+yjtpTyrznj5crHr9z/CS1KoWlp/QCw95LD+OfItWRhB0rzIh+3mAHhg7ddAwBFCTeKATRCmKCxchomUiZiBQ8tAFBub3FfYy+zVqnMz2buwe7zt20AQO3eduq3mtdRTohyxhp1A8A3DACSZ6506dKYNm1aYs+LFy+Oxo0bY8yYMap7ZVxcHDJmzIgpU6agXbt2iQDw3r17+Oeff1Svt1XhdQFAymifJ1M6zf0UM/IfGlQLH7zzluZrX1dF8cEOiYhBj0WHEZD/Ayz9wjwAqCeQnMctBuRTImjKBahXWUMNAKoFQhu1AQNAvZJT40Mi8duWc+gQmA9DP7b2AHIiWuqTXLrOmZuz2hxcvP0YVcdvRbq3vBA+3AIAjQSms6ScqCjC9+6z5BD+PnId39UpjK+qF1HrkuLvopQeVVCS9FKKzzJys+5/HsKa49eTSfZRW0oKDM6wHxMwuP8/f1IKzcroB4C9lhzGKo0AUD7uRAJc/5rI6CIAyAoeZG8CgEYIEzSHrMRDaiqs4KEFAMrtrUQ00roPtZq1B7vO3YYYz2kk3pb6rRZ3KO+nM9aoGwC+QQDwxYsXSJcuHZYvX44mTZok9rxXr144cuQIwsLCVPfKhw8fIkuWLFIbDRs2TASABP7I65chQwZUrVoVo0aNkurZKs+fPwf9Jy6g3Llz49atW3j/fe25kFQ7nOBB8hu5WfIAbupTGXk+0AcAiw7ZKN1mX79qyJguZQLAjRs3olatWtgYeRu9lh1D+XwZ8efn5bRMj6Y63604nvgC7yKkL7F3MQmVD1gVjupFM+PCrSeIuv0Eiz4vh3L5tMfUMQDk8aVOndrqloP/Dcfi/VfQs3pBfF3DmMas0hiCftomKQ6s7BYA35za5ZkmhJ7BtLAotK2QB6R7K5YZ26Lw08Yz0p/+V7swulaxTgNja4yaDORApYt3niB44g6885YXjgyqKbVUfswWKTB9bY9AFM6qLQaQJOUqj98mKYpEDqtl1SPSpyad6m9qFkC3asbSwCzYcwkj1kQmttvEPwfGNfWxus+f+y5j6OoI1C6RBb995md4VnotPSopl5ANyZZi6f/PSSw/eBV9gwvhy6qWOE56uZptvxJDN+JlXBINmMZKY9Zb+i4/lsjA7hiY1+7l8nEXGbxBYiLv+q4qMqT1NH2MWsYyc3sUxm84I41966kY3euS78Hrp75PVkxuaR06YM+Gcnvzvlaj6IeY0cZfal7rPtR+7gHsOn8HPzf3xcelLLJ+pUdtlhj3G3pVgtacm3Td8DWRWLjnEr6smh99FdSZ5P10xhrluSUHTubMmXH//n3T399a1khKqJPiSSDXrl2Tjm137twpHelyoZg+iuE7deqU6jx2794dISEhUkwgHQlToWPld999F3nz5kVUVBQGDRqE2NhYHDx4EGnSKB+ZDh06FMOGDUt2v0WLFkkg1ezy3V4vPI/3wCD/WGS2dFtTofQvffakkuqOLhuLd6zxh6Y2Xmelw7c9MO+0Fwq+9wo9feJMu/UfZzyx/5YnGuWNQ40cQm4KO3fYHe2BJee94J0xHjFPPXDzmQd6eseioIn4ftl5T+yM9kTdXPGolzvetPEOOeiFey888K1vLHJrwz/Svddc8sSGq56oki0ezfNb92fjVQ/8d8lLqvdRnjgE59Q2j6YNykZDMU+BkUdSIY3XK4wrb1kzA/Z74VGsB74vFYscGh/He8+BIYdSwdPjFSZWsF57f571xL4YT4fGHXbdAysvWOaPSrkP49GmkPUcb7/hgb+ivFDqg3h0Kmp8Pcw77YnDtz3RLF8cgrJb22nRWU/sjfFEwzxxqOVEG36zx0vKXMCldcE4lM+if83MP+2JQ7c90SRfHKrJxiJfEvJx99pt2ftGlInF+y769t101QP/XvKS7B1+1wOPYz3Qr1QssmlclzzGbdc9sOKCF/wyxaNjEe1rQ25vcV/rWszSztLzntgV7Yl6ueJQN7dtG/0W7onT9z3RtlAcyn5oqff9Pi88i/PAAL9YZHlb+9O+IsoT2254olbOeDTMk3w8u6I9sPS8F3wyxqNLQj+1t66v5pMnT9CqVSs3ANQ3ba+3NgPAXbt2oWLFpONB8tYtXLgQkZFJX9dKPaP4v7Fjx2Lr1q0oWbKkzc4TuYTA4JIlS9C0aVPFeq/bA+g/ajOex3kgtHdl5NVxBBwbF4/iQ0OlMezvVx0Z0qU8BCh+2YWeuo2eS4+hbN4MWNw5iajj6Er79q/jiUH8nSvn09QceUno67lakcySqgb9t7hzOZTVkVaFbmTvy5W8PeT16VGtAHrVNOZZUhpM5fFhkuLA390qwCendsQ6MfQspoadR5uA3BjSsLhV09PDzuPn0LPS376tVRhfBKUMD+CF249Ra9JOvJPGC0cGWjyAFcZulWKt/uteUXNyWvKYkueUJOUibHgA+9QogK+qG7PTvN0XMWpt0kdq41LZMb65tRbwH3svYdh/kahTIgumOOAB7L30WKJ0XfuK1l6zH/4+gRWHruGb4ELo5kQPoM+wUDyPTXqxj23ijWal9bOAey87lqjC0kE2Fvnal4+78KANUpXd31dF+jSu8QDO2hGFcSFnQPbeevoW7j19iXVfB2pmp/MYyVvQIUF8AAAgAElEQVRGXrO63lnx66faPYBye4v72qy2Fi3ggavCsfTAFfSqURA9qts+iWg/7wB2nbuDn5r5gNLRUPEbuQmPn8dhY+9KyJfpHU17K1Uibzh5NbsF5cc3tZITq5bsv4JB/4YjuNiHmNba3yleau6s2wMIpHgPoCNHwD/99BNGjhyJ0NBQlC2rnl6hcOHC6Ny5M77//ntNC9rZMYC+Q0Okr6wt31bT5WZ/GRePwgPWSWM4Org20qdQALh27VrUr18foZG38OWfh6Rj1uXdkry8moxgpxIHksvTl9hrV0xDQGlgCAD+1a0iyubTTg5iAMjjS3YEvOoEFuy+iJ6CLqujY6XrA0aHGpKcmrDhFH7ZfBZtK+SVUoiIhdmM9Dd5Oh1nxueozcf5mEeo8XMY3kuTCseH1ZGqs0C9nnQbSpJyfO9vlh1OBE1fBxdV65Li76KUHlVQkvRiogjpT7NOq5GbEZFq9dFryST7qC0lRrwz7Mc6vNz/cc1LokXZ3LqH02PRIfx37DqGfFQCHSslfXQoNSSOm5js+futlapRBgQCgLaeQ92d0nGBKOFGMYB60xPxrZhFTtKULOEmdsOWDeX2lqdXoTa0pqNq+/tebD9zCyKhx3vwejx+EYet31ZDPo2yi3RP1h/+slpBfF/XOtyEfpenq3HGGuX5c+b7W8dScWnVFA8ApRdbQICUyoVYwFxKlCiBRo0a2SSBUMoYAn909Fuhgnpqkdu3b0tHzTNnzkwkiqhZxpkLiBY+Bdo+jfPQpWxAfX4RGw+SQ6JydEhtpH87ZXoAeWPedOoWuv1xSPKy/fWleQBQTyA521pMREoA8OLtJ1jxZUWUyWseAFQLhFZbd7Z+Lz8q1JDk1ISNp0HapW0q5MHIxtbeKVY0oHumJAB4LuYRahIATJsKx4daAGC5UaG6E+4mKooIknI8v98uO4K/Dlni5noaBICikgq129gvByZ9aonB4sJEkQa+2fFba4t3xkihVEr/Hr2WTLKP2mJCFL106eVLxRkv1+KD1uPpy6Sj9HHNSqJFOf0AsPuiQ1hz7DqGflQCHVQAoDjujoH5UKC/BQBSBoT3XQQAOYE62ZsAoN4E5Wx/lnATFTzEtWHLhnJ7yxMsUxtaE9IzABQJPSUGr8eTF3EI+1815NXhARy+OhxzdkahW9WC+KFecgAoJ0Q5Y43y/Dnz/W3k+XXFNW8EAOQ0MNOnT5eOgQmkUa4/SutCx7bE7CXwxoxgOvalmD6KzaN0MFwo5o/+e/ToESier1mzZsiePTsuXLiA/v3749KlS4iIiMB772nLIebMBSQCQD3KBjTW57FxKDpwvTTsY0Nr4/20KR0A3ka3Pw5K6hWkYmFWMQIARSkiAoCX7hAA1KesofZyZRF2NQkmvfPAAFCv5NTEjacx+Q0DgJSfMXhCGN5PmwrHEgCgkfErScrxvP9v+ZFE4sRrAYA2mJ5a14G99c7KGvTSpZev2hrVek95PQYG/Pcfm/miZbnkqbrU2rfHaJZfK46bkpkzAKQMCO+95eESD6Ao4bYp8qZuicJEAJggTUnKRKzgoQUAyu0tl1ijNrRKUrabsw/bTsdACQDqzVAx4r9wKbehLQAol6xzA0C1J8Wx398IAEhDJO8fATuK1fPx8cHEiRMRFBQkjb5atWrIly8f5s2bJ/2b/v/FixeTzcyQIUMk4Pf06VMphczhw4dBqWAIBFavXh0jRowAsXq1ltcFAPUoG1Dfn72MQ7FBFgB4fGhtvJfCAeDm07fxxcKDKJ0nA1Z+lQTYtdrBVj17HhFb14hi5JQHkKTV9CprqL1cGQB2r14Q/6uT/CvY6LiNeMDoXpNCT2NS6Bm0DsiDUU2sPYAsak/1vq1dBD1qJMXtOHNzVpuDszcfInjCNsm7TV5uKkaOwFlSTlQU4Xt/t/wIlh28ij41C6FXLWNHwKKUHrWrJOnFqT5s5XpTmwv+3V7uPFbWEFP5OMN+fDTIfRrb1BefltcPAO3lNJTPhzhuOi6mPIBUDg+qhXddDADJ3psjbuLh81jdoTw0BvaI2coRacuGcnuL+9qCTpY4a61Sme3n7EPY6Rj89EkpKY0RFfb0bv+uOnLryFAx8r9wzN4RhS+qFkC/etbxxtQuezz5yNsZa5TXjzPf31qfWVfXe2MAoKsnSun+zlxAtPBLDQ3BEyKB6FA2kAPAE8Pq4N00FlZcSirig80A0D9PBvxtIgC0FxNlay54o6xSOLMkBUfSanqVNahtexsXA8CvqhXEdwpxMEbtZCQGju41OfQMJoaeRquAPBgtA4B0NExHxFS+qVUEX9dMGQDwTPRD1Jq4TSI4HRlsHAAqKYrw/H//1xEsPXAVvWsWQm+DAFCU0qN2lSS9ONmvLbUHrevBnnoG/yaquTjj5SoHgGOa+uIzAwCQ1T2GN/JGu4r2CVziuCkGsFBC/PORwbXwTmrXeAA59pPsTUfAjwwCQDWVGFs2lNtb3NcWfh4gLSmtUpkd5u6TUtmMb14SnyTEc3Ksp14AOGpNOGZtj8IXQQXQr35yACiPeXTGGnUDwKQdxQ0Ate6uCvWcDgCHheBJrGMA8OSwOngnhQPALadvo+vCgzAbAOoJJGfzrjx0BX2XHYUIAPUqa6gBQA6ENh8AbjQkOcUgj17U9MIWC4ND+psoI6Y2RgceK02XMgDMmC41DicAwAqjN+HGg2f47+vK8NGYB5EBoKgokgQAjyayJPvUNuaplQNAJZAnggUlvVdNE0L2WXoEKw9fTabZTNcrgUNnvFx9hoRIYIeLowBwRCNvtFUBgOK4O1TKZ0WAI/6bK0ggIqjfkgAA9RImaA6VJNzE9aAGAJkAJ+5rcgCoJpXZce4+bDkVA5HQU3TgOontveP76siVUXtum9FrIzBz23l0DSqA/nYAIBOinLFG3QDQDQC17ql26zkbAPoNC5HyR+mRtqIOP30Rh+KDLUfAbwIA3HrmDrosOAC/3BlAYMuswoHkWpiEfM+/D19Bn6UWAEgqIBQjZjYA5EBoW0w4o+MvM2KjlAZlfe8qKJZNexqYJACYG2OaWqdK4uNhCUQEF0EvIXmrMzdntTk4Hf0QtSdugwgAK47ZJCXCXt2jMnxzaUuErSQpJweAPWsURF+DAFDUUqZ2lY55OV5MyTuoNg/i7wyE5JrNVEeJEe8M+/kOCZGOO7mQR5k8y3pLt4UHsf7kDYmVTux0e0Ucd4fA/EkEuMG14WoASPYmAEiMWb2ECREABhfPCpZw0wIA5fYW9zUGgFqlMhMBoEDoIZIhkQ2NAsAuVfJjQIMSyczKjHgmRDljjboBoA4A2KlTJ9Vn18PDA7///rtqvf9rFV4XANzQJwhFsmojptAcP3kRixKDQ6TpDh9eB+neStlHwGFn7qDzggMolTsDSMbMrMKB5FqYhHzPfw5fRe+lR1C5kOUImACgXmk1asvexqUWCG10/CyFFtI7SHMePLoXx/l9Wi43xjazBoBMEJFARHBh9A5OkkRz5uasNgenbjxEnUnbJJlDCvanEjhmE67df4Z/e1RCyVwZ1JqQfleSlOMLf1hxFJSXjBRb+hqM1RSl9KhdJUkvBoBK8YGaBpFQiQP/5ZJ99LMSQcQZ9qPUVaQQwWVUEx+0DrAP4JTG+MXCAwg5GY2RjX3QRg0ALjuClYeuSlKF5AFkAhzFhqZL5RoPoCjhRgCQGLN6CRM0L0kavlkwu31ylSRbNpTbW9zX/uhsOQLWKpXZad5+6RhbJPSw5N/OH2ogZwbtmaDHrI3AjG3n0blyfgxsmBwAJjLiEwhRzlijbgCoAwCK8mvyB5U0dinHHiVIpv///1txNgD0HxYiKRvofaE/fh4L7yEWABgxvC7efitJiSCl2Eh8sLedvYPP5x9AqVzpsapHZdO6yIHkwz72RvtAbYmgVx25il5LjqBSoUyIinmsG1Bw5+1tXGqB0EYnwH/4BklySu8HA6d6aVk2N35sbg0AOUWMBCJqFkafWikDAEbeeIC6k7Yj0ztv4WACADSihXzh1mNU+2mrJCl3MkFTmOe/34qjkmTf19UL4Js6yeOVtNiJNWG5rlKqFzFliDxFjJZ7cB17L3QmRA1sUBydqyRJwZl9PMoasdwnLQBOaYxdFxzAhvBoaAGQ4rhJz5oJcJQB4W0v1wBAMbUPgSdKjaM3Xo7mhbVxaxbLgt87aAeAcnuL+9qfnS1p0ex9MIg2+XzefhCTWST0FB6wVpL82/VDDeTQAwDXRWBG2Hl8Xjm/lK5IXuSEKDcA1LMD6K9rOAZw1apVUuoUUuqgxMk//PCD/ru/4Vc4HQAOD8Gjlx66j/QoBodicahEjqiLtKlTNgDcfu4OOs07gJK50uNfJwBALYHkvBR5owwsmEnyAOo9UtQCANUCoY0+FgwA9YYMcLLnNwkARlx/gHqTtyPzu2/hwECLB5ABoJ4jewaARJQiwpRY+q88ikX7HAOAU7eexbj1SUog9gCgUpJoPWvB3pEeE6LopUsvXyrOeLmWGrZBSnrMRcsRrtIYKSRkY3i0REpSO0IWx00kEDEDQloXAUDxKHNTZDSevYw3BACX7r+E71ccR41iWTBHBwCU21vc1xZ1SQCACTGjSiEDok06z9+P0AhlALi7Xw1kT6/dAzh2XSTIK24LAMoJUc5Yozw2Z76/9Ty3rqyrGwCSJi8BPkqh0qNHDwn4ZcyY0ZVjcNm9nbmAaOH7JwBAPcoGNBkPn72E71CLHNKbAAB3nLuLjvP2wzdneqz+2jwPIDMJtQSS8yKiRLr09VyxgAUA6iUVaAGAaoHQRhe03/ANuPfkpW7WOAPAFmVzYVxza7kpVgmhPvWsWVgigmgZo9ExaL0u/NoD1P+FAGAaSfGBSuUfN+tmbZONq/+01UpRhPswYOWxRMm+b+sa8wCKSirUrpLaBxNFmvrnxISWflqnIFk9ZnUqBfUzIWpwwxLo5EQAyGswEQBqIHEoDbjz/AMIjYiWSElqLGJx3JQHkAEgAfo0nq9cQgJhNivZe1PETUOECZqXZfsv47sVx1C96IeY2zG5TKYtgCS3t7ivLe5qAYD2WOPWADC5LQr1X4vY+FfY068msqXXLlT/4/pIkFec7DT4o+QeQDkhyg0ADW8Hmi7UDAAp6TKBvfXr1/8/9q4CvIqja79JkAJFiru7u1txaSmlBQqFFmkpdceKe/FSSnEpUlqstFiw4CS4kxAIwV2CBs3/nL05ydzN3ruzmzvk8n/M8/T5PrKzO3NmZmffe+a859USLw8YMADZsztyAv2vFtUAsOxAf9x57IOVX9VA0azyQf23I0lFxAEAQwY3QtJE3u0BZABI+rXLv6zhseVkJZBcDwAr502rAUDS1rXCKpUBRwwAXQVC2x0A9r5YzRvJXqqW5bJjZEtnADh6TQh+3eDQAtZL16ncnM3G4MiFCDQdvxUZUibFrp+cAaCVvI0xknKCogi33XvpQcwNOovPa+fFjx4CgEaSXkwUaVE2G8a0sg8A3eV1MyJEqZg/PQC04n13Bh0Or5MMABTtJmAhEuCSJBAAFPPZ0fGpHcKEBgB3n0W3RQdRu1AGzLIAAPXzzQCQ9rUFXapoQy0rlWnkjaVci0+fRSGoV11kSiUPAEesDsbEjSdBntp+bxaL85rrCVEq1ig3qvL7bbZ/ect1UwB49uxZ9O3bF3PnzsUbb7yBoUOHokgRe7+GvcVoT/VD5QKihV9uoD9uxxMAHh/cGEkS+XrKZI89R3yxt4bdRMeZu+BpAGglkJwNIy1VOj4RAaBVZQ16lruNiwOhPQ0AOf7KqnIMx6lRkldK9iqWUf4hmBDgAIBf1smP7xvEJkRWuTmbLTQGgBlTJsXOaABYY8QGy4m7WVJOVBThtvssPYg5QWfxWa286GaQtNasj3Rd7wE0kvRiosg7ZbNjdCvn8Zdpg+u4U3YwklZTMX8chsB9ii8AlEkkLdpNwEIkwCX2SRgPoKhosSHEAQCtEiZoDI0k3MQ14WoO9fMt7mt6ACjGhRqtN6N4zLw9V+BZFLCzV11ktAAAR/oH47eAk6BYzf7NXANAJkSpWKMvAWDsLJsCwOTJk4NYvl9++SWqVnUt09WsWTMre9X/i7rPCwBaBSAUg0PeICovAgDcFnYTHWbuQrGsqbDiK895AHnjshKIvvzgBXwxfx8q5XF4AK/ceQir428KAKMDoV0x4ey+HMzAtAsAjQAIb9jUJ710ncrN2WwMDp+PwBu/boUIAGuOCLAs3WckKacHgJ/WyoPujeMeV5n1ka6LWsr0byNJLwbgSgHgvL1YcchZW1fF/DETncfGCgFLHE8mHshIyYkAkIAFE+AoA0JCA0Ca74Dgq3j09JllwoQIAGsVzIDZ0QoeUgBQN9/ivvbXJw4PoKxUptE+mqfnCkQpBICsma1ijb4EgBYAoK+vufeIAOJLFrD8Ea3Mh4MWfvmB/oh47GP5CDLi/mOUGugAgKFDGiOxn/kcyvTJk3XEF3v7qVsguaGiWVJh5deeA4B8dCHDJGTbSICefj1XjAaAV+88tHwEbwYAzQKh7Y4z52Db8H0t5M3wqvRj2ANldATJRzb0ML10ncrN2azzDAAzpUqKoF6OI+BaIwNw+jppN1dBuVxpzR6hXTeSlIsBgP8cwpzAM/i0Zh50b2IPAIpSevRcI0kvPoI38sBKGRFdqcfig1iw62wcyT66bMSIVzF/nIuS+20lBZNoK6ceGSHknnM1FqLdHarliSHAUQaERD7PEiQGUJRwCwi5ojFmrRImyF7W8K1ZMANYwk0GAOrnW9zX/o4GgLJSmXySIhJ6cvdYoXVj5091kTGl/BEwnyh8WCUXBrxVPM6UMiOeCVEq1uhLAGgBAFrZgP7X6qr2AJYf5I+IR9YB4K37j1B64FrHB25IYyTycgC449QtkOB4kSypQIQXTxUOJJdhEnKbKw9dxGfz9qJi7rQIu3YP1+4+1PpEfbNS3G1cZoHQVtoR67IKQ8APtZEnfQrpx8TEoBmQELivGojQSdep3JzNOn/oXATenLAVmVO9gsBedbXqtUcGIPz6fSzqWgXlc8sBQCNJOW677z+H8EfgGXStmQc9bAJAUUqPnlu/aCZM/aC8k3l8TGwUg2k2DuL1nksO4s+dZ+NI9lEdI2k1FfNXfrBDjYaLlSTsoi1G6hOuxkK0m/IAigQ4PyQMABQl3CgPoB3CBNlrJOEmjoOrOdTPt7iv/d3V4QGUlcqMiaUWCD0MACn+luJwZQvHFH9QJRcGGgBAPSFKxRrlvqr8fsuOR0LXMz0CTugOenP7KhcQLfwKg/xx65GPJWUDGq+b9x6hzCAHADw5tAn8fH28bhjFFzsw/BbaT9+JwplTYvU3NT3WVytMQm501aGL+HTeXlTI/Zp2BEwfM6vKGvQsdxuXWSC03QFgAGhVcsodC9VbAeDBc7fQbMI2ZEn9Cnb0dABAYvPSnC3sWgUVLAJAUVEkBrwsO4TZO+IHAFlKj15BiplyBwCNWNhW1kLPJYe0xMF6yT56htFHXMXHlfWoud8i69iKLUb6s64BYKzdFAPoDQBQlHCjPIB2CBNkr5GEmwwA1M+3uK8t7OoI5ZKVyjTKpsAAkBj4xMSXLZxVwBUA1BOiVKzRlwAwdrakAeD169eRLl067U4ihkydOhUPHjzAm2++iZo1PffRll1I3lDveQFAK8oGNC437j0CxeJQCRvaBL5eDgCDwiPQbnqQAgAYN3+V2bpZffgius7di/K5HACQpNWsJuI2A4BmgdBmfXR1vVjf1bYkp/THLuLz+bia/qaXrlO5OZuNwYGzt/DWb9uQNfUr2B4NAOuM2qh5bemIi47wZQpLyomKInxf/2WHMGvHGXxSIw96GshWyTyfpfQS+fpoXiAjSS93eRhl2uA6vZYe0rRj9ZJ9dN3oGE/F/FUYsg4UNsFFzDtoxRYKCdl0/KpGSqKjcXdFtLtj9dxOGRB8oxLGAxir4JEJG4Iv2yJMkM0s4UbKRKzgIY6FqznUz7e4ry361AEAjYhBRuPMx8lM6ImKikKeniu1qnt610M6KwBw7XGQV5zk/ehIWV/0hCgVa5TbVPn9trLWE7KuKQA8dOiQBvII9BUoUAALFixAo0aNcO/ePVB8IP3vokWL0Lx584S0I0HaVrmARA+gVSmy63cfotzgddqYnBrWRCPxeFsRX2wGgIUypYT/t577MWElkJzHhzfKctEAkMC0VWUNepa7jUsVACzad7UtySlOvcCB1+JaGRZNWKG/da2VDz0aF465rHJzNluv+8/eQvPftmkyVMSupMIA8K8ulVEpr+PHqllhSTlRUYTvGfDvYczcfhpdauRGr6ZxGYtmz6brLKWXxM9XIwLUKxJX0ouJIkZSfDJtcJ2flh7CvKAzcST76LpRIL+K+dMDQDOGqSv7KCRksyQAFO3uWC2PEwHOJ+ppgsQAsoIHzTelgbFDmKCxYQk3UiZiBQ9xzFzNoX6+xX1tMQNAA2KQ0XywpCYTep49i0LeXg4ASDKM9ONJtvD70K5yTgxuXiLObXpClIo1yo2q/H7LjkdC1zMFgI0bN0aiRIm05M+UCmb58uVo0KABpk2bpvWd2MF79uxBYGBgQtvy3NtXuYBo4Vcc5I+bj3wsa9GKADB8eNPnPi4yDYov9s7TEXh/WhA8DQCtBJJzn1cfvoSuc/dABIBWlTXoWe42Lg6EdpUKQWb8jOoU6bPaluSUOy1aTllD7X1SKy96CulQVG7OZmNgCABHb0TY1XuwAgBZUk5UFOG2B/57GDO2n8bH1XPjpzfiCQAT+WqpQIwkvZgo0qZiDgxr4SzFZzYO4vXe/xzC3ED3AFAkRKmYv4pD1mnMeS7xBYCjW5bCOyYeQNHujlXzOBHg8CxhACAreNB8UxoYDQBaJEzQGBpJuFkBgDzf4r6mB4BmTG29p5COsykPIJV9ferjNQsAkD3i71fKiSFvuwaATIhSsUZfAsDYFWQKANOnT48NGzagZMmSuHv3LlKlSoWdO3eifHlHIHNwcDAqV66MW7duWdmr/l/UVQ0AKw32x42HPrAibUUDS8QFisWh8iIAwF2nI9B2WhAKZnoVa76t5bG1YSWQnBv1P3IJn8zZg7I502hHwKStu+67msifMaWlfrnbuDgQ2hUTzlJDQuXCfVbZkpzSZ98X2+ek1RoArJkXPZvE5gBVuTmbjcG+Mzfx9sTtyP5aMmzt7vAA1h29ESev3sOCLpVRWdIDGCspF6sowm0P+u8wpm87jY+q50ZvmwCQtZSTJvLV1CCMJL2YKEKKF5T42G7p889hUP45vWYzPc8oma+K+as0dJ2WPD2+ALD99CBsCb2GMa1KoUVZ90fAot0UAygS4KISCACyggfNN8UAUrFKmBABIElTsoSbDADUz7e4ry35rJr2CP3Rrqt1p48VfPL0GfL/tEqrvr9vfaRJLu8B5JhYkvcjcp6+6JPSq1ij3KbK77fdd/h532cKAOmY99KlS8iYMaPWt5QpU+LAgQPIm9chKH758mVkzZr1ZRqYVNZYomYTTQufAeDSz6qiTE55uT2KwaGjGCovBAA8E4G2U4NQIOOrWPud5wAgB5KPeLckWpXPYTbk2vU1Ry6hy5w9KBMNAO1Iq9Fz3G1cZoHQUh01qFSo9yoNZFgVnWcA+GaprPi1TRmnJ7NuMf2xS8286OUlAHDvmZtooQOA9cZsAuX1+/PjyqiST+4I2EhSjgeAAWDnarnQ58248Uoy88RznSyxn+adNZL04o+ipwCgXrKP+mnEiFfxca08dL0mn8jlpyZF8HFNx7fCSmEAOLZ1KbxdRg4Akt0dq+aOIcBRBoSEBoA03wEhVzXTrRIm6B72AJI0JUu4iePoag718y3ua0ujAaCsVKZeVu7x02coEE8A6Gqt62UpVaxRHr+XABCQAoAE8jJkyBADAA8ePIg8eRyC4i8BYGpERERonlFPFlr4lQf74/pDH1iRtqI+XLkTiYpD1oNC/04N8/4j4N1nbqPN1EDkz/gqSMbMU4UDyUe+WxItJQEgCdDTr+fSORweQEqqbVVazRQAmgRC27W/YO9VtiSnWID9jZJZMKFtWafmBy8/imlbT2l/0yuXqNyczcZgz+mbeOf37ciRNhm2dHN4AOuP2YTQK3cx/+NKqJovvdkjtOtGknJ8oycAIHt7UyTx0wg6RpJefCzmyisiZQiAvssO448dp+NI9tH9H82OK62mYv6qDFuPixGxALBXk8LoUjOfrAkx9dpNC8LWE9cwrnVpNC+Tze39ot2UB5AJcJQB4dnTJwkSAyhKuG2MBoBWCRNktJGEmxwAdJ5vcV+jEyUqslKZnC6GCT0UykB7DZUDfRsgdfLE0vMb6+02DnfQE6JUrFHu7EsAKAkAKQ4waVIH1fu///5DnTp1kCKFI8/Yw4cPNX3gl4mg1QFAitmgmDTZcuV2JCoOXQ8i/4a9AABwz9nbeG9KIPJlSIH139eWNdO0nhUmIT9s3dHL+OiP3ShFAPDqXdyOfAKryhr0LHcbl1kgtKlhLiowALQqOTVz2ykM+O8oXiwAeAPv/L4DOdMmx+Zur2sj0mDsJhy/fBfzP6qEqvmtAUBRUYSHd/DyI5i2NRzx8QByvGfKpIlw5+ETtwDQVVyU7Hrot+wwZu84HUeyj+5nQpQorabi41p12HpcEABgz8aF8Ukt6wDw/WmB2HbiOn55rzTeKu0eAIp2EwlEzIDwNIEAIEu4UQJnIrNQsUqY0L630dKUpEzECh4yAFA/3+K+RqRCKrJSmfqE0U4AsF8DpE4mDwDN4l31hCgVa/QlAIxdQaYewI4dO0rtPzNnzpSq9/+pkspfEKIH0IqyAY3v5duRqDR0vZb/j34Fe2MRX+y9Z2+j9ZRA5M2QAhs8CACZSSgTSM5jtP7YZXSevRulsqfWUorciXwCq8oaZgDQLBDa7nwV/GmVLcmpWR+cb28AACAASURBVNtOof9/R9G0ZBb8pvMADlp+FHRETEUvXadyczYbg93hN/DupB3IlS45Nv3oAIANx25GyOU7mPdRJVSTBIBGiiLc9pDlRzB1azg6Vc2Fvs3sHQEz45u0hunHhJGkl6d+EPT/9whmbQ+PI9lH9jAhSpRWUzF/1YZvwPlbD2Kmj1jjxB63WtpODcT2k3IAULSbYgDFDAhPniSMB5AVPGoUSK/FMlKxSpige1jCjdIasYKHDADUz7e4ry37orr2CCONX6N50kvGPXzyFIV6r9aqHuzfAKlekQeAZox3PUBUsUZfAkALANDqi/u/VF81AKwy2B/XHvpYUjag8b8UEYnKw9aDco+deJEAYPoU2PCD5zyAVgLJ9QCwZPbUOHX1nua1saqsIQsA43vkp3/XCvy00pbk1Ozt4ej37xE0LZEFv73vfAQ88L+jmLHNAQA7V88DOgbionJzNttHdoXfQMtJO5A7XXJs1AHAuZ0roXoBOQ8gA0BRUYTbHrriCKZsCUfHqrnQzyYA5KTfaZInBsWTGkl6MVHEVW40s7Hg6wyE9JJ9dD2GECVIq6mYPz0A7N6osJY/0mppMyUQO8KsAUCymzyAIgFOhY0ytrCCB+Xvo6NsuwAwRsItd1qwgocMANTPNwNA2tf+jQaAslKZ3yzYh3/2XwAzuiMfP0XhPg4AeKh/A6S0AADNcl7qj4hVzp/K77fMGvGGOqYeQG/opLf2QeUCooVfZYg/rkXaB4CJ/XwQOsT7PYD7zt1Bq8k7kFcRAJQJJOc1RklbO83aDREAWlXWMAOAZkw4u+s9f6+VtiSn/tgRjr7LjqBJicyY+H45p+YH/HcEM7eFa3/rVC0P+r7pXQCQJO8IoFNpNG4zgi/dgRUAyJJyoqIID8CwFUcxecspdKiSE/3fssfOZQBISiPEKCeP0JzOlZzG2FOkIJ4rtwBQIESp+Lh6GgCOb1MGzUpldftKiHZ3qJrHiQCnwkaZ95MVPIi9S55MKlYZs3SPkYSbJQAYPd/ivqYHgGZSmd/+tR9L950HE3pEAHh4QEO8mjSRzJBodfQkD/2Neka8yvlT+f2WHpAErmgKAC9evIgJEyZgyJAhWlerV6+O+/fvx3Tbz88P//zzD7Jlcx+nkcB2Kmle5QKihV91iD+uRvpYkrYiQy9GPECVYRtAyWePD2msxPb4PlR8sfefv6N5c8SPeXyfT/dbCSTn9ki3s+OsXSiRLbVGArn78Ak2/VgbudLJa+uaAUBPpf3QjxHl5rIjOTVnRzj6LDuCxsUz4/d2zgCQvUrUFh2v9XszNh+eys3ZbP53nroR50cDA8A5nSuiRgEHac2ssKScqCjC9wxfeRSTNp/Ch1VyYoBNAMhSepQsl5KKGwFAT6UFYm+tXrOZ7DGSVlMxf9V/3oBzN2OPgLs1KoTPauc3m4Y419+bsgOBYTc0Vjqx090V0W7SAhYJcCpslDGGFTyIvUueTCpWCRN0j5GEm9i+K/v08y3ua/996TgClpXK/O6v/Viy7zyY0PPg0VMU6evwAB4Z0BApLABAfZoX/VjqfxyrnD+V32+ZNeINdUwBYJ8+fXDjxg389ttvWn8pDUynTp2QNq1DamnVqlUaKBw1apQ32PNc+6ByAdHCrzbEH1cifSxJW9EAXLj1AFWHvzgA8MD5O1o8l3ic54mJ5EByGSYhtxcQcgUdZ+5C8WyptCNgYm56GgCaBULbtT1vzxWa5FRQr7rIlOoV6ccwAGxULDMmtXcNAPWJq1VuzmadDwq77ogbFbzGjX/ZAsrr90enitpRq0wxkpTTA8APKufEQAPVApnns5QeJZomXWkjSS8misQ3LyQDIb1kH/XTiBGvYv5qjNiAszdiAeCPDQvh89etA8DWk3cg6NQNTGhbBm+UlAOAZDelgSECHGdAUGGjzLwzACTyBtmhAUCLhAkRAJI0JUu4yQBA/XyL+9ryL2tEA0A5qUwGgEzouf/oCYr29Y8XAOREz/qx1MdHq5w/ld9vmTXiDXVMAWDp0qUxcuRI1K9fPwYAinkA/f398d133+HIkSPeYM9z7YPKBSQCQCvKBjQAFIRNRzFJEvni+GDv9wAevHBHY3SKAf2emEgrgeTc3saQK+gwcxeKZU2leQDvP3qKzT++jpzpklvqkruNyywQ2lJDQuU8PVfYkpyi5MGUTLdhsUyY3N6R4J0LMyzp394EAAPDrmvMcZE41OSXLTh68TZmd6qokS1kipGiCN/388qj+H3zKbSvnBODbAJAltLLkDKpppFrJOnlKWlAJuzoJfvIHiNpNRUf15ojAnDmRuwJkV0ASCEh5OUlUhKRk9wV0W7yUhMBjjMgqLBRZl2xhFvF3GmxM9wBAK0SJugeIwk3GQCon29xX1vxlQMAykplfvf3fizZe16TgaS1de/hExTr5wCARwc2RPIk8kfAeqk3/VjqCVEq50/l91tmjXhDHVMAmCZNGuzduzcm8XOLFi3w+++/I1OmTFr/w8PDUbRoUadjYW8w7Hn0QeUCooVffag/Lj/wsaRsQHafu3kf1X8OAKkPhLwQAPCultNNTOnhifmzAwBJgJ5+PRfN4gCAlLzXamJl6ru7jcssENqu7TEA0KLk1NzA0+j9ggHAHSeva7kjxdRBTcdvwZELtzGrYwXULuRIXG9W3ALAVUfx+6Z4AsCVxzB5cxgypUqqKWSoBICcs1Ev2UdjwIQokRGv4uNaa2QATl+PBYA/NCiIL+oUMJuGONdbTdqhAaeJ75dFkxLuAaBoN8WpihkQVNgoYwwncCbP3e7TN7VbrBImHADQIU1JykSs4CEDAPXzLe5rK792AEBZqczv/z6AxXvPGQLAYwMbIVkSP5kh0epM2nQS5BV/p2x2jG5VKs59ekKUyvlT+f2WHpAErmgKAF999VVs2bIFZco4KwRwv/ft24caNWpoMnH/a0XlAhIBoBVlA5qDszfuo8aIALyS2BfBg14ED6ADAIpJfT2xlphJKBNIzu3xRllEA4B3bUmryQLAVuWzY8S7cTdBu7bn7rFCu9Wq5NS8oNP4aelhNCiaCVM+cPYAcpJdeq7+iFLl5mw2BttPXtPUY8Tk4QwAZ3asgNclAaCRpBy3PWLVMUzcFIb2lXJg0Nv2NHpZSo9IJpQg2UjSi4ki+hhLszHQX2fVFr1knwgARWk1FfOnB4Df1y+IL+taB4AtJ23HrvCbUgBQtJtYwGIGBBU2yswLA0DK30pJy+0CQJZwI2UiVvCwAgB5vsV9bVU0ADRihhvZ9sPCA6C0Nszoprjo4tEewOBBjfBKYnkAOHnTSQxbFYwWZbNhTKvScQHgmhCM33ACzIhXOX8qv98ya8Qb6pgCwHLlymkxf59//rlhf8ePH49Zs2ZpXsL/taJyAYkA0IqygQgASX7q2KBGXjkt4ot96OLdOLJenui0lUBybo+SttLxSeHMKTUPIEmrbe3+OrK/5rkjYPYAtiyXHSNbeh4AWpWcmh90Br2WHkL9opkwVQcAWWeVxueDKrkw8K3YfHgqN2ez+d9+4pqmHy3KB77x6xYcPn8bMztUwOuF5TyALCln9ONj5Opj+G1jGNpVyoHBNgEgg5NsaZJpoRlGkl5MFNGzrM3GQH+dwaZeso/qMSFKZMSrmL/aIwMQLngAv6tfECTRZrW8+/t2zXP2+/tl0djEAyjaTSCaCHCcAUGFjTK2sIIHAbd9Z25pt1hlzNI9LOFGykSs4CEDAPXzLe5rq7+pqT1CVirzx4UHsHDPOTCh507kY5Tov0Z7hlUAOGXzSQxdGYwWZbJhTOu4AJAJUbzXqJw/ld9vmTXiDXVMASDF/w0fPhwBAQEoWdL5VzDFApIqSI8ePfDjjz96gz3PtQ8qFxAt/BpD/XHpgY8laSsRACZP4oejA70fAB6+eBdv63RdPTGRVgLJub0toVfRfrozALSqrEHPcrdxmTHh7NgeFRWFPD1XardalZz6c+cZ9FxyCPWKZMK0D509gL3/OYS5gWe05+rz1KncnM3GgAFgwUyvYs23DvnAN3/dikPnIywBQJaUMwo/GLX6GCZsDMP7FXNgSAt7HkA9AKycNy0WdKniZB4TRfR5Fs3GQH99WPRxszsAKBKiVMzf66M2aj+cuMQXAE5qVxaNirs/AhbtpjhVkQCnwkaZeWEFD1IUIqIRFauMWbrHSMLNCgDk+Rb3NT0ANJPK7LboAP7efQ4cz3k78jFKRgPAkMGNkDSRvAdw6uYwDFl5DG+XyYaxbgAgnzaonD+V32+ZNeINdUwBIE1AvXr1sH37do0IUqhQIfj4+CA4OBhr165FlSpVsH79eiROLJ8N3BsM90QfVC4gJwBoQdqK7Dpz/T5qjgwA6Y8eeQEA4JFL99D8t20gLwmBLU8VK4Hk3ObW0GtoNz1I8wCSEgjJHm3vUQdZ0ySz1C13GxcHQrtiwllqKLrys2dRyNvLAQCtSk4t2HkGPTQAmBHTPqzg1PxPSw9hXpADALarnBODBTKEys3ZbAy2nbiG96cFoVCmlPD/1uHRaDZhKw6ei8CMDuVRp7AjRtms7DntkJQzIiCN9j+GXwPC0LZidgxtYc9Ty/Fp2V9LpqVHMZL0YqKIXmnFrO/66/wcvWYz1TOSVlMxf3VGbdTeGy7f1iuIr+tZ9wBSSAiB80ntyqFR8cxuh0K0m7SARQKcChtl5oUVPEhR6MC5CO0Wq4QJusdIwk1s35V9+vkW9zUGgLJSmd0XHcRfu8/GAEDSRy81wOEBJJIhkQ1ly7QtYRi84hial86Kce/FDStjRjwTzlTOn8rvt+x4JHQ9UwBIHXz06BHGjBmDBQsW4Pjx41qfCxQogDZt2uDbb7+N0QlOaGOed/sqFxAt/JpD/XHxgY8laSsag9PX76HWyI0vDAA8euke3lIBAKMDyWWYhLx2RGBBnoxHTz0PAM0Coe2sY8r/R3kAqdgFgHULZ8T0Ds4AkI6G6YhYAxGVcmLI27EJkVVuzmZjwB80EQC+NWGr9rGd/mF51C0iBwCNJOW4bQaAbSpkx7B37AFAZqiSh5HYsUaSXuzB8hQANHqOESFKxfzVGb0RYVdjAeA39Qrgm3oFzaYzzvUWE7dh75lbmNy+HBoWkwOAZDflASQCHGdAUGGjjDEMACmfKHmlqVglTDgBwOypwRJuMgBQP99GP5hkpTIZADKhJ+L+Y5QaGD8A+FbprPjFAADqGfEq50/l91tmjXhDHSkA6A0dpT5MnDhRS0lDyamLFSuGcePGaQQUV2Xx4sWgPIYnT55Evnz5tGTWb7/9dkx1OjYbMGAApkyZgps3b6JSpUpavkN6tkxRuYA0ADjMHxfv+1hSNqB+h1+7h9qjNmoZ2inuxBuL+GIfu3wPzSZsg1Ey3vj03UogObcjHi0SAHz8NAo7etZBltSe8wCaBULbsfnJ02fI/9Mq7VarmqN/7TqD7osPoU7hjJihA4B0NExHxFT00nUqN2ezMTA60qIfEXTcNu2D8qhXVA4AGknKcdtj/IMxPuAk3quQHcNtAkDOzUc5Lik2jtKC6CW9OIbNyHNnNg7idXdHyUbSairmr+7ojTgpAMCv6xbAt/WtA8C3J27TYuemtC+HBiYAULSbPEdEgOMMCCpslJkTlnCjdFLETKdiNV6O7jGScJMBgPr5NgqZkJXK7LH4IBbsOgsm9Ny6/wilB67VuhE6pDES+1n3AJK6C5Hz9EVPiFI5fyq/3zJrxBvqvDAA8K+//kL79u01EFitWjVMnjwZ06ZNw9GjR5EzZ844Y7ljxw4NHA4aNEgDfUuXLkXfvn2xdetWDehR+fnnnzVQSCSWggULYvDgwdi8eTNCQkK0hNdmReUCooVfa5g/Ltz3gRVlA+ozAReKxUmZNBEOvQAAMPjyfbw5YSuM5LjM5sDddQaAMoHkMQAwml1K5AIaxyfPohDYsy4yp5ZPrEzPcrdxmQVC27FZBIBWJaf+3nUW3RYffKEAoFFQO4URUFoXIrIQoUWmMAA0UqEZsyYY4zfEDwCyTBklrKajUXcA0Ch2T8YGruOOTMKEKJERr+LjWm/MJpy4EpsRggggFAdotViZS9FuIoGIGRBU2ChjC0u4UTYBSk5uFwCyhBt5ElnBQwYA6uebWfMiaYoBoJlUZs8lB/HnTmMAeGJIYySyAACnbz0F8oq7AoD6Naxy/lR+v2XWiDfUeWEAIIG2smXLajkIuRQpUgTNmzfHsGHD4oxl69atQRNMSiVcGjVqhNdeew1//vknyPuXNWtWfPPNN+jevbtW5eHDh1p+QwKGn3zyien8qFxAIgC0omxAnQ67ehd1Rm9CylcS4VB/7/cAMgDMnOoVBPaqazrushWYSSgTSK4HgJRehACgHWk1WQDoKhBa1j6nD8HTZygQ7QG0Kjn19+6z6LboIF4vlAEzO1Z0ap43f/pjm4o5MayFdxwBG6W1YNAg4zViI40k5fja2DXB+GXDSbQunx0/20zXw1J6lK+QPGMVcr+GhV2rOo2xu/QtVtaCu3QyTIgSpdVUfFzjAMA6+fFdg0JWzNDqsjdXBsyLdhOTmgAgZ0BQYaOMMSzhRrHEpE9tFwCyhBspE7GChwwA1M+3UdokI2a4kW18CsCEnpv3HqHMIIcH8OTQJvCjrNuSZcbWUxi4/Kgm70drUV/Ym8uMeJXzp/L7LTkcCV7thQCAFIOYPHlyLFy40OkI9+uvv8b+/fuxadOmOANJXkGKT6T/Yjb0sWO1Y+PTp08jLCxMOxam9DVijsO33noLlPx69uzZcZ5JAJH+40ILKEeOHLh27RpSpUrl0cmkhV9/1Aacv++DGR+U1TREZQvF4DQcvw2pXkmEPT95jlQh275MPbKPSERELDp+9QGa/x6ITCmTYms3B6PTE6X11J1aHNFvbUppOe5kCsk2tZuxW5MYC79+T5NW29atFjKmTCpze0wd0T49QWr6tnAMX30czUpmweiWsYDKUgO6ykRWKTZgnfbXPb1eR6pk8qSsxZTlf+kR1CqQHtM+KOv05J/+OYK/95zX/ta6fDYMfstZC5jn8HmTwDaHXkPnP/aiSOaU+PdzB6u25ZQg7D8bgYltSqN+Ubk0MJRs+P3pNN/J4f+1QyOVC0n2jd94Ci3LZsFQIfbRyjwNXBGMOYFnkD9DCpy4eg/lcqbBgo+dQfawVSGYsf00Pq6eG90aWveWcX/GrA3VlEtIuq5P08JO3Ww7fZeWV++XViXRpIQjps7dGrVio1i38fhtmp1cPquVF9/Wsy4F986kQBw8fxuT3i8Nik11V0S7Sbe57titoAwIB/rUVWKjzNj4H7mMLxYcQMGMr+J4tEf0cL962tG0lUI/dD6asw9Fs6TEss+c2ePu5lA/3+K+5v91Na0LH87cje1hNzDq3RJ4q5RrpnWff49iwa5z+KpOPnz5ej5N07rS8I3aM0IG1IevBQA4e8dpDF4ZgqbFM2Nc67jM+hH+xzF1azg6Vs2FXo0LKZ0/+n6nT58eERERHv9+W5njhKz7QgDACxcuIFu2bNi2bRuqVo399Tx06FANqNGRrb4kSZJEO9pt27ZtzKX58+ejY8eOGogjVjMdJZ8/f17zBHLp0qWLBhBJ4k5f+vfvr8UM6gs9lwCqp8uIA34aAOxa5CmKpImSfvzlB8DQ/YmQ3C8Kwyo+lb4voSqeuweMPJgIqRNHYWB5z/V37CE/hN/1QedCT1Eyrdz4nYgAfj2aCBlficLVSCAKPhhU7glSJfHc6ARc8ME/p/1QLv0zfFDgmUce/OQZ8H2QQ5JpeIUnSCavzoSdV3ww76QfiqR5hq5FnPvz50lfBF5xfLSqZHyG9/J5pr/xNfrYTR9MCvZD9hRR+LGkY83EZ74zJYtCr9LOa2/NOR+sOOsXL7sXn/LF5ku+yJIsSiN05UkZhW+KO7ezNNwXGy/6om7WZ2iWy/74rjjjizXnfVEz8zO8k8f5OeMP++HkHR90KPgUZdLJvQt25mjYfj8tdRWXBtmeoWlO6zaNPuiHM/d88HHhpyj+mvv+inbXyvIMg/YlQlLfKIyo5Lm9xOpYHLjugxnH/ZA5WVTMeIyu9AQW8R+M1rlMX/TzzfuauM5/O+qL4xG+aJ//KcpncD3Gf4f5YttlXzTK/hSNc0Th7mPgp92ODWZc5Sea7rJs2XzRB4vD/VAm3TN0KBh3Xfx72hfrL/iidpZneDu39XUj2w+qd//+fQ0fvASAEqM2cOBA/PDDD3GAzoMHDzRiBsXXqSoMAAm0UdoZLhS/N2fOHC0ljb4QACRwSExlLvPmzUPnzp0RGRkZAwDp2VmyxP76+fjjj3H27FmsXr06zjOftwewwegNOHfPB9M/KIuaFjyAdNTUaPw2pEmWGLt6va5qWuL1XNH7EHrtAd6aGKh52cjb5qnCHqHf25bWUpzIFNEjdOr6fU1bd0f3Wkj/quc8gDO3n8bQVSF4s2RmjGlpL7+c3paHj5+i+MD12p/3/lRHO/6XLUv3XUC3JYdRI386zPiwnNNtPZcewaK9Dg9gy3LZMLS5d3gA2TNSLGtK/POpY0+Ij8eXjmhXf+XwjHAhzeZfAk7hnTJZMFw4+pYdV6o3cPkxzAk6i0KZXkXI5bsokyM1/u7iiEHmMmRlMGbtOINPauTBDw2sp0zh54xdd8KhXFI5J/rqPIBtpu3E7tO3ML51STSOTquiwgPY9NftMR4v6tentfLgOxtpYFpMCsSh87cxpV0ZLTTBXRHt/rByTtQbtxUpkvphf++E8wCuPXoFn/25XztJ4LQ4R/vXs0SYIJu3hF5DJ52nWxwLV3Oon28jT/cHM3djR9gNjGlZAm+60Vvu999RzN95Dl++nhdf1cmP63cfovLPjlO30EENrLwOmjecvOKNi2XC+PfiMut/9j+OaVvD0blaLvRo9NIDaGlwbVSW9gD6+flp7NuMGZ0/pNevX9f+9vSpul9b3nIErB9flTEE9GK/PtxfA4BWpK2ojyeu3EG9MZuRJnli7O9r7QW1sYZs3SLGdoRefYAm47cgQ8qkmoyZp0p8Y8J447YqrUb9dxe7YhYIbcf+yMdPUbiP40eLVc3RxXvO4fuFB7QwgzmdncEJqwDQc/XSdSrjc8zGwCg2Kr4xn+u+c/7xMX5dCMasO4F3y2bDKAPZKrM+0nWW0uNYMCNJLyaKfFo7nya3ZbewioJeso+eZ8SIVzF/jcZtjol5o3Y/fz0ffmxo3SYrSb1FuykPIBHgOAOCChtl5ocl3PJmSBGTFscqYYLaMYp11QPAlStXokmTJk65ePXzbRTrKiuVycngmdBz9c5DVBjiCDcJH95UZjhi6szeHo5+/x7RwhAmvu/8Y5Mq6dVsVM6fyu+3pUFJwMrSANDX1xeXL19GhgzOv8Y2bNgAIlxcvXpVqRlEAiFZOmIBcylatCgoZs8VCeTOnTugl4NL48aNtfg+kQRCMYLdunXTqhDQJDDrLSSQOsP9cZYAoAVpK7Ij9PId1B+7Ga8lT4x9LwAAPHHtARr/skXzspGMmaeKlUByblNkhbKigVVpNXqWu43LLBDajv0PHj1Fkb4OAGhVcmrJ3nP47m9jAMg6oBqI0EnXqdyczcbAiB1pi/VtICnHbf+6LgSj153AO2WzYnQrYy10s36ylF7RLKlw9OJtGEl6MVHks9r50C0eAHBMtI6qXrKP+mgkraZi/vQA0K5NMbJ+ErrOot2UBkYjwEVnQFBho9mc03WWcCN2Oe8jVgkT9BwjtrsMANTPtxHbXVYqk9cwef+I0HPlTiQqDnGcNlgFgH/sCEffZUc0L/Tv7eICQD0hSuX8vQSAgCkAJNYsKX/wOTn9fy7k9bt79y66du2q5c9TWTgNzKRJk7RjYMrdN3XqVBw5cgS5cuXCBx98oMUJMhik4+KaNWtqaV4IJC5btgy9e/eOkwaG6s+cOVNLbE0xhRs3bvSaNDAMAK0oG9AcHL98Bw3GbkbaFEm0pMDeWMQX++T1B2g0jgBgEuzu7bn+2skLx4mBOW8bjZ1VaTUzADhz2ykM+O8o3iiZBRPaOpMu7M6VCACtSk4t3XcO3/71YgFAo/xoraITf098vyyamOjH8jgb5UfjaxPWH8eotaHxAoDsPSEWJ+kUuwOAdr1l3N8xa49j/PrQOJJ9dD1WWSNWWk3Fx5V+yHHaE2rXrlez6fgtWv68WR0roHYhMxJIrN2UBkbMgKDCRpl3lCXcSGHmdLQ2ctjQJpYIE9SOUb5LGQCon29xX9v4oyMsSFYqk73YegBIUODUMGsewDk7wtHHDQBk5ZxPauVFz8ZF3P6QlpkHd3VeAkAJAEhxdJQypVOnThqDNnXq1DFjSnF2uXPndorLi++kuLufvH8jRozQjqKLFy+OsWPHaiCPSu3atbW+EPGDy6JFizTQx4xfAoMtWrSIuc6JoCmnoJgImp4tU1QuINq4GABaUTagfodcuoOG4zYjXYok2PMCAUBP9zc+yhCs3EDjaVVZQxYANi2ZBaRS4oly/9ETFO3rIC5ZlZz6Z995fPPXflTPnx5zP3I+Av7+7wNYvPec9ly9dF1CfVypLzESWYJCAgNAu8ovLCmnB4AtymTFmNb2PIAspVcye2pNpo60YZd97hxryB7AL17Pjx8aWk+Zwv0du/Y4flkfGkeyj66zsoYoraZi/vQAsGutfOjR2PoRcJNftmgeUxkAKNrdsVoe1B29ScuAcLB/Q6UAwt17y+tT3EfsAEAjxRsZAKifbyPFG5bKnNC2DN4oGUuE1NvVb9lhEHv3yzr58T15AG9HouLQ9SDyb5hVABh4GuRRbFQsMya1j+sBZOWclwDQE18F82eYegD5EZRqhRi4zzvdg7kJCVdDNQCsO9xfY8JZUTag0Qi+dFuJR82TIy1+fMKuR2qA1dMey/how7J2K9lsVVnDDADO2nYK/f87iqYlsuC39z0DAO89fIJi/RwA0Krkc8PMrwAAIABJREFU1LL95/H1gv2olj8d5n1U2Wmav/t7P5ZEk0DeKZsdo1vFBm6rABCya4w9LCKgkv2giW0YaaTy9d82HMfINaF4u0xWjLUJAFlKj/pJKiWkDauX9NJ/YGXHQF9v3LrjGLcuNI5kH9VjZQ1RWk3F/DFw477xh9yqTQwkZ3eqiFoF3ZNARLsJAFIuwtTJEuNAvwYJBgDZQy3uI6eGNdFO06wUlnArmOlVrPk2LkHO1Rzq55s1rwmQbu7m8ADK/mDS/0C5fDsSlYau1/L/0bG2lTI38DR6/3MYDYtlwuT25ePcyso5/MNBxRrlRlV+v62MSULWlQaAZ8445KBcFSM1joQ07Hm0rXIB0cKv97M/Tt+NDwD0bEydJ8dUfLFP3YhUcmRtJZCcbSMBejo+yZYmGc7feqD92aqyBt3jbuPiQGhPAsC7D5+geDQAtCo5xQCwar50mP+xDgD+tR9L9jlYwC3KZsMYgQyhcnM2W2sMAMUjVdkjLfHZ7o7YJgYcxwj/ULxdOgvGvmcPqDMAJPIHSZuRJ/DfL5zzDeqP2Mxsd3X9l3WhGLvuuFsAKCbJVjF/fHTrKQAokwRftJuOgEUCnAobZeaHY1TFfcRqvBy14y5Ewd0+o5fS433NCACahUwwAOQQhUsRkag8bD0S+frghEUAOC/oNH5aeljLyzrlA9cAkEMHVM6fyu+3zBrxhjrSAJBIIO5+vahkAXvDQBn1QeUCEgGgTDZ8sX8Ug0O/oD3NqvXkPIgvdviNSCWkFSuB5Gzb3jM30WLidk2X+EJEpPZnq8oaZgCQA6FdMeHsjPOdyMco0d8h0G4VAP574AK++nMfquRNhz+7OAPAb//aj6UMAMtkw5jWpWO6p3JzNhsDDrIXWbWyQe3isznIniS7Vn3trCv+e0AoKC1F81JZMK6NPQDIKgplc6bRkpIbSXrFBNnblE1jeyj+j+IA9ZrNdN1IWk3F/PE7FwMAa+ZFzyZFzKYzznUmk8jIYIp2d6ya22kvUWGjjDHMUid5y4vR+4gtAChIU67VsdTd7TP6+eZ9LUfaZNjSzSEOIEuaYpY6E3ouRjxAlWEbkNjPB6FDrHkA5wedAf0oIqlG+q7pi74tlfOn8vsts0a8oY40ADxw4IBTf2li9u3bhzFjxmhECzG2zhsMex59ULmAaHzr/+yvJTK2Im1Fdh+9cFtJWhVPjqn4Yp++GakkbQ17I6yk0dl35ibenrhd0yXmjdvTANAsENrOON+OfIyS8QSAlfOmxYIuzmoD3yzYh3/2X9C6pJeuU7k5m40Bp9kQAaBsWgvx2e7SbDAAJJWEX2wDQIeOarlcr4G8MEaSXvo0G2a2u7rOQEgv2Uf1jRjxKuaPve7cR7v6xgwA53auhOomOVBFu8kDSAQ4zoCgwkaZ+WEASPKWl25HasmSrRImqB0jCTexfVf26eeb9zU6kt7a3QEAZdMm6dMUXbj1AFWHxw8A1iuSCdM+jAsA9d5GlfOn8vsts0a8oY40AHTV2RUrVmiJoIk9+79WVC4gEQCKcTsyY3zkQgSajt+qJVbe6cG8ejJty9ZxBoAPneJ2ZJ9hVs9KIDk/a//ZW5q3JFOqpLh82yH7R7FEFFNkpbjbuOaYBEJbaYfrRjx4jFIDHB7AkMGNkDSRn/Rj/jtwAV/+uQ+V8qTFX584A8CvF+zDsmgA2Lx0Vox7L5YMoXJzNuv86sOX0HXuHpBnbclnDlJF26mB2H7yOn55rzTeKp3N7BHa9Y0hV9Bh5i5QmpaVOg/gpI2hMZJ9422SdXosPogFu85qGsAkxVYsayqs+MrZ08hEka/rFsC39e1LwZF03ei1x9GmYg4Ma+GcYJwJUWI8sYr547hbHvyPa+TBT02LSs2FWKnh2M0IuXwH8z6qhGr53ctginZ3qJrHKZ5YhY0yxgSEXEHHmbu0PfjKnYe2CBPUzo6T19FmaiAoUfn672vHadolAJywFQfORcTEj/O+RkfS23o4AGAsU7gcGkUnBzeyTR+XR6Ex1YZvQBI/Xxwf0lhmOGLq/LnzDMgrTon5p31YIc69+nhDlfOn8vttaVASsHK8AWBoaChKly6Ne/di9R8T0J7n2rTKBUQLv8EIf5y64wORuSdj4OHzEXjj160aiAnq5bm8ejJty9YRX+wztx46Mfdkn2FWjwGgTCA5P4sC9enXMx2fU8JTKgf7N0CqVzwHAM0Coc3sMrouAsDjgxsjiQXNqeUHL+CL+S8aALyIrnP3ap61xZ865CHfnxaIbSfsAUAjYDZ5YyiGRWs22wWA3RcdxF+7z6JinrSgZLzuAOA39Qrgm3r2ASApl4xacxzvVciB4e84A0AGZmJGARUfVwaavEY/qp4Hvd+wDgAbjN2E45fvYv5HlVDVBACKdhMJRMyAoMJGmfeTf1hQbtNrdx/aIkxQO4Fh1/HelEBQQukNFgCgfr55XxMBIDOFzRwMzMxlYkYMAEzkC9prrJQFO8+ghxsAqCdEqZw/ld9vK2OSkHWlASANllgohQqlYyF9XJJi279/f0LakSBtq1xAzgAwNneXjKEMAOn4IbBXXZlbnnsdIwBI8mWH+jf0WF+YSSgTSK4HgJST8NrdR9qfrSpr0D3uNi4GgK4Coe0MQMT9xyg10OEBDB3S2JLk1IqDF/H5/L0aSPlb5wGk2ECKEaTyVums+MVLPICrDl3Ep/P2onyu17BIBwDHtS6N5mXkPIDsqTE6mp2y6USMZN+vbeOmrJCZp26LDuDv3edAx+uBYTcMPY1MFPm2XkF8bUM2jfvxW8AJjPQPQevyOfDzu84AkI9mxZyiKj6uegDYuXoe9LEBAOuP2YTQK3IAULS7Y/XcThkQVNgoM+8cWsD7iB3GLLUTFHYdrQkApk+BDT/IewD1880AkGKbt/d0fBOMmOFGtulz8527eR/Vfw5A0kS+CLEIAP/adQbdFx9C3cIZMb1DXA8gE6I45YzK+VP5/ZZZI95QRxoAGpFACATmyJEDCxYseG65AL1h0LgPKheQCAB/f78sGksmttUAy7kIvDlhqxbHtiP6ZfemcdMDpLO3Hjpl7/dUX60EknObB8/dQrMJ27SUNDfuOQCgVWUNMwDITDhXgdB27L91/xFKD1yr3WpVcmrloYv4bN5eVMydFn93dT4CpqNhOiKm0qxUVoxv4x1HwNxnOlpd2NXhAWw3LQhbT1zD2Nal8HaZ7FLDyLFaRuQMBoBvlMiMCQayVTINsJQeMazpeNqIbMJEke/qFwTJbdktDIT0kn30vBhClKAqpOLjyrFnbEOnannQ903rHkBK5XKCAODHlVA1n/sjYNFu8gCKqkIqbJSZHyYX8T5ihzFL7bCEGymKBFgAgPr55n1N/CbISmXq1TnO3riPGiMC8EpiXwQPsuYB/HvXWXRbfBB1CmfEDAMAqFcdUTl/Kr/fMmvEG+pIA0DKAygWAoQkC5c/f34kSiQvPO8NRnuqDyoXEC38hiP8EXbHB2Y0fb09/LKLv/Y8ZbOnniO+2OciHjnpd3qqDSuB5Nwmg2fSUb51/7H2Z6vKGmYAkJlwrgKh7dh/894jlBnkAIBWJafYmyaCKe7DF/P3YvnBi9o/3yyVFb96CQCM8VoKoLX99CBsCb2GMa1KoUVZOQDI6TqM0rNM3XwCQ1aGoGmJzPjNJgBkKT1Ksk3glDSBV3/jSF7PpecSB1Hk+/oF8WU8AODEjScwYnVIHMk+aseIEKXi48qggm0jUka/N4tZXtJ1R2/Eyav38OfHlVElXzq394t2EwAUdcVV2ChjDKcX4n3EDmOW2mEJN1ImYgUPsX1X9unnm/c18VRIVipTr8/LADBZYj8cG9RIZjhi6vy9+yy6LTqI1wtlwMyOFePcqydEqZw/ld9vS4OSgJWlAWAC9tFrm1a5gGjhNxrhj5PxAIBivIe3DaL4Yp+PeITagoC7p/pqJZCc2+TjcyJ9UFwdFavKGmYAMDYQ2pgJZ8d+8laWjQaAVhUHVh92xNOJx6ncBzoaJrBFRS9dp3JzNhsDo2NrOwCQE/YaJWietvkEBhMALJ4Zvxnolpr1ka4zAKxRIL0GTo0AIBNFfmhQEF/Use8B/H3jSfy8OtgtABSVNVTMHx8regoALuhSGZXzugeAot0dquV2IsCpsFFm3jnBOCmS3I58YoswQe0YSbhZAYA830ZhQbJSmcNWHsPkzWFgQs+Z6/dRc2QAkifxw9GB1gDgwt1n8eOig6hdKANmuQGATIhSOX8qv98ya8Qb6lgCgCEhIfj1119x7NgxLSdg4cKF8cUXX2j/+79YVC4gEQBakbaieTAK+PW2+RFf7Au3H6HWyI1IkcQPRyxuKO7s4kByGSahHgDyxq0CAJoFQtuZq+t3H6Lc4HXarXYBoEioiAGA8/ZixSEHANRL16ncnM3GgIkrYtziBzN2go7eRrcshXfKyXkAjSTluG0GgE2KZ8LEdnFTVpj1ka6zlB4DwEKZUkIvOcdEEU8BQL1kH/XDiBGvYv6YWMBj06FqbvRvZt0DWGf0RoRdvYe/ulRGJUkASHZTe0SA4wwIKmyUmXcGgBTXfIcAoA3ChAgASVN4U7SGrwwA1M+3ETFQViqTASATek5fv6ft1/EBgKTuQuQ8fWFGPBOiVM6fyu+3zBrxhjrSAJB0ddu0aYPy5cvHxPsFBgZi165dmD9/Plq2bOkN9jzXPqhcQLTwG4/0x4nbPjDTatQbbUT5f64DI9GY+GJfvP3Y9i9Kd01ZCSTn53AKnZRJE+HOwyfan61Kq9E97jYus0BoieGLU4WYhuWjAaBVySmjlCrcwGfz9mDloUsOAKiTrlO5OZuNgVHqmg9n7AQF349qWUrTLZYpRpJyfN/0LScxaEUwGhfLhN8NZKtkns9SevTBo74ZSXoxUeTHhoXw+ev5ZR5rWGfSppMYvioYesk+qmwkraZi/ji1SLwB4KiNCLt2TyMlEch3V0S76chZzICgwkaZCWIJt1eTJgKp9NghTFA7RhJuYvuu7NPPt1FqMFmpzGGrjmHypjAwoSf82j3txMbOD/ZFe85pXvGaBTOAyHn6oidEqZw/ld9vmTXiDXWkAWDevHnRrl07DBw40Knf/fr1w5w5cxAWFuYN9jzXPqhcQA4AuBonbvtqcVcUfyVbjJJ+yt77vOqJL/alO4+1oGI7MSXu+hsDACUCyfk5nESbNrd7j55qf7aqrEH3uNu4zAKh7cyBCACtKg5wUmUxpx73wVsBIKuXiMmrO8zciY0hVzHy3ZJoWT6H1DAaScrxjTO2nMTA+ALAaCk9inkKCFELACdvOolhq4LjSPaRPRwPKzLiVXxcObkwj+GHVXJhwFvFpeZCrPT6qI04de0eFnatggq53QNA0W4inRAA5Fg3FTbKGMMSbuQlu//oqS3ChAMAOqQpRQUPGQCon28jcQBZqUz6UUEgWw8ACdwSQc5KWbznHL53AwD1hCiV86fy+21lTBKyrjQATJ48OQ4ePKiRPsRCeQBLlSqF+/fvJ6QdCdK2ygUkAkBiXhIDU7YYyf7I3vu86hkBQDusMnf9ZSahTCC5HgASGH3wWC0AdBUIbWcOKGdhhSGOI2CrANBIVo378OncPVh12OEB1EvXqdyczcaA9YtF+ToGgCPeLYlWkgDQne0zt57EgOXBaFQsEybZ9ACylB6lvVgffAUFMr4KvaQXM4W7NSqEz2rb9wBO2XwSQ1cGo4VOsk8EgKK0mor50wPAD6rkwkAbALD2yACEX78vBQBFu4kEImZAUGGj2dqk66zgwfuI3b2N93JRwcMKAOT5ZgBIeQl393bkhjVihhvZRnGlFGfJjG4C5gTQ6ZTkkEUAuGTvOXz39wFQSMSczpXiNMeEKGbEq5w/ld9vmTXiDXWkAWCTJk20Y96OHTs69XvmzJlaGhh/f39vsOe59kHlAqKF32TkaoTe9rWkbEADYCT8/VwHRqIxIwBo95jEVXPMJJQJJOdnsI4y9eXhk2fan60qa9A9bj2A0Uw4V4HQEsMXp8qVO5GoOGS9Lckpd16wrnP2YPURBwBsXDwzfhfIECo3Z7MxYABI6VXmf+zQL+44c6fmZRvxTkm0qiDnAXTn/Zy19ST6Lw9Gw6IZMfmDuDnLzPpI11lKjxjf645dRv6Mr2KdTtOViSLdGxXGp7XzyTzWsM7UzWEYsvJYHMk+qsyEKFFaTcX8sb4sd7B95VwY1Ny6B7DWyACcvn4fi7pWQXkTD6BoNx0BUxonzoCgwkaZCWIFD95H7J5u8GmOK0KfK/v08837GuUl3N27vmaCrFTmiNXBmLjxJJjRHXb1riNtl428rUv3ncO3f7kGgEyIYka8yvlT+f2WWSPeUEcaAE6aNAl9+/ZFq1atULmyY8OlGMCFCxdiwIAByJo11kPVrFkzb7BNeR9ULqD4AcAbeOf3HXAVOKx8YCQaEF/sy3cfa4lF7QZKu2rOSiA5PyP40m0tkSzJHD166gCAVpU1zAAgM+FcBUJLDF9cAHg7EhWHrrclORVDhMiRBss+d8iqcflkzm74H7ms/bNRscyY1D42IbLKzdlsDP7Zdx7f/LUf1fKnw7yPHPtRp1m7sCH4Cn5+pwRaV8hp9gjtOsc/GhFgZm0LQ///jqFB0YyYYhMAspQeJf1ec/SyoaQXE0V6NC4MUluwW6ZtCcPgFcegl+yj5xkRolTMX6tJO7Az/EaMCe0q58Tg5iUsm1RzRADO3LiPxZ9WQblc7o+ARbvJA0jsVgZMKmyUMYYVPHgfsUOYoHbM4rld2aefb97X0qVIgj19HABQVipzpH8wfgs4qRFsiNBz8upd28pN/N5SWqS5H8X1AOoJUSrnT+X3W2aNeEMdaQBIef9kCrGDnz51HJ39fy8qFxAt/KajVuN4hB0PoAMAusod5Q3zIr7YV+49cWhL2mTKubKnjoVAcn5GyKU7mpQU5e16/DRK+7NVZQ26x93GxYHQngSAl29HotLQ9bYkp9ylQunyx24NuFBpWCwTJgtHoSo3Z7M1avQh6Txrl3bMag0Auk6BM3tbGPr9dwz1i2TEVAPdUrM+0nUGgDR2BKSNJL2YKNKzcWF8ohgAitJqKuav1eQdWvJiLvEHgFU1uT93RQSAHarl0bS8ExoAsoIHJYB+8izKFmGCbDbL6GAGAHm+eV8zAoBmUpmj/EMwIeBEDACkBN0UXkOpskgn3Uphz734w028nwEgE6JUrFFuT+X328qYJGRdaQCYkJ301rZVLiARAFqRtqKxMssd5Q3jKb7YV+89QVWb4uLubOFAchkmIT/n+OU7aDB2M3jjVgEAzQKh7czPpYhIVB4WPwBolAz54z92g46Iqeil61RuzmZjwEdJoifho9m7sO7YFQxvUQLvVZTzABpJynHbngCALKVH3lM6SjeS9PoumijiKQCol+wje4wY8Srmr/XkHQgSAOD7lXJiyNvWPYA1RmzA2RsPsOSzqiibUw4Akt3kpXp74navAYAkAff0WRTsECZEAOgqqb+rOdTPN+9rpEyyN9oDKCuVyQCQCT0nrtxBvTGb4wUAxdAN8V3XM+JVrNGXADB2xF8CQLMvjZvrqgHgG6NWIyTC15K0FXWXs8e7kg+Kh8keu1V8sa/df4IqwzZoXrfQIU081oaVQHJuNPTyHdQfu1k7Sn3mcABallaje9xtXGaB0HYG4GLEA20M7UhOsRqGkRzaR7N3a7FrGogomglTP4jNh6dyczYbA6Mx5L4Oa1ECbSQBoJGkHLf9x/Yw9P33GOoVzoBpHeKmrDDrI11nKT0i0FA6HaN3kokivZoURpea9o+Ap289hUHLj8aR7KN+GEmrqZi/96bs0DSPubStlBNDbQDA6j9vwLmbD7D0s6ooYwIARbspEXSLidvBpAkVNsrMO0u4+fgAUVGwRZigdowk3MT2Xdmnn2/e115Lnhj7+jq8drJSmaPXhODXDSfAhB5+Fqmc7I9+lsyYUB0j8pZ4r54QpXL+VH6/ZccjoetZAoDr168H/XflyhU8e+aIj+IyY8aMhLblubevcgHRwn9z1GoER/hakraiQeDNx5WA+HMfKIMGxRf7+v2nmvfKDnhxZwsDQJlAcn4O/7oVn2tVWo3udbdxmQVC25kfBoB2QLQ7PVxvBYDsRRXZhOytJMBBwEOmuNNBnrP9FPr8ezReAJCl9CiJNqmXuAOAPzUpgo9r5pXptmGdGVtPYeDyo3Ek+6iykbSaio9rmymB2BF2PaZ/BMQJkFstFBJy/tYD/PN5NZTOkcbt7aLdRFQgAMhpU1TYKGML/wjnunYIE3SvkYSb2L4r+/TzzfuaCNpkpTLHrAnBeAMAKIJJmTGhOpy+SWTvi/fqCVEq50/l91t2PBK6njQAJKIH5QCkRNBZsmTRlEDEsnTp0oS25bm3r3IBiQDQirIBDQLHnxjFGz33QXLRoBEApOMSAlueKswklAkkdwcArSpryAJAV4HQduy/cOuB7WP0gJAr6DhzF4pnS4XlX9Zwap6PVemPeu1ilZuz2RgYJZRlADjk7eJ4v1Ius0do140k5fjGuTtOofeyo6hbOAOm2/QAspQe5fGk5NVGcbnMFO7dtAg+qmEfAM7cdgoD/jsaR7KP7GFClMiIVzF/cQFgDgxrUVJqLsRKVgCgaDeRQChvXs60ybG52+tuf4hZ7pSFGzgMJ74A0EjBQwYA6ufb6NjWiBluZOKYtccxfn0omNFtdJwsOzScwF3M3yney4QoZsSrWKPcnsrvt+x4JHQ9aQBIoG/EiBFo3759QvfZa9pXuYBEAGhF2YAGhxlo+TKkwPrva3vNeLnauG48eKoRGOjYNWxYU4/1N5ZJaB5IHgsAHQHOYrGqrGEGAI0YrPE1mrwldok0G0OuoMPMXSiWNRVWfOUMAJlY4QCAGTFNIEOo3JzNxsOISc2ElcHNi6NdZTkAyJJylfKkxV+fVHFqdt6OU/hp2VHUKZQBMwx0S836SNc/j5bSo/i0ZfsvGDLzmSgSXwA4a9sp9P/vaBzJPg0ARhOiRGk1FfPXdmogtp+M9QC+VyEHhr9jHQBWHbYeFyIiNVZ6KRMPoGh3p2q5nTIgqLBRZt5ZwYPrkrTkwf7WkibTvQwAWdpO37Yr+/TzzcQNsR+yUplj1x7HL+tDwYQeI0KJzJhQHXfvG11nQhQz4lXOn8rvt+x4JHQ9aQCYLl067Ny5E/ny2Y9RSWhjPd2+ygVEC7/Z6NU4dsvXkrIB2cg5qIxyjnl6DOw+T3yxbz54qqUwIafyKQ8CQCuB5GwHpzgQ7bKaWNkMABrlsLM7jnzfuZv3tVQ6dnIpkkQZyagVzZIKK792BoCcWoXaoWTG0zvE5sNTuTmbjcffBrkUOWUN5Z0jb4VMceeRmB94Cr3+OYrXC6XHzI5xU1bIPJ+VVN4ukw1L952P8UyJ9zJRpM8bRTW1Bbtl9vZw9Pv3SBzJPnqeESFKxfy9Py0Q207EAsDW5XPg53etA8Aqw9bjYkQk/v2iGkpmd38ELNpNR8DvTorNgKDCRpn54VysXNcOY5buZQm3DCmTYtdPjgTOYnFln36+eV8Tj6JlpTLHrTuOcetCwYQeTikj5hSUGROq487jTtf1hCiV86fy+y07HgldTxoAdu/eHa+++ir69OmT0H32mvZVLiBPAEAj1QFvGTwnABj51HYSY3f2WAkk5+dwktMXDQCevXFfk9Ozoziw+fhVfDBjJ4pkSYVVOgDIyZVpPOoUzogZXgYARTUVTlptBQC6i0maHxiOXv8cQe2C6TGrU/wAIKlzLNl33lDSi4kifd8oik7xAIB/7AhH32XuAaAorabi49puWhC2nrgW8/rEFwD+90V1lMie2u22JdpNJJCWk3bExFqqsFFmD2UFD65rhzBB9xpJuFkBgDzfRsmbZaUyf1kXirHrjmtxtRRfG5tUOlZVRGZMqI67mFsRADIhSuX8qfx+y45HQteTBoBff/01/vjjD5QsWVL7L3HixE59HzNmTELb8tzbV7mAaOG/NXo1jt7yhRVpKxoEliEyEp5/7oPkokHxxb4V+cy2jJk7e6zEEfFzWOaI/23XK+lu4zILhLYzRwwA7SgObAm9ivbTd6Jw5pRY/U1Np+ZZXo3+qJeuU7k5m42BkZ4yy9YNeqsY2lfJbfYI7bo7b+yfQeHoufQIahVMj9k2ASD3qUXZbFiy93wMO1XsHBNF+r1ZFBTDZrfM2RGOPsuOxJHso+cZEaJUzF/76UHYEhoLAFuVz44R75aybFLloetx6XYkln9ZHcWzuQeAot0dquYB5SJkApwKG2WMYQUPrmuHMEH3moEtV/bp59tIvk1WKpPi/ygOkAk9ZqDU3fhw2qUKuV/Dwq5V41RlRjwTolTOn8rvt8wa8YY60gDw9ddfd9lfIoRs2LDBG+x5rn1QuYCcAKAFaSsNAJ64hrbTgvCiAMCIh89QfrA9HVtPA8Dwa/dQe9TGmMeqAIBmgdB2FvGZ6/dRc2QAPA0A6WiYjog1EFEoA2YJsXAqN2ezMfhr1xl0X3zIySvJx60D3yqGDzwJAAukx2wD3VKzPtJ19kq+Wy47iLhiJOnFRBFPAUC9ZB/1w0haTcX86QFgy3LZMbKldQBYaeg6XL790BIAJLspD2DrKYFeBwDF/Hsy64brGEm4ife7mkP9fPO+JuYjlJXKjAWADkKP2bG0DAAsn+s1LPo0LgDUE6JUrFHun8rvt5U5Tsi60gAwITvprW2rXEC08JuPWY0jN30tKRvQWG07cQ3vTwtCoUwp4f+ts0fHW8ZSfLFvP3yGctEA0A7hwpVN7AGUCSTnZ5y+fg+1RsYCQLvEFHcbl1kgtJ05YgBoR3Jqa+g1tJseZOgB9FYAuGDnGfRYcsgpLpEJFwOaFcOHVa15AI2UCRYEhaMHeQDjAQA5LpE8YX/vdg8A+79ZFKRkYbfMCTyNPv8cjiPZR88zklZT8XGlUAJZs/1ZAAAgAElEQVQKKeBCwJdIbFZLxSHrcOXOQ6z4qjqKZTXxAAp2UwygBgAzpMCG72snGAuYJdzYblGBw8pYGEm4yQBA/XzzvpYiiR+ODGykPUJWKvPX9aEYrXkAnQGgK2KKO/tWH3atvEP36QlRKtboSwAYO0MvAaCVt1FX93kBQCvKBtRFdx/0eJjr0VtdAUA7KVdcdYyZhDKB5K4AoN3UNDIAsGKetCCVEk8Uow1e9rnufjCIH3S9dJ3Kzdms73/uPIOeSw45MZMZAFoBUu60Sf/aGY7uS46gZoF0+KOzQ2/YamFmMrFhF+w6a+wBjGYKWwGuRv2YG3gavf85HEeyj+oyIWrxp7GMeBXzpweA75TNjtGtrAPACkPW4aokABTtpiP096YExmguq7BRZg2whFt8ASAzbl15EF3Zp59v3h/EH4hGzHAj2yZsCMWoNcfBjG6z1DTuAeAldJ27R5P3o7WoL0yIYka8yvlT+f2WWSPeUMcUALZo0UKqn0uWLJGq9/+pksoFRAv/7TGrcfimr5ZIVVbZgMbXXUyXt4y/+GLfeRSFsoPWal2zk3TZlU3MJJQJJOdnsCeN/203ObW7jSuGCZc7Lf7u6hkAaHTEIzvX7kIGxCO9mgUz4I9OsYoYKjdns77PDzqDXksJAGbCtA8d6iR2jlLdJeX+e+dpdFtyGDXyp8Ocj+wBQM5NSO8vgVYjSS87R9dG4zMv6DR+Wno4jmQf1WVClCitpmL+RI8xtUuxj2NalTabzjjXKSTk2t2HWPlVDRTNmsrt/aLdBADbTA0EZ0BQYaOMMazgwXXtMGbpXs655yqG0JV9+vk2ChGRlcr8LeAERvqHgAk9DAAzp3oFgb3qygxHTB3/I5fwyZw9KJszDZZ8Vi3OvUyIYka8yvlT+f22NCgJWNkUAHbs2FGqezNnzpSq9/+pksoFJAJAK8oGNL7uWJ3eMv7ii333URTKRAPAE0MaI5Gfr0e6aSWQnBtkMgX/246yBt3rbuNyJz9m13CjIG/ZZzFpyIg1LgJAUXXDzEbZtu3W44++KE/HZAorbFp3snwLd53Gj4sPo3r+dJhrEwCykgql0JgXdAZZUr+CHT2dP5p2yCtG48agWC/ZR3U5HEKUVlPxcRVJQxoALJMNY1rbAYBrce3uI42VTux0d0W0m46A204NAq9lFTbKrFlW8IgFgNYZs3SvmeyaK/v0822UJUBWKpMBIBN62DajtWw2NmuOXEKXOXtQJmcaLDUAgPp3WOX8qfx+m42Dt1w3BYDe0lFv7IfKBUQLv8WY1Th001ej3stKW4kA0Civm7eMo/hi33schdIDHR5ATwJAK4HkrgBgEj9fHB/S2PKwudu4zJhwlhsDYJTmQfY57vJGimk9vBEANiiaCVOi9YntpFNhSTm9d5PGbtGu0/hh8WFUy5cO8z625wFkAEhJdOcGnoGR18RO+hqjueVjcXcAUJRWU/FxFdMGeQIArv6mBgpndg8ARbs7Vs3tRIBTYaPMe8VeMq7rKo+f2bOMJNzEe8wAIM+3OwBoJpU5ceMJjFgdAib0sHfTyJttZs/ao5dBXnGS96O+6YueEa9y/lR+v83GwVuuvwSA8ZgJlQtIBIBWpK3IHE7sa6TsEA9zPXqr+GLffwyUGrhGe37okMZI7CEPoJVAcjaOEyrzv5Mk8sXxwZ4FgGaB0HYGmhO92lEccKccIyb21UvXqdyczcbAKN7NTkJllpTTxzdqAHD3Gfyw6BCq5kuL+R/bO6pnKT1KTE0kjUypkiKol3NCXyaKWFEwMRofJsboJfuorhEhSsX8iYnDqV1KgD3Whgew3KC1uH7vEfy/qYlCmVO6XQ6i3eQBFAlwKmw0W5t0XQ8A7RAm6Dms4OEqkbQZAGQCnFGieFmpzN83nsTPq4PBhB6ObzRitJuNzbqjl/HRH7s1dRfqm75wGAfH8aqcP5Xfb7Nx8JbrXg8Ab968ia+++gr//vuvNmbNmjXDr7/+ijRpjLPD37hxA/369cOaNWtw9uxZpE+fHs2bN8egQYOQOnUsm0yvZUzP/v3339G1a1fpuVG5gGjhvzN2NQ7e8IXVD4M7aS9p4xRXdAKAT4BSAxwAkMAWgS5PFCuB5NweS6qpBYDuA6Ht2G4k9ST7HAaARtrRorSXnimrcnM26zszXhsWy4TJ7R0xgHYk1Ywk5bjtGACYNy3md7EHAFlK78MquTB7x2kYAQE7EnbuAaCzZB/VNZJWUzF/onQgtdu8dFaMe6+M2XTGuU4xwTfuPcKab2uiYCZZAJgRlAeQGO2cAUGFjTLG6AGgEfCXeY7Ze+3KPv18G0lFykplMgBkQg8znOMFALOnxrIvqscFgDpClMr5U/n9lplbb6jj9QCwcePGOHfuHKZMmaKNV5cuXZA7d278999/huN3+PBhDQB26NABRYsWxenTpzVQR8mrFy1aFHMPAUCKW2zUyEGJp0IAMVmyZNLzonIBiQDQirIBdT4g5Ao6ztyF4tlSYfmXztJe0sYprii+2A+eAiX7OwBgyOBGSJrIzyOtMwCUCSTnBi/ceoCqw2NzWtqRVqNnudu4zAKh7Rhv5ilw98ygsOtOqTPEul4LAKOTHjcqlhmT2pfTuqzPISYzjgwA9TkO6d7Fu8/ge/IAxgMAskeM8tPN2h7uFgBa9fTr7ePciHrJPqpnJK2m4uPKHk/uG2kg/2IDAJYZuAY37z/G2m9rooAJABTtJhKImNJIhY0y64pz5XFdO4QJutdIwk1s35V9+vnmfU0MaZGVypy06SSGrwqGJwDg+mOX0Xn2bpRyAQD1hCiV86fy+y2zRryhjlcDwGPHjmkgLjAwEJUqOaSY6P9XqVIFwcHBKFSokNQYLly4EO3atcO9e/eQKFEi7R4CgEuXLtW8g3aLygXkBAAtKBtoADD4CjrO2oUS2VLjvy/j/sqya68n73MFAIMHNcIriT0DAJlJKBNI7goA2pFWkwWArgKh7YyzWayQu2fuPHXDST1BrNtmSiB2hDm0XavmS4f5Qiycys3ZbAxY/ktMeswAkFUEzJ5B11lTWK9yQteW7DmD7xYeQpW8afGnTQ8gx8R1qpYHM7adglEsGDOFrcb66u0zUkfhOkyIEhnxKuZPDwCblcqK8W2sewBLD1yDW5IAULSbjoBFVRsVNsqsK1bLiC8AjIntTZoIhwY0jNO0K/v0880AUCS1GTHDjWybvOkkhq0KjmF0s8pJ9teSYWv3OjLDEVNnQ/BldJq1GyWzp8a/Bh5AJkRxMneV86fy+21pUBKwslcDwBkzZuC7777DrVu3nIaIjn/Hjh0LWYbytGnT0LNnT1y9GpuglABgtmzZEBkZiTx58qBz586ad9HX1/Xx48OHD0H/caEFlCNHDly7dg2pUrkPVLY6x7Tw20xYjwM3fNHvjcJoVymn9CMCQq6iy9x9KJEtFZZ0tRe8Lt2YzYpk39q1a1G/fn1EPvVB2SEOr9uhvnU9BgArD9+oxREt/7yKaRwRm0EC9DVHbY6xKlliXxzsG1eE3cxs0T69bOK6Y1fw6fz92q/gRZ/Y05jVtx965S6a/LodlC5iZ0/Xqj1G/d59+ibaTNuF3OmSY+03zj8Y2s3YhaBTN7XbKud5DXM6VYh5hDsbzcYnvtfnBJ7BwBXBaFQsE359z5FnjuL1lh24iO4NC+Kj6nKJoBfuOR+j9zu1fVmnbi3bdw4/LDmKSrnTYG7n2PQ3Vvr+0R97sSn0GjpVzYUZ20+D0oHs6F7b6RFd5+3D+uCrGPxWUbQun93K453qLtp7Pka6bprOluojNuHynYf459PKoNhgKirmj23hjjUtkRnjWpW0bFP5oRsQ8eAJVn1ZVUvp4q6Idn9YJSc6zd6rJTX/7/MqSmyUMSb40h28+duOmKqZUyXFlh9rydzqVCf8+j3UH7cNKZL6YX/vuClXXM2hfr55X6O0VscG1NfaqD16M87fisTCLhU1UoarMm1rOH72P47mpbJg5LslsO/sLbSaslOTNQz4ztoJ08bjV/HxnH0onjUVln4a99v0+Z/7seboFfR/ozCIOa9ijbKd9P2mELGIiAiPf78tT3QC3eDVAHDo0KGYNWsWjh8/7jQ8BQsW1MAfgTqzcv36dZQtWxbt27fH4MGDY6rT/69bt6525Lt+/Xr07dtXe17v3r1dPrJ///4YMGBAnOvz589H8uTJzbpi+frMEF/sv+GLd3I/Rc0sUdL3H77pg6nBfsiZIgrfl3wqfV9CVYx8CnTf6fDMjqz4BEk84wDET7v8cPeJD7qXeoKsktNz6yHQb6+jL1SS+EZhZCXPjuGhGz6YFuKHXK9G4bsSnnn2xfvA8AOJkCJRFIZWsPbMsNvAL0cSIf0rUehTxvneX4/44cRtH20s8qd6hi+LPUuoZeLU7uaLPlgc7ofS6Z6hY0FHn+aG+mLXNV80y/kUdbPJvS87LvtgQZgfir32DF0KO9u295oPZof6xcvuScd8ceyWL+pkeYYNF33xauIoDCnvPMZTg321fJ/v5X2KKpnk+m00CUFXfDD/pB+KpHmGrkWcbemz2w+3H/vgx5JPkD2FuimcFuyrZS7gUibdM3SInh8rrfbY6YcHT33Qq/QTZDKJyhHtrpUlCpOO+SFb8ih0K2XtPbDSP7O6F+4BPx+M3UfSJInCgHLW+3P1ATB4fyIk9Y3CCAv7kH6+eV/zRRTGVnH0o/8eP9x85IPvij9BLjdhlhsu+GDZaT+UT/8M7Qs8w6k7wLjDiZAuaRT6lrVm09GbPpgc7IfsKaLwo8G3aXqIrxb33jLPU1TPbP9dMJsfun7//n20bdv2JQCUGSxP1nEFpMQ2du3apRE5Zs+ejZCQEKfmCxQooHnsevTo4bZbhPAbNGiA1157TSOR6D0x4s2jR4/GwIEDtcXgqjxvD2Db39Zj/3Vf9G1aGO0ry3sAN4RcxSdz96Fk9lRY/In3ewAfPfNB6cEOD+DBPnWRzEMIsOKwAC2OaOUXVVEgk3svAs/55duRqD4y1gNI0kn7+1hLdkrPcvfLdX3wFXSdt9+j80MJY5tO2IG0KRIjqIc1D+DeM7fQeupO5EybDOu/df5F33b6LuwKd3gAK+Z+DfM6e4cH8I/AMxi0IhhNimfCL60dHsBuiw9h6f6L6NawAD6uLiepRvJsPy07ijqFMmByO+ejyn/3n8f3i4+gQq40mP+RPQ9g5z/2YHPodc0jSZ4Uo/npMncvAkKuYWjzolqqDbtlyb7zmnIJSddN+8DZm1ltxCZNWm3ZZ5VB6aHM1qjdPnw2fz/WHrsSc3vT4pkxrrV1D2C5IRtwO/IJ/L+qpsm6uSui3R9UyYnOf+xF0SwpseyzhPMA8vvI/aaUKZt+sC7LefrGfdQbuxWu9iFX+4x+vnlfI2Wj4GgPYK1Rm3EhIhKLP6mkHcm6KjO2hWPY6uNoVjILRrcsAXf7hdm62Rx6zWl+9PV5/Qx4swjaVszx0gNoNqDxvJ4gHkA6MqX/3BUiepBnze4R8J07d9CwYUPNM7d8+XK88sorbtvbtm0bqlevjkuXLiFTpkxSw6oyhoBe7FbjVmPfdV9YkbaijjPV3lWuJSnjFFcSYzseR/mgaF9/rcWjAxsieZLYX87x6YaVQHJu58rtSFQcuj6mWVE83Upf3MWumAVCW2mH67JmqB3FgT2nb+Kd37cjZ9rk2NzNGTy2mrQDO8NvaM3opetUxueYjcHMbacw4L+jeKNkFkxo6wA73/99AIv3nkOPxoXRtVY+s0do12Ml5WIVRfjGf/edxVd/HUSF3K9hYde4slUyDbA02ie18mLypjAYSXoxUWTEOyXRqkIOmcca1uGchkYpbYwIUSrmj1PacAeblsyC36Lnx4phJfr7407kE2z4vhbyZnD/4020u0O13E4EOBU2ytjBCh5c1w5jlu410/h2ZZ9+vnlfE7XNZaUyp20Jw+AVx8CEnt3hN/DupB1ayMjGH6392OQUZa5y1DIjnglRKudP5fdbZo14Q50EAYCyhjMJJCgoCBUrOn6B0/+vXLmyWxIITSyBv6RJk2LlypVSx7MTJkzAjz/+qMUb0n0yReUCEgFgvzeLgthtssUs2absc1TWE1/sJ1G+KNJ3tdbckQENkSKpZwCglUBytvXKnUhUHKIWAJoFQtsZ92MXb6PxL1u0GLPdvR0xPrKFAWCOtMmwpZtzUHfLSdsFD6CzdJ3Kzdms7zO2nsLA5c4A8IeFB0B5/bo3KoxPa8sBQCNJOT0ALJ8rDRZ9GjdnmVkf6TorqVB/KJ2GkaQXE0U8BQCNklobSaupmD9Oah0DAEtkwW/vO3sjZcatRD9/3Hn4BAE/1Eae9O49gGIyb0oETQQ4zoCgwkaZ/usBoB3ChAgAkyX2w7FBsRkruA+u7NPPN+9rPj7AqWFNtdtlpTIZADKhZ1f4DbSMJwAkdRci5+mLnhClcv5Ufr9l1og31PFqAEgDRGlgLly4gMmTJ2vjRUSNXLlyxaSBOX/+vBbL98cff2ggkTx/RCyg831i+aZIEbt5ZMiQAX5+ftq95OkjNjHFAAYEBOD777/XUsf88ssv0vOicgHRwm89bjX20hHwG0XRSfJIizpvJrcjbaDCiuKL/RS+KNzHAQAPD2gI8rp5ojAAXPddTeTP6D6XGLdHAvT065lLShfsO7P+udu4VLC0YwGgdcmpvWduosXE7XiRAOD0racwaPlRvFkqK36NZpn+uPAAFu45h26NCuGz2vnNpki77k4+jT2AngCAn7+eD78FmADAd0uiVXn7HkB3snblB8eVVlPxcWUWJw9+kxKZMfF9R5oeK6V4P3/cffgEG3+ojdwmAFC0m9jWYgYEFTbK2MESblzX6N2SeY6Rgod4n2sA6Dzf4r4WPtwBAGWlMvld0wNAAuYE0K0UM5lSVs4Z1qIESD9b5fyp/H5bGZOErOv1AJASO+sTQZO3jhNBh4eHayxeAnG1a9fGxv9j7zqgsyi69kNC79KR3pv0jvRe7F0/FVHEAqJUqaGD0qUpRarSBBEQCL2G3pJACL333nv4z903N5l3s/vu7G7GhPNnzvnOJ9mZ2blzZ2ee986991m3DnXqGJuljx8/ruUQDAwM1AI+jhw5goiICOTPnx8tW7ZE69ato9LEyChF5QISASATY8uMieqoyDMn+27ZemYAMLR3Q6RJnkS2G5/1KLn0zfuPsap9LctIQlMAmDwxQnvHTL9gNUAZABibeRo57YQTyilfaR3e+XUzKEqYiv4qVOXmbDW/eqsE1WcA2KlREbSuIwcAmVNYpJTjdy/eewbfzQ6GGwDIVHrf1S2I0WuOIH3KJNgb0NBLPObPHfJOKbzrAgAu2HMG7eYEQ0/ZRy9jZg2RWk2F/vQAUEzTY6VT8XmJgEDcffRUCgCKclMaGDHNiAoZZeTgtEyxBQDN8pGayafXtxEAlKXKZGs7/9jylTbKam42Hr7slaZHX5/TCCUAQKuZjJ3n8R4Axo6Yanr5rwBgj2bF0LJGfmkhAvfFPtOE9MslK5oBwJDeDZE2lgBgqd7LNUfy1R1qoYCFHxEP+8qdh6DrEy5OqNWorU8AGJmoOzap+jjxrBPKKV+Z/ck3kK6IqVTI8wLmfRPtCxdXhyuNRe+XRH/rPC8YFNRhBwAaUcqx7v/dewZtZgejfO70mG9AXC+z1JlKr229Qhi1+jCMKL2aT96u0TcOfbe0RrfltPyz5yx+mLMXeso+6o+ZNURqNRX640S+LIOYqNuOXMUDAnHv0VOs71QbeTL6vgIW5SYAKCYaViGjjBycmJ3rGvnXyvTDFG5mlJRm8un1Le5rxwc11fLgMlXmv99Vx0s5zINA9P62vhLHW8m06fAVr0Td+vrMJPPTWyXxQYIF0Go6XT9PAIAuplA1APzgl0DsuuIH+wDwPL7+Y3eMA9uFqLHeVNy4IhL5oUgPzxVwcK+G2iEZG8WOIzm/7+qdhygvAEAzDk6r8fk6eJiqz8wR2qpvo+dMPeWEcsoXt+db44K0qD8q5fO8gPnxBABO3HAMA5Ye8KIa+3FeCObsPI2ODQujTd1CUtPIlHJGQGVJ8Bm0nhWMcrnT42+HAJCZVH6oXwgjVx2G0Q8KDhQZ9m5pvO0CAC7cexbfz94LPWUfTQQHRInUairAUetIKi+efJGqT0ohkZWK9QzE/cdPsaFTHeTO6DuHkyh3i2r5vLhmVcgoIwczeHDdPBlTYr3NgAlqG0Xh5u+HQwNicpKbyafXt7ivHRvYFH5+iTRXF7IMLmlbHSVeNAeAU4OOo/fiMHBAjy/ucKu5CTpyxYurWV+fA6J+frsk3q+YcAVsNZ9unycAQBczGN8BoJvoRRfTItVU3LieJfJH4R7LYh8A2nAk50ET/yj9euZidGUnI6Cvg8cqEk6mf30dBoBOKKdCztzAa2OCQKkqNnf1Tnnz5rgg7IkEgHogFFeHK8nOAPDNsjkw4v0y2nR0mR+C2TtsAsBISjmjq8qlwWfx7ay9KJsrHRa0dsaowwCwfYPCGL7yENIYuBRwoMjw90rjrXLOLYAyAFCkVlOhv9Yzd2NJyPmo5ekWAG7sXAe5MsgDQOICpkACzoCgQkaZ75MZPLiuk4hZamtE4Sa+3woAsr7FfU0PAK2oMqdtPoFei/ajWWRAz5ajV/HhxK2aWw2519gpm49cwUeTtqFw1tRY0S5mW31EvEr9qTy/7cxJXNZNAIAuZl/lAqKF/+Evgdh5xQ92qK1InGWh5/HNn7tRKa931KYLUWO9qfhhw88fhbpHAsCAhkiXMnYsgHYcyVnA63cfoawAAI2iNmUmw9fGZeUILdO/vk7omZt4dcwmZE+XHFt0IM6qP19t3xgbBLoipqKnrlO5OVuNecKGoxi4NBxvlc2B4ZEAsOvfIZi1/TQ6NCiM7+rJWQCZUs4oWGFZyFmNsaVMrnT4xyEAZCo9GtMwAoAGQUUMAEe8XxpvlnUOABcFn0PbWXtiUPbRXBoFRKnQX5uZu/GvAACNfCutdEvPi/ZchgePIyADAEW5iXO51YxdUWtVhYwy4z9+5S7qDF0XVdVJwAQ1Pn/zPqoOWgORwk0GAOr1Le5rRwc2BeUDlKXK1H8jm49ewUcTt6FQltRYaRcAWrSNioiPDIhSqT+V57fMGokPdRIAoAstqFxAtPA/+iVQYzbo1rQoWtWUS2tB4iwNPY9vnyMAmMjPHwUjAeDegAZInzKpC61EN7XjSM6tbtx7hDJ9oy2AKgCglSO0E+HZiucGABpZD18fGwS6ItZARK70+Kd1dDoUlZuz1RxE8ZN6AcBQLa8fWdvI506msHXDFwA0I66X6f+DCVuw9dg17Vp66IpDWoQ7RbqLhQNFYgsAVs2fEbNaeSeAjw6Iio6IV6G/72btweLgc1HiNSieFRM/rSAzVV51ivRYhodPIrDpxzrI+YJvCyADQJKb8gB+FQ8BYP5MqbDGZsSsCACJwu3IwKYx5tFMh3p9i/vakQFNkNjfDxwZLgYGGSlKz7vNVjw3ANDMeqgPiFKxRllGlee37QUfRw0SAKCLiVe5gDQAOCoQOy77oWuTovhKMrEtiUNXMHQVo0/c60LUWG8qfth+/olRoNtS7R17ejbAC6liFwDKOJKzgDfvPUbpviui5DVK3CszGb42LitHaJn+9XV8XeNa9efr+ji+AsDf1h/FTwJBPcnYbUGoltalXf3C+L6+PQDI11viXAWGnMXXkZzNCw2I663mlZ6/P34Lth2/pgWmDFl+0CcAHPl+GbxRNodMt4Z1CHgRAKuSPwNmt6rqVYcDosSIeBWHK1kgCZBxqV8sZoJtGQHJJeTRkwgEdakLSqLsq4hyU75UAoDsrqBCRpnxn7hyF7UFCyCxmazpYC9lCr3nws0HqDJotWaxI8udvpjJp9e3uK8dHtAESfz9oiLDxcAgI9lm6NwkrK5xfc2P1fWxPiBKpf5Unt8yayQ+1EkAgC60oHIBiQDQDrMBifNvyDm0mbkHlfNlwJyvvA8CF+LGalMzALi7ZwONLSE2CkcSyjiSmwHAjKmSYldPe4mVqS8ZAFgkaxosb2efHspobnwFcljNpa8AktfHbELwGQ89Yulc6bEwnlgAKanyz4HheLtcTgx7z0MFxwCQAi5+qF/YSmztud7BXWwUGHo2irJvURt7pPfcz3vjt4DSZlByahovUXrt7+ud0JcjhX/5oAxeL+McAPr67jkgSoyIV3G4xgSAWTCpeTR9oJRSABTuvgyPnsoBQFFuAoBf/7ErKmBJhYwyMpy8ehe1hkRfATsFgEThVnngaogMHuL7zeTT61sEgIf6NwFFFRtFhhsCwK0n0fOffeBAKatADl/zYxVAwgFRHBGvUn8qz2+ZNRIf6iQAQBdaULmAaOH/b1Qgtl/2s8VsQOL4sgS4EDdWm4oftr9/YuSPtADu6lEfGVPLMbFYDYgjCWX8iKIA4P3HoOsTLk6YNawAIG+gZo7QVnIZPfeVysWqP18pZF4bswkhDABzpoNoCVO5OVuNedy6IxgceFBLm0KHBZXuC0Lx57ZT+L5eIbRrIAcAjSjl+N3L953zcGrnSItF3zkEgJFUemTFH7QsHCmT+iNMBwA5UMQtAPRl+WdmDZFaTYX+vp+9Bwv3RlsA6xXNgt8/sw8AC3VfisdPn2Fzl7p40cICKMr9+ct5vTIgqJDRam3Sc6Zw47oFMqfCagcWQKZwExk8pABgZAAc65vyofK+drB/YyRL7G8YGW4kmz5VkpsbDKsUMuwPyxHxKvWn8vyWWSPxoU4CAHShBZULSASAdpgNSBzRJ0bvC+RC3FhtKn7YiRMnRr6univgnT3qI1MsAUA7juQs3K0Hj1GqtwgA7TNrWAFANz40ZkrwlczZSnG+kki/OnoTQs96LIBEGL9IuApVuTlbjXns2iPaleq75XNiSCQA7PFPKP7Yekrz/yM/QJmiT3Irtlmx78m3LRYAACAASURBVBxa/bEHJXOkxWKHAJCp9CiQi9LWGFF6caDIqA/LgtgWnBZfvr8cECVSq6nQ3w+z9+AfAQDWLZoFkx0AwILdluJJxDNs6VoX2dP5vgIW5aY8gBQAxxkQVMgoox9m8OC6TiJmqa1ITckMHjIAUK9vcV8L79cYyZP4RwUGiZHhRrLpk6W78WG2SiKtj4hXqT+V57fMGokPdRIAoAstqFxAtPA/HhWIbZf9bFFbiQCwWoGMmPmltzO4C3Fjtan+w87bZUmsA0A7juQs3O0Hj1FSAIBOmDUsAaCLKDozJfiic7NSnC8auVdGb8S+s7e0LkrmSIfF30WnQ1G5OVuNmQHgexVyYvA7HgsgXVNRXj87AFBPcyW+d+X+c/hyxh689GJa/NvWmQWQASDl8uy/5ACSJ/FDeD/vfG4cKEKUdsS24LT4iv43iohXob92c/ZiwZ6zUSK4BYBbu9ZDtnTJfU6JKDcFgYgBcCpklNGPHgA6CZig9xgxeNgBgEylJ+5regBoRZWpp0t0k8WAeYTNoqL1EfEq9afy/JZZI/GhTgIAdKEFlQtIBIB2mA1IHF/5wFyIG6tNzQDgju71QaArNoodR3J+H/GP0mHJxQmzhhUAtHKEdiI7sXUQa4cTxoHwC7fQeORGGF13Nxu1EfvPeQCgnrpO5eZsNQcMAN+vkAs/v1NKqx6wcB+mbzmJtnULon3DIlZdaM+NGEW44ar959Byxh6UeDENlrR15qvJVHpE50jcxUaUXhwoMuajsnillHMAGLjPkwDeKP8nR8SLAVEq9Nd+zl78LQDAOkUyY0qLSlK6ECtRUNjTiGfY1q0esqb1DQBFuSkPoBgAp0JGGWGYwYPrOnX3EBk87FgA9foW9zUGgLJUmRRZ3/XvUHBAj5s8pjtPXMM7v22BWV5EjojngCiV+lN5fsuskfhQJwEAutCCygVEC/+T0YHYesnPFrXV8woA83VdgmfPgO3d6yFLGt8bvqzK7DiSc593Hz5BCcUA0MoRWlY+sd6uk9fw9q9bXAFAo4CXpr9sRNh5DwDUU9ep3Jyt5mDMmsNaWhURAPZauA/TtpwE8e52iEUAWDx7Giz93hkAZCq9gFeKo++/YZrzPTnhi4UDRWILAOop++hdRtRqKvTXfu5e/L072gJYu0hmTHUAAPN3XYII2g+61UMWSQBIcpMFkALgOAOCChmt1iY91wNApwFfRhRu4vvN5NPrW9zXDvRtjBRJ/SFLlRkNAD0BPW6YjBgAmjGj6AOiVOpP5fkts0biQ50EAOhCCyoXEC38T0cHYsslP1vUViSOL05QF+LGalP9h21nw5cdCANAGUdy7vPeoycoHhBtAXRCrUZ9+dq4rByhZeUzAoBOKKcOXriNRiM34HkCgKNXH9YSK39QMRd+ettjAey9aD+mbj6BNnUKomMjexbAN8q8iJEflPWa+tVh5/HF9N1wAwCZSq/3q8U1Oi1fAHDsR+U0ui2nxRcHuBG1morDtcPcYMzffSZKhFqFM2Pa5/YtgHZ+EIpykw+gmAFBhYwy+mEKN65bNFsaBP5g/0eEEYWbDADU61vc18L6NkLKpIkhS5U5e/spdNEsgN4A0AmXOf9QNdun9AFRKvWn8vyWWSPxoU4CAHShBZULSASAdpgNSJwFe86g3Zxg1CiUCTO+qOxCQnVNzQCgzJWP7Kg4klDGkdwMADqhVpMGgA6TwxrJb3W14mvODl28jYYjNmjpdygNj1ia/LIR5CNIRc9drHJzttLxqNWHNWq1DyvlwqC3vAFg6zoF0KlRUasutOdGlHLccE3YeXw+fTeKZUuDZQ4Ob+qHqfT6vl4CAQv3I6kBp+t7kZHC4/5XDk1LOgeAy/df8MqBJ06AUUCUCv3pAWDNwpkx3QEAZJ9gmRsBUW5KAyPmQlQho8zCYgo3twBQpHBjBg8ZAKjXtwgA9/dphFTJEsMoMtxItjk7TuHH+aHgiO61By+hxZQdMVxCZObFylWFA6I4Il6l/lSe3zJzER/qJABAF1pQuYBEAGiH2YDE+Xv3GbSf+3wBQPb5kXH6llUZRxLa6fP+o6coFhAY9QonzBpWAJAj4ZzSQxnJb+Vc7WvODl+8jQYjNsCI9aTxyA0Iv3Bba14se1os+z46GELl5myl419WHcaIVQQAc2PQWyW16mwB/LZ2AXRuLAcAjSjlogDggfP4fNpuOLXeUD9MpdfvjZe0IBUjSi8OFPn1f+XQxAUAXLH/ghcNmjiHHBAlpkRSob+OfwVj3q5oC6DTH6EMAGV8gkW5CQBSLkJmQ1Eho9XapOdM4eYWAIoUbszgIQMA9foW9zVioiFGGqPIcCPZ5u44jc7zQ8ABPWvDL6HF1B0xgsJk5sUqWI0DojgiXqX+VJ7fMnMRH+okAEAXWlC5gGjhNx8diM2X/GwxG5A483edQYe/guH017eLKZFuqv+w7aR9kH2JHUdy7vPB46co2jMaAL6YLjk22+TWtQKADNacEsQbyW+VXsHXnB25dBv1h29A+pRJsDegoVdVEQDqgZDKzdlKxyNXHcLIVYfxUeXcGPimBwD2WbwfU4JO4JvaBbTcmTIlilKuXA4Mf6+MV5O1By6gxbRdKJo1NQINiOtl+mcmlQFvvoTuC/bBiNKLA0V++7gcGr/k3AK4Muwivpy+MwZlH42TA6JEajUV+uv0VzD+cgkAnz17ZistlCg3XQF/P3tvFB+yChll9M4MHlxX/+NJpg+qI1K4MYOHDADU61vc10J7N0Sa5EkgS5U5d+dpdJ4XAg7oWRN+EZ9P3RkjLZSMTFbpqjggiiPiVepP5fktMxfxoU4CAHShBZULSAOAYwKx+aJzAOjU/8bFlEg31X/YTq5rrV7mxK9QDwCJhoroqOwWXxuXm+tas3G48Ss8cukO6g9fj3QpkiC4lzcAbDRiAw5e9FgA4yMA/F/l3BgQCQD7Lg7D5KDjtgAgU8qJjCI8x+vCL+CzqbtQJGtqLHcJAMlKSZGURpReHCjy28fl0filbHaXWlT9VWEX0dICAIrUaioO187zgjF3pzsLoAgAZRLDi3IzAHy5YEb82bKKT19cxxMt0ZAZPLiq3n1CogutihGFmx0AyPr2BQCtqDL/2nkaneaFgAN6Vh+4iC+m7YQTjmyrhPX6iHgVa5TnT+X5LavfuK6XAABdaEDlAqKF/9mYQARd9IMdaisSh65g6CrGaQSeiymRbqr/sJ0EbFi9zI4jOff18MlTFOkRbQFUAQCtHKGt5DJ67iay+OjlO6g3bD3SJk+MkN6NvLpvOGI9Dl28o/1NH8mocnO2moMRKw/hl9WH8XGV3Oj/hscCSGlWKK/f17UKgOgTZQpTyomMItxuffgFNJ+6C4WzpMaK9rVkuotRh6n0fnqrpOZIb0TpxYEi4z8pj0YlnAPAqINZR9lHgzL6vlTo78d5IZiz83TUPFQvmAl/tLTnhxwR8SyKGUiGGlKUu0W1vPhhzl7we1XIKLMQmMGD6zoJmNAAoMDgwRRuUgAwkkqPA+DEfS2kd0OkTZ4kKjLciiqTzxM2KDDg1lNDysyLFWUlR8RzQJRK/ak8v2XmIj7USQCALrSgcgGJANAOtRWJo//F5kJEZU1jAEAb5O+yg7LjSM59EgE9XZ9wUQMAnefsM5Odcws6oZxiAJgmeWKE6gBgg+HrcfiSBwDqc5mp3JytdEwBIBQIIgLA/v+GYdKm4/iqVn50bVLMqgvtuRGlnB4AFsqSCivb15bqT1+JqfR+fruk5khvROnFgSKxBgB1lH00JiNqNRX66zI/BLN3RANAtsTZmTzK/0fuG1T29GyAFyy4wUWLFKWBoQC4+AYA9Tk0ZefDiMJNBgDq9S3ua2TlJ2u/LFUmA0B2KeIrdzcA0My1Rh8QpWKN8vypPL9l9RvX9RIAoAsNqFxAtPBbjAnEpot+tpgNSBy9z4YLEZU11X/YTlg7rAZnx5Gc+3r8NAKFukcDwJwvpMCmH2P3CtjKEdpKLqPnbpJLH7t8B3WHrcdzBQBXHMSoNUfwSZU8oAALKgOWhGHixuP4qmZ+dG1qDwCKlHI8vxsOXsCnU3bBDQBkKr3B75TS/Kh8AcAJn5RHQxcWQF++WUY+tioO165/h2DW9mgA6ISN6MnTCBSM/Ab3BjRA+pRJfX4Sotx0BSxmQFAho8z3KVK4UX09i45MH1THiMJNBgDq9S3ua8EBDZEuZRLIUmXqfcp9+ZpayRVy5gZeGxMEMwCoD4hSqT+V57fVPMSX5wkA0IUmVC4gLwBog9lAA4C6qC0XIipragYAxShFty93Qi+nB4C5MqTAxs5qAKBTcGk0L5td0Msdv3IXdYauQ5pkiRHax/sKmHwDyUeQip7OSuXmbKX7YSsOYvSaI/i0ah70fd0bALaqmR/dJAGgEaUcv3vjwYv4ZMpOFMycCqs6OLMAMpXe0HdLa24ZVPSMDhwpPPHTCmhQPKuV6KbPfUVnGkXZq9CfHgByNK4docRvUAYAinITABQzIKiQUUYWkcLNDQA0onCTAYB6fRvNqVFkuJFs+qwSvqLNreYm9MxNvDpmE8yyK3BAFEfEq9SfyvPbah7iy/MEAOhCEyoXEC38z8cEYuNFP1vMBiSOPm+TCxGVNdV/2LK/RmUHZNeRnPsVrQ/0NyfUatTO18bFkXBOr5cNAeCRK/ho0rYY17Qy83Xiyl3UHrpOSw1BKSLEUm/YOhy9fFf7k57QXuXmbDXuocsPYszaI2heNQ/6RALAgUsPYMKGY/iyRj50b1bcqgvtuRGlHDfcdOgiPp68E06u1bkPptIb/l5pDZgYAUCOFJ70aQXUdwMAfeRn44AoMc+mCv1RoAsxR3Cpkj8DZreqKqULruR1XRlprfLVgZiXrkW1fF4ZEFTIKCOMyOBB9UvlTIdFbaJ5tGX6oDoihRszeIhtzeTT61vc1/ha3Sgy3Ghc+ryyvvJNWsm17+xNvDJ6E8zyq0YHRHki4lXqT+X5bTUP8eV5AgB0oQmVC0gDgGMDsfGCny1mAxJHn7ndhYjKmuo/bCOmAjcvt+tIzu8S/Y/ob06YNaidr43LKhLOidxBR67gf5O2xQjUkOnr5NW7qDVkHVIl9cf+vo29mtQdtg7HIgGgHgip3Jytxj1keTjGrj2Kz6rlRe/XSmjVBy09gPEbjqFl9Xzo8YocAGRKOZFRRA8A87tI2M1UesRtSsEJVI4PaopEdBccWThQ5PfmFVCvmHMLIFN0GQUcRAVECdRqKvTXbUEoZm6LBoCV82XAnK/sAUAxYIH91XytB1FuygNIllYOWFAho9XapOcigwf920nELLUTKdyYwUMGAOr1Le5rHFgjS5WpZ5byxThjNTcMAM0YljggiiPiVepP5fltNQ/x5XkCAHShCZULiBb+F2MDseGCH+wwG5A4evJuFyIqa6r/sI24St283K4jOb9LBI70N6e5+nxtXBwJ5zTHoNG8bDp8BR//vs1R0uJTV++h5pC1SJnUH2F6ADh0HY5d8VgA82dOhTXCVajKzdlK94MDwzFunQ4ALjuA8euP4Yvq+dBTEgAypZzIKMLvDjp8Ef/7fSfyZ0qJNR3rWA3J8DkzqRCzAeWno3JsYFP4UThwZOFAkcmfVUDdos4B4PpDl9F88vYYjC3aOu6yRHubyKyhQn/dF4TiTwEAMievnckTU5ZwxKqv9qLcdAUspixRIaOMLCKDhwYADSKzZfoxYvCQAYB6fYv7GqfWMQoMMhrTwr1ntbXLAT2B+87j6z92w4hz2kqm/eduotmoTciSJhm2d68fo7o+IEql/lSe31bzEF+eJwBAF5pQuYBiAwCSPxH5FcXHov+wOSmpVU4qWVnsOpJzv+LVMf3NKVuHr43LyhFaVkax3sbDl/HJ79sdAcDT1+6hxuC1SJHEHwf6eVsAyTeQfASp6C1hKjdnqzlgAEgHfq9XPRbAn5aFg/L62QGA0ZRy0Ywi/O7Nhy/ho993IF/GlFjbyR0AJGYDYqigoqf04kCRKZ9VRJ2iWaxEN32+4dBlfGoBAEVmDRX66/FPKP7YGm0BdAsAOWmxr0kR5aYoYDFpsQoZZRQkMnhQ/TK50uOf1i/LNPWqIzJ4MIWbHQDI+jZyiZHNvcoAkAN6loWexzd/7kbFvC/gr6+r2ZIp7NwtNB21EZnTJAONTV8YAHJAlEr9qTy/bU1KHFZOAIAuJl/lAqKF33JsINZf8IMdaisSh65g6CrmeQKATEu0rmNt5M2UyoVWPE3tOpKLL+Rfz6oAoJUjtBPh+RB0QlvGADB5Ej+E92vi9fraQ9bixNV72t/0YFjl5mw1Bz8HhoNy+IkAkP/2+cv5EPCq3BWwEaWcHgA6tQJTP8ykQswGxFFLRU/pxYEisQUAjVgnjCLiVeiP6O5mbD0Zpb5KeTNg7tf2roBFCyDTlskAQJKb8gASbRmzVqiQ0Wpt0nM9ACybOz0WfOsOABrNhZl8RvrWB8XJUmUyAOSAnqWh5/GtSwCYKXUy7OwREwDqA6JU6k/l+S2zRuJDnQQA6EILKheQBgDHBWL9eT9bzAYkzp/bTmq0Uw2LZ8WE58QCyMTkazvW1oCG22KU9kC2TxEAOvX/8rVxWTlCy45TrMcA0Anl1PMIANnaJ4I9I6ug1VwyABQp5bjNliOX8OGkHY7dAEQASIltW8/c7RsAtqiIOkWcWwDNrMBm1GoqDteAhfswfUs0AHRiJbKyeul1KspN60HkrVUho9WaoucihRv9u1zu9PjbAQA0YvAQ328kn5m+9aBQlipzUfA5L35lBoBOwP2B87dAbhFmAFAfEKVSfyrPb5k1Eh/qJABAF1pQuYBEAGiH2YDE+WPrSfT4Zx8alciK8Z88H1fADADXdKiF/JlTu9CKp6lR4lPZTr0AoM7vTbYPGQBo5ggt+w6xni//L6v+zly/h+o/r0WyxH442N/bAlhryFqcjLQA6i1hKjdnqzEPMvD3M/ILtOqHOYVFSjlus/XIJXwwaQfyZEiJ9Z2dXQEzlR6ltaBrMyp6TleOFJ7aoiJquwCAZn6gRv5fNA4V+tMDQCd+YlZ+b3qdinKTRZgSbtcrmgW/f1ZRiYxWa4qeixRusQUAjfwhjXRopm+9X6BRZLiRbIuDz2nWa47oXhJyXvsx4+R6P/zCLTQeSQAwKXb2aBDjdRwQxRHxKtYov1Tl+S2zRuJDnQQA6EILKhcQLfwvxwVi3Xk/W8wGJA5dwdBVTOMS2fDbJ+VdSKiuqf7DLtl7OW4/eILVHWqhQCwAQCPqI1lpOIKO6jtNASIDAM0coWXHKdbzFQFq1d/ZG/fx8k9rkDSxH4huSiw1B6/FqWueK2B9RLTKzdlqzEYRv0aRwVb9GFHKcZttRy/j/YnbkTtDCmxwkAuS+mEqPYpq/PqPXVrXekovjhSe9nklLXrVaTGLBDeKAFUFAHst3IdpggWwfJ4XMP8be35iVpGv+vkR5SYASJR79YtlwaTmcQgABQo3Gq+TeaB2VhHRRt+gmb71kcFGkeFGa+/fkHNoM3MPOKJb/2876/XghdtoNHIDMqZKil09YwJADojiiHiVe4zK89vOnMRl3QQA6GL2VS4gLwBog9lAA4BbTqDnwv1o8lI2/Prx8wEAS/VejlsPnmBV+1pavjm3xerqxFf//MuY6uhz38mOy9fGxZFwZo7Qsu8Q64m50P79roatLs7duI9qBAD9/XBogDcArDF4DU5fu6/1p8+JqHJzthLAKOefUW5Aq36YUk5kFOE2249exnsTtyPXCymw0QEbDPXDVHrk1N5qhgcAHuzfGMkS+0cNjSOFp39eCUS35bRsNskFaZQDThUA7L1oP6ZuPhElgpOrT6vcd/r5EeWmNDCUi7B+sayY1LxCnFkARQYPGq8TSyi1s8qJaPQNmulbb/GTpcrUW/z0FkE76/XQxdtoOGIDMqRKCkpHoy8cEMUR8Sr3GJXnt505icu6CQDQxeyrXEC08FuNC8Ta836ww2xA4kzfcgIBC/ejaclsGPe/5wMAlu6zQiM+X9W+JgpmSeNCK56mdh3JxReybwz9Tc9+ITswXxsXR8KZ+cHIvkOs54sFwqq/8zfvo+qgNUjinwiHBzT1ql795zU4c90DAPWsKCo3Z6sxM+2b+G0YsYNY9TM8klJOZBThNtuPXcZ7E7bDDWMLM6nQlVbL6Tu1rsP7NUbyJNEAkANFZnxRCTUKuQCAJmwwZgFRKvSnB4BOgh+s2C9iAEBBbgKAYgCcChmt1hQ9F2WgfzvxhaR2VsFsRvKZtdGzg8hSZep9/vQ+gTLzwXUOX7yNBiM24IWUSbAnoGGMpvqAKJX6U3l+25mTuKybAABdzL7KBUQL/6txgVjjAgA2K5kdY/9XzoWE6prqP+wyfVfgxr3YA4B2HclFSTk6jv5WOGtqrGhXy/ZE+Nq4rByhbb8MgC8eWKv+Ltx8gCqDViOxXyIcGegNAOlqmK6IqeiBkMrN2WrMRry/vsCcWX8MGkVGEa6749hlvEsAMH1ybOpSz2pIhs8ZANKV1hfTfAPAP76ojOqFMjl6DzViPugYlH0CvzXzwGrg4vFjLF26FE2bNkWSJEkcv1ds2GfxfkwJirYA/hcAUJSb0sCIAXAqZJSZKNGKSfWdBExQO6t0VlYAUNS3PupXlipTn/ZFnxZGZj64zpFLt1F/+AakT5kEe30BwMiAKJX6U3l+25mTuKwb7wHg9evX0bZtWyxatEibp9deew2jR49G+vTpTeetdu3aWL9+vdfz999/H7Nnz476m5N+9S9UuYA0APhrINac87NFbUVjnLb5BHot2o/nCQCW7bsC1+89xsp2NVEoq3sLoF1HclG3nB9LFQC0coR2siGsPnBRAxhOKKcYAPr7JdJy1IlFBIB66jqVm7PVHPT/NwyTNh3HV4J7hK/rXLP+fF0bMwDMkT45ghwCQKbSoyutz6d6AKCe0osDRWILAOrdFsyuEVXor+/iMEwOOh413U7y34nXp/rrciM9MgAkuYkZhgLgOAOCChmt1iY9jwEA82XAXJuMKHoAyBRu4vuN5DPTt5j3j6jY8nVdqnXFiaHN5GIAyNfYsQEA06VIAmJ50Rd9QJRK/ak8v2XWSHyoE+8BYJMmTXDmzBlMmDBBm69WrVohb968WLx4sU8AWLhwYfTt2zeqTooUKZAuXbqofzvp978GgF//GojV5/xsUVvRGKcGHUfvxWFoVio7KP1EfCz6D7tcv5Wg7Pkr2tVE4VgGgEYUSr7mhCmSqE6RrGmwvF1N21Poa+OycoS2/TIADACdUE5dvPUAlQeuxvMEAPv9G4bfCQDWyo+uTYppU+YroMMKAIqUclx35/EreGf8NrgBgEylN6VFRbSYssMnAPyzZWW8XNC5BXDrsav4YMLWGIFLZoEEKg5X1gvPoRMGDHIFIZcQKvqAGSM9inLTFbCYAUGFjDLfpxjIQvWdUOJRO7OADh6DkXxm+uZ9bXOXuhoXb/5uHgDI1HBmcumZP/TMIDLzwXWOXLoDsoqbAUB9QJRK/SUAQCBeA8ADBw6gePHi2Lp1KypXrqytIfrvqlWrIjw8HEWKFDFce2QBLFOmDEaOHGn43Gm/cQUA7TAb0BinBB1Hn8VheKVUdox5zgDg8h9qokg29xZAcQM2IlGXBYBOEitT3zIA0MwR2s6GynVXhV3UfMycHLiXbj1ApYGrQexkxwY183p9tUGrce7mA+1v8ckCyJYmMUUSA0CjlC5mc+orcnjX8St4e/w2uKHsqxtJpUcRvkTTRkX/g4QjhWe2rIxqLgDgtmNX8f6ErTEo+8yo1VQcrjEAYM50WNimuq0lLaZQkQGAotwEAMUMCCpklBFGvIFwAwDNUrr4AoBm+ha5fwkAkk+gHAC8oEWwcySznhtYZj64ztHLd1Bv2HqkTZ4YIb0bxWjKAVEcEa9SfwkAMJ4DwMmTJ6N9+/a4ceOG10Kh698RI0agRYsWpgBw//79oISYWbNmBVn7evXqhTRpPMDCab8PHz4E/Y8LLaBcuXLhypUrSJs2rZ3vwLIuLfzvJq3WLICfVc2N7k2LWrbhClO3nMSApQfRrGQ2jHyvlHS7/7Iiybdy5Uo0aNBA8z+q/NNaXLv7GP+2rhorAJCuYMr2X6OJFBpQz8vp3krOEn1WadF3VIpmTY3FbeylsaB2evnEdx6+eAdNx2zWHKG3d3WWX04vw+oDl/D1zL0a6fy8rzw/lmTL5dsPUW3weiRKBBzq630tU2PIely45Vnz2dMlx4aO0dZQXzLKvttpvf5LwzFtyyl8VSMfOjYspHUzes1RjFp7FB9UzIl+r8kxgQxbeRi/bTiO5lVzo4fuG9tz8irem7QL2dImw8ZO9v1AaUwNRm7SmFSmNC+PFtM8UcB7e9RFqmSJo0RvMioIRy7fxYwWFbRca07LjhPXo6jrVvwQDboIEJTsu1rrdnf3ukiT3PNuFfobtOwgJm+OTgRdMkda/P11FVsikS9wxUFrtTZhvesjib+fz/ai3KTH3v+Go1HxLBjzYRklMsoIQz7Ipfp55pxK5Xwv4I/PK8o09apDZ1jhgJXa37b+WAsZUyfzem6kQzN98762rkMNZE2TDMV6r9L62t61Nl5ImdR0bCvDLuHbWXtRNlc6zG1VGQv3nkPH+fvwcoGMmPqZvSBDopVs+EuQtgZpLerLq2M2I/ziHUxuXg41CmZSqj86vzNlyoSbN2/G+vltW9Fx1CBeWwAHDhyIqVOn4tChQ17TQ9e7BP66du1qOG0TJ05Evnz5kC1bNuzbt0+rV7BgQQ1wUHHab+/evdGnT58Y75w5cyZSpkwZ6ypcfNIPq875oVa2CLyVzwNIZMq684mw4IQ/ymWMQPPC8u1k+lZVp/tOf9x5nAidSz1BDvdEIHjwBPhxh+egG1r5CZL4PkO8xOq41R+PnyXS/pYj5TN0Lv00VsW+cA8YFJwYKRM/OFuXlQAAIABJREFUw6CKsdN36LVEmHTQH3lTP0O7kvb6vPUI6LnLM1e/VH3iJWvALn/cfOSZi/RJn6FPeXt9x+rECZ3NP+6HDRf8UD9HBF7N7VnjgacTYdkZf1TLEoH3C8it+6hvLHsE3srr3eb0HWBoaGJXcvfb448rDxLh2+JPMS7ME/n7c6UnSB4dBIyBe/1x8X4itCn+FIXSPXM8ZUdvAaP2J0bm5M/Qo2y0nh49BTpt9+hX/27HLzNp+M8JPy1zAZdcqZ6hYyl7a+buY6DbTs94h1d5An/P8jMtoty1skdg3nF/lMkQgRZF5NZAbM8B9SfOOf27UNoItCnhbDzfb/HMRb/yT5DWHKdFiWGmb97XAso+QfqkQPttnn4HVniCVD5igPR7y47LifDHEX8UTReBb4rbk+nSfWDA3sRI7v8MP1eKuS5+CvbH+XuJ8E2xpyia3vm3IKPTe/fu4aOPPkoAgDKTFZt1zICU+I4dO3ZgxYoVmDZtGg4ePOj1+kKFCuGLL75Aly5dpIa1a9cuVKhQAfT/5cqV0wCgk37/awtg299XY9VZP3xaJTd6NpO3AE7ZfBIDlx3Eq6WyYfi7z4cFsOrP63DlziMs+rYqimV3fwVMaRjKDfBYEfb1qq+xXMiWkn1X4cFjz8ZWLFsaLGptj8uU2vmyrpAfTJPRm5EuRWLs7BbzV7DsOMV6+l/pdvq4euchqvzsCZo63M/bAlh98HpcvO2xABJzySbBEqbCgiQ77r5LwjFj6yl8UzMf2jfwWADHrD2KX9YcxfsVcqD/6yWkuhqy4hAmbDyBFtXyoFsTb5eS4FPX8M7EnZq1ZFNnZxbAeiM24tS1+5p175MpniAQ0QpH/270SxCOXbmLPz6voPmKOS27Tl6PYi5Z1S7aAkjXkaX7eazhovVRhf5+CjyI34OiLYAlXkyDf76x9/2QL3Dln9Zp4w3v00DzTfVVRLnJAkhro0mJrBj1QWmlFiRfY3r4+CleirS6Ur2q+TNgegtnrEyFenr8ITd3rgXKHSoWIx2a6Zv3tTXtqyNrmuQgiyCVnd3qaD55ZkV/u7Bgzzl0/nsfahTMiMnN7VkAiVWo/shNSJXMH3t7xIysbzZ6Mw5duqNZFsnCqGKNspwJFsA4ugKmK1P6n69CgR5kWXNyBazvl8zoyZIlw4wZM0DRwE6vgPX9qvQhoIX/7W+BWHnWT4ts6/2a3IFGY5y08Rj6LzmAN8q8iJEflHV6nihtp/ftqDhgFegqcmnbGij+ovvrdLuO5KKwxXoG4v5jz6/TEi+mxZK29hIrUztfvitWjtBOJj5wn7efjp0+CACW7+85DI4PaopEdBccWSoNWIVLAgDc1i2awF2lf47V+DnfXJs6BdGxkQe4jV59GMNWHsKHlXJh0FtyP3yYUq5l9Xzo8Yr3tfHek1fxxq9bNQC4rXtM4nqrMdJzptKb9WUVfDhxq9ZET+nFgSJzWlVB5fwZZbo1rLPr5DW8/euWGNzFoj+a6H+oQn/M0MIDfClHWthNTE4AkILCqBwb2BR+lgAwWm5trxQC4FTIKKMgMRCD6r9cMCP+bGnvKpzfE8XY0b0esqRJ7vV6I/nM9M372sbOdZA1bXIU7rFM64uicX0BQL1/8bxdZ9Dxr2CNtYZ89eyUk1fvotaQdUiV1B/7+zaO0ZQj4jkgSqX+VJ7fduYkLuvG6ytgDtbYtm0bKlXyLDT67ypVqvgMAtFPKF0DlyxZUksNU7NmTcRWvyoXEC381r8FYoULAPhm2RwY8X6ZuFxfpu/Wf9gMNJa0rY4SL0ZHazsdvOhIrudeteqzeEAg7tE9CgAnBxi187VxWTlCW43P6Lk+Us9OH74OXAbm1J+euk7l5mw1fqYc+65uQXRo6AGAY9YcxtAVh/BBxVz46W1JALj0AMZvOGaYain41FW8Pm5rDLmtxiY+Zyq92a2qaBG6RgcuB4pQmhDiV3VayBL29q+bY1D2mQVEqdAfA2qWwckPKF8/SIzmRpSbAKAYAKdCRhn9iKlYqH71gpnwR0t7vrn8Hmbw2N6tHrKktQaAZvrmfW1DpzrImi4ZivQI1F5hxDEsyqjPMPDXztPoNC8EtYtkxtQW9gDgqav3UHPIWqRM6o8wAwCoD4hSqT+V57fMGokPdeI1AKQJogCOc+fOYfz48dp8URqYPHnyRKWBOXv2LOrVq4fp06drIPHo0aP4888/teSm5OAZFhaGDh06gNLA0LWyv7/H+caqXxnlqFxAIgA0SlLra3wTNxzDgKUH8DwBwMoDV+HirYf497vqeClH3ALAEgGBuKsQAB67fAd1h63XHKFDDSLhZNaevs7/NwAYsHAfpm85CREAjl17BEOWH8T7FXLh53fiBwBkKj0Cd++N3/KfAEA9ZZ8ZtZqKw/WnZeH4bf3RqOVZPHtaLP3engX9yp2HqBBpkT7xk3dUui8ASHITF3B8BIA1CmXCjC/cAcBt3eppljuxGOnQTN+8r63vVFvrp2hPDwAM7d0QaZL7ugL25BjlFFMqASBTJ878sjKqFfAEgcR2snKeP5Xnt5M9PC7axHsAeO3atRiJoMeMGROVCPrEiRNawMfatWtB6V9Onz6Njz/+WAv+uHPnjhal26xZMy0KOEOG6F/XVv3KKEPlAhIBoBFNla/xTdhwFAOXhuOtsjkw/DmxAMY2ALxx7xHK9PVcIx0Z0ASJLSIJxfkUAWDJHOmw+Dt7aSyoL18bVxQATJYYoX1ipkKQWXv6Ovps/Xb6uH73EcpGXrlRImjR54oOYjqQqei5i1Vuzlbjp1QfM7aeRNu6BdE+0gLIAPC9Cjkx+J3SVl1oz5lT2IhuMeTUNbw2bgsyp06KHT1i8pbKvICp9OZ9XRXv/BYJAAMaIl3K6AO3ztB1oOjIv76uiop5nVsAd5+6jrfGbY5B2WdGraZCf3oAWCx7WiyzCQDJFYQsz1RkAKAod4tq+dD33zC8WvpFjP6wrFIA4Uv/Ih0b1XMDAPUUblYA0EzfvK+t61gb2dLJA0A9y9DcnafReV4I6hTJjCk2LYCnr91DjcFrkSKJPw70i3kFzMw5CQBQZndxXyfeA0D3IqrrQTUAbPNbIJaf9YMRUb0vqcavP4pBy8LxVrkcGP7e83EFXGXgaly49QCL21RHyZzuLYC+QI3Vinip13Itkz8VJ8waVgCQDns69FMnS4x9sQQA9XydVjKKz32B5Qr9V2rBOVT03MUqAITsuHv8E4o/tp5C23qF0L5BYa0ZA8B3y+fEkHflAKARpRyPIfT0Nbw6dgsypU6KnQ4BIDOpzP+mmnY9S2VvQAOkF9Ju1B6yVksVQyCxggsAuOfUdbw5bnMMyj6RWUPkIVahv58Dw/HrumgLoJM8mpduP0ClAZ4UKjIAUJSb8gBSLsLXSr+IUXEIAEUKN7cAkCnctnSti+zpUnh9IkY6NNM372trCQCmTY5iAR4LIO1BtBeZFT3P+Nwdp9F5fgjqFs2CyZ/ZS23DADB5Ej+E92sS45XMnEM+s1Ujg0ASLICyu6L9egkA0P6cRbVQDgDHB2L5GT98XCU3+r9RUnqkdAVDv8TfLpcTw96TOwilO4+livqNq+qg1Th/8wEWtXkZpXKa0/zJvt6uI7nYb8ley3E7EgA6YdawAoAnrtxF7aHmjtCyMor1loScR+uZuzUfMruUU778Jcv3W4mrdxkAegMhFQBCVvbuC0Lx57ZT+L5eIbSLBIDj1h3B4MCDeKd8TgyVBIBRlHICowiPYd/pa3hl7BZkTJUUu3o6swAyAFzwbTUNnFHRU3pxoMj8b6qifB7nFsC9p2/gjbFBMRJ2iwFRIrWaCv0NDgzHOLcAMDIxOcUiHdclJjdaH6LcdAVMAXCvl3kRv3wQdxZAkcGDxlyzcGZMtxkwwbIyhRsxeLyY3hoAmumb97U1HWppFsDiAcu1V+zv08grL6V+jtcevKSx2LA/9Jwdp/Dj/FDUK5oFv9sEgGeu30P1n9dqWRkO9o8JADkginxmq+T3RAEnAEDZXdF+vQQAaH/O/jMA+N34QASe8YMdZgMaHP0Cp1/idg5CF9PgqKn+w2bGiYWtX9bYLNwWu47kXgCw93LcpkSCgCNmDSsAyJFwZo7QTmT/N+Qc2szc44hyylfENFP00Zj0QEjl5mw1B90WhGLmtlP4oX4h/FDfYwHkdW/nhw8zV4iMIvzu/WeuodmYLciQKgl294zJW2o1RnouruvXxwZpTfTUWxwoQlZCYltwWoJP3wC9Q8/YYsasoUJ/zKzCMjihUmRqQiNmGqO5EeVmAMgZEFTIKKMfkcGD6juJmOX3iAwepFuxGMlnpu+SkfvaagKAaZOjRC8PALSiylx38BI+m7IjKiPC7O2n0OXvUNQvlgWTmtuzAJ69cR/0oyhpYj+N5k9fOCCKI+JV6k+lAUdmjcSHOgkA0IUWVC4gWvjfjV+GwDP+jgGgnaswF9PgqKn+w2ZLSWwBQLuO5KIQpXovx61IAOiEzN4KAFpFwjmZ0MXB5/DdrD0ak8TsVvbyrolXRqKFiMZRtu8KXL/3WBuSnrpO5eZsNQcMANvVL4zv63vyADqxfDOl3De1C+DHxt65NsPOXI9ibNkT4A4AkmvDq2M2aePc1aO+F6MDB4r8/W01lMvtHACGnLmB18b4BoBiRLwK/Q1dfhBj1h6JUp8bAGjETW20LkS5KQpYDIBTIaPV2qTnlHosX1cP1RoVJxGz3JbStVBUcVCXuhq4F4sVABT1zfuaHgBaUWWuP3RZozHkgJ5Z20+hqwYAs2JSc3u5Dc/duI9qBAD9/XBogDkA5Ih4lfpTeX7LrJH4UCcBALrQgsoFRAu/7fhlGrPBR5VzY+Cb8lfAfBVmxxnexTQ4amoGAP9p/TIIdLktdh3JxfcRET1ZxTQAlDs9Fnz7su3h+Nq4rByhbb8MwKLgc2g7aw+q5s+IWa3s5RszcxqncZTpuwJEzUWFqOtEIKRyc7aaAzqA6CAi/z/yA6TixPe1z+L9mBJ0At/WLoDOegB49jqajvZQ9jkFgOzaQNHtr4z2AMCdPepr/pRcOFCEronLugCAoWduaiBTz11s5uOpQn/DVhzE6DXRALBw1tRY0c5eEu0LNx+gyqDVSOyXCEcGNrVaChDl/uzlvF4BcCpktBxQZIW8XZZEVXUSMMGNi/RYhodPIrDpxzrI+YI345SRfGb65n1tVXvPFTD5BFIR/UKNZNtw6DI+nbwdHNBDlnf6AdageFZM/NQeADx/8z6qDlqDJP6JcHhATN3qA6JU6k/l+S27RuK6XgIAdKEBlQuIFv73E5Zh6Wl/fFgpNwa9JQ8AnURDupgGR031H3ZsHYI8GDcAUAQ9KgGgmSO0kwn9/wcAQzBr+2kvAOgk+l01AOTgpv8SABJn85au0SwLYkCUGBGv4nAdvuIgRgkAsFCW1FjZ3h4AtAIJ+u+DASDJTVfAYgYEFTLKfp8iAHQSMKEHgJTAOVcGawBopm/e11a1r6mlgSnZ28MwEp8AoD4gSqX+VJ7fsmskruslAEAXGlC5gLwBoDyzAYnjJB+ai2lw1NQMALq9BuPBcCShrCO5KIQIAMvlTo+/FVkAzRyhnUzowr1n8f3svahWICNmfmnPAijmDdMfBqI1NH3KJNgrXIWq3Jyt5qDL/BDM3nEaHRoUxneRFkAGgHbyXzKjSOs6BdCpkfcV8IGz1zXKvvQpkmBvL2dXwGJ6I7YA7uhe34vSi90f3Fq/9529qVkZyb9ra7doACgGRIlpflToTw8AC2ZJDbI42Sl8TWhmJdL3JcpNAFDMgKBCRllZYgsAFu25TKOmlAWAZvrmfW1lu5rImi45SkkCwI2HL+OT37eDI7r/3HYS3RfsQ8PiWTHBpgXQyrrLAVEcEa9SfyrPb9k1Etf1EgCgCw2oXEAiALTDbEDiOGFEcDENjprqP2z2g3LrCB8FACMjCWUdyUUhRL83csqnMdktvjYujoQzc4S2+y6qzwDQCeWUGXMA9Sv6QxJdFNFGcVG5OVvNwY/zQjBn52l0bFgYbep6roA5AbodCkQjSjl+d/i5G2g8KkjjbA7u5Sxfo8hwQ+Ds2TNgu47SK7b8XxkIEWezSNknBkSJ1Goq9Dd85SGMWn04Sn0FMqfC6g61rdTp9TwqUMDET8wMAJLclAZGzICgQkZZYZjCjeo7iZjl9zCFGzF45M5obQE00zfvaysIAKZNDvpxR0Xv96uXb9PhK/j4921RAPCPrSfR4599aFQiK8Z/Yu8KmAN8zPw7owOiPBHxKvWn8vyWXSNxXS8BALrQgMoFRAv/hwnLsOS0vy1mAxLHCSeqi2lw1FT/Yes/fEedCo2sNhpf/YuRrxXyvIB5sQwA7R5wMnPxz56z+GHOXkeUU2bcofRejhyk/06bPDFCBOYSlZuzlcyd5wVj7s4z6NSoCFrXKahVZw5sTgFi1Qc9N6KU43YHz91Ao1FBMeSW6ZfriBzXr4zeiAgCgDpKL44UdpsCaf+5m2g2alMM6joxIErkelahvxErD+EXAQDmz5wKa2wCQLs/kES5CQCKGRBUyCirf6Zwo/pOImb5PUzhRgweeTKm8nq9kXxm+uZ9bfkPNTUrcem+HgBI0bj0Y9SsBB25gv9N2gYO6KEE7JSIvXGJbPjtk/Ky06HVu2Txw1xvCFCpP5Xnt61JicPKCQDQxeSrXEAiALQbzEG/wOmXuF3fQRdTYbup/sPWm/5td6hrYHXV4Kt/Mfddxbwv4K+vY9cCaPeKS2YuFuw5g3Zzgh0xDtx/9DQqKaw+J5iYE1FPXadyc7aSudNfwfhrlzEA5CTAVn3Qc6aUExlFuN2h8zfQ8JcgV5R9zKRCbBhkAaT8cHpKLw4UcZsEPezcLTQdtTEGY4uZP6wK/Y1cdQgjV0VbAPNnSoU1He1ZADlIStZFQpSbroApFyRnQFAho8y6ojrM4OEBgPYjZvk9IoNH3kzWANBM37yvBf5QQwOAzJRkxZW++cgVfDRpGzigZ8aWE+i5cD+avJQNv35sEwBGJvk2c81hX3B2BVKpP5Xnt+waiet6CQDQhQZULiBa+O0mLsO/p/zhFADajR52MRW2m+o/7NhiQ+CB2HUkFwUQ2S8q5c2AuV/bS6tCffnauNyMzWyi/959Bu3nOgOADx4/jeIF1bMCiKwoaXTUdSo3Z6sFxQCwc+Mi+La2xwL4+6bjXiwQVn3Q8yhKOYFRhNsdvnADDUYGuWJsYQBIh+4rozbhScQzbO1aT4vC5CIGirjhwT5w/haa/BK3APCXVYcxYtWhKNncAEDZIClRbkoDQ3zQvGfG5RplBg+aDCcRszyJ/A0ShZsbAMj7mh4AWlFlbj56BR9N3AYO6Jm+5QQCFu5H05LZMO5/9gCgVXCePhhQpf5Unt8ye098qJMAAF1oQeUCEgGg3Xx+vAnbTSDtYipsN9V/2LHFh6oHgGb5pnwNWOS/dcKsYQUA3VgnrQCgE8aB5xEAdvwrGPN2ndFy91EOPyqTNx334oGVWZQMAEVGEW535MJN1B+5ySUA9FDp0bUbXQE/fqoOAIZfuIXGIzfGoOwzC4hScbjy7QPPYb5MqUDUY3aK3TRJotxkASQA+H6FXPj5nVJKfcisZGIGD6rnJGCC+2crPM0jzadYjHRopm/RGk0WQDP+b71cW45exYcTt8YAgM1KZsfY/5Wzmgav51b5WfUBUSrWKA9I5flta1LisHICAHQx+SoXEC389hOXYfEpf9uMHnwN8zwBQM4AzwlAXahFa2qVcNRX/+y3RXVUAEA3/olm456/6ww6/BXsiHJKBIChvRsiTfIkUa/h6yf6g567WOXmbKX/DnODMX+3NwCcEnQcfRaH4ZVS2THmI7mDiTmFfQHAVMn8sb9PTOJ6qzHSc752EwGgntNVjBR2YwGMBkLelH3sd6W/dlOhP/Y/5rnJmzEl1nWqIzNVUXXsJkoX5SYfwPgIAJ0ETOgBIFG45c+c2hoAmlDpif6oZIEmn0AqYmCQkaIYAHJE97TNJ9Br0X6oBIBMCKBijSYAwGgtJwBAW1uTd+X/CgDaobaiEbIjtl0OYRdTYbup/sPWUwDZ7lDXwIpySBYAVs6XAXO+it0rYLtUVzJzQdYwsoo5oZx6+OQpivTwEMOH9G6ItAIAZAd0epYqqT/2940GQio3ZyuZ28/di793n0WXJkVBNG5UGAA2K5UdYyUBIHMKi5Ry/O4jF2+i/ohNMeS2Gpv4nB3vKfKSroAfPY2AntNVjBQu8WI6O9171T144TYajdwQg7LPbL2p0J8eAObJmBLrbQJAu1SJotxkARy64hA4c4IKGWUVxBRuVN8VABQo3ApIAEAzfTMAXNK2uuYDWL7/KikAuPXYVXwwYSs4ontq0HH0XhwGO98Zz5kVRaeeElSl/lSe37JrJK7rJQBAFxpQuYBo4XeYuAyLTvnjrXI5MPy9MtIj5VQMn1TJg35vvCTd7r+sGAMADluHY5fvgknA3Y7FinTcV/98IFMdJ9Rq1M7XxmVmkXEj8187T6PTvBBHlFNEM0V0U1QozQule+HCKSjo33ruYpWbs9VctJ+zF3/vOYuuTYriq0gAGHUw2biaMqKU43cfvXgT9UZsiiG31djE55x6g3KvNRu9yZDSS7TMFH8xrZ3uveoeungbDUdsiEHZxy4H+tQbKvTHKah4YLkzpMSGzvYsgCeu3EXtoeukgbcod4tqeTFMC4Dz5E5VIaOsgpjCjeo7iZjl93AqJsqnSFY4sRjJZ6Zv3tcoKTlZAOlKmIoYGW4k27ZjV/H+hK3giG4nlnbuV8xRaGR55IAojohXqT+V57fsGonregkA0IUGVC4gLwBYNgeGv28DAEZm4/+0ah70ff35AID1hq3D0ct3MevLKqhaIKMLrXiash+RrCO5+EK+kqO/OaFWswSAkZFwVO/ET81cy0odzN15Gp3nhcAJ5dTjpxEo1D0SAAY0RLqU0QCQk9DSO1Ik8ceBfvHDAthuzl4s2HMW3ZoWRauaHgsgX03ZcU43opRjhRy7dBN1h29CiiR+ONAvJm+pjOJE9gVK0WJE6SX6ZhHdltNy+OJtNBixIQZ1HQcd6anVVByunISeZciVIQU2dq5rS6TjV+6CfIL1LgdmnYhy0xWwmAFBhYyywjCFG9V3EjHL74mmcKuJglnSWAJAM32LrgaUB5B+eMjsQduPX8N747eAA3qc+NryoEWWEjEpOT/ngCiOiFepP5Xnt+waiet6CQDQhQZULiBa+B0nLcPCk/6ww2xA4jAfZ/OqedDnOQGA9Yevx5FLdzDzy8qoViCTC614A0A9aJHpmDchquuEWcMKAFpFwsmMUV9n7o7T6Dw/BE4op548jUDBSAC4N6AB0qdMGtW9eIjpwbTKzdlqDn6YvQf/7D2H7k2L4cua+bXqHJ1o57Dt+reHUk5kFOF3H790C3WGb4STHxExD+9aWhCIEaODGJ1ZNJtzAHjk0m3UH74BesYWs7RDKvSnB4A5X0iBTT/aA4DHLt9B3WHroY86N1sTotwtquXTopA5A4IKGa3WJj8XfzzZ+VGi719k8CiU1RoAmulbBFdZ0yVDpQGrpQDgjhPX8O5vW7QAFApEcRJtzzKZ8RTzc70/rEr9qTy/ZddIXNdLAIAuNKByAcUGAKSUCL1fK+FCQnVN9R92g+HrcTgWAaBdR3JRUr6GoL85YdawAoBWkXBOZn3OjlP4cX6oI8YByk1HOcuo7OnZAC+kigaA4jWWPi+bys3Zag4YAPZoVgwta3gAoJP8ZEwpJzKK8LtPXL6F2sM2QjYfndGY2XqzukMtzQfw/uOnMSi9xECRItm8D3ireRCf0w8o+iFlBgD1EfEq9Ddu3REtDx8XVwAweWKEConHzQFgtNy051EeQg6AUyGjrE5E9wknARP8HtGNwA4A1OtbzDfJAFCGKnPniWt457ct4IAeJwnXWZab9x5HJaA2yj+YAABlV1fs1EsAgC7mUTUA7DRpGf456Q871FYkztDlBzFm7RE8TwCw4Yj1OHTxDma2rIxqBd1bABkA6gMXZNTNjshUt3rBTPijZWWZZl51fB08Vo7Qtl8GgAGgE8aBiIhnyP+cAcDvZ+/Bwr3n4AUAHTAUMAAUGUV4/k9evoVaLgEg+29RBCclgr73yBwAUqBIYZ2Fx85aOHr5DuoNW6/5cIqUfWYBUSrA0a/rjmpMHFxypE+BoC72LIAsh555xmwuRLkpCIQAIAfAqZBRVidiAJWTgAl+jxhIpF8fRvKZ6VtknKEgkEoDV0OGKnPXyWt4+9eYANDuuUTy3Lz/OIqCzggA6gOiVOpP5fktu0biul4CAHShAZULiBY+A0A71FYkzpDl4Ri79uhzBQAbjdiAgxdv48+WlfFyLABAjiR0AgA5F5UqAGjlCO1kSc7efgpd/g51RDklAsDdPRtoQQRcxEhGPXexys3Zag7aztqDRcHeANAJRylzCvsCgG44m5lKTwSAek5XXwe81TyIz82Akxm1mgr9/bb+qMbF6wYAsiVTD2StACABRvIBJCq6+AYA7aQm0sspUrjpLcRGOjTTt8g5TUEglQeuhhknrzgGBoAc0c0WQLcA0IiCTh8QpWKNsmwqz287321c1k0AgC5mX+UCEgGgHWorEmdwYDjGrTsK+jXc69Xn4wqYAeAfX1RG9ULuLYAcSSjrSC4uAxEA1iiUCTO+iF0LoAgAjRyhnSzJWdtPgQIanFBOPXv2DPm6eq6Ad/Woj4ypk0UNQUxm+19cIcrK/t2sPVgcfA49XymOL6rn05oxALSTdNeIU5jHcOrKbdQcugFJ/BPh8ICmskPzqicm8X1l1EbcffQUek5XX1d8dl4a5Tunuzo1o1ZTcbjqAeCL6ZJjc9d6dsQA+/TJAkBRbgKAlIyaMyCokFFWGDGHphsAKFK46X1EjeQz07eYZJksgFUGyQLA63j7182C0Zu+AAAgAElEQVTgiO6JG45hwNIDtn3Tad5uPXiMUr09HMQH+zdGssT+XtPJAVFL29YARcSr1J/K81t2jcR1vQQA6EIDKhcQLfzOvy/DghP+eLX0ixj9YVnpkdIVDF3FfP5yPgS8Wly63X9ZUf9hNx65AeEXbmPGF5VQo1Bm10PhSEJZR/L/EgCKkXBWNEyyEzFz2ylQShOnlFN5uyzRXrWzR32NSYKLSGelB0IqN2crudvM3I1/Q84j4JXi+DwSAP657SS6L9hnaw6MKOViEwCKNF50BXzn4RPoKb3ESGF9lKfVPIjPzda8WUS8Cv2NX38UgwQLYPZ0ybHFJgDkqF69L6PZXIhy04/eUWuOgDMgqJBRVicijaLdPVx8BwcJEZ+0PkrcFwDUBy8xAFzwbTUtDUzVQWugjww3km33qet4a9xmcET3hA1HMXBpON6ymZ2C+r794DFKRgLA8H6NkTyJHgB6mHNYVpX6U3l+y66RuK6XAABdaEDlAhIBoN1fj3QFQ7/EyTJCFpL4WMwA4PTPK2lsFm6LmTVEpl/mo6S6TqjVqJ2vjUuMhLMiYpcZL9Vh8GPH+iX2zQBwR/f6yJwmGgCKhPb/RRoRWXlbz9yNJSHn0evV4tq1HxUGwXasoEaUcjyG01dvo8aQDVKHpNm42QpEVj8KArn98IkWSSlSekWn+YiZ5012PqiemdWb/WH/izQ+DA543GRp2trNngWQ8/q9kDIJ9gQ0tJwCUW4CgKPXHAFnQFAJIKwGxtZfqmf3FscbAK4CBY6xVUx8ZiSfmb55X/ubAGDa5Kj20xop6/aeU9fx5rjN4IAeBvl289PSuOkHEAFjKkYAUG/tVKk/lee31dqIL88TAKALTahcQLTwf/x9Gf4+4W874/qgZQcwfv0xtKyeDz2eEwBIJPZE6j7t80oam4XbYteRXHxfjcFrcPrafe1PTpg1rACgGAln5AfjRHYn/m/ie/J1XYJnz4Dt3eshS5rkUY/yd12CiGeef/4XiYRlZW/9524sCT2P3q8Wx2eRADD6GjwLJjWvKNUVU8qJjCLc8MzV26g+ZIOUn5TZyzgQgPz+mo3eiNsPnkBP6cWBIhQprGd6kBIispKZ36sZs4aKw5WvB3ncWdMmw7Zu9e2IAWb2IF9U8km1KqLc9GNADIBTIaPVePg5+3/Sv+36cYvvEBk89EwxRvKZ6Zv3tfnfeCyAZBGU4Urfe/oG3hgbBA7o4Wt+uwxVJNPdh09QIhIAHujbGCmSelsA9f6OKvWn8vyWXSNxXS8BALrQgMoFRAu/y+/LMN8FAPyyRj50b/Z8WACb/rIRYbEIAO06kovLoObgtTh17Z72p9pFMmNqi0q2V4mvjUuMhIstADjDQQSsKBQDve3d6iFL2mgAyMCQ6uojBlVuzlYTzgCwz2sl0LxaXq26k0AYppQTGUX43Wev3cHLg9dLRUpaAcCNneug2aiNuPXgCfRATwwU0XO9Ws2D+Nws8t0MGKrQHwcIxAYAzJgqKXZJAEBR7s9ezusVAKdCRlmdMLCn+k4CJvg9vqgCfQFAfQAc72teADCxH2gP8lWCT9/A6wIA5Ejvd8rnxNB3S8tOh1bv3qMnKB7gsQCG9W2ElEkTe7XXB0Sp1J/K89vWpMRh5QQA6GLyVS4gLwBog9qKxBm09ADGbziGVjXzo1vTYi4kVNdU/2HT4bj/3C1MbVERtYtkcf1is5xoMh3XGrIWJ696AKATZg1q52vjsnKElhmjvg4DQDtJkMU++Kr3eQGA3/65C0tDL6Dv6yXwaVUPAHSSC5EBoMgowvNy7todVHMJADkXHAFA8gEk8G8GAPVXw3bXAfv66Sn7zK6GVRyuegCYJU0ybO9uzwIYfuEWGo/ciEypk2JnD2sLoCg3XQFTBgQOgFMho6xe+Gqf6ttN5i++Q58bT3xmJJ+Zvnlfm/9NVRATSPWf10rluAw5cwOvjYm2ADIAfLd8TgyxCQDvP3qKYgEe3nEjAKgPiFKpP5Xnt+waiet6CQDQhQZULiBa+F0nL8O84/6wm0V+4NIDmPCcAUBiSdh39hamtKiIOrECAI1ZEWTUXXvIWpxQCACtHKFlxhgDAG45gZ4L9zumnGIAuK1bPe1w4MK+gfRvfdJYlZuz1Rx888cuLNvnDQCdsKEwp7AvACiTLNdsvMwGIQJAPaerGCks+gZazYH+OQMhva+fGbWaCv0xSwSPjfxJya/UTiFXEHIJoWAkCkqyKqLcBPzEDAgqZLQaDz8XAaCTgAnuxy4ANNM372vzvvYAwBqD10qx3DAA5IhuTvbtFgDu79MIqZJ5WwD1AVEq9afy/JZdI3FdLwEAutCAygUkAkC7Vp0BS8IwceNxfFUzP7o+JxbAKAD4WUXUKereAmjGiyqjbhEAOqFWo3f42rhUAECmQbP7Y4Hng6N9t3atp/kHGQFA+pvIXaxyc7bS09czdiFw/wX0e70EPom0ADIAtGO1ZU5hkVKO333++h1U/Xm99k+nnM1MpbfpR48F8Ma9x1jV3pvTVYwUzpsplZXops/Non3NqNVU6E8PAGVBnChU2LlbaDrKPgCkqFfyARQzIKiQUVZBDGaovhsAqOfHFd9vJJ+Zvnlf++vrqloQiCwADD1zE6+O2QSO6Ga6v/cq5MTgd+xdAT94/BRFe3osgPv6NNL4nsWi5z1WqT+V57fsGonregkA0IUGVC4gEQA2LpENv31SXnqk/f8Nw6RNx/FVrfzo2uT5uAJ+dfQmhJ69icmfVUDdolmlZTWryJGEso7kYj9ERE+/oqnUK5oFv38mF1BgtTHzczESzsgR2onw0zafQK9F++GUcorz/W3pWhfZ06XQhiDmB+QxxRcA+NWMnVi+/yL6vfGSlvONytydp9F5Xogtv00jSjmW9cL1O6jiEgAylR6xYVAewOv3HmNlu5oQKb3ESOE8GZ0DQE4ArKeu44CoNLr8gCoO18mbjqPvv2FRS1j2Gldc8/vP3USzUZu0aHQZ66EoNwFAMQOCChllv0++ztQAYLkcGP5eGdmmXvWYwm1Rm5dRKmd6r2dG8pnpm/e1uV95AGDNIWshw5W+7+xN7ccLR3QzAHy/Qi78/E4pWzKJADC0d0OkSZ7Eqz37TbKVXKX+VJ7ftiYlDisnAEAXk69yAdHC7zZ5Gf467o9GJbJi/CcVpEfa798wjbD761oFQNGN8bHoP+zXxmxCyJmb+L15BdQr5h4AciShrCO5OEd1h67DsUgA6IRajfrytXGJkXBGfjBO9DU16Dh6Lw6zHTHO72LGj81d6uLF9B4AKDKEcL3jg5oiEd2JWsjoRAY7bVpN34kVYRfR/42X8HEkAPxr52l0mhdiK3LbiFIuCgDeuIsqP63T/inKbWec4rzSIUpJwPWUb2KkcO6MKe1071XXjAKM/WH11GoqDtcpQcfRZ3E0AHTy/THgkPUfFOWmK2AxA4IKGWUVxAENVN9JxCy/hyncFrZ+GaVzWQNAM33zvjanVRXNyl9ryDro/UWNZGN9cET3mDWHMXTFIXxQMRd+etseAHz45CmK9PBYAEN6N0RaHQDkgCj2k1WpP5Xnt+waiet6CQDQhQZULiARANrN7dZ3cRgmBx3HN7UL4MfGzwcAfH3MJgSfuYlJn1ZA/eLuAaBdR3IvADhsHY5d9lgA7eSUE/vwtXGJkXBGfjBOliQfvHZzRkYBwB7L8OhJhMbbSukeqDyNeAbyDRTLsYFN4UfhwHEMAL+cvhMrwy5iwJsv4X+VPRbAebvOgPL62cndyJRyIqMIy3vxxl1UjgSAotx29CNaVikP4NW7j7D8h5oQKb3EQJFcGZwDwHM37mu53fSpPcyYNVQcrvxDhOfIiQVeDzis5luUWwOAG46BMyCokNFqPPycc9rRv51EzHI/IoNHGSkA6PF/1jOp1I3c12YTAEybHLWHroMMVSZbZBmQj159GMNWHsKHlXJh0Fv2ACDtMWQVp0J81TRGsbA/LKdKUqk/lee37BqJ63oJANCFBlQuIFr43acsw9xj/nAKAL+tXQCdnxcAODYIlG4gtgCgXUdycRnUG7YORyMBoFNmDV8blxgJF1sAkK/enDIOiL5qOV/wgJAnTyNQsLtns+YiUtep3JytPksGgAPfLImPKufWqs/fdQYdbAJAppQTGUX43Zdu3kWlQR4LoFPKPgaA5FtJfq7EchD4Qw2IlF5ioIgbAHj+5n2N3cEMAOqZNVToj10RYgMAyiaRFuWmNDBiAJwKGa3WJj9nBg/6t5OACbcAUK9v3tdEAChDlck+mXwlT1R7wzUAmBuD3iopOx1avcdPI1Aock8JDmiIdCmNASBHxKvUn8rz29akxGHleA8Ar1+/jrZt22LRokXaNL322msYPXo00qf3NoXzHJ44cQL58nmYAfRl7ty5ePfdd7U/8zWWWOfXX3/F119/La0OlQuIFn6PKcsw55i/LWorGnyfxfsxJegEWtcpgE6Nng8LICUapYSjEz+toMnrtjAAlPUjEt9Xf/h60DUKFbvgm/vxtXFZOUI7kZ0BoFPGAQYhFKzwPADAltN2YtWBi9oBRAcRlb93n0H7ucGww9/MAFBkFOH5v3zzHioOWqv90ykA5OAaiq4mvzZidDADgOLcO1kDF24+0Phd9ZR9ZgFRKg5XDkbi8cuyeYjy6oMOrOZClJt8AAkAcgCcChmtxsPPmdeW/u0kYIL7YQYPonArm/sFr9cbyWemb97XZn3puQImn0AZqkz9XsoAkH540Q8wO0X8UWkEAPUBUSr1p/L8tjMncVk33gPAJk2a4MyZM5gwYYI2T61atULevHmxePFiw3l7+vQpLl++7PWM2g4ePBgXLlxA6tSptWcEAKdMmYLGjRtH1U2XLh1SpPBcf8kUlQtIBIB2ryF7L9qPqZufLwD45rgg7Dl1AxM+KY+GJbLJTL/POvpfrXY6bDB8PQ7/RwDQyBHazli5LkdfugWAlK6ErVDir3V+j8hdrHJztpqDltN2YNWBS14AcMGeM2g3xx4AZE5hKwDolLNZTK/DAFDP6WpkfbWS3+g5AyE9ZZ8ZtZoK/c2ITEfE45Pl8xXl0acdsZoLUW66AhYzIKiQ0Wo8/FwEgE4CJrgfkcKtnAQANNM372szv6ysXQHXHbYe+sAgI9n0tym/rDqMEasOaZZ3NwBwb0ADpE+Z1OuV+oAolfpTeX7LrpG4rhevAeCBAwdQvHhxbN26FZUrV9bmiv67atWqCA8PR5EiRaTmr2zZsihXrhx+//33qPoEABcsWIA33nhDqg+jSioXkDcAlKe2onEyAGxTpyA6NpKbI8eT4LCh/sNmADj+k/JoFAsAUO+3YmeYIgC0G4DD75G1ABo5QtsZK9flBLxOKaeM/NBEfx1+j8hdrHJztpqDL6buwOrwS/jprZL4INICyACwesFM+KOlZ7+wKswpLFLKcZsrt+6hwkCPBdApZ7PIsNJs9CZcvh2T01WMFGb/S6txGz2/eOsBKg9cHYO6zoxaTYX+9ABQ74cmIxczT3DeOas2otwtquX1yoCgQkar8fBzpnCjf7sBgCKFW/k81hZAM31HAcCWlZE1XXLUkwSAen/qkasOYeSqw/hf5dwYYNMCKPoV7+nZAC+k8gaAHBBF3NkUEa9SfyrPb9k1Etf14jUAnDx5Mtq3b48bN254zRNd/44YMQItWrSwnL9du3ahQoUKCAoKQrVq1bwAYI4cOfDgwQPtyviLL77QrIt+fn6mfT58+BD0Py60gHLlyoUrV64gbdq0lmOxU4EWft8/VmH2MX/UKZIJEz4uJ928778HMGPbaXxbKz/a1S8o3e6/rEjyrVy5Eg0aNECSJEnw3oRt2HP6JsZ+WFq7dnVbiFXkjV+3ImuaZNjUuZat7pqODsLhS54gkIbFs2Dsh/bTN+jlEwfw8EkEXuqzSvvTrm51kFbnCG1rsJGVJwedwKDAQ3itVHYMe9fetQx1Ubrfatx79BSr21VH7shABHGcPKb9veojaWLPN+JLRicy2Gnz5YzdWHfoCga+UVzzr6KyMPg8Os4LRbX8GTCthVzUfNvZwVi2/yICmhXFJ1U8V8lcrt6+hyqDN2n/FOW2M87CASs0juXNnWtp6/HS7YdY+G0VFM8evV8U770Sj58+w4aONbVca04L9c3UdQf7NozqhgDBK2O3IEOqJNjWpU7U31Xo78/tp9F78YGod1Dk8a7udW2JRMFg74zfBgKA6zvWtGwryt28ah5M2XwSrWrkRaeGheN0jZIuaGxU3iufAwPeKGEpi1GFusM34vT1+5jzZSWUyx0zCljcR6m9mb55X5v2WXktEXTjUUGQ0Q9ZFJuNiV4/o9Ycwei1x/BRpZzo86o9qlHKLFCk10pNzG1daoOChMRSqu8q3H8cEbUPqVij/D46vzNlyoSbN2/G+vntSNFx0CheA8CBAwdi6tSpOHTokNfUFC5cWAN/Xbt2tZyyb7/9FuvWrUNYWHRqAmrUv39/1KtXT7vyXb16NQICArT+evToYdpn79690adPnxjPZ86ciZQpnUfvmb1wy8VEGgAsnj4CXxWLsJSVK8w75oeNF/3QKEcEmuaWbyf9AgUVR+7zx/HbifB54aconfGZ6zecvgMMDU2MdEmfoW/5p7b6+2mvP87f90S6ls4Qgc+LxO4cPokAOmzzJEAdVPEJUnrnQrU1Vq685lwiLDzpjwqZIvBJIfvj7bzNHw8jEqFn2SfIFIlBHkcAHSPHye8ZVvkJIvGfo3HGVqPxB/wQdsMPHxZ4iipZPOtl5+VEmHHEH4XSRqBNCbk5mHLQD3uv+eGdfE9RI5v3urv/BOiyw6Mcp3J/v8XTvl/5Jxga4o+bjxOhU6knyCmk+2u/1R9PnyVCn3JPkD6Z8xm69QjouSsxEuEZRlaNXvNn7wKDQxIjdZJnGFDB3rdgdzSbLiTSUldxSeH/DD9VsvfOE7eBEfsSI0OyZ+hVzrqtKHfN7M+w/rwf6r8YgVfzyK0BuzLK1g/Y6dE3lapZIvBBAWfj6bfbH1ceJsL3JZ4gv4SdwUzfvK99W+ypti8OCk6MlP7PMMhCP+fvAT8FJ0aqxM8wsOJTLD3th+Vn/FA9awTezW9PJvox9MNWzzcxoMITpPaOAUHHbf54HJEIAWWfIKPz30JSKrp37x4++uijBAAoNVuxWMkMSImv2LFjB1asWIFp06bh4MGDXm8vVKiQZrHr0qWLz1Hdv38f2bNnR8+ePdGhQwefdYcNG4a+fftqi8Gs/NcWwH5/rsKso/6oVTgTJn0ibwGkX+D0S7xN7fz4vt7zYQH8YOJ27Dp1A6M/KI3GJdxbAIlW7s3ftiJb2mTY2MmeBfCVMZtx8KInCITGQmOyW3z9ciXfuuK9PRbAHV3rgPyk3JZJm07g5+WH8Ebp7Bjyjn0LYJn+q3H34VOs+qE68kTmoqNglZJ9V3sNbV9APSRL4jngVf46t5qPltN3Y/3hKxj0Zgm8Uy6HVn1xyHm0/ysUVfK9gBmfyyXvbjNrL5aHXULvV4pqV1piuX7nPir9vFH7kyi31djE54V6rtD+ufXHWnj91624eOsh/vmmCkq8GH2SF+u1Ek8inmFjp5qab5bTQgEmzFxyuF+0BfDA+dt4bdwWjVt3y4+1o7pXob9ZO04jYFG0BZCiTPf0sGcB3HP6Bt6bsB050yfH2g7WFkBR7uZVc2PallP4umY+dGhQKE7XaPUh6zV9U3m/Qk70f92etYwVVX/EJpy8dg+zWlZEBYMrYL0F0EzfvK9NaU4WwGRoOnoz0qdIgh3doq3CRmuP/KGpLgX0bO9aByNXH8HYdcfwceVc6PWKfaIB8ZvImNr7Fw/djNDNw9r2NZDzhRRK9ZdgAQTixAJIV6b0P1+FAj3IsubmCnjGjBkaUDx79iwyZ87s8310RVy9enUtUCRrVjkAotKHgDbngKnLNABYu0hmTG1RSfpc6PFPKP7Yegrf1yuEdg0KS7f7LyvqfTve/W0zdpy4jnH/K4emJbO7HopdR3LxhY1HbkD4hdvan5wya/jyXREj4Yz8YJwIP379UQxaFu6YccCIj1ZMV8NjCu/XGMkFALh06VI0bdpUu8b/L0vzydux/tBlDHmnFN6tkEt79aLgc6C8flXyZ8DsVlWlhhNFKScwinBDAoBl+6/R/inKLdWxjkllV4/6GpvC+ZsPsLhNdZTMmS6qGzMeZtn3cD0CQhR4QEVkbDFj1lDhXzVz2yl0WxAaNXSZNCN6OXedvI63f92MXBlSYGNna/Aoyv1ZtbxeAXAqZJTVCzN4UH0nARP8HpHBo1K+DF6vN5LPTN+8r03/vJIWBdxwxAYN1O0JiP6xYCQb55HkgJ5hKw5i9JojoOv2Pq+/JDsdUfWYX5xYXihLg1jYH5Yj4lXqT+X5bXtS4qhBnABAWVk5CGTbtm2oVMkDgOi/q1SpIhUEUrt2be2Of968eZavHDNmDDp16qT5GyZLJncPo3IB0cLvNXUZZroAgD/UL4Qf6j8fAPC937Zg+4lrsQ4AyamekhvbKURET5FvVJqVyo6xH8lbX/k9vjYuK0doO2PlugwAnTIOcAZ+zr9F/T4PAHDou6W1JLtUFgefA6V1cQIARUYRntMbd+6jTCwBwN09G2hUcOd8AMDt3eohiwsL4NU7D1HeBwDUM2uoOFxnbT+Frn/HDgAkX9QNnX1bp0hXotwMADkAToWMst8nM3hQfScBE/weZvAgCjc7AFCvb97XRAAok6ibmUX0AJDmuvdr9v0a83VdovnF+gKAnJBepf5Unt+yaySu68VrAEiTQ2lgzp07h/Hjx2tzRYEaefLkiUoDQ9Y98uWbPn16FEikekeOHAH5CpKFQkz1oh0Uixdrlj6KJiYfwLVr12pXxJ999hl++eUXaZ2oXEC08HtPXYY/tSvgzJj2ubwFsPuCUPy57RSeKwA4fgu2H7+mgS0CXW4LRxI6AYBNf9mIMIUAUKRYI2Cgd4R2Ijvxn/60LNwx5RQDQM7AT2MQGUt4TCJ3scrN2WoOPp28HRsOXYYIAP8NOYc2M/egcr4MmPOVnAWQOYWtAKATzma9nhkA6jldxUjh2AKAInWdGbWaCv3N3n4KXQQAKMM0odf1rpPX8PavWzRXhP9r7yqgpDi26F0Wd3d3t+CyOEFiEEL8fwgagQAJGlyDheRDCIEQIGiMhBBYFrcgwQnu7i6LLvzzaraG2mZmu7p7KjOzVJ2Tc7JMVXe9+2q671S99+6qrnGDAL5TKScGv2I9NIOwESXcKuZNFwMuTz705m/+XKN3CYUaPP/lashI9XECyDO6R0Xsx7gVh+CUAP79WR1kTBEz5MEoSalijXIAVb6/zZ5fgfJ5wBPAK1euPFUImnbreCFoXviZSBzt+PHWq1cv0BHw8ePHn8rsXbRoEUv4IJL46NEj5M2bF61bt8aHH36I+PHlI/JVLiCRAFqRtiL76QiGjmI61y2Ij+sWCJS1FuuDq3k0ARz3Vhm8UDKr4zlTUWkqLu2UANqVVovtwSUSAzoaNMbB2DH+m5WHMXzRPtuSU1yEnWtw0hxEzWI+J1G7WOXD2QyDdydvxJqDlzD6tVJ4NXoHkBNA2iWh3RKZxjWFRUk5Pu767TsoNch1BGxHs9m400tHwKRba9R05Tsinl6IMjbwPqQzTPqz1ETpOm/Sair8ZySAMlqzRhs3H7uCZhPkCaBo938q58IP64+jQ+38+KR+IaVlRMx8wyXcqJ8jAihIuFWyQAC5di+fJyeAU1uWZ0fADb5cI0UAD1+8xUrGcC3pkRH78PWKw7YJYGw/eLhyDtckV7FGNQF8snIDngCafcn8+blyAjgtHDMPhVpSNiA86AiGjmK61CuIjnWCgwC+/u16bDx6BWPfLAOSM3Patp24iibj17FA4rXdrR0BN/7fGlAZGWp2pdVie3A9fvwYeXq6NHY3966L9IZAaDu2j195CCMW7bctOVVqwGJcv/MAS7vUQP6MrmLpt+49BFXmF5soXafy4WyGASeAXzQvhaZlXUfAC3aeBdX1q5A7LX5qL0cAPUnKuV8Qt++i5CBXEowdyT4x1pOK3lIhaCKAv39YFaKma2wxUWY4iJ9fvX0fZaIJoKhcwpU1jNJqKvz346YT6P7rkyPgJAlCsXfQk2L7MvZsOnYFr01Yj9zpkmKlxA6gaDcRLYp/7lg7P7oEEAF8t1IuDHrFerwc4cUl3EjBo3I+8x1Ab/7mz7UpRABTJgYdCVNi0Obe9WJ1y5GLt2IUjR6xaB/GrzwMKrrd70XrR8Cxxbxy5Zz1PWsjSypXEoiqOGOV72+ZdR4IfTQBdOAFlQuIFv6AaeGYYYsA7sTsv0/ik3oF0SFICOAbE9djw5Er+N+bZUBqFk7b1hNX0XS8fCC5eD/SbKUsYmp2lTXMHly+eunzeX+94hBGRuy3LTlVeuBiXIskAhiG/BlTsMvevPsAJfq7slh52zXgeVBgPzUzG536MLbx73y3EWsPXcKY10uhSRkXAVz4z1l8MHMryudOg5/bP6n5Gdt1PEnK8f43I++6s6BFu2XtMuqeNh67Bqeu3oFR0ouvBac/Bq5F3kfpga4dQFG5hCdEUY3B9T3ruKevwn8/bTqJbr/udN8jcYJ42DeooSxkrB+FgtCJQJ70yUAxqWZNtJuSLej0g3740g9gFTaazYd/zhU86G/amRxoI2GCxnIJN1LwqJIvfYzbe7LPm7/5c21Ki/KsDmCj/xEBTMR+hMbWjl66HUM2jk4a6MThvap50NdiHUC6Dyd5pI9NO5Fi4+SQf6bSfyrf37JrxN/9NAF04AGVC0gkgFaUDcicHr/uxJxNJ/Fp/YL4qHZw7AC+OXED1h+5jK/eKI2XS7vKejhpPJNQNpBcvNeLY9fin9OuckB2lTXMHlz8pe/02I/PmxNAu4oDZQYuxtXIB1jSOQwFMrkI4I27D1DSQABF6VXSbOUAACAASURBVDozG534z2zs299twF+HLuPL10vjlTKu9RL+z1m8P3MrK5Xxy/uyBNAlKScqivB734q8i+LRZXDsSPaJSio7+tUHvYBPXrmDuR9UAZf0EneDnYYDXI98gFIDXYRdVC7xpqyhwn8/bT6Jbr88IYCJ4sfD/sHWCODGI5fx+sQNyJs+GZZLEEDR7jcr5GA/fnkFBBU2mq1N/jlX8KC/7WbM0lhRwaNKfnMC6M3f/Ln2fYtyjADSjrSMVvqxS7dRc9RK9sOPfghRrDHFHLeqlgd9XrBe2oYf8/JdPhFPfjxM2tk0R5X+U/n+ll0j/u6nCaADD6hcQLTwB04LZ4Vtq+ZPh5mtK0nPtPsvO/Hj5pPo+nwhfFgrcOsAilv7b03agHWHfUkArQWSi+C+NG4tdp5yEcBXSmfFl2+UkcaedzR7cLnjvhxmfvL7jVt+EKMWH8Ab5XPg81dLWp4vxY5RLNXizmEoGE0A6UiYjobFJkrXmdloeRIWBnhaL4t2nUX7GVtBclm/ShJALik3/NUSeL18zDqAt+7ccyu22JHsu/cwCoV6L2JW0fgX/rcWJ65EsrlxSS9fJgSJ/jowuKFbscVbPKwK//1Mzx2BAJJqDM3FSttw5DLeIAKYIRmWf2K+AyjaTT+A6NnHE+BU2ChrS9iIFczf1OwmTNDY+mNW4cD5W5jZuiKqShBAb/7mz7XJ/3URQIpJNWYKe7Lt+OXbqDFyJXhCz7Dwvfh21RG0rpYHvW0QQGOih3hP43NRpf9Uvr9l14i/+2kC6MADKhfQs0YA+Y6O73YAXQRQNo5IXAYvj1sLkqOi1qRMNox53Z4UXGyxK77K/DQSQNoBGdbUOgF8btASXA56AngO7WdssUUAR7xaEs3Lu+oJ8nb7zj0Ui5bsc0oAaQeRXrjHL3sngE5rQoo7tv4igL9sOYVPf97hxtAJAcyXIRmWSRBA0e7m5bLjp82n3AlwKgmE2aujxsgVzN9OCeDzY1Zj//mbjgkgf66JBNCYKOLJphOXIxE2csVTBLBN9Tz4rLH1HUBe648nengkgNEZwir9p/L9bbY2AuVzTQAdeELlAqKFP+iHcPxwMBRV8qXDrDbyO4DdftnBHoLdGhTCBzWDYweQx3SJR3oOXAOeSSgbRxSDAH79F+gYhVrTMtnwhQIC6Kviv3zeY5cdxOglB/BmhZwY1tR6uYlyg5fg0q37iOgUhkKZXUfA4tEavw8dZVI5CGoqH85mvuchA2LMaMTuc2g3fQvTS537QVWzS7DP35u6Ccv3XcCIZiXRPLqgNB8YefeeW7FFtFvqwgBISaVwH9cOYEwCWBnP5XIV9BUzhSlRJHXSmNqosveifmLM5v7BDZAovkuxxVtClAr//brlFD4RCWBoPBwYYm0HcP3hy3hz0gaWjERJSWZNtJt0oX/ecsqdAKfCRrP58M9rjlyBY9EE0G7CBF2LF3Ce0aoiqhUwPwL25u+Xo59r3/2nHIu9ox8kxsQgT7advBKJ6iNWgGd0D1u4F9+uPoK2YXnRq5F1JZBCvcOZ2gev9Sfe0xgbrdJ/Kt/fsmvE3/00AXTgAZULSCSAlfOmw+y28gSw68872EMwGAmgGNTvwDXgmYSBTgA9BULbsft/yw7iCx8QwEWdqqNwZpdMmRhc7yaAfesjVbR0ncqHsxkGnpKGOAEskzM1fpMkgC2n/I0V+y+aE0DBbrO58c9FAkixU1QHkAjBL+0ro1xuFwE0Zgr7igCKyiU8IcqYEa/Cf0YCmCA0BAeHNJKFjPVbd/gS3pq00RYBpELov26NmwRweqsKqF4gpqKVJx968zcngJOIAKZMjBfHWSOAPKN76MK9mOgDAsjVPjQBtPT18GlnTQAdwKmaAA7+IRzTDoZaUjYgc+gIho5iujcojPdr5nNgobqhxgeXp7IeTu7OMwllA8nFe1H9QIqjoda0bDZ80dz3R8DGcgdObKWxXy09iDFLD9iWnCIJMZLUCv+4OopkcRFAsbwGn5+4S6WCQMji4Kls0OLd59B2+hZWYoVKrci0FlP+xsr9MSXl+Lg7d++hSLRms53dOVFJhcrI0I4LZVT+3L4yykcTQGOmMCfXMnM39hHL9ogE0Ju0mgr/zSXy9dOTI+D48UJwaKhFAnjoEt76biMKZEyOJRI7gKLdtGM/d9tpdwUEFTbK+oZLuFF/uxmzNFaUcKOasGLzZJ83f/Pn2sR3n2M7gC+N+wvGzHBPtvEdQJ7RPWTBHkxacxTtwvKip40dwMJ9wnH3wSOs6VYLOdImdd/SU3kslf5T+f6WXSP+7qcJoAMPqFxAtPA5AbSibEDmfPLTDvYruEfDwmhfI7gIoFjY14Fr4M4klAwkF+/VZPxf2HbCRQDtSquZPbiMBU+d2Epjv1x6AF8uPWhbcqr8kKW4ePMeFnasjqJZXQRQLLDL5yfGqZnZ6NSm2MZ7Khy+ZM95UF2/UjlSs2LLMo1rCouKInzc3Xv3Ubifq6yKnfg8UUmFCklTEsiRS7dZkWou6WXMFObH6zJzN/YRC3eLyiVcWcOYEa/Cf79tO4XOPz4hgKHxQkA1Ca20vw5dwtvfbUTBTMmxuLP5EbBoNyVt/b79jLsCggobZW3hCh7U327GLI3lEm6k4EGqUOYE0BX/bPQ3f659SwQwZWLQjmDWVImxTigN5Mm2U1cjUW34CvCM7sF/7sF3a4+iXY286NnQ+hFwkT6LcOdB1FME0FOBfJX+U/n+ll0j/u6nCaADD6hcQLTwh/wQjqkHQ9nLQlbZgMzp8tN2zN16Gj0bFka7ICGAnqS9HLgGPJNQNpBcvFfT8X9hazQBJJ1ZIgdWm9mDi2fCeYqDsXov6j9myQF8teygbcWBCkOW4sLNe1jQsRqKZU3FpiBqrPI5idJ1ZjbasUN2DNeOFqUDl+45j9ZEALOnwryPqkldiq87Tz887t27j0LRBNCOZJ+RkFEdwCMXb+PHtpXAJb2MmcIpE7viK+00I+FMmtBVr9GbsoYK//2+7TQ6/bjdPf14IcCRYY0tmbP24CW8M3kjCmVKgYjOYaZjRbupbucfO864KyCosNF0QtEdakcreNCfdjNmaayo4FGzUMYYt/dknzd/8+fahHdcO4CySklUvJxUTXhCz6A/92Dy2qNsc4E2Gay2on0XIfJ+FFZ3rYWc6Z7sAIrxsPz7ptJ/Kt/fVjHxV39NAB0gr3IBMQI4PRxTD4RaUjYgc7r8uJ0dg/RqVBhtw4JjB5DvxIxsVhKvGYLx7bjIaiC5eI9Xv1kHOkahRkHlI1UQwN7hoN0fT3Ewduyl+D+KA7SrOFBx6FKcv3EPf3aohuLZXASQjoTpaFhsYq06lQ9nMwxem7AOm45dxfi3y6JRCZd29LK959Fq2maUzJ4Kf0gSwNhCD+7fv4+CfV07gHZq9BmPZEmJ4fDF25jTthK4pJcxUSSFAwJoPHJOFl2w25uyhgr/zdt+Gh/PeUIAQ0KAoxYJ4JqDF/Hu5L9ROHMKLOpkTgBFu0m68c+dZwOCAHIFD1o/djNmaayo4FFLggB68zd/rk14pywrA0NKSTJSmWeu3UEVIoDRCT0D5+/B938dZeFFFGZktRXruwi370dhVdeayJUumXu4GA/Ld9xVrFF+Q5Xvb6uY+Ku/JoAOkFe5gGjhD50ejikOCOBnjYqgTVheBxaqG2r8YscWi2VnFpwAysYRifdo9s06bI4mgFRWYkQz3+8A8kw4XxNAu4oDlYYuw7kbd4OOAH7zdlk0jCaAy/edx3tT7RFAT8lHtEYL9HHVQfQFAaQYwEMXbnklgHbURsR1K5JJUbrOW0KUiperPwigaHfjklmYJCBPgFNho+zziCt4UH+7GbM01q3g0bI8rBBAYwIcf66JBFBGKvPs9TuoPOxpAvhBzXzoZoMAkrwk/TiKjQDymFuV/lP5/pZdI/7upwmgAw+oXEAiAbQibUXmdP5xO37bdhq9GxdB6+rBQQBjy8a04yKeSSgbRyTeg+8u0b/ZVdYwe3B5C4S2YyuN+WLxfvxv+SHbigOVhy3D2esxCSDFBFJsoNhEuTIzG+3aIjNOfJk1KO7aAVyx7wJaTt2EEtlSYX4HuSNgvgPoqfyQSADtyLQZy7JQDODBC7cgarp6I20yGBj7GLOOuWSft4QoFf6j49eOs7eBdv4eP3bN8Njn1o6AVx+4CDqap2QkSkoyazEIYIksWPDPWXcCnAobzebDP+cKHvS33YQJGssVPEjCrVZh8yNgb/7mzzX60ZQpVWJpqcxz1++i0rBl4BndA+bvxpS/juHDWvnQ9XnrO4Al+kXg5r2HWPlpTeRO/2QH0FNClEr/qXx/y64Rf/fTBNCBB1QuIJEAWpG2InM6zdnGAqGDkgB6KMhrx0XrojMJnxUCOHrxfoz1AQGc/1E1lMjuOgK+cPMuKgxZFuNlvumzukw+iprKh7OZz8XjLCMBLJ4tJf7sYE4c6B6x1Z8UCaBot9nc+OdigWKqy8cJoKjp6u3YVvYeYj9vx8nepNVU+I8TQEr+oJguOwRw1YGLoJAQOwSwYfHMCN91Lk4SQJJwq104U4yl4cmH3vwthk3QETB9h3KkTYI13WrHutw4AeQZ3f3/2I2p65wTQNJ5pl1K3mIkREWXXVKxRt3fzxs3kCpVKly/fh0pU7oS3561pgmgA4+rJoDDpofj+wOhlpQNyJyP52zDvCAjgLwgrydJLjsu4pmEsoHk4j14ggH9m11pNbMHF8+EMwZC27GVxoyK2I9xKw7ZlpyqMmwZzly/iz8+qoqS2VO7COCNu6gwdBkokJ9e5bSjI2oXm9lo1xaZcWJAe4PimdmQFfsvoOWUTSiWNSUWdJQjgLEp0JB9BftE4DFCYtgtMz/qY5Rmo6M8kvSa1boiuKart8QN2XuI/bwllHiTVlPhv/k7zqDD7G1st+hBlIsAHh3WCCG0JSjZVu6/gBZTNqFolpRYKLEDKNr9fLFMiNh93l0BQYWNkma4Jdyov92MWRorSrjVKWJOAL35W0ycypwqkcdMYU+2nb9xFxWHLgPP6OYE8KNa+fHp84Vk4XD3K9E/AjfvPsTyT2ogb4bk7n8X/cgLr6v0n8r3t2VQ/DRAE0AHwKtcQLTwOQG0omxA5tARDP0SJ6FuKj8QiM34xeaarJ83LYE3KsTUZLUzf55JKBtILt6Dlxihf7MrrWb24OKZcMY4GDu20piREfvw9YrDtgkgZflRth+VT6EyKtTEBz/V6KINnb8F7WIzG+3aIjNOLGnxfDEXAbRKHGhMbBrUMQigDc1mUUnl4JCGbAfQKOnlrXSLDAbGPt5KyvB4WGNGvAr//bnzDD6atY1ljNJ8qB0Z2gjx6FeEZLNK5EW76xXNBCoHxCsgqLBR0gxwCTfqbzdjlsZyCTdS8Khb1JwAevO3WDqJysA0m7AeudIlxaqutWI1SfwhSBnd/ebtwrT1x9Ghdn58Ut86ASzZPwI37j7Esk9qIJ9AAMUdbC69qNJ/Kt/fsmvE3/00AXTgAZULiBb+5zPCMXl/KKwoG5A59Aucfon3faEo3gsSAth62iYs3XuByZiRnJnTZjWTULwfLzLsIoD2pNXMHlw8E84YB2PX7hGL9mH8ysOwKznFCSAVUKZCytTEox/ay6EjvY296rAMQmpmNtq1RWacWNS2fjQBtHp0yPw7cQPWH7kMUVKO35/sK9QnAo8QEsNumflRH1FJ5RARwLFrse/cTYiSXt6KN8veQ+znrai0N2UNFf6jBIwPZ20FFQ2mYr/UqA4g7R7JNh7LKXuUL9pdt0hG9hzhFRBU2ChrBy/gTP3tZswyAhgt4UYKHkRwY/j8wQMYNce9+Vssnk5lYF6bIKeVLoaCUEZ333m78MP64+hYOz+62CCApQYsZrvjJPNHcn+8eQphUOk/le9v2TXi736aADrwgMoFRAt/+IxwfLc/1JKyAZnz0aytrBRCvxeLomXV4NgBbD1tM5buPY+hTUowNQunzWoguXg/LjNG/0ZzoTlZbWYPLp4JZ4yDsXof3n/4on34ZuVh24oD1YYvx6mrd/DbB1VQJmcadlme/UfHeXT8+/DRY4jSdWY22rVFZpynlyL3uZVdX+7rsW+WwYulsj71ci3UNwKPHofEsFtmftRHVFIhEkTlPIgAipJeYqKIqN4hew+xnzdZOR4Pa8yIV+G/hf+cxQcztzLdWKr1Ro3Ib/zQeNIm8Wxu2WQe0e7ahTMybWdeAUGFjbKGiATQbsYs3cvTjx0+B0/2efO3KJ9IO4C0IygjlSkmg1FCT5/fd2H6huPoWKcA01y22koPXIxrkUQAw5A/o0t3nJoYD8sz4lX6T+X72yom/uqvCaAD5FUuIF8QwP4vFkWLICGApOBARze+JoCycUTiMuC7QvRvb1fMiSEKCCDPhPM1AbSrOFB9xHKcvOKZAFL9r8d4zGK6Ao0AisdidnZ9+Utx3Ftl8ELJpwlg4b4RiPIBAaRj0MZj12Lv2RteCSAliiSKH2r7iSQW0hWl67wlRKl4uYb/cxbvz9yKZAlDWa03JwRQtp6jaHetQhmYtjNPgFNho6yDuIIH9bebMUtjebgDSbjx3W4ZAmhMgBN3uzkBlJHKFOuBigTw4zoF0NkGASwzcDGumhBAXsZIpf9Uvr9l14i/+2kC6MADKhcQLfwRM8IxaX+oJWkr9rCZtZXVwhrwUjH8t0puBxaqG2r8Yrf9YTMW7zmPIU2K4+2KuRzfmB8HWkkI4DflcWH09zuVcmLwK77fAfQWCG3X8M/D92HCqsO2FQfCRqzAiSuRmPtBFZSN3gEUC8ByAri+Z21kSZWETVPlw9kMBx4XNfm/5cAD4+3EffJjMVFRRHy5cgIo2m02N/65KKVHiRCN/7cWe87ewA/vVQDXdBUzhQ8Mbshi5+w2UUpLlK7zlhClwn+Ldp1F+xlbQSVo6HibGsU/JrCwA8gLessquoh21yyUgWk7BwIB5AoehIHdhAkayxOeSMKNx7vGRgC9+VuMdyUC+PrEDcgrIZUpKgIRAez9+z+YseEEOtUtgE51re8Alh20hMlMLukchgKZnuwAekqIUrFGOXYq3992v8P/9jhNAB0grnIBxSCAFqStGAGcuZXVwgpGAjj4leJ4p5JzAsgTAgKdABoDoe0ux2Hhe/HtqiOOCeCv71dhWefURAkoSgO+H/UI63rURtbU/ieAnjIjrUqIkY08MN6MAIp2y/pIfHGKBFDUdDVmCvuKAIrSdd5wUfFy5QQwReL4LNOTmlVia1XSTySARKwpFCAuEkCScOMZ77ERQG/+FgkgxfG+YYMA0jru/fsuzNzonAAu7hyGggIBFBOiSDubpAxVrFFNAJ88wTQBlH2ae+innADODMekfaGWpK1omh/M3IKF/5zDwJeL4T+Vg2MHsN30zax8w6BXijM5M6eNZxLKBpKL9+OlQejf7EqrmT24eCacMRDart3DFu7Ft6uP2JacqjFyBY5fjsSv71fGc7nSsmmIIvCUBELZlqJ2sZmNdm2RGceL44q10fjOh5Xaj7w0higpJ75ci/SNwMPHITHslpkf9TEenXFJr6kty4Nruhozha3slBnnQZnaeXouZP8sKpd4OxpX4b9Fu86h/YwtSJUkAQv0p2b1aJtCQSgkhLLRKSvdrIl2Vy+QHmsOXnJXQFBho9l8+Ofc3/S33YxZGuup5mVsBNCbv/lzjYqeEwF8c9IGyGilizvZFMrQe94uzNp4Ap3rFsTHdQvIwuHu99ygJbh8+z4iOoWhUOYnO4BiQtTegQ2QJGGoJoCW0bU2QBNAa3jF6K2aAI6cGY6J+0ItKRvQBN+fsYUVQx30cjG8GyQEsP30LVi023dztqMKwZ3LiwPT33al1cxePE8y4WIGQttdjkMX7sXE1UdsS07VHLkCxy5H4pf2lVEut4sAnrwSieojVrCMTkoCuWfQLjaz0a4tMuPc8liCOoK34PfYrieqI3BJOfHlWrRvBB48DrGl2WwMnvck6WXMFLaSLOHJrtw9FrB/FpVLvCXHqPBfxO5zaDd9C9IkTcDivKhZTW5ZvPsc2k7fYin5jdtdNX86/HXosrsCggobZdYn9eH+pv+3mzFLY7nqjSh7GBsB9OZv/lwj2UMigG9N2siycOlHaGzNmMxEO4Cz/z7BEkAoEcRqKzd4CS7duo9FnaqjcOYnBZg9JUSp9J/K97dVTPzVXxNAB8irXEC08DkBtLqL5SZTPtpNcwCR16HGLzYnrb7atbSjC8sny+XB6O//Vs6FAS8XtwyB2YOLZ8IZ42As3yh6wJAFezBpzVHbklO1Rq3E0Uu38XP7yihvIIBJEoSyJBAq67GmWy3kSJuU3dXMRru2yIzjuytTBH1Ub+UvYrueJ0m5GASwXwQePAqJYbfM/KiPsXyGJ0kv48vVSrmU2AigqFzirTyOCv9x8pYuWUK2y2OHAHISaaX8FSeAlfOmY2V9eAUEFTbK+p/7mxFAmxmzNFZU8GgUrXsdGwH05m/+XPuieSlQDOBb322EjFa68UdKn3lEAE/ik3oF0cEWAVzKdsdJ5o/UXngT42H5jwaV/lP5/pZdI/7upwmgAw+oXEC08EfNDMe3+0ItKRuQOfw41VfxdA4gkiaA/NjaV3GLVgPJxYmKBLBFldzo/1IxyxCYPbh4JpwxDsbyjaIHDP5zD75be9S24kDtUStx5NJt/NSuMirkce0AnrgcibCRK1hJD9oBvPMgKmAIIA+wF49TvRXAjQ3TJ8drnuOrivWLwH27BFBQUqECujxuUTy2Nh6vWSmY7MmuPD0XPKXY4q1AttkatbMW+fFt+uSJ2EueGj/Ok70eP0a2UgCf210xT1psPHoFvAKCChtl7eD+pv52M2ZprKjg0bikS/c6NgLozd/8uTb6tVKgOoBvf7cRMuESxjAFKgMzZ9NJfFq/ID6qbX0HkPTFaXd8YcfqKJr1CQEU42F52IBK/6l8f8uuEX/30wTQgQdULiBa+KNnhmOCAwLoq4xaBxBJE0BfJ664CaBkHJE4URKip2MUaqoIIM+E8zUBtKs4UHv0Shy56JkAUkkPigGkum6BsgPICaCYUMElsGTimri/OQH0lmHpCwLIJbR45rI3AmhVMs3TlytvzwUuxZbP6iBjClfBbm8JUSperjyBI2OKRLhw0xkBpGQkSkqSadxu+vHy99Er7gQ4FTbKzIf6cH/T/9vNmGUE8Nv1zCZviUrGQtDe/M2fayIBlJHKFIkZZXRzAtj1+UL4sFZ+WTjc/SoMWcrWRmwEkCcOqfSfyve3ZVD8NEATQAfAq1xAjADOCseEvaHSmpjcFF5SxVc19RxAJE8Ao0vX+Kp2IX8RkaoFqVtYaSRET8co1Owqa5g9uLwFQluZp9h30J97MHntUduKA3VGr8Thi7fxY9tKqJg3Hbv08cu3UWPkSlbSgwLtqa6bqF1sZqNdW2TG8RprYkmVjUcuS5e24PfgJTa81Vijgt33HoXEsFtmftSHS+nFjxeCQ0MbuRUdxNI1xhIbstf21i9fr4VMsUWU7POWEKXCf/yHV6aUiXD+hosA8oxOWdt4JnG5XGnwiyQB5HZXyJ0Wfx+74k6AU2GjrB28WDn1t5swQWN5qSJvtSqNBNCbv/lzbRTtAKZMjHcmb4RM0XRjqSIigD9uPgm7BLDi0KVsbSzoWA3FsqZyw+kpIUql/1S+v2XXiL/7aQLowAMqF5BIAClOguIlZJuviyrL3tdKP+MXm9cu9JV6CT+KCnQCaAyEtoKh2Hfg/D34/i/nBHBO20qoFE0Aj126jZqjYhJAUbtY5cPZDAeusuCRAKZPhuWf1jS7BPvcrMguJ4B2NJtFKT2RAIrFq42ZwlKTjqUTJ0KiZJ83aTUV/uMEkAjGuRt32Ux5UV9Z23gxaTsEkMZsPn41ThJAb2o1TxHAfRfQcuomGGPHOQEc2awkOwJ+d/LflgkgHc0SAfxp8ynHBPDPDtVQPNsTAijGGvLakSrWKF+HKt/fsmvd3/00AXTgAZULiBb+F7PC8c3eUKkvqWgGl1Xzla6uA4i8DjV+sbl8na/0i3kwupVAcj7ZFlP+ZsVkqb1XNQ/6vljUMgRmDy6eCWcMhLZ8o+gBA+bvxpS/jsGu5FTdL1bh0IVbmN2mEirnc+0AUlIIJYekoB1AgBX2FbWLzWy0a4vMOE4ARVk1OiaTlbfi9+AyW950Vov3j8C9qJAYdsvMj/qIUnoHhzRyS3qJ9zJmCste21u//L0WPiXZ501aTYX/+L2ypkqMM9ddBJDLesnaxuXkyudOg5/byx0Bc7spbnDriWvuCggqbJS1g68t6m83Y5bGihJuL3mQKzQSQG/+5s+1EUQAUyYGHQnL7AAas3OJAP685RS6NSiED2paPwKuNHQZ+3FgJIBiQhSXD1TpP5Xvb9k14u9+mgA68IDKBeSMAG5iguifNy2BNyo419V1AJE0Aewwexvm7zjjrt/l9J48k9BKIDm/Z8spfzM5KWp2pdXMHlzlBrsy4YxxMHbt7v/Hbkxdd8y25FS9L1bh4IVbmNWmIqrkS8+mceTiLdQevQpU1JcY4M17DyFK15nZaNcWmXHPj1mN/edvYkariqhWwDXfTceuSAvc83vwYzpxV45/RvaRYsvdqJAYdsvMj/qISioHhjT0uNtozBSWvba3fgU+W8gk+0TlEr4rZ5RWU+E/vtuYLXUSVkic2j/96yNF4gTSppGKEZ0I0HHuT+0rS43jdtOO//aT19z1RFXYKDUhYXeZ+tvNmKWxXMLtqzdK4+XS2WLc3pN93vzNn2sjXi2JTKkSg3YEZU6XxPp8lJ1LZWB+2XIK3RsUZiEnVlvlYctw9vpdzP+oGkpkf7IDKCZEkXY2xc6q9J/K97dVTPzVXxNAB8irXEC08MfMCsf4vaGQCdQVzWg1dROW7buA4a+WwOvlg4MAdpy9DX/sOOOu4O/AqMbNKwAAH0xJREFULWwozyS0EkjO7/ne1E1MUJ5a62p50PsF3+8A8kw4YxyMXbs5AbQrOVV/zCocOH8Ls1pXRJX8LkJ1+OIt1Bm9CikTu3YASdlh+Sc1kDdDcva5yoezGQ58vjNbV0TV6PluPnYFzSasR650SbGqay2zS7DPPUnK8YFkHxXsvhMVEsNuqQsblFQoqN2TpNcFQ6aw7LW99Sv4WfhTii3elDVU+I/Hn+VIm4RpS1Pb2b8+UloggH/uPIOPZm1j2eiUlS7TuN0kH7fj1HXwCggqbJSZD/Xh/qb/t5sxS2NFBQ8ZAujN3/y5Ru8FqgPYYsomqfhyUaGDMrqJAP669RR6NCwMSjqz2qoMW8Z2h//4qCpKZk/tHi7Gw1LBacqIV+k/le9vq5j4q78mgA6QV7mAGAGcHY7xe0KlUvVFM/gXnX7pNS+fw4GF6oYav9gfz9mGedt9SQBdmqRW4oi4tZxA099tqufBZ419TwB5JpzxGMQu4v3m7cK09cdtKw7wHTWRUNGRMB0Nk6oDJYHcuPsQonSdyoezGQ7uHUuBsG45fgWvfrMeOdMmxepucgTQU2kWTwTQjmSfqKSyf3BDQdHhSckZnijCM4XN7Db7vGDv8KcUW7wpa6jwH89AJRJOyjLUdvSrz9aQbKOTADoRoJIuP8oSwGi7S2RLhX9OX3driquwUdYOnmFO/e0mTNBYUcHjlTLmO4De/M2fa3QyRDuALadskioxZtToJQI4d+tp9GxYGO1sEMCqny9nu8Ok8kJqL7yJ8bA8I16l/1S+v2XXiL/7BTwBHDJkCBYsWIDt27cjYcKEuHbtmilm9LIaMGAAJk6ciKtXr6JixYr4+uuvUazYk3pu9O8dO3bEH3/8wa730ksvYezYsUid+smCNLuRygVEC//L2eH42gkBbFYSzcsFBwHsNGcbfldAAK3EEXF/t57mOkKn1jYsL3o1KmK2FJ763OzBxTPhfE0A7SoO8Jg6TwQwdVIigGDSXgFHAIUj6y3HrzKSZYcAThEURUQCWKp/BCKjQmLYLbsYOAEkJZV9gxq6FR1ETVdjprDstb31K9Q7nCm2iJJ93hKizNaonbnwIsR50idjMaROCGClvGkxp63cDiC3mxIfdp2+AV4BQYWNsrjwIuNOCSBX8CAJNysE0JgAx59rIgGUERm4cz8KRfouYmZTRjcngL0aFUbbMOs7gDIE8Njnjdn9VPpP5ftbdo34u1/AE8B+/foxUnbq1ClMnjxZigAOHz4cRBynTp2KggULYvDgwVi9ejX279+PFClc2oMNGzZk1ySSyF70bdsid+7cmD9/vrRPVC4gWvhfzQ7HuD2hUtXaxUnzWA/K9notSAhg5x+347dtp/FZoyJoE5ZX2gfeOvJMQitxRE8I4GYs3Xue/dkuLC96KiCA3gKh7Rred94u/LD+uG3FAU4AxZi6Qxduou4Xq5msFx0BX4t8wGSjSD5K9cPZDAdPSStbT1xF0/HrQMePa7rVNrsE+9ytziEoivCB9B0sNSACkQ9DYtgtdWFBSo+UVPYOauBWdJjwTlk0KO4q6MszhROEhoASRZy2wn3CmWLL2u61kD2NS7HFW0KUipcrlyHLmz4ZKyxObUff+kiVVH4HkEJBKCSEVD1mt60kBQm3u1jWlNh95gZ4ApwKG6UmJCh4UH+7CRM0lhdwJgm3JmWyx7i9J/u8+VtMDqQkEMoUph3T+R2qxWrS3QdRKNzHRQApo5uSQOY6eFZXG74cp67eYeW5iKTy5ikhSqX/VL6/ZdeIv/sFPAHkABGZ69SpkykBpN2/rFmzsr7du3dnw+/du4dMmTKBiGG7du2wd+9eFC1aFBs2bGC7g9To/ytXrox9+/ahUKFCUn5RuYBEAiij1yhOmGd7BSMBtPur0ugwnkkY6ATQGAgttfA8dKKH8vQNzgmgmFV78PxN1BtjJIBPtItVPpzNcOB1C8WsZU4As6dJgrXd5QigJ31efu+YBNC6ZjPXUjYSQFHT1ZgpbGa32eecCIkFu71Jq6nwn5sAZkjGCotT2963HlInTWg2dffn87afxsdzttsigJTUsPds3CSAJOHWtKw5AfTmb04AaXc0c6pEeG/qZssEkDK66Vnj5Mc6J4C/fVAFZXKmcfudJ0TRP+gdQOmvi6OOcY4AHjlyBPny5cPWrVtRpkwZNzgvv/wy20mcNm0avv/+e3Tp0uUpMkmfjxkzBi1btvQIKhFJ+o83IoA5cuTApUuXkDLlE0kbRx6JHkwP5/G/LGU7gMkShaJOoYzSl91w9AqrtD68aTE0NcSMSF9EcUeyb8mSJahXrx4SJEiArr/8g993nEXRLCmQPzrJwMkUzly/g83Hr4GOgGe1Km/pUu/P3Ial+1xZwG2q5Ua35wtaGk+djfYZL1B95Cqcu3EPYQXSIXUS+Zejt4nsPH0dxy5HokOtvEx43mp78ev12HfuJirnTYsMyROx4VQAduWBS2wHkNrVyAeoVSg9UiRy/f3o8SOcPXsWWbJkQbyQeFZv6aj/sv0XcPteFGa8V47FilGj7M/XJv6NJAnioV6RTFLXX3XwIq7feYjJ/ymLsOhsYj6QfFh+6HLcfhgSw26pCzPllIdsHZGU3o4+dfDmd3+zNVkuV2pkTZWEXYbk9ZbsvQDaAdzTv57spb32KzlwKe48eIS6hTMgacL4rN/ZG3ex6dhVlMmRCj+1df3glVmjdiaz9tBltJy2BaTGQoXFqTUolgkJQ+XXB8WHbTlxja3FH1qWk5oGt5sy1ilZacjLRdG8XHbT76HUxW124v6m4Z/WK4B2YXlsXYnwJFzJfzmid3X5hTx9B735mz/XSmZPCfpRsvHoVZTIlhJz28e+y3rvQRSKD1zGbtmoeCbsPHUdp67dRc8GBfFe1dyWbar1xRq2A1g9fzqkEX4Y3H0YhcV7LiAkBDgwsL6yNconTO/v9OnT4/r16z5/f1sGxU8D4hwBXLduHapWrYrTp0+znUDe6Ij3+PHjiIiIwNChQ9nx8IEDB2LATsfFRP569uzp0R39+/dnsYXGNmvWLCRN6jpu8WU7EwkM3+F6iNtpbQtHoVgaOrwL/PbbsXhYeVb+JSFrUcm0j9Cq0CPZ7qzf7MPxsOGCay4v5YxCnWy+x3DEjlCcjgyxNC+Zzq/mjkJYFuvz/XpPPBy47hn/TEkesxjAC3d9P18Zm2Lr06PUQ2SJ/updugsM2mbv+/JJiYfI6TrZjtGGbAt1bHfaRI/Rr2wUJu+Ph51XPGOcKsFjDCwX5RQO9N8Siqv3PfupeJpHaFPY2nfB6oRO3QZG7oyPfCke42wkWPyk3VYm3SO0KCg3X6PdrQpFoWRa698Du3P1NE709xt5o1A5k735/HAwHrZcsv5sNPpbfK7x+RZJ/Qjti8SOMUkL9twUysohie3t/FGokMG6TaN3huLEbe/rInn8xxhS3vl3wcyXkZGReOuttzQBNAPK1597I1LifTZt2oRy5Z78+pM9AuYE8MyZM2xngrc2bdrg5MmTWLRoESOAtBNIMYFiK1CgAFq1aoUePXp4NPnf3gGkHbLQnGVw5sZ9yy5InzwhGhbLhPgWfnlbvomDAcYdMoovW7jrHAtg91WjzMp6RTIiSyqXJqpso3IEi3afR4LQeGhcIjOSJbJOKsx2AOl4bNXBS7JTkupHkm0vlMiMJAlDpfqLnegXOZUOooe9sVXL7yoMTbsQYouKimLfIQqZCA21fk/LkzQMyJkmCeoUibkzvvLARRy95Mo+lW1UtLh+0YwIoa0HoZEPp89bgkeZCjuyj3ayqOAu1T6j3T6SajO2innSsJIcThvt4q4/cuWpy3j6LpitUTtzoRCc5fsuomDm5CxmlHY87TSSzyOfULkSmSbanTZZQrZTRd9fFTbKzIf6cH8nTxSKxsUzI1ECe98Rio2j59FDD+vG23fQk7/5c+1+lGv9xQsB6hbJCKrZaNaotA4V2OYtdZIEaFQiMxLFt05Mj12+jRX7vT/7KuROw7KTqan0n94BBPyyA0hHpvRfbI0SMhInfvLllyWAKo+AjfNVHQNorPBu9iUNps9VxB8Fkv1x3T7+cNZrNJBWnbW56DVqDa9A7B3XfajSPpXv70BcK57m5BcCaAccWQLIk0A6d+6Mbt26sVvdv38fGTNmfCoJZOPGjahQoQLrQ/9fqVKlgEoC0S9XOyslMMaofHAFhoVqSzQEgo1x3Ydx3T79IyUQvkXO5qByjWoC6KcdQCtL4sSJE7hy5Qqr1zdy5EisWbOGDc+fPz+SJ3cF7RQuXBjDhg1DkyZN2N+U7Ut/T5kyBXSsS0e+K1eufKoMDB0Tf/vtt2wMxQjmypUroMrAaAJoZaUEVl+VD65AsTSu26jtC5SVZn8e2of2sQuEkSr9pwlgEBDAFi1asHg9Y1uxYgVq1qzJ/plid4jsUV9qvBA0kTuxEHTx4sXdlyFSaSwEPW7cuIAqBK0JYCA8guzNQeWDy96MfD8qrtuo7fP9mvm3r6h9+G8j7tv7qfSfJoBBQAB9u5x8ezWVC0jlwvctCvaupu2zh1sgjdI+DCRvWJ9LXPcfIRLXbdT2WV/3fITK97f9Wf27I4MmBvDfhUXubioXkP5iy/kgUHvFdf/pl2ugrjz5eek1Ko9VoPaM6z5UaZ/K93egrhfjvDQBdOAplQtI5cJ3YLLPhmr7fAal3y6kfeg36H1y47juP/0jxSfLxK8XUblGVb6//QqahZtrAmgBLGNXlQtI5cJ3YLLPhmr7fAal3y6kfeg36H1y47juP00AfbJM/HoRlWtU5fvbr6BZuLkmgBbA0gTQAViGoSq/2L6bpf0rxXX79MvV/toIlJF6jQaKJ+zPI677UKV9mgDqJBD73zzSSr1xA6lSpVIiJaNy4Tsy2keDtX0+AtKPl9E+9CP4Prh1XPef/pHig0Xi50uoXKMq399+hk369noHUBqqpzuqXEAqF74Dk302VNvnMyj9diHtQ79B75Mbx3X/aQLok2Xi14uoXKMq399+Bc3CzTUBtACWsavKBaRy4Tsw2WdDtX0+g9JvF9I+9Bv0PrlxXPefJoA+WSZ+vYjKNary/e1X0CzcXBNAC2BpAugALMNQlV9s383S/pXiun365Wp/bQTKSL1GA8UT9ucR132o0j5NAHUMoP1vno4BdISdyi+2o4n5aHBct08TQB8tFD9eRq9RP4Lvo1vHdR+qtE8TQE0AHX0Nr1+/zqTjTp48iZQpUzq6lnEwLfzFixejfv36SJAggU+vHQgX0/YFgheczUH70Bl+/h4d1/3Hf6To56i/V5r9+6tco0QAc+TIgWvXrrFkzmex6SNgB14/deoUW0C6aQQ0AhoBjYBGQCMQfAjQBk727NmDb+I+mLEmgA5AfPToEc6cOYMUKVIgJCTEwZWeHsp/najYXfTpRG1eTNtnE7gAGqZ9GEDOsDGVuO4/giSu26jts7Hwo4c8fvwYN2/eRNasWREvXjz7FwrikZoABqjz4np8grYvQBeehWlpH1oAKwC7xnX/cQKoqlZrILg0rvswrtvn7zWkCaC/PeDl/nF94Wv7AnThWZiW9qEFsAKwa1z3nyaAAbjoLE7pWVijFiHxaXdNAH0Kp+8uFtcXvrbPd2vFX1fSPvQX8r65b1z3nyaAvlkn/rzKs7BG/YmvJoD+RD+We9+7dw/Dhg1Dz549kShRogCdpf1pafvsYxcoI7UPA8UT9uYR1/1HqMR1G7V99ta+HuVCQBNAvRI0AhoBjYBGQCOgEdAIPGMIaAL4jDlcm6sR0AhoBDQCGgGNgEZAE0C9BjQCGgGNgEZAI6AR0Ag8YwhoAviMOVybqxHQCGgENAIaAY2ARkATQL0GNAIaAY2ARkAjoBHQCDxjCGgCGIAOHz9+PEaOHImzZ8+iWLFi+PLLL1G9evUAnGnsU+rfvz8GDBgQo1OmTJlw7tw59m9UiZ0+nzhxIq5evYqKFSvi66+/ZjYHalu9ejXzzZYtW5h/fvvtN7zyyivu6crYRLZ27NgRf/zxBxv30ksvYezYsUxX2t/NzL4WLVpg2rRpMaZJftuwYYP73ygz8dNPP8Xs2bNx584d1KlTB7SmA0FuiTLr586di3379iFJkiSoUqUKhg8fjkKFClma/4kTJ/Dhhx9i+fLl7DpvvfUWRo0ahYQJE/rVhTL21axZE6tWrYoxz9dffx1z5sxx/1sgr9FvvvkG9N+xY8fYfOl50bdvXzRs2JD9LbP+AtV/NH8z+4Ldf8YvCK3ZXr164eOPP2bvurjgQ78+BCzcXBNAC2D9G11//PFHvPvuu+yFWbVqVXz77bf47rvvsGfPHuTMmfPfmILP7kEE8JdffsHSpUvd1wwNDUWGDBnY3/TiHTJkCKZOnYqCBQti8ODBIAKyf/9+Jq8XiC08PBx//fUXypYti1dfffUpAihjE72oSEeaiC+1tm3bInfu3Jg/f77fTTazjwjg+fPnMWXKFPdcifSkTZvW/ff777/PbCG/pkuXDp988gmuXLnCSDP535+tQYMGeOONN1C+fHk8fPgQn332Gf755x/2/UqWLBmbmtn8o6KiULp0abaOR48ejcuXL+O///0vmjZtyoi8P5uMfUQg6Ps2cOBA91SJxJJiBm+BvEZpbdE6yp8/P5su/SChH2Xbtm1jZDCY/Uf2mNkX7P4Tvx+bNm1C8+bNkTJlStSqVctNAIPdh/58Bli5tyaAVtD6F/rSbgqRC/oVyFuRIkXYLhP9UgqmRgTw999/x/bt25+aNu2UkQZjp06d0L17d/Y5/XKnHUIiUe3atQt4U0n/WdwBlLFp7969KFq0KNsxI19To/+vXLky25USd6L8DYDRPpoPEcBr164xv3pq169fZ8Ro+vTpoF0laqSXnSNHDixcuBDPP/+8v82Kcf+LFy8iY8aMbEcsLCwMMvMnkvzCCy+AdLppDVOj3TPC5sKFC+xlFijNaB/NiwgEEVi+22KcazCtUT53+gFCJLBZs2am6y+Y/Ge0r1WrVnHGf7du3WLvOtrsoB//fE3Gte9goDwLPM1DE8AA8s79+/eRNGlS/Pzzz2jSpIl7ZrQ1TiTKeGwTQFP3OBUigPRQpp0FKmZNhGfo0KHImzcvjhw5gnz58mHr1q0oU6aMe/zLL7/MjkKNx4yBaKuRIMnY9P3336NLly6MRImNbB4zZgxatmwZMKZ6I4BE/mjXj+Zco0YNtotLJIoaHYnSkS/t+KVJk8ZtS6lSpdiPGGNIgL+NPXToEAoUKMB2AYsXLy41fzpunDdvHnbs2OGePh2ZEgkh+2knI1Ca0T5OAHfv3s1CMOgHF+329evXz73rHkxrlHZj6XlJO7C0A0jhJWbrL5j8Z7SPfjwSgY8L/iOf0XeGnnvijxKZZ0gw+TBQngWaAAayJ6J3SrJly8aOGCk2iTciTUSI6Gg0mBr90o6MjGTHTXRsSL/yaJeLHl5kCx1xnz592r2LQrbRcejx48cRERER8KYaCdK6detMbSJf0tHogQMHYthHGBH5I+WXQGmeCCCFKCRPnhy5cuXC0aNH0adPH3aUSse7RPJnzZrF7KDdXLHVr18fefLkYSENgdKIANEPDiJva9asYdOSmT+tUYo/W7x4cQxTyH7y7ZtvvhkQJnqyjyY2adIk5ovMmTNj165dbM3RceqSJUvYvINhjRJhp13zu3fvsvVIfmvUqFGc8Z83++KK/2jHnH440hFw4sSJYxDAuPQdDIgHQSyT0DuAAeQhOiojAkhEgh5uvNEXhY7UiDwFc7t9+zbb9evWrRsqVarEyBLZnCVLFrdZbdq0YUdrixYtCnhTvRHA2GzyRuZpF4qOd3r06BEwdnsigMbJUSIMkUF6oFMMnLeHd7169ZjvJ0yYEDD2URLHggULsHbtWneCisz8vf1IoV3RH374gcUYBkLzZJ+neRF5L1euHCPxdCQXDGuUTksokYN20n/99VcWJ00nJHRS4ukHiLj+gsF/3uyjHUBjCzb/0fOd1hv9gKKTAWriDmBc+g4GwnMgtjloAhhAHoprR8CeoKUHMe02dO3aVR8BCwAFyxGwJ58SeW3dujWL5ZQ5vgmEr1yHDh1YHCMlHdFuGG8y8w+G4ydv9nnCnnYKafeSx20G0xEwt6du3brseUJxp3HpCNhon6cd9GDzH33vKMRJTAijo276wRkvXjx2+kP+jC2MJBi+g4HwnDObgyaAZgj9y59TnNxzzz3HAmN5o199dFQVbEkgRujoWJAe0vQLnI4OKYC+c+fObEeQGhFgiiUL9iSQ2GziAfYbN25EhQoVmN30/7QjGgxJIEafUgYs7VpTRvN//vMfdxLFjBkzWHYfNdolpBIwgZAEQi9LIkeUvLNy5UoW/yc2HoAe2/x5EgFlcvPdazoap5gmfyeBmNnn6XFGx8AlSpRwJ8IE0xrl9hDpo0Sjr776iiWBBKv/vL1uuH0UYmBswea/mzdvsjAfsdGubeHChdmPSPJjXPThv0wlpG6nCaAUTP9eJ14Gho7K6BiYXqwUs0Nxc3TUFkyNasG9+OKLrHwNvRgpBpCOaSi+hWwhokeklkqK0IuYjp7opRzIZWAoc40C66lR8soXX3zBgv4pmJnslLGJgu7pmJj/midCTHgEQhmY2OwjGymxh8rfEPGhODiq30VHcUQaeOkeKuHw559/sng4GkPrgIhiIJSB+eCDD9gxNSVxiBnXlKhEpVComc2fl4GhBApKcqKdCsoApiQXf5eBMbPv8OHDmDlzJouXS58+PSt/Q2V6yHaKx+K7MoG8RmnN0fyIKBCZoPCDzz//nIWN0AlDMPuP1l9s9lECXbD7z9M7zJiZHuw+DJb3tCaAAegp2v0bMWIE2zmhzETKkqISFcHWKBaKjtguXbrEftHRLtegQYNYGRRqvGgyESGxEDTZHKiNCKqnLE/a/SHCI2MTEQZjIehx48YFRCHo2Oyj0kREcijbkmKviAQSFuRTehnzRoH5dMRPREssBC328Zd/6ZjJU6MfIUTiqMnMn0gvkS1jIWg6SvVnM7OP4q/eeecdlvxBZJ980rhxY5YFLNZyDOQ1SrGyy5YtY89HIu4lS5ZkO0dE/oLdfzT/2OyLC/6TIYDB/B305/ff6r01AbSKmO6vEdAIaAQ0AhoBjYBGIMgR0AQwyB2op68R0AhoBDQCGgGNgEbAKgKaAFpFTPfXCGgENAIaAY2ARkAjEOQIaAIY5A7U09cIaAQ0AhoBjYBGQCNgFQFNAK0ipvtrBDQCGgGNgEZAI6ARCHIENAEMcgfq6WsENAIaAY2ARkAjoBGwioAmgFYR0/01AhoBjYBGQCOgEdAIBDkCmgAGuQP19DUCGgGNgEZAI6AR0AhYRUATQKuI6f4aAY1AnEGA1ExIC5iKW5cuXTrO2KUN0QhoBDQCZghoAmiGkP5cI6ARCEoEvKlicGNIvWXy5Mm4ePEik0WLHz9+UNqpJ60R0AhoBOwgoAmgHdT0GI2ARiDgETh37px7jqSx3bdvX6YzzRvp35KUmG4aAY2ARuBZREATwGfR69pmjcAzhgDpNHfq1IlpGIvNeATMtZAXLVqEHj16YN++fahcuTLmzJmDLVu2oEuXLjh9+jTTz6Xdw6RJk7LLkQb0yJEjMWHCBKZRW7BgQfTp0wfNmjV7xpDW5moENALBgoAmgMHiKT1PjYBGwDYCVglgpUqVMGrUKEbwmjdvjmzZsiFRokT4/PPPcevWLTRp0gRdu3ZF9+7d2Zw+++wzzJ07F19++SUKFCiA1atXo3379oiIiECNGjVsz1sP1AhoBDQCqhDQBFAVsvq6GgGNQMAgYJUALl26FHXq1GHzJ9LXs2dPHD58GHnz5mX/RuSOdg9pp/D27dsshnD58uVst5C31q1bIzIyErNmzQoYHPRENAIaAY0AR0ATQL0WNAIagTiPgFUCeOHCBWTIkIHhMmXKFHz00UeM6PHWr18/zJ8/H1u3bsWmTZtQoUIFJEuWLAaO9+/fR5kyZbBx48Y4j682UCOgEQg+BDQBDD6f6RlrBDQCFhGwSgCvXr2K1KlTs7t4Gtu/f3/8/vvv2L59OyN4dGRM8YN0VCw2OjbOkSOHxdnq7hoBjYBGQD0CmgCqx1jfQSOgEfAzAioJ4M2bN9lu4aRJk/Duu+/62VJ9e42ARkAjIIeAJoByOOleGgGNQBAjoJIAEiy9e/dmGcCjR49GtWrVcOPGDaxbtw7JkycH1RvUTSOgEdAIBBoCmgAGmkf0fDQCGgGfI6CaAFIZmLFjx2L8+PE4cuQIOz4uW7YsevXqhbCwMJ/boy+oEdAIaAScIqAJoFME9XiNgEZAI6AR0AhoBDQCQYaAJoBB5jA9XY2ARkAjoBHQCGgENAJOEdAE0CmCerxGQCOgEdAIaAQ0AhqBIENAE8Agc5ierkZAI6AR0AhoBDQCGgGnCGgC6BRBPV4joBHQCGgENAIaAY1AkCGgCWCQOUxPVyOgEdAIaAQ0AhoBjYBTBDQBdIqgHq8R0AhoBDQCGgGNgEYgyBDQBDDIHKanqxHQCGgENAIaAY2ARsApApoAOkVQj9cIaAQ0AhoBjYBGQCMQZAhoAhhkDtPT1QhoBDQCGgGNgEZAI+AUAU0AnSKox2sENAIaAY2ARkAjoBEIMgQ0AQwyh+npagQ0AhoBjYBGQCOgEXCKgCaAThHU4zUCGgGNgEZAI6AR0AgEGQL/B63JJ+La4UPuAAAAAElFTkSuQmCC\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(0)\n", + "plt.plot(Time, Usim)\n", + "plt.ylabel(\"Input GBN\")\n", + "plt.xlabel(\"Time\")\n", + "plt.title(\"Input, validation data (Switch probability=0.08)\")\n", + "plt.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<matplotlib.legend.Legend at 0x7fe775297390>" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(1)\n", + "plt.plot(Time, Ytot, label=\"Original system\")\n", + "plt.plot(Time, Y_idTot, label=\"Identified system\")\n", + "plt.grid()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"y_tot\")\n", + "plt.title(\"Gu+He (identification data)\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1, 'Gu (identification data)')" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(2)\n", + "plt.plot(Time, Y1, label=\"Original system\")\n", + "plt.plot(Time, Y_id1, label=\"Identified system\")\n", + "plt.ylabel(\"y_out\")\n", + "plt.grid()\n", + "plt.xlabel(\"Time\")\n", + "plt.legend()\n", + "plt.title(\"Gu (identification data)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1, 'He (identification data)')" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(3)\n", + "plt.plot(Time, Y2, label=\"Original system\")\n", + "plt.plot(Time, Y_hid1, label=\"Identified system\")\n", + "plt.ylabel(\"y_err\")\n", + "plt.grid()\n", + "plt.xlabel(\"Time\")\n", + "plt.legend()\n", + "plt.title(\"He (identification data)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Validation of the identified system: \n", + "## Generate new time series for input and noise" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "switch_probability = 0.07 # [0..1]\n", + "input_range = [0.5, 1.5]\n", + "U_valid = fset.GBN_seq(npts, switch_probability, input_range)\n", + "white_noise_variance = [0.01]\n", + "e_valid = fset.white_noise_var(U_valid.size, white_noise_variance)[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute time responses for true system with new inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "Yvalid1, Time, Xsim = cnt.lsim(g_sample, U_valid, Time)\n", + "Yvalid2, Time, Xsim = cnt.lsim(h_sample, e_valid, Time)\n", + "Ytotvalid = Yvalid1 + Yvalid2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compute time responses for identified system with new inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "Yidvalid1, Time, Xsim = cnt.lsim(Id_sys.G, U_valid, Time)\n", + "Yidvalid2, Time, Xsim = cnt.lsim(Id_sys.H, e_valid, Time)\n", + "Yidtotvalid = Yidvalid1 + Yidvalid2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check responses are almost equal" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(4)\n", + "plt.plot(Time, U_valid)\n", + "plt.ylabel(\"Input GBN\")\n", + "plt.xlabel(\"Time\")\n", + "plt.title(\"Input, validation data (Switch probability=0.07)\")\n", + "plt.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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3HPDlDOZo6ZEInc74h7DIP2jABShAMz9tyebNm1SS8xXrVole+65p8aVdjwViT979mzp2rVrbCcv07+8pkzoF2OOho48rx3GPX7OSwrvM3lNm1AvFmSOQgAWFhaqVez16tUL1S9TOqMA1IjETz/9pBKIjQRIgARIgARIwD4CGMBp3LixfYbnwWIKQA2I2ITz559/lj322CPve0w5bydBjC5quJy3U+lf3lBGdiHGMDL0eek47vEDpLj7SP9y/ylgj8iqqio58MADJY6bhHshQwHohVIEx8R9fgL9iyCp8twlY5hnoCFfLu7xcwQgynuYrpPvaTohhytld3GPYdz9izqHKACjjkCa/uOe+PTP0MTzYRZj6AOWgYfGPX4UgAYmnU+TakKO+kSS18MpAPOKM38Xi3vi07/85UpUV2IMoyKfn37jHj8KwPzkSZRXqQk5GiVfCsAo6Wfo+6+//pL7779fBg8eLLVr1zbUytzNon+5szPlTMbQlEjkZkfc4wcqcfeR/uWW+zzrHwIUgMwEEiABEiABEiABEqhhBCgAa1jA6S4JkAAJkAAJkAAJUAAyB0iABEiABEiABEighhGgAKxhAae7JEACJEACJEACJEAByBwgARIgARIgARIggRpGgALQwICPGzdORo0aJb/88oscffTRMmbMGDn55JMNtDSzScOHD5e77rqr2kH77befrF69Wv0ddmLHvz/55JOyceNGadeunTz22GPKZ1PbvHnzVGwWLVqk4vPqq6/K+eefnzDXi0/w9eabb5bXX39dnXfuuefK2LFj1Xelo27Z/Lviiivk2WefrWYm4vbxxx8n/g4rE2+//XaZOnWq/PHHH9KlSxdBTpvwuSWsrJ82bZosW7ZMdt99dznxxBPlgQcekMMPP9yX/T/++KPccMMNUlFRoa5z6aWXyujRo2XXXXeNNIRe/DvllFPkvffeq2bnRRddJOXl5Ym/MzlHH3/8ccF/33//vbIX94vS0lI588wz1Z+95J+p8YP92fyzPX7uHwhydsiQIXLLLbeoZ10cYhjpTcBH5xSAPmCFceiLL74ovXr1Ug/Mjh07yhNPPCETJ06Ur7/+Wg466KAwTMhbHxCAL7/8ssydOzdxzZ133lkaNGig/owH77333ivPPPOMNG/eXO655x6BAPnmm2/U5/VMbG+//bZ8+OGH0rp1a7nwwgt3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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Validation: Gu+He | RMSE = 0.29')" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(5)\n", + "plt.plot(Time, Ytotvalid)\n", + "plt.plot(Time, Yidtotvalid)\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"y_tot\")\n", + "plt.legend(['Original system', 'Identified system'])\n", + "plt.grid()\n", + "\n", + "rmse = np.round(np.sqrt(np.mean((Ytotvalid-Yidtotvalid)**2)), 2)\n", + "plt.title(\"Validation: Gu+He | RMSE = {}\".format(rmse))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "<matplotlib.legend.Legend at 0x7fe76d4fca10>" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(6)\n", + "plt.plot(Time, Yvalid1, label=\"Original system\")\n", + "plt.plot(Time, Yidvalid1, label=\"Identified system\")\n", + "plt.grid()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"y_out\")\n", + "plt.title(\"Gu (Validation)\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydBVxU2RfHfwOCiEoIigqY2IgiKmJ3YGCvnWuvf7sLxK5V13bt7sYObBQBG7sDRUFQJGf+n/dGWIEZmFfMDJz3+exnd+Hec8/5njNzf9x3330yhUKhAF1EgAgQASJABIgAESACWYaAjARglsk1BUoEiAARIAJEgAgQAZYACUAqBCJABIgAESACRIAIZDECJACzWMIpXCJABIgAESACRIAIkACkGiACRIAIEAEiQASIQBYjQAIwiyWcwiUCRIAIEAEiQASIAAlAqgEiQASIABEgAkSACGQxAiQAs1jCKVwiQASIABEgAkSACJAApBogAkSACBABIkAEiEAWI0ACMIslnMIlAkSACBABIkAEiAAJQKoBIkAEiAARIAJEgAhkMQIkALNYwilcIkAEiAARIAJEgAiQAKQaIAJEgAgQASJABIhAFiNAAjCLJZzCJQJEgAgQASJABIgACUCqASJABIgAESACRIAIZDECJACzWMIpXCJABIgAESACRIAIkACkGiACRIAIEAEiQASIQBYjQAIwiyWcwiUCRIAIEAEiQASIAAlAqgEiQASIABEgAkSACGQxAiQAs1jCKVwiQASIABEgAkSACJAApBogAkSACBABIkAEiEAWI0ACMIslnMIlAkSACBABIkAEiAAJQKoBIkAEiAARIAJEgAhkMQIkALNYwilcIkAEiAARIAJEgAiQAKQaIAJEgAgQASJABIhAFiNAAjCLJZzCJQJEgAgQASJABIgACUCqASJABIgAESACRIAIZDECJACzWMIpXCJABIgAESACRIAIkACkGiACRIAIEAEiQASIQBYjQAIwiyWcwiUCRIAIEAEiQASIAAlAqgEiQASIABEgAkSACGQxAiQAs1jCKVwiQASIABEgAkSACJAApBogAkSACBABIkAEiEAWI0ACMIslnMIlAkSACBABIkAEiAAJQKoBIkAEiAARIAJEgAhkMQIkALNYwilcIkAEiAARIAJEgAiQAKQaIAJEgAgQASJABIhAFiNAAjCLJZzCJQJEgAgQASJABIgACUCqASJABDQisHHjRvTu3Rs3b95E5cqVU/Vp0aIF7t27h5cvX2pkT9NG06dPx86dO1nbR44cQevWrbFy5UoMHDhQpYnTp0+jcePG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mt6j5TpyL9MxcHNprS6lt2FKx2fsHFIIoLFbIJn6U3riK/hMNPEEuKW0oYBgmaBoSm+//7d37jFV128cf0wXJf5RFqljVFJaWalQmVRKDruZXTBn1lJrkd3LMOMml8xrYOnwVlRkmdlMs6wEI6dmTMYgWjdzQpeNhVjRAi1dbb+9n9++Z4fT4Vw4wPl8Du/P5ibw/Z7zPK/n8/1+39/n+VwoAA3sdEGa1Bv6aJBIuvRwCsAuxdl1HxbpHZ/+dV1fCdcnMYbhIt813xvp8aMA7Jp+Es5P6Q19NJx8KQDDSd/Hdx8/flyWLFkiWVlZEhUVZaiVnTeL/nWenSlnMoamRKJzdkR6/EAl0n2kf53r+zzr/wQoANkTSIAESIAESIAESKCXEaAA7GUBp7skQAIkQAIkQAIkQAHIPkACJEACJEACJEACvYwABWAvCzjdJQESIAESIAESIAEKQPYBEiABEiABEiABEuhlBCgADQz4mjVrpLCwUH755Re5+OKLZcWKFTJu3DgDLfVtUkFBgTz77LPtDho0aJA0NTXp77ASO/7+8ssvS0tLi1x55ZWyevVq9dnUtnfvXo1NTU2Nxue9996T22+/3WVuID7B1yeeeEI++OADPe/WW2+V4uJi3Vc63M2ff/fee6+sX7++nZmI2/79+12/w8zEp59+Wt5++23566+/JCUlRdCnTdhuCTPrt27dKgcOHJBTTz1VrrrqKlm2bJlccMEFQdn/888/y6OPPiq7du3Sz7n77rulqKhITj755LCGMBD/rr32WtmzZ087O++8807ZtGmT63cm99G1a9cK/v34449qL+4XeXl5ctNNN+nPgfQ/U+MH+/35Z3v8PC8Q9Nns7Gx58skn9VkXCTEM600giC+nAAwCVk8c+s4778iMGTP0gXn11VfLSy+9JK+88op8++23cvbZZ/eECV32HRCA7777rlRUVLg+s2/fvhITE6M/48G7aNEief3112X48OGycOFCgQD5/vvvdXs9E9uOHTvk888/l8TERLnjjjv+IwAD8QkPKuwjDeGLNnv2bDn33HNl+/btYXfZn38QgIcPH5bS0lKXrRA9AwcOdP388MMPqy+I6xlnnCFz586V33//XUUz4h/OduONN8r06dPliiuukH/++UdycnLkq6++0usrOjpaTfNn/7///iujR4/Wfrx8+XL57bffZNas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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "<matplotlib.legend.Legend at 0x7fe76d549510>" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(7)\n", + "plt.plot(Time, Yvalid2, label=\"Original system\")\n", + "plt.plot(Time, Yidvalid2, label=\"Identified system\")\n", + "plt.grid()\n", + "plt.xlabel(\"Time\")\n", + "plt.ylabel(\"y_err\")\n", + "plt.title(\"He (Validation)\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original h()\n" + ] + }, + { + "data": { + "text/latex": [ + "$$\\frac{z^14 + 0.3 z^13}{z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10}\\quad dt = 1.0$$" + ], + "text/plain": [ + "\n", + " z^14 + 0.3 z^13\n", + "---------------------------------------------------------\n", + "z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10\n", + "\n", + "dt = 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Identified h()\n" + ] + }, + { + "data": { + "text/latex": [ + "$$\\frac{z^14 + 0.3018 z^13 - 0.02355 z^12}{z^14 - 2.215 z^13 + 1.763 z^12 - 0.5889 z^11 + 0.06359 z^10}\\quad dt = 1.0$$" + ], + "text/plain": [ + "\n", + " z^14 + 0.3018 z^13 - 0.02355 z^12\n", + "-----------------------------------------------------------\n", + "z^14 - 2.215 z^13 + 1.763 z^12 - 0.5889 z^11 + 0.06359 z^10\n", + "\n", + "dt = 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,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\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Original h()\")\n", + "display(h_sample)\n", + "print(\"Identified h()\")\n", + "display(Id_sys.H)\n", + "\n", + "plt.figure()\n", + "_ = cnt.bode([h_sample, Id_sys.H])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original g()\n" + ] + }, + { + "data": { + "text/latex": [ + "$$\\frac{z^2 - 2.07 z + 1.315}{z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10}\\quad dt = 1.0$$" + ], + "text/plain": [ + "\n", + " z^2 - 2.07 z + 1.315\n", + "---------------------------------------------------------\n", + "z^14 - 2.21 z^13 + 1.749 z^12 - 0.5843 z^11 + 0.0684 z^10\n", + "\n", + "dt = 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Identified g()\n" + ] + }, + { + "data": { + "text/latex": [ + "$$\\frac{0.00527 z^3 + 1.001 z^2 - 2.078 z + 1.321}{z^14 - 2.215 z^13 + 1.763 z^12 - 0.5889 z^11 + 0.06359 z^10}\\quad dt = 1.0$$" + ], + "text/plain": [ + "\n", + " 0.00527 z^3 + 1.001 z^2 - 2.078 z + 1.321\n", + "-----------------------------------------------------------\n", + "z^14 - 2.215 z^13 + 1.763 z^12 - 0.5889 z^11 + 0.06359 z^10\n", + "\n", + "dt = 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support. ' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('<div/>');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", + " 'ui-helper-clearfix\"/>');\n", + " var titletext = $(\n", + " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", + " 'text-align: center; padding: 3px;\"/>');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('<div/>');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('<canvas/>');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('<canvas/>');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('<button/>');\n", + " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", + " 'ui-button-icon-only');\n", + " button.attr('role', 'button');\n", + " button.attr('aria-disabled', 'false');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + "\n", + " var icon_img = $('<span/>');\n", + " icon_img.addClass('ui-button-icon-primary ui-icon');\n", + " icon_img.addClass(image);\n", + " icon_img.addClass('ui-corner-all');\n", + "\n", + " var tooltip_span = $('<span/>');\n", + " tooltip_span.addClass('ui-button-text');\n", + " tooltip_span.html(tooltip);\n", + "\n", + " button.append(icon_img);\n", + " button.append(tooltip_span);\n", + "\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " var fmt_picker_span = $('<span/>');\n", + "\n", + " var fmt_picker = $('<select/>');\n", + " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", + " fmt_picker_span.append(fmt_picker);\n", + " nav_element.append(fmt_picker_span);\n", + " this.format_dropdown = fmt_picker[0];\n", + "\n", + " for (var ind in mpl.extensions) {\n", + " var fmt = mpl.extensions[ind];\n", + " var option = $(\n", + " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", + " fmt_picker.append(option);\n", + " }\n", + "\n", + " // Add hover states to the ui-buttons\n", + " $( \".ui-button\" ).hover(\n", + " function() { $(this).addClass(\"ui-state-hover\");},\n", + " function() { $(this).removeClass(\"ui-state-hover\");}\n", + " );\n", + "\n", + " var status_bar = $('<span class=\"mpl-message\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "}\n", + "\n", + "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", + " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", + " // which will in turn request a refresh of the image.\n", + " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", + "}\n", + "\n", + "mpl.figure.prototype.send_message = function(type, properties) {\n", + " properties['type'] = type;\n", + " properties['figure_id'] = this.id;\n", + " this.ws.send(JSON.stringify(properties));\n", + "}\n", + "\n", + "mpl.figure.prototype.send_draw_message = function() {\n", + " if (!this.waiting) {\n", + " this.waiting = true;\n", + " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", + " }\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " var format_dropdown = fig.format_dropdown;\n", + " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", + " fig.ondownload(fig, format);\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", + " var size = msg['size'];\n", + " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", + " fig._resize_canvas(size[0], size[1]);\n", + " fig.send_message(\"refresh\", {});\n", + " };\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", + " var x0 = msg['x0'] / mpl.ratio;\n", + " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", + " var x1 = msg['x1'] / mpl.ratio;\n", + " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", + " x0 = Math.floor(x0) + 0.5;\n", + " y0 = Math.floor(y0) + 0.5;\n", + " x1 = Math.floor(x1) + 0.5;\n", + " y1 = Math.floor(y1) + 0.5;\n", + " var min_x = Math.min(x0, x1);\n", + " var min_y = Math.min(y0, y1);\n", + " var width = Math.abs(x1 - x0);\n", + " var height = Math.abs(y1 - y0);\n", + "\n", + " fig.rubberband_context.clearRect(\n", + " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", + "\n", + " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", + " // Updates the figure title.\n", + " fig.header.textContent = msg['label'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", + " var cursor = msg['cursor'];\n", + " switch(cursor)\n", + " {\n", + " case 0:\n", + " cursor = 'pointer';\n", + " break;\n", + " case 1:\n", + " cursor = 'default';\n", + " break;\n", + " case 2:\n", + " cursor = 'crosshair';\n", + " break;\n", + " case 3:\n", + " cursor = 'move';\n", + " break;\n", + " }\n", + " fig.rubberband_canvas.style.cursor = cursor;\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_message = function(fig, msg) {\n", + " fig.message.textContent = msg['message'];\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", + " // Request the server to send over a new figure.\n", + " fig.send_draw_message();\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", + " fig.image_mode = msg['mode'];\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Called whenever the canvas gets updated.\n", + " this.send_message(\"ack\", {});\n", + "}\n", + "\n", + "// A function to construct a web socket function for onmessage handling.\n", + "// Called in the figure constructor.\n", + "mpl.figure.prototype._make_on_message_function = function(fig) {\n", + " return function socket_on_message(evt) {\n", + " if (evt.data instanceof Blob) {\n", + " /* FIXME: We get \"Resource interpreted as Image but\n", + " * transferred with MIME type text/plain:\" errors on\n", + " * Chrome. But how to set the MIME type? It doesn't seem\n", + " * to be part of the websocket stream */\n", + " evt.data.type = \"image/png\";\n", + "\n", + " /* Free the memory for the previous frames */\n", + " if (fig.imageObj.src) {\n", + " (window.URL || window.webkitURL).revokeObjectURL(\n", + " fig.imageObj.src);\n", + " }\n", + "\n", + " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", + " evt.data);\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", + " fig.imageObj.src = evt.data;\n", + " fig.updated_canvas_event();\n", + " fig.waiting = false;\n", + " return;\n", + " }\n", + "\n", + " var msg = JSON.parse(evt.data);\n", + " var msg_type = msg['type'];\n", + "\n", + " // Call the \"handle_{type}\" callback, which takes\n", + " // the figure and JSON message as its only arguments.\n", + " try {\n", + " var callback = fig[\"handle_\" + msg_type];\n", + " } catch (e) {\n", + " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", + " return;\n", + " }\n", + "\n", + " if (callback) {\n", + " try {\n", + " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", + " callback(fig, msg);\n", + " } catch (e) {\n", + " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", + " }\n", + " }\n", + " };\n", + "}\n", + "\n", + "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", + "mpl.findpos = function(e) {\n", + " //this section is from http://www.quirksmode.org/js/events_properties.html\n", + " var targ;\n", + " if (!e)\n", + " e = window.event;\n", + " if (e.target)\n", + " targ = e.target;\n", + " else if (e.srcElement)\n", + " targ = e.srcElement;\n", + " if (targ.nodeType == 3) // defeat Safari bug\n", + " targ = targ.parentNode;\n", + "\n", + " // jQuery normalizes the pageX and pageY\n", + " // pageX,Y are the mouse positions relative to the document\n", + " // offset() returns the position of the element relative to the document\n", + " var x = e.pageX - $(targ).offset().left;\n", + " var y = e.pageY - $(targ).offset().top;\n", + "\n", + " return {\"x\": x, \"y\": y};\n", + "};\n", + "\n", + "/*\n", + " * return a copy of an object with only non-object keys\n", + " * we need this to avoid circular references\n", + " * http://stackoverflow.com/a/24161582/3208463\n", + " */\n", + "function simpleKeys (original) {\n", + " return Object.keys(original).reduce(function (obj, key) {\n", + " if (typeof original[key] !== 'object')\n", + " obj[key] = original[key]\n", + " return obj;\n", + " }, {});\n", + "}\n", + "\n", + "mpl.figure.prototype.mouse_event = function(event, name) {\n", + " var canvas_pos = mpl.findpos(event)\n", + "\n", + " if (name === 'button_press')\n", + " {\n", + " this.canvas.focus();\n", + " this.canvas_div.focus();\n", + " }\n", + "\n", + " var x = canvas_pos.x * mpl.ratio;\n", + " var y = canvas_pos.y * mpl.ratio;\n", + "\n", + " this.send_message(name, {x: x, y: y, button: event.button,\n", + " step: event.step,\n", + " guiEvent: simpleKeys(event)});\n", + "\n", + " /* This prevents the web browser from automatically changing to\n", + " * the text insertion cursor when the button is pressed. We want\n", + " * to control all of the cursor setting manually through the\n", + " * 'cursor' event from matplotlib */\n", + " event.preventDefault();\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " // Handle any extra behaviour associated with a key event\n", + "}\n", + "\n", + "mpl.figure.prototype.key_event = function(event, name) {\n", + "\n", + " // Prevent repeat events\n", + " if (name == 'key_press')\n", + " {\n", + " if (event.which === this._key)\n", + " return;\n", + " else\n", + " this._key = event.which;\n", + " }\n", + " if (name == 'key_release')\n", + " this._key = null;\n", + "\n", + " var value = '';\n", + " if (event.ctrlKey && event.which != 17)\n", + " value += \"ctrl+\";\n", + " if (event.altKey && event.which != 18)\n", + " value += \"alt+\";\n", + " if (event.shiftKey && event.which != 16)\n", + " value += \"shift+\";\n", + "\n", + " value += 'k';\n", + " value += event.which.toString();\n", + "\n", + " this._key_event_extra(event, name);\n", + "\n", + " this.send_message(name, {key: value,\n", + " guiEvent: simpleKeys(event)});\n", + " return false;\n", + "}\n", + "\n", + "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", + " if (name == 'download') {\n", + " this.handle_save(this, null);\n", + " } else {\n", + " this.send_message(\"toolbar_button\", {name: name});\n", + " }\n", + "};\n", + "\n", + "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", + " this.message.textContent = tooltip;\n", + "};\n", + "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", + "\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "\n", + "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", + " // Create a \"websocket\"-like object which calls the given IPython comm\n", + " // object with the appropriate methods. Currently this is a non binary\n", + " // socket, so there is still some room for performance tuning.\n", + " var ws = {};\n", + "\n", + " ws.close = function() {\n", + " comm.close()\n", + " };\n", + " ws.send = function(m) {\n", + " //console.log('sending', m);\n", + " comm.send(m);\n", + " };\n", + " // Register the callback with on_msg.\n", + " comm.on_msg(function(msg) {\n", + " //console.log('receiving', msg['content']['data'], msg);\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", + " ws.onmessage(msg['content']['data'])\n", + " });\n", + " return ws;\n", + "}\n", + "\n", + "mpl.mpl_figure_comm = function(comm, msg) {\n", + " // This is the function which gets called when the mpl process\n", + " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", + "\n", + " var id = msg.content.data.id;\n", + " // Get hold of the div created by the display call when the Comm\n", + " // socket was opened in Python.\n", + " var element = $(\"#\" + id);\n", + " var ws_proxy = comm_websocket_adapter(comm)\n", + "\n", + " function ondownload(figure, format) {\n", + " window.open(figure.imageObj.src);\n", + " }\n", + "\n", + " var fig = new mpl.figure(id, ws_proxy,\n", + " ondownload,\n", + " element.get(0));\n", + "\n", + " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", + " // web socket which is closed, not our websocket->open comm proxy.\n", + " ws_proxy.onopen();\n", + "\n", + " fig.parent_element = element.get(0);\n", + " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", + " if (!fig.cell_info) {\n", + " console.error(\"Failed to find cell for figure\", id, fig);\n", + " return;\n", + " }\n", + "\n", + " var output_index = fig.cell_info[2]\n", + " var cell = fig.cell_info[0];\n", + "\n", + "};\n", + "\n", + "mpl.figure.prototype.handle_close = function(fig, msg) {\n", + " var width = fig.canvas.width/mpl.ratio\n", + " fig.root.unbind('remove')\n", + "\n", + " // Update the output cell to use the data from the current canvas.\n", + " fig.push_to_output();\n", + " var dataURL = fig.canvas.toDataURL();\n", + " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", + " // the notebook keyboard shortcuts fail.\n", + " IPython.keyboard_manager.enable()\n", + " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", + " fig.close_ws(fig, msg);\n", + "}\n", + "\n", + "mpl.figure.prototype.close_ws = function(fig, msg){\n", + " fig.send_message('closing', msg);\n", + " // fig.ws.close()\n", + "}\n", + "\n", + "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", + " // Turn the data on the canvas into data in the output cell.\n", + " var width = this.canvas.width/mpl.ratio\n", + " var dataURL = this.canvas.toDataURL();\n", + " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", + "}\n", + "\n", + "mpl.figure.prototype.updated_canvas_event = function() {\n", + " // Tell IPython that the notebook contents must change.\n", + " IPython.notebook.set_dirty(true);\n", + " this.send_message(\"ack\", {});\n", + " var fig = this;\n", + " // Wait a second, then push the new image to the DOM so\n", + " // that it is saved nicely (might be nice to debounce this).\n", + " setTimeout(function () { fig.push_to_output() }, 1000);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('<div/>');\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items){\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) { continue; };\n", + "\n", + " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", + " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i<ncells; i++) {\n", + " var cell = cells[i];\n", + " if (cell.cell_type === 'code'){\n", + " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", + " var data = cell.output_area.outputs[j];\n", + " if (data.data) {\n", + " // IPython >= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuxdB3hUVdp+p6RCEiABpDfpHWmCqMgPYqOIootiQ3St6Cq6thVsrOKKuhZAV0Rd7IKKoOIiIEWkIyBNpCaUEAikZ2bu/5w7JCaknHPPuWfukPnu88yTMu/3fvd7zzcnb24512UYhgHaSAFSgBQgBUgBUoAUIAUiRgEXGcCIGWsqlBQgBUgBUoAUIAVIAVMBMoDUCKQAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZwAgbcCqXFCAFSAFSgBQgBUgBMoDUA6QAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZwAgbcCqXFCAFSAFSgBQgBUgBMoDUA6QAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZwAgbcCqXFCAFSAFSgBQgBUgBMoDUA6QAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZwAgbcCqXFCAFSAFSgBQgBUgBMoDUA6QAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZwAgbcCqXFCAFSAFSgBQgBUgBMoDUA6QAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZwAgbcCqXFCAFSAFSgBQgBUgBMoDUA6QAKUAKkAKkAClACkSYAmQAI2zAqVxSgBQgBUgBUoAUIAXIAFIPkAKkAClACpACpAApEGEKkAGMsAGnckkBUoAUIAVIAVKAFCADSD1ACpACpAApQAqQAqRAhClABjDCBpzKJQVIAVKAFCAFSAFSgAwg9QApQAqQAqQAKUAKkAIRpgAZQIUBDwQCSE1NRUJCAlwulwIThZICpAApQAqQAqRAqBQwDAMnT55E/fr14Xa7Q5U2rPKQAVQYjv3796NRo0YKDBRKCpACpAApQAqQAk4psG/fPjRs2NCp9I7mJQOoIH9mZiZq1KgB1kCJiYnFTIWFhfj+++8xaNAgREVFlZuBh+G9r7DbIQ11og4dOVU5ZeOtxIlg7cCIcIS0ySSTOVGHjpyqnLLxVuJEsHZgRDgk2yWkYU7UoSOnCmdOVibi/93e1D3zrxuQVDNZeAxE8p44ccI8gHP8+HEkJSUJc1clIBlAhdFkDcQahxnB0w3gvHnzcOmll1ZqACvDsAbmcSjseshCnahDR05VTtl4K3EiWDswIhwhazCFRE7UoSOnKqdsvJU4EawdGBEOhZYJWagTdejIqcJpGsAXGwcN4LjfkVQzRVh/kbwV/f0WTlIFgGQAFQaRDCBfPJEPIp/FGkJHTlVO2XgrcSJYOzAiHNZGzBm0E3XoyKnKKRtvJU4EawdGhMOZbrOW1Yk6dORU4SQDaK1nZNBkAGVUOxVDBpAvnsoEwGcvH6EjpyqnbLyVOBGsHRgRDtmxC2WcE3XoyKnKKRtvJU4EawdGhCOUPSaby4k6dORU4SQDKNs94nFkAMW1KoMkA8gXT2UC4LOTASypgIjWdmBEOGTHLpRxTtShI6cqp2y8lTgRrB0YEY5Q9phsLifq0JFThZMMoGz3iMeRARTXKnQGcPU7MFa9g8wTmUhKTIKr+Bb1U0vNmEvOVPQ9200XUIQpXp6mvN8x6CmuMl/d5b/nOnW7fDGe4YpeLEfpnwMBA3v3H0Cjxk3g8XiDnCbGE/zKaiv62X3qdxW+5wEYxnx5gy+GLf45+HtfAPhl9Rr07H0uvFGxgCcqiPVEl/2e/c58Lyr4PuMqZ1OZyBidbLyVOBGsHRgRDoWPVchCnahDR05VTtl4K3EiWDswIhwhazCFRE7UoSOnCicZQIUGEgytsgZw0qRJ+OKLL7B161bExcWhT58+eP7559G6detiafLz8/Hggw/iww8/RG5uLgYMGIA33nhD+JZwbUcAf5wELP6n4BASzF4FXKfMYAzg/fNleGJwPDsPScl14TZ/H3vqffY1+tTPsUBUHBAVD0RXC75Ofe9zR2PZL+vR58KBiIpPBKJOvc+4KllD0soEKoK1AyPCYe+Y6GFzog4dOVU5ZeOtxIlg7cCIcOjpJntZnahDR04VTjKA9vZUeWxV1gAOHjwY1157LXr06AGfz4fHHnsMv/76K7Zs2YJq1aqZWtxxxx34+uuv8e677yI5ORkPPPAAMjIysGbNGng85R8JKimiLgP4zlf/w6KfVxYd44MLRvCgHgwULVdZtOy0m71nHvMrwsDEuFxGcTzDsPdZjLvowCHjMr8PcgbxRd8zjkAQXxwX/Lnod+5T/Owrw7CXxxUIcpncRb8PoLAgH3ExUeZ7jJflZV897GXigl/Zz0Eu9l7wq8lrfg3i3a4AvPAHY+GH2wh+Nb8v/p0f/vw8xEZ7gu8ZvuKX2/CBvTyBQvOrqZuTGzv6GV0diE0q9+WPqo4tf6Sibdfe8FarFcTEJAa/xtcKfn/KQIpMtnZgRDiclFQ0txN16MipyikbbyVOBGsHRoRDtD+cxDlRh46cKpxkAPV3YJU1gKdLd+TIEdSpUweLFy/G+eefby7dUrt2bbz//vu45pprTDh7qgdbF4gtv3LxxRdz1ddlAKcs2I5X/reDm58A6gow0xgFX/GLmcto9rPLZ36NQSFiUIBoV9H3p/9cgBiGcxUizlWA6u5CVHcXoJor33zFsxfyEYc8RPlzEO8qQIyRjyijQH3nGYMnBqheB6iWgkB8CvZl5KNhm67wJJx16ve1gWq1g9/H1UKh389dXog3afPet6cw/SxO1KEjpyqnbLyVOBGsHRgRDv2dpZ7BiTp05FThJAOo3kc8hogxgDt37kTLli3No4AdOnTAwoULzVO+7IhfzZo1i3Xq3Lkzhg0bhokTJ5bRjp0yZq+irWghyfT09DLrAC5YsAADBw6sdB3AijA5BT6czMnHosWLccEFF8Dr9ZopjVMHq4qOWbFH2RRtf/7uz91m75f8fdFPLKw40vzeMLlL/r44tuT7p/ahCF+0T4FTedhXRlzyZ1+hD6tWr0G3c84xj6oGzDzBPWE4fyCYm31f9B77WvpnhgvG+RkuwL7CjC3iKPod+1ro82Hnrj/QpElTGC4XfAwfMMyvPj/7PlD8/Z/vBX9n4vwGCgMBFPoMFPoDKGAvXwDZuXlweaLM3xX6g3yyGzsyGTSG+ajuykUCcpDoykGi+TW7zM/s90muHNRwBzEJyEIsrJlIgx1tjE/BcaM6Ehp1gKtWEyCpEYykxjBqNDa/Z6ew2aRdWf/y3pfVJNRxTtShI6cqp2y8lTgRrB0YEY5Q95lMPifq0JFThZMZwKRXWpjypd+1HUk1aglLKZKX/f1OSUkps46vcJIqAIwIA8iMw9ChQ3Hs2DH89NNP5rDNmjULN998cylDx37Pnt7RrFkzTJs2rczwTpgwoVxjyLji4+OrQDtQCVYUYP4vaEQBnwHz5pPCMi8XCsr5ffB3LhPPvs/3A3l+9tVV4vvg7wuN8p8zHYt8pLhOIAWZSHEFX8k4YX6tXeJ79nNNV5ZQaXneJOREp5ivXPY1prb5fXZ0bWTH1A3esEMbKUAKkAKaFfAV5mPEprFmls87vAVvVIytGXNycjBq1CgygLaqGoZkd911F7755hssXbq0+AaPigwgO2rXokULTJ06tUwloToCyBKL/AcThlKX2SUn6tCRU5VTNp7FffvdAvQ+/0IUBFzIzvchO9+PrAIfTuT6cDynAMdyCpGZW4iM7Hzs3JsGb7UayMz1mb/LzCs0j7B64UMtnEQd1zE0cB1FQ9eRU6/04u8TXLmVtlTAEwMjpTWM2m2wNcONs/sOgadeR6D6WZXeyBKufSo7Jir16MipyikbbyVOBGsHRoRDZfxCFetEHTpyqnDSEUD93VbljwDec889mDNnDpYsWWIe2SvaZE4Bnz4cuq4BLDKA9Cg4uQ+AynUnFWVU5ZSNtxJXHpad0j6RW4hjp4zikRM5WLhiDWo3bokjWQU4eCIfhzLzcDAzF0becTRy/WkIgyYx+HNT10HzGsfytsLoGvCntEF0g45w120H1GGvtsEbVcJ4s6KtXWXoyKnKKRtvJU4EawdGhMOusdTJ40QdOnKqcNI1gDo7LMhdZQ0gO+3LzN/s2bOxaNEi8/q/klvRTSAffPABRo4cab6VlpZmHiF0+iYQMoBqja8y6VQ1A3h6PZVpk1vgx6ETedifkYXvlqxEvRZtcCSr0PzdgYxsFKb/gUaFf6CVax9au/ehjWufaQy9rkC5smXH1YOvbmdUa3k+vM36Amd1rHCdRbURl4vW0Se8PdGRU5VTNt5KnAjWDowIB2+MwuF9J+rQkVOFkwyg/k6ssgbwzjvvNK/z+/LLL0ut/ZeUlGSuC8g2tgzM3LlzzWVgatWqZa4JePToUceXgSEDqNb4KpNOJBvAotor0o/9U3U0uwA7Dmbiy4U/I6F+CxxIz0TgyDYkZG5HC+xDa9de0xzWd2WUkTLPHY/jyV0R1awvara9EO6G5wBsoW6HNh19witFR05VTtl4K3EiWDswIhy8MQqH952oQ0dOFU4ygPo7scoaQFcFi+vOmDEDN910k6lsXl4exo8fbxrFkgtBs6VgRDY6BcxXSWUC4LOXj9CRU5VTNt5KnAjWDkx5HOxUc+rxXOxKz8YfR7KQdvAgfAc3IyF9LTr5NqO7e7t5l3PJrRBROJjQHvn1e6Fm2wtQq815cIXwtLGIFrI9qOsfifJ4VeuQjbcSJ4K1AyPCYfeY6uBzog4dOVU4yQDq6KzSnFXWAOqXDiADyFdZZQLgs5MBLGWoCguV1/hjfLwx471fcp/YUcN9GblYv+8oDm1fA/e+FaifuR7dXb+ZdyqX3NhS3vuiW+BYSndU73Q5mne/GB5vlGwbcOOs1MElEwToyKnKKRtvJU4EawdGhENwqByFOVGHjpwqnGQA9bcgGUAFjckA8sVTmQD47GQAw90AljdCPn8AOw6dxK7tG5G3cymSDq9Cy/xf0cR1uBT8GBKwLakfjLZXoG2fK1AjMUG2JcqNo94MyiKrg5U4EawdGBEOW5tIE5kTdejIqcJJBlBTc5WgJQOooDEZQL54KhMAn50M4JloAMsbtbxCP7bv2I6jWxYhZu9itM1cipquk8XQk0Yc1sb1RnaLS9G01xC0bVQXFV3mIdo31JtkAEV7JdQ46k2ADKD+riMDqKAxGUC+eDSR0R9ZfpeURRQWFmDnL98hZ8NsND3yI5KNP28qyTFisMLdDYcaDELtc65A77ZNkRBr/VQx9Sb1pkxvhiKGepMMYCj6jAyggspkAPni0URGf2T5XcJBBAI4svUnpP/yKers+w7J/j9PFecbUVhmdMS2Wv1RvfNQXNazLWpVixZKSb1JvSnUKA6AqDfJAIai7cgAKqhMBpAvHk1k9EeW3yUWEIaB/L1rcHjlJ4j/fR6S8/cVBzMz+LXRBzuaXo/zz78I5zZPhttd/mP0WBD1JvWmhc4LKZR6kwxgKBqODKCCymQA+eLRREZ/ZPldIolgz7g7vAXH1nwOY/OXqJW9s5hoZaANvokbgnq9RmBEj6aok1B2vUHqTepNyc7THka9SQZQe5NV5SeBhEI8MoB8lWkioz+y/C6xAcHM4P5VOL7o30j4/Rt44DdJU41a+K9/ENLOHokh53ZEv5a14Tl1VJB6k3rThs7TQkG9SQZQS2OdRkpHABVUJgPIF48mMvojy+8SmxEnUlG48m34V81AbEHw5pE8Iwpf+vtifvwQdO15Pkb2aIiUeC933USb90zLaWfVz5hsvJU4EawdGBEOu8dUB58TdejIqcJJdwHr6KzSnGQAFTQmA8gXT2UC4LOXj9CRU5VTNt5KnAjWDowIh+zY2RpXmAdsno28pa8jNv3XYmp2enimfzDyW1yMZq50PPCXixEXG2Nr6orIdGinyikbbyVOBGsHRoQjJAOtmMSJOnTkVOEkA6jYRALhZAAFRKoIQgaQL57KBMBnJwNYUgERre3AiHDIjp2WOHZ6eN8v8P/8Jly/fQW3ETw9fMBIxge+gfgp8TLcPrg7LutYr9KbRuzYNx3aqXLKxluJE8HagRHhsGMcdXM4UYeOnCqcZAB1dxlABlBBYzKAfPFUJgA+OxlAMoAWuyTzALD6HfhXz4An96gZnGnE41XfcKyucxX+dklHnN8yRXmRaToCWFoBkXnADowIh8WOcQTuRB06cqpwkgHU33pkABU0JgPIF09lAuCzkwEkAyjZJYV58G38FFkL/okaeftNkj2BOvin7y841mQwHrqkLbo1rilJXnGYjs+DKqdsvJU4EawdGBEO2wdVA6ETdejIqcJJBlBDY51GSQZQQWMygHzxVCYAPjsZQDKAsl1yah3Ab+bisgbH4V70HNzZwQWmVwVa4dnC61GnbV+Mv7g1Wta17xnEOj4Pqpyy8VbiRLB2YEQ45DsmdJFO1KEjpwonGUD9/RZ2BnDfvn3YvXs3cnJyULt2bbRv3x4xMaG5QNuq3GQA+YqpTAB8djKAZABlu+S0haAD+cDyVxFY9ircvlyT9Cv/uZjsuxa9u3XFfQNboUGNOPlkpyJ1fB5UOWXjrcSJYO3AiHAoD2IICJyoQ0dOFU4ygPobLSwM4J49ezB16lR8+OGHYAbQYBdtn9qio6PRr18/3HbbbRgxYgTcbrd+VQQzkAHkC6UyAfDZyQCSAZTtkgqeBHIiFVj4DIz1s+CCAfZ0kRn+wZhuDMfwc9vizgtbILm6/D+kOj4Pqpyy8VbiRLB2YEQ45DsmdJFO1KEjpwonGUD9/ea4ARw3bhxmzJiBQYMGYciQIejZsycaNGiAuLg4ZGRkYNOmTfjpp59Mc+j1ek1sjx499CsjkIEMIF8klQmAz04GkAygbJdwHgWXthH4/jHgjyVmgqNGAl72jcDX3kG4uV8rjOnXDNVjvJaT6/g8qHLKxluJE8HagRHhsDxoDgQ4UYeOnCqcZAD1N57jBnD8+PF46KGHzNO9vG3evHnmqeGrrrqKBw3J+2QA+TKrTAB8djKAZABlu0TgWcDsTMT272AseAKu9O1mot8D9fCcbxTWx/bGU8M64rJO9SztgI7PgyqnbLyVOBGsHRgRDksD5hDYiTp05FThJAOov/kcN4D6S9SXgQwgX1uVCYDPTgaQDKBslwgYwCJqfyGwdiaMHyfBlZNu/na5vx0e9Y1Bt67dMXFIeyTERgntiI7PgyqnbLyVOBGsHRgRDqGBchjkRB06cqpwkgHU34RhbQALCgrAXtWrV9evhEQGMoB80VQmAD47GUAygLJdYsEAFqXIywSWToGx4g24/PnINmIwwXcjViQMxpRru6JH01rcndHxeVDllI23EieCtQMjwsEdpDAAOFGHjpwqnGQA9Tdi2BhAdm3f2rVr0bt3b1x33XV45JFH8NJLL8Hn8+Giiy7CRx99hOTkZP2KWMhABpAvlsoEwGcnA0gGULZLJAxgUapje4Av7wJ2/2T+Zq6/Fx73jcF1F3bGuAGtEO2t+EY1HZ8HVU7ZeCtxIlg7MCIc8h0Tukgn6tCRU4WTDKD+fgsLA/jss8+Cvfr06YN169Zh5MiRmDNnDu677z7zrt9XX30Vl19+Od588039iljIQAaQL5bKBMBnJwNIBlC2SxQMIEsZ8JvLxhgLn4Er4DMfK3d/wZ3Ird8bU67pgrPrlH/WQsfnQZVTNt5KnAjWDowIh3zHhC7SiTp05FThJAOov9/CwgC2bNkSTz31FP7yl79g9erV6NWrFz7++OPimz3mz5+Pv/71r2DLxYTTRgaQPxoqEwCfnQwgGUDZLlE0gEVpD6wBPr8VyNiFAFx43TcU01xX4eHLOuH6Xo3LPFJOx+dBlVM23kqcCNYOjAiHfMeELtKJOnTkVOEkA6i/38LCALKFnnfu3IlGjRqZFbOfN27ciNatW5s/HzhwAM2aNTOvBxTdlixZgsmTJ2PNmjVIS0vD7NmzMWzYsOLwm266CTNnzixFx4znzz//LJoCZAD5UqlMAHx2MoBkAGW7xCYDyNLnZwHfPgys+8DcmXWBszGu8C6c3bojnh/RCbUT/lw3UMfnQZVTNt5KnAjWDowIh3zHhC7SiTp05FThJAOov9/CwgCy07wHDx5EnTp1zIoTEhKwYcMGNG/e3Pz50KFDqF+/Pvx+v7Ai7KjhsmXL0K1bN3MB6fIMIONl1x4WbWzR6Vq1+BdyF+HJAPKHQ2UC4LOTASQDKNslNhrAol3YPBvG1+PgystElhGLfxTehMWxA/D8VZ3xf+3qmigdnwdVTtl4K3EiWDswIhzyHRO6SCfq0JFThZMMoP5+CxsDuHDhwmLzxa4F/OSTT9CwYUNTgfT0dAwcONCSASwpncvlKtcAHj9+3LzWUHYjA8hXTmUC4LOTASQDKNsleswYju8DZt8O7Flm7hh7nNzjhbfg8l5t8fhlbRHlMsDWM7300ksRFSW2dAyvQtXPmGy8lTgRrB0YEQ6enuHwvhN16MipwkkGUH8nho0BZCat5CPgikov+j37auUIoIgBZOaPHfWrUaMGLrjgAvNGlKKjkCLSkwHkq6QyAfDZyQCSAZTtEk0GkO0Ou0Fk6UvBdQMNP/YbKbiv4E4cTT4HL47ogP0bl5EBLGfYROYKHob3vny3hDbSiTp05FThJAOov+fCwgCK3tzRpEkTKUXKOwLIbjJh6wsyzj/++ANPPPGEueQMu2aQXYNY3pafnw/2KtqYAWTXLbIjlImJicW/Z02/YMEC86hlRf/l8zC896WEcCDIiTp05FTllI23EieCtQMjwuFAq1lOqbsO14HV8Mz5K1zHd8MPN17zDcObxpUY1cLAg9f+n61HAHnzTWXiyOpgJU4EawdGhMNyozgQ4EQdOnKqcDIDmPRKC1P99Lu2I6mG+OVZInnZ3++UlBRkZmaW+vvtwHA7ljIsDKDu6sszgKfnZDeKMDPI1hu88sory92lCRMmYOLEiWXemzVrFuLj43WXQfykAClwhing9eei4/730DgjeEr4l0Br3F5wPy5uXg3n1jXOsGpod0mB0CngK8zHiE1jzYSfd3gL3qjyD8zI7hF7rOyoUaPIAMoKaEccu9tXdOvUqZMotBROxACyALYcza233oqHH3643Dx0BNC6/CL/iVlnrTxCR05VTtl4K3EiWDswIhx2j6kOvlDW4dr8OTzzH4Qr/yR2BurjhoK/Y9TAc3Fbv6ZlloqxWqtqHbLxVuJEsHZgRDis6usE3ok6dORU4aQjgPo7z/EjgOwO4JLX+VVWsp3XAJ6e5+jRo2jQoAGmT5+OG264QUh5ugaQLxObAOy+6J2XVUdOVU7ZeCtxIlg7MCIcvDEKh/dDXsfhrTDeHw7XyVSkGrVME9j/vH549NK2SiZQtQ7ZeCtxIlg7MCIc4dB7vH1wog4dOVU46RpAXpeov++4ASx5/R97CsiDDz6I8ePH49xzzzWrW7FiBf71r3/hhRdeKLWOH6/0rKwsc21BtnXt2tV8rFz//v3NO43Zi53OZcvD1KtXD7t378ajjz6KvXv34rfffjOXoRHZyADyVVKZAPjs5SN05FTllI23EieCtQMjwiE7dqGMc6KOwqO7kTd9MBLy03DcqIZbCsajebeL8M8rO8LrqfgRcpXpolqHbLyVOBGsHRgRjlD2mGwuJ+rQkVOFkwygbPeIxzluAEvuas+ePU1jxpZIKLmxI0jsJg12g4botmjRItPwnb7deOON5iPl2KLQzHCypWCYCWTYp59+ungxapE8ZAD5KqlMAHx2MoAlFRDR2g6MCIfs2IUyzok6WM4FX32MwUffgTt1DXKNaNxReB+8rS/Ga6O6IjbKY1kC1Tpk463EiWDtwIhwWBbYgQAn6tCRU4WTDKD+xgsrAxgXF4e1a9eibdu2pSpnR+XYgs65ubn6FbGQgQwgXyyVCYDPTgaQDKBsl2hcBqaSXSr+PPzfBYiaPQbY+QMKDQ/GF96O1CZD8PaN3ZEYa219QNXPmGy8lTgRrB0YEQ75jgldpBN16MipwkkGUH+/hZUBZCaPmb///Oc/iI2NNatnN17ccsst5qlZZg7DaSMDyB8NlQmAz04GkAygbJc4bADZQtDsjO+cO4FfPzGLeLrwOqyo8xfMvKVnqcfH8SpU/YzJxluJE8HagRHh4OkZDu87UYeOnCqcZAD1d2JYGcBffvkFV1xxBQKBADp37mxWzx4Jx+Hb+iYAACAASURBVG4SmTt3Ltgp4nDayADyR0NlAuCzkwEkAyjbJWFgANmTQAIB4PvHgZ9fNwuZ6rsCHyXegvdv7Y1GtcSWllL9jMnGW4kTwdqBEeGQ75jQRTpRh46cKpxkAPX3W1gZQFYuW5vngw8+wNatW80ng7Rr185cq6datWr61bCYgQwgXzCVCYDPTgaQDKBsl4SJAWS7bxjAspeBHyaYxXziuwBTYu/Cu7f2Qeuz+DekqX7GZOOtxIlg7cCIcMh3TOginahDR04VTjKA+vst7Ayg/pLty0AGkK+lygTAZycDSAZQtkvCyAAWlbDuAxhf3Ws+Pm6Bvxse89yPN28+D+c0qfwJCKqfMdl4K3EiWDswIhzyHRO6SCfq0JFThZMMoP5+c9wAsmVeipZ84ZWbnZ1tLtnSvn17HjQk75MB5MusMgHw2ckAkgGU7ZIwNICslG3zYXx6E1y+PKwKtMJdxkN4/voL0L91nQoLVf2MycZbiRPB2oER4ZDvmNBFOlGHjpwqnGQA9feb4waQPX2jadOmGDt2rLn8C3s+7+nbli1bzNPCM2bMMNcDHD16tH5lBDKQAeSLpDIB8NnJAJIBlO2SMDWArJw9K2B8eA1ceZnYGmiEMb6/49FrB+CyTvXKLVb1MyYbbyVOBGsHRoRDvmNCF+lEHTpyqnCSAdTfb44bQNYg06ZNw2uvvYbff/8drVq1Qv369c27gI8dO2ZeC8iO/LHn8z7yyCPo0KGDflUEM5AB5AulMgHw2ckAkgGU7ZIwNoCspEObYXwwAq6TadhvpOAW36OYdNvwck8Hq37GZOOtxIlg7cCIcMh3TOginahDR04VTjKA+vvNcQNYskS2zMtPP/1knuZla/6lpKSYT/EoeoKHfjmsZSADyNdLZQLgs5MBJAMo2yVhbgBZWcf2wPjgSriO7gyaQM8k/Ofuy8vcHaz6GZONtxIngrUDI8Ih3zGhi3SiDh05VTjJAOrvt7AygPrLtTcDGUC+nioTAJ+dDCAZQNkuOQMMICstOx2B/wyCO+N3bAw0w+M1XsB/7+yPhBKLRat+xmTjrcSJYO3AiHDId0zoIp2oQ0dOFU4ygPr7jQyggsZkAPniqUwAfHYygGQAZbvkDDGArLyMXfC/NQCe3Aws8J+Dj5o/h+k39oLH7TKLV/2MycZbiRPB2oER4ZDvmNBFOlGHjpwqnGQA9fcbGUAFjckA8sVTmQD47GQAyQDKdom6cZLJLP152LsSgZlXwO3Pxzu+wTjQ+0k8cXk7MoCnDYK0vjKDqTHGiTp05FThJAOoscFOUZMBVNCYDCBfPJUJgM9OBpAMoGyXnGEGkJW5eTbw6U1mwRMKb0CrIeMxqldjOgJYogWcmG/kO7DiSCfq0JFThZMMoI7OKs1JBlBBYzKAfPFUJgA+OxlAMoCyXXIGGkBW6lL2xJAnETBcuNP3N9xw853o0SQJ8+bNM5fRimKPl7O4yX5GrcSJYO3AiHBYlMcRuBN16MipwkkGUH/rha0BzMvLM5eCCeeNDCB/dFQmAD47GUAygLJdcoYaQMOA8fV9cK19FzlGDG5xTcBTt4/Cb78sJgNow/WQ8t1kbyTNmwAZQHt7qjy2sDKAgUAAzz77LKZOnYpDhw5h+/btaN68OZ544glzsegxY8boV8RCBjKAfLFoIgtqJKuDlTgRrB0YEQ5+ZziPcKIOW3L6ffD/dyQ8u/6HI0YS7o6fjKEtYnH1UDoCaIu+zrem9Hyhsus6tFPhJAOoMppisWFlAJ966inMnDkT7Ct7MsimTZtMA/jJJ59gypQpYI+NC6eNDCB/NFQmAD47HQGkI4CyXSJvyuUz2pgz7wR8/7kY3iNbsC3QEA/HPIFZDwxHfGyM5d2T/YxaiRPB2oER4bAskAMBTtShI6cKJxlA/Y0XVgbw7LPPNp8KMmDAACQkJGDDhg2mAWRPA2HPC2ZPBgmnjQwgfzRUJgA+OxlAMoCyXWKjGbOwC7Z+HjIPoHBaf0TlHMJSf3vM6/gKnr26O1yu4PIwopvsPlmJE8HagRHhENXFSZwTdejIqcJJBlB/B4aVAYyLizPNXpMmTUoZQPYs4J49eyIrK0u/IhYykAHki6UyAfDZyQCSAZTtkipgAFnpaRuDRwJ9OfjEdwFODJqCW89vYUkU2c+olTgRrB0YEQ5L4jgEdqIOHTlVOMkA6m++sDKA3bt3x3333Yfrr7++lAGcOHEifvjhB/MxceG0kQHkj4bKBMBnJwNIBlC2S6qIAQTg+20e3B+PghsGXvSNRLfrn8FFbeoKCyP7GbUSJ4K1AyPCISyMg0An6tCRU4WTDKD+BgwrA/j1119j9OjReOSRR8zrAJnx27ZtG9577z3MnTsXAwcO1K+IhQxkAPliqUwAfHYygGQAZbuk6hhA9hnbPPMBdNk/0xTjocA9uOXOh9DmrEQhcWQ/o1biRLB2YEQ4hERxGOREHTpyqnCSAdTfhGFlAFm53333HZ577jmsWbMG7K7gbt264R//+AcGDRqkXw2LGcgA8gVTmQD47GQAyQDKdknVMoBsHcBLon5G9C9vIN/w4v6YCZh4z22oncC/KUT2M2olTgRrB0aEQ75jQhfpRB06cqpwkgHU329hZwD1l2xfBjKAfC1VJgA+OxlAMoCyXVL1DOCllwyG8dktiN4+F8eNangseQr+dcdViI3yVCqS7GfUSpwI1g6MCId8x4Qu0ok6dORU4SQDqL/fyAAqaEwGkC+eygTAZycDSAZQtkuqoAFkTwKBD3lvX4LYQ+uwJ1AHX5zzPu4f2psMoHybOBJJ8yYtBB2KxnPcANasWVN42YKMjAxhTZYsWYLJkyebp5LT0tIwe/ZsDBs2rDjeMAzzGsPp06eby8v06tULr7/+Otq3by+cgwwgXyqayIIayepgJU4EawdGhIPfGc4jnKhDR84ynFlHkPPmhYjP3o/5/p6oM+ZjnNO0VoWCy+6TlTgRrB0YEQ7nO4+/B07UoSOnCicdAeT3iSrCcQPIFn4u2o4ePYpnnnkGF198sbnuH9vY4s/sukD2NJD7779fuN758+dj2bJl5jWEI0aMKGMAn3/+efOpI++++y5atWpl5mWmkd10wtYgFNnIAPJVUpkA+Ox0BJCOAMp2ibwpl8+oJ2e5n7HU9fBPvwge+PFs7P144IEnKjwVLPsZtRIngrUDI8KhMn6hinWiDh05VTjJAOrvNscNYMkSmVHr378/7r777lKVv/baa+YyMHPmzJFShC2MWvIIIDv6V79+fXPJmYcfftjkzM/PR926dcGM4e233y6UhwwgXyaVCYDPTgaQDKBsl+gxY7y90fF5qIgz94dJiFv6T5ww4jGzy4e4Z/iF5e6e7D5ZiRPB2oER4eCNUTi870QdOnKqcJIB1N+JYWUAq1evjvXr14M9EaTktmPHDnTt2lV6IejTDeCuXbvQokULrF271uQt2oYOHYoaNWqYj6Mrb2Mmkb2KNmYAGzVqhPT0dCQm/rnkAmv6BQsWmMvWREVFVTjpVoYR4dDfHuoZnKhDR05VTtl4K3EiWDswIhzqnaOfwYk6dOSskDPgQ/bUgahx7FcsC7RH1A2z0bVJ2VPBsvtkJU4EawdGhEN/Z6lncKIOHTlVOJkBTHoluKh5+l3bkVSj4ssYTldcJC/7+52SkoLMzMxSf7/VR+/MYQgrA8ieAMKO/o0fP76UguxaPnYUcM+ePVLKnm4Aly9fjr59++LAgQPmkcCi7bbbbjNzsFPO5W0TJkwwrxs8fZs1axbi4+Ol9o2CSAFSgBTQpUD1vDSc99sTiEEBJuNGNO00ANGV3xSsa1eIlxSwpICvMB8jNo01Yz7v8Ba8UfwljawkyMnJwahRo8gAWhFNJ5ZdjzdmzBgMHjy4+BrAn3/+Gd9++y3efvtt3HTTTVLpKzKAqampqFevXjHn2LFjsW/fPjNfeRsdAbQuv8h/YtZZK4/QkVOVUzbeSpwI1g6MCIfdY6qDz4k6dOTkceYtn4aEHx9DrhGNGR1nYuzQ0gvq8+Ir0t5KnAjWDowIh45espvTiTp05FThpCOAdndVWb6wOgLIdm/lypV49dVX8dtvv4Fdq9euXTvce++95l26sptdp4BPz0/XAPJHhE0AbJHaS9kSFRWcDuezWEPoyKnKKRtvJU4EawdGhMPaiDmDdqIOHTm5nIEAjk67HMmHlmF9oAUCt3yHbk1rF4vOja9geKzEiWDtwIhwONNt1rI6UYeOnCqcdA2gtZ6RQYedAZQpghdT0U0g7K7ihx56yAwvKChAnTp16CYQnpgW31eZACymUv6DVlk+1Tpk463EiWDtwIhwyI5dKOOcqENHTiHOzAPIfaUn4gJZeCd6FEaNf634rmCh+HIGxkqcCNYOjAhHKHtMNpcTdejIqcJJBlC2e8TjwsoA7t27t9I9b9y4sXBlWVlZ2Llzp4lnN3q89NJL5h3GtWrVAuNhd/tOmjQJM2bMQMuWLc3Hzy1atIiWgRFWWAyoMgGIZSiL0pFTlVM23kqcCNYOjAiH7NiFMs6JOnTkFOXMXjUL1b65A4WGBx90+A9uvnq4Kbdo/OljYyVOBGsHRoQjlD0mm8uJOnTkVOEkAyjbPeJxYWUA3W53pYtC+/1+4cqYmWOG7/TtxhtvNNf+K1oIetq0aaUWgu7QoYNwDjoFzJdKZQLgs5eP0JFTlVM23kqcCNYOjAiH7NiFMs6JOnTkFOY0DBz6z7Wou/9b7Ag0QNZN/0PX5vXIAIay6QRzCY+pIJ8ITEdOFU4ygCKjpoYJKwO4YcOGUtWw5lm3bp159I4t2nzllVeqVWtzNBlAvqAqEwCfnQxgSQVEtLYDI8IhO3ahjHOiDh05LXFmH8WJl7oj0Z+BT6KGYshDM+BBQOo6XSt5RbB2YEQ4QtljsrmcqENHThVOMoCy3SMeF1YGsKLd/uabb8zHurGjeuG0kQHkj4bKBMBnJwNIBlC2S+RPfcpn1JPT6mcs69e5qP75dQgYLnzY9jWMHHENGUCVQdUQa3VM7dgFHTlVOMkA2jGqlXOcEQaQLQTdpUsXZGdn61fEQgYygHyxVCYAPjsZQDKAsl2ix4zx9kbH50GGc/97Y9Fw1yfYb6Tg4F8W4MC2Xy3fqW8lrwjWDowIB2+MwuF9J+rQkVOFkwyg/k4MKwPIDFXJjV2nl5aWBrYA89atW82nhITTRgaQPxoqEwCfnQwgGUDZLolsA4j8kzj6Yg8kF6ZhvncAstrdiGFXWFuqycpnWwRrB0aEQ75jQhfpRB06cqpwkgHU329hZQDLuwmEmUD2uLWPPvqoeHFo/bKIZSADyNdJZQLgs5MBJAMo2yURbgABnNy2GNU+HAo3DLxa/X7cMe4xS2t1Wvlsi2DtwIhwyHdM6CKdqENHThVOMoD6+y2sDODixYtLVcwMYe3atc1nA3u9Xv1qWMxABpAvmMoEwGcnA0gGULZLyAAy5XZ/+ACabnsb6UYi9o5cgG7t2wgLauWzLYK1AyPCIVygg0An6tCRU4WTDKD+BgwrA7hkyRL06dOnjNnz+Xxgz+89//zz9StiIQMZQL5YKhMAn50MIBlA2S4hA2gq58tH6gu9UL/gD/zk6Y0eD3+D2Gixf7atfLZFsHZgRDjkOyZ0kU7UoSOnCicZQP39FlYG0OPxmNf8sSdylNyOHj1q/s7KOoD6pQPIAPJVVpkA+OxkAMkAynYJGcAi5TJ2/IKEDwYjyuXH3GZP4PIbHxQS1cpnWwRrB0aEQ6g4h0FO1KEjpwonGUD9TRhWBpCd8j106JB52rfktn37dnTv3t00XOG0kQHkj4bKBMBnJwNIBlC2S8gAFinHPqNLX78D/Y9/ipNGHPZcswAd2nXkCmvlsy2CtQMjwsEtLAwATtShI6cKJxlA/Y0YFgawaIHnL7/8EoMHD0ZMTExx5eyo38aNG9G6dWt8++23+hWxkIEMIF8slQmAz04GkAygbJeQASxpAOd/8zU6bn0RzfI2Y62nEzr8fRGiozyVimvlsy2CtQMjwiHfMaGLdKIOHTlVOMkA6u+3sDCAN998s1npzJkzMXLkSMTFxRVXHh0djaZNm2Ls2LFISUnRr4iFDGQA+WKpTAB8djKAZABlu4QMYEkDOG/ePJzX5WxUm3EhYlGAhW2fxkXX3EsGUL69lCJp3gTIACq1kFBwWBjAoj2dOHEiHnzwQVSrVk1o550GkQHkjwBNZEGNZHWwEieCtQMjwsHvDOcRTtShI6cqZ8n4rZ8/jY5bX0G6kYTAXatQp07dCgfKSl4RrB0YEQ7nO4+/B07UoSOnCicZQH6fqCLCygCqFhPqeDKAfMVVJgA+Ox0BpCOAsl0ib8rlM+rJqfoZKxnvMfxIe74bGvgPYHHNEbhg3DtkAFUGXDJWdUxl0urIqcJJBlBmFK3FOG4Au3Xrhv/973+oWbMmunbtCpfLVWEFa9eutVadZjQZQL7AKhMAn50MIBlA2S7RY8Z4e6Pj86DKeXr8rpVz0Xz+dfAbLvw2ZC46nHNeuWVZySuCtQMjwsEbo3B434k6dORU4SQDqL8THTeA7LTv+PHjER8fD/Z9ZduTTz6pXxELGcgA8sVSmQD47GQAyQDKdgkZwCLlyvuMbpwyHJ0yF2Kzpy1aP7K03IX4rXy2RbB2YEQ45DsmdJFO1KEjpwonGUD9/ea4AdRfor4MZAD52qpMAHx2MoBkAGW7hAxgZQbw2MHdiJnaE/HIx7IOE9H3qvvKCG3lsy2CtQMjwiHfMaGLdKIOHTlVOMkA6u+3sDSABQUFOHz4MAKBQCkFGjdurF8RCxnIAPLFUpkA+OxkAMkAynYJGcDKDCB7b82siThn+0vIQAJc96xFzeTSC/Rb+WyLYO3AiHDId0zoIp2oQ0dOFU4ygPr7LawMIFvwecyYMeZj30puhmGY1wbSk0D0N4TdGVQmANl90ZFTlVM23kqcCNYOjAiH7NiFMs6JOnTkVOWsKN5fWID9k85Bk8Be/Jw8DL3vmVlqeKzkFcHagRHhCGWPyeZyog4dOVU4yQDKdo94XFgZwL59+5rXmvz9739HvXr1ytwQ0rlzZ/HKQoCkI4B8kVUmAD47HQGkI4CyXUJHAHlHANn7W1fMQ5vv/oKA4cLvw79Gyy79igW38tkWwdqBEeGQ75jQRTpRh46cKpxkAPX3W1gZQLb+35o1a9CmTRv9lduQgQwgX0SVCYDPTgaQDKBsl5ABFDGADLP6pRHofuIHbPe2wtmP/Ay3J/iEECufbRGsHRgRDvmOCV2kE3XoyKnCSQZQf7+FlQHs0aMHpkyZgvPOK3/ZAf1yWMtABpCvl8oEwGcnA0gGULZLrBkY+SylI3V8HlQ5efFHUvcgblovVHflYnXHCeg+4n4ygHY1RAU8vDHRkV5HThVOMoA6Rrk0Z1gZwIULF+Lxxx/Hc889h44dOyIqKqrU3iYmJupXxEIGMoB8sVQmAD47GUAygLJdQgZQ9Aggwy3/4Cn02fkvHEd1eO5dg4RaZ9ERQPnW40bSvEmPguM2iQ2AsDKAbrfbLOn0xaDpJpDSRtiGcQ8ZBU1kQalldbASJ4K1AyPCEbIGU0jkRB06cqpyisSzlRn2/bMHWgR2Y23KEHS7+31LPS2Sww6MCIdCy4Qs1Ik6dORU4aQjgPrbLawM4OLFiyut+IILLrBNkQkTJpRZeLpu3bo4ePCgcA46AsiXSmUC4LPTEUA6AijbJfKmXD6jnpyqnzHR+PVL56PLD9ea5e8d/iXqteuLefPm4dJLLy1ztuZ0jURy2IER4VAZv1DFOlGHjpwqnGQA9XdbWBlA/eX+mYEZwM8++ww//PBD8S89Hg9q164tvBtkAPlSqUwAfHYygGQAZbtEjxnj7Y2Oz4Mqp5X45S9ejT5Z32NX1Nlo+MBSzP/uezKAvEGXeN/KmEjQlxuiI6cKJxlAu0a2Yp6wMoAbN24sd0/ZKeHY2FiwhaBjYmJsUYUZwDlz5mD9+vXSfGQA+dKpTAB8djKAZABlu4QMYJFyVj6jB/bvRcJbvZDoysHGTo/jD08rMoDyLVhhpJUxsSu9jpwqnGQA7RrZM8QAsmsAT7/+r+Sus5tCrrnmGkybNs00hCobM4CTJ09GUlKSaSp79epl3nzSvHlzYVoygHypVCYAPjsZQDKAsl1CBlDGALKYhe89g4t2TcYJVMOP7Z7HpcOvpVPA8m0YsqNxvF3UMVercJIB5I2Y+vthdQTwyy+/xMMPP4zx48ejZ8+eYDd/rFq1Cv/617/w5JNPwufzmYtEMxP44osvKlU/f/585OTkoFWrVjh06BCeeeYZbN26FZs3b0ZycnK53Pn5+WCvoo0ZwEaNGiE9PR0l71BmTb9gwQIMHDiwwomRh+G9r1R8CIOdqENHTlVO2XgrcSJYOzAiHCFsMelUTtShI6cqp9X4vPwCpP6rL1obf2BZTD90HfeJkAFUnRPZQPP2lfe+dLOEONCJOnTkVOFkBjDplRam8ul3bUdSjVrCoyCSl/39TklJQWZmZqm/38JJqgAwrAwgM31PP/00Lr744lLSfvfdd3jiiSfwyy+/mKdtH3jgAfz++++2yp+dnY0WLVrgoYcewt/+9rdyucu7cYQBZ82ahfj4eFv3h8hIAVKAFAhXBdJTf8eYQxPN3fu68eMIJLcK112l/TpDFfAV5mPEprHm3n/e4S14o+y5/KtIDnYAaNSoUWQAw6U/4uLisG7dujJPAmFH5rp27Yrc3Fzs3r0b7dq1M4/e2b2xI3Znn3023nzzzXKp6QigdcVF/hOzzlp5hI6cqpyy8VbiRLB2YEQ47B5THXxO1KEjpyqnTDw7O7Ps5dHon/Mt9kY1Q70HVwBub4XDJJLDDowIh45espvTiTp05FThpCOAdndVWb6wOgLITB573u/06dMRHR1t7i1roLFjx2LDhg2mOVy2bBmuv/56/PHHH7aqw8wdOwJ422234R//+IcQN10DyJeJjZ/oUhF8NjGEjpyqnLLxVuJEsHZgRDjERspZlBN16Mipyikbv2PXLqTM7Iearixs7/oYWg19qFIDyJsHRPaDh+G972zHiWd3og4dOVU46RpA8X6RRYaVAVy+fDmGDBkCdjNIp06dzBtC2J3Bfr8fc+fORe/evfH++++ba/Wx6wRVtgcffBBXXHGFeWfx4cOHzWsA2TqEv/76K5o0aSJETQaQL5PKBMBnLx+hI6cqp2y8lTgRrB0YEQ7ZsQtlnBN16Mipyikbz+JmTXkIN+a8gyzEI2rcasTUbFDuEIrksAMjwhHKHpPN5UQdOnKqcJIBlO0e8biwMoBst7OysvDBBx9g+/bt5k0gbdq0Mc/TJyQkiFclgLz22muxZMkS8wYOtvYfM5fs+kN2ell0IwPIV0plAuCzkwEsqYCI1nZgRDhkxy6UcU7UoSOnKqdsPIub/dVctN/0DNobO7E7sQea3vsN4C17rZZIDjswIhzCPeYvBNI2AtlHgMT6QFJDIK4me1SVMIUs0NY6BHdCR04VTjKAggOnAAs7A6hQS8hDyQDyJVeZAPjsZADJAMp2CS0DU6Sc7Ge0KC4hsRp6LroO1V152H3WYDS9bRbg9pQaGJEcdmBEOCrsmIIcYP8qYO8KYM/y4PeFp11rHlUtaATNVwMgqdGfPyc2ANgrSm2JMrZ/SnVIfiR05FThJAMoOZAWwsLSAG7ZsgV79+4Fe/5kyY2dHg6njQwgfzRUJgA+OxlAMoCyXUJ/ZO0ygOxRcF/O+QhDNo1DtMuPPS2uQ5PrXy91pExkHrADI8JR3DG5x4C9K4E9y4KmL3U9ECgs1VC53kRkeOuihi8d1XzHxJqtWp2gKWzSB+h6PVCnrVhcCZSlOiyznxnzJhlAmwa2EpqwMoC7du3C8OHDzevw2PV/7BQw24oWh2bXAobTRgaQPxo0kQU1ktXBSpwI1g6MCAe/M5xHOFGHjpyqnLLxJeO8Xi8+nPEKrt0zAW6Xgf2d70PD4cFlYkT7X2Q/eJhK3z+RBuxdDuw5dYTv8BYAwb8xRdvJ6DpY726HH7KbY4WvNXYYDWDAbb4dgwLUdx1FPddRNHCloz6C3zd0H0UDdwbqIR2x+HOd2GLSBucAXUcDHa4EYpOEGp9XpxCJRZCOnCqcZAAtDqAEPKwMILspgz2P96233jKfyMHW/Tt69Ki57h9b+Llfv34SJeoLIQPI11ZlAuCzl4/QkVOVUzbeSpwI1g6MCIfs2IUyzok6dORU5ZSNPz3O5w/g4zeexHVHXzWH8WC/Z3HWgLudN4AZu4AfJgBbvizTXhmxjbEWbfFdVnOs8LfGfoM9Cz54jV+9pFj0bp6MZinVkJlbiIzsAvN1LOfU1+wCZBeUPChhoAayTJPYzHUQQzzLcZF7HaJcQYzhjYOr3dDgUcEmfQF30FiWt8mOicrnR0dOFU4ygCqjKRYbVgaQrcq9cOFC8w5g9og2ZgBbt25t/o6ZQLYMTDhtZAD5o6EyAfDZQzd5qtYhG28lTgRrB0aEQ3bsQhnnRB06cqpyysaXF5dX6MdXL9+Dkdn/RQAuHLt0GpJ7XiN0BFxkP3iYUu/7soAlLwIrp5mndg24cDi+FVYbbTDvRDOs9LdGOv48Ilf/lOFjpo+9GtWKq/TRpKxXWb1/GsJCZOQU4Fh2AQ6eyMMPWw7h2OEDGOZZims8i9DSfaC4vQM1msLd7Xqg86jgtYSnbbw6dXxOdORU4SQDqGOUS3OGlQGsWbMm1qxZYx79Y2vyvf322+jfv7/51I+OHTtqWfxZRWIygHz1VCYAPjsZwJIKiGhtB0aEQ3bsQhnnRB06cqpyysZXFJeZXYAlr4zGFQXfogBe5I/8GLEtL+CuByqyHzwMe3/+N1/hsjoH4flpMsCu8wOw2tMFj+dci61G4+IWMw1fi6DZO7d5MhrW5Bs+q/257eBJfL0hFV9vOICax37FSM8iXOFZgQRXp78XMwAAIABJREFUrklluNwwmveHu9tooPWlxXdQ8+q0uh8ieB05VTjJAIqMmhomrAwgO8XLjvQNGzbMXPrl2LFjePzxx82FoZkx3LRpk1q1NkeTAeQLqjIB8NnJAJIBlO0S+esy5TPqyan6GZONrywu7VgWfvv3VbgosAK5rjj4rp+DhZsOgd0wEhUVVa6EIvtRKcYw4Nv8FfK+Ho/q+YfMHHvcjfFk3rVYFOiMGvHRGNCmLno1r6XN8FXUG+x69k0HTuDrjan4Yf0udMlagpHexejt/q04pDCmJjxdroG7z70ojK/DNcwqfVherIj+VnOqcJIBtKq2dXxYGUD2zF/2TN4rr7wS7IaQyy+/HOwxcMnJyfj4449x0UUXWa9QYwQZQL64KhMAn50MIBlA2S7RY8Z4e6Pj86DKKRvPi9uZmo6j04eiFzbhhDsJP7d6FP1HjNFjAFPXAd89DuxZag7BcVcNvFAwAh/7L0R8TAxu7dcct5zXFAmx5ZtP3rjZ+X4gYGDt3mPmkcENG9dhQP4PuMqzBPVcGWYanzsWgV53YEF2Gwy6YkSFetm5T4yLN54y+VQ4yQDKKG4tJqwMYHm7npGRAXZquOhOYGvl6UWTAeTrqzIB8NnJAJIBlO0SPX/weHuj4/OgyikbLxK3budeRL0/FB1cu3DYlYIad/+I6OQ/T8Mq92/mfuB/TwMbPzKpChCN6b5LMNV3BXxR1XFTn2a4/fzmqFkt+GjRcNv8AQMrdx3F3A37kLnpe9zg/wK93FvN3TzpTkLMoCcQ3eNmwFPxc5btqklkPK3mUuEkA2hVbev4sDeA1ksKXQQZQL7WKhMAn50MoPIf0HIk5I0Z733ZcQt1nBN16MipyikbLxq3aO0WNJkzHM3cB3E4rjnq3Lsw+ESN0zYRvmLMgH6IWvk6sOI1wJdnMn3hPw8vFo7EIVcyruvVBHcPaIk6CeqLMoeqLwt8AcxZux9rv38ftxfMRDN38DT2icSzUf3yf8LdaqDWXRHR3+oOqHCSAbSqtnV8WBjAW265RWjP33nnHSFcqEBkAPlKq0wAfHYygGQAZbuEjgAWKSf7GbUSN2fhUpy7+DrUdR3HoRpdUPfO+UB0fKnB4/IFAig89Bu2zn0dHY4vgCv7sBm/MtAGzxRejy2uFriqW320DezBdcMrvtZQvmNCE8nuLP5g6XYcWfg6/uqejZquLDNxxlnnoeawf8J1VkctO8LVXyKrCicZQAnBLYaEhQF0u91o0qQJunbtWrz4c3l1zJ4922J5euFkAPn6qkwAfHYygGQAZbuEDGAoDSCbB55/YzruyXgGSa4cHDrrQtQd+xng+fOavDJzRUE2cGANsG8lsO+X4CvvePGA/xGoi0m+UVhgdMewLg0xbkBLNEiKDvnNE/IdWHEk0+KLr+chPaYeqv3yCkZhvvmUlQDcyGh5NVKGPAUknGVrah1ztQonGUBbh7dcsrAwgHfeeSc++ugjNG7cGOxo4PXXX49atWrpr14xAxlAvoAqEwCfnQwgGUDZLiEDGGoD+M0383Dk5EmM3nkfYl2FONz8StQZ/U7wkXGGgcKju7Fh7nR0TSmA+8Aq4OAmuIzST3/KMWKwIdAC8wM98KF/AP6vQ0PcP7AVWtVNMMtxYr6R78DKDeC8efPMu6ZPFhiY9e1iNN/wIi51/2wG5blicfKcu1B70ANAdDVbdkGHdiqcZABtGdZKScLCALI9zM/PxxdffAF2mnf58uW47LLLMGbMGAwaNCgsbwBh+0wGkN+gKhMAn50MIBlA2S5xxizo+DyocsrGW4krwl48+BLMeHcaxqb+A15XAMebX4FoD+De/wtic4PXvJXcDhjJWBtoiTWBVlgdaGWu42e4PDi/VW08MKgNOjQo/Wg1K/sk3zn6I8urI/V4LuZ89QV675yCbu4d5k4c96bAf8FjSO57I+D2KO2YDu1UOMkAKg2nUHDYGMCSe7tnzx68++67eO+998z/6LZs2YLq1asLFRRKEBlAvtoqEwCfnQwgGUDZLiEDWKSc7GfUSlxJrB9uvPPaM7gz86VSg+cz3NhsNDUN3+pAa2x0tUJ8ShO0rFvdPMLXqm51NK0Vhy2/LMYVl5V/jZ+VfZLvHP2RldXx++GTWDR7OgYeeBON3UfMnUmNa4WEkW8goVkP6Z3ToZ0KJxlA6aEUDgxLA7h3717TALJXQUGBuRYgGUDhMQ0roMoEIFuIjpyqnLLxVuJEsHZgRDhkxy6UcU7UoSOnKqdsvJW407En8grxzqtPofXJFdhiNEdqYmf46nZC/sljuLRvV7RrUANNkqshylP6ebm8nLz3Q9lfKrlE6ti89zA2fjEZlx37AImuHPjgxp6WN6P51U/DJXFaWCSn1ZpUOMkAWlXbOj5sDGDJU8BLly41F4G++eabMXjwYLCbRMJxoyOA/FFRmQD47HQEkI4AynYJHQF06ghg0ZNA2N2u7LRmo1rxptETmSt4GN778t0S2kgrdazatBUn5zyAi3zBRbAPeevDPeRV1O5kbdkYKzlF1VDhJAMoqrI8LiwMYMmbQJjpYzeBsKd/hPtGBpA/QioTAJ+dDCAZQNkuIQPotAE8feRE5goehve+fLeENtJqHfk+P779fAZ6bXkWZ516osjWesNx9vVT4K1Wds3F8qqxmlNEERVOMoAiCqthwsIAsiN87A5gtgxMZU/8YDeJhNNGBpA/GioTAJ+dDCAZQNkuIQNIBlC+d3RHys6bv+9Pw85ZD+LinLnmLma4auLERZPQtN9fuLssm7MyYhVOMoDcIVMGhIUBvOmmm4Tu9J0xY4ZywXYSkAHkq6kyAfDZyQCSAZTtEjKAZADle0d3pMq8yZ41/OOCOWix4hE0RZq5q1tqXIgmo19HteSGFe66Ss6KSFU4yQDq7jIgLAyg/jL1ZCADyNdVZQLgs5MBJAMo2yVkAMkAyveO7kg75s3045lY+/6j6J/+IaJcfpxANezr/gjaX3Z3cO3F0zY7ctrJSQZQd5eRAVRSmAwgXz4dkwovq46cqpyy8VbiRLB2YEQ4eGMUDu87UYeOnKqcsvFW4kSwdmBEOMKh93j7YGcda1YuQfx396NtYKeZdmtcVyRfOxW1m7QptRt25lT954LFkwHkdYn6+3QEUEFDMoB88XRMKrysOnKqcsrGW4kTwdqBEeHgjVE4vO9EHTpyqnLKxluJE8HagRHhCIfe4+2D3XXk5uVjxaxncO6eqYhzFSDXiMamVneh2zWPweMNPo7P7pyqnGQAeV2i/j4ZQAUNyQDyxdMxqfCy6sipyikbbyVOBGsHRoSDN0bh8L4TdejIqcopG28lTgRrB0aEIxx6j7cPuur4fdtGZH92NzoVbjB3Yaf3bLiH/hvNO/YhA8gblCr4fsQbwDfeeAOTJ09GWloa2rdvj5dffhn9+vUTGmoygHyZdE1klWXWkVOVUzbeSpwI1g6MCAe/M5xHOFGHjpyqnLLxVuJEsHZgRDic7zz+HuisI+AP4OfZ/0aHX59Hoisb7Aksq+tfh/bXPoWFi34ynz9ctFYjf08rR6jUQUcAVdXnx0e0Afz4448xevRoMBPYt29fTJs2DW+//bb56Dm2LA1vIwPIU0jPaQVeVpVJpyJuVU7ZeCtxIlg7MCIcvDEKh/edqENHTlVO2XgrcSJYOzAiHOHQe7x9CEUdR9L2Ys9/70H3rEXm7ux3nYWldW/CiDEPkgHkDVAVeT+iDWCvXr3QrVs3vPnmm8XD2bZtWwwbNgyTJk3iDjEZQK5EWk4r8LLqmDxVOWXjrcSJYO3AiHDwxigc3neiDh05VTll463EiWDtwIhwhEPv8fYhlHWsWzAL9Zc9jro4au7WyqTBaDX6VdRMqcvbTe77KnXQEUCuvMqAiDWA7BnD8fHx+PTTTzF8+PBiIceNG4f169dj8eLFXHHJAHIlIgN4SiLZidBKnAjWDowIB78znEc4UYeOnKqcsvFW4kSwdmBEOJzvPP4ehLqOk5kZ2Pz+g+h55Au4XQaOIgk7uz2OnpffCpfCo1hV6iADyO8TVUTEGsDU1FQ0aNAAy5YtQ58+fYp1fO655zBz5kxs27atjLbsecXsVbQxA9ioUSOkp6cjMTGx+Pes6RcsWICBAwdWeCidh+G9rzrwoYp3og4dOVU5ZeOtxIlg7cCIcISqv1TyOFGHjpyqnLLxVuJEsHZgRDhUeiZUsU7UwXLO/e8b6Jn2LpoG9pmlro3piVpXv4IGTVpKla5SBzOASa+0MPOm37UdSTVqCe+DSF729zslJQWZmZml/n4LJ6kCwIg3gMuXL8e5555bPJTPPvss3n//fWzdurXM8E6YMAETJ04s8/tZs2aZRxNpIwVIAVKAFCAFzmQFDF8hvLu+waCsrxDt8iHLiMX8hKvhaT4AHo87ZKX5CvMxYtNYM9/nHd6CNyrG1tw5OTkYNWoUGUBbVT1DyGROAdMRQOuDK/KfmHXWyiN05FTllI23EieCtQMjwmH3mOrgc6IOHTlVOWXjrcSJYO3AiHDo6CW7OZ2o4/ScqTs3IG/2PWhdsMUs7zdPK/gvfRmtO/UULlelDjoCKCyzNDBijwAyxdhNIOecc455F3DR1q5dOwwdOpRuApFuqdKBbAKYN2+erUsL8HZNR05VTtl4K3EiWDswIhy8MQqH952oQ0dOVU7ZeCtxIlg7MCIc4dB7vH1woo7ychoBP9bNfhmtfp2M6shFoeHBinrXo9O1E1GjRk1eGUrXgNM1gFx5lQERbQCLloGZOnWqeRp4+vTpeOutt7B582Y0adKEKy7dBMKVSGkC4LOXj9AxeapyysZbiRPB2oER4ZAdu1DGOVGHjpyqnLLxVuJEsHZgRDhC2WOyuZyoo7Kcx9J2Y/9/70LHrKVmSUeNJGxqfiu6jbgfCdUTKixTpQ4ygLLdIx4X0QaQycSO/r3wwgvmQtAdOnTAlClTcP755wspSAaQL5PKBMBnJwNYUgERre3AiHDIjl0o45yoQ0dOVU7ZeCtxIlg7MCIcoewx2VxO1MHNaRjYsvC/qLHsadQPHDRLO4hkbG/9V/QYdi/i4mLLlMvlrEQgMoCy3SMeF/EGUFyqskgygHz1VCYAPjsZQDKAsl1Ci5QXKSf7GbUSJ4K1AyPCId8xoYt0og7RnIHCAmya9wbOWv8q6hjBtQP3oy7+6HAPeg65HTHR0cVCiXKWpywZQP39RgZQQWMygHzxVCYAPjsZQDKAsl1CBpAMoHzv6I48E+ZNX34ONn31ChpvfhO1kGlK8oerEVK73o+el96IKK9X6RIgMoC6uwwgA6igMRlAvnhnwkTGr0LdLMjqYCVOBGsHRoRDRFOnMU7UoSOnKqdsvJU4EawdGBEOp/tOJL8TdcjmLMg5ic1zJqP59v8gCVlmedvdzXG053h0vXAEvvvuW6mbAMkAinSKGoYMoIJ+ZAD54slOKnzmihE6cqpyysZbiRPB2oER4VAZv1DFOlGHjpyqnLLxVuJEsHZgRDhC1V8qeZyoQzVn3skMbPliElr/8R6qIc8sf7OnDdYkD8e1t/4N0SVODYtoQwZQRCU1DBlABf3IAPLFU51U+BnKInTkVOWUjbcSJ4K1AyPCITNuoY5xog4dOVU5ZeOtxIlg7cCIcIS6z2TyOVGHXTmzjx3C9s+fRtv9HyEWhWb5672dkdvzbpzd/f9Qu5bYEz3IAMp0jrUYMoDW9CqFJgPIF8+uSYWf6U+EjpyqnLLxVuJEsHZgRDisjJdTWCfq0JFTlVM23kqcCNYOjAiHU/1mJa8Tddid88SRfdj52QR0ODgb0S6/WT5bR3CHpwWO1DoHUc37onGXAWhQrx5cLlcZecgAWukYOSwZQDndzCgygHzx7J5U+BnVr9crL4dqHbLxVuJEsHZgRDhExslpjBN16MipyikbbyVOBGsHRoTD6b4Tye9EHTpyMs5vPn0PjY//hIZHfkIdI71U+QHDhV3uxkhL6go07YuGnS9C06YtTENIBlCkU9QwZAAV9CMDyBdPx6TCy6ojpyqnbLyVOBGsHRgRDt4YhcP7TtShI6cqp2y8lTgRrB0YEY5w6D3ePjhRh46cp3OeSNuFfesXoGDXMtTOWIOG/v1lpNiLs7AvoQsKz+qGC3c8Z76fOe53JNVM4clW/L5ILRX9/RZOUgWAZAAVBpEMIF88kQ8in8UaQkdOVU7ZeCtxIlg7MCIc1kbMGbQTdejIqcopG28lTgRrB0aEw5lus5bViTp05ORx5mSkYu/6hcjZsQQ109egScHvcLuMMmKRAbTWP6JoMoCiSpWDIwPIF483AfAZrCN05FTllI23EieCtQMjwmF91EIf4UQdOnKqcsrGW4kTwdqBEeEIfadZz+hEHTpyWuXMz8rA3vU/4uT2JUhI+xktC7fSEUDr7SMcQQZQWKqyQDKAfPGsTgB8Rj5CR05VTtl4K3EiWDswIhz8UXIe4UQdOnKqcsrGW4kTwdqBEeFwvvP4e+BEHTpyqnDSNYD8PlFFkAFUUJAMIF88lQmAz14+QkdOVU7ZeCtxIlg7MCIcsmMXyjgn6tCRU5VTNt5KnAjWDowIRyh7TDaXE3XoyKnCSQZQtnvE48gAimtVBkkGkC+eygTAZycDWFIBEa3twIhwyI5dKOOcqENHTlVO2XgrcSJYOzAiHKHsMdlcTtShI6cKJxlA2e4RjyMDKK4VGUAJrVQmAIl0ZoiOnKqcsvFW4kSwdmBEOGTHLpRxTtShI6cqp2y8lTgRrB0YEY5Q9phsLifq0JFThZMMoGz3iMeRARTXigyghFYqE4BEOjKA8+ZV+txNkfHgYXjvy45bqOOcqENHTlVO2XgrcSJYOzAiHKHuM5l8TtShI6cKJxlAmc6xFkMG0JpepdB0CpgvnsoEwGcvH6EjpyqnbLyVOBGsHRgRDtmxC2WcE3XoyKnKKRtvJU4EawdGhCOUPSaby4k6dORU4SQDKNs94nFkAMW1KoPMzMxEjRo1sG/fPiQmJha/z5r++++/x6BBgxAVFVVuBh6G977Cboc01Ik6dORU5ZSNtxIngrUDI8IR0iaTTOZEHTpyqnLKxluJE8HagRHhkGyXkIY5UYeOnCqcpgH8d3tT98y/bkBSzWThMRDJyw7gNGrUCMePH0dSUpIwd1UCkgFUGM39+/ebDUQbKUAKkAKkAClACpx5CrADOA0bNjzzdtyGPSYDqCBiIBBAamoqEhISyjzMukePHli1alWl7JVhiv47Of3oosLuOhYqooXdO6cjpyqnbLyVOBGsKoZ6U61bRfS3mkGVUzbeSpwIVhVDvWm1c0rjRfS3mkGVUzaeF2cYBk6ePIn69evD7XZbLatK4MkAahrGdu3aYcuWLZWyV4apSs8pFNHC7mHQkVOVUzbeSpwIVhVDvanWrSL6W82gyikbbyVOBKuKod602jml8SL6W82gyikbLxtntb4zGU8GUNPovf7667jrrrsqZa8MU5UmMhEt7B4GHTlVOWXjrcSJYFUx1Jtq3Sqiv9UMqpyy8VbiRLCqGOpNq51TGi+iv9UMqpyy8bJxVus7k/FkAMN09KrSRBamEtNuSSpAvSkpHIVpV4B6U7vElKAKKUAGMEwHMz8/H5MmTcIjjzyCmJiYMN1L2q1IVIB6MxJH/cyomXrzzBgn2svwUIAMYHiMA+0FKUAKkAKkAClACpACIVOADGDIpKZEpAApQAqQAqQAKUAKhIcCZADDYxxoL0gBUoAUIAVIAVKAFAiZAmQAQyY1JSIFSAFSgBQgBUgBUiA8FCADGB7jQHtBCpACpAApQAqQAqRAyBQgAxgyqfUkYiuZX3TRRWDPPvT7/bj33nsxduxYPcmIlRSwoAB7is3o0aNx+PBheL1ePPHEE7j66qstMBCUFNCnwPDhw7Fo0SIMGDAAn332mb5ExEwKhKkCZADDdGBEd4uZPrb0QXx8PHJyctChQwfzEXTJyeIPzhbNRThSwIoCaWlpOHToELp06WKawG7dumHbtm2oVq2aFRrCkgJaFPjxxx+RlZWFmTNnkgHUojCRhrsCZADDfYQs7F9GRga6du2KNWvWICUlxUIkQUkB/Qp06tQJ33zzDRo1aqQ/GWUgBQQUYEcAX3vtNTKAAloRpOopQAZQ85guWbIEkydPNk0ZOyIye/ZsDBs2rFTWN954w8Sw99u3b4+XX34Z/fr1E96z48eP44ILLsCOHTtMHt4j6ISJCVilFQhFbxYJuHr1atx0003YtGlTldaUirNHgVD1JhlAe8aLWM5MBcgAah63+fPnY9myZebprxEjRpQxgB9//LF5nRQzgX379sW0adPw9ttvY8uWLWjcuLG5d+ecc455mvf07fvvv0f9+vWLf81Ot1155ZX44osvULduXc2VEf2ZrkCoevPo0aPmPzSsr/v06XOmy0b7HwIFQtWbZABDMJiUImwVIAMYwqFxuVxlDGCvXr1Mc/jmm28W70nbtm3No4TsUXBWtzvuuMO8KYQutreqXGTjdfUm+8dl4MCB5o1J7B8d2kgBqwro6k22H2QArY4G4auSAmQAQziap09kBQUF5s0bn376KdgdaUXbuHHjsH79eixevJi7d+yoX1xcHBITE8EehH7uuefiww8/BLveijZSQFQBHb1pGAZGjRqF1q1bY8KECaK7QjhSoJQCOnqzKAEZQGq2SFaADGAIR//0iSw1NRUNGjQwTxGXPDX23HPPmXemsTsmeRu7tnDMmDFgf2zZix0BZC/aSAErCujozaVLl+L8888v9c/I+++/j44dO1rZNcJGuAI6epNJevHFF2Pt2rXIzs5GrVq1zLMzPXr0iHC1qfxIUoAMYAhHu6KJbPny5eaRu6Lt2WefBftDuXXr1hDuHaWKZAWoNyN59MO7durN8B4f2rszVwEygCEcO52nMkJYBqWqggpQb1bBQa0iJVFvVpGBpDLCTgEygCEckoouZmZ3+bK7gIu2du3aYejQoVI3gYSwHEpVhRSg3qxCg1nFSqHerGIDSuWEjQJkADUPBVtpfufOnWYWtkjzSy+9hP79+5vXnLBlXoqWgZk6dap5Gnj69Ol46623sHnzZjRp0kTz3hF9JCtAvRnJox/etVNvhvf40N5VDQXIAGoeR3aXGTN8p2833ngj3n33XfPX7OjfCy+8YC4EzR7lNmXKFPPiedpIAZ0KUG/qVJe4VRSg3lRRj2JJATEFyACK6UQoUoAUIAVIAVKAFCAFqowCZACrzFBSIaQAKUAKkAKkAClACogpQAZQTCdCkQKkAClACpACpAApUGUUIANYZYaSCiEFSAFSgBQgBUgBUkBMATKAYjoRihQgBUgBUoAUIAVIgSqjABnAKjOUVAgpQAqQAqQAKUAKkAJiCkSEAZw0aRIeffRRjBs3Di+//LKpzIUXXojFixeXUumaa67BRx99JKYcoUgBUoAUIAVIAVKAFDhDFajyBnDVqlUYOXIkEhMTzfX4ShrAVq1a4amnnioeuri4OCQlJZ2hQ0m7TQqQAqQAKUAKkAKkgJgCVdoAstXku3XrZi60/Mwzz6BLly6lDGDJn8XkKo0KBAJITU1FQkIC2OOKaCMFSAFSgBQgBUiB8FfAMAycPHkS9evXh9vtDv8d1rCHVdoAsqdtsEeusSdrsFO+pxtA9rg11gR169bFJZdcgieffNI0c7zt9ddfB3sVFBTg999/58HpfVKAFCAFSAFSgBQIQwX27duHhg0bhuGe6d+lKmsA2bV8zz77LNgp4NjY2DIGkD1vt1mzZjjrrLOwadMmPPLIIzj77LOxYMGCClXPz88HexVtmZmZ5vN8t2/fXso4+nw+/PTTT+jXrx+8Xm+5fDwM7339rWFPBifq0JFTlVM23kqcCNYOjAiHPd2jl8WJOnTkVOWUjbcSJ4K1AyPCober7GF3og4dOVU4c3OykPxWN1PQwzf/guqJNYTFFcnLjv6xy8COHz8esZd+VUkDyBx99+7d8f3336Nz585m05x+BLCok9jp4cmTJ+PAgQMoLCwEM4a33npruY02YcIETJw4scx7s2bNQnx8vHBzEpAUIAVIAVKAFCAFKlbAV5iPEZvGmoDPO7wFb1SMrXLl5ORg1KhRYAdy2D0CkbhVSQM4Z84cDB8+HB6Pp3hM/X6/eZ0eO9fPjuKx9z7++GOMHj3avEawT58+6NixI6KioswjeuzI3unb6UcAT5w4gUaNGiEtLa1UA7H/Pn788UfzppPKjgBWhhHhOBMa1ok6dORU5ZSNtxIngrUDI8JBvVm+Ajq0U+WUjbcSJ4K1AyPCQb15ZvRmTvZJpLzeytzZQ7dvQUJSTeGhE+kD9ve7Xr16ZACFVT1DgOzQ7p49e0rt7c0334w2bdrg4YcfRocOHcz3evXqZd4k8uabb5qngZkBZMaP/VfAlo6paCu6BpCZSmYW6QjgGdIYtJukAClACpACZ4QCdARQ/zBVySOA5clW8hQwu3HjvffeM+8MZkf/2FG8Bx54AGwZmL59+2Ljxo1l1ggsyUkGUH9jUgZSgBQgBUiByFWADKD+sY9IA8iuEWRrA/7888/mKV921O+yyy4z7wKeOnUqZs6ciW3btpVRP1SngNPT9iHj8D789ttWdOzcBR5vNDweL1wej/nVXfTyeuFxe+H2st954PVGmae2PS5X2CxLI3Io3u4215FTlVM23kqcCNYOjAiH3WOqg8+JOnTkVOWUjbcSJ4K1AyPCoaOX7OZ0og4dOVU46RSw3V1Vlq/KG0Bm2tip3g0bNmDdunXmUjBsW7lyJXr37l1GkRtuuMF8b+vWrWXeC9VNIO5tc3BFzhdSox8wXPDBDT888MONQnjNr0U/+079HHAF32c/B4redzGsB37zPfaVvRf8meEDLNb83hv8+dRXw/zqheFmv4sC+9lwewG3B4Y7+DP7nr1c7PeeKMAdBRcztebXKNPUet1uuF0ALakoNfQURApSUXRJAAAgAElEQVSQAqRAlVGAjgDqH8oqbwDZ49927NiB+fPnlzKA7Nq91q1bg5m622+/vVhpdlr4119/LfcUcKiOAK7/7J9ouet9uA0fPC7jlJULwGMwWxZAlMuvvzMcyFBgeFCAKPNV6GJfo82v7OUzXzHwuYMvvycWAU8MAuyrNxaGJwbwxgJRcTA8sTiYfgz1mzSHNyYe3pjq8MbGIyq2OqLiqiMmLgExcdUQFxeLWK9b6Gipyn+yTErZeCtxIlg7MCIcDrSP5ZRO1KEjpyqnbLyVOBGsHRgRDsuN4kCAE3XoyKnCSUcA9TdelTaAzPT97W9/w+eff4727duXMoC7d+821wG8+uqr8cknnxQr3a5dOwwdOjT8bwIxAsCplxFg3/thGAEYfmYOAzACwZ8R8AdxAd+pr8Hfu8zfB7Hm96d+dhl+uAyG9cMd8MFt/vzni5lS9rvgK/i9Bz54jMKgQTXYMUUfvOxn+OE99XOUeayR/d7HbB3YzzEohNtl6O/yCjIUGh7kIqb4lYcY5LtikG9+jUW+OxYF7lgUspcrDj5P7CnjGRc0ncxwemPhOvXyRMeZhtIbmYvKOzaOlJgUIAWqngJ0BFD/mFZZA/j/7F0HdNTV8v42lSQk9Ba69N5ERREVRcUG6F/FiojYeAL2guWJDRXLU5+KgIJiR1AQC2BDxIII0nuvgYQkkEDa7v98N29jEnaT+6u7CTPn5IDZKfd+9z7e7MydmX379qFHjx5gS5jatWsrZ694CtjvABLiqlWrqibQDRs2xI8//ghOCGnatGlQ9KUIxKaL6fPBgwJ4CvLgLciHz5sHX8H/frz56vfgj5c/+fB48xBRkAuPNxcR3lxE8sfHP/PU3+l0Rvn4Zy6i1U8eYnzKnUMschHny0EV5DgaQT3sq4JDiMdhxCPLE49sTzyOeOKRE1H4kxdZ+FMQGQ9vdDx8UfHwRcfBE1sV0TEJiIsWB9Km2yVqBAFBoAIjIA6g84dXKR1Ajne74IILVEXvww8/DL+zV9wBPHDgAN577z3Vw2/atGlISUkB27qMGTNGVQcHIrdSwFZShs5fGWMWrKQAjFn6h7tcmwW58OZmISf7MHKP8CcLeUcPI+9oFvKPZqEgJwvenMPqBzmHgLwsROQcQt6hVFSN9iKmIBsx3mzEerMR5z2CeBxREU2rxPebGUhABhJxOCIR2VFJOBpVDel50YitkQzE10REfA1EVa2F6Kq1EVe9LpJq1UetxHhUiY7USjOXi41GulpHh1Us3JAPxT6csGlVp1l5I3I6vHbw6Ohw425ZtRGKfThh04pOSQFbvUXly1coBzBYEUbxbXL026JFi/D222+ryN+ff/6pPma3719++UU1fPbT9u3bMWLECHz//feqBQwjgF6vV70BDERuFYGUf2zCEW4IRKjo5FH4crPhzcuGLy8byMtGZP4RRORnIyo/G9HebOU80nGsQufRl414XzbdPVTFUdNbOuirijQkIR3VkBmRhMMRSTgSVQ05UdWQF5MEb0wSfLFJiKiShPjYWMRFSqGNabBFUBAQBFxBQCKAzsNcoRxARu34UxY1a9YMAwcOxLfffls0+YP8/kkgnPzBNi/8b1YE16lTBy+88AJSU1PVe0A2kea3lkAkEUDjF9LKN0Dj1golnLBpVWe58kyDZx9EduZ+ZKcfwNHMA8g7nIr8wweQtnszarG+JTcDMXkZiMvPQHxBJpJ8maqG2wgxRZ3iq4GDUbVwOLoOjsbVRUFCfURUS0ZM9WRUrd0IVWvWx5qli9Hv7MCTbMrdi5EFhZA3FPtwwqZVnWbljcjp8NrBo6MjhFdO23Qo9uGETSs6JQKofV1MM1YoB1B3l+PGjVPzfTlqjaPfdu/ejfPOO0+JL1iwAKeffrqqCr7ooovAnoDJycnqM/73nDlzyh0NI28AdU9C+BxFwOdFVH4WPDmZ8B7NAHIzEZWbiejcTMTmZyCuIBOJ3kwkeTNQHRmogjyt5RT4PNiP6tiPGkjz1ERmZA0cjqqBo7G1kVelDjzxtVElPgmJMew3qaVSmAQBQUAQMISARAANwWWKuVI6gK+++iqee+455dyRihd8vPPOO7jhhhtUpS/fBDJSSCdx9uzZeOihh5CXl6dSwpzjG4zEATR110QolAj4fIjyHkVUbgYKstOBo2mIyklHbN5BxOcdRFJBGqp7D6KWLx1RGm2GjvqisctXB/siaiMtsg4ORdfBkZjayK9SG4ivjfiERFSNFgcxlEcutgWBioyAOIDOn16ldABZxcv07tNPPw32AVyzZk1RA2j+7sEHHwRHw/F9IAtGOD2jdevWGD16NIYNG4YpU6bgqquuOgZ9SQEbv5BWUgDGrRVKOGHTqk6z8kbkdHjL5fF5kZ+xB798NwctG9VBbvpuFGTsQcShXaiSvRvVcvagpjdV9aMsi7J9sdiFOjgQ3QCZ8U2RX/0ExNRtheqN2qBhw6aonhBj9nhtkysXC9ss/aPICZtWdZqVNyKnw2sHj44OB47VdpWh2IcTNq3olBSw7dfqGIUVygHULQJhyxdG8OgIsqiDRIeQqWDO/L3vvvuK0r2lEeFoOM4JHjx48DFgSRGI8xdSLIQ/Ah5vPmJy0uDNPoCI7P2IyTmA+JwDqJa/H7W9+1UUsaz+jod8cdiG+tgbUR8Ho+vjUGwD5PMdYkI9VEuIQ0xk+GMgKxQEBAFnEZAIoLP4UnuFcgD9RSBM8SYmJoK9/qZPnw5W/vqJRSBHjhzBRx99hJ49e6pf7927VzWE3rhxIz7++GNV7MGRb2wDw5m/SUlJii89PR3t2rULmgKWCKDxC2nlG6Bxa4USTti0qtOsvBE5HV47eMrVkZ+D/PSdSN+9CYf3bkDB/o2IydiCake2o07BvjKjh/t81bEroiHSEk5Abs02qNKwI+o074ImDeoiOtLeDtvl7sPsBSxDzgmbVnWalTcip8NrB4+ODgeO1XaVodiHEzat6JQIoO3XqmJHAEuvnqlapm3puJVHV199tXIK09LSUL16dTz77LN44IEHVHq4bdu2SpzO4ZAhQ1RPQL9TGEivvAEsD235XBAIjADb5UQfSYH38F5EZe9DwtE9qJG7F/W8e1ELGUFh2+mrja2exkiJbozMuEbIT2yM2Gr1kBgTJYUoctkEgUqIgEQAnT/UChUBNOIAvvbaa6rnH6d8MEr4yCOPoFu3bkV9Ab/77jucc845qFKlChISEtC4cWPs2rULV155JRhhLIvEAXT+YoqF4w+ByPxsRGbtBQ7vQZWsHaiRsxMN83egDg4GBCPHF4WtSMaOyEZIjWmMrIQm8NRohupVExEh1cnH3wWSHVcqBMQBdP44K60DyBQvI3q5ubkKRb4B/PXXX5XDR2Lqd+bMmartiz+FzBTvvHnzlGMYiCQFbPxCWkkBGLdWKOGETas6zcobkdPhtYNHR4fZswsk58tOQ9q2FUjfuhzefatRNWMD6udsRgKOBDSzw1cXO6q0QVbtzqjStAcatj0J9WrVVH1Bi5Pb+5C7+YN6mx0VFRXw3HTOozye8j638146qSsU+3DCphWdkgJ28oYV6g4bB1C3wOPEE0/EU089pRw3VvGybQsreUsTnbo777wTf//9d9HnHA/3ySefFLFy4se//vUv/PHHH6hZs6aKFrZp0wazZs0KiLwUgTh/IcWCIKCFANvaHD0AX8ZORGftRLUjO9AwbxsaY88x4uxruAUNsSWqOVLjTkBO0gmoUqMRqsREa5kSJkFAEHAfAYkAOo952DiAulM+GMF77LHH1Ds+9vDjT2kHkNM8mjZtqnr98Z0fv4Vw5NtPP/2Ebdu2oUmTJsjMzFStX/iNlPN/169fr1q/UC+LSwKRRACNX0gr3wCNWyuUcMKmVZ1m5Y3I6fDawaOjw+zZWZVjj8OU9X8gY/OfiN63DPUPr0Ed37HTg5g+3hLZDFsjmqJKyz5o0PksNGra8pgoodX1lJZ3AjurOs3KG5HT4bWDR0eH3WfqhL5Q7MMJm1Z0SgTQiZtVUmfYOIBmtnrTTTdh8uTJxziAjAyyApizfvm2j8SCkaFDh+LHH3/EGWecgTfeeEP1A6SzFxsbq3g6deqkHMGjR4+W+X8E8gbQzGmJjCAQGgQ8R9PhS9+CKplbUPfoJjTP34LqnsPHLGanrw7WR7fF/oS28NZsjbikuvDIY8LQHJpYPe4RkAig81egQjqAdOxYzfv444/j888/VxM9SC1btiwq+qCzx7m/rBJmP8Dhw4er9jAZGRnqDQodRL4Jev/999U7wWnTpoEj5EibN28GewkGI3EAnb+YYkEQcAwBPhnJ3g/fwS2oemgTGuesQ0vvVkR6Sj4l2eurgfVRhQ5hfs3WiK2WLA6hY4ciigWBkgiIA+j8jaiQDiBHuU2dOvUYdDj7lxM++Cff//GNn78RNN/4MfrHKB+J6V9G/+j8xcXFoUOHDrj55ptVf8BFixahV69ex+iXFLDxC2klBWDcWqGEEzat6jQrb0ROh9cOHh0dZs/OTbni+yjIOYydK35G1saFqLF/MZrnrkdMqZF4aUjCloQuyE0+GbXan4mGrbrBE2GsN6ET2FnVaVbeiJwOrx08OjrcvGNmbYViH07YtKJTUsBmb4++XNg4gLpFILVr18YTTzyhmjXv3LlTOXgPP/ywescXE1M4XorvAjnJg6lcvg9kGrhGjRrIzs5WFb90+Dp27Kgig4GI1cKnnHLKMR9JEYj+xRJOQaAiI+DLz0HegU2Iz1iHhkfWoq13I6p48kpsab+vOlbFdEFq9S6IqNseETHxFXnLsnZBIKwQkAig88cRNg6gbhEIo3hs78KCjWXLlmHs2LGqjx/TvePHj1eIXXrppZg7dy6++eYbNGjQQFUMMxVMB5FvAekcnnbaaar6d8eOHUUoM2J47rnnBk0BSwTQ+IW08g3QuDWJADL6La029G6OkbuZe/QItq1ahEPrf0bivsVolbMK8Z6cIkN5vkhsqtIBhxqdgfrdLkCt5l0QqEO1EZt6u7Ae8Ta7JiNyOrx28Ojo0MU1lHyh2IcTNq3olAig8zcwbBxAM1v1TwJh9I9FHXy7R2Ij56efflrN/vX3/urfvz/mz5+vUsecCuIfBUenzh855HSQV155RUUWS/cMK74+eQNo5rRERhCoPAjk5+UiZ/961Di4HG1z/kZzT8n2M/tQE2tjuyCzRmegTnt4o+Iqz+ZlJ4KACwhIBNB5kCukA+gvAmG/vueff15N7+C7PUb02Mtv7dq1qvHzjTfeiDvuuEOliRkVYeuXLVu2qKjg66+/rlrDxMfHKxmmidkcmmneu+++u0zkxQF0/mKKBUGgoiDAmpLD6fsQc2AFmmQtR1fvqhLpYkYH10S1xZ6qnZFXrysKEhpUlK3JOgWBkCEgDqDz0FdIB7C8IhDCxokerBJeuXKlKgrg+z9W+jL6R/rtt99UsQjHxJEnIiJC8fFdIAtEApGkgI1fSCspAOPWCiWcsGlVp1l5I3I6vHbw6Ogwe3Zuyjm1j4OZmdiweB58G+ejRcavaIKSfUU3e5rgcKsBaNz7KsTWDt5tQBcLq/swK29ETofXDh4dHbq4hpIvFPtwwqYVnZICdv4Gho0DqFsEwkkgfmKKlz39+DNp0qSAaPHN4EUXXaQifkz7BiNGCbt3744+ffqoNHAgkiIQ5y+kWBAEKhMCBT7gYOpexKUuR4vsZejuW4PoYtXF6yNaYHu1k5FX/yTkVqlZmbYuexEELCEgEUBL8GkJh40DqFsEsnfvXlUFzCKPXbt2qQIQtnxhJbD/LV8wR43p3qysrCJgPvvsMzzyyCPYtGkTWrRogYYNG6oegV9//bVEALWuT/lMVr4Blq89MIcTNq3qNCtvRE6H1w4eHR1mz85NuVDsY/2WrVj+1SS0y/4D3b0rS/Qe3BLfCfltByD5lMvhqVpXGwqr+zArb0ROh9cOHh0d2sCGkDEU+3DCphWdEgF0/gKGjQOou1VW9r799tvqzV+3bt3UO79bb721RBXw4cOHlYPIymA6hmwKffbZZ6vmzywcIbHVy+mnn66cyUGDBmHGjBmqlQyjhbNnzy5zOfIGUPe0hE8QEAQCIcB3g/vTMxCz7090zP4NPTzritg4u3hddHvsq3kSsuueiPzoRAFREDjuEJAIoPNHXuEcQH/al/N83333XURGRqr0Lh07FoeQmPa98MILMWrUKIwcOVK96zvnnHPw5Zdfqt+T2AeQc4U/+eQTVRzCtC91kI/OY1kkDqDzF1MsCALHCwJME+9NPYiElD/Q9chv6BKxqWjr+YjE2ugO2F/3dByq3QO+iKjjBRbZ53GOgDiAzl+ACucA+mf6Bv5WXTjKKViRCN8K0jkkJSYmIjo6WqWEq1WrpqKJbdu2VaPltm3bFhB5KQIxfiGtpACMWyuUcMKmVZ1m5Y3I6fDawaOjw+zZuSkXin2UZzMnvwBL/l6OzL8+Q9u079Des7UIkvSImkhrfTnqnXETPNUa/eMk5uergray+j+WhWt5awoma0ROh9cOHh0dbt4xs7ZCsQ8nbFrRKSlgs7dHX67COYClt8b3eyzeeOGFF3DTTTcds3M6bWz78sADD+C+++4r+tzfFNpfFcwPPvjgA5UupkwgkiIQ/YslnIKAIGANgaP5wJ6Uvahz4Bf0y/8JdT3pSmEBPFgd2w0HGvRFZvWOgMfYODprqxJpQcAdBCQC6DzOYeMAGqkCvuSSS9QUEM7yLSgoQLNmzbBgwQIkJycrxDgCju8ClyxZUjTujanj+vXrFyHK6B+/nZQmOobBHECJABq/kFa+ARq3VijhhE2rOs3KG5HT4bWDR0eH2bNzUy4U+zBrc3NKOpZ//wlabPsEJ3v+GWF5ICYZRzpegxV5zdC73yWqiM0omV2TETkdXjt4dHQYxScU/KHYhxM2reiUCKDzNy9sHEDdKmC+23vppZfQsmVLNd6NPfvS09PV5A4WhpCY1r3nnntUZJCRPzp1e/aU7NRfr149pKSkqObPSUlJSm7ChAmqwCRYCth/HPIG0PmLKRYEAUHgWASOFgDbd+9GkwM/oL/vZyR5shVTLqKxJv4kpCWfjcyqLQKOoRM8BYGKhIBEAJ0/rbBxAI1sle1f+N6lR48eqrkzZ/0OHDhQRe4Y2fMTp36ccMIJOPnkk1Xj5+JEeb4HPHjwIKpXr64+4rg4/v3DDz8sczniABo5LeEVBAQBuxFgFfG29BxE7v4dZxydj04R/7wV3B7ZFLvq9kVqnV4oiKxit2nRJwi4goA4gM7DXOEcwNJVwKzgvf/++8H+gBwFV5zY449vA/v164cvvviixGevvfaaGhNXo0YNVUnMQpCtW7fil19+UQ5jIJIUsPELaSUFYNxaoYQTNq3qNCtvRE6H1w4eHR1mz85NuVDswwmbO1MP47NPP0DHQ9+jn3dR0Ri67IgEZHa6EUln/guILcxyBCKzazIip8NrB4+ODjfvmFlbodiHEzat6JQUsNnboy9X4RxAnSpgbp+TPZo2baocPEYBWd1bnJj6ZSqZfQUZUeQ8YKaSf/rpJzUNJBBJEYj+xRJOQUAQcBeBfC+wfv9hVNu7EP3zv0PziMIRdIcRjzW1L0BKcj/kR8a5uyixJgiYREAigCaBMyAWNg6g0SIQFnjs379fOW58+NypUyfMnz9fvQUk+Xw+Ff0bO3Ys2BiaUz5uu+02PPTQQ0Xw0Nm76667VKEIC0ioiwUls2bNCgihRAAN3Kz/sVr5BmjcWqGEEzat6jQrb0ROh9cOHh0dZs/OTblQ7MMJm4F0rt6dgSVzp6Hv3nfQKmJXoSMYmYSjPW5D/Kk3AzHxRVCbXZMROR1eO3h0dLh5x8zaCsU+nLBpRadEAM3eHn25sHEAjRaB9OrVS7V3YfSOqdy//vpLFYHw9yQ2gGZDZzp+TPE+99xzoA02eibxfSCbQQ8fPhy33HKLSv3yT+rcuXNnmQjKG0D9CyacgoAgEDoEdh32ImvrH7g0ZyZaRBQWwmV4krC+7kXYW78vvBExoVucWBYEykBAIoDOX4+ADmBGRgZmzpyJn3/+Wb2Ly87ORp06dVSz5PPOOw+nnnqq8yszYGHy5MmqB+C8efOUg7dmzRp07twZK1euxDPPPKNSu6VTwHw3yEgfef3EVHFqaiq4/7JIHEADhyOsgoAgEHIEtmUWIGfbr7gi93M0jUhR6znoqY6N9S/C3rpniiMY8hOSBZRGQBxA5+9ECQeQrVIeffRRvP/++6pn3kknnaQiaHFxcUhLS1MOFVOvfFv32GOP4corr3R+haUssNCDP71791bv+9gPkM4f07x09GJjY1W0j+PhLr30Urz55pvqPSArfNk2htNASC1atEC7du3UO8Dc3FxVTTxu3DhERESoPoLFq4n9S5AUsPHjtpICMG6tUMIJm1Z1mpU3IqfDawePjg6zZ+emXCj24YRNIzr/3JyCFd9MxoBDH6CR54CCOzO6LtbVuQBtLn8EUbH/pIbLOwsjdnV47eDR0VHevsLh81DswwmbVnRKCtj5m1jCAaxbty6uv/56NUqN6dFAdOTIERVNe/nll3H55Zerfntu0ooVK9SM319//VU5aiSu+7vvvitaM5tAs6dfIOLbQFLt2rXVO0FGN+ngdujQAQMGDMC9994LVhozFVyapAjEzZMWW4KAIOAEAvwncH16ASK2LcA13i/QwJOmzKRG1MamBgOwt85p8HmMN5R2Yq2i8/hFQCKAzp99CQeQRRVM9eqSUf6y9BopAqEevudj6xc6bZs3b1YRQU4DYRHIzTffjIkTJ+LEE09UUcuaNWvi4osvVk7h2rVr0aZNGxXh5CSRQMRIaPGpIX4eiQDq3ox/+Kx8AzRurVDCCZtWdZqVNyKnw2sHj44Os2fnplwo9uGETbM6+QX4xzW7sGXeBFxxdHrRqLmDcc0QM/A/8DQ+qczjMGJXh9cOHh0dbt4xs7ZCsQ8nbFrRKRFAs7dHX65CFoH4t8dI4IYNG/D111+rX/mLQDj949lnn8XgwYMxZswYrF+/HkOGDFFpYhaGsC8gnUC+byw+9eOrr75ShSCMCgZKAfvtyhtA/QsmnIKAIBDeCHh9wMr9eUjc9T2u9c1GbU8mvPBgZY1zsb3J/6EgIja8NyCrq5QISATQ+WMN6gAGa4XCCBvHsXEUW/PmzZ1fYRALdPrYwuWzzz5T6VvSDz/8gDPPPFNVBbPRM9u7tG/fXn1GZ/GVV14pigBecMEF+Pbbb9UsYT+xTQzfFDK9XBaJAxiyYxfDgoAg4BACBT5g+d5sdNn9PgZF/Kys7I+oizXNh+FgUjuHrIpaQSAwAuIAOn8zgjqALIags+d/M+dfiv93/JNpV74HZDGGW8QCEPb74xtEVv8yqnf11VejcePGKhrIIpDrrrsOs2fPRpcuXRQfi0D4rpHpYKaL6bg+//zzuO+++5CYmKjeADLlu3r1anz00Ue47LLLAm5HUsDGT9lKCsC4tUIJJ2xa1WlW3oicDq8dPDo6zJ6dm3Kh2IcTNq3qLC2/LzMHM6ZPw1X7X0Ty/94H7m9zDRLO/zcQW7XoiIzY1eG1g0dHh5t3zKytUOzDCZtWdEoK2Ozt0ZcL6gCyqILp06eeekpVA5PofD388MPgiDWOTmO6lGPT6Ii5RcuXL1dzgFmMQseObxbZt4/RvHPPPVctg3/y9ywSYco3ISFBVf9+8sknRWlizgamkzhjxgxs2rRJpXzz8vJU1LBVq1YBtyNFIG6dstgRBASBUCLAQpEVKUfQZsfHuCLye7WU1IhaWN3sRqRV6xTKpYnt4wQBiQA6f9BBHUBWAb/11lvH9Pxjw2QWWdBRYiTuxhtvxPbt2y2vVLcIhO/8Pv74Y1XwwW8X7E3IXn6M3Pnb0px++ulYuHBhwDUxvXvKKaeoz4pPAmHVL/UNGjRIpYoDkUQAjR+zlW+Axq0VSjhh06pOs/JG5HR47eDR0WH27NyUC8U+nLBpVWdZ8vsP5eDTzz7GlXvHo3HEfnU8+1v+HxIueBL5UQnq2Q2/kHMaU1mks0Y7eHR0uHnHzNoKxT6csGlFp0QAzd4efbmgDiDToosXLz6mHQzbsDAiyAgcCyjYS49FE1ZJdxIICzsYuWMKmhFAEtPUnPZxzTXXYOrUqar/HxtZ00H1vw/kuhkZ9KeAA00CoWPLtPHSpUvL3I68AbR62iIvCAgCFQUBRgNX7c9B0x2f4tqIuWrZByNqYHXToThQvWtF2Yass4IhIBFA5w8sqAPI9318H/fuu+8WtYZh2xf2CczKylIRODpYt99+u6qydYsYbczMzFRTSviO78EHH1QRSf6dzmGjRo3w5JNPqjQ1U9Y9e/ZUS2NVMCN7TBfTeSw9CYROZL169RRvSkphp/xgJA6gW6ctdgQBQSBcEDiUB6zeuB7DsyeieURhC621iadic7NrkRf1z9vAcFmvrKNiIyAOoPPnF9QBXLduneqxx0gZCyzoNNH54ri0L774Aq1bt1YFIIcOHVJFF24S+/f16NFD2ec7P6Z8i6eA+U6Qkbz4+HhVFMJG0Vz7E088gbvvvlstldNMmD5+8cUXlUNJ55DOLonRTZkEYs+JWkkBmF2BEzat6jQrb0ROh9cOHh0dZs/OTblQ7MMJm1Z1GpWfv2Ib0r9+Ctf4vkSkx4fDUTWB/uMQ0e7ioMenY8MOHh0dbt4xs7ZCsQ8nbFrRKSlgs7dHX67MPoCMirG4ghE+/r1t27aqhx4rhENFXAdbuJx22mmqIIVv/Uo7gEwnM+LHCCUre2NiYlTUkulhv7Pqr1xm+poFLXQGWf3LwhaZBBKq0xW7goAgUBEQOJwHrNi4GcOyJ6JVxC615FVJZ2LTCdfLFJGKcIAVYI0SAXT+kLQaQTPKxkgao4BOkZ1FIFwjK36ffvpp5byyIpipYUYrGR0kMarJdHAgkkkg9p2ylTympCEAACAASURBVG+AZlfhhE2rOs3KG5HT4bWDR0eH2bNzUy4U+3DCplWdZuUp99/pc1Fvx5cY4v1cRQP31z4ZCVdPAapUL3GUOjbs4NHR4eYdM2srFPtwwqYVnRIBNHt79OWCOoAssGALmDfffFONTKMjxfQv39Y1a9YMw4YN07eiwWlnEQibRF9yySV49dVXVeEHq4RZIMJoX25urloNU8R0BpnqTkpKUr+TSSAaByUsgoAgIAgUQyArD1i37m/cl/saEjw52BuZjOWt78SRKoVvqoUEATMISATQDGrGZII6gGPHjlUpU/45fPhw1USZDiAjay+99FK50zKMLUOfW6cIhI2h2dPv008/LVLMVgUsHOHvGcm86qqr1LvBgwcPonr1wm+rMglE/xyEUxAQBAQBPwKcIrJk0w6MyHxBNY/O9CTirxajkJHYWkASBEwhIA6gKdgMCQV1ADnqbcKECTj77LNVNfDff/+tHMC1a9eiV69eynEKFZVXBHLiiSeqcXUTJ05U7xXZNobzgTn2jUUtjGB++OGHaoIIo398I1i7dm1s3LhRJoHYfKhWUgBml+KETas6zcobkdPhtYNHR4fZs3NTLhT7cMKmVZ1m5QPJfb7wb3RaeBs6RWxBHqKQec54xHW/Uqs3p846yuMp73M375cVW6HYhxM2reiUFLCVG6QnW2YfQDp7rJYt7gCyqIJ9ADmCLRSkUwQydOhQFb3ku0VW8zZp0gRpaWng2z42kqYDy9QvHcQvv/xS9Qakw8g3gmwO3adPn4Bbk0kgoThxsSkICAIVCYFNaTnotGUC+kX8qZb9Z62B2NV4EODgG/KKhI+sVQ8BiQDq4WSFK6gDyCja6NGjce2115ZwAB9//HFVXct0qp1kpAiEM3w5laM4cdbvO++8o35FJ5ERP7Z2YcqX7xn9M41///33otF2xSeBJCcno2rVqio6OGvWrIBbk0kgxk/cyjdA49YKJZywaVWnWXkjcjq8dvDo6DB7dm7KhWIfTti0qtOsfFlym1IOYfm0+3BN/ufqSHc36o8ltS7DGWefF3RqiM46yuMp73M375cVW6HYhxM2reiUCKCVG6QnG9QBZNqULVPYaJnvAOn4MWrGXnmMmrEdjJ1kpAiEfQiZ2vVXJTO1W3wSiH9d/D1bxpCP7WxITB+zL2CgSSBsAcORcMGqg/16pRG0nScvugQBQaAyIsBWMXvW/IxR+W8j2lOALdGtsLbNKORGFxbdCQkCZSEgEUDn70eZbWDoNLGVypIlS1QUrXv37nj00UdVZW2oiEUgnOVL55Q/7Nl33nnnYfr06Tj55JNVuxc/vfHGG2puMNfMt4ycCsLpIKTSk0D4O75xTE1NRUZGRpnbEwcwVKcvdgUBQaAiIZDvBVauX4PR2f9BNU82Ujx18Hebu5Ad17AibUPWGgIExAF0HnStPoDOL8OYBaZpmY5lSxeOb2Obl+Jj3xhNZAuY119/XUUsJ02ahBkzZqjUNR1BUosWLdQcY1Y0U8+0adMwbtw4FVlk30OZBGLsTIJxW0kBmF2BEzat6jQrb0ROh9cOHh0dZs/OTblQ7MMJm1Z1mpXXlePzm+nzfsQZf92JZhH7kOVJQO6AiYhtfVaJ49bRVx5PeZ+7eb+s2ArFPpywaUWnpICt3CA92QrpANJpYzSS0zzYu49p6oEDB2LmzJlq17t27VKj6vypYU4w+euvv0q0fGHVL/9hYm/AuLg4dOjQQY2+u/fee2USiN7dES5BQBAQBLQRWJ9yGGft+A9OjFiHfETgt/pDkNqgpBOorUwYKz0CEgF0/ohLOIB0qHSnfbCq1k7SLQJhcQojgNu2bTvGPCN/tWrVwl133aX6FtIBZPqa30I4Cm7BggVqbBypefPm2Lp1a8AtyCQQ+07WyjdAs6twwqZVnWbljcjp8NrBo6PD7Nm5KReKfThh06pOs/JG5Py8DVp3Qeond6C/b4E66p2tb0DNAU8Bngit4q3ybJb3uZv3y4qtUOzDCZtWdEoE0MoN0pMt4QCydYqf+BbuySefVO/r2DaF9Ouvv6piCk4DufPOO/UsaHLpFoGwXYt/EgkbVJPosDEi+Ntvv6l3gJ07d8aKFSuUM8uULiN9fMNIGjNmjNoXW9ksXrxYpYUZ/SPJJBDNwxI2QUAQEARMIpCR40Pumtm4yTddaVge3wtbWw+XGcIm8aysYhIBdP5kg6aAL7vsMnB6xr/+9a8Sq3jttdeU0/T554Xl/aEgOoBsUcMfEquSL774YhUVZM8/rm3QoEGYN28e6tevrxy9G2+8UfH628DceuutqtH10qVL0bVrV/WZTAIJxWmKTUFAEDjeEMgtALat/Q2jciaoCuHVsV2xqe2/4I2IOd6gkP0GQUAcQOevRlAHkD3xli1bBk4EKU4bNmxAt27dQtYImlHICy+8UEX2GF7mGDemo8844ww18YPEhs6s6B0xYgQeeugh/PDDDzj//PPBt4CMDEZFRak+hmz4zH2y4KNmzZoqJcyqYTq/gUj6ABq/kFZSAMatFUo4YdOqTrPyRuR0eO3g0dFh9uzclAvFPpywaVWnWXkjcoF4C7w+TP9kKq7a9iiqePKwPbEblje7FX36XWC6V6CRNbl514zaCsU+nLBpRaekgI3eGuP8QR1ATgBh9I9FEcXp+eefB6OAgd7gGTdvXILFHIzuMUXNy8V3i2zbcsUVV2DKlClFCletWqWKOtjvjylg/ixfvhydOnVSPEw5P/bYY/juu+/UJJCEhASlh1XDbH4diGQSiPHzEglBQBAQBIIh4PMBGzavxy0ZLyDJcwRbIpthdbt7kC+9Ao/7SyMRQOevQFAHkM7UsGHDVOTM/waQb+y++eYb1VaFkzfsJCNFILQ7Z84c1aCaTh0jehxN5y8CYSPnjh07qvYunARCJ9E/85dFIaz6JZWeBEKnl44ldQYiiQAaP3Er3wCNWyuUcMKmVZ1m5Y3I6fDawaOjw+zZuSkXin04YdOqTrPyRuTK4/16/nycsWQEansysTe6MeJu+AzRNRofcx3K01Pe527eLyu2QrEPJ2xa0SkRQCs3SE+2zDYwfC/HcWrss8cIWvv27TFy5EhVaGE3GSkC+eyzz8ACEDap7tu3L/bu3atSwP4iEK754YcfVm8V2Sdw48aNuP3227Fp0ybV72/w4MEBJ4HwXSAnipQeM1d6r9II2u7TF32CgCBwvCOwdfdeXL73WSR7UrEPtbCkzX3Ii29wvMNy3O5fIoDOH32F6wPIbxQsAuFoOkYoSaWLQNgEms4hp4T429qwd+Ddd9+tHMCrr7464CSQLl26qHF3bARdFokD6PzFFAuCgCBw/CGwc38q+u94Did49iANSfitxb3IS2p6/AEhO4Y4gM5fghIOIHvl8S2cLhnl19VbFt/kyZNx0003gSljFmzQyaPDduqpp+L7779XomvXrlWVvaz8veOOO1SEkFG/gwcPqreLnPfbpk0b1QuQjiELSlhAwobSbBcjk0DsOKlCHVZSAGZX4YRNqzrNyhuR0+G1g0dHh9mzc1MuFPtwwqZVnWbljcjp8Pp56jVuhmqzhqAdtuAwEpA5YAqqt+mt9e+Jjh0375hZW6HYhxM2reiUFLDZ26MvV8IBpGNEh4nv+5KTkwNqYSqYqdUXX3xRVdHSaXKTnnnmGVXZy8geq3e55sTEROUIskKZ1bwktoBhpI+pZRInf3BeMFPFJLaHobNHJ5ZpX04OYXUx3xVSF/WWJikCcfOkxZYgIAgcrwikHspGlw0voYdnHY74YvBj4zuQW6fL8QrHcblviQA6f+wlHECmP/l2btasWSqCxqkbdATZfJnRs9WrV6tm0HS86PjdfPPNynmyg3SLQNavX49rrrlGVShz/i8LNuLj41URCN/+3XLLLaoaeOjQoQGXtW/fPtStWxeNGzcGi0UCkUwCseNEC3VY+QZodhVO2LSq06y8ETkdXjt4dHSYPTs35UKxDydsWtVpVt6InA5vaZ7dB9Kwf8r16OVdgjxEYnvv8ahz0v+ptl7sUcviv9KkY8fNO2bWVij24YRNKzolAmj29ujLBXwDSMfo008/VaPT2BvvyJEjKoLG/n+cDHLBBReotKmdpFsEQgeUhR+M+j333HPq74xKXnTRRaoVzFNPPaXWy5YuxYktYegw+qN7fO9H55FOLyuESTIJxM4TFV2CgCAgCFhD4HBuPuqunoh+vl/h9Xkwr84NONpY5gdbQ7ViSEsE0PlzqnBFIGz6zHm/Q4YMKer7x1YvjRo1whNPPKGikqVp//79KqXL2cDsC8gikquuugofffSRimyymTRJJoE4f+HEgiAgCAgCRhDIyfMibvV7uNj7nRKbX/1KZDW/0IgK4a2ACIgD6PyhVTgHkFE8tqFhbz/+ZGZmqhR1dna2avfC3zGSx1Rvz5491aQPzv595513lNyiRYsUqh9++KF6I+jvD8gIJ+XpFMokEPsunpUUgNlVOGHTqk6z8kbkdHjt4NHRYfbs3JQLxT6csGlVp1l5I3I6vGXx5OTlY9Hb9+HCjA/VFVne5Hq0vHIc4PGUuDI6dty8Y2ZthWIfTti0olNSwGZvj75chXMA6aAxescUsH8cHJ08Vu5yogeLQPhGZMyYMerNInv6sdijQ4cOqkrYH+1j6nfixImqhQzl6ERyhBybQ7O4JRBJEYj+xRJOQUAQEATsRMDrA7LWfI1rcwqdwIVVzsKBNkPgsfk5kp1rFl3mEZAIoHnsdCXDxgHULQL5/PPP1Tu/QPTAAw+AVcI//vijau/CaCFTvHQCmR5mgUtxYkPpRx55RDWIbtGihWqBw1Qxi2ACkUwC0b1W//BZ+QZo3FqhhBM2reo0K29ETofXDh4dHWbPzk25UOzDCZtWdZqVNyKnw6vDw+c+M98ai+sOT0akx4eV1c5Cs2HvICIq1rH/7bt5J/22dLCwe11O2LSiUyKAdp/wsfrCxgHULQJhYQoLUegI+ieS0InjDF82emYDaP6wEKR///7KEWThCCt7KXPxxRcrFPi7008/XTmGnC08c+ZM5SCyOpiFL2WRNIJ2/mKKBUFAEBAEgiGQtnkxrkl/HTGeAiyL7IRt7UYC0YVOoFDlQEAigM6fY9g4gLpb5Zs/tnGhE8ZJIPxG2LBhQ/UGkL0JixeBsDUMI3qMCn799ddqLNzbb7+tTF155ZXq/SB/7yf2BmRFMd8PigOoeyLCJwgIAoKA+wik7liJwfv/g3hPDlZHtML6tnfBE6s/yMD9FYtFIwiIA2gELXO8ZTqAP//8MyZMmKBSpGyiTEfrvffeUxM0evcu7MweCho9erRaD505Tv0YNWqUalPDHoEsAvETp4awXyBbvzDyd8opp2D8+PHqY/Ix8sd+hrm5uWpE3Lhx45QeVg0HIkkBGz9tKykA49YKJZywaVWnWXkjcjq8dvDo6DB7dm7KhWIfTti0qtOsvBE5HV4zPEt/nY+OC25FNU8WtkU2Q/R1n2Dx32uD9gl0835ZsaWDhRX9gWSdsGlFp6SA7T7hY/UFdQD5Pu66665TTZfp9LGg4oQTTsDrr7+uCidYaRsqYtSPjhvXlZqaqgo7WLzBQo/ixPFwdFbp6HEff/31VxEPG1jXqVNH9QuMi4tTv+/Vqxf+85//qDeDgUiKQEJ14mJXEBAEBIHACGTs34H+O55HHU86dqIeFre6DxFV6whcFRwBiQA6f4BBHUA2fb7zzjtx/fXXq4rbv//+WzmAy5Ytw/nnn6/m69pJukUgTOuyC3wgYtEHW7+QmMp94YUX8PLLL2PXrl0q4nfPPfeoMXIkTjPht5PSFBMTE9QBlAig8RO38g3QuLVCCSdsWtVpVt6InA6vHTw6OsyenZtyodiHEzat6jQrb0ROh9cKz+YNq1F95lVohBSk+Grg0KBpaNC6u5vXyVZbOljYajAM/92UCKDdJ3ysvqAOIMerMerHpsnFHUC2TGnfvr1qu2In6RaBsPULm0GT+OaPaWBO+WCLF66NM4JJI0eOVEUfTOeySITTS2jjnHPOUZ/zPWBKSkqJSSBMd1Pftm3bytyaFIHYefKiSxAQBAQB6whkHzqInhueR0vPTqT7qmJ+k7sRXbuFdcWiISQISATQediDOoBsi0KHiA5TcQeQ1bZ8K0fnMJTECB/XOHDgQLz//vvqrR8dPdKaNWvQsWNH1duP4+JGjBhxzFIZRWS7mOKTQFg1zHQym0SXReIAhvLkxbYgIAgIAoEROJJ9GB3XvYCO2IQsXyy+Sh6NmPolnwYJdhUDAXEAnT+noA4gHaepU6eqiFi/fv3Umz9GxpgWfvTRR5XDFUr67rvvlHPKFO9dd92lWrewhQvplltuUU2e6eSxMITkb/lCp5H02muv4Y477lCpYb4HrFatmtLxyy+/FLWXKb0/SQEbP3FJZRRiZhYHI3I6vHbw6OgwflPclwjFPpywaVWnWXkjcjq8dvBQx7fffI1WG15H17xlyPVFYeXJ49H2zCvdv2AWLOpgYUF9QFEnbFrRKSlgu0/4WH1lVgFzmgb76PnTvbGxseodHXvnhZo4xo0OKR03UvGilDZt2hQ5fsXXyegeI34kTgLh3r755hv1RpDTRNLT02USSKgPVuwLAoKAIGARgfy8PNRb/SZ6exejwOfBFzVvQmSz0y1qFXE3EZAIoPNol9sHkP31mO7lODW+/aOj5ATpFoGceOKJyrm79957wabQdNro8L3xxhtFxSHsBcgIINfL+b7t2rVTkcwePXqotjHkJ61YsUJFMlk8whFy3Bs/k0kg9p2wlW+AZlfhhE2rOs3KG5HT4bWDR0eH2bNzUy4U+3DCplWdZuWNyOnw2sFTXIfP58XqybegV+Y36lotOmE0uv7f/W5eMdO2dLAwrTyIoBM2reiUCKDdJ3ysvnIdQL8Imyaz0IIOEh0qu0m3CITv+lq1aoXWrVurAhXOBr788stVSxj2K2Qz58ceewxPPvkkXnnlFfz+++9Yvny5mvzBwpa5c+eqlDb3Qx1MEzPSSaeSM4YZJZRG0HafrugTBAQBQcB9BLxeH6qs/Rj9cwrbls2OvxQFrQfif7WC7i9ILGojIBFAbahMMwZ1AK+44gr06dNHRcg4Vq1r167YsmWLaq9Cp+uyyy4zbdSKIB1F9u9j378bbrgBl156qXL4kpKSMH/+fJx99tnKyeO4OEb/6BiyGpjvGbkHpn7p+DFiyF6CdPaY2iZ16tRJOYJMefuriQOtVYpArJygyAoCgoAg4B4CPq8PERu+xCXZnxY6gXEDUdB6EDwRhR0jhMITAXEAnT+XoA4gI2nffvstunTpgg8++EA5WewFSEfqrbfewtKlS51fXQALdEDZtJnRP45xY3SP6+SED6Z3GcFjupr9AJnSbdu2LX744QeV4qWTSOeQxM/p5LGCuPgkEH7GdjJsIF2apAjE+JFbSQEYt1Yo4YRNqzrNyhuR0+G1g0dHh9mzc1MuFPtwwqZVnWbljcjp8NrBU5aOpdPH4bTN/1FXbGG9a9HtumfhiYhw88pp29LBQluZJqMTNq3olBSw5sFZYAvqAHI6BqNhrKxlM+jk5GTV/mX79u3qbR0bMoeKWLTBaB0LOljBy55+c+bMURE+P3H8G6t8ObWEDuG1116rGkPTESQxCsjoH50//yQQvh3kXhctWqSmgpQmmQQSqhMXu4KAICAIWEfAt3EuBh6aphTNib0QeW2vkEigdVgd0SARQEdgLaE0qANIB4nv6C688EIVDWPat2/fvioKyDQrU7F2km4RCAs52P5l5cqVKlXLbxjsU1hQUKCigQ0aNFDLCpTCZdr31ltvVZ+zLczChQsDboHvBTk3uDRJBND4iVv5BmjcWqGEEzat6jQrb0ROh9cOHh0dZs/OTblQ7MMJm1Z1mpU3IqfDawePjo6/P38JvdY/p67awlqXo+vQl8EBA+FEOvuwe71O2LSiUyKAdp/wsfqCOoCc+Ttq1CiVRm3atKmao8v/kbz66quYMWOGSqvaSbpFIOzTRweQhRxM+zJ6x16A/jd9Tz31VJED+M477yhHka1e+D6QLWPIT+LbwZkzZ6rf+2cIsyr43HPPDZoC9u9X3gDaefKiSxAQBAQBdxHwbvkeg9KnKKPfxJyLI+2uQYS8CXT3EMqxJhFA54+jzCrgJUuWqJQvnS1/+xemWvnO7rTTTnN+dQEs8M0e07l06ljoQTp06JB633fjjTdi8uTJRQ4gHTzOLmYRCP8sToxucnJI8fnBzz77rKoc3rlzpxSBhOR0xaggIAgIAu4g4N36EwakvY0Ijw9zo89GVvvrwi4S6A4S4WlFHEDnz0W7DYzzS9GzwNm+TPPybSJHttHxu/3221VVMPsCMrVLYgqY1cJs90K6++67VeUyR8TFxMSodDELXNgahlXAdevWVc4um1yTNxBJCljvjIpzWUkBGLdWKOGETas6zcobkdPhtYNHR4fZs3NTLhT7cMKmVZ1m5Y3I6fDawaOjo/gdW/n1BJy4/HHlBC5MuhCdh7+JqMgoN69hQFtG92HHgp2waUWnpIDtONWydZTpADISxqbIdIxYLFGcXnzxRedXF8QCp36wZ5/fuYuOjgbXU3w8Hd8tcrRbaWIrG1YQM+XMiB9TwGx0TacwKytLVTlfd911AS1LEUjIjlwMCwKCgCDgCAIF23/BgANvIdLjw/yoM5DZYSgiw+xNoCMbD3OlEgF0/oCCOoCctXvJJZeoAhD2zmPkjA4V27B0795dNYW2k4wUgbB5s78IhFXADRs2REZGBv7888+iIhA6rSNGjFDr5Ls/toPhGz/y+YlRQ84RXrVqlapy5lvH1NRUFR0MRBIBNH7iVr4BGrdWKOGETas6zcobkdPhtYNHR4fZs3NTLhT7cMKmVZ1m5Y3I6fDawaOjI9AdWzN/CroueUg5gb9UPRcdh08CAwuhIrP7sLJeJ2xa0SkRQCunqScb1AE86aSTcP7552Ps2LGqypbVv0yTXnPNNer3t912m54FTS7dIpAvvvgCgwcPVu/97rvvPhUFHD16tFrfww8/jAceeEBVBLMlDFPAbP1Cp44y/HPv3r2qbQwjgXRqhw8fjltuuQUsLmGFMB1KOnplkRSBaB6qsAkCgoAgUEEQKNjxOy7Z/waiPF78EHka0joMR1RkeFUHVxAobVmmRABtgbFMJUEdQDp9LJxo0aIFatSooVqmsFqWjtaAAQMCpledXy5UVI8Vyozk8f0fievs1q2biubR4WOD6Isuugg7duxQkT3S0KFDMWXKFKSkpCjH8P7771fp7TVr1hQtm28CGe1kexlxAN04TbEhCAgCgkD4IODduRgXpbyOaE8BfozohdSONyMqMjJ8FngcrUQcQOcPu8xJIEyfsukzHb9nnnlGpYTpALICOFSNoLkORvoGDhyIRx99VKV3+Zbv7bffxuOPP65+x2gfHVZWCvNztqyhc8hqYe6JKWTONGZ6+6WXXlKVX7Nnz1aj4dg0mg5goPC/pICNX0grKQDj1golnLBpVadZeSNyOrx28OjoMHt2bsqFYh9O2LSq06y8ETkdXjt4dHSUd8c2LPgE7X+9SzmBv1U5Ha1vfhecQe8m2bEPo+t1wqYVnZICNnqCxvmDOoB0sNgEmilSplrZUoWzd9kDkBFBFk+Egvhej5E6RiaZNmZxCgs40tLS8PTTTysnrn///iqly/eKdOhOOOEE3HTTTbj33ntVkQcLSDjqjp+x8INpXza+5n6Z8uYUEX9D6eJ7lCKQUJy42BQEBAFBwF0EvLuX4sK9ryDGU4CfI3piX4fbER0lkUA3T0EigM6jHdQB5DxcRvk6d+6M7Oxs3HPPPSqq1rJlSxU1Y8GEnaRbBHLiiSeCzZ7pqPkrk7lGvu1j+xY6qxzptm3bNjUjmO/+6DByfByjeu+++66KELKNDKucA9GePXuUg1iaJAJo/MStfAM0bk0igIx2M8IdFRW4lYXOeZTHU97nZs/NbblQ7MMJm1Z1mpU3IqfDawePjg7de7b518/ResEdiPHk4+eE89Dl1smupYPt3Ifufp2waUWnRAB1T848X9j0AdQtAmGkj8UbV155pWoIzQvG93y///47PvnkE1x++eUqDcxiEaarGcmko8h3gSR/CphOIat9+ebP/5aQ7WVYEEKHt6wKMCkCMX/hRFIQEAQEgYqCACOBF+/9jyoM+SLmIvjaXwGPp6KsvmKvUyKAzp9fuQ4gnScWTjBdWpyaNGni/OoCWHjrrbfUBA9G6fzzG/3RQ04uYYsafxEII4V8B0iHkPOL2fCZe6HDxzQw5xsfPHhQTTYhsbKZBSWcBaxDrEDmeDmuxe9EUk7nW095POV9rrO+cOAJxT6csGlVp1l5I3I6vHbw6OgIh7tX3hpCsQ8nbFrVaVbeiJwOrx08OjrKuxelP183dyK6LXtU/Xpeoztw2tUPGVVhmN+JfZS3CCdsWtEpEcDyTsz650EdwPXr12PYsGFYtGhRCSt8V8cpG2y1EgriLGI6dOxTyPF08+bNU+lpFm5w9i/fKXJt7dq1U2lgvl1kpS95+J6RDiSJU0Suvvpq5bjxDWHt2rWxceNG5RRyYkgg8qeAJ06cCP7QDmU++OADNVFESBAQBAQBQaDyIRCz8Uv0P/SJ2ti0arci8YRTK98mw2xHEgF0/kCCOoCs9OU7IvbVY0EEnb7ixBRqKIhFIJ06dVLVvfx20apVK/V3NoH2F4HQUWMfQFZuMcXLdC6jdf4egFw3f08n7ssvvwTfO5KXVcJsDt2nT5+AW5MikFCcuNgUBAQBQSDECPh8SFz3Afoe+RZ5vkh8WPtOVGvSOcSLqtzmxQF0/nyDOoAJCQlgSpUTNNwgO4tA2PJl6dKlqqEzp3/QAWSql3OEGenzEz/j+Lg//vgDNWvWVBFFtodhf8BAJEUgxm+ClRSAcWuFEk7YtKrTrLwROR1eFjWA5wAAIABJREFUO3h0dJg9OzflQrEPJ2xa1WlW3oicDq8dPDo6zN4xn7cAGyYNRdf0ecj2xWL5We+g80lnmVVXppyT+whm2AmbVnRKCtiRq1VCaVAHsGfPnqrat3fv3s6vAlAtXfhTFnGGr04RCJ1WRvj4RpCRS387GP6d7wfZL5ARQbZ+YcXkmDFjwJQ33wXyPeC+ffvKXIcUgbhyJcSIICAICAJhhYCvIB9NV72EbgUrcNBXFbObjkG1Wg3Dao2VZTESAXT+JEs4gHSK/MSUKhsuM63KlGvpqtjiRQ/OL/MfCzpFICzm+Pnnn9V7PtLixYvV6Di+9eN7QPYFfOONN1TPQDp7LA4hcZ90BPmesHTKO9AepQik/JO38g2wfO2BOZywaVWnWXkjcjq8dvDo6DB7dm7KhWIfTti0qtOsvBE5HV47eHR0WL1juUcO4cCbF6Nl3jrsQS1kXD4TTZq3sqq2hLwb+yi9YCdsWtEpEUBbr1RAZSUcQH/EzM/pL/goLlkRikDYD5BpXTqBpB9//FFF+kjsk3bmmWeCEU46ee+//75qEzNt2jSMGzdO8fBNIKeElCYpAnH+QooFQUAQEATCHQFfziF0W/0kmmIPNvka4ve2Y5AQXzXcl12h1icRQOePq4QDyAIIXTrjjDN0WW3l0ykCmTt3rpoGQqfuiiuuUNNL+CeJFbtM9TL9y+gfnT8WkXDcHRtIX3/99aryuVevXsesW4pAbD1KUSYICAKCQIVFwJt1AKeufwL1cBDL0Qpr2t+HKv/LJlXYTYXRwsUBdP4wyu0D6PwSCi0YKQJ55ZVX1MQPRuRI3bp1U+PbWPzB33NiyXXXXafawPgjlhdccAHmzJmDjz/+WDmDHCXHSF9xYoEI3yGyD+App5xyzNalCMT4bbCSAjBurVDCCZtWdZqVNyKnw2sHj44Os2fnplwo9uGETas6zcobkdPhtYNHR4edd2z/5uWoPv0yVMNh/Bl9Iprd+ini46zPDXZ7H+H476akgO28qYF1HeMAcgoGZ+Z+/vnnyMvLwznnnAM6XMWrZ51Ylr8IhH3+EhMTVXRu+vTp6v2en1gEwreIbPFSp04dPPTQQzhy5IiK3JGfzh0ngbACeO3atepNH2f9Mmo4YsQI9baPqWGmf9nGZsuWLerNn59Wr16tGkYHSwH7+aQIxIkbIDoFAUFAEKh4CHhTN+D8bc8izpOL+RG9kdnxJkRGRlS8jYTZiiUC6PyBHOMA0vl7/fXXcc0116jeeGyYzDdzn376qfOrKWZhypQpGD16NNLT00vY9U/52LFjB5KTk9VnHN/G4hBG/IJNKGFlMGVYuBEZGYkLL7xQzQqmw8viENKzzz6rnF3OCJYiEHuOW77JWotKGsFPh9cOHh0d9tweZ7WEYh9O2LSq06y8ETkdXjt4dHQ4cau2/vYFWv90uxoZN7/6FThl+MuIsDAzLhT7cMKmFZ0SAXTippbUeYwDyNQoR6gNHjxYcTJixqbQjJ7RcXKLgjmAnAIyefJkzJ49u2gSCJ1WRgL9c365xueffx7nn3++agXDiB2rfm+//Xb1dxIbXNPho5PLHoAs+uDsYKaiWUQSiKQIxK3TFzuCgCAgCFQsBCJ2LMTFBwonTX0UdxWqtOkvc4MtHKFEAC2Apyl6jAPIaBhTow0b/tPbiEUSTJU2btxYU611tmAOINO9nN5BZ+zw4cOqUTXHvN10002gDAs8SH379lXVv3wDSLr22mvx3nvvFS2MkUS2hGEVMBtCM+LH9PLWrVuDprulCMT6uYoGQUAQEAQqKwKxm+fg/IyP1famJd2CxBanVdatOr4vcQAdhxjHOICM8nFkGt/Y+Ylv8pYvXx6wNYrOEo0UeDD6yGIN9iHkG0S/A+e3QweQTZ7Zh5ARPzqnnOn75ptv4t133y2KXNKxe/LJJ5Uzyz5/dBiZ3qW8nz777DPVGHrTpk1qb3xHyP9mMUkgkiIQndMuyWMlBWDcWqGEEzat6jQrb0ROh9cOHh0dZs/OTblQ7MMJm1Z1mpU3IqfDawePjg5H75jPh/Uf3IOuuz5Aji8KS89619S0kFDswwmbfp2d2zZD5p5NKMjLhTe/8MeXnwNfQZ76Owpy4SvIBfLz1N/hzYMnNwunpk5Xx7XvltVIrFZD++h09sLnYBxzm5GRofyJ45GOcQCZMmULFX9zZILCdCsjahwP5ye2VtEl3SkfTMc+9thjahoH3+fxp7QDyObUL7zwgmrTwj9TU1NVxS+dVn8KmFXAbFPDSSYXX3wxdu3ahcsuu0y99+O8XxIrfU8//XQ88cQTGDRoEGbOnKkmggwcOFC1jSmLpAhE9+SFTxAQBASB4wwBnxfJK19Fz/wl2Ourge9aj0XVqtWOMxAKt5uTuQ91t83C6XkLEekpzMaZoc86TkRUdOHABruI/gCDR+IAFkN06NChWvi+8847WnxmmZjS5Vu/0g7g2LFjlZP4119/qfYvpFGjRqnoHos8GjVqhPHjx6s3f4zs+clf9MFvBqQrr7xSFYQwFawuak4OqlWrhlatWqmUsA7JJJDyUdL5Jla+FmMcTti0qtOsvBE5HV47eHR0GDux0HCHYh9O2LSq06y8ETkdXjt4dHS4cdtyszJw6M1z0LhgJ1ZEtkeD2+cYag8Tin3YaXPfjo1I+eoZ9Ej/RhXGkLZ7kpHriUWBJxr5EdHweqLV370RUfD+77+9kTHwRUQX/sCD0yQC6Oh1DZs+gP5dbt++Xc375bxetqJhSxdSy5YtVdGHPwLIwhQWepCXzZvZB9AfAWQRBx1CVjMzEvjVV1+pd4KdO3dWjiOJIV9GDvn7lJQUlS6eN28eatWqpSKGgUiKQBy9i6JcEBAEBIFKg4A3czf6bfw3qnqO4suoc5Hf8dpKXxSSe/gAam6bjT45CxDtKVBnudjTGZsaDkJcnRaGzlbeABqCyxRz2DmAN9xwA6ZOnXrMZvwj3PiGj8UbjNYVfwM4YcIEJcciEPYSpHPIiKCf2BOQPQX9qW2muqmDfQL53pGNn08++WT1BtDfYLr0IqQIxNQdEyFBQBAQBI5LBHx7lmDg3v+ovb+XdCuSWpxaKXHIPZyGGtu+RJ+cHxDzP8dviacjNiYPQpW65uYkiwPo/FVxxQG0uwiEbwPZmHrlypVo164dli1bpnr5+YtAWA186623qt+xkIQPPRne7tevn0ork6KiolBQUPgNpTjRQWTLm0AkRSDGL6SdaQVd607YtKrTrLwROR1eO3h0dOieVSj5QrEPJ2xa1WlW3oicDq8dPDo63L5zaz8eg+7b3sZRXzRW9PsQHbqXXxkcin2YsZm2dwd2zHkW3Q/MQqwnT0G7MqYz8nvfi9YnnmOpIE/6ADp/U11xAO0sAmEfQKZ2mSL+/fffVXUyo4Ps5edPAfNtIJ21SZMmoV69eqqqmE2l+Z6QqWI6hEz1MvrHti9+YhTx7bffVg2lyyIpAnH+YooFQUAQEAQqAwI+rxdNVr6E7gV/Y5evNn5q8zgSEhIr9NZyszOQuHUOzjz6Har8z/Fb7mmDNfUvQ5X6bW3Zm0QAbYGxTCWuOIBmthGsCMQ/CYTTOuiw8Z3ggw8+iCFDhqi3fHzbx4pfRvg4Gs5Pp556qqr85fs+ThA56aST1PtCRgj9xOpnViBz+okOSRFI+SiZ+VZZvtayOZywaVWnWXkjcjq8dvDo6LB6hm7Ih2IfTti0qtOsvBE5HV47eHR0uHG3StvIOZSKIxPOQbJ3L5ZGdUXTEZ+jSmzwqtZQ7EPHZsbB/djyxTPotu8zNfqOtCaqHY70ugdtTj4fnoiSI/B0dAY7D4kAOn9Tw84BLK8IhGlbzgJmZI9TS+bPn4/c3FzVvoVv/0hMAQ8fPlwVgpx33nnYs2ePmgrCIhL+ncSWL08//bRy+JgqZgRx48aNYAsZvgUMRFIE4vyFFAuCgCAgCFRGBArSd+L8zY8j3pODL2Iugq/9FRWqKIQtXXptHI/Gnn3qeFahBVbWuxSx9TvCE+Gx/cgkAmg7pMcoDDsHsLwiEO6ATiLHuvn7BN52222q9Uvx3oV0Btkcmo2g2V+QvX5Y5ct+hqTffvsNH3zwgepxyGgiG0rTweO7QraCCURSBOL8hRQLgoAgIAhUWgR2/oEB+19T23uv+r+Q1PykCrHVowe24JztL6CWJxO7fHWwsN71iG3Q2RHHzw+IOIDOXw1XHEA7i0AICfv+MVLnL/7gHODiFMxefHy8evfnp+KTQE444QRV/MHG0YwcBiIpAjF+Ia2kAIxbK5RwwqZVnWbljcjp8NrBo6PD7Nm5KReKfThh06pOs/JG5HR47eDR0eHmHQtka83796LHrmnI8sViXf9P0LbzsU5gKPYRzObqX2aj3cKRSPAcxabI5oi99mPUrKc3FtbKPiQF7PxNdcUBtLMIhJCMHDkSbdq0wVtvvaVmFJd2ADkjmD+LFi1SPQLZOJpp4Z49e6o/ScEmgTD9y8/KIikCcf5iigVBQBAQBColAt4CNFsxHl28q7DNVw+L2v0b8XH/TNkKpz3nbluEgakTVU+/pZ722NxuFKJi41xZokQAnYfZFQfQzDaCFYEU13XmmWeqSuDSDiB5fvzxR1x00UV49tln0bt3b/VucMGCBWr8G6n0JBBWCPM9IKuDN2/erLVkKQIpHyYr3wDL1x6YwwmbVnWalTcip8NrB4+ODrNn56ZcKPbhhE2rOs3KG5HT4bWDR0eHm3csmK3sjBTkv9UP9X0p+DP6RLS8YyZioqKK2EOxj+I2IyMjsfTTZ9B7a+G7+j+rnoWWwyYjxqDzZ2UfEgF0/qaGnQNYXhEIIWGxBiN8dBL5Zo/v+Ujt27dXBR10/jj6jaliRgsfeugh/PTTT6oRNIs9SGwCPXjwYNx///1qJBzTvmwkzabQnCsciKQIxPkLKRYEAUFAEDgeEPAe3Ir+W55QbVRmxA5CZPtBYbFtr9eLuLUf4fycb9R6vo09H9ltB4PDE9wkiQA6j3bYOYA6RSCM/NGhK00s+GjWrBmC6eBYODqHJH7DqVGjBg4dOqScQfYOZKsYVgbLJBDnL55YEAQEAUHgeEfAs+MXXHJggoLh3ZqjUa1p95BC4s3PQ63Vk9CnoPAZ1BdVBwMt+yMU5criADp/FVxxAO0sAvn7778xbtw4VQTCli7s98c0L6N9fuLvOQ94yZIl6o0gv7mw/1/9+vWLeGQSiPOXixaspADMrtAJm1Z1mpU3IqfDawePjg6zZ+emXCj24YRNqzrNyhuR0+G1g0dHh5t3TMfW2ql3oPu+6Tjsi8OmS2agVbuuIfl3Mz1tP/ZOvgrdfauQ54vE0q5j0fG8G3W2EJTHynlICtgS9FrCrjiAdhaBcFIHq3/Z7HnGjBmqEfT+/fvx3HPP4V//+pfaNKd7vPTSS+jRowdGjBihegYybVycZBKI1v0QJkFAEBAEBAEHEfB589FyxbPo6F2Hzb5kLG7/GKpUcafQwr+to1np6Lb+BbTGNlWdPKfBKMQ26OjgrstXLRHA8jGyyuGKA2hmkTpFIIws0gE87bTTsGbNGjUKrjgxJcz2LmztMmvWrBKfySQQM6diXMbKN0Dj1golnLBpVadZeSNyOrx28OjoMHt2bsqFYh9O2LSq06y8ETkdXjt4dHS4ecd0bWWl7QEm90MdXyp+TjgXnW+epJ4rnXXWWSrL5STt2LgSVWdcg4ZIQZovCXv6T0bzzr1tMWnlPCQCaMsRlKkk7BxAI0UgbPTMOcCcCMJpIF999ZUqAvHTI488oiKDt9xyyzG9/WQSiPOXSywIAoKAICAI6CFQcGAdBm5/GhEeH96reSeSmnbTE7TAlb1/E87b8SJqeg5hB+rhtxb3ICapngWN9olKBNA+LINpCjsH0I4iEG6WlUxNmzZV7/8GDRqEl19+uQQGMgnE+cslFgQBQUAQEAT0EYhf9xH6ZX+FA74kzGvzDOITEvWFDXJm71qOAfteVaPp1qEZVra9G1Fx1QxqcY5dHEDnsPVrdsUBdKoIJCUlBZwNzHm/c+bMKYEWK3nHjh2LF154AXl5eao6mFG/G2/851GrTAJx/oJZSQGYXZ0TNq3qNCtvRE6H1w4eHR1mz85NuVDswwmbVnWalTcip8NrB4+ODjfvmFFb+bnZOPjqWWhasB0LIk5Cl5GfIrpYVsuovmD8KxfMQPdf70CUx4uVsd3RYNgHiK6SoDJqdqadrZyHpIDtOu3gelxxAJ0oAmGBByt9+f6PM36LF4FwuwMGDMC+fftUk2jy3nrrreptGFu9kGQSiPOXSywIAoKAICAIGEOg4OBWXLzlcTV94/3qt6Fq817GFJTDnZ22CxdtHYtEzxH8EnUKUtrfjIhIZ98ZmtmARADNoGZMxhUH0NiSCrnLKgJZtWoV+vbtiyFDhijHj5W+xYtAvvnmG9XkmRM9Lr30UjUFpHQKWCaBmDkV4zJWvgEat1Yo4YRNqzrNyhuR0+G1g0dHh9mzc1MuFPtwwqZVnWbljcjp8NrBo6PDzTtm1tbKjx7FSdsnIsOXgJSr56Fh4+ZmVZWQS09LQcHk89HYtwdrojsgecSXiI6pEpb/bkoE0JYjL1NJ2DmA5RWB0PljiPrcc8/F+PHj1eboALIIZPbs2eq/b7/9dtUDkJNB3n//fVSpUgUDBw7E6NGj0b17YaNNmQTi/OUSC4KAICAICALGEWBrmHbLn0Ab3xb87umM3Z3vRkSEx7iiYhJ8LtV0xQvo4VuJPb5aWNTucUTFJVnS6aSwRACdRLdQd9g5gOUVgQR7T8hef/4Rbueffz6+/fbbY9CrWrWqmvxBkkkgzl8usSAICAKCgCBgDoGCjF24cNOjiPXk4aPEoYhreZY5RQB8PiB29fvon/ststnnr9kjiKnZxLQ+NwTFAXQeZVccQDuLQFJTU3HNNddg+fLlqgE0q3179uyJuXPnIimp8NsMo4McFdeuXTusXbsWycnJ6NevHyZOnIisrCzExcUpB5CyxYnyLB45evRoQOT9s4D9H3KGcOPGjdVEEr9tfqaThiiPp7zPnb8a9lgIxT6csGlVp1l5I3I6vHbw6Oiw5/Y4qyUU+3DCplWdZuWNyOnw2sGjo8PZW2WPdv8+Ghz6CydtfFk1Z97+f1+jaYt2pgz8+cV/0Wfdk0r2r54vou1ZVx2jxwnsrOiUFLCpozYk5IoDaGcRyMGDB/HRRx+BkzyY+qWzx3QvU7sffPCB2jynhMycORMjR45UPQB/+eUX3Hbbbcox42i4Vq1aqRQwHUFOFfETHcRJkyZh27ZtZYL43//+F/xhSJ36aDc+Pt4Q8MIsCAgCgoAgIAiUhYDP60WL5ePQybcWy9AGmzs/iMjICEOgHd63HpfvegYxngJ8lTAIea0HGZIPFbNEAJ1H3hUH0Mw2jBSBvPLKK3j++eexY8cOZYptYVgZzAgd074kf1o4OztbOX4dO3YE3xuSx0/9+/dH9erV8eGHH2otmbJ0JCUCGBwuK98AtQ4hAJMTNq3qNCtvRE6H1w4eHR1mz85NuVDswwmbVnWalTcip8NrB4+ODjfvmFlbxfdxaN8W1Hi/H+KRg+8b34FTrnpIW+2ubRtQ6+OLUBOZWFq1D1rf+gE8EZEB5Z3AzopOiQBqH7NpxrBzAI0WgfDdH4s+mOadPn26AoKtYZgiptP3+OOPgxFIVgWTl2nc6OhoDBs2DJwrnJiYqH5q166N1atXY+HChTj55JMDAupPATNSyB9GADljWCKApu+fCAoCgoAgIAiUg4Bn6w+45OA7yPFFY3rTsahaq2G5mOXl5qDzqifQGtuxAU2xsuPDiIiOLVcuXBgkAuj8SYSdA2i2CKRJkyZFqdvWrVvjwgsvxMqVK1X6l+ni3r17q9Tx7t270aBBA3z99df47rvvwGbQO3fuVCPk6Bhu2rRJ8QeiYG8ZxQF0/qKKBUFAEBAEjlsEfD40XvECuhcsx2qcgDWdH0ZUGb37+L69zor/ord3sZrv+0PrfyOqau0KBZ84gM4flysOoBNFIEuXLgXfA7L4gped/f74fo/Ewgw6dYGI6dr69eurj4pPAmnevLlqHM35wXfddVeZEUD/h1IEUv4FtZICKF97YA4nbFrVaVbeiJwOrx08OjrMnp2bcqHYhxM2reo0K29ETofXDh4dHW7eMbO2Au0jI2U7Eqb0RRKy8EP9G3Hy9U8FVb/4vTE4Y8/byPVFYuN576FZ1/IriJ3AzopOSQGbvT36cq44gE4UgbDyt06dOioFO3ToUPX+zx/d69Kli0oBr1u3rqg696uvvlIFIXwDyEhfsEkg7Bc4Y8aMMhGUIhD9CyacgoAgIAgIAvYg4NvxKwYeeAN5vkh83PhRJNY5tkF01rY/cXXaK8rg5zVugqdZH3uMu6xFIoDOA+6KA2hmG2UVgZTWN2rUKLAQZMuWLWrm71VXXaXSvYwQsqiDxCpgVvzS8SOVngTC930s6GCF8IoVK7SWLEUg5cNk5Rtg+dolAlgcAR2s7eDR0WH27NyUC8U+nLBpVadZeSNyOrx28OjocPOOmbUVdB8+H9a/ORhdDy3AZk9jJI74HgnxhYWOpA0rfkOrrwYj3pODP+pejo43FDqCOuQEdlZ0SgRQ59Ss8YSdA1heEQgjeUzVMgLICt+ff/5ZzflNSEhASkqKQoNVvFdffbWK/vFtHws8GCmkU8gWMSR+dt111+Gee+5Rck8++aSqHOb7v127dgVEVYpArF02kRYEBAFBQBCwhoD36CH0Wf0ganky8WXMhSjocKVSeDQrE6evewzJnlQsjeiIbZ3uDlrxa20F7khLBNB5nMPOASyvCOSHH37AmDFj8OeffyIvL08h1LJlS+UI+t/2MfXLKt0vv/xSzQPmKDhOAGFz6D59CsPhERERKuLHxtBMJZ9yyimq+pdvAOnoBSIpAnH+QooFQUAQEAQEgbIRKNi9FJfuewlenwcfJI9BlVonoNXKZ9EF67AD9bC4/b8RGZtQoWEUB9D543PFAXS7CISw8Z3ea6+9hq1bt4IVwmzUzOKQWbNmKVSjoqJUG5fSFBsbK5NAbLx3VlIAZpfhhE2rOs3KG5HT4bWDR0eH2bNzUy4U+3DCplWdZuWNyOnw2sGjo8PNO2bWls4+1kwcih4Hv8FO1MP2hM44NWseDiEOBy6fhXrNOxo2rWPTqFIrOiUFbBRt4/yuOIBuF4G88cYbuP/++1UUkKniP/74A0OGDEHdunWLmkUz1cvoHx1EP02YMEH1BpRJIMYvkkgIAoKAICAIuIeANzcbvVaNQX2kKqOMBs5scBeiGnRxbxEOWpIIoIPg/k+1Kw6gmW1YKQI59dRTVTNoTgfxE4s7ODs4PT1d/eqkk04CW8n408j8nUwCMXNSZctY+QZodjVO2LSq06y8ETkdXjt4dHSYPTs35UKxDydsWtVpVt6InA6vHTw6Oty8Y2Zt6e5jy+Jv0OGHocrM4paj0OHSB8ya1Jphb1S57j4C6ZUIoFG0jfOHnQNoRxEIU729evXCU089hdzcXEybNg3jxo1DZGQkjhw5otrA8B3h008/raqEWShSs2ZNVSgik0CMXyKREAQEAUFAEAgNAr7dSxCRnw1f496AxxOaRThgVSKADoBaSmXYOYB2FIH07dsXCxYsUO/8+PavadOmqkVMRkZGUa/A3377TY1wmz17tmoazfnALP7g9BBGCwORFIE4fyHFgiAgCAgCgoAgIA6g83fAFQfQziIQPySc68v3exz5lpaWhhtvvBGTJ09WHzPKN2LECLz33nvw+Xyq2IOVvkwBs4UM3wKSXn/9dZUm5nSQ9u3bq0phpoHZUzAQ+dvA+D+TSSDlX1ArKYDytQfmcMKmVZ1m5Y3I6fDawaOjw+zZuSkXin04YdOqTrPyRuR0eO3g0dHh5h0zaysU+3DCphWdkgI2e3v05VxxAO0sAim+NU7tYIqXc31J/kkgfh7a7dGjB9q0aYPVq1eDDhvfALIFzMcff6z6ANIJ5HtBFoCwcph///HHH8tEUCaB6F8w4RQEBAFBQBAQBIwiIBFAo4gZ53fFATS+LKC8IhBW+tKJe/TRR3H22WcrE/5JIH57gwcPVulcvv0bP348LrnkEpX2JbHnX/fu3UE9JEYKmS4mP8fI6ZBMAikfJSvfAMvXHpjDCZtWdZqVNyKnw2sHj44Os2fnplwo9uGETas6zcobkdPhtYNHR4ebd8ysrVDswwmbVnRKBNDs7dGXCzsHUKcIhNW7L730Er744gvVAPrBBx9UDh3f9ZHWr1+vHD6OfWNk7+abb8batWtVkQdHxTFqyObQDz/8MPjmkI4c075Tp05F586dVXVwIJJJIPoXSzgFAUFAEBAEBAGzCEgE0Cxy+nJh5wCWVwTy7bff4tJLL1U79Hq9aswbizj4HpDFHiSmhBntYxEIK3wbNGigfk8nkMRUccOGDVGvXj01L5gTQbp164bmzZuDk0Y4SSQQBXvLOGnSJBU9FBIEBAFBQBAQBAQB6wjQARywZqRS9EW7VxAVHWtdaTEN2dnZKtPIZ2H0AY5HcsUBNFIE4j+EKVOmYPTo0UV9+/y/v+uuu5QDx7m+JL7XO+uss5Qjx5YuLPjgWLdhw4apGcEk2v/888+xbNmyEg7gokWLVLsYP7FtDAtH/I5i6QtRugiEM4NZPCIkCAgCgoAgIAgIAhUPgR07dqBRo0YVb+E2rNgVB9BIEUh5DmDXrl2xYsUKeP7X74hv9xgJ5Ds/9va78847UaNGDfXffuLn5OPv5s6di969e6uI3aeffopBgwYV8Y0aNUo5iZwZrEPUS2c0MTGxaD1+OU4gWbx4cZlqyuLxVxjzciYlJeksJ2x5dLCwe/FO2LSq06y8ETkdXqs8cjet3VYd/I1asKrTrLwROR1eqzxyN43enJL8OvgbtWBVp1n58uToE7DzR3JysioMPR7JFQfDOEB1AAAOx0lEQVTQDLDBIoCbNm1SbV78RCeLLWAYzWvRooVKCbPitzix0vf777/H9OnTVZo3ISFBvRlkhTA/8xOjeQMGDMAzzzxjZsklZKir9DpKKy2Lx19gwt6FFd0B1MHCMuClFDhh06pOs/JG5HR4rfLI3bR2W3XwN2rBqk6z8kbkdHit8sjdNHpzSvLr4G/UglWdZuXNyhndX0XmDzsH0F8EMmvWLNWjj0UepJYtW6Jq1arHYF06BRzoMEqngMnjbwPz5ptvqjTwW2+9pWYHr1q1qugtoZWDZasY9iIsi8riqUz/kOlgYQXrQLJO2LSq06y8ETkdXqs8cjet3VYd/I1asKrTrLwROR1eqzxyN43enJL8OvgbtWBVp1l5s3JG91eR+cPOASyvCKQ02GYdQOph9O+5555TjaA7duyoKov79OkTFudZmf4hCwtAZRG2ISB30zYoRZHNCMjdtBlQUVepEQg7B7BSo21gcyw4YSqaLW5iY+2tfjKwDGEVBI5BQO6mXIpwRUDuZriejKwrHBEQBzAcT0XWJAgIAoKAICAICAKCgIMIiAPoILiiWhAQBAQBQUAQEAQEgXBEQBzAcDwVWZMgIAgIAoKAICAICAIOIiAOoIPgimpBQBAQBAQBQUAQEATCEQFxAMPxVGRNgoAgIAgIAoKAICAIOIiAOIAOgiuqBQFBQBAQBAQBQUAQCEcExAEMx1MxsCaOsunbty/y8vLUHOSRI0di+PDhBjQIqyDgDAIcY3jdddchJSUFUVFReOSRR3D55Zc7Y0y0CgIGEeAYUPaRPfvss9WUKCFB4HhDQBzACn7idPrY+4qzjbOzs1VDa47Hq1WrVgXfmSy/oiPABuv79u0D53fTCezevTvWrVunRjEKCQKhRuCHH37A4cOHMXXqVHEAQ30YYj8kCIgDGBLYnTGalpaGbt26YcmSJWomspAgEE4IdO7cGXPmzEHjxo3DaVmyluMYAUYAX3vtNXEAj+M7cDxvXRxAh09/wYIFaqYxnTJGRGbOnImBAweWsMqRdOTh5x06dMDLL7+M008/XXtl6enpOOOMM7Bhwwalp7wZxNqKhbFSI+DG3fQD+Oeff4JjHleuXFmpMZXN2YOAW3dTHEB7zku0VEwExAF0+Ny+/vpr/PLLLyr9ddlllx3jAH788cfqnRSdwNNOOw0TJkzApEmTsHr1ajRp0kStrkePHirNW5rmzp2L5OTkol8z3XbppZdixowZqFevnsM7E/UVHQG37mZqaqr6QsN7feqpp1Z02GT9LiDg1t0UB9CFwxQTYYuAOIAuHo3H4znGATz55JOVc/jGG28UraRdu3YqSshZwEbptttuU0Uh8tjeKHLHN79Td5NfXPr166cKk/hFR0gQMIqAU3eT6xAH0OhpCH9lQkAcQBdPs/Q/ZLm5uap449NPPwUr0vw0atQoLFu2DD/99FO5q2PULy4uDklJScjMzESvXr3w4Ycfgu+thAQBXQScuJs+nw9XX3012rRpg3//+9+6SxE+QaAEAk7cTb8BcQDlsh3PCIgD6OLpl/6HbPfu3WjYsKFKERdPjT399NOqMo0Vk+UR3xYOGzYM/D9b/jACyB8hQcAIAk7czYULF6JPnz4lvoy899576NSpk5GlCe9xjoATd5OQnnfeefjrr7+QlZWFmjVrquxMz549j3O0ZfvHEwLiALp42sH+IVu0aJGK3PnpqaeeAv+Pcu3atS6uTkwdzwjI3TyeTz+89y53M7zPR1ZXcREQB9DFs3MyleHiNsRUJURA7mYlPNRKsiW5m5XkIGUbYYeAOIAuHkmwx8ys8mUVsJ/at2+PAQMGmCoCcXE7YqoSISB3sxIdZiXbitzNSnagsp2wQUAcQIePgp3mN27cqKywSfOLL76Is846S705YZsXfxuYN998U6WB33rrLUycOBGrVq1C06ZNHV6dqD+eEZC7eTyffnjvXe5meJ+PrK5yICAOoMPnyCozOnylaciQIZgyZYr6NaN/zz33nGoEzVFuL730kno8LyQIOImA3E0n0RXdVhCQu2kFPZEVBPQQEAdQDyfhEgQEAUFAEBAEBAFBoNIgIA5gpTlK2YggIAgIAoKAICAICAJ6CIgDqIeTcAkCgoAgIAgIAoKAIFBpEBAHsNIcpWxEEBAEBAFBQBAQBAQBPQTEAdTDSbgEAUFAEBAEBAFBQBCoNAiIA1hpjlI2IggIAoKAICAICAKCgB4C4gDq4SRcgoAgIAgIAoKAICAIVBoExAGsNEcpGxEEBAFBQBAQBAQBQUAPAXEA9XASLkFAEBAEBAFBQBAQBCoNAuIAVpqjlI0IAoJARUbgqquuUuMi77vvPtu2welCnTt3xvLly9GgQQPb9IoiQUAQqPgIiANY8c9QdiAIhA0CN9xwA6ZOnXrMejZs2ICWLVuGzTrDbSFLly5Fv379sG3bNiQkJKjl9e7dG6eccgrGjx9fYrmTJk3CAw88gAMHDmhtY+TIkcjNzQXnjQsJAoKAIOBHQBxAuQuCgCBgGwJ0APft2/f/7Z1ZqE1vGMZfyRiZh8yUmcgYIuUCGeuE01HKFMKFKWWIyJyEEBKZQ0KKzJnDjZCS6QKJC/OU6d/v7b926+yzt7NpH9Y+53mvTnut9X3f+n3r4ul53/c7tnXr1lxjVqtWzYoXL55nHoRJyZIl0zZ/pg40atQoK1OmjK1bty72CukSgIhLxnr27JlVqFAhUxFp3SIgAmkmIAGYZqAaTgSKMgEE4OvXr+3QoUMJMSBE2rdv79d27txpbdu2tdOnT/sz06dPt8OHD7tb1bFjR1u1apW1bt06Ns6iRYts9erV9vnzZxs2bJhVrFjRzp49azdu3EjqmPXv399q1qxpuGbEly9fbPbs2bZnzx6fk/GXL19uPXr08OuBu7Zjxw6bMmWKPXnyxK8haGvUqBFby+bNm319Dx48sCpVqtiQIUN8bSNGjLC3b9/mev+vX79arVq1bOXKlX49Pr59+2aVK1e2/fv3W+/evX9bANapU8eePn2aa1jENuMGUbduXYNfovmL8veqdxeBokxAArAo777eXQTSTCAVAXjz5k2bNGmSjRw50n7+/GmNGze2bt26ucCaO3eulS9f3tavX2+7d++2e/fuudDjb1wyfufebdu2uVvWpEmT3xKACEecsCVLlnhN3IEDB2z+/Pl2584da9SokQvAiRMnWs+ePW3x4sVOJycnx1OxQWp77dq1NnPmTFu2bJn16dPHXr16ZVevXjVSrefPn7devXq5IKtevbo/f/DgQYPL8+fPrWzZsnmII2ARvKR0EZNBpOoAvnz50r5//+6PIfqysrI8jXzmzJnYWPyGyES4KkRABEQAAhKA+g5EQATSRgChg7NXunTp2Jh9+/Z1d4tA1ODCXb9+PXb9xIkTlp2d7QIpSAcjDBFkCEKEX6dOnaxz586G+AqiQ4cO/meqDiBisnnz5i4Aw24eYg+Xb8GCBS4Ax44da48fP7b69ev7+GvWrHGXEDeQdSEcx48f78IxUTRt2tTGjRtnU6dO9csDBgxwFzKZ+EKEDh8+3LmEA1bXrl3LkyJH5JUrVy5hDSDi9dixY843LCYRp3fv3rWTJ0+mba81kAiIQGYTkADM7P3T6kUgUgQQgLhfGzZsiK0LNyroQEXUkHYNX8eNmzNnjtfAhePTp0/e7EDqEldw48aN7sYFMXnyZLty5UrKApC0L88HTRbBOAivoUOH2q5du1wATps2zd68eRObB/GKQCM1jXisXbu2O33du3dPyH7FihW2fft2u3Xrlota0q/c36VLl4T3k27GEQ3PGYjlZs2aOYNwsB7SyfFNILijOJMwadWqVa5n+P3ixYt26dKlSH0vWowIiMC/IyAB+O/Ya2YRKHQEUkkBx3e2IvA2bdrktYDxUalSJXeyUhGAuHikUhFHQVBThwBD2CHwSDuT7i1WrFiuqXDUglrB+A5bHDocSpw30r2kUn8lAF+8eGHU5SG2qFGkfhD3LVng2PXr18+oFQw3yqSaAmbcU6dO+Rj79u2zQYMG5ZkKV5NUcbLazEL3IeqFREAE8iUgAZgvIt0gAiKQKoE/EYAIoIEDB9rDhw9drCUKUsAIR9KxQSD2SMkGKWDq3EqVKuX1ggSCrUGDBl6nhwBEhLVo0cIuX76c1I1LdMRKWAAyLmscPXp00hQw97AW0sznzp1z0TljxoykCHEJcUhxDMPOXaoCkNQ2bHAuaXBJFLiPcJg3b16qW6n7REAECjkBCcBCvsF6PRH4mwT+RAD++PHDawPp7qWxgqYQUq1Hjx717loOR8a9GzNmjKeOu3bt6g0Z1AOGm0BoCiHViQtG/SDn55EuZYygCxgnj7o6XEI6kHHFcB6ZIxCKv3IAYbllyxYj/UxdIA7ju3fvXFSSxg0CUTt48GDj3agdDNccJtqPNm3a2IQJE7y2MIhUBOCHDx987Q0bNsx1/iIOZzDn+/fvrWrVqu5GJktD/81vRHOJgAhEg4AEYDT2QasQgUJB4E8EIC/O0SmzZs3yjllq23DESOkuXbrUa+6IhQsX+lEr1Owh6kgNh4+BoUYPYYboK1GihLtuOHDhY2C4h3FoVKFWkfMJcc9oAGnZsmXsGJhwfV28A8haqLdjLY8ePXJxRXcxx8IEgfCjiaRdu3Z+tE1+gXjdu3evXbhw4bcE4P37910wx0f4GBhqDBHWt2/fzm8Zui4CIlCECEgAFqHN1quKQGEiQOPI8ePHYyngKL0brhtn/yE0SW/nFzS84GYigEltpzM4dxFnlEYXhQiIgAgEBCQA9S2IgAhkJIEoCkCcP2r6SA8fOXLE+Bd4if4DSiLguJkfP370Zo50BWvBAfxVDWK65tI4IiACmUVAAjCz9kurFQER+J9AFAVgkJKtV6+e1+RxxqBCBERABKJIQAIwiruiNYmACIiACIiACIhAARKQACxAuBpaBERABERABERABKJIQAIwiruiNYmACIiACIiACIhAARKQACxAuBpaBERABERABERABKJIQAIwiruiNYmACIiACIiACIhAARL4D7/axsyrQzI2AAAAAElFTkSuQmCC\" width=\"640\">" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Original g()\")\n", + "display(g_sample)\n", + "print(\"Identified g()\")\n", + "display(Id_sys.G)\n", + "\n", + "plt.figure()\n", + "_ = cnt.bode([g_sample, Id_sys.G])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/requirements.txt b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..9cd6c5965d90285cd6050bd969c1d490ce3bcb52 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/requirements.txt @@ -0,0 +1,50 @@ +absl-py==0.9.0 +astunparse==1.6.3 +cachetools==4.1.1 +certifi==2020.6.20 +chardet==3.0.4 +control @ file:///D:/bld/control_1616259348526/work +cycler==0.10.0 +future @ file:///D:/bld/future_1610147416207/work +gast==0.3.3 +google-auth==1.20.0 +google-auth-oauthlib==0.4.1 +google-pasta==0.2.0 +grpcio==1.30.0 +h5py==2.10.0 +idna==2.10 +importlib-metadata==1.7.0 +Keras-Preprocessing==1.1.2 +kiwisolver @ file:///D:/bld/kiwisolver_1610099949969/work +Markdown==3.2.2 +matplotlib @ file:///D:/bld/matplotlib-suite_1611858873832/work +numpy==1.18.5 +oauthlib==3.1.0 +olefile @ file:///home/conda/feedstock_root/build_artifacts/olefile_1602866521163/work +opt-einsum==3.3.0 +pandas @ file:///D:/bld/pandas_1614698123791/work +Pillow @ file:///D:/bld/pillow_1615244129446/work +protobuf==3.12.4 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +pyparsing==2.4.7 +python-dateutil==2.8.1 +pytz @ file:///home/conda/feedstock_root/build_artifacts/pytz_1612179539967/work +requests==2.24.0 +requests-oauthlib==1.3.0 +rsa==4.6 +scipy==1.4.1 +sippy==0.1.1 +six==1.15.0 +slycot==0.4.0.0 +tensorboard==2.3.0 +tensorboard-plugin-wit==1.7.0 +tensorflow==2.3.0 +tensorflow-estimator==2.3.0 +termcolor==1.1.0 +tornado @ file:///D:/bld/tornado_1610094878337/work +urllib3==1.25.10 +Werkzeug==1.0.1 +wincertstore==0.2 +wrapt==1.12.1 +zipp==3.1.0 diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/ss_mpc.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/ss_mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..7b404115b2eb0e4d166088885ec6935a945ecf94 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/ss_mpc.py @@ -0,0 +1,278 @@ +from casadi import * +import random +import time +import matplotlib.pyplot as plt + + +class linearMPC(): + """ + Create Linear Model Predictive Controller to use LIS-Models + Since LIS-States cannot be measured, also a Moving Horizon Estimator and a Kalman Filter are implemented + """ + + def __init__(self, model, Dist=True, Kalman=False): + """ + Pass Model, Weighting Matrizes, Prediction Horizon and other Parameters + + :param model: + :param Q: + :param R: + :param N_pred: + :param Dist: + :param Kalman: + + ToDo: Split up in init and create_controller + Create_Tracking_controller and create_economic Controller? + """ + + # Convert NP Arrays to Casadi Matrix (needs discretized State Space model) + A = DM(model.A) + B = DM(model.B_u) + C = DM(model.C) + D = DM(model.D) + self.Dist = Dist + self.Kalman = Kalman + if Dist == True: + B2 = DM(model.B_d) + D2 = DM(model.D2) + self.B2 = B2 + self.D2 = D2 + + if Kalman == True: + K = DM(model.K) # Pass Kalman Gain + self.K = K + self.A = A + self.B = B + self.C = C + self.D = D + + # Get Dimensions + self.nx = model.A.shape[0] + self.nu = model.B_u.shape[1] + if Dist == True: + self.nw = model.B_d.shape[1] + self.ny = model.C.shape[0] + + def create_tracking_MPC(self, Q, R, N_pred=10): + # Create States + + self.N = N_pred + U = SX.sym('u', self.nu, self.N) + X = SX.sym('x', self.nx, self.N) + if self.Dist == True: + W = SX.sym('w', self.nw, self.N) + + # Reference + Y_ref = SX.sym('Y_ref', self.ny, 1) + + # Initial State + X_0 = SX.sym('X0', self.nx, 1) + + # Constraint Initial Value + g = [] + state = X[:, 0] + self.lbg = [] + self.ubg = [] + for i in range(self.nx): + g.append(state[i] - X_0[i]) + self.lbg.append(0) + self.ubg.append(0) + + # Prediction Loop (Multiple Shooting): + obj = 0 # Objective + for k in range(self.N - 1): + state = X[:, k] + control = U[:, k] + state_next = X[:, k + 1] + if self.Dist == True: + disturbance = W[:, k] + state_next_pred = self.A @ state + self.B @ control + self.B2 @ disturbance + y_pred = self.C @ state_next_pred + self.D @ control + self.D2 @ disturbance + else: + state_next_pred = self.A @ state + self.B @ control + y_pred = self.C @ state_next_pred + self.D @ control + + # Add Multiple Shooting Constraint + g.append(state_next - state_next_pred) + for j in range(self.nx): + self.lbg.append(0) + self.ubg.append(0) + + # Objective Function + obj = obj + (y_pred - Y_ref).T @ Q @ (y_pred - Y_ref) + control.T @ R @ control + + # External Parameters + if self.nw > 1: + self.PARVARS = horzcat(X_0[:].T, Y_ref[:].T, + W[:].T) # Could be Extended by variable Boundaries, disturbances etc. + else: + self.PARVARS = horzcat(X_0[:].T, Y_ref[:].T, W[:]) + + if self.nu > 1: + self.OPTVARS = horzcat(X[:].T, U[:].T) + else: + self.OPTVARS = horzcat(X[:].T, U[:]) + + # Create LP + opts = {} + opts["ipopt.linear_solver"] = 'ma57' + self.nlp = {'x': self.OPTVARS, 'f': obj, 'g': vertcat(*g), 'p': self.PARVARS} + self.controller_tracking = nlpsol('Controller', 'ipopt', self.nlp,opts) + + def get_tracking_control(self, x0, lbx, ubx, lbu, ubu, Y_ref, W, Initial=0): + """ + Perform MPC Step and get optimal control Aktion + :param x0: + :param lbx: + :param ubx: + :param lbu: + :param ubu: + :param Y_ref: + :param W: + :param Initial: + :return: + """ + # Create Boundaries + self.lb = [np.reshape(lbx * self.N, (self.N * self.nx, 1)), np.reshape(lbu * self.N, (self.N * self.nu, 1))] + self.ub = [np.reshape(ubx * self.N, (self.N * self.nx, 1)), np.reshape(ubu * self.N, (self.N * self.nu, 1))] + + # Solve QP + self.x_opt = self.controller_tracking(lbx=vertcat(*self.lb), # Lower variable bound + ubx=vertcat(*self.ub), # Upper variable bound #Watt + lbg=vertcat(*self.lbg), # Lower constraint bound + ubg=vertcat(*self.ubg), # Upper constraint bound + x0=Initial, + p=vertcat(*[x0, Y_ref, W])) + + x_opt = self.x_opt['x'][0:self.N * self.nx] + u_opt = self.x_opt['x'][self.N * self.nx:-self.nu] + res_tot = self.x_opt['x'] # Total results for Warmstart + x_opt = np.reshape(x_opt, (self.N, self.nx)) + u_opt = np.reshape(u_opt, (self.N - 1, self.nu)) + return x_opt, u_opt, res_tot + + def create_economic_MPC(self,Q,R,N_pred=10): + """ + Create Economic MPC based on soft constraints + :param Q: + :param R: + :param N_pred: + :return: + """ + return + def get_economic_control(self): + return + + def create_estimator(self): + """Implement Moving Horizon Estimator to get initial states for Kalman filter""" + self.estimator = "Place Holder" + + + + def get_mhe_x0(self): + """Perform Moving Horizon Estimation to get first x0""" + x0 =[] + return x0 + + def get_kal_x0(self): + """ + Perform Kalman Step to get x0 based on former Prediction and measurements + + :return: + """ + +class Model: + """Define Matrices for discrete Linear State Space model for small test system""" + + def __init__(self): + self.A = np.array([[2, -1, 0.5], [1, 0, 0.5], [0.1, -0.1, 1]]) + self.B_u = np.array([[1, 0], [0.2, 1], [0.1, 0.5]]) + self.C = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) + self.D = np.array([[0, 0], [0, 0], [0, 0]]) + + def simulate(self, x0, u): + """In Case of Nonlinear Model, implement e.g Runge Kutta here """ + x_k_1 = self.model.A @ self.x0 + self.model.B @ u + y_k_1 = self.model.A @ x_k_1 + self.model.D @ u + return y_k_1, x_k_1 + + +class Model_Dist: + """Define Matrices for discrete Linear State Space model with Disturbance for small test system""" + + def __init__(self): + self.A = np.array([[1., 0.1], [0., 1.]]) + self.B_u = np.array([[0.005], [0.1]]) + self.B_d = np.array([[0.5], [0.01]]) + self.C = np.array([[1, 0]]) + self.D = np.array([[0]]) + self.D2 = np.array([[0]]) + + def simulate(self, x0, u, w): + """In Case of Nonlinear Model, implement e.g Runge Kutta here """ + x_k_1 = self.A @ x0 + self.B_u @ u + self.B_d @ w + y_k_1 = self.A @ x_k_1 + self.D @ u + self.D2 @ w + return y_k_1, x_k_1 + + +if __name__ == '__main__': + """ Implement small test case""" + Testmodel = Model_Dist() + + Q = np.diag([1]) + R = np.diag([0.05]) + N = 10 + Warmstart = True + + MPC = linearMPC(Testmodel) + MPC.create_tracking_MPC(Q, R, N) + # Boundaries + lbx = [-0, -inf] + ubx = [10, inf] + lbu = [-100] + ubu = [100] + + # Reference + Y_ref = np.array([10]) + + # Start + x0 = np.array([0, 0]) + u_res, y_res, t_res = [], [], [] + initial = 0 + + # Create Disturbance + W = np.zeros((100, 1)) + for i in range(0, 100): + W[i, 0] = random.random() + + tic = time.time() + for t in range(0, 60): + Dist = W[t:t + N, 0] + x_opt, u_opt, res_tot = MPC.get_tracking_control(x0, lbx, ubx, lbu, ubu, Y_ref, W=Dist, Initial=initial) + if Warmstart == True: + initial = res_tot + + y_k_1, x_k_1 = Testmodel.simulate(x0=x0, u=u_opt[0], w=[W[t, 0]]) + u_res.append(u_opt[0]) + y_res.append(y_k_1[0]) + t_res.append(t) + print(f"timestep={t}") + x0 = x_k_1 + + print(f"t_res={t_res}") + print(f"u_res={u_res}") + print(f"y_res={y_res}") + toc = time.time() + print(f"Elapsed time: {toc - tic}s") + plt.subplot(2, 1, 1) + plt.plot(t_res, y_res, label='y_res') + plt.plot(t_res, u_res, label='u_res') + plt.grid(alpha=0.3) + plt.ylabel('Results') + plt.legend() + plt.subplot(2, 1, 2) + plt.plot(t_res, W[0:60, 0], label='y_res') + plt.grid(alpha=0.3) + plt.ylabel('Disturbance') + plt.xlabel('t') + plt.show() diff --git a/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/thermal_zone_identification.py b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/thermal_zone_identification.py new file mode 100644 index 0000000000000000000000000000000000000000..1129708448ca83f8242f937e96363b3f3b2fa503 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/lsi_ddmpc/thermal_zone_identification.py @@ -0,0 +1,151 @@ +from pickle import * +import pickle as pickle +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +from sklearn.metrics import mean_squared_error + +try: + from sippy import * +except ImportError: + import sys, os + + sys.path.append(os.pardir) + from sippy import * + +from sippy import functionset as fset +from sippy import functionsetSIM as fsetSIM + + +def read_pickle(filename: str): + with open(filename, 'rb') as f: + return pickle.load(f) + + +def write_pickle(filename: str, a): + with open(filename, 'wb') as handle: + pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL) + +def Centering(y,u,options): + y = 1. * np.atleast_2d(y) + u = 1. * np.atleast_2d(u) + [n1, n2] = y.shape + ydim = min(n1, n2) + ylength = max(n1, n2) + if ylength == n1: + y = y.T + [n1, n2] = u.shape + ulength = max(n1, n2) + udim = min(n1, n2) + if ulength == n1: + u = u.T + + # Checking data consinstency + if ulength != ylength: + sys.stdout.write("\033[0;35m") + print( + "Warning! y and u lengths are not the same. The minor value between the two lengths has been chosen. The perfomed indentification may be not correct, be sure to check your input and output data alignement") + sys.stdout.write(" ") + # Recasting data cutting out the over numbered data + minlength = min(ulength, ylength) + y = y[:, :minlength] + u = u[:, :minlength] + if options['centering'] == 'InitVal': + y_rif = 1. * y[:, 0] + u_rif = 1. * u[:, 0] + for i in range(ylength): + y[:, i] = y[:, i] - y_rif + u[:, i] = u[:, i] - u_rif + elif options['centering'] == 'MeanVal': + y_rif = np.zeros(ydim) + u_rif = np.zeros(udim) + for i in range(ydim): + y_rif[i] = np.mean(y[i, :]) + for i in range(udim): + u_rif[i] = np.mean(u[i, :]) + for i in range(ylength): + y[:, i] = y[:, i] - y_rif + u[:, i] = u[:, i] - u_rif + elif options['centering'] == 'None': + y_rif = np.zeros(ydim) + y_rif = 0. * y[:, 0] + u_rif=0 + + + u_tot_new = u + y_new = y + return y_rif,u_rif,u_tot_new,y_new + +if __name__ == '__main__': + """ + ToDo: Get Identification Results from Max to build linear Model with N4SID + Use Identificated SS Model in Model Predictive Controller + Implement Kalman Filter (look at controls library (lQR)) + Experiment with Identification Parameters + + + """ + savename = 'parsim_model' + # Prepared Data + dt = 300 # Time Stepsize of generated Data + raw_data = pd.read_excel('D:\Git_Repos\DDMPC\stored_data\post.xlsx')# + y = np.array(raw_data['TAirRoom']) + u = np.array([raw_data['valveTabsHotSet'], + raw_data['valveTabsColdSet'], + raw_data['valveAHUCoolerSet'], + raw_data['valveHeaterSet']]) + d = np.array ([raw_data['weaBus.TDryBul'], + raw_data['weaBus.HDifHor'], + raw_data['weaBus.HDirNor'], + raw_data['weaBus.HGloHor'], + raw_data['internal_gain_1'], + raw_data['internal_gain_2'], + raw_data['internal_gain_3']]) + u_tot = np.concatenate([u,d]) + + + # Set Identification Options + options={'method':'PARSIM-K', + 'no_states':6, + 'centering':'None', + 'no_data':8000, + 'ssf':150, + 'ssp':150} + # identify System + sys_id = system_identification(y[:options['no_data']], u_tot[:,:options['no_data']],centering=options['centering'], id_method=options['method'],SS_f=options['ssf'], SS_p=options['ssp'],SS_A_stability=True,SS_fixed_order=options['no_states']) + # Split Up B matrix in B_u (Inputs) and B_d (Disturbances) + sys_id.B_u = sys_id.B[:,:len(u)] + sys_id.B_d = sys_id.B[:,len(u):] + # fit data to centering + y_ref, u_ref, u_tot_new, y_new = Centering(y, u_tot, options) + + # Kalman step + xk_1 = sys_id.B@np.mat(u_tot_new[:, 0]).T+sys_id.K@np.mat(y_new[0,0]) + uk_1 = np.mat(u_tot_new[:, 0]).T + for i in range(1,1000): + xk = sys_id.A@xk_1 + sys_id.B@uk_1 + xk_est = xk + sys_id.K @(y_new[0,i] - sys_id.C @ xk) + xk_1 = xk_est + uk_1 = np.mat(u_tot_new[:, i]).T + + + + xid, yid = fsetSIM.SS_lsim_process_form(sys_id.A, sys_id.B, sys_id.C, sys_id.D, u_tot_new[:,:],np.array(xk_est)) #,sys_id.x0)#, + xid, yid = fsetSIM.SS_lsim_innovation_form(sys_id.A, sys_id.B, sys_id.C, sys_id.D, sys_id.K, y_new, u_tot_new[:,:],sys_id.x0) + #rms = mean_squared_error(y_new[100:], yid[0,:], squared=False) + #rms2 = mean_squared_error(y[1:2000], yid[0, :2000], squared=False) + plt.figure(0) + plt.plot(y[0:2000],label='original') + plt.plot(yid[0,:2000]+y_ref,label='identified') + plt.ylabel("Temperature") + plt.grid() + plt.xlabel("Time") + plt.title("Ytot") + plt.legend(['Original system', 'Identified system, ' + options['method']]) + plt.show() + #print(rms) + #print(rms2) + + # save Model + Model = {'Model':sys_id,'options':options,'data':raw_data} + write_pickle(f'./Data/{savename}',Model) \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/vdp_example/black_box_mpc.py b/01_Input/Masterarbeit Konrad Beeser/vdp_example/black_box_mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..62c278cec1088cb48a9e0c5e42d4182af6d6a82a --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/vdp_example/black_box_mpc.py @@ -0,0 +1,41 @@ +from vdp_mpc_package import * + +""" +Was in diesem Script passiert: +1. Erstellen eines Van der Pol Simulators (VDPS) +2. Generieren von Trainingsdaten mit dem (VDPS) +3. Trainieren eines ANN's mit den erzeugten Trainingsdaten +4. Modellprädiktive Regelung (Black Box) +""" + +my_vdp = van_der_pol(eps=1.5, dt=0.05) # Erstellen eines Van Der Pol Oszillators + +if False: + + # Trainingsdaten generieren + generator = data_generator(vdp=my_vdp) # Erstellen eines data generators, der Trainingsdaten erstellt + training_data = generator.generate_training_data(n_oscillations=500, n_oscillation_steps=250) # generieren der Trainingsdaten + + # ANN erstellen und trainieren + trainer = ann_trainer() # Erstellen eines ANN trainers + trainer.fit_ann(data=training_data, epochs=500, batch_size=1000) # ANN Trainieren + trainer.evaluate_ann(data=training_data) + trainer.save_ann(name='vdp_ann') # ANN Speichern + +# Modellprädiktiv regeln +my_mpc = mpc(my_vdp) # MPC instanziieren +ann = models.load_model('vdp_ann') # ann laden +my_mpc.create_controller(False, ann) # MPC Solver erstellen (white_box = False weil das ANN verwendet werden soll) + +# Anfangszustand definieren +x0 = np.array([[1], [1]]) + +# sollwerttrajektorie definieren +target = np.zeros(shape=(200, 2)) +target[0:50] = np.array([0.5, 0]) +target[50:100] = np.array([-1, 0]) +target[100:150] = np.array([1.5, 0]) +target[150:200] = np.array([0, 0]) + +# MPC ausführen +my_mpc.run(x0=x0, target=target) diff --git a/01_Input/Masterarbeit Konrad Beeser/vdp_example/casadi_neural_network.py b/01_Input/Masterarbeit Konrad Beeser/vdp_example/casadi_neural_network.py new file mode 100644 index 0000000000000000000000000000000000000000..c372d6f75c20cc70c5b9451c1097c2aad85c4469 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/vdp_example/casadi_neural_network.py @@ -0,0 +1,390 @@ +from keras import models, layers, Sequential +import keras.layers.experimental.preprocessing as experimental +from casadi import * + + +class Layer: + """ + Single layer of an artificial neural network. + """ + + def __init__(self, layer: layers.Layer): + + self.config = layer.get_config() + + # name + if 'name' in self.config: + self.name = self.config['name'] + + # units + if 'units' in self.config: + self.units = self.config['units'] + + # activation function + if 'activation' in self.config: + self.activation = self.get_activation(layer.get_config()['activation']) + + # input / output shape + self.input_shape = layer.input_shape[1:] + self.output_shape = layer.output_shape[1:] + + # update the dimensions to two dimensions + self.update_dimensions() + + # symbolic input layer + self.input_layer = MX.sym('input_layer', self.input_shape[0], self.input_shape[1]) + + def __str__(self): + + ret = '' + + if hasattr(self, 'units'): + ret += f'\tunits:\t\t\t\t{self.units}\n' + if hasattr(self, 'activation'): + ret += f'\tactivation:\t\t\t{self.activation.__str__()}\n' + if hasattr(self, 'recurrent_activation'): + ret += f'\trec_activation:\t\t{self.recurrent_activation.__str__()}\n' + ret += f'\tinput_shape:\t\t{self.input_shape}\n' + ret += f'\toutput_shape:\t\t{self.output_shape}\n' + + return ret + + def update_dimensions(self): + """ + CasADi does only work with two dimensional arrays. So the dimensions must be updated. + """ + + if len(self.input_shape) == 1: + self.input_shape = (1, self.input_shape[0]) + elif len(self.input_shape) == 2: + self.input_shape = (self.input_shape[0], self.input_shape[1]) + else: + raise ValueError("Please check input dimensions.") + + if len(self.output_shape) == 1: + self.output_shape = (1, self.output_shape[0]) + elif len(self.output_shape) == 2: + self.output_shape = (self.output_shape[0], self.output_shape[1]) + else: + raise ValueError("Please check output dimensions.") + + @staticmethod + def get_activation(function: str): + blank = MX.sym('blank') + + if function == 'sigmoid': + return Function(function, [blank], [1 / (1 + exp(-blank))]) + + if function == 'tanh': + return Function(function, [blank], [tanh(blank)]) + + elif function == 'relu': + return Function(function, [blank], [fmax(0, blank)]) + + elif function == 'softplus': + return Function(function, [blank], [log(1 + exp(blank))]) + + elif function == 'gaussian': + return Function(function, [blank], [exp(-blank ** 2)]) + + elif function == 'linear': + return Function(function, [blank], [blank]) + + else: + ValueError(f'Unknown activation function:{function}') + + +class Dense(Layer): + """ + Fully connected layer. + """ + + def __init__(self, layer: layers.Dense): + + super(Dense, self).__init__(layer) + + # weights and biases + self.weights, self.biases = layer.get_weights() + self.biases = self.biases.reshape(1, self.biases.shape[0]) + + # check input dimension + if self.input_shape[1] != self.weights.shape[0]: + raise ValueError(f'Please check the input dimensions of this layer. Layer with error: {self.name}') + + def forward(self, input): + + # forward pass + f = self.activation(input @ self.weights + self.biases) + + return f + + +class Flatten(Layer): + + def __init__(self, layer: layers.Flatten): + + super(Flatten, self).__init__(layer) + + def forward(self, input): + + # flattens the input + f = input[0, :] + for row in range(1, input.shape[0]): + f = horzcat(f, input[row, :]) + + return f + + +class BatchNormalising(Layer): + """ + Batch Normalizing layer. Make sure the axis setting is set to two. + """ + + def __init__(self, layer: layers.BatchNormalization): + + super(BatchNormalising, self).__init__(layer) + + # weights and biases + self.gamma = np.vstack([layer.get_weights()[0]] * self.input_shape[0]) + self.beta = np.vstack([layer.get_weights()[1]] * self.input_shape[0]) + self.mean = np.vstack([layer.get_weights()[2]] * self.input_shape[0]) + self.var = np.vstack([layer.get_weights()[3]] * self.input_shape[0]) + self.epsilon = layer.get_config()['epsilon'] + + # check Dimensions + if self.input_shape != self.gamma.shape: + axis = self.config['axis'][0] + raise ValueError(f'Dimension mismatch. Normalized axis: {axis}') + + # symbolic input layer + self.input_layer = MX.sym('input_layer', self.input_shape[0], self.input_shape[1]) + + def forward(self, input): + + # forward pass + f = (input - self.mean) / (sqrt(self.var + self.epsilon)) * self.gamma + self.beta + + return f + + +class LSTM(Layer): + """ + Long Short Term Memory cell. + """ + + def __init__(self, layer: layers.LSTM): + + super(LSTM, self).__init__(layer) + + # recurrent activation + self.recurrent_activation = self.get_activation(layer.get_config()['recurrent_activation']) + + # load weights and biases + W = layer.get_weights()[0] + U = layer.get_weights()[1] + b = layer.get_weights()[2] + + # weights (kernel) + self.W_i = W[:, :self.units] + self.W_f = W[:, self.units: self.units * 2] + self.W_c = W[:, self.units * 2: self.units * 3] + self.W_o = W[:, self.units * 3:] + + # weights (recurrent kernel) + self.U_i = U[:, :self.units] + self.U_f = U[:, self.units: self.units * 2] + self.U_c = U[:, self.units * 2: self.units * 3] + self.U_o = U[:, self.units * 3:] + + # biases + self.b_i = np.expand_dims(b[:self.units], axis=0) + self.b_f = np.expand_dims(b[self.units: self.units * 2], axis=0) + self.b_c = np.expand_dims(b[self.units * 2: self.units * 3], axis=0) + self.b_o = np.expand_dims(b[self.units * 3:], axis=0) + + # initial memory and output + self.h_0 = np.zeros((1, self.units)) + self.c_0 = np.zeros((1, self.units)) + + def forward(self, input): + + # check input shape + if input.shape != self.input_shape: + print('Dimension mismatch!') + + # initial + c = self.c_0 + h = self.h_0 + + # number of time steps + steps = self.input_shape[0] + + # forward pass + for i in range(steps): + + # input for the current step + x = input[i, :] + + # calculate memory(c) and output(h) + c, h = self.step(x, c, h) + + # here the output has to be transposed, because of the dense layer implementation + return h + + def step(self, x_t, c_prev, h_prev): + + # gates + i_t = self.recurrent_activation(x_t @ self.W_i + h_prev @ self.U_i + self.b_i) + f_t = self.recurrent_activation(x_t @ self.W_f + h_prev @ self.U_f + self.b_f) + o_t = self.recurrent_activation(x_t @ self.W_o + h_prev @ self.U_o + self.b_o) + c_t = self.activation(x_t @ self.W_c + h_prev @ self.U_c + self.b_c) + + # memory and output + c_next = f_t * c_prev + i_t * c_t + h_next = o_t * self.activation(c_next) + + return c_next, h_next + + +class Rescaling(Layer): + + def __init__(self, layer: experimental.Rescaling): + super(Rescaling, self).__init__(layer) + + # weights and biases + self.offset = layer.offset + self.scale = layer.scale + + def forward(self, input): + + # forward pass + f = input * self.scale + self.offset + + return f + + +class NeuralNetwork: + """ + Generic implementations of sequential Keras models in CasADi. + """ + + def __init__(self, model: models): + """ + Supported layers: + - Dense (Fully connected layer) + - Flatten (Reduces the input dimension to 1) + - BatchNormalizing (Normalization) + - LSTM (Recurrent Cell) + :param model: Sequential Keras Model + """ + + # list with all layers + self.layers = [] + + # forward function + self.predict = None + + # construct from keras model + self.construct(model) + + def __str__(self): + + ret = '--------------------- Casadi Neural Network ---------------------\n\n' + + for layer in self.layers: + ret += f'{layer.__class__.__name__}\n' + ret += f'{layer.__str__()}\n' + + ret += '--------------------- Casadi Neural Network ---------------------' + + return ret + + @property + def input_shape(self): + return self.layers[0].input_shape + + @property + def output_shape(self): + return self.layers[-1].output_shape + + def construct(self, model: models): + + # Add layers one by + for layer in model.layers: + + # get the name of the layer + name = layer.get_config()['name'] + + # recreate the matching layer + if 'dense' in name: + self.add_layer(Dense(layer)) + elif 'flatten' in name: + self.add_layer(Flatten(layer)) + elif 'batch_normalization' in name: + self.add_layer(BatchNormalising(layer)) + elif 'lstm' in name: + self.add_layer(LSTM(layer)) + elif 'rescaling' in name: + self.add_layer(Rescaling(layer)) + else: + raise ValueError(f'Type "{name}" is not supported.') + + # update the predict function + self.update_forward() + + # print out the structure + print(self) + + def update_forward(self): + + # create symbolic input layer + input_layer = self.layers[0].input_layer + + # initialize + f = input_layer + + # pass forward through all layers + for layer in self.layers: + f = layer.forward(f) + + # create the prediction function + self.predict = Function('forward', [input_layer], [f]) + + def add_layer(self, layer): + + # append layer + self.layers.append(layer) + + +if __name__ == "__main__": + + """ ------------------------------ example ------------------------------------ """ + + samples = 1000 + n_inputs = 10 + n_outputs = 1 + + # test data + x_train = np.random.random(size=(samples, 2, n_inputs)) + y_train = np.random.random(size=(samples, n_outputs)) + + # create nn + keras_model = Sequential() + keras_model.add(layers.BatchNormalization(axis=2)) + keras_model.add(layers.Flatten()) + # keras_model.add(layers.LSTM(units=2)) + keras_model.add(layers.Dense(units=10, activation="sigmoid")) + keras_model.add(layers.Dense(units=1, activation="linear")) + keras_model.compile(optimizer="adam", loss="mse", metrics=["mse"]) + keras_model.fit(x_train, y_train, epochs=100, batch_size=50) + keras_model.save("dense") + + # CasADi NN + ann = NeuralNetwork(keras_model) + + # test + x_test = np.random.random(size=(2, n_inputs)) + print(keras_model.predict(np.expand_dims(x_test, axis=0)).squeeze()) + print(ann.predict(x_test)) + + """ ------------------------------ example ------------------------------------ """ diff --git a/01_Input/Masterarbeit Konrad Beeser/vdp_example/requirements.txt b/01_Input/Masterarbeit Konrad Beeser/vdp_example/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..03537ea89162e69bc28ea6a6a7822c2739c4c8e2 --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/vdp_example/requirements.txt @@ -0,0 +1,4 @@ +matplotlib~=3.3.4 +numpy~=1.19.5 +casadi~=3.5.5 +Keras~=2.4.3 \ No newline at end of file diff --git a/01_Input/Masterarbeit Konrad Beeser/vdp_example/vdp_mpc_package.py b/01_Input/Masterarbeit Konrad Beeser/vdp_example/vdp_mpc_package.py new file mode 100644 index 0000000000000000000000000000000000000000..12341f14898e3eeb96b161badb80b3b3706e902a --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/vdp_example/vdp_mpc_package.py @@ -0,0 +1,424 @@ +import matplotlib.pyplot as plt +import numpy as np +from casadi import * +import random +from keras import Sequential, layers, models +import casadi_neural_network + + +class van_der_pol: + """ + Simuliert den Van der Pol oscillator. + """ + def __init__(self, dt=0.1, eps=1.0): + """ + :param dt: Schrittweite + :param eps: Charaktaristischer Parameter + """ + + # Einstellungen + self.dt = dt # Schrittweite + self.eps = eps # Parameter + + # Zustandsvariablen + x1 = MX.sym('x') # Position + x2 = MX.sym('v') # Geschwindigkeit + u = MX.sym('u') # Stellgröße + + # Zustandsraummodell + x1_dot = x2 + x2_dot = self.eps * (1 - x1 ** 2) * x2 - x1 + u # ẍ = eps * (1 - x^2) * ẋ + x + + x = vertcat(x1, x2) + x_dot = vertcat(x1_dot, x2_dot) + + # Erstellen der Differential algebraische Gleichung (DAE) + self.dae = { + 'x': x, # Zustände + 'p': u, # Parameter + 'ode': x_dot # Ableitung + } + + def do_step(self, x, u) -> np.array: + """ + Diese Methode berechnet einen "Schritt" des vdp-oscillators. Dazu wir der idas integrator benutzt. + :param x: Startzustand + :param u: Stellgröße + :return: Zustand nach dt sekunden + """ + + F = integrator( + 'F', # name des integrators + 'idas', # lösungsmethode + self.dae, # the dae + {'tf': self.dt} # options + ) + + Fk = F(x0=x, p=u) # initializieren des integrators + x_next = Fk['xf'] # berechnung des nächsten zustands + return x_next # rückgabe des nächsten Zustandes + + @staticmethod + def plot(X, U, target): + + fig, (ax1, ax2, ax3) = plt.subplots(3, gridspec_kw={'height_ratios': [1, 1, 1]}) + ax1.step(range(X.shape[0]), X[:, 0]) + ax1.step(range(target.shape[0]), target[:, 0], linestyle='-.') + ax2.step(range(X.shape[0]), X[:, 1]) + ax2.step(range(target.shape[0]), target[:, 1], linestyle='-.') + ax3.step(range(U.shape[0]), U) + + ax1.set_title('Van der Pol Oscillator') + + ax1.set_ylabel('Position') + ax2.set_ylabel('Velocity') + ax3.set_ylabel('U') + + plt.show() + + return 0 + + @staticmethod + def plot_batch(oscillation: list): + fig, (ax1, ax2) = plt.subplots(2, gridspec_kw={'height_ratios': [4, 1]}) + + ax1.set_title('Van der Pol Oscillator') + + ax1.set_xlabel('Position') + ax1.set_ylabel('Velocity') + + ax2.set_xlabel('Step') + ax2.set_ylabel('U') + + for data in oscillation: + ax1.plot(data[:, 0], data[:, 1]) + ax2.plot(data[:, 2]) + plt.show() + + +class data_generator: + """ + Wird verwendet um Trainingsdaten zu generieren und aufzubereiten + """ + def __init__(self, vdp: van_der_pol): + + self.vdp = vdp + + def simulate_oscillation(self, x0, U) -> np.array: + """ + Löst das Anfangswertproblem für x0 und u. + :param x0: Startzustand + :param U: Folge an Stellgrößen + :return: Berechnete Oszillation + """ + + X = [x0] + for i in range(0, U.shape[0] - 1): # schleife über die Abfolge der Stellgröße u + x_next = np.array(self.vdp.do_step(x=X[i], u=U[i]).T) # berechne den nächsten Zustand + X = np.append(X, x_next, axis=0) # füge den berechneten Zustand zum array hinzu + + data = np.concatenate([X, np.expand_dims(U, axis=1)], axis=1) + + return data + + def generate_training_data(self, n_oscillations: int, n_oscillation_steps: int): + """ + Diese Methode generiert trainingsdaten zum trainieren von KNN. + Dazu werden zufällige ivp's (initival value problem) erzeugt und anschließend gelöst. + Anschließend werden die Daten aufbereitet. + Abschließend werden die Daten gleichmäßig in test, train und validate aufgeteilt + und validate aufgeteilt. + + :param n_oscillations: Anzahl der Oszillationen die erzeugt werden sollen. + :param n_oscillation_steps: Anzahl der länge der Oszillationen. + :return: Trainingsdaten (dict) Dictionary mit den Trainingsdaten. + """ + + oscillations = list() + + # Erstellen von ivp's und lösen + # für eine Anzahl von n_oscillationen werden zufällige ivps erzeugt + print('-------------- Generating Data --------------') + for i in range(n_oscillations): + print(f'{i} of {n_oscillations}') + x0, U = self.random_ivp(steps=n_oscillation_steps) + X = self.simulate_oscillation(x0, U) # lösen des ivps + oscillations.append(X) # anhängen / speichern der daten + + # Plotten + self.vdp.plot_batch(oscillations) + + # Aufbereiten zu trainingsdaten (Nicht so wichtig) + X, Y = None, None # X -> input, Y -> Output + for oscillation in oscillations: + x = oscillation[:-1] # Für den Input wird der letzte Wert entfernt + y = oscillation[1:, 0:2] # Für den Output wird der erste Wert entfernt, sowie die Stellgrößen + + # Zusammenfügen der Einzelnen Oszillationen zu einem gesamtpaket an Trainingsdaten + if X is None: + X = x + Y = y + else: + X = np.concatenate([X, x], axis=0) + Y = np.concatenate([Y, y], axis=0) + + # Aufsplitten in 3 gleichgoße Teile + X = self.split(X, 3) + Y = self.split(Y, 3) + + # Zurück geben der fertigen Trainingsdaten + return { + 'x_train': X[0], + 'y_train': Y[0], + 'x_validate': X[1], + 'y_validate': Y[1], + 'x_test': X[2], + 'y_test': Y[2], + } + + @staticmethod + def random_ivp(steps: int): + """ + Diese Methode berechnet in einem ersten Schritt einen zufälligen(Normalverteilt) Anfangszustand für den VDP-O. + Anschließend werden mit hilfe einer zufällig gewählten Sinusfunktion ebenfalls Stellgrößen + über eine Länge von "steps" erzeugt. + :param steps: Anzahl der Integrationsschritte + """ + + x0 = np.random.uniform(-5, 5, size=(2,)) # Zufälliger Anfangszustand + + offset = random.uniform(-pi, pi) # Zufälliger Offset + amplitude = random.uniform(0, 10) # Zufällige Amplitude + scale = np.linspace(2 * pi, 4 * pi, steps) # Zufällige Skalierung + U = amplitude * np.sin((scale - offset)) + + return x0, U + + @staticmethod + def split(sequence: np.ndarray, number_of_chunks: int): + + chunk_size, remainder = divmod(sequence.shape[0], number_of_chunks) + + if chunk_size: + result = [sequence[x:x + chunk_size] for x in range(0, number_of_chunks * chunk_size, chunk_size)] + else: + result = [[]] + + if remainder: + result[-1] = np.concatenate([result[-1], sequence[-remainder:]]) + + return result + + +class ann_trainer: + """ + Wird verwendet um ANNS zu trainieren. + """ + + def __init__(self): + + self.ann = None # In dieser variable wird gleich das ANN gespeichert + self.build_ann() # Aufbauen des ANN's + + def build_ann(self): + """ + In dieser Funktion wird die Architektur des ANN bestimmt. + """ + + self.ann = Sequential() + self.ann.add(layers.BatchNormalization(axis=1)) + self.ann.add(layers.Dense(units=32, activation='sigmoid')) # Hidden Layer -> 8 Neuronen, Sigmoid + self.ann.add(layers.Dense(units=2, activation='linear')) # Output Layer -> 2 dimensionen, Linear + self.ann.compile(optimizer='adam', loss='mse') + + def fit_ann(self, data: dict, epochs: int = 100, batch_size: int = 100): + """ + Die "fit" Methode passt die Gewichte und Schwellenwerte des ANN an die gegebenen Trainingsdaten an. + Dazu werden trainings, test und validationsdaten verwendet. + :param batch_size: Die Anzahl der Batches. + :param epochs: Die Anzahl der Epochen. + :param data: Die Trainingsdaten als dict. + """ + + self.ann.fit( + x=data.get('x_train'), + y=data.get('y_train'), + validation_data=(data.get('x_validate'), data.get('y_validate')), + epochs=epochs, + batch_size=batch_size, + ) + + def evaluate_ann(self, data: dict, metric: str = 'mse'): + + x = data.get('x_test') + y_real = data.get('y_test') + + y_pred = self.ann.predict(x) + + error = y_real - y_pred + + if metric == 'mse': + score = sum(error**2) + elif metric == 'mae': + score = sum(error) + else: + raise ValueError('Metric must be mse or mae') + + print(f'Score: {score}') + return score + + def save_ann(self, name: str = 'vdp_ann'): + self.ann.save(name) + + def load_ann(self, name: str = 'vdp_ann'): + self.ann = models.load_model(name) + + +class mpc: + """ + Der Modellprädiktive Regler. + """ + + # Einstellungen + N = 15 # Prädiktionshorizont. + Q = np.array([[1000, 0], [0, 1]]) # Q ist die Gewichtung für die Abweichung von der Sollwerttrajektorie. + R = 0.1 # R ist die Gewichtung für Stellgröße U. + + def __init__(self, vdp: van_der_pol): + + # liste mit den beschränkungen für die Nebenbedingungen (Recht unwichtig) + self.lbg = list() + self.ubg = list() + + self.vdp = vdp # hier wird der verwendete vdp oscillator gespeichert + self.solver = None # In dem Solver wird später das nlp gespeichert (Darum vorerst None) + + def create_controller(self, white_box:bool = False, ann: Sequential = None): + """ + Mit dieser Methode wird ein nichtlineares optimierungsproblem aufgestellt. + :param white_box: Boolean ob das WB oder BB modell verwendet werden soll + :param ann: Sequenzielles Keras Modell zur modellierung des VDP-O + """ + + # Das ann ist nur für die Black Box variante interessant!!! + if not white_box: + # Zunächst muss das Sequenzielle Keras Modell in Casadi Schreibweise überfürht werden. + # Das wird mit hilfe der libary casadi_neural_network erreicht: + assert ann is not None, 'Bitte übergib ein ANN, wenn nicht WhiteBox geregelt wird' + cnn = casadi_neural_network.NeuralNetwork(model=ann) + else: + cnn = None + + # Initializierung + obj = 0 # Die variable obj ist die Zielfunktion. Sie wird später minimiert. + PAR_VARS = [] # Die PAR_VARS ist eine Liste mit Variablen, die als Übergabewerte an den solver übergeben werden müssen. Hier: x0 und die Sollwerttrajektorie "target" + OPT_VARS_X = [] # Liste mit den zu optimierenden Zustandsvariablen + OPT_VARS_U = [] # Liste mit den zu optimierenden Stellgrößen + g = [] + + # Anfangsbedingung x0 + X0 = MX.sym('X0 par_var', 2) # man achte auf die "2", da der VDP ja zwei Zustandsgrößen hat (pos und geschw) + PAR_VARS.append(X0) # anhängen an die Liste PAR_VARS, da der Anfangszustand nachher umbedingt übergeben werden muss. + + # Variable state Xk + Xk = MX.sym('X0 opt_var', 2) # der Unterschied zu "par_var" ist, dass die "opt_var(X/U)" Variablen Optimiert werden (wird bei betrachtung der Nebenbedingung gleich klarer) + OPT_VARS_X.append(Xk) # Die "par_var" Liste muss beim aufrufen des solvers übergeben werden. + + # starting condition x0 = xk(k=0) + g.append(X0 - Xk) # Nebenbedingung, die den Startzustand mit der ersten Optimierungsvariable verknüpft + self.lbg.append(0) # Wichtig ist, dass für jede Nebenbedingung auch die obere und untere Grenze gesetzt wird + self.lbg.append(0) # in diese Fall ist es lb=0 und ub=0, da es sich um eine Gleichheitsbedingung handelt + self.ubg.append(0) + self.ubg.append(0) + + for k in range(self.N): # Hier wird nun über N Zeitschritte iteriert (bis zum ende des Prädiktionshorizontes) + + Tk = MX.sym(f'target{k} par_var', 2) # Hier wird eine Variable erstellt, die Platzhalter für die Sollwerttrajektorie zum Zeitpunkt k ist. + PAR_VARS.append(Tk) # Wichtig ist wieder sie an die Liste der PAR_VARS anzuhängen + + Uk = MX.sym(f'U{k} opt_var', 1) # Hier wird eine Variable erstellt, die die Stellgröße U zum Zeitpunkt k beschreibt + OPT_VARS_U.append(Uk) # Da ja die Stellgrößen optimiert werden sollen hängen wir sie an die OPT_VARS_U liste an + + g.append(Uk) # die Stellgröße U wird auf +-25 limitiert + self.ubg.append(25) + self.lbg.append(-25) + + # An dieser Stelle entscheidet sich, ob das ANN(BB) benutzt wird oder der VDP(WB) + # In beiden fällen wird eine Prädiktion (oder halt der richtige Wert im Falle der WB) aufgestellt + if white_box: + Xk_pred = self.vdp.do_step(Xk, Uk) # White Box + else: + Xk_pred = cnn.predict(vertcat(Xk, Uk)).T # Black Box + + Xk = MX.sym(f'X{str(k + 1)} opt_var', 2) # Nun wird eine neue Zustandsvariable für den nächsten Zeitschritt erstellt. Also X(k+1) + OPT_VARS_X.append(Xk) # Auch dieser Zustand soll optimiert werden also wird er an die OPT_VARS_X angehängt. + + # shooting constraint + g.append(Xk - Xk_pred) # Nun verknüpfen wir die Prädiktion von grade eben mit der Zustandsvariable + self.lbg.append(0) # Auch hier gilt wieder das von oben, dass es sich um gleichheit handelt. + self.lbg.append(0) + self.ubg.append(0) + self.ubg.append(0) + + # Objective Function + obj += (Xk_pred - Tk).T @ self.Q @ (Xk_pred - Tk) + Uk.T @ self.R @ Uk # Hier wird die Gewichtung vorgenommen und diese zu der Zielfunktion auf addiert. + + # create nlp + PAR_VARS = vertcat(*PAR_VARS) + OPT_VARS = vertcat(*(OPT_VARS_U + OPT_VARS_X)) # hier müssen nun alle OPT_VARS zu einer Liste zusammengefasst werden + CONSTRAINTS = vertcat(*g) + + # erstellen des NLP + nlp = {'p': PAR_VARS, 'x': OPT_VARS, 'f': obj, 'g': CONSTRAINTS} + + # select options (Es wird der ipopt alg ausgewählt) + opts_ipopt = {'verbose': False, 'ipopt': {'max_iter': 25, 'print_level': 0}} + + # save the solver + self.solver = nlpsol('solver', 'ipopt', nlp, opts_ipopt) + + # geschafft + + def get_controls(self, x0, target): + """ + Diese Metode wird benutzt um den zuvor erstellen solver aufzurufen und Modellprädiktiv zu regeln + :param x0: Anfangszustand + :param target: Sollwerttrajektorie + """ + + # Den zuvor erstellten solver aufrufen. Dabei + + PAR_VARS = vertcat(*[x0, *target]) # hier wird der anfangszustand x0 einfach vor die Sollwerttrajektorie gehangen + + solution = self.solver(lbg=vertcat(*self.lbg), + ubg=vertcat(*self.ubg), + p=PAR_VARS) + + u_opt = solution['x'] # und die lösung auslesen + u0_opt = u_opt[0] # eine MPC benutzt immer nur den ersten optimieren Wert also u0 + return u0_opt # und zurück geben + + def run(self, x0, target): + + steps = len(target) - self.N # Nicht so wichtig, wieso hier -N gerechnet wird. + U = [] # leere liste in die die optimierten stellgrößen kommen + X = [x0] # liste an die die optimierten zustände angehängt werden (Der erste Zustand wird schon rein gepackt) + + for step in range(steps): # Jetzt wird schritt für schritt simuliert + + # erst wird der solver aufgerufen, um die Optimale Stellgröße zu errechnen + xk = X[step] # dazu wird der jetzige Systemzustand benötigt + tk = target[step + 1:step + self.N + 1] # sowie die Sollwerttrajektorie der nächsten N zustände + u_opt = self.get_controls(x0=xk, target=tk) # optimales u errechnen + U.append(float(u_opt)) # An Liste anhängen (Das ergebnis kommt als DM also muss man in float konvertieren. Nicht so wichtig zu verstehen) + + # Jetzt anhand der optimalen Stellgröße U das VDP aufrufen und einen schritt kalkulieren + x = np.array(self.vdp.do_step(X[step], U[step])) # Tatsächlichen Ausgang berechnen + X.append(x) # Diesen dann an die Liste anhängen + + # alles wiederholen bis fertig + + X = np.array(X).squeeze() # aus der Liste ein np.ndarray machen + U = np.array(U) # aus der Liste ein np.ndarray machen + + self.vdp.plot(X=X, U=U, target=target) # Das ergebnis Plotten diff --git a/01_Input/Masterarbeit Konrad Beeser/vdp_example/white_box_mpc.py b/01_Input/Masterarbeit Konrad Beeser/vdp_example/white_box_mpc.py new file mode 100644 index 0000000000000000000000000000000000000000..88ef43f3d4dc32aa8ba2c6a8caed5d36c68e37bc --- /dev/null +++ b/01_Input/Masterarbeit Konrad Beeser/vdp_example/white_box_mpc.py @@ -0,0 +1,33 @@ +from vdp_mpc_package import * + +""" +Was in diesem Script passiert: +1. Erstellen eines Van der Pol Simulators (VDPS) +2. Modellprädiktive Regelung (White Box) +""" + +# 1TIPP: Bei windows kommt man mit einem Mausrad-klick auf eine Methode sofort an die Stelle, wo sie definiert wurde. (Für schnelles nachschauen) +# Z.B. Mausradklick auf die Methode van_der_pol() +# 2TIPP: Wenn man mit der Maus über Methoden "Hovert" sieht man Informationen, welche Parameter Übergeben werden und was die Methode Macht +# (Zumindest, wenn man gut dokumentiert hat :D ) + +# Bei bugs oder Frage könnt ihr mich gerne kontaktieren + +my_vdp = van_der_pol(eps=1.5, dt=0.05) # Erstellen eines Van Der Pol Oszillators + +# Modellprädiktiv regeln +my_mpc = mpc(my_vdp) # MPC instanziieren +my_mpc.create_controller(True) # MPC Solver erstellen (white_box = True weil mit dem vdp als prozessmodell geregelt werden soll) + +# Anfangszustand definieren +x0 = np.array([[1], [1]]) + +# sollwerttrajektorie definieren +target = np.zeros(shape=(200, 2)) +target[0:50] = np.array([0.5, 0]) +target[50:100] = np.array([-1, 0]) +target[100:150] = np.array([1.5, 0]) +target[150:200] = np.array([0, 0]) + +# MPC ausführen +my_mpc.run(x0, target) diff --git a/01_Input/Vorlagen/LaTeX Vorlage b/01_Input/Vorlagen/LaTeX Vorlage new file mode 160000 index 0000000000000000000000000000000000000000..0c6a9c6dbf8d73aa10e6f93d07079781fd3a998e --- /dev/null +++ b/01_Input/Vorlagen/LaTeX Vorlage @@ -0,0 +1 @@ +Subproject commit 0c6a9c6dbf8d73aa10e6f93d07079781fd3a998e diff --git a/01_Input/Vorlagen/MA Konrad Beeser b/01_Input/Vorlagen/MA Konrad Beeser new file mode 160000 index 0000000000000000000000000000000000000000..959391878e07bdeb38847897bdf8ccbd81665f29 --- /dev/null +++ b/01_Input/Vorlagen/MA Konrad Beeser @@ -0,0 +1 @@ +Subproject commit 959391878e07bdeb38847897bdf8ccbd81665f29 diff --git a/01_Input/Vorlagen/MPC Minimalbeispiele b/01_Input/Vorlagen/MPC Minimalbeispiele new file mode 160000 index 0000000000000000000000000000000000000000..c2be9a891103e686343dcbab4de06b3eb6819c51 --- /dev/null +++ b/01_Input/Vorlagen/MPC Minimalbeispiele @@ -0,0 +1 @@ +Subproject commit c2be9a891103e686343dcbab4de06b3eb6819c51 diff --git a/01_Input/Vorlagen/Masterarbeit Konrad Beeser b/01_Input/Vorlagen/Masterarbeit Konrad Beeser new file mode 160000 index 0000000000000000000000000000000000000000..959391878e07bdeb38847897bdf8ccbd81665f29 --- /dev/null +++ b/01_Input/Vorlagen/Masterarbeit Konrad Beeser @@ -0,0 +1 @@ +Subproject commit 959391878e07bdeb38847897bdf8ccbd81665f29