From 3685b4623592e26c4155d10e7980d9f882687ab1 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Mon, 14 Apr 2025 13:26:22 -0400 Subject: [PATCH 01/11] bones of cssfault --- .../simulations/simpleRWFaultScenario.py | 3 ++- .../simulations/utilities/CSSfault.py | 27 +++++++++++++++++++ .../simulations/utilities/rwfault.py | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 simulation-container/simulations/utilities/CSSfault.py diff --git a/simulation-container/simulations/simpleRWFaultScenario.py b/simulation-container/simulations/simpleRWFaultScenario.py index de90db4..9607ce7 100644 --- a/simulation-container/simulations/simpleRWFaultScenario.py +++ b/simulation-container/simulations/simpleRWFaultScenario.py @@ -356,7 +356,8 @@ def run(plot, simulation_id): conn.close() if __name__ == "__main__": - run(False, simulation_id=3192025) + #run(False, simulation_id=3192025) + simulate(True) diff --git a/simulation-container/simulations/utilities/CSSfault.py b/simulation-container/simulations/utilities/CSSfault.py new file mode 100644 index 0000000..1ba7d91 --- /dev/null +++ b/simulation-container/simulations/utilities/CSSfault.py @@ -0,0 +1,27 @@ +from fault import Fault +from collections.abc import Collection +from collections import OrderedDict +from typing import Any +import random +from Basilisk.architecture import sysModel, messaging +import numpy as np + +class CSSfault(sysModel.SysModel): + def __init__(self, components : Collection[Any], **kwargs): + defaults = kwargs.get("defaults") + self.components = components + self.fault = Fault(components, defaults) + sysModel.SysModel.__init__() + + + def inject(self, newSettings : list[dict]): + for i in range(len(self.components)): + eval("self." + newSettings["type"]) + return newSettings + + def inject_random(self, chance): + return super().inject_random(chance) + + def reset(self): + return super().reset() + \ No newline at end of file diff --git a/simulation-container/simulations/utilities/rwfault.py b/simulation-container/simulations/utilities/rwfault.py index c1c1e58..8080c2f 100644 --- a/simulation-container/simulations/utilities/rwfault.py +++ b/simulation-container/simulations/utilities/rwfault.py @@ -1,4 +1,4 @@ -from faults.fault import Fault +from utilities.fault import Fault from collections.abc import Collection from collections import OrderedDict from typing import Any From 5f7c2b8f6d019764d08dae384188b3ec326aa50a Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Tue, 22 Apr 2025 18:09:31 -0400 Subject: [PATCH 02/11] CSSfault + simpleCSSFaultScenario built and tested --- .../simulations/simpleCSSFaultScenario.py | 342 ++++++++++++++++++ .../simulations/utilities/CSSfault.py | 69 +++- 2 files changed, 403 insertions(+), 8 deletions(-) create mode 100644 simulation-container/simulations/simpleCSSFaultScenario.py diff --git a/simulation-container/simulations/simpleCSSFaultScenario.py b/simulation-container/simulations/simpleCSSFaultScenario.py new file mode 100644 index 0000000..7dfacbc --- /dev/null +++ b/simulation-container/simulations/simpleCSSFaultScenario.py @@ -0,0 +1,342 @@ +import matplotlib.pyplot as plt +import numpy as np +import random +from utilities.CSSfault import CSSfault +import psycopg2 +from psycopg2 import sql +import json + +#utilities? +from Basilisk.architecture import messaging, sysModel +from Basilisk.utilities import macros +from Basilisk.utilities import orbitalMotion +from Basilisk.utilities import unitTestSupport +from Basilisk.utilities import RigidBodyKinematics as rbk + +from Basilisk.utilities import simIncludeGravBody + + +#simulation tools + +from Basilisk.simulation import spacecraft +from Basilisk.simulation import extForceTorque +from Basilisk.simulation import simpleNav + +from Basilisk.fswAlgorithms import attTrackingError +from Basilisk.fswAlgorithms import inertial3D +from Basilisk.fswAlgorithms import mrpFeedback +from Basilisk.simulation import coarseSunSensor + + +#general simulation initialization, i think +from Basilisk.utilities import SimulationBaseClass + +class SensorSunPos(sysModel.SysModel): + def __init__(self, sim, samplingTime, simTaskName, sensors, nav, inertial): + super().__init__() + self.sensors = sensors + self.navLog = nav.attOutMsg.recorder(samplingTime) + sim.AddModelToTask(simTaskName, self.navLog) + self.inertial = inertial + self.UpdateState(-1) + + def UpdateState(self, CurrentSimNanos): + weightedSum = [] + for i in self.sensors: + weightedSum.append((i.sensedValue - i.senBias) * np.array(i.nHat_B)) + weightedSum = np.sum(weightedSum, axis=0) + if np.linalg.norm(weightedSum): + v_sun_B = weightedSum / np.linalg.norm(weightedSum) + C_BN = rbk.MRP2C(self.navLog.sigma_BN[-1]) + v_sun = C_BN.T @ v_sun_B + theta = np.atan(v_sun[1] / v_sun[0]) + phi = np.atan(v_sun[2] / np.sqrt(v_sun[0]**2 + v_sun[1]**2)) * -1 + psi = 0 + euler = [theta, phi, psi] + orientation = rbk.euler3212MRP(euler) + self.sensedSun = [euler[0][0], euler[1][0], euler[2]] + self.inertial.sigma_R0N = orientation + else: + self.sensedSun = self.inertial.sigma_R0N + +def simulate(plot): + #a bunch of initializations + simTaskName = "sim city" + simProcessName = "mr. sim" + + satSim = SimulationBaseClass.SimBaseClass() + timestep = 5 + dynamics = satSim.CreateNewProcess(simProcessName) + simulationTimeStep = macros.sec2nano(timestep) + dynamics.addTask(satSim.CreateNewTask(simTaskName, simulationTimeStep)) + + satellite = spacecraft.Spacecraft() + satellite.ModelTag = "oops" + + + #satellite state definitions + inertia = [1000., 0., 0., + 0., 1000., 0., + 0., 0., 1000.] + + #note that all angular orientations (here and all throughout) are in MRPs + #angular velocities are in rad/s tho + #satellite mass + satellite.hub.mHub = 1000.0 + #distance from body frame origin to COM + satellite.hub.r_BcB_B= [[0.0], [0.0], [0.0]] + #adding inertia to the objectsatellite + satellite.hub.IHubPntBc_B = unitTestSupport.np2EigenMatrix3d(inertia) + #orientation of body frame relative to inertial + satellite.hub.sigma_BNInit = rbk.euler3212MRP([0, 0, 0]) + #ang velocity of body frame relative to inertial expressed in body frame coords + satellite.hub.omega_BN_BInit = [[0.0], [0.0], [0.0]] + + satSim.AddModelToTask(simTaskName, satellite) + + #gravity stuff - 2BP + gravity = simIncludeGravBody.gravBodyFactory() + earth = gravity.createEarth() + earth.isCentralBody = True + gravity.createSun() + + #spice log initialization - date is just cause that's what the example used + UTCInit = "2012 MAY 1 00:28:30.0" + spice = gravity.createSpiceInterface(time=UTCInit, epochInMsg=True) + satSim.AddModelToTask(simTaskName, spice) + + gravity.addBodiesTo(satellite) + + #orbits! + oe = orbitalMotion.ClassicElements() + + r = 7000. * 1000 + oe.a = r + oe.e = 0.000 #1 + oe.i = 0.0 #90.0 * macros.D2R + + oe.Omega = 0 #110 gets permanent illumination at i = 90 + oe.omega = 0 #90.0 * macros.D2R + oe.f = 0 #85.3 * macros.D2R + rN, vN = orbitalMotion.elem2rv(earth.mu, oe) + oe = orbitalMotion.rv2elem(earth.mu, rN, vN) #yea idk why this exists + + #more satellite initializations + #for some reason these are relative to planet, but the + #satellite log's aren't + satellite.hub.r_CN_NInit = rN + satellite.hub.v_CN_NInit = vN + + #sim time + n = np.sqrt(earth.mu / oe.a**3) + period = 2. * np.pi / n + simTime = macros.sec2nano(1 * period) + + #navigation module + nav = simpleNav.SimpleNav() + nav.ModelTag = "navigation" + satSim.AddModelToTask(simTaskName, nav) + nav.scStateInMsg.subscribeTo(satellite.scStateOutMsg) + nav.sunStateInMsg.subscribeTo(spice.planetStateOutMsgs[1]) + + #inertial reference attitude + inertial = inertial3D.inertial3D() + inertial.ModelTag = "inertial3D" + satSim.AddModelToTask(simTaskName, inertial) + inertial.sigma_R0N = [0., 0.5, 0.] + + + + #attitude error from reference + attError = attTrackingError.attTrackingError() + attError.ModelTag = "attErrorInertial3D" + attError.attNavInMsg.subscribeTo(nav.attOutMsg) + attError.attRefInMsg.subscribeTo(inertial.attRefOutMsg) + satSim.AddModelToTask(simTaskName, attError) + + control = mrpFeedback.mrpFeedback() + + control.ModelTag = "mrpFeedback" + satSim.AddModelToTask(simTaskName, control) + #parameters taken from scenarioAttitudeFeedbackRW + control.K = 3.5 + control.Ki = -1 #negative turns integral control off + control.P = 30.0 + control.integralLimit = 2. / control.Ki * 0.1 + + #external torque + ext = extForceTorque.ExtForceTorque() + satellite.addDynamicEffector(ext) + satSim.AddModelToTask(simTaskName, ext) + ext.cmdTorqueInMsg.subscribeTo(control.cmdTorqueOutMsg) + + #some final module subscriptions + + #apparently mrpFeedback needs config info for the satellite + configData = messaging.VehicleConfigMsgPayload() + configData.ISCPntB_B = inertia + configDataMsg = messaging.VehicleConfigMsg() + configDataMsg.write(configData) + control.guidInMsg.subscribeTo(attError.attGuidOutMsg) + control.vehConfigInMsg.subscribeTo(configDataMsg) + + + #CSS stuff + def setup(CSS): + CSS.fov = 90. * macros.D2R + CSS.scaleFactor = 1.0 + CSS.maxOutput = 4.0 + CSS.minOutput = 0.0 + CSS.sunInMsg.subscribeTo(spice.planetStateOutMsgs[1]) + CSS.stateInMsg.subscribeTo(satellite.scStateOutMsg) + #CSS.sunEclipseInMsg.subscribeTo(eclipses.eclipseOutMsgs[0]) + CSS.nHat_B = np.array([1.0, 0.0, 0.0]) + + sensors = [] + loggers = [] + for i in range(18): + sensors.append(coarseSunSensor.CoarseSunSensor()) + setup(sensors[i]) + #sensors[i].senNoiseStd = i/500 + sensors[i].senBias = 0#i/4.0 + satSim.AddModelToTask(simTaskName, sensors[i]) + loggers.append(sensors[i].cssDataOutMsg.recorder()) + satSim.AddModelToTask(simTaskName, loggers[i]) + sensors[3].nHat_B = np.array([-1.0, 0.0, 0.0]) + sensors[4].nHat_B = np.array([-1.0, 0.0, 0.0]) + sensors[5].nHat_B = np.array([-1.0, 0.0, 0.0]) + sensors[6].nHat_B = np.array([0.0, 1.0, 0.0]) + sensors[7].nHat_B = np.array([0.0, 1.0, 0.0]) + sensors[8].nHat_B = np.array([0.0, 1.0, 0.0]) + sensors[9].nHat_B = np.array([0.0, -1.0, 0.0]) + sensors[10].nHat_B = np.array([0.0, -1.0, 0.0]) + sensors[11].nHat_B = np.array([0.0, -1.0, 0.0]) + sensors[12].nHat_B = np.array([0.0, 0.0, 1.0]) + sensors[13].nHat_B = np.array([0.0, 0.0, 1.0]) + sensors[14].nHat_B = np.array([0.0, 0.0, 1.0]) + sensors[15].nHat_B = np.array([0.0, 0.0, -1.0]) + sensors[16].nHat_B = np.array([0.0, 0.0, -1.0]) + sensors[17].nHat_B = np.array([0.0, 0.0, -1.0]) + for i in range(18): + sensors[i].r_B = sensors[i].nHat_B + + #how often each logger samples + samplingTime = unitTestSupport.samplingTime(simTime, simulationTimeStep,\ + simTime / simulationTimeStep) + + cssfault = CSSfault(sensors) + satSim.AddModelToTask(simTaskName, cssfault) + + senseSun = SensorSunPos(satSim, samplingTime, simTaskName, sensors, nav, inertial) + satSim.AddModelToTask(simTaskName, senseSun) + + """data collection""" + + sensedSunLog = senseSun.logger("sensedSun") + satSim.AddModelToTask(simTaskName, sensedSunLog) + + faults = cssfault.logger("faultState") + satSim.AddModelToTask(simTaskName, faults) + + #true satellite states (translational and rotational position/velocity) + satLog = satellite.scStateOutMsg.recorder(samplingTime) + satSim.AddModelToTask(simTaskName, satLog) + + #technically a module for adding noise to sensors, but eh i use it for sun pointing + navLog = nav.attOutMsg.recorder(samplingTime) + satSim.AddModelToTask(simTaskName, navLog) + + #planet states (main planet and sun) + spiceLog = spice.planetStateOutMsgs[0].recorder(samplingTime) + satSim.AddModelToTask(simTaskName, spiceLog) + + #attitude error (from reference) + errorLog = attError.attGuidOutMsg.recorder(samplingTime) + satSim.AddModelToTask(simTaskName, errorLog) + + sunPoint = np.array(navLog.vehSunPntBdy) + + CSSdata = [] + for i in loggers: + CSSdata.append(i.OutputData) + CSSdata = np.array(CSSdata) + + sigma = np.array(satLog.sigma_BN) + + """SIMULATION""" + + satSim.SetProgressBar(True) + satSim.InitializeSimulation() + + satSim.TotalSim.SingleStepProcesses() + + satSim.ConfigureStopTime(simTime) + satSim.ExecuteSimulation() + + sensedSun = np.array(sensedSunLog.sensedSun) + + sunPoint = np.array(navLog.vehSunPntBdy) + + CSSdata = [] + for i in loggers: + CSSdata.append(i.OutputData) + CSSdata = np.array(CSSdata) + + sigma = np.array(satLog.sigma_BN) + + """PLOTTING""" + if plot: + plt.close("all") + + #pointing vector to the sun in the body frame + plt.figure(1) + timeAxis = satLog.times() + for i in range(3): + plt.plot(timeAxis * macros.NANO2SEC / period, sunPoint[:, i], + color=unitTestSupport.getLineColor(i, 3), + label=rf'$r_{i+1}$') + plt.title("Sun Direction (Body)") + plt.legend() + plt.xlabel("Time [orbits]") + plt.ylabel("Vector Component") + + #CSS sensor values, biases included + plt.figure(2, figsize=(20,len(CSSdata) / 2)) + timeAxis = loggers[0].times() + for i in range(len(CSSdata)): + plt.subplot(int(len(CSSdata) / 6), 6, i+1) + plt.plot(timeAxis * macros.NANO2SEC / period, CSSdata[i], + color=unitTestSupport.getLineColor(i, len(CSSdata))) + plt.title(f'$CSS_{{{i+1}}}$') + plt.ylim(-0.5, 1.5) + plt.xlabel("Time [orbits]") + plt.ylabel("Sensor Output") + + + #where the sensors collectively think the sun is (orientation vector) + #plt.figure(3) + #not sure what i was thinking when i made this plot + plt.figure(3) + sensedSun = np.array(sensedSun) + plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 0], label=rf"$\sigma_{1}$") + plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 1], label=rf"$\sigma_{2}$") + plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 2], label=rf"$\sigma_{3}$") + plt.title("Sun Orientation via CSS Data (Inertial, 321 Euler)") + plt.legend() + plt.xlabel("Time [orbits]") + plt.ylabel("Orientation (rad)") + + #satellite orientation relative to inertial + plt.figure(4) + for i in range(3): + plt.plot(satLog.times() / period, sigma[:, i], label=rf"$\sigma_{i+1}$") + plt.title("Inertial Orientation") + plt.xlabel("Time [orbits]") + plt.ylabel("Orientation (MRP)") + plt.legend() + + plt.tight_layout() + plt.show() + return satLog.times() / period, sigma, sensedSun, CSSdata +simulate(True) + \ No newline at end of file diff --git a/simulation-container/simulations/utilities/CSSfault.py b/simulation-container/simulations/utilities/CSSfault.py index 1ba7d91..83de4d4 100644 --- a/simulation-container/simulations/utilities/CSSfault.py +++ b/simulation-container/simulations/utilities/CSSfault.py @@ -1,27 +1,80 @@ -from fault import Fault +from utilities.fault import Fault from collections.abc import Collection from collections import OrderedDict from typing import Any import random from Basilisk.architecture import sysModel, messaging +from Basilisk.simulation import coarseSunSensor import numpy as np class CSSfault(sysModel.SysModel): def __init__(self, components : Collection[Any], **kwargs): defaults = kwargs.get("defaults") self.components = components - self.fault = Fault(components, defaults) - sysModel.SysModel.__init__() + self.defaults = defaults + self.types = ["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"] + super().__init__() + self.faultState = ["NOMINAL"] * len(self.components) + self.chance = kwargs.get("chance") + self.seed = kwargs.get("seed") + for i in self.components: + i.faultState = getattr(coarseSunSensor, "NOMINAL") + def UpdateState(self, CurrentSimNanos): + self.faultState = [i[1] for i in self.inject_random(self.chance)] + def inject(self, newSettings : list): + for i in range(len(self.components)): + try: + if newSettings[i].upper() == "NOMINAL": + self.components[i].faultState = getattr(coarseSunSensor, (newSettings[i]).upper()) + else: + self.components[i].faultState = getattr(coarseSunSensor, "CSSFAULT_" + (newSettings[i]).upper()) + except: + raise NameError(newSettings[i] + " is not yet a supported fault type.") - def inject(self, newSettings : list[dict]): - for i in range(len(self.components)): - eval("self." + newSettings["type"]) return newSettings def inject_random(self, chance): - return super().inject_random(chance) + if not chance: + chance = 0.0005 + toInject = self.randomize(chance, seed=self.seed) + newSettings = [] + for i in range(len(toInject)): + if toInject[i]: + fault = np.random.choice(self.types, 1)[0] + newSettings.append(fault) + else: + past = self.components[i].faultState + if past == 4: + newSettings.append("NOMINAL") + else: + newSettings.append(self.types[self.components[i].faultState]) + return list(zip(toInject, self.inject(newSettings))) def reset(self): - return super().reset() + if not self.defaults: + raise ValueError("Defaults have not been set.") + for i in range(len(self.components)): + try: + self.components[i].faultState = getattr(coarseSunSensor, "CSSFAULT_" + (self.defaults[i]).upper()) + except: + raise TypeError("Defaults and/or Components do not contain necessary information.") + + def randomize(self, chance : float, **kwargs): + """ + Choose which components to randomly have faults injected. + + Parameter: + chance (float): the chance that each component will fault. + + Returns: + toInject (list[bool]): Indicates whether a fault is to be injected to the component at this index + """ + if not 0. <= chance <= 1.: + raise ValueError("Chance must be between 0 and 1.") + seed = kwargs.get("seed") + if seed is not None: + random.seed(seed) + toInject = [random.random() < chance for _ in self.components] + return toInject \ No newline at end of file From 98de1f20f4977bf1150e32eeb0df41c23fa10201 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Tue, 22 Apr 2025 21:03:01 -0400 Subject: [PATCH 03/11] deleted abstract class fault; modified rwfault to run as a Basilisk module; comments and style --- .../simulations/simpleRWFaultScenario.py | 56 +++++---- .../simulations/utilities/CSSfault.py | 72 ++++++++++-- .../simulations/utilities/fault.py | 76 ------------ .../simulations/utilities/rwfault.py | 111 ++++++++++++++++-- 4 files changed, 198 insertions(+), 117 deletions(-) delete mode 100644 simulation-container/simulations/utilities/fault.py diff --git a/simulation-container/simulations/simpleRWFaultScenario.py b/simulation-container/simulations/simpleRWFaultScenario.py index 9607ce7..0442abb 100644 --- a/simulation-container/simulations/simpleRWFaultScenario.py +++ b/simulation-container/simulations/simpleRWFaultScenario.py @@ -150,13 +150,13 @@ def simulate(plot): """ maxMomentum = 100. defaults = [ - {"axis":[1, 0, 0], "u_max":0.2, "type":"Honeywell_HR16"}, - {"axis":[0, 1, 0], "u_max":0.2, "type":"Honeywell_HR16"}, - {"axis":[0, 0, 1], "u_max":0.2, "type":"Honeywell_HR16"}, + {"axis":[1, 0, 0], "u_max":0.2, "rwType":"Honeywell_HR16"}, + {"axis":[0, 1, 0], "u_max":0.2, "rwType":"Honeywell_HR16"}, + {"axis":[0, 0, 1], "u_max":0.2, "rwType":"Honeywell_HR16"}, ] for i in range(len(defaults)): - rwFactory.create(defaults[i]["type"], defaults[i]["axis"], maxMomentum=maxMomentum, RWModel=rwModel, u_max=defaults[i]["u_max"]) + rwFactory.create(defaults[i]["rwType"], defaults[i]["axis"], maxMomentum=maxMomentum, RWModel=rwModel, u_max=defaults[i]["u_max"]) numRW = rwFactory.getNumOfDevices() @@ -167,12 +167,15 @@ def simulate(plot): rwFactory.addToSpacecraft(satellite.ModelTag, rwEffector, satellite) satSim.AddModelToTask(simTaskName, rwEffector, 2) #the 2 ensures it will get updated before the satellite - higher priority + # for addition to RWFault components = [] count = 0 for i in rwFactory.rwList: - components.append((defaults[count]["type"], rwFactory.rwList[i])) + components.append((defaults[count]["rwType"], rwFactory.rwList[i])) count += 1 - rwf = RWFault(components, rwFactory = rwFactory, rwEffector=rwEffector, defaults=defaults, rwModel=rwModel) + #see rwfault.py for notes on requirements + rwf = RWFault(components, rwFactory = rwFactory, rwEffector=rwEffector, defaults=defaults, rwModel=rwModel, chance=0.001) + satSim.AddModelToTask(simTaskName, rwf) #control torque """note: because of the RW's higher execution priority, @@ -240,29 +243,37 @@ def simulate(plot): #RW recorders rwMotorLog = rwMotor.rwMotorTorqueOutMsg.recorder(samplingTime) satSim.AddModelToTask(simTaskName, rwMotorLog) + + #measure the actual torque generated by each RW rwTorqueLog = [] for i in range(numRW): rwTorqueLog.append(rwEffector.rwOutMsgs[i].recorder(samplingTime)) satSim.AddModelToTask(simTaskName, rwTorqueLog[i]) + + #fault log as created by RWFault + faultLog = rwf.logger("fault") + satSim.AddModelToTask(simTaskName, faultLog) - #fault log - faultLog = [] + #state log as created by RWFault + stateLog = rwf.logger("state") + satSim.AddModelToTask(simTaskName, stateLog) """simulation start""" + satSim.SetProgressBar(True) satSim.InitializeSimulation() - - - while satSim.TotalSim.CurrentNanos < simTime: - satSim.TotalSim.SingleStepProcesses() - #msgs.append(stateReader) - temp = rwf.inject_random(0.001) - faultLog.append([(1 if i[0] else 0) for i in temp]) - for i in range(len(faultLog[-1])): - if len(faultLog) > 1 and faultLog[-2][i] == 1: - faultLog[-1][i] = 1 - - faultLog = np.array(faultLog) + satSim.ConfigureStopTime(simTime) + satSim.ExecuteSimulation() + + #update faultLog to indicate all timesteps after injection as a fault + faultLog = np.array(faultLog.fault) + for i in range(1, len(faultLog)): + for j in range(len(faultLog[i])): + if faultLog[i-1, j]: + faultLog[i, j] = True + + #extract actual output torques from recorder motorTorque = [rw.u_current for rw in rwTorqueLog] + sigma = np.array(satLog.sigma_BN) """plotting""" @@ -309,6 +320,11 @@ def simulate(plot): plt.show() return satLog.times(), sigma, rwMotorLog.motorTorque[:, :3], motorTorque, faultLog +""" +This is a miniaturized version of dataloader.py for this specific scenario. + +Just passes the return values of simulate() onto middleware.py +""" def run(plot, simulation_id): times, sigma, torque_desired, torque_actual, faults = simulate(plot) conn = psycopg2.connect( diff --git a/simulation-container/simulations/utilities/CSSfault.py b/simulation-container/simulations/utilities/CSSfault.py index 83de4d4..e1742b1 100644 --- a/simulation-container/simulations/utilities/CSSfault.py +++ b/simulation-container/simulations/utilities/CSSfault.py @@ -6,34 +6,73 @@ from Basilisk.architecture import sysModel, messaging from Basilisk.simulation import coarseSunSensor import numpy as np +""" +This is a module for introducing faults into Coarse Sun Sensors. It is a Basilisk Module, so it will +run at every time step provided it is added to a simulation task. +The module is essentially a way to randomize the built-in faulted states of the coarseSunSensor module. +It randomly assigns random faults to each CSS. If the randomly chosen fault is anything except NOMINAL +and RAND, that sensor is faulted until it gets a different randomly chosen fault. If the randomly chosen fault is NOMINAL, +that sensor is not faulted! If the randomly chosen fault is RAND, that sensor returns to NOMINAL the next turn, +and does not have an entry in the fault sweepstakes that turn. +""" class CSSfault(sysModel.SysModel): + """ + Requires: + - A list of the sensors + Optional: + - A list of default fault states and other things for the sensors + - a chance for the random fault injections + - a seed for the random fault injections + """ def __init__(self, components : Collection[Any], **kwargs): defaults = kwargs.get("defaults") self.components = components self.defaults = defaults self.types = ["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"] super().__init__() - self.faultState = ["NOMINAL"] * len(self.components) + #loggable attribute for fault states + self.faultState = ["NOMINAL"] * len(self.components) #all sensors are assumed to start off nominal self.chance = kwargs.get("chance") self.seed = kwargs.get("seed") for i in self.components: - i.faultState = getattr(coarseSunSensor, "NOMINAL") - + i.faultState = getattr(coarseSunSensor, "NOMINAL") #forcibly make all sensors nominal at first + """ + Update method. Runs at every timestep. + + Just calls the random fault injection and uses its results to update the loggable attribute. + """ def UpdateState(self, CurrentSimNanos): self.faultState = [i[1] for i in self.inject_random(self.chance)] + + """ + Injection if specific new settings are desired. + + Goes through the list of sensors and sets them to the desired fault state. + Used by inject_random once new settings have been randomized. Returns the + new settings. + """ def inject(self, newSettings : list): for i in range(len(self.components)): try: + #for some reason, all the predefined fault states are CSSFAULT_something except NOMINAL if newSettings[i].upper() == "NOMINAL": self.components[i].faultState = getattr(coarseSunSensor, (newSettings[i]).upper()) else: self.components[i].faultState = getattr(coarseSunSensor, "CSSFAULT_" + (newSettings[i]).upper()) except: raise NameError(newSettings[i] + " is not yet a supported fault type.") - return newSettings + """ + Random injection of faults with a given chance. + Whether each sensor is faulted is randomized, and the type of fault is also + randomized. As stated above, if the fault chosen is RAND, it will only last 1 turn, + and return to NOMINAL the next. Otherwise, it will remain at the chosen or prior state + until changed here. This returns a list of the following form: + (bool, fault state) where bool is whether a fault is injected into the given component + and fault state is the new (or old, if no new fault) setting. + """ def inject_random(self, chance): if not chance: chance = 0.0005 @@ -41,9 +80,11 @@ def inject_random(self, chance): newSettings = [] for i in range(len(toInject)): if toInject[i]: + #randomly choose the fault type fault = np.random.choice(self.types, 1)[0] newSettings.append(fault) else: + #check if the last fault state was RAND, and change back to NOMINAL if so past = self.components[i].faultState if past == 4: newSettings.append("NOMINAL") @@ -51,6 +92,12 @@ def inject_random(self, chance): newSettings.append(self.types[self.components[i].faultState]) return list(zip(toInject, self.inject(newSettings))) + """ + Resets all reaction wheels to the prescribed defaults, if prescribed. + + Will eventually need to be updated to reset to NOMINAL if not prescribed, + but doesn't really matter because this is not used in normal operation. + """ def reset(self): if not self.defaults: raise ValueError("Defaults have not been set.") @@ -59,17 +106,16 @@ def reset(self): self.components[i].faultState = getattr(coarseSunSensor, "CSSFAULT_" + (self.defaults[i]).upper()) except: raise TypeError("Defaults and/or Components do not contain necessary information.") - - def randomize(self, chance : float, **kwargs): - """ - Choose which components to randomly have faults injected. + """ + Choose which components to randomly have faults injected. - Parameter: - chance (float): the chance that each component will fault. + Parameter: + chance (float): the chance that each component will fault. - Returns: - toInject (list[bool]): Indicates whether a fault is to be injected to the component at this index - """ + Returns: + toInject (list[bool]): Indicates whether a fault is to be injected to the component at this index + """ + def randomize(self, chance : float, **kwargs): if not 0. <= chance <= 1.: raise ValueError("Chance must be between 0 and 1.") seed = kwargs.get("seed") diff --git a/simulation-container/simulations/utilities/fault.py b/simulation-container/simulations/utilities/fault.py deleted file mode 100644 index e3cd30c..0000000 --- a/simulation-container/simulations/utilities/fault.py +++ /dev/null @@ -1,76 +0,0 @@ -import random -from abc import ABC, abstractmethod -from collections.abc import Collection -from typing import Any - - -class Fault(ABC): - """ - Abstract base class for componentwise fault injection - """ - def __init__(self, components: Collection[Any], **kwargs): - """ - Initialize the abstract fault. - - Parameters: - components (Collection): the components in which to (potentially) inject the fault - defaults: a dictionary of the default settings for each component - """ - self.components = components - self.defaults = kwargs.get("defaults") if kwargs.get("defaults") else None - - @abstractmethod - def inject(self, newSettings) -> Collection[Any]: - """ - Inject a predefined fault. - - Returns: - Collection: Details of fault injected into each component. - """ - pass - - @abstractmethod - def inject_random(self, chance : float) -> Collection[tuple[bool, Any]]: - """ - Inject random faults into random components. - - Parameter: - chance (float): the chance that each component will fault. - - Returns: - Collection: - bool: Indicates whether a fault is to be injected to the component at this index - Any: Details of fault injected, None if no fault injected. - """ - pass - - @abstractmethod - def reset(self) -> bool: - """ - Reset all components to settings pre-fault injections, if defaults are given. - - Returns: - bool: True if successful - """ - pass - - def randomize(self, chance : float, **kwargs): - """ - Choose which components to randomly have faults injected. - - Parameter: - chance (float): the chance that each component will fault. - - Returns: - toInject (list[bool]): Indicates whether a fault is to be injected to the component at this index - """ - if not 0. <= chance <= 1.: - raise ValueError("Chance must be between 0 and 1.") - seed = kwargs.get("seed") - if seed is not None: - random.seed(seed) - toInject = [random.random() < chance for _ in self.components] - return toInject - - - diff --git a/simulation-container/simulations/utilities/rwfault.py b/simulation-container/simulations/utilities/rwfault.py index 8080c2f..b030ac4 100644 --- a/simulation-container/simulations/utilities/rwfault.py +++ b/simulation-container/simulations/utilities/rwfault.py @@ -1,27 +1,86 @@ -from utilities.fault import Fault + from collections.abc import Collection from collections import OrderedDict from typing import Any import random -from Basilisk import messaging +from Basilisk.architecture import messaging, sysModel import numpy as np +""" +This is a module for introducing faults into Reaction Wheels. It is a Basilisk module, +so it runs at every timestep provided it is added to a simulation task. -class RWFault(Fault): +The only implemented methodology for faults thus far is a reduction in max torque output +of the reaction wheels. The introduction of friction will eventually be added. +""" +class RWFault(sysModel.SysModel): + """ + Requires, in order: + - A list of the form (type, RW), where type is the model of the reaction wheel and RW is the reaction wheel itself + - the rwFactory (simIncluderwFactory()) used to generate those wheels + - the rwEffector (reactionWheelStateEffector) used to make the wheels actually do something + + Optional: + - the model used for the RWs (jitter, balanced, etc). not not implemented yet + - a seed for the randomized fault injection + - a fault injection chance per RW for the randomized fault injection + - defaults - the original settings of the RWs + """ def __init__(self, components: Collection[Any], rwFactory, rwEffector, **kwargs): - super().__init__(components, **kwargs) + super().__init__() + self.components = components self.rwFactory = rwFactory self.rwEffector = rwEffector self.rwModel = kwargs.get("model") self.seed = kwargs.get("seed") + self.chance = kwargs.get("chance") + self.defaults = kwargs.get("defaults") + #if the defaults are not passed in, the defaults are pulled from the starting states + if not self.defaults: + self.defaults = [] + for i in range(len(components)): + spin = [sublist[0] for sublist in self.components[i][1].gsHat_B] + rwType = self.components[i][0] + u_max = self.components[i][1].u_max + self.defaults.append({"axis":spin, "u_max":u_max, "rwType":rwType}) + #loggable attribute for the actual traits of the RWs + self.state = [(i["rwType"], i["axis"], i["u_max"]) for i in self.defaults] + #loggable attribute for the timesteps of fault injections + self.fault = [False for _ in self.components] + + """ + Update method. Runs every timestep. + + Just calls the inject_random method, and updates the loggable attributes with the results. + """ + def UpdateState(self, CurrentSimNanos): + state = self.inject_random(self.chance) + self.state = state[:, 1] + self.fault = state[:, 0] + + """ + The method that actually changes out the RWs. + + Only called from inject() - takes in new RW settings, and uses them to replace + the batch of RWs that existed previously with new ones with those settings. + + This is the only way I could find to introduce faults into RWs on the Python side. + """ def replaceRWs(self, newRWs): + #empty existing RW carriers self.rwFactory.rwList = OrderedDict([]) self.rwEffector.ReactionWheelData = self.rwEffector.ReactionWheelData[:0] + newComps = [] + #create new RWs for (rwType, spin, torque) in newRWs: rwModel = self.rwModel if self.rwModel else messaging.BalancedWheels RW_new = self.rwFactory.create(rwType, spin, maxMomentum=100., RWmodel=rwModel, u_max=torque) self.rwEffector.addReactionWheel(RW_new) - + newComps.append((rwType, RW_new)) + self.components = newComps + """ + Resets all RWs to default settings. + """ def reset(self): if not self.defaults: raise ValueError("Defaults have not been set.") @@ -37,26 +96,62 @@ def reset(self): self.replaceRWs(resetRWs) return len(self.rwFactory.rwList) > 0 and len(self.rwEffector.ReactionWheelData) > 0 + """ + Meant for non-random injections where the new desired settings are known. Not used in practice, + yet, except as a bridge between inject_random and replaceRWs. + """ def inject(self, newSettings) -> Collection[Any]: self.replaceRWs(newSettings) return newSettings + """ + Does the bulk of the injections in practice currently, randomized. + Each RW has the same chance of being faulted. If it isn't faulted, + the RW still will be replaced, but with the same settings. + If it is faulted, the RW's max torque output will be reduced by some + random factor. This may become multiplicative. + + This method returns a list of tuples of the form: + (bool, (rwType, spin axis, torque)) + where bool is whether a fault was injected, rwType is the rwModel, and torque is the max torque output. + """ def inject_random(self, chance : float) -> Collection[tuple[bool, Any]]: + #if chance isn't passed in + if not chance: + chance = 0.001 toInject = self.randomize(chance, seed=self.seed) if self.seed: random.seed(self.seed) newSettings = [] for i in range(len(toInject)): + #spin and rwType stay the same spin = [sublist[0] for sublist in self.components[i][1].gsHat_B] rwType = self.components[i][0] + #u_max is changed if there's a fault by a random factor u_max = self.components[i][1].u_max if toInject[i]: rand = random.random() * 10 u_max = u_max / rand if rand >= 1 else u_max * rand newSettings.append((rwType, spin, u_max)) details = list(zip(toInject, self.inject(newSettings))) - for i in range(len(details)): - if not details[i][0]: - details[i] = (details[i][0], None) return np.array(details, dtype=object) + + """ + Choose which components to randomly have faults injected. + + Parameter: + chance (float): the chance that each component will fault. + + Returns: + toInject (list[bool]): Indicates whether a fault is to be injected to the component at this index + """ + def randomize(self, chance : float, **kwargs): + + if not 0. <= chance <= 1.: + raise ValueError("Chance must be between 0 and 1.") + seed = kwargs.get("seed") + if seed is not None: + random.seed(seed) + toInject = [random.random() < chance for _ in self.components] + return toInject \ No newline at end of file From 448f2672b6c48352fbcd7a28209b8140e6da100f Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Wed, 23 Apr 2025 19:38:19 -0400 Subject: [PATCH 04/11] simpleCSSFaultScenario can now be run with attitude and CSS data decoupled, and can be used in testLIME. also, some fixes in CSSfault --- .../simulations/simpleCSSFaultScenario.py | 75 ++++++++++++------- .../simulations/tests/testLIME.py | 61 +++++++++++---- .../simulations/utilities/CSSfault.py | 18 ++++- 3 files changed, 107 insertions(+), 47 deletions(-) diff --git a/simulation-container/simulations/simpleCSSFaultScenario.py b/simulation-container/simulations/simpleCSSFaultScenario.py index 7dfacbc..8196e0e 100644 --- a/simulation-container/simulations/simpleCSSFaultScenario.py +++ b/simulation-container/simulations/simpleCSSFaultScenario.py @@ -59,7 +59,7 @@ def UpdateState(self, CurrentSimNanos): else: self.sensedSun = self.inertial.sigma_R0N -def simulate(plot): +def simulate(plot, CSSsun): #a bunch of initializations simTaskName = "sim city" simProcessName = "mr. sim" @@ -88,9 +88,9 @@ def simulate(plot): #adding inertia to the objectsatellite satellite.hub.IHubPntBc_B = unitTestSupport.np2EigenMatrix3d(inertia) #orientation of body frame relative to inertial - satellite.hub.sigma_BNInit = rbk.euler3212MRP([0, 0, 0]) + satellite.hub.sigma_BNInit = rbk.euler3212MRP([0, 1, 0]) #ang velocity of body frame relative to inertial expressed in body frame coords - satellite.hub.omega_BN_BInit = [[0.0], [0.0], [0.0]] + satellite.hub.omega_BN_BInit = [[0.01/ np.sqrt(3)], [-0.01 / np.sqrt(3)], [0.01 / np.sqrt(3)]] satSim.AddModelToTask(simTaskName, satellite) @@ -157,7 +157,8 @@ def simulate(plot): control = mrpFeedback.mrpFeedback() control.ModelTag = "mrpFeedback" - satSim.AddModelToTask(simTaskName, control) + if CSSsun: + satSim.AddModelToTask(simTaskName, control) #parameters taken from scenarioAttitudeFeedbackRW control.K = 3.5 control.Ki = -1 #negative turns integral control off @@ -165,10 +166,12 @@ def simulate(plot): control.integralLimit = 2. / control.Ki * 0.1 #external torque - ext = extForceTorque.ExtForceTorque() - satellite.addDynamicEffector(ext) - satSim.AddModelToTask(simTaskName, ext) - ext.cmdTorqueInMsg.subscribeTo(control.cmdTorqueOutMsg) + + if CSSsun: + ext = extForceTorque.ExtForceTorque() + satellite.addDynamicEffector(ext) + satSim.AddModelToTask(simTaskName, ext) + ext.cmdTorqueInMsg.subscribeTo(control.cmdTorqueOutMsg) #some final module subscriptions @@ -194,7 +197,8 @@ def setup(CSS): sensors = [] loggers = [] - for i in range(18): + numCSS = 18 + for i in range(numCSS): sensors.append(coarseSunSensor.CoarseSunSensor()) setup(sensors[i]) #sensors[i].senNoiseStd = i/500 @@ -217,18 +221,19 @@ def setup(CSS): sensors[15].nHat_B = np.array([0.0, 0.0, -1.0]) sensors[16].nHat_B = np.array([0.0, 0.0, -1.0]) sensors[17].nHat_B = np.array([0.0, 0.0, -1.0]) - for i in range(18): + for i in range(numCSS): sensors[i].r_B = sensors[i].nHat_B #how often each logger samples samplingTime = unitTestSupport.samplingTime(simTime, simulationTimeStep,\ simTime / simulationTimeStep) - cssfault = CSSfault(sensors) + cssfault = CSSfault(sensors, chance=0.0001) satSim.AddModelToTask(simTaskName, cssfault) senseSun = SensorSunPos(satSim, samplingTime, simTaskName, sensors, nav, inertial) - satSim.AddModelToTask(simTaskName, senseSun) + if CSSsun: + satSim.AddModelToTask(simTaskName, senseSun) """data collection""" @@ -284,6 +289,8 @@ def setup(CSS): sigma = np.array(satLog.sigma_BN) + faults = np.array(faults.faultState) + """PLOTTING""" if plot: plt.close("all") @@ -302,29 +309,30 @@ def setup(CSS): #CSS sensor values, biases included plt.figure(2, figsize=(20,len(CSSdata) / 2)) + colors = plt.cm.tab20.colors[:len(CSSdata)] timeAxis = loggers[0].times() for i in range(len(CSSdata)): plt.subplot(int(len(CSSdata) / 6), 6, i+1) plt.plot(timeAxis * macros.NANO2SEC / period, CSSdata[i], - color=unitTestSupport.getLineColor(i, len(CSSdata))) + color=colors[i]) plt.title(f'$CSS_{{{i+1}}}$') plt.ylim(-0.5, 1.5) plt.xlabel("Time [orbits]") plt.ylabel("Sensor Output") - - #where the sensors collectively think the sun is (orientation vector) - #plt.figure(3) - #not sure what i was thinking when i made this plot - plt.figure(3) - sensedSun = np.array(sensedSun) - plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 0], label=rf"$\sigma_{1}$") - plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 1], label=rf"$\sigma_{2}$") - plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 2], label=rf"$\sigma_{3}$") - plt.title("Sun Orientation via CSS Data (Inertial, 321 Euler)") - plt.legend() - plt.xlabel("Time [orbits]") - plt.ylabel("Orientation (rad)") + if CSSsun: + #where the sensors collectively think the sun is (orientation vector) + #plt.figure(3) + #not sure what i was thinking when i made this plot + plt.figure(3) + sensedSun = np.array(sensedSun) + plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 0], label=rf"$\sigma_{1}$") + plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 1], label=rf"$\sigma_{2}$") + plt.plot(satLog.times () * macros.NANO2SEC / period, sensedSun[:, 2], label=rf"$\sigma_{3}$") + plt.title("Sun Orientation via CSS Data (Inertial, 321 Euler)") + plt.legend() + plt.xlabel("Time [orbits]") + plt.ylabel("Orientation (rad)") #satellite orientation relative to inertial plt.figure(4) @@ -335,8 +343,19 @@ def setup(CSS): plt.ylabel("Orientation (MRP)") plt.legend() + plt.figure(5) + for i in range(numCSS): + plt.plot(satLog.times() / period, faults[:, i], label=rf"$CSS_{{{i+1}}}$") + plt.title("CSS Sensors' Fault State") + plt.xlabel("Time [orbits]") + plt.ylabel("Fault State") + plt.legend() + plt.tight_layout() plt.show() - return satLog.times() / period, sigma, sensedSun, CSSdata -simulate(True) + + return np.array(satLog.times() / period), np.array(sigma), np.array(sensedSun), np.array(CSSdata), np.array(faults) + +if __name__ == "__main__": + simulate(False, False) \ No newline at end of file diff --git a/simulation-container/simulations/tests/testLIME.py b/simulation-container/simulations/tests/testLIME.py index eb858a0..9211f79 100644 --- a/simulation-container/simulations/tests/testLIME.py +++ b/simulation-container/simulations/tests/testLIME.py @@ -9,13 +9,14 @@ #weirdness occurred when i didn't have this parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) sys.path.append(parent_dir) -import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults +#import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults +import simpleCSSFaultScenario as sc +np.set_printoptions(threshold=np.inf) #run the simulation, combine the data per timestep -times, sigma, torque_desired, torque_actual, faults = sc.simulate(False) -torque_actual = np.array(torque_actual) -times = times / np.pow(10, 9) +times, sigma, sensedSun, CSSdata, faults = sc.simulate(False, False) features = [] +times /= 1e9 for i in range(len(times)): #note that the time is included here but not passed into the classifier #it's only included here to make it easier to find the specific timestep being explained @@ -24,12 +25,13 @@ #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. #and that makes sense, because what's really the difference to it between a negative and positive torque? features.append([times[i]]) - features[i].extend(abs(sigma[i])) - features[i].extend(abs(torque_desired[i])) - features[i].extend(abs(torque_actual[:, i])) + #features[i].extend(abs(sigma[i])) + #features[i].extend(abs(sensedSun[i])) + features[i].extend(CSSdata[:, i]) #features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] features = np.array(features) -labels = faults +class_names = np.array(["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"]) +labels = np.array([1 if np.isin(i, class_names[:-1]).any() else 0 for i in faults]) #train and test sets, naming features and labels train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) @@ -37,16 +39,21 @@ test = np.array(test) labels_train = np.array(labels_train) labels_test = np.array(labels_test) -feature_names = np.array(["sigma_x", "sigma_y", "sigma_z", "td_1", "td_2", "td_3", "ta_1", "ta_2", "ta_3"]) +feature_names = []#["sigma_x", "sigma_y", "sigma_z"] +CSS_names = [f"CSS_{i+1}" for i in range(len(CSSdata[:, 0]))] +feature_names.extend(CSS_names) +feature_names = np.array(feature_names) class_names = np.array(["No Fault", "Fault"]) + #training the classifier and getting results #note from here on out that the datasets passed in are indexed [1:] to exclude time rf = ensemble.RandomForestClassifier(n_estimators=500) rf.fit(train[:, 1:], labels_train) -labels_pred = rf.predict(test[:, 1:]) +labels_pred = np.array(rf.predict(test[:, 1:])) print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") +print(f"Accuracy = {rf.score(test[:, 1:], labels_test)}") #LIME!!!! passing all instances @@ -55,12 +62,19 @@ class_names=class_names, discretize_continuous=False) + #generating a random timestep for LIME to explain -trues = [i for i in range(len(labels_pred)) if labels_pred[i] == 1] +trues = np.array([i for i in range(len(labels_pred)) if labels_pred[i] == 1])#labels_pred[i] != ['NOMINAL'] * len(CSSdata[:, 0])] j = np.random.choice(trues, 1)[0] +count = 0 +while np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1]) != labels_test[j]: + j = np.random.choice(trues, 1)[0] + if count > len(labels_test): + print("NO CORRECT CLASSIFICATIONS") + sys.exit() #CLASSIFIER MUST HAVE A PROBABILITY IN ITS PREDICTION #top_labels tells it how many labels to explain, in order from most to least likely -exp = explainer.explain_instance(test[j, 1:], rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) +exp = explainer.explain_instance(np.array(test[j, 1:]), rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) #outputs print(f"Observation Explained:") @@ -76,8 +90,25 @@ #this is just to make it easier to see which instance is being explained. it will only work for twoModeScenario, #and will have to be customized for all others, obviously -plt.figure(1) +plt.figure(1, figsize=(20,len(CSSdata[:, 0]) / 2)) +colors = plt.cm.tab20.colors[:len(CSSdata[:, 0])] +for i in range(len(CSSdata[:, 0])): + plt.plot(times, faults[:, i], label=rf"$CSS_{{{i+1}}}$", color=colors[i]) +plt.title("CSS Sensors' Fault State") +plt.xlabel("Time [orbits]") +plt.ylabel("Fault State") +preds = np.array(test[trues, 0]) +actual = np.array([test[i][0] for i in range(len(labels_test)) if labels_test[i] == 1]) +#for i in actual: +# plt.axvline(x=i, color='g') +#for i in preds: +# plt.axvline(x=i, linestyle='--', color='r') +plt.axvline(x=test[j, 0], color='b') +#plt.xlim(test[j][0] - 0.05, test[j][0] + 0.05) +plt.legend() + #mrpFeedback Desired Torque Outputs +""" torque_desired = np.array(torque_desired) for i in range(len(torque_desired[0])): plt.plot(times, torque_desired[:, i], label=f'RW {i+1}') @@ -106,9 +137,9 @@ for i in true_preds[:, 0]: plt.axvline(x=i, linestyle='--', color='r') plt.xlim(test[j][0] - 0.1, test[j][0] + 0.1) - +""" fig = exp.as_pyplot_figure(exp.top_labels[0]) -fig1 = exp.as_pyplot_figure(exp.top_labels[1]) +#fig1 = exp.as_pyplot_figure(exp.top_labels[1]) plt.show() diff --git a/simulation-container/simulations/utilities/CSSfault.py b/simulation-container/simulations/utilities/CSSfault.py index e1742b1..2d746a1 100644 --- a/simulation-container/simulations/utilities/CSSfault.py +++ b/simulation-container/simulations/utilities/CSSfault.py @@ -1,4 +1,3 @@ -from utilities.fault import Fault from collections.abc import Collection from collections import OrderedDict from typing import Any @@ -29,12 +28,18 @@ def __init__(self, components : Collection[Any], **kwargs): defaults = kwargs.get("defaults") self.components = components self.defaults = defaults - self.types = ["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"] + self.builtin = ["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"] + self.types = kwargs.get("types") + if not self.types: + self.types = self.builtin#["NOMINAL", "RAND", "NOMINAL", "RAND", "RAND", "NOMINAL"] + if len(self.types) < 6: + self.types.extend(["NOMINAL"] * (6 - len(self.types))) super().__init__() #loggable attribute for fault states self.faultState = ["NOMINAL"] * len(self.components) #all sensors are assumed to start off nominal self.chance = kwargs.get("chance") self.seed = kwargs.get("seed") + self.rand = [False] * len(self.components) for i in self.components: i.faultState = getattr(coarseSunSensor, "NOMINAL") #forcibly make all sensors nominal at first """ @@ -87,9 +92,14 @@ def inject_random(self, chance): #check if the last fault state was RAND, and change back to NOMINAL if so past = self.components[i].faultState if past == 4: - newSettings.append("NOMINAL") + if self.rand[i]: + newSettings.append("NOMINAL") + self.rand[i] = False + else: + self.rand[i] = True + newSettings.append("RAND") else: - newSettings.append(self.types[self.components[i].faultState]) + newSettings.append(self.builtin[self.components[i].faultState]) return list(zip(toInject, self.inject(newSettings))) """ From b2e85ef7cc00d37a2a7d23bed515c4cf1ccfdef2 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Wed, 23 Apr 2025 21:40:58 -0400 Subject: [PATCH 05/11] very basic test and comparison of SHAP, test of LIME specifically for simpleCSSFaultScenario --- .../simulations/tests/testLIME_CSS.py | 160 ++++++++++++++++++ .../simulations/tests/testSHAP.py | 73 ++++++++ 2 files changed, 233 insertions(+) create mode 100644 simulation-container/simulations/tests/testLIME_CSS.py create mode 100644 simulation-container/simulations/tests/testSHAP.py diff --git a/simulation-container/simulations/tests/testLIME_CSS.py b/simulation-container/simulations/tests/testLIME_CSS.py new file mode 100644 index 0000000..cf0bc2e --- /dev/null +++ b/simulation-container/simulations/tests/testLIME_CSS.py @@ -0,0 +1,160 @@ +import lime +import lime.lime_tabular +import sklearn +from sklearn import ensemble +import numpy as np +import matplotlib.pyplot as plt +import sys +import os +import shap +#weirdness occurred when i didn't have this +parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) +sys.path.append(parent_dir) +#import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults +import simpleCSSFaultScenario as sc +np.set_printoptions(threshold=np.inf) + +#run the simulation, combine the data per timestep +times, sigma, sensedSun, CSSdata, faults = sc.simulate(False, False) +features = [] +times /= 1e9 +for i in range(len(times)): + #note that the time is included here but not passed into the classifier + #it's only included here to make it easier to find the specific timestep being explained + #since train_test_split changes the order + + #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. + #and that makes sense, because what's really the difference to it between a negative and positive torque? + features.append([times[i]]) + #features[i].extend(abs(sigma[i])) + #features[i].extend(abs(sensedSun[i])) + features[i].extend(CSSdata[:, i]) +#features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] +features = np.array(features) +class_names = np.array(["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"]) +labels = np.array([1 if np.isin(i, class_names[:-1]).any() else 0 for i in faults]) + +#train and test sets, naming features and labels +train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) +train = np.array(train) +test = np.array(test) +labels_train = np.array(labels_train) +labels_test = np.array(labels_test) +feature_names = []#["sigma_x", "sigma_y", "sigma_z"] +CSS_names = [f"CSS_{i+1}" for i in range(len(CSSdata[:, 0]))] +feature_names.extend(CSS_names) +feature_names = np.array(feature_names) +class_names = np.array(["No Fault", "Fault"]) + + + +#training the classifier and getting results +#note from here on out that the datasets passed in are indexed [1:] to exclude time +rf = ensemble.RandomForestClassifier(n_estimators=500) +rf.fit(train[:, 1:], labels_train) +labels_pred = np.array(rf.predict(test[:, 1:])) +print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") +print(f"Accuracy = {rf.score(test[:, 1:], labels_test)}") + + +#LIME!!!! passing all instances +explainer = lime.lime_tabular.LimeTabularExplainer(train[:, 1:], + feature_names=feature_names, + class_names=class_names, + discretize_continuous=False) + + +#generating a random timestep for LIME to explain +trues = np.array([i for i in range(len(labels_pred)) if labels_pred[i] == 1])#labels_pred[i] != ['NOMINAL'] * len(CSSdata[:, 0])] +j = np.random.choice(trues, 1)[0] +count = 0 +while np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1]) != labels_test[j]: + j = np.random.choice(trues, 1)[0] + + if count > len(labels_test): + print("NO CORRECT CLASSIFICATIONS") + + sys.exit() + count += 1 +#CLASSIFIER MUST HAVE A PROBABILITY IN ITS PREDICTION +#top_labels tells it how many labels to explain, in order from most to least likely +exp = explainer.explain_instance(np.array(test[j, 1:]), rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) + +#outputs +print(f"Observation Explained:") +print(f"time: {test[j][0]}") +for i in range(len(feature_names)): + print(f"{feature_names[i]}: {test[j][1:][i]}") +print(f"Actual Observation Label: {labels_test[j]}") +print(f"Predicted Observation Label: {np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1])}") +print(f"LIME model bias for predicted class: {exp.intercept[0]}") +print(f"LIME model bias for other class: {exp.intercept[1]}") +print(f"R^2 of LIME's local linear model: {exp.score}") + + +#this is just to make it easier to see which instance is being explained. it will only work for twoModeScenario, +#and will have to be customized for all others, obviously +plt.figure(1, figsize=(20,len(CSSdata[:, 0]) / 2)) +colors = plt.cm.tab20.colors[:len(CSSdata[:, 0])] +for i in range(len(CSSdata[:, 0])): + plt.plot(times, faults[:, i], label=rf"$CSS_{{{i+1}}}$", color=colors[i]) +plt.title("CSS Sensors' Fault State") +plt.xlabel("Time [orbits]") +plt.ylabel("Fault State") +preds = np.array(test[trues, 0]) +actual = np.array([test[i][0] for i in range(len(labels_test)) if labels_test[i] == 1]) +#for i in actual: +# plt.axvline(x=i, color='g') +#for i in preds: +# plt.axvline(x=i, linestyle='--', color='r') +plt.axvline(x=test[j, 0], color='b') +#plt.xlim(test[j][0] - 0.05, test[j][0] + 0.05) +plt.legend() + +#mrpFeedback Desired Torque Outputs +""" +torque_desired = np.array(torque_desired) +for i in range(len(torque_desired[0])): + plt.plot(times, torque_desired[:, i], label=f'RW {i+1}') +true_preds = np.array(test[trues]) +actual_preds = np.array([test[i][0] for i in range(len(labels_test)) if labels_test[i] == 1]) +for i in actual_preds: + plt.axvline(x=i, color='g') +for i in true_preds[:, 0]: + plt.axvline(x=i, linestyle='--', color='r') +plt.xlim(test[j][0] - 0.1, test[j][0] + 0.1) +plt.title("mrpFeedback Desired Torques") +plt.legend() +plt.xlabel("Time [orbits]") +plt.ylabel("Torque [N-m]") + +plt.figure(2) +#attitude - body frame, MRPs +for i in range(3): + plt.plot(times, sigma[:, i], label=rf"$\sigma_{i+1}$") + plt.title("Inertial Orientation") + plt.xlabel("Time [orbits]") + plt.ylabel("Orientation (MRP)") + plt.legend() +for i in actual_preds: + plt.axvline(x=i, color='g') +for i in true_preds[:, 0]: + plt.axvline(x=i, linestyle='--', color='r') +plt.xlim(test[j][0] - 0.1, test[j][0] + 0.1) +""" +fig = exp.as_pyplot_figure(exp.top_labels[0]) +#fig1 = exp.as_pyplot_figure(exp.top_labels[1]) +""" SHAP STUFF +plt.figure() +explainer = shap.TreeExplainer(rf) +shap_values = explainer.shap_values(test[:, 1:], labels_test) +fig1 = shap.waterfall_plot(shap.Explanation(values=shap_values[j, :, 1], base_values=explainer.expected_value[1], data=test[j, 1:], feature_names=feature_names)) +""" +plt.show() + + + + + + + diff --git a/simulation-container/simulations/tests/testSHAP.py b/simulation-container/simulations/tests/testSHAP.py new file mode 100644 index 0000000..7210c66 --- /dev/null +++ b/simulation-container/simulations/tests/testSHAP.py @@ -0,0 +1,73 @@ +import shap +import sklearn +from sklearn import ensemble +import numpy as np +import matplotlib.pyplot as plt +import sys +import os +#weirdness occurred when i didn't have this +parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) +sys.path.append(parent_dir) +#import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults +import simpleCSSFaultScenario as sc +np.set_printoptions(threshold=np.inf) + +#run the simulation, combine the data per timestep +times, sigma, sensedSun, CSSdata, faults = sc.simulate(False, False) +features = [] +times /= 1e9 +for i in range(len(times)): + #note that the time is included here but not passed into the classifier + #it's only included here to make it easier to find the specific timestep being explained + #since train_test_split changes the order + + #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. + #and that makes sense, because what's really the difference to it between a negative and positive torque? + features.append([times[i]]) + #features[i].extend(abs(sigma[i])) + #features[i].extend(abs(sensedSun[i])) + features[i].extend(CSSdata[:, i]) +#features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] +features = np.array(features) +class_names = np.array(["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"]) +labels = np.array([1 if np.isin(i, class_names[:-1]).any() else 0 for i in faults]) + +#train and test sets, naming features and labels +train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) +train = np.array(train) +test = np.array(test) +labels_train = np.array(labels_train) +labels_test = np.array(labels_test) +feature_names = []#["sigma_x", "sigma_y", "sigma_z"] +CSS_names = [f"CSS_{i+1}" for i in range(len(CSSdata[:, 0]))] +feature_names.extend(CSS_names) +feature_names = np.array(feature_names) +class_names = np.array(["No Fault", "Fault"]) + + + +#training the classifier and getting results +#note from here on out that the datasets passed in are indexed [1:] to exclude time +rf = ensemble.RandomForestClassifier(n_estimators=500) +rf.fit(train[:, 1:], labels_train) +labels_pred = np.array(rf.predict(test[:, 1:])) +print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") +print(f"Accuracy = {rf.score(test[:, 1:], labels_test)}") + + +plt.figure(1, figsize=(20,len(CSSdata[:, 0]) / 2)) +colors = plt.cm.tab20.colors[:len(CSSdata[:, 0])] +for i in range(len(CSSdata[:, 0])): + plt.plot(times, faults[:, i], label=rf"$CSS_{{{i+1}}}$", color=colors[i]) +plt.title("CSS Sensors' Fault State") +plt.xlabel("Time [orbits]") +plt.ylabel("Fault State") +plt.legend() + +plt.figure() + +explainer = shap.TreeExplainer(rf) +shap_values = explainer.shap_values(test[:, 1:], labels_test) +shap.summary_plot(shap_values[:, :, 1], test[:, 1:], feature_names=feature_names) + +plt.show() \ No newline at end of file From 09ed10b10e722888a1c8706c3b45bcb80c7b027e Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Wed, 23 Apr 2025 22:50:09 -0400 Subject: [PATCH 06/11] modified RW scenario and fault, and create testLIME_RW; reset testLIME to two mode scenario --- .../simulations/simpleRWFaultScenario.py | 28 +++-- .../simulations/tests/testLIME.py | 67 +++--------- .../simulations/tests/testLIME_RW.py | 102 ++++++++++++++++++ .../simulations/utilities/CSSfault.py | 2 +- .../simulations/utilities/rwfault.py | 5 +- 5 files changed, 143 insertions(+), 61 deletions(-) create mode 100644 simulation-container/simulations/tests/testLIME_RW.py diff --git a/simulation-container/simulations/simpleRWFaultScenario.py b/simulation-container/simulations/simpleRWFaultScenario.py index 0442abb..1903820 100644 --- a/simulation-container/simulations/simpleRWFaultScenario.py +++ b/simulation-container/simulations/simpleRWFaultScenario.py @@ -113,6 +113,13 @@ def simulate(plot): nav.scStateInMsg.subscribeTo(satellite.scStateOutMsg) nav.sunStateInMsg.subscribeTo(spice.planetStateOutMsgs[1]) + #constant disturbance so the RWs are always active + ext = extForceTorque.ExtForceTorque() + satellite.addDynamicEffector(ext) + ext.extTorquePntB_B = [0.0015, 0.0015, 0.0015] + satSim.AddModelToTask(simTaskName, ext) + + #inertial reference attitude inertial = inertial3D.inertial3D() inertial.ModelTag = "inertial3D" @@ -150,9 +157,9 @@ def simulate(plot): """ maxMomentum = 100. defaults = [ - {"axis":[1, 0, 0], "u_max":0.2, "rwType":"Honeywell_HR16"}, - {"axis":[0, 1, 0], "u_max":0.2, "rwType":"Honeywell_HR16"}, - {"axis":[0, 0, 1], "u_max":0.2, "rwType":"Honeywell_HR16"}, + {"axis":[1, 0, 0], "u_max":0.05, "rwType":"Honeywell_HR16"}, + {"axis":[0, 1, 0], "u_max":0.05, "rwType":"Honeywell_HR16"}, + {"axis":[0, 0, 1], "u_max":0.05, "rwType":"Honeywell_HR16"}, ] for i in range(len(defaults)): @@ -174,7 +181,7 @@ def simulate(plot): components.append((defaults[count]["rwType"], rwFactory.rwList[i])) count += 1 #see rwfault.py for notes on requirements - rwf = RWFault(components, rwFactory = rwFactory, rwEffector=rwEffector, defaults=defaults, rwModel=rwModel, chance=0.001) + rwf = RWFault(components, rwFactory = rwFactory, rwEffector=rwEffector, defaults=defaults, rwModel=rwModel, chance=0.0025) satSim.AddModelToTask(simTaskName, rwf) #control torque @@ -258,12 +265,17 @@ def simulate(plot): stateLog = rwf.logger("state") satSim.AddModelToTask(simTaskName, stateLog) + #number of faults per component + faultCountLog = rwf.logger("count") + satSim.AddModelToTask(simTaskName, faultCountLog) + """simulation start""" satSim.SetProgressBar(True) satSim.InitializeSimulation() satSim.ConfigureStopTime(simTime) satSim.ExecuteSimulation() + #update faultLog to indicate all timesteps after injection as a fault faultLog = np.array(faultLog.fault) for i in range(1, len(faultLog)): @@ -271,6 +283,8 @@ def simulate(plot): if faultLog[i-1, j]: faultLog[i, j] = True + + count = faultCountLog.count #extract actual output torques from recorder motorTorque = [rw.u_current for rw in rwTorqueLog] @@ -305,20 +319,20 @@ def simulate(plot): plt.xlabel("Time [orbits]") plt.ylabel("Torque [N-m]") plt.ylim(-0.22, 0.22) + plt.ylim(-0.005, 0.005) #fault plotting plt.figure(4) for i in range(numRW): - plt.plot(satLog.times() / period, faultLog[:, i], label=f'RW {i+1}') + plt.plot(satLog.times() / period, count[:, i], label=f'RW {i+1}') plt.title("RW Fault State") plt.legend() plt.xlabel("Time [orbits]") plt.ylabel("Fault State (binary)") - plt.ylim(-0.1, 1.1) plt.tight_layout() plt.show() - return satLog.times(), sigma, rwMotorLog.motorTorque[:, :3], motorTorque, faultLog + return np.array(satLog.times() / period), np.array(sigma), np.array(rwMotorLog.motorTorque[:, :3]), np.array(motorTorque), np.array(faultLog) """ This is a miniaturized version of dataloader.py for this specific scenario. diff --git a/simulation-container/simulations/tests/testLIME.py b/simulation-container/simulations/tests/testLIME.py index 9211f79..06e9ded 100644 --- a/simulation-container/simulations/tests/testLIME.py +++ b/simulation-container/simulations/tests/testLIME.py @@ -9,14 +9,13 @@ #weirdness occurred when i didn't have this parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) sys.path.append(parent_dir) -#import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults -import simpleCSSFaultScenario as sc -np.set_printoptions(threshold=np.inf) +import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults #run the simulation, combine the data per timestep -times, sigma, sensedSun, CSSdata, faults = sc.simulate(False, False) +times, sigma, torque_desired, torque_actual, faults = sc.simulate(False) +torque_actual = np.array(torque_actual) +times = times / np.pow(10, 9) features = [] -times /= 1e9 for i in range(len(times)): #note that the time is included here but not passed into the classifier #it's only included here to make it easier to find the specific timestep being explained @@ -25,13 +24,12 @@ #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. #and that makes sense, because what's really the difference to it between a negative and positive torque? features.append([times[i]]) - #features[i].extend(abs(sigma[i])) - #features[i].extend(abs(sensedSun[i])) - features[i].extend(CSSdata[:, i]) + features[i].extend(abs(sigma[i])) + features[i].extend(abs(torque_desired[i])) + features[i].extend(abs(torque_actual[:, i])) #features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] features = np.array(features) -class_names = np.array(["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"]) -labels = np.array([1 if np.isin(i, class_names[:-1]).any() else 0 for i in faults]) +labels = faults #train and test sets, naming features and labels train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) @@ -39,21 +37,16 @@ test = np.array(test) labels_train = np.array(labels_train) labels_test = np.array(labels_test) -feature_names = []#["sigma_x", "sigma_y", "sigma_z"] -CSS_names = [f"CSS_{i+1}" for i in range(len(CSSdata[:, 0]))] -feature_names.extend(CSS_names) -feature_names = np.array(feature_names) +feature_names = np.array(["sigma_x", "sigma_y", "sigma_z", "td_1", "td_2", "td_3", "ta_1", "ta_2", "ta_3"]) class_names = np.array(["No Fault", "Fault"]) - #training the classifier and getting results #note from here on out that the datasets passed in are indexed [1:] to exclude time rf = ensemble.RandomForestClassifier(n_estimators=500) rf.fit(train[:, 1:], labels_train) -labels_pred = np.array(rf.predict(test[:, 1:])) +labels_pred = rf.predict(test[:, 1:]) print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") -print(f"Accuracy = {rf.score(test[:, 1:], labels_test)}") #LIME!!!! passing all instances @@ -62,19 +55,12 @@ class_names=class_names, discretize_continuous=False) - #generating a random timestep for LIME to explain -trues = np.array([i for i in range(len(labels_pred)) if labels_pred[i] == 1])#labels_pred[i] != ['NOMINAL'] * len(CSSdata[:, 0])] +trues = [i for i in range(len(labels_pred)) if labels_pred[i] == 1] j = np.random.choice(trues, 1)[0] -count = 0 -while np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1]) != labels_test[j]: - j = np.random.choice(trues, 1)[0] - if count > len(labels_test): - print("NO CORRECT CLASSIFICATIONS") - sys.exit() #CLASSIFIER MUST HAVE A PROBABILITY IN ITS PREDICTION #top_labels tells it how many labels to explain, in order from most to least likely -exp = explainer.explain_instance(np.array(test[j, 1:]), rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) +exp = explainer.explain_instance(test[j, 1:], rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) #outputs print(f"Observation Explained:") @@ -90,25 +76,8 @@ #this is just to make it easier to see which instance is being explained. it will only work for twoModeScenario, #and will have to be customized for all others, obviously -plt.figure(1, figsize=(20,len(CSSdata[:, 0]) / 2)) -colors = plt.cm.tab20.colors[:len(CSSdata[:, 0])] -for i in range(len(CSSdata[:, 0])): - plt.plot(times, faults[:, i], label=rf"$CSS_{{{i+1}}}$", color=colors[i]) -plt.title("CSS Sensors' Fault State") -plt.xlabel("Time [orbits]") -plt.ylabel("Fault State") -preds = np.array(test[trues, 0]) -actual = np.array([test[i][0] for i in range(len(labels_test)) if labels_test[i] == 1]) -#for i in actual: -# plt.axvline(x=i, color='g') -#for i in preds: -# plt.axvline(x=i, linestyle='--', color='r') -plt.axvline(x=test[j, 0], color='b') -#plt.xlim(test[j][0] - 0.05, test[j][0] + 0.05) -plt.legend() - +plt.figure(1) #mrpFeedback Desired Torque Outputs -""" torque_desired = np.array(torque_desired) for i in range(len(torque_desired[0])): plt.plot(times, torque_desired[:, i], label=f'RW {i+1}') @@ -137,15 +106,9 @@ for i in true_preds[:, 0]: plt.axvline(x=i, linestyle='--', color='r') plt.xlim(test[j][0] - 0.1, test[j][0] + 0.1) -""" + fig = exp.as_pyplot_figure(exp.top_labels[0]) -#fig1 = exp.as_pyplot_figure(exp.top_labels[1]) +fig1 = exp.as_pyplot_figure(exp.top_labels[1]) plt.show() - - - - - - diff --git a/simulation-container/simulations/tests/testLIME_RW.py b/simulation-container/simulations/tests/testLIME_RW.py new file mode 100644 index 0000000..3571ae4 --- /dev/null +++ b/simulation-container/simulations/tests/testLIME_RW.py @@ -0,0 +1,102 @@ +import lime +import lime.lime_tabular +import sklearn +from sklearn import ensemble +import numpy as np +import matplotlib.pyplot as plt +import sys +import os +#weirdness occurred when i didn't have this +parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) +sys.path.append(parent_dir) +#import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults +import simpleRWFaultScenario as sc +np.set_printoptions(threshold=np.inf) + +#run the simulation, combine the data per timestep +times, sigma, td, ta, faults = sc.simulate(False) +features = [] +times /= 1e9 +for i in range(len(times)): + #note that the time is included here but not passed into the classifier + #it's only included here to make it easier to find the specific timestep being explained + #since train_test_split changes the order + + #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. + #and that makes sense, because what's really the difference to it between a negative and positive torque? + features.append([times[i]]) + features[i].extend(abs(td[i])) + features[i].extend(abs(ta[:, i])) +#features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] +features = np.array(features) +labels = [1 if i.any() else 0 for i in faults] +#train and test sets, naming features and labels +train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) +train = np.array(train) +test = np.array(test) +labels_train = np.array(labels_train) +labels_test = np.array(labels_test) +feature_names = ["td_x", "td_y", "td_z", "ta_x", "ta_y", "ta_z"] +feature_names = np.array(feature_names) +class_names = np.array(["No Fault", "Fault"]) + + + +#training the classifier and getting results +#note from here on out that the datasets passed in are indexed [1:] to exclude time +rf = ensemble.RandomForestClassifier(n_estimators=500) +rf.fit(train[:, 1:], labels_train) +labels_pred = np.array(rf.predict(test[:, 1:])) +print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") +print(f"Accuracy = {rf.score(test[:, 1:], labels_test)}") + + +#LIME!!!! passing all instances +explainer = lime.lime_tabular.LimeTabularExplainer(train[:, 1:], + feature_names=feature_names, + class_names=class_names, + discretize_continuous=False) + + +#generating a random timestep for LIME to explain +trues = np.array([i for i in range(len(labels_pred)) if labels_pred[i] == 1])#labels_pred[i] != ['NOMINAL'] * len(CSSdata[:, 0])] +j = np.random.choice(trues, 1)[0] +count = 0 +while np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1]) != labels_test[j]: + j = np.random.choice(trues, 1)[0] + if count > len(labels_test): + print("NO CORRECT CLASSIFICATIONS") + sys.exit() +#CLASSIFIER MUST HAVE A PROBABILITY IN ITS PREDICTION +#top_labels tells it how many labels to explain, in order from most to least likely +exp = explainer.explain_instance(np.array(test[j, 1:]), rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) + +#outputs +print(f"Observation Explained:") +print(f"time: {test[j][0]}") +for i in range(len(feature_names)): + print(f"{feature_names[i]}: {test[j, 1:][i]}") +print(f"Actual Observation Label: {labels_test[j]}") +print(f"Predicted Observation Label: {np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1])}") +print(f"LIME model bias for predicted class: {exp.intercept[0]}") +print(f"LIME model bias for other class: {exp.intercept[1]}") +print(f"R^2 of LIME's local linear model: {exp.score}") + +plt.figure(1) +#mrpFeedback Desired Torque Outputs +for i in range(len(td[0])): + plt.plot(times, td[:, i], label=f'RW {i+1}') +true_preds = np.array(test[trues]) +actual_preds = np.array([test[i][0] for i in range(len(labels_test)) if labels_test[i] == 1]) +for i in actual_preds: + plt.axvline(x=i, color='g') +for i in true_preds[:, 0]: + plt.axvline(x=i, linestyle='--', color='r') +plt.title("mrpFeedback Desired Torques") +plt.legend() +plt.xlabel("Time [orbits]") +plt.ylabel("Torque [N-m]") +plt.xlim(test[j][0] - 0.1, test[j][0] + 0.1) + +fig = exp.as_pyplot_figure(exp.top_labels[0]) +plt.show() diff --git a/simulation-container/simulations/utilities/CSSfault.py b/simulation-container/simulations/utilities/CSSfault.py index 2d746a1..c13b1bc 100644 --- a/simulation-container/simulations/utilities/CSSfault.py +++ b/simulation-container/simulations/utilities/CSSfault.py @@ -79,7 +79,7 @@ def inject(self, newSettings : list): and fault state is the new (or old, if no new fault) setting. """ def inject_random(self, chance): - if not chance: + if chance is None: chance = 0.0005 toInject = self.randomize(chance, seed=self.seed) newSettings = [] diff --git a/simulation-container/simulations/utilities/rwfault.py b/simulation-container/simulations/utilities/rwfault.py index b030ac4..7b9290d 100644 --- a/simulation-container/simulations/utilities/rwfault.py +++ b/simulation-container/simulations/utilities/rwfault.py @@ -46,6 +46,7 @@ def __init__(self, components: Collection[Any], rwFactory, rwEffector, **kwargs) self.state = [(i["rwType"], i["axis"], i["u_max"]) for i in self.defaults] #loggable attribute for the timesteps of fault injections self.fault = [False for _ in self.components] + self.count = [0] * len(self.components) """ Update method. Runs every timestep. @@ -56,6 +57,7 @@ def UpdateState(self, CurrentSimNanos): state = self.inject_random(self.chance) self.state = state[:, 1] self.fault = state[:, 0] + self.count = [self.count[i] + 1 if self.fault[i] else self.count[i] for i in range(len(self.components))] """ @@ -78,6 +80,7 @@ def replaceRWs(self, newRWs): self.rwEffector.addReactionWheel(RW_new) newComps.append((rwType, RW_new)) self.components = newComps + """ Resets all RWs to default settings. """ @@ -117,7 +120,7 @@ def inject(self, newSettings) -> Collection[Any]: """ def inject_random(self, chance : float) -> Collection[tuple[bool, Any]]: #if chance isn't passed in - if not chance: + if chance is None: chance = 0.001 toInject = self.randomize(chance, seed=self.seed) if self.seed: From ec09123a3a6f6ac6a9b9987a42d1c8a412a0aecd Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Thu, 24 Apr 2025 10:53:06 -0400 Subject: [PATCH 07/11] updates to rwfault, its scenario, its LIME test, and results of magnitude iteration --- .../simulations/simpleRWFaultScenario.py | 28 ++-- ...nalysis_Derived_Quality_vs_Magnitude_1.png | Bin 0 -> 29987 bytes ...is_Derived_Quality_vs_Magnitude_1000_1.png | Bin 0 -> 37911 bytes ...nalysis_Derived_Quality_vs_Magnitude_2.png | Bin 0 -> 29660 bytes .../simulations/tests/testLIME_RW.py | 122 +++++++++++------- .../simulations/utilities/rwfault.py | 29 +++-- 6 files changed, 111 insertions(+), 68 deletions(-) create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1000_1.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_2.png diff --git a/simulation-container/simulations/simpleRWFaultScenario.py b/simulation-container/simulations/simpleRWFaultScenario.py index 1903820..1760313 100644 --- a/simulation-container/simulations/simpleRWFaultScenario.py +++ b/simulation-container/simulations/simpleRWFaultScenario.py @@ -5,6 +5,7 @@ import psycopg2 from psycopg2 import sql import json +import sys #utilities? from Basilisk.architecture import messaging @@ -33,6 +34,10 @@ #general simulation initialization, i think from Basilisk.utilities import SimulationBaseClass +#debugging +np.set_printoptions(threshold=np.inf) + + def simulate(plot): #a bunch of initializations simTaskName = "sim city" @@ -157,13 +162,14 @@ def simulate(plot): """ maxMomentum = 100. defaults = [ - {"axis":[1, 0, 0], "u_max":0.05, "rwType":"Honeywell_HR16"}, - {"axis":[0, 1, 0], "u_max":0.05, "rwType":"Honeywell_HR16"}, - {"axis":[0, 0, 1], "u_max":0.05, "rwType":"Honeywell_HR16"}, + {"axis":[1, 0, 0], "u_max":0.05, "rwType":"Honeywell_HR16", "cViscous":0.0005}, + {"axis":[0, 1, 0], "u_max":0.05, "rwType":"Honeywell_HR16", "cViscous":0.0005}, + {"axis":[0, 0, 1], "u_max":0.05, "rwType":"Honeywell_HR16", "cViscous":0.0005}, ] for i in range(len(defaults)): - rwFactory.create(defaults[i]["rwType"], defaults[i]["axis"], maxMomentum=maxMomentum, RWModel=rwModel, u_max=defaults[i]["u_max"]) + rwFactory.create(defaults[i]["rwType"], defaults[i]["axis"], maxMomentum=maxMomentum, RWModel=rwModel, u_max=defaults[i]["u_max"], + cViscous=defaults[i]["cViscous"]) numRW = rwFactory.getNumOfDevices() @@ -181,7 +187,8 @@ def simulate(plot): components.append((defaults[count]["rwType"], rwFactory.rwList[i])) count += 1 #see rwfault.py for notes on requirements - rwf = RWFault(components, rwFactory = rwFactory, rwEffector=rwEffector, defaults=defaults, rwModel=rwModel, chance=0.0025) + rwf = RWFault(components, rwFactory = rwFactory, rwEffector=rwEffector, defaults=defaults, rwModel=rwModel, chance=0.001, + types=["friction"]) satSim.AddModelToTask(simTaskName, rwf) #control torque @@ -274,8 +281,8 @@ def simulate(plot): satSim.InitializeSimulation() satSim.ConfigureStopTime(simTime) satSim.ExecuteSimulation() - - + + #update faultLog to indicate all timesteps after injection as a fault faultLog = np.array(faultLog.fault) for i in range(1, len(faultLog)): @@ -286,10 +293,9 @@ def simulate(plot): count = faultCountLog.count #extract actual output torques from recorder - motorTorque = [rw.u_current for rw in rwTorqueLog] - + motorTorque = np.array([rw.u_current for rw in rwTorqueLog]) sigma = np.array(satLog.sigma_BN) - + fricLog = np.array([[t[3] for t in col] for col in stateLog.state]) """plotting""" if plot: plt.figure(1) @@ -332,7 +338,7 @@ def simulate(plot): plt.tight_layout() plt.show() - return np.array(satLog.times() / period), np.array(sigma), np.array(rwMotorLog.motorTorque[:, :3]), np.array(motorTorque), np.array(faultLog) + return np.array(satLog.times() / period), np.array(sigma), np.array(rwMotorLog.motorTorque[:, :3]), np.array(motorTorque), np.array(faultLog), np.array(fricLog) """ This is a miniaturized version of dataloader.py for this specific scenario. diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2416b8c0d0aa2dcf57c7f30c3cc43e9ba79fb9fe GIT binary patch literal 29987 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 T)!O5{Qi`&?x?Ha8h3o$TzRF?T literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1000_1.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1000_1.png new file mode 100644 index 0000000000000000000000000000000000000000..67d125a65e78a39ca37b049c1ef5de21794f616e GIT binary patch literal 37911 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 literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_2.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3166a10f9154721d481c43b3e931762499354e GIT binary patch literal 29660 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 literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/testLIME_RW.py b/simulation-container/simulations/tests/testLIME_RW.py index 3571ae4..dbc26c4 100644 --- a/simulation-container/simulations/tests/testLIME_RW.py +++ b/simulation-container/simulations/tests/testLIME_RW.py @@ -6,72 +6,87 @@ import matplotlib.pyplot as plt import sys import os +import seaborn as sns #weirdness occurred when i didn't have this parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) sys.path.append(parent_dir) #import twoModeScenario as sc #this test is currently setup to run twoModeScenario, which only has pseudofaults import simpleRWFaultScenario as sc np.set_printoptions(threshold=np.inf) - +quality = [] #run the simulation, combine the data per timestep -times, sigma, td, ta, faults = sc.simulate(False) -features = [] -times /= 1e9 -for i in range(len(times)): - #note that the time is included here but not passed into the classifier - #it's only included here to make it easier to find the specific timestep being explained - #since train_test_split changes the order +for i in range(1000): + try: + times, sigma, td, ta, faults, fric = sc.simulate(False) + features = [] + times /= 1e9 + fric = np.array([(np.argmax(i) + 1, np.max(i)) for i in fric]) + for i in range(len(times)): + #note that the time is included here but not passed into the classifier + #it's only included here to make it easier to find the specific timestep being explained + #since train_test_split changes the order + + #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. + #and that makes sense, because what's really the difference to it between a negative and positive torque? + features.append([times[i]]) + features[i].extend(abs(td[i])) + features[i].extend(abs(ta[:, i])) + features[i].extend(fric[i]) + #features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] + features = np.array(features) + labels = [1 if i.any() else 0 for i in faults] + #train and test sets, naming features and labels + train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) + train = np.array(train) + test = np.array(test) + labels_train = np.array(labels_train) + labels_test = np.array(labels_test) + feature_names = ["td_1", "td_2", "td_3", "ta_1", "ta_2", "ta_3"] + feature_names = np.array(feature_names) + class_names = np.array(["No Fault", "Fault"]) - #on a LIME-interested note, these values are absolute-valued because LIME's output was nonsensical otherwise. - #and that makes sense, because what's really the difference to it between a negative and positive torque? - features.append([times[i]]) - features[i].extend(abs(td[i])) - features[i].extend(abs(ta[:, i])) -#features = [a + b + c for (a, b, c) in (sigma, torque_desired, torque_actual)] -features = np.array(features) -labels = [1 if i.any() else 0 for i in faults] -#train and test sets, naming features and labels -train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(features, labels, train_size=0.80) -train = np.array(train) -test = np.array(test) -labels_train = np.array(labels_train) -labels_test = np.array(labels_test) -feature_names = ["td_x", "td_y", "td_z", "ta_x", "ta_y", "ta_z"] -feature_names = np.array(feature_names) -class_names = np.array(["No Fault", "Fault"]) + #training the classifier and getting results + #note from here on out that the datasets passed in are indexed [1:] to exclude time + rf = ensemble.RandomForestClassifier(n_estimators=500) + rf.fit(train[:, 1:-2], labels_train) + labels_pred = np.array(rf.predict(test[:, 1:-2])) + #print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") + #print(f"Accuracy = {rf.score(test[:, 1:-2], labels_test)}") -#training the classifier and getting results -#note from here on out that the datasets passed in are indexed [1:] to exclude time -rf = ensemble.RandomForestClassifier(n_estimators=500) -rf.fit(train[:, 1:], labels_train) -labels_pred = np.array(rf.predict(test[:, 1:])) -print(f"Random Forest Prediction Accuracy: \n{sklearn.metrics.classification_report(labels_test, labels_pred)}") -print(f"Accuracy = {rf.score(test[:, 1:], labels_test)}") + #LIME!!!! passing all instances + explainer = lime.lime_tabular.LimeTabularExplainer(train[:, 1:-2], + feature_names=feature_names, + class_names=class_names, + discretize_continuous=False) -#LIME!!!! passing all instances -explainer = lime.lime_tabular.LimeTabularExplainer(train[:, 1:], - feature_names=feature_names, - class_names=class_names, - discretize_continuous=False) + + #generating a random timestep for LIME to explain + trues = np.array([i for i in range(len(labels_pred)) if labels_pred[i] == 1])#labels_pred[i] != ['NOMINAL'] * len(CSSdata[:, 0])] + j = np.random.choice(trues, 1)[0] + count = 0 + while np.argmax(rf.predict_proba(test[j-1:j+1, 1:-2])[1]) != labels_test[j]: + j = np.random.choice(trues, 1)[0] + if count > len(labels_test): + print("NO CORRECT CLASSIFICATIONS") + sys.exit() + #CLASSIFIER MUST HAVE A PROBABILITY IN ITS PREDICTION + #top_labels tells it how many labels to explain, in order from most to least likely + exp = explainer.explain_instance(np.array(test[j, 1:-2]), rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) + weights = sorted(exp.as_list(), key=lambda x: abs(x[1]), reverse=True) + weights = np.array([int(i[0][-1]) for i in weights]) + fric_instance = test[j, -2:] + indices = np.where(weights == int(fric_instance[0]))[0] + quality.append((fric_instance[1], (indices[0], indices[1]))) + except: + continue -#generating a random timestep for LIME to explain -trues = np.array([i for i in range(len(labels_pred)) if labels_pred[i] == 1])#labels_pred[i] != ['NOMINAL'] * len(CSSdata[:, 0])] -j = np.random.choice(trues, 1)[0] -count = 0 -while np.argmax(rf.predict_proba(test[j-1:j+1, 1:])[1]) != labels_test[j]: - j = np.random.choice(trues, 1)[0] - if count > len(labels_test): - print("NO CORRECT CLASSIFICATIONS") - sys.exit() -#CLASSIFIER MUST HAVE A PROBABILITY IN ITS PREDICTION -#top_labels tells it how many labels to explain, in order from most to least likely -exp = explainer.explain_instance(np.array(test[j, 1:]), rf.predict_proba, num_features=len(feature_names), top_labels=len(class_names)) #outputs +""" print(f"Observation Explained:") print(f"time: {test[j][0]}") for i in range(len(feature_names)): @@ -100,3 +115,12 @@ fig = exp.as_pyplot_figure(exp.top_labels[0]) plt.show() +""" +mag = [i[0] for i in quality] +weight = [1. / (i[1][0] + i[1][1]) for i in quality] +sns.regplot(x=mag, y=weight, scatter=True, line_kws={'color':'red'}) +plt.title("Quality of Explanation vs Friction Fault Magnitude") +plt.ylabel("Derived Quality of Explanation") +plt.xlabel("Maximum Magnitude of Viscous Friction Coefficient") +plt.savefig("RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1000_1.png") +plt.show() diff --git a/simulation-container/simulations/utilities/rwfault.py b/simulation-container/simulations/utilities/rwfault.py index 7b9290d..7f7a34d 100644 --- a/simulation-container/simulations/utilities/rwfault.py +++ b/simulation-container/simulations/utilities/rwfault.py @@ -34,6 +34,10 @@ def __init__(self, components: Collection[Any], rwFactory, rwEffector, **kwargs) self.seed = kwargs.get("seed") self.chance = kwargs.get("chance") self.defaults = kwargs.get("defaults") + self.friction = kwargs.get("friction") + self.types = kwargs.get("types") + if not self.types: + self.types = ["torque"] #if the defaults are not passed in, the defaults are pulled from the starting states if not self.defaults: self.defaults = [] @@ -41,9 +45,10 @@ def __init__(self, components: Collection[Any], rwFactory, rwEffector, **kwargs) spin = [sublist[0] for sublist in self.components[i][1].gsHat_B] rwType = self.components[i][0] u_max = self.components[i][1].u_max - self.defaults.append({"axis":spin, "u_max":u_max, "rwType":rwType}) + cvis = self.components[i][1].cViscous + self.defaults.append({"axis":spin, "u_max":u_max, "rwType":rwType, "cViscous":cvis}) #loggable attribute for the actual traits of the RWs - self.state = [(i["rwType"], i["axis"], i["u_max"]) for i in self.defaults] + self.state = [(i["rwType"], i["axis"], i["u_max"], i["cViscous"]) for i in self.defaults] #loggable attribute for the timesteps of fault injections self.fault = [False for _ in self.components] self.count = [0] * len(self.components) @@ -70,13 +75,15 @@ def UpdateState(self, CurrentSimNanos): """ def replaceRWs(self, newRWs): #empty existing RW carriers + self.rwFactory.rwList = OrderedDict([]) self.rwEffector.ReactionWheelData = self.rwEffector.ReactionWheelData[:0] newComps = [] #create new RWs - for (rwType, spin, torque) in newRWs: + for (rwType, spin, torque, cvis) in newRWs: rwModel = self.rwModel if self.rwModel else messaging.BalancedWheels - RW_new = self.rwFactory.create(rwType, spin, maxMomentum=100., RWmodel=rwModel, u_max=torque) + RW_new = self.rwFactory.create(rwType, spin, maxMomentum=100., RWmodel=rwModel, u_max=torque, + cViscous=cvis) self.rwEffector.addReactionWheel(RW_new) newComps.append((rwType, RW_new)) self.components = newComps @@ -93,7 +100,8 @@ def reset(self): spin = self.defaults[i]["axis"] u_max = self.defaults[i]["u_max"] rwType = self.defaults[i]["type"] - resetRWs.append((rwType, spin, u_max)) + cvis = self.defaults[i]["cViscous"] + resetRWs.append((rwType, spin, u_max, cvis)) except: raise TypeError("Defaults and/or Components do not contain necessary information.") self.replaceRWs(resetRWs) @@ -120,6 +128,7 @@ def inject(self, newSettings) -> Collection[Any]: """ def inject_random(self, chance : float) -> Collection[tuple[bool, Any]]: #if chance isn't passed in + if chance is None: chance = 0.001 toInject = self.randomize(chance, seed=self.seed) @@ -130,12 +139,16 @@ def inject_random(self, chance : float) -> Collection[tuple[bool, Any]]: #spin and rwType stay the same spin = [sublist[0] for sublist in self.components[i][1].gsHat_B] rwType = self.components[i][0] - #u_max is changed if there's a fault by a random factor + #u_max and/or cvis is changed if there's a fault by a random factor u_max = self.components[i][1].u_max + cvis = self.components[i][1].cViscous if toInject[i]: rand = random.random() * 10 - u_max = u_max / rand if rand >= 1 else u_max * rand - newSettings.append((rwType, spin, u_max)) + if "torque" in self.types: + u_max = u_max / rand if rand >= 1 else u_max * rand + if "friction" in self.types: + cvis = cvis / rand if rand < 1 else cvis * rand + newSettings.append((rwType, spin, u_max, cvis)) details = list(zip(toInject, self.inject(newSettings))) return np.array(details, dtype=object) From 32a3c6332a2b829b2bd1be21e54fa371be7f9c10 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Thu, 24 Apr 2025 15:19:58 -0400 Subject: [PATCH 08/11] expand testing abilities to include SHAP and iterative magnitude testing, along with results --- ...is_Derived_Quality_vs_Magnitude_1000_1.png | Bin 37911 -> 71188 bytes ...nalysis_Derived_Quality_vs_Magnitude_3.png | Bin 0 -> 30990 bytes ...nalysis_Derived_Quality_vs_Magnitude_4.png | Bin 0 -> 31755 bytes ...nalysis_Derived_Quality_vs_Magnitude_5.png | Bin 0 -> 33048 bytes ...nalysis_Derived_Quality_vs_Magnitude_1.png | Bin 0 -> 30282 bytes ...nalysis_Derived_Quality_vs_Magnitude_2.png | Bin 0 -> 31356 bytes ...nalysis_Derived_Quality_vs_Magnitude_3.png | Bin 0 -> 32562 bytes .../simulations/tests/testLIME_CSS.py | 15 +- .../simulations/tests/testLIME_RW.py | 154 ++++++++++++------ .../simulations/utilities/CSSfault.py | 2 +- 10 files changed, 118 insertions(+), 53 deletions(-) create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_3.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_4.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_5.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_1.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_2.png create mode 100644 simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_3.png diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1000_1.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_Analysis_Derived_Quality_vs_Magnitude_1000_1.png index 67d125a65e78a39ca37b049c1ef5de21794f616e..2fd0d8a34a9300d0843e3398373c028aeb6b659b 100644 GIT binary patch literal 71188 zcmd42bywR>xA={_Q=oVPG0rFbE@7A+nq z!AWubah-FYd#&dkJbz?mCf~^c@e~c4{*v^+{;rmN<-VqCEl9Rd< z!vzH4<2284ToLf)Ais4k80-1+CdUxp`~CaNf@{_G_RvE#oknQdm~+Z<(D`VAPesV< zgPa`f?{w?0q**B9de&Y^Cw6yESN>c0pE?hY&L`IYeZT_q45xMbpEeJV%9vMs7yhr+ zHi2}#|NnK+iv9nmuaM2vsD~U%I*|BuhGSQI{bwi?YWGUbG`j^dZ=Sz?{l$HyJ%ruI z($Z288b_gh>+^pjxnf8J&3JftH2m|6ujO(p&++c&vcYkPe!kvbZRdb(|Ma+@UC82tGlb&j=_bmZktCvl+AAD&7PUe zp5GK7M%$5{Gl5Lyywklb-I@G%)Yf5 zW9G{k`W#Wm=R5z5;hJ{b?t3*WZf&sNe{0)dJyc)f)z%XN1Taf^Hn#IE(HF1Woi%T! zgx!<{?-&+|s)hL%N4Bq4R~9z3M}%^)0+5Z`pqKNY=D%AbVxq4$GmQt??~Vuq7Z;b` zx2Chd7cjN+Qb(tQbn>%XnIe2bj=Bgpr;6?xZx%al^MY4#*|&e4!O0s}{uG5RPi7N4 z7lkza8Y%>}oTT%BOxRCHyh06^Zx7z&3A}b?&*@YpIKsMeYMOQA{+uJ`Tyb!qsHvGG zVBP-v%Cnt4_^8WgSfoGW29e)%^sseuhMk79ZBKWr%3uva{KmE7IR>6n7203ivxUmOkEn0GGv>SIxF7eoHu_p|T&YbgKlr+ip8?Ec}0zq;-3?@KZQD7lM* z8?*{#=f#EGFXJUIQq|b%y9&j#XvPBoZsPk4Rski{YhOmeLtqyoe~?Ac{?`g##US0h zpeuCcxlabL;O=3X7d|TEME-r)!vo7qZ3ljJUw#gilM&orA9h%KcHH_ik59R3GYFX2 z;NjYJGSh%^2>Hg}-QN6BXifll8Ew<1`K5FfT*g6mV?kcF%+V+|f?CHS8#gea`%Yu~p#Dt2u;#KEZfsP_9XHQrSzlX}Pi#n+5>~qpqF=tu$B-Av&y;zIe7hHePAI-YgK#Ccs+y1bdxF4*gLY4W? zEq6)cN)ANp^T2)|PT#m(VW;Eu>0~_7qIt{ISib1_eFOyRon`h0`>0JYxmnpxY53yv z0SaQvd?6bSpKtEYJG|TC{+?YtA3@;cY-(UHMCdYi*7I3Ikeg7L#AyJ_3E@PSvn4(7ZpN8%Z6B8}$R<65CAxL* zBgS~$>Tq!p>a`JbuxaU6L5aU#gCQ-V^?%4YP?S?y(%CPLXK*~^((8+l_xS-~CyU+& z`>(k48~d23@ao=Y?_=H;&OY%4kYVO5|0W7wf|2!MT^|kh)F*Uo(vBWhVU7S9@JvLk zzY!-$-HPyjY2~(n+Ov@l4z=2_y^5+>izI!jE=Om3@Vf=miAy;bB5pP3hAY12B48DK ztny``tajYA;mcU~t$3C{P*5)4hD6It&#s{(u3v_osIY{>x?|_?G zg%$cvYWNF<>#%<*U%AKoWE)ObnS?TT`_FXj{Ou{DhFfcCu9k4m!0xX}icE?OYw4Eu5LuTZG* zzggA+Kq01O`bzEDxDWy*@VtQ-Rhci7+Z8T|Dq5{5oRM<#C#1Ld`r(vZwxaIm#wP1_ zIS$-7T0U=|jeqQ&PT6iq(Wb3fm|cKpv#6d!P08KK5jGqKr}fVFUvMpm0z}C+^yJ6R zwm9c|t2$pAC_v@PtRb_~kwc#?= z)8+8e1WrpNaTtp6btC)jwpxX2`QhpalON4Hc7^2y{!n7VePQp(zKvUAbjc3`=WR|v zeYVxOQJ`eIrNAk^nE1{`$IVcO$-?&cs*gza`wSWHKS~Yiv`*>M+*iB{T41J?mDoeEwlRtSFgsR(o>gC(~r~+G?1k(aabtv2q;jivR<_-?SJL5E_jolUedqs zL@Yb@cI^H}*V#-&5MixU5=9dyK0ezgF@uT&hu^Hxx_m`@RZX4Pqf&jN<%y^mHkB8Z z{i7o$Q{F;XRPMu*Pq^ie6GojyqDr1}7&|-`t^?AQkws>-aIF3_y-zPW;2 z(e^1h6il0Nl1|cKqHd~QM-N>*zoIyi@|H_3E!T7`SNiQYYdK@8KaTyv3d~6$ML^Bh zS|&~f27+b5bWH#FV4xe&C>-x{v98!GRgH~kX<^8O?Nkm|f`ngWkgo-Ub+ET{+%QCu z5Eoc_0Li^@pep$r<*R4Ct^6e-BL9N82*%itg=hOj7R*4T0Z4~4gH_c9QBhq_T<`lK zn%TZ-zI_Nm=6FJLT>=iUu!B;tMI2;;7z)l2#@ai4HEM+h2sYsUB1|+#Qa4 zyz$}%=D8Z|ojNBf96RHhj1L>G0uG4BUDF4V>3xGdN(JKTfDEwIIis);(TXtVSBg)4 zuTZyghk?4>iU7fkdx=>K`;Jt~5MtN`qshfx`}vQt9cwKA(rIjYsO&WP6~{VoiL94Q zz=B%n}W?u|2ve2W{e5G6N;Aqy<=gtTgKK9u}o!9N|M{iEA72scxR@o~k@ zftzGL(mT)mQm^99MDw%-F(^hN;?18hrU85dM6$oiZRIkCY*R)4u?_FNo)C{Si$_kQ z6X%RKywYI_N+GM84+pN7h3c!KDDSmcl-e07vjL)L@?NI-IA^pykFx{J9bgoV?aHOK zL)Vdz0)~d+xTqmBzhl4r3S}74=o&s2XBID@hG5r7iD(jwmf?^+j)dQV$+&e zxI|R9Mo7|21chFx<*BhZ6*v0bP}+skb$RW$6sN+ZwiUDhR3keU4WyFqwpDtbN7mHg z{n;t}I7b%po9C}D@@ohRXA*Li%1>(*&vP36w%>1%V6tHJuAn|DlupJ2lfoG~h|M_u z22Q!7yv@%evqR^Q<4gPW5;45W3ik~a6Csz4me0FO9gs)c*(u(Z-c7)=qrFuLPhn>o zvc1WlOxx5ubeQ5(>f?M$DPqA1EG@9Iu-okcuJM@wECv@>+NIi3m?8KTFAO=RZ zPf3@oL?-sE{|-OuX>txMrlC}9wDBshPb+6~4qc4q3T)RK??k`awjfG}MZ(@;GwidS zMmM6w^zg@X#2&9d&Yzoz=)!~Rb~{laqJToa7T!S)@l>o*W&%VnEv7Q@3IxWi{eHcy z(C?fkPG-a_)S*&}@y~^kYm57!Mz8=yzAzW}$1IFgfwlbOt~Ac$eEo`qn%5hCaz#jb zZ3)~*W=aI2nCF#=O-zg>*s-fz)^bp`NNqu;e+J1gNSlvPHzMlU$1aS*8n~wvriO&6YceaBI_cPs z3Bj*&)-?$SGo;h}DCf(b!J0WIi4sb+08JS}egIY_YrMeln^a?v5;9SEym2GWmvg1# z!7pldJF#@3ohZc}e7aa_xg+P7n?T)A!FD8j8WrP15$qPoU8d888EnA zF+BR*$e`L=x($v^%2bj;0*DowkjHp|Vn633mHvw25pddhN5YlFL%2wEkK|`#3fJ~u z__Irg2IZiVBB1*f+m0-ndqpF<9oJMZtm-_2mR9*nOp88{%}(bw3J=OrZ=K?{UoCYK z(yO~P(g-D%jR_?*&C*Fow^fXoPChR8lq zIk_XupXE+@$?=ASmS{&2>$2S1(IDZ|Hb2_SrRW`Vi7uiD;@_U>GFIYJZD3pX;8HWU znZP6HIfhHOm0j>&7&P+geA2`vYxQN5277@I+>4JV>Wi_X@urCBNC<}6?=Sji^!o|% z_gc}}fF>8vHVT7}dNf6#F5ZisM$LXyof171u1+|%`nV${HWHh;TN#W-h(&bKclf@d zA`)kIIm6u^1}wR-0Q6ksaE>cqL(dSDVJ(p-v{ry^Z-8#2$;yLkC6mBZ07exU*Td}y zJk_zyWIz;T9B6Q8Vfn^wpH%xqHQk0F&L+Nyq9@f>KqVVt)RWT~kKJw3_03__M%ev% zSTYqKag;B_*3of$OJocd68uu@3fq5K|})34RCxilN4a1%<19o7Hi%IZanj%zGSi zoMf$Knb3*HNgPkU4|@glN6;A-2NYmWlhy*&h;V6HcRU+z0MQx{>Fs9W@>BIp}v)4^O$Z}s4KCwb2R?}{h0{Bki;4C{_9?uxy)`eXsPbqe2{1~4Z90KD8 zh=n}hXLxJ&lf&7I1-(_-XQ_C8;TUDxZUp}2L>T_$T?u6fa>o@cOk7sW{a3Z1^1dX6 z^g9efQT^w{RjU*Dwe6Q(DRf?>1n~)2jfMp3HJkVj_wy!UsjoO=c*E?LuWCxGQR3M!-cN0V^i@PNR3>Ud(FiaYlmRwIAOl(S6~nIo( zv(LI7aO<1x;*w6kB|<=f9RjXY;dN9(P{|z)r5~-rg`+T{ zT?w2+^dKWHS3)~aP_dy;rzw$?h^$bU^ih^OI~Bfr0JMOREG>f$4UL-q<&Y_fJI~>c zq0PdM;$jkur#^;*Ci}U~1d-Uc;+H&+;4Fg*riYJzr_;(cX14I@!+9$hQAs{=%DtP9 z;0I>4#TJ0mUX=n}8iPsZ+H$v#(}Ci@jx}CYrI%R!AsNKSkmx54QQM{53Mr>vXTfzgzeM?NA2rDfNOm2^y8$<#`dbVq7& zI+e8QD!}3>l_08kzyc?|Xvp2)A}J5*3XrdphR-BxF`JSkpb~{WLXDRbToMwwUGgK2 z%P&*yLBFq?f^8bPy@iRy!e6n6xd0OJ(cBi`1w<4?EWFoRXzJ`@1d-LnG6D!xUW_^8 zNLMY?$&cV!c8zn(P*4`m(qUwN(b$k7hIr`Py!`krZ8Ezpph!ACT`|Ik=$7EpMz46U ziorW=_)TN`o>|oU>-3@<#LvH9>q16`0YpUsi8*t6Gtr7Nwp6h$F^Vv81LN`4bpM;< z1uzAHD+uHbS0M12j0+?9?jEjHtiQpij_=0+2N99(ClYg}zt=l}&yR2T}>t-SlQ);iLfF-!#0wL43mX~58_NH2g66>nRqkU0%kba>> z8EndEBV7)oeTiY=5&%pO1k;gEQ}5t1-F{;U+*RyQ&U2vYMHFcWKOCfDAzY+tyqXTG zKMoV*8)OvCZ6_o5CbmkopDZ1}&83*e-;wglH5`5RkhX{qhE_c6hTt5R@xH3_ z`=oCL8DV!x*+-?4+$LR~gD(rI@DLvR~9 z@v=lRn}xbcGSxOxf<*-Rwnn~i$~-bCc$;K07nt2cr z-vG>HSks1$#>X%L*6m((sX)Zvq&Kgy7~|Z?qA%guT0~s12ml(uMaG7nBzG-t>xquR zPQjL)>g?-`zQ4G=kmyFLzGxww-^krwWPx8r53q==%r znDV@>Ql?hMXQ?PRp&{M6ZJu;Eh5giF7Ox*s)uub$JRua=QS>RLZ%k{cNcjwGdT{uj zV957rJOuoxIJC2oqz&;#a1|>TBas3~-p|hG*F7wWuhzLlnTgV6LA#a!gg4xHP?!N8 zH!dFl;;lTu@^*0h81D9MRVX}|Gw9&wP{D4acX!_=Ng=0zy1oUh(OUdnxD?skUYunX zz!Z`6mVJkK<#lq_P4C}n^I}g330i6uyYZz%0$RB(ggZhqb3lsplYX~ee>G<#{|>+C zyJp7PiLLZoRV0J8z1scHdY zF;FXSHTkMH*`qOj3a~=Ot5gZfao*yuot_zVO#+zC!t`I$;$-wJ`qhCdXdd$M#}mPd zPZ?hYsyy$}BxK?gbKa8%+Iwr`u8s3XQ#_?8EVGZt-4|X^As}B@OHY(c7tGDpF8d0+ zDP+SNe>%Aar9vMC{vy;@B=D7IdO#-gh153<5Z*| zYBHk%aYEs2KvKZ7-a3)hUYQfF$BzK`b1a0Ocn2W!b)Y6?uO>Rr_5UA58|uxE z)RtJFR2#Xju<-6?S`JRkI#zwi^59ho$8&oIZb<_S^cwvqu;7CL2rk@3XMhwEGOY_ z4(5^W2;2%p=L|sS$U(Fw4A@>aqKYfj7~SuEpUS(?AFX=Pu02WT@D3MqZ=zK z^f$#L8!=T27b@vddJeox+s?R0uYSzw!2WzE;cT-iv$uUiV5MSDf-~Qv%)uc1P2`&U zsnthdr8HpIMK_i7uG_6|8L!}}*?_|R<(N_E9O0L33UVQ{dab4?stv>?$*hTH7uL`4 zqG^M^E=a_ZK%D_2Q6PCjAo=F-B2FQ9n;it4y|*@wnk1Y!v{{5{keLPUID=8<{o{LZ zYgDQ@9o9{Srx@0{(A+;~cz`EJx_wzEIa|BOR^Pc5Ei0Fl#_s&^Pm-JtgB8$pwS!7ykR8iW)%C?4+lmO9RpSGXnDz#@5k-gp#|-+O+(ID zr_7hH*nLLq0{boy8{oF&R@64*qot^EV*Pk=EGse5DW@2zl?jV4oY=VF%prYn=fOKz zQbUg?r64h@5sNRDOYhvzs917W#p{P+TTSto;s`Mw0%3?^@x+Ip5i7zjKV=l+i3>;< zJtm&fJSnL%|{7Lkmd18n=qYCq3P*%*-Q;9(K}- zG_&{1SOpSEr2z%QAA)rzdJibp)vn3R-#k$?orGD#?s%Em@9D){K02^i~k8JrH9t}A_Y&s0&LKS#(8vP84MXRUo>mp>^ z%uxGt_c5B&%R8CASbowIJAK`Eb0yCvlD&!AKI`#vEke`qhUt>a`uHk`oazzCI)j}Q zRvmU68X+Hk6)EfT@p_k>7WtxbKqwu&;Fzx!G0rgcrWBBnE_`J>eCYFJCZ;jP9kM0R zxZ$u8cHJEIB{W{T0f+>cQu0U*=fG8N*z6x~1!;-v!|`G$?zVB~Eu(_u5`?$7h6n(< zgK@!P-iiG6>YU#L^awYK*}GChL7lrnrF|8OO@;LzD*!H2tmqxVa)0STMC0;icbWFbfN;RomwdELo8@bKz)nt&@%PMDu%K_a_ z%V}22wQx$1IJV+PGRBIVs`F{%9bd5COrx9D7?1r9$zrF0ls?~QcU29l66{ zQp2dp*^l||JVv8rLdZfK04CTGdL=K4?``V>9n|DqNiQ3ll@`@NaLKFSCI-Zct-&%K zLorJ>3QoB5G~MWm;>vh1SG;fWu_&nw{aVqDVZV17c|oJ*R2M^{c-{_wJ{e z8XW1KlS34cM*TjHN%aLD^FFy75v!kyR@<7}Zh^7s5+XtNBP2e>tYQ_tBcpH$rtURCBdN}xQjs32R00K@plC7YX?FUe_ zAoea%j7)L`Vz}7+t-w-W95RyOIbiFnGdKr+`+_N0tCB54CV0^nG*$8F4x>sP2@Q*~1%x6xt_a zgvcu`4ifCJo+jTIaA!ZBlq6QL%F4C@YJ!YUdQfrx$xtUG)%D9O)WvE(-fhVC$^fT_ zAS=Lfnw7;b931(3-NpbJqRyn|GBvZUcBEFI()5mbn$|%pH&w(HP|&82V+^U0(~a z>{7scJRf%_NU>g_t@vp`22)JV5w`OP&9#Kg3UGxY;jP-{Y9LgyXyx66|ErVl7sUJI zIqQ@hgd5EO3)rK4)WCR>BjcU{X$7@W<4VF7OqL*|j!rboz2 zdBroSR*2*u(~FA~s8V@qXiVufd50Z(hF(XyY)*)xG_vulRqAF}i)^)o0NBi#| z03r+}%W1q1mn`Vz#gjT@&Rb|`^*vRQup*Q#I)(I>ZVbD-UjQZ_ z-^9G*-_*o3CNyT)Zi#)LA>~>;485l(YygBwqaduMWN^y;$adJP^}w>T~w<|QN#_7M!Cln3@PP`@R&Mt znL-tbmarPISJP$)23FSKU|`VplS@QYC|Q_R=zzjy8ElpE8HX;04f31HenDV!2=TPg zX)tQnwhh24t6NYGOZQx0w*7ks^C_>PA-F7IdzE~QZJKJt;;1;EZsY)2NQio?YSsdy z&kL1amhVQS2d7G2sbDlLi^&*`HP~H?4}gbyZ&;R6u+7E;e*{$?zrs+HzsGR|CA2`c z--$+yzL#@n4Z(G(4zL{LHvqrbvKC*j9c&T8)+S3=wi>W4?c8-ypN=5062dTLQsf*e zGH*Sga3OTryjBl}M}?k^2Qg}TZCeAS{VAtfEXq;xCs~pytr)Vl(}q=?0yaswKw`CP zt2ww%Is9zg=cn%3?ocsXx&r-Qkws@)b|(0pxHppFUqDXH8c&>{2Ar5W?tDy7O)eHU zY=epFW6pDmE2~VEs@K6Wq55ZvDv&=S_0(|XXJnuxs2GqrDG(0E#L=hd=g6}`wmfHIw z@yG9HEI-$_T_4H)(_jcdFk+I1CF_3qOkqHuubDxD%)5E0; z)2BM-Oyu`SaO$1Zuq89%+|N%vhN);J%>~k4T^s%{D+#+z>KqV;KBX%(J@F6n{#;Dm zpskwTWe18pYpvtZ;+Xp&7^;;1AAqpz9QzQ}`%edf z2A#Pt@t%)r^ibH{pRmCmN(J{KcgSI!^MA<4lc%fM?ll(= zQ9bQZ=?$`L0lJUzr3n&S)W+5!Us)Lk3HIP_!%yb$qgkPBZ?}Pq|D>=ge(pK=2oU<8 z@b)!Cr~Ko`kGmpvKMeVYD?IjndOp!LIB9-t^xI2|04wks&bHY%k4_q}eP{fdiR)+w z{i?;PFSPi^7dbOS;ks0Bn9cOk_`Qb8JVd)6YvR%Ni&Wo4GWHj|_Jqbm*|86Ib1OOO z`wL&qjoezZq&&0s_gM|BErEo|F9Oj&Mg(O96n@dA?lo;6)(Em1R4}rLAEx^vRAyEiboz;A~b2+m31{vwMh^Y39laoSJOm;7qxK>s3 zq*ME4PSz6tw2sdbKNvq;l<*qyU~TX=&s$=)Fa)N@&J3c~zBVXs>i!noml0&qTwLYT z<{lF>gblh{8s=?zS7uUPx{nLbxCKNnmad6)d>W7B44$+$v;uv95s)V?hiIv7umDkf z%&cd+gWzaHIBEQLlel@AXC_`~G(>27q?H-E-l6zcb0KmMce32;b43aUhgl-bT;i@^ zr|$Vsrl@7ztl1PQtJ`zFUQ^P=M9{1-_>bt_&WAzAjQ6IJEztqcs|T$fdN|#{RO+L- z)pJw6UM}C%q_!XKqtnOSDF*an`ZR-X&Rm&UU(R$K zVD;vHF_7*&n6ppGtP8u{ZK|kyq$ghQ#P0Uu=uiG@SljuJ!~Y>l3q!A5r)=!CM!iej zW^2FpNK2o|S|14nIlcZQ88`kJ;b0)XOA&tQd|GrsB@u`dP?wo#vY zepjGAYbzwQnaR}n>_Y^H=k@B24Fx$nDc;7M~}(4fHvgwqZA0Ht|r`@UYw9o#;K8DLZ`~ z*U+7rXYSBt_GHFGMj#n39nT>8;UnLd6MzDEbp}>oKp|!bCqS~I-Q1ULI|zAA^NM>z zy2qJzKLJB)z~SSzw1Z^EQ)?fXUSL z%Qb;aHm(lq^`sj#uj*LrXV z%HpqcuNh~IN&2!Y*!!8?Zz{ngJ~WX}Lb(vf8lCF4H7SSk z8e=~D7=9G^g(=?PvX(VW3YNI5W;*XG+wri`9>fouPOawr$FcQ2bAwGOWSM70A{Pev zlp2C0bo}A3Y5r)YZ{Mh$zHW;#hy0f)(Xr@!si)!=!zYi1tI4WB=x7G|QF2h@j6SOQ zpV$9%SDv<-IU@bml@EIS^eU`yKpFGhd4-8@;P2l&-R5fxo|>i0j(_^HMR5A zUzLp3yMaF(`>$tq9KOBW^{tt)1^q*Iq;-_td8)?v$Urx#n%PoLM&+99v+{L~Ltrrk z;QojKx=Yd=Gh(#0L>I>?<@-h=6YSY7w>b)@qcpJd^^ItS~Um)yYGwDxZkj}xk4T`|^1a5~1g`F&qfX7Z5|%s+6wHv#j$xlQHix7EnDls^aLcI4hITM6ZuKh9aqBD?%V2p@|F zmG~k}Dr`y8&D|viy2(_04^W`4k8x2&i1|&yu*x~vOTJi$Ps02Ey!WIL?=QG})Qex8 z|B02y%w|2}X5-04B*K_a1llwDRqy#lL>m>Ga#}8XVM32V_FJAS9TQylqktZ2`*%cT zBcZ-s1g_I3iaNk8R;B};?q50L2!%v$lDKdIK&pIPb1yL?LKmMXR}n`a{Mzhz|j!! z>HwVcH8?%3q`QaTaeNu@HsyoG;cVOFq5D*5dK<^@Bcr&8Leb*)r`(LbFYD4yGc-a< z{5Z4TN>~=jsa&%kU34d(fkZM0Lx~RO63Bht$KGF6_k2o@3zal>;QxD&*ptePsR^?@ zO}{M7Nbs9)epG#kkG(#8dE@f2{~e=!1z;#kNQzv7lwN;U;cC0A;en*5g|vsm%RJ%=#NPF}^;T+44eDViI+Dl-W6DF8`5wtX?Ey3RZ$+iMbNa+)1Dg) zpGDb9FGUa4UK5US_0cuFW~ld6{o&6p!q%(N=8& zaykE{x%QWLs_w-!T14C(Xm=#1w{S+kV)j5l0AxKUddD0n?-5Z0y;WCx z{cB|<9lG4l(cS!9A@c-0g+)K?zTDgmlw(lq$*MC6AIFcLGft0HGDr+&rU*2=eI5um zUTza%w5Ut>98Byg+>Oe-5wYD95=9!-P5zpST^NkqRegH;Pj#9={JG(dk^6#YNc!c3 zaQ3v=Q-MjaPSEE5BQNmZ5Oa9-@OLo^HBV&oo!>8AdK`bZ4Hmj@e{!4)TV@AVu4z-R zJ`mZs$=Y_~EmB9%f^x^u^#C*Klz!<5KJdml=u=b)2ON)RFH+U?H{J_-!IX zn~Dehw|EWCZG6P1Rr@pWwh_Pmzx&{os16J28_H?lRLO3|q3ktj$h71{f57}-7PKJ^LofEN@14LS-zTSUU<_u zA(aGH2_og&wk|B+T8# zmtC?eb&EWsq?7o+Loed>#nP-|KT*AETS`T)kOTiFj(XyNNs+`e#H6OQOWyu| zI9MJS|NTwn4YkwYv1|qK0=Ru7>z%t1w8Mn{$$odqcA0dLS2X>GR1??DAV-AvtE_qd zXvk1vOhjM4I(SHjwKIh}3bW0)z#i49$={6pAXwA=@vpGU27{W}x4zE$z@YCxOxFY< z6&O23O8?^jk?O8dIo51xK`-~zK)2k+Hcmq#kWe)4e^=6`fesUmf^&N*V9ioJ_3$O! zH8hyLY9(v<#c$D2xUj%l5N>Cc>9vF`w{jhx(LJJn2Oc@E`f+gFBi7bcD#Rhs&9!Hd z`u~yUGpPsSQZ0o|&?|U@c@qw$5V@w8-09oHX-IDQ=~`LfWVW%q(8J`jGB@YK_1FU( zEsI4inOq=<{UxG6$Fmg;x;#z^`;D&swoZ~KaDrzd99uyXw04KX>0Eu71Hp~f!@8N; zB60OE7(;YF4|$x1MoI-c%|~~2+7`rGmKCZ*#~UMj>7$d1f~hBa(iep0y?7MA71G+F zBeSu=Em)Hb*At$${g)h)U4x}Rso2C(&XYJ5x0=dkl|jhE9h>Gfhtnm+YyST|E= zwt{|hcv83((1ta_71$`-f8(8p0cvAk*wawyvX9yRfk}qcQ~Y-M`B~Aq6Hx1G!;Oa- z=r-1(P%=w{eCe~B@m-@!YyZ5V1%`l3_l9?U!2as0U=))TZ$e@8)-qFB4ajTSDL_S__z5d>)g80K*6 zYyB%YUbnj+9t1~yr4@sfbTQ}paN^`TA|)0NY}M~p9+K2Bw})XX?jI-I&*{gd4aZ$7 zH}Khp)xQ;y&&Av8hHNBD`M2hIwVQ5@8ns%Hx0 z=DcGtZ~fMq*ztYR8Lf^_fB5H&q-fVtIos>4-Gu52?Wwedrp0Ku9P!wWTqb4r-bq%K znnk6@F{5YBy|NO(MoaqJbD7>fd?88Vgtk3gPWLO~2%@{G5-9i81j26RD1d9_L?kDP zHd}gI!9;ktvRnwd{`x`PP*ZPyvnU%*O9vR<`40ZF*l8`T8v>aBNaUP0M3U#4hj1OX zrfUA+U_F*(yM?v)cYOi#9nv|~B42E2JfeNDrBUYhtvlS;%nx`=I03$?V+4C2O1j;? zuS+iUJcCh%<`Gw1b8!o3SvsLFKkDR#v9nZZf5r8rrcmbh!}jk}^*!pwGO3S9_(0cQ zMw#a$D#~ccAJwP^f~*=5Zy`Sg*{OnUEoels{7+m!wMFUh=O;brdmTg)zxmB?&1Ky; zf(#}GhLn9W!jlX0m!_&2Ag0dMy^HV5PU;Ze968Yc?yKJ$0_Z#{Bz}~Ai)k*-drl-98 zXjFa>&)Q5;@6?>;4*5cU33|6G%#W_7tNdhikHL?dyBog67H55ZMX1*EeD=WQ-5U6= zR5fmhQrwf2o6bb`sU~jG#8?}&KkQNHKah!gi?TW=O$B!(U*l-1|BewD(UBYZL>)To z{57oM+bjQP#&CfUHsgtrF6!kLEzYnI>*Ds0Uv+x5G-h{6)uc<6K;Awto zb?JJJqO?Qe)X#0aXFn@%va~ap)qtv7V+pzU6px7IIxrU}a2{kGl6~kMdWnhq;TS~t z9l3X`7A)}8(PmRr-#%(2oLQIMzhv&~m&0T4bY@f)ag?LFNBKTD&GQIEL2uOH2Ux^y zaQ3X2owO$~-o0&Ye9#N>XSmK2?qK2Z`ev!16k5`{&U8_N|14C2tov*moE!3^yp|LC zkN7SHmFJUP_ZKrrmJ>flhmXeC$8QJaFWqDM#V%)(Eq3Vkm+1pO-c)}dHvC3UI5zj? zYH3t%T$otK*n#h_bYk*N0}) zH8!fUc8XjR7pH}hiuQd)FfYeK{0kNS%Z=g@f-JnysQYcS+-G4!h6|lM*!3Yv7dzUn zogR51EnVxHFpjI(w~HjYYdaD1FRA0pHuRt0UJ#Jyu(A`V)_&BHY&+78LNqz zf=bk)Y!D+{$z&=(_8XnE*ZOpEaOF)1-#FEpx}Z<^r`2t(7Lu--YJn_p0RY3=LRIGq zo36KHlL-;-tWQ(mNSl!B?lcYPt;TNn$zWUmMIE37-yIG3#STHic`!-829U#O81|JQ;-CA8@)REbUlQPt~T z!OBaVSy}@B8c@GJ`ktQjR`+-WKWh&EAKiA~zt23*Go^rGHTWravnnOqvu5}pke5_7 zT8_&F-qJqM_S3qLp$#1++aaH<12^epE@JlgM!~xR<_M(I(w+?Kn>pJrbk^-A4>_o^ zcNZJ}k(@<)+Yun9(svu3k70(+UBE4n`z|3d0kfq0XQ(6K{@)zdf?lFEr?|A>=KI}& zkWa)heY$a-Mk@IhNdAm=oJmRz`yeSD(@1grYyPOWkQb`s2CRO6v%Wfv{iUUUpCh_Z? z$4n{W0yk3awPia0PCuFKe=|wcRh$oCZJMo;PukFlaEH29UxM{!eY7Ji8`hmoJ z?mLvb2PuhR5bRVY?MA;+({+J=pXu4L z(H^{uQl8M!USpepa#Rd3DPw~7+dpdhhH1qA8tk`5K5yFp62K^mmH zq@<*~OF}xNyJQ2>u<3r+KIiEDd)~jr{jFIuvu3XOEQe&4Wy6KB+=xg!3?fU9N5gBr z{~An#IQa>qhM*dav;*n36}QWw&h45G6xPp}5F^ji%Qm@yB6*~9cc}s&qgPa+D0>?n zL&Df{u3vw9xox!C6;?AyDpBY=IjKz9Uc2a87-jx&NPF7a^C+cpTs2SB8e-hYbwGfQoXjvTu6zDkN@>ujhk&Gig-HDnn;6ATgiQ;Z-mQ`eGQSPgIAc54o z=^n}W%g5P{RBgrs-LDHRlZr7?;*=xjv*<4oPcqhb62w}py9L_Rsiq!4(ojA4eFF12 zL}9S72o;0WfEwL);G7bbV|wM~xu`Uj({;`7jE?R1qpvl`aeuLord}?J-zw_aeMBhz zFhZ5eY>;hPGn^m%g`w-PP46Cg7$0er(~B#0%AVDaaouPyimbUm6hZ2TGCIiV4v!zr z*mUwPbJ>lV9!az3JgVu?KaR0|e36>p`BZH{r~g!gSdk>|kqd>@b>M}NqvE-lt zu*B<+6=ca&JiqW&ENVRD@|TK^r!0~XAzz7M-iTjBO}KUf=xey<1B5-^G!e&Wn;Z_k zR~R(Z+uNdY(Ou-3L;NiD$adY?QN9}bntQaP<_$5CeA+k4@f^zc#$SkCA}>*1`*>4m zIOlDDmun&xib8F8%(!&y@W`-B7&6RYwiACK{j^F414&;{t0vZ9QsY@p=kakRot?kz2(2>^e@jyl=i>AO6yFyX-mD{Z zop`!sbLZmeT=c0}l#?d;9-K-Xdo+&~%7F8^S(B8{3q4boDYEG`DMR@sitm=^VR`*2!G3$^AGNlIZ zpmzO_9`+Dp`9!|)o@K(_ha<|9bS{sG(Oay{QyhOGydtiGm@41ns6?H#t{iLn-AO*z zGk&?b)t`GRAs6Kdo`|wZItsHC}3l&48%DSVWZ_@ zbz%w|-@T!F82KR_oqB)eEuPSMr`+vE@!|)!T9GDXUlX$4H3US$q|_2K)Cx?=gqC-{ z1rEOy49;ej92RPR4}HxNi>Q-OmyOh zf&qFel;@O-^n`e`rc`*bb}WncsF2C6WpM~&KOuQ#u#&2CB<6&UUAEJ~WG%ThoC!#J zKkv!waCELsfwDErv##F~rYco-TT~9gwV2~6w+z1S+h)w5RA|B)hh$mX*ttjq4>e9_ zG4-Ed`?a0PlIb!oWc zW^-(f8pIF{OJJ4?+34p7T>RHek&IRN#{GFKUm-8}-Sve;h)uPS1695sI!C>1mD2fX zXpkjynJ2f#enf%@nnlZYmMa;6m ztlr!M1|`fgTMA5NlC3~CY9rFJH5nJCEXzrwFuZ(_i61i-kE1QA@Gxoh~af8$nfen&_J< zZ{9BD5`x%2T`FjFe`Qi%7VpTP7pj%1gS)L(X*{Dnk*M*pg1lyuxDRLN3j&wWx-aRq z?v~1us5QuF97EDGic&UgzJFpvqHD+0XM7%goY|J7F(#K%dp!b<-Y4w zBlLGx1c&9xN+4;PYx|$O`t1d(L!}zE@@XEYY8Oyy!I$v4x7|;PBUuu2BP(~O)^}9t zH#;Uq*XM^7hP~0_xPNFg5_h5_oyq(~Dapx(FleuWii$}dLwsCZQYt$Kld$5=R$=Mv zU)sGNI-F{UrKf{3r1Gl`*Ml5hm{r)7&MrdP+M6F7K2#vM@D` z9Fyk-(`$b(arcvwn$c>uN=n=F!pN>85HkV5TPCY!JqTJN{`WOo7rS{Nh?pd=O5GN= zUv*eJcMutlW=s7K#UpX|da*P4QLyP(lfmS;k-;?nIa%SdM(rxosDUKbZh`;vVE`$B z%j^&iyzy9nEK9{jvu>AurMV@&zGb4GCUk3iPJjGEYr@Rv{V%jJ*__;m04>; zB8@%Sp2~CQ`9mkV!4<NmSz*iug19bn#(>0HfDS;#b>feCS#H>Ue{PaXHeAAnXwdA8)`_5b^CVIB@{ zZjEMnff$hFh6bcSV%wllLUw6&b#(=mKaTg-2W`h^WG$m*G0dMA;2Qpt|ysD zi;0PC4c&@?1yy`Z;_Th6jICZH3i z-U7@}4}7B71=dTwmXn}e;XM89%f|NBmf`YukEi?RdYsW3R`oy9Q1XQI8+^?A4pur8 z1?+tPu)e}ah4OK>0aJ=>GJ+2lw2SOh;|lK9c1p`>MqiAr-!L{+RCU=IKzAH?s(R}` z9auFTiid2#vs%I1!wB2U&Ab%6OW>WVak0m|O@7+KRnfKkobw-jiQRU}#gAul{<^>4 z^1yoDaIHLqL!pjrO`~SmpW_dtaJ~U3ciVbSkI<~|u$Tm#S`mIo2N5zfS9lSEpu^w{gk_oFaWyjNv6wPR)t_YYS{V`7$7uT^O^>i=9_8WT7; z&m9FLv$ zhC?jO16`0?)sTCJNRp~Lw7e}(R4sxQjsP5k62P2t=tW*D-V8alj8)B6nhe(J zR#s9<;zlw|iy?JEJi^2X6}}2xClr*A{p0%={DFHT)IE&}s1xxV28ykVU-+%2*$FWi z+)t5gLtaXde;8oGAm@R)K$R>$1%YslSoVlfSQ`R@=_mM zlGdZt{pnxba7j+?g=1LlzcE!}|G`#YF5W%}a29TBa5<21+uO&#<9~zzUfP{i2p%^J zF*=KG<`T#|7~rrfcOc#4z{UO>AV6NF&u=x)RSzu7GK!qn zXTDFo-X0DicH8?e8hkuf0dmH4cbJsR#ae=8WAi6C0&lPROq)03#V1j%czO-vxjpVb zi|6L4*qmzjJ18RM-y2E?H^hS*>}b3D-%oO3jTHZh&=`TMLSpYaUHjwdE9^HF)G7>v z>&vc?sF?!Hr&U&m|Hh4)=6ajvb?Z|9>oXm^V!+vb>ZaKU>!af>wMkDExsDb2 z?_EiFiMMqo`|5BB*a9*hi_@N_9i>EgmAPqt2m7Ag+W}!DNUZDV-{1CnR@V4^BEU44 z8;wdus6pqfVJgS-gdZRgwOYWZ>_KI0BJ%>%$8gACiT{5q_qUOdR;}e675sZb6Ai+n z;9oR%n*I@ZTbOKrS&-9rG)DTnjeimtF5-oI)RTW-4d?gZ|8l9ojuG^a`hVWgM|%Vq z)nsvTvF(z_S#Mt)ozccnsxhB{*R8vmx%tuRz@LwZ^a}jlmy&ZZGNK6*aY|mt9VQ-0kh(6b#Q3_^x&;;W)=J?O_mA7#eq2)S6wZ7eqr+hqyQYAS{nf zfV#K8ug?$&b!_i$&iePg?%Z5J1P;{|ygul#?S?q@fXpXtQn>5Sy#Rx1!VGH5y##L3 zmk%V?6?z?rcJK@>wV-Ex9swzLV~aY~KHB|iZb|-T%k2O`|39la6}+6d&&4+{^RAEc1mk*RsAb^U zf&871`5##;_~E!Np5WC8L2b{QZJqwumx=>u*>KQfxoNrN;{R+M1;pIKf&xQmPt@q> zCP3=r80!TF0C zKhJ^x7h|Z0;?x6VlHo#w!~cuB3_eL_H;2Y+SVh6rQeB}0lmLGf@WpA-#dfcLqYvzQ zXaLlZt>Ok6^9IB+(!>~{<#gv?D05Lzcwq5>rEJd($d!c!oa=y$-*!StWu_9INera& zPGQvj4af}$Vz}E+>6CjcYZs{C#<})2gdv*IeFYT;dYqa9C;4xZm@mM7!IPEAWNBN( zI|)Voo_8YbtC?}`A|2p>t zZ{T{flMDvo2*&D zu?6`qEOxlL&5l^!_YO{8;cVqxa<82EMCvg9?#2-b_s@df2XPKD(J5dG_Wjni1nh%@C^~`a2@y_7Wk1}UE&%=$mKTx|7f_xEtHF;izMe z3I%)-6kMtv-o--QcQF z!4f+`sUq?rjT#H)Ul2T6{mXK&d@IjdKoTbS^8O%ur%>)yEk!iB-v2BUrQdo{J9?SCeXJA z9B{C)^-v35NNMQyC_BOh)AUcSfi#8+-mC+tPfvYhN9K5lR z%qus>`A*R-?2G8Y1H)m1{`Jf_3(`ft^@!O|M9}ir)tQ%FdM*Jo(j?gck5Zp^kU|Pi z25?Ug9R&$6ZA1^s?|c2u479la0u^gxAjyE&AM92{KbV`3?V*XN@}=AVSpT!R8u1z_ z?rg|o^1ODQqb8a&wWtODQTob{#$dh8qiX8QK~NYc$HXW43was(R#96M7z&5(l2pWwr-s_QW>)dRqI0~WF4DBpN@zwo#K`Xx_z>2KYIT5@W6P!79 z0C_>B!65g$#+_fZ(QN~jnT1utB!m}4^@R$%gvD_~w8Fwj zm^VUBu|Y!B@8*KfECig{>IHpBeet`zh7;?`GsSlw==u#aavQ4+^4O{!dcwmO6cm}? zZWYoQ8hXUZ5^B@=793w?(B@Av2{m4()*7c+%q}wQ@;XUX2XNcJ&8e!{ud1?`dLuO5 z$@y{lp4qqJSZ3csBfm=oqT1?yFmf=Hlhn3E6IR&t>dXbgLN-iPQ>}JOdoq*h5XYiA z2KjtnP(#D1he{52vuNZvLUN5#D&FH;nB1JvUNY5;MW=pk)CRdUbdD{J-qo@ZN9*~!tmh%; zWRs#FXpP)Ot3%Ddy&Gj0nl!sk(QxcxNJYk)ip8#G@p#{SnI9!gsKY_#n?qFFFEV%q z>)OR5g_8W@wKPl(P%^oVw=h+{VCz?Z(NoOR_HDvlZv2`!+a;+87ct107|UVwq_2RU z(6O>;ex5>uEzF2EomsTNu)D)&%t?$IBHld@aMNs|T(rs*1FOyAT+( zJoyTO7^YhuYK+ zq~9a{77RKq6OOaJYy;3|f-LAkxo=o3HMZfw@h@?g|AfT7LcSvhKP2amfgm~7Hz4J% zTS*yp(vsB&=UT`$JawAP1i~Y&E$EOqt`u)xA8d9?zUg;0g|9+rBOw~3Oe$0&K@&{A z!wKP5mjA-hbTrfQ8RO~Wm{^HwhK16LwDi29Z@y>E4f4v?X63y^U;C3>vSKf;(e6V%->9d0L77s!&!p&m zSzw!A>|>A4G!`;7$w4qfGWV7~YpZa#p34W#^A4)uVtXh~N$P+nUhj{DtzF=U`RgXO z;b}?@5do*5^d8gZ^ynyg2nR?1Wv+74&$pCW_7&exl(x?HxXsrRB3_MdsAp^SQqBt7 zB@2xDcVV@MZFU&GU|pGMdEB?MDHdj%vrh0;lEf}XDFkP$+V%ujM$WuH1v}06U`;*V z1Kq!`;4N8eijL~b+F@-=8(hp11r)YjWY!!NWve*yiKoW;Kl~=(FV9ey;1He}|C8~i zx#YfoA1mIfS~ZJMd|X_+_@U9~i`!m3D8%=Sr+VDSE-omDhBKgT=WV)kN_e6_5nHJ! zIDy{o4m(?RX>BGSg*8hmil48R{Z)yUxIjT{q#mxk0C=wy5%kl#mBU=Jh`SKmE15#0 zV4TFqsTt_``ES2sW2ZcRG3i^-FH0AGfmkBGub2ECs2ZFk!)_<{Wn#&2@$~fD4`5(| zX1U2hJS~Z1nUwzI`~AcUG%z8VAgj?R)W6K}f-hEzBFO_W+bsvjaM9C3;a5Pw)5c3p zL;rlV7~X+E!q}e^Tb0vC3Hkjw|5@0KxOPvN)bl0gUj49#FtH&l3#hzSHZe^^3xffO zM88Wx%rj8&095i>C${lk0)*~V10EZ&-=4GX0rlz~vR{&zJ8B7=-)}!h3s%bPAsNuj znouE|-ZJ5OXAAXlSX*-*g-vLv?`q#;5i$_4mWvUWniq6B3{rIhi{=tNV z8;|2qo?{c-7hvsue5H>!q(4X0^WxT~KGsM_G_!&>+lq`D>OcSUJraS$3G?TWy815u zK5y7E{bzX9172R*21Vw+FwRAq6b?&iw?2wSAHKWmqkjr@C0q>;l3!}qAAR=lGA(p_ z(B~1>*@dDK7yZaWjVQ&b=Q5Y$MVH%N5?Zo)n8jNuau%s&L6SxJ8we)lJ%tCt*NhkMH{L|YN?U4Ha*CSdeH#)x`&*Sx6~z-<%f1o{NCzjg(O7>oj;sGlp~-y3@k zR4*%oqCTOeyjD?uz7+rF@5g90uLz-)`=c=)_oqH@P@4vkcR~}c?n6BSah?hc>JVBP ztZb$qXdd%kk{}K1b3)qvXha_veBq-z$o-O6DSJtg_$jftiE4=ohw8#3N?F;BKY?VX zuc9>bt=dxsPUnX%{wNfOIS48p{99JtCAZ8gV0#{Z8vt$&^#bUq0H~e0_&C*R(Ts{z z6Lk*`zlZNyqw4K8l5OfKIWtfUqHxwRjW)Yy1du2Z5h!Cq?jb+0_bEO?R8iV-z$7S> zU?=25My+X)S|)A$eV}Sc*6y@b@IV;h1v*(&&Cz3X$X5g(yU~KYyw^~ex=p$US8nBa83%S#mHF3#K-$WGvio9 z9D6cqb`_=;DcE<56`Hf;XnALIKuY^^X@VSKMDxV^@nDUG(%Oi!+dVnfM)$I(OWAtW zHKZS}<9JyTc`D?o&B~D2%36>@y;Xx4p3=%V2f_kS}+=7w9K?1&>y!D4$D>~^EJr_j4LN^%JM|dDE&WH zgf3#OA&?uzY%6gai?G%&;1 zwr9Ky-BaUAUD-w5e$hi1!D za6X8?QoBIkPUI(JOco!+l#Y*N_I_gO+`kd=<-J~K^?3H1LT0YcAl;!cwIuvQqX+FU zIos7Ey0v(G6?MLB9EN9ou~pbedJrDRvZnp>U|3DkszrZw%V#6n4h^OFojG)GgF{I2 zxu&5*KhXH3sZ1ujtA2ZC;cfR%wrQwjx{!fn%q#jUx!R)Ati0R=)A~Kr(-kJFhOMKB zXY|%nuFeCUnI76*;e0|bP=dT7D927dmF)T2d$RmUJ?`JPpZb+fmau=n*Ierc(Vq|D z*OVO!C)vM$Bht>mHZRgX!2adZH7WoxN_+Y={I+a~1gjD>pXz~5aW}|TUOg0d`_^xf zYLb`Nv2SZ_8`?s>-Wy}5GRN?Uo~O=O^!4YgH{uIHukENQ`VX(JZWmWEVfV00iVNPt zGGa#79Vy>-T6vzq(l4vr+{0QZiSURCg?|p)zMzUz=R{61={vb<%R=ns&KG6m3Z+6p zMr%~KwmkjdVml(Pmbo-Sg2OR^=fgiPpA+JksMeG@6Rx#UzZ_UMV{)Et*0DAy5m7yM z-vz^qktVp_Z1S;-6(Ep(3DPPy{=w2Np%s^FW8eIR-5|SZH}Noa_*6*<3%_(J*G2m! zW6AVa7ps0XWiS(Dp@C7s`*`KGe-Y`W+B=Sn{)!!Qn)k~7KK|vz-|g-SNA%dn#li{{ zhfF&#$50kE*h`XdiHa8S(H_&QKvy}*5=rDr z>o_VUn^GH$iiFXgV+;L1FeNV$7F_64N#71shBq@C2GL+Y$=|t%`Meo;g3dFz#~V>}O$T@)RGff%aO_d)u3FbMrN|7v4m*PLe4Ydk}Sf zVv5Cl4-%%geX(^cICjON3!l6#yp@g9dB?p91zroYp2vI`ASQckN?0xzK$8(?aIbV^ zSgM0LE=XScOKr=HBaPWen`d5ye*3GjvXx9?8>`c5LPTpCL?H$?{y0~!GK||V+C683 z^pMdaT!bDM2eJB4Qf0b4I=xhGn{SYkkzh6!BZap6OjyfG(j~#TmLw7-qykoDUy7iJ zr-y#g``m>!v*8%oD8*ZKne4XnP(9mUReGn7`7s9VFg2l1~Z|5Ag(%?BiU+%{VW z95gwf*vlLlLxP(=&3KiZ!KkfDDFtf-9zHcC_MV(^L zFXEV993e{9KPkxMDNs?Y)+R3$fkitTr$(DoF-5$Z*0nZu#uXxE&2G@7j_`%gEB0j? zAj){ObazpY;oU7LH5?79)YJ(v*x+Buo~K>|S2+hL zJJ(vwPzYYHV6K5~dm}^(UiGfuDkxNNVqFcQ43C6Yq~H>eX6Ygw_jk~{TgHmsug-n_ zIhMNhY>sG=YlFN-WAahPFUQQEjw&mY^U~599xSU9yj6NJckDX0$MUi?KOQA3KvK-I zy2yNi9+jh(=wdAcb*(iwYHs}NYXvpV=h2kOp*Pvg!=mRnI-)$!s4=xQwDtlI>JxtNHeY5}hGC!q&KSqblOX7@;S1sT0!YD2H5o zT1RsM@`=LQn#9d_9!g2F#Omg|xva^udj9)r?GaZibTR2`K!WC?H_EFyw_Zm+aau!t zK8Mt6evL6TdI68_djYuSqKlobK%8kiB8K1FEpW;VKM*Jup~X}p*#zO?aVPGZShz$p zpYETpw%;HFCB5~YLKw;TcBt#w7X8T)0v&mBM08~)Kt5pf>M=3XPquc`N+}I7Zo=*R zxhplbXK_yz#QjxjWqQx$U+gr}(HiM0<;1>xS^8E)E9domi;BvO!;ywIIX%l;o@2XO z0nWGk3ELhePNvUzPZW_gN-^Kw)v+||aWjRWNgWmFSsqP{v+n-UloeV?zBO|+TRlK32~ zV*2dziYh*_EUQ7g-2FFfKcMm_CV2c*a)rsFYG4FFL_}`rYd+XhMB#Z-7*J)t7KRMC zbw}|XZGaq8tRuLZ+**Hd()A7Bp&v0gRLOX@O<xW%*Q$_@Vvm!?8(J`lfX`BhQbnMGw2Ws$Ou#e~CVCf^VpOhaN@xx?J60Y^sC))lvgrJRR7^oB$dS;HG{x#rgaRVqqG zr?{GAGvi72=`(vzR}+Sp|0yN@e)+EtV7{q4{}r;!N(w)W1_nP;>YpY5!2q4?o5ju$ z)h^bW`+ea+!@$9H6a;+FyvF!FPng^2o4WWW`D-%86KN;@DRVN?)+?g%7@_aJS*yWb z>vr@PjfERzr;$66@y}T%RyA+dadY9@luPO_szjiXmcnUWBNmiG=I(OuY75>efnU=j zTovInM~N^7!$S2k>@a(lMrsomAi=gHkPt5dAq9Bj_PYpPl3NiDk zQ)6198W`nyl_8B8auIj(;NK&Uq16Zcx4fSG?hP+P!DWxV{(aQBxVkc2NGvxFBic{{J$UW_vE3(ZztONJ5lXceH=AXa}{Dy^gY_Rsu zO<>v$+bi1FtQY)q%?b}rp0tOdQoVE!*iR~Pa-bhGX)wpy(cKRZxszWE(dl1j9Ba-N z99;%B7@p=2)^56LlO)be82pH`3eyn^(3#*!*#&daNmNY*1qCwE{cRkW0_Pd8)G9i| zRlQb;mJ%Cch+I=u5s=l%Lddk=yT7>&_wtdQ`h0@hn!d>ze%_o7EMO_*k={d})aUJO zFM6F+rpD?mJnQkDvIDnmev!6p{EGIh`pq&(wiw}UvVJko)TR^B91oV;SRA&-$4js8i(DtiY!O29G**D<-<1%)pT2Tsl%e0?oihsdNN5vWwOSSxk)kHgJvyjIlb zb?QjZ5}FdONqX2fgZjA^s%57tJsj7NRHQ#GBUV1qymq@*&)uGBp-z{&4UgGBSSPzk z+SL~DWL>ZW?|cy)AqZClc8`!Pfr>W#RG=Oplp4GxM7OEKyw4AcaZm}t%P6gWe7}oA zof~P;X|U1Y>eXWf6UDLD;INkn_(@Q3fynsj#Lz?JJ8+yE17q`XbkpTlp`(5_?l#V& z32c07vrSE&*27`hsb6OwXMRrHD7@~Wd(PXE_ylQF-ih9Y|61OYs@9`el$%-D-$*416hbq3UAf|14&#ZTdvm_``s3g zNL)5}m&{f&y<0YOQ=ssJ0zrfM3NG==b>9!m&84CokNgEBiE^N;ZIHbb><~;z3X5$b zxl7&UWq_=N-(k!you3`NDtUtaMrZWJSo)@V=9EnjiVtKe7YPQrOWV|DxLr-hauw)c zA61afNJnNcjcRPb(=54V_4lsf%a_`4JBPFYzY%cgf+c1prI^_lsS@p^uZ>z2dnWwBtU8O4=7h)n+I{OQzq6u6e_ygZoQR( zt1PJ}ZyvqBd3)1wR)?@D`8?e^9qBb`(np&Z>ohCi!R}{)hZ|~T#J@rkm8TyWnvX( zy}1Juovc0{o!AnI9_%&qk@L09yOuB@68_FMBbE78t`$`3cevRWBiG=^Qi=CfVw(?$ zO=I2!|M%?QEdm$ z+=)+o-=w`cpxQvA)B?SNEvj33?LKxmn=%Yur=yl@_IcaGV=13!oouCUoT0`(Dtt^9fKmq_a*@S%WLC8C)8 z<303^enOvS77#SdgB(0OJhomgBG;zWe5nd0;vA}4+d+oG&jFOtAGCwFrs1`#e7aCI z-ob%2AZ2va-~CPU^O#H|Nr2TOLI<@~)cL|QU_X5C{u;KVBa@Pp=dfeMK4=?jgKMoJ@yrfur+_>aYZ-n#CalD%Sq4ZvOw=u8U&8gi*=c={oqG>@e>{2U!*91P zJNE%oj^lI)t|S|L0)^~52V(EtlROyqJY}5|d$`Np7_F;w15_jPvcieTu?Y$0cUh3P z4@~oH4h`l;B1M-`Kz5RqjTI#KQwOf^C!9U`OWCg&t~kk+*8v_19Qs})Yd zOD6FgqC(qd#Lpg!HoE^BW0>+8=(4fmhQSrD75YCOQ~m@3*)nWPJOZGV?uGX?)i>OQ zVPzo!s+4s=L8>DjMrede$t-%Y=hSL`i0k>~H#l)KOZ@9h{==9j$ZSxOL2kdKRIx-X zp>gsB8!QurSA19LcNgi#6u&xW-`NIDP1!HSq<`9PdsLA+XavK@94q(2W*nc?2#o2gsNK)B+@cuF>xyvi`yKP++|^uD{p3DH@3Lx^3VQN}tq{W`Y_ zS0h^RIo1)3&%p+ufhg|7eD`S@!J>rxIubhUv1exsM96bryXtazahc2rR6KtsA|Z{)dq(KUETS&i9mecwOZsLx0dOAZ)gnIh_BH**RQ>(oLp!tq z4zhWRsDz;%3jB=J_3=({JnABbF9EZ@A6yk&0~7uBD!G&GA&yr5BUezFGH;~C-6J2~H!5Zviu1Q_9GZCz{9=KvheL@LS{~))%Nrjk!(2cJ(rG`15c0o5&mnLOi3O zOO5%OJ7%e*{rfwU!-P^90ToHroJodgC}Bm)^L9;;#%M=e4MREWpdOwZtL@qMx{nT* zW;AdEt%bq6echPsz&sjgy~SEi@?If@B~m80pH;0HC{>b|MD9iq$L{ zAmJeI2MQdMU&-pPwENq3pmVC~K^sM-z{rDiw!sF2+SEAJ+#IiApyyH?Z4Q(7OHwW& z+CC&{2bZMxThyNFjyti+4!nwKQV>rms-^lCne>gCIM*##qZy(6Qign>DLmg2UY3Xy}pVtz7I2R->n)+F^!kUpMKMhHCLN3yULK``Fcsbg|u7# z6>ZAPu+nz@BzOkM1?lv6puDnk9C{B}BG*4XBfQy9BtoK}`GI)W{#+G^Ee92R336FdUVd1r+R z*%rskfL``hnF^ygu3D}bHaknDR@I^gkbu;MRW;H`6)cdSWPFi6yOzA6OtlWC5(PQ( zFmk1=?Lug$Z$SS=U_{g^HF}H~QOa7<4RQY5E z^&XTdk2ToZg~&Z1Tc58Kmf%M#&W|;t+zxg2HzAA6wo{a8jADUxI0Ttk8r6qRor`0Z zj0)&~Lf7o)uu5>4n~g2n``k|SF7LJRCpo_L(mARSPPQ1WII&dXY#ZkLs*BSU8tknO zgo|L?&7yELotdPa?HP=(!1v)Tyyb7M$9zsLob34Fi^lsj84int!Q$P~@lie4>)Vd4 zij6QXah&clLb^tic#G&q+qDEQA)MLb@+kr$h?{-^-Y({};rwRdhWGSjVyb+EZ$vPz zdf4JH4b$j(V9)y8C*twUCRs=|mB0dEei ztdkE_eMX%b{2mfIV&8~l3FC9X!6CH^TBln5Y!k-$OOY0uw(rc&4Y5BA3^O?J#uZsF zG|8!_XzaLFN1t5YZ_IAW(n74N&7WKKDrH)oB0KHG9IY;8n4QdhMPC?R7n`UIosCUvz#~$ z!{%sBw)M_IRy2mVHH1*p)w3N@@y+jw^o1O?eF#UB1bTX(OsDKw-+I$PjKqD&U1Q>o zTN)aq;%QO*oPVJgA2UH@$@0Pmch|`(GYXnygI%)Qs5>JaB|mB@CGjtPi+RE}PZ)=$ zOo5C|EhrI6q~E%#n*IFz(4T0nSB!`qeK39zlB^9?%dsW=x*|WZF)S5R8xMI$Y}zSx zgqQl$VzP>Ya75tZOB3oCbDQT*O86@5ehA(mZ3z1Yi` zIKxVI9OXD){S+ypAcAUO!EfGB-DHYq+iBjv*Rb7ktoP2{ayVj8hmnpbB}Z+W#gneu zLfnk>>hh)NT2Q&Kkzwj-h*=sZemfXGbBOR7K2e`Ha--TzU&=w`K_`CB>ptvQ+*o2q zpIReu!N0)Xl6REegy{Wd!x}0X^)AakLtZezp8Ar#+;}R2cdw4}gzkZ`{#+Blm4Wat zVgG=2yynLhNaDW0M$Uc`bzY`%n?u*t=)wjpXSH1+kFrxRuA#mGy(o$Sy&a{+2`beF z0YxI6Bj28tE4N0ud>10pCCda9&e=0dX{H3rS*u*+^9|fVj%dR&|DY`HH3IG8)j-0} zMM+PD_y`8b>}BtrL-n>a54sc4vHfX856JyYje`M}2OCZOMGGn4he%E50cT24(@f@7 zU8cqp|2UXm^wtaMo!Z}IozK6sP4#rLi${Y+)JQf{q!@3hAqTeygvtQ*4v@7LOm{Ms6fnMYn!P`w5FlyI1jg zzUhYR?B|H>Iyq$+O?O*Hqfq))zg>Tvszn^Vy5KIi12mz97=2bsx@0N0!tdLhkj`hJ zX@YrL`qsdWk~pLZdX)-cJtn!aa0TjIUZaG`9NU{_qej46!XT*ApnmH-dSyh|DG8Kh zRA}*>5awA)M=uty9>m$352?=<^I}S7=s1Y(E7_RxPd0>KAM;xJxn6fscK5`tjHKkW z_&M-gczie%cM-YTh~ruLJnIrG_}!4e=zD#j814yTG3t*DYNH0VIYwMRz}PeYjC!en z)t)Q3JVcVGV=tmcRPXTSaB3CGAVX=o` z+@038&QK#2>S8XajEr@<<~dp{HJm)Xn3FL#%!*#`a;<0hE21pofe#;_kWWPeYGRm#pSB9>cPCD1-64 zkW|C@*-9KPMDo$-$6Y1NW$(ljzeNfJ?O@3bm(9{v`oC~zRU0uGLDO*_-~z+bOh>~S zzH`Q<@&3|OwdS(~&d5`JnyVOLhzhcrpPDiWN=s-GY)=AFdIJ*0A=c+>G0K7K!5_&o zn&>|z+NR%6Y5MikxpnPZIc&(FyZ_0H1OHETX&SSp*@Tv?HcT(cnzNfk`4c^A#oeo- z+iDAm7e98YZl@psc~yLh{iqX=eORz``eiG0=;CzPH9g9BMGm#*cP(n#cEJ6djJ$(M zme;7QMqk@hCT(0guWzd#EultR7{ANYtC8pT*&XBO(wb|%{-8-+)nRVnaU^NEJ z%$#Ssy;+ndc+yXKG-ZCJMt4-Tl*O2d{!ZeV$RfoydGLV@Vz^)>@}C_cF@efXBQbGj|0@#lD-R~z;+twK${#cZ`5$_ z@uv59$}d$k(!j7Z{p!whtbcMOj_3C$@}@`(Z7)&vk+Q6(#u?u9AJQ$*YNcn8IOew% z)h&@(Y6i`dXN!&y`Px~r_$1Nva}-U=zIKonziv_PrS)?foW%2xM=>jy6xj*FZPk>~ zs$p`87e?SULqzQh32ys+`GL|y4@=n1*QFOpKG8IJdr*3@)nks>#d1)&QYBDwPl_n` zg;$iC+%sqpK6>Mf8tokQ{K?#`Vb*%e)h7v*4n%{SFnWF*ve#5(xW{UU!}svI*=u*% zG`1Pjyn>R{BlFxx3T#`2sULf}8Ydk%dW#h(%QOE(x0ndVFmhcF#fDuR87DULnguZN zHP^lKbROm-T8@HbQ(&a!x%XmP-)p&;>@Y&Rkm^({$O!tTldy1=%y&HNnqsOeGOo6$ zo;E#JGCi;FS^pUgf#816C)CY-WT%dDrF&PaNkc-!l0~{rM!CSr`>3VsfFBO|Aq$w7 zbDnZVtdH6pPGi>Z;h#nZM4l=gKQA}_emir63Z0xOw6u}dx#y=Ji(|~AF&fd#0Q=PQ zpf7E`i*W$*b5Z08xnZPD6>OaF(vEGMEOO#)x{tfWOKkCe^h28 z>il_MbAz|d&mLP~g*lPw9=1}7xLR+K!|n_A?*5HsIC}J}AyHh?VIng3Q53VK zX5P=(?ZJ~te6V@(7n6|_zpY{!M*UWu0*#*=J^~2+(Wk$J=`i!H7e>g_`OO=?IGvlK z3hHE7-mWV4L&FnP<_drHRU9KcS9d|~)H6Wr7u$eXlqN=D8(uB~?VAZE!%y4qRVEQH z<%ngioJmq(r7ag9lk$DtN3ELQd#__ECiL&8GTNzF$9;%X{E~6dWfUV{mq_FNHr_@b z{hLlCMc?69JCh!waAE^%XIsRlEG1!|c@fK?XG|HnqPg1(Xvot5bgaWy^^>aqu$Ie) zjEL&TtIpf2sW{!dWWV|=MAl|S z9j4852Py*FAOWs+)?sz8>me`+0z)z*XCx0+t>Kfb6OVRC`MqwhJ&2RHsMFmQfb>~s z`gUZsJK_!hisS>!XN|79A#*B1tUj6}<>oNTUx~l%kUnaqMrrfW9FSJ^_cF|S=B3^D z>vjry{E(ybDUzTsAdfxBUHQ?$lHDGnW77S^v*z1%?eFKA`Idp`wD;XnBak|M6!9-! zfXRk)*%W2XEtzW$GqF`tqz=fOvz}fVu-cyo8>q5s79-i>Jw8*0+>a8)wFQF%rNkn! zTWhQJXmRAewZEo8>C$97=Ve>%iL~9LBP$&V=Z*^Pl^|9=)4y2J_-J$RBtqd{_to!_ksG~^uT$k;Xn0K{ zf16gCl)ozr+z|(?(W0M2o4BKL4fjq0E=BoSjtU-Z+gbb8%oOc1W^<}>KB$wv`l^sI zVH~YSjy z>wqHE50^p?re+eX`O&*aW03+D?i9qL7=`Ki7Mex+^kO^@Xx6!-7~O@T{W^FTvs169 zlh3b~@GsghUxQlaYtLJ|D9{;zZWW4^G%G_dx5Y{t<)LS-5d!}oS8x3m)%U;Q(jhRE zbj{G+-Q6J|jYx-dmvl=F-Q91xM!I7t=`Kl03F*)?e7@H?Kb(JIUwiGn)_Oh9eYXc* z4U2vG{ON?TBPxP7=vd{mmXL`lGYk=)bytYd~$Umpx0 zl2%$?&pP2{4dZt=nw75q=V!Lz&M4bmv^p2+`~7YqkYX*ha!% z|5~(Z$eTodcqjgdiD)XCAlR0A*I}Xp$cJXM;1U`!5dOzDfP#O{(l3J}GMpmWrXYH? z-18#eEO(Psa03F$|KTeH(Y%PHL&9L!X#Oxq{YGr~sLVfk_O@x4VL>R?`3$TBnBk&l z6FDfU&5PJm9+im4eLBBEWM27VFu`?Rsfgxi;=b2-kM^v_Z?Kjw9_xHv4^s*`5^jF~9Ds8!PHGH8X zVAAnC&2`{W5pKvYq_e$5BB8T}%56bOO%MC34?9@P3BH+x0NB$Hp6F-3e7m(|@4A#0 z!J18?^eC*L9AXi5#0-GD8DmxDb^Nvj?BT&FoWa=S4RXb0ntxtOvOvLglo<8=gYUaM ztvDzmS?|sfKFZ)VD%kSf<9Zg{fO^B!CitM#ffjqgA6&WTJ3wvR$Hyy}ncXl&Re$b! z1}HXR3&```Q+W4v)D_#NoSG0KUizBmVX{j_NS zTtsm9=op!A9PhIKH7=?vsD8%~n@a_qo7!ZTf#L!5={Q&j*&9s3Jp|~j5AI5~x&C1? zB;`&a**>Q(b4)7%?b><@c-|t%{yw ze|;??&|C0M>L}>Q|H%Ew`N&&qZ!{#jSfOXo!}_}WBEXsI9!9DB9C#T<1%;96bc8Ot z{T@<(LFzh8 zN=$YK>?k%+I2buPDv>PL@F($sP$^fw#4A;q3IibA?yB@RF18)rtJ%gHOP(K>F+=T@ z_Nz~R9)lv8>m>0fjugHC%>0O8Hu$l1B&@J5Ja%6O2l6XqAx=SjDh&ETN#(AgY0nYw zm*gHGA}r=%tZ*881_o_Ezk{;)(kDWJP^SH)XV+RQa=&%*K-c}8*QvyhLhpr1P6&{= zDVJT4sVSEohFcA#CZ_IF%R9g9qml60wWwwb>v}C>r?VaK&3!asV zYA)NNl7)?<010mTdtEn^P!O6eRYC<@jn8DgVv=rL~Nn-u?N{}UTXm@v^B}w zYyb7$3YVsYApFC`b0K_b{zO4bI`Gbwu1!%yyboHp`nT$H3O@VS@QWvOcym3}Xsq=C zS8PX4QVJBbfk7wma71f%IgIBHdPAtYHn@-FB$C>r=7F7H`C2cO{_|CA_ZWWz^d~ubF%P+452gQ|BksCg^l$yurydIHseOc<`J%GV`1_ic8 zY3uj1y6~~RHf_rE>iJno>B9yl^r3)d1wq#Gz9?vg>U54bQ&t@r#kcUHex(GlZH`+S_2>?<^??^YHeWK zd{q2N@h(*%MoP>=%3?u5);Ve=B5G`VX6>EODOl6%#D-lnnSD+{Sc&79{&hd>10?^`ZGfbu3oYv#3G|CM-Kx2bx$E7^@m4m zW9m!*lk(o4 zWd!sbT0B+yO?Z>?EbqM zNTX_Qt**7&71-4E_opUzTaP>n3Idi8c0D)@B5FHnLC;|Q1J8tKui%#qv1`0Hc8HRg zujQ!*AZ|^)x55!VS>@SOdiaMlgDQo!2)5jza|EK$oDD9+wxe|Jw-kN_3MxyZsJ#K?kx)UY_umESd5|2xLm=nSOUwVV9F%^O~YYPmxe3*;yJeN9YfqTZFJp z&SM>y3#+x4Pr{1(U7IEf3Q>9g`M}0N(0L7s+Upu!-zEJK;07BTTlz8V<(AvJt@9p( z&BA+YbfYxhX_Kc`i|TmQX^M zvp%VF9(VNDQf(U!+k|-Q9A@5rRnBO{WJJwjOk`8{$!V5R?C2JT8j9WZ` zx=%vFC7476;gQYXCu8F|{$}E->zQqi1e{MJ{cEnqqLAHO3-sMLKrz_ob{ql*1a5al z2oe*|UQ>Iki^{5(hV4ZQv1cMu5C@M@S*fokSzp8N9MTHB915FSBZd=aC5g|GWY{s% zK>pA;A4|Tfqzi?KT17Hp9n(qdw{sv~OXn%4)7@IlHIO>`A2dm=j||+dpNU(^e-g8t z1PTc*s%NTFMx!}KKFvDbX8i#Dmdq?Ff2Qy@#%BL3;>!`ph5;;S0bN7$4;Kior9bzH z-z@w?nWA#8?!ZuOt4bVd_fv^g*QKVG(0V4=ErI#1ug__YoCWOt0lsEAnrnjR68jN> zNsS{rQ1pI}xG^Ve#FMp)yGCmPuzg+o2=6?rR<4kHIh%eBtd#_T@QXOQ-kq%uB>e)P z!azvsgsl3eYo`J|SMl6gi)8_5-EuYXa&t9#Orv)5NyVCyr-Pn112~#cnlPc#?2vc0 z%y}HoXHDmLOtCHXA^O-K%n2Mx4JF$x*O$Av~D^<39%W62ho#pd@*iM?g2`!}64qy^Lj9I5jKAwxE^y*54+aaG0SelUV>|cxUZ<4W zb6T8QzO2sQbGFM$&AMA4;O{{#W5vmlQC|7^7l-AQf`ZY>oExH}1OgeUjaAN}WU!9CGlC%#K0RGgEp5UbTe2v|GG*eU_6>{ z`j+m7{(lg#(Lh+1WCxh zfAGB(>Uqp>v84F$;+?mS zrRzJ4zV990g_ir}dZEFXG@80@@$t7XD;j;ZZf(=1%oDTU@`&MNy7$%^ee=%77cbA1 zd-+ZS(-cut$(DOgjFSZxjWH*Oid(X~LRLYL??XR*;&9>y&2V_HHbpZtU=R)Cp*(?@ z7B!ySGWPgVW`$LE(7LlVz@}wFK`v|czOj2HyVl>KVHC3tBIgIStU&4U8RS>{$KQ-S z+H;+Wj%EE%^~vBRteYE>u@Ys$lCPdxN+Pmkx;L&)vZ9HP%3sI2WZYxdS^Hx&FvYRr zQelOa+uV$T#B3C+IYu{YUZE&6}thtoA7 zH@Eh{7Y6`-it6%U_odi;>t!c)s3*WI0OQrEg-7M$)+joGD~?OBhQTaP&imX?w!326 z2AB0!{1xw1$L-UFmYa(?mjerb5rgx`=uCzsT7O%xdh%?Y7|vA713GMZYMm=3Ixpn!*8 zLQwX9idV=&9Sgl(caXwFQSPipeud9J01#sn`k#Q=@1>8#q#Wa zYN%66cUWO(75 z9+i7q1;h>OY}j!A64=L>adk7NmF?fvGm}!R_(G|)r`s*xm1JDZcDoV~jvOP+loqm7XiIh1Hix>%h^2h=fHmIctYBvqsGx*y1w1rpbx{8`WQB^W6Wj$J7i z7WN84$#}^-e+qCd#UyqM@iU^Z8sE?SQ za2chj&piw}u|@~ za=Q7}&#^wvje7ax%wm!8Lt&%>jMX;Rl3du#`VHnHdg}qBbmE*&30I1Cn1*d!4=DTk z{6(P|>Rzqq@&WwEoMOSiPs|k&K2szqI};hUX=%_KX?cY|7ZVwiatd^Gkcy1tyNwP} zPf|w@f?ySjhgtNA>MLytMalb@OHYDAvAZGal$s>GPWA$|$hZ-UC$@&4=R-0RGSDTX zE1G$4RJ5EnXo5V3G&g2FL#;y*;A1NUD15@X6=LMQe>5l27Q4(&y6^xb%vIdmhPAzr4wfR}zDfGf+_&$UFfa(ddZ zM`AO9ZpE$+^9pDxUZ_LX^h-MQ*+JApg7hL}m4j zr_LyaZ}2#|qPsW8IA+0^J#y$@mk`LJP0OZOr$c0f8Wie6a*VvQ}?IEz2>y^~j4i zp#%({qzZ$*&_4b|g@NDoitaUUM&P-ykA4Q6^GrDY`=UzVM|Km1=`~qAn=2z-T>E$v zX}y@;6Bu6+mw>|aPL-LT`M7W}IF&(r+WA_x0zt{rUjSerMKfu#fOFs~j3X2NJG)ul zsi1oe#V=Yg;YSLzfS7M|ir8afzd4z9nYSxEAyI81NnY!!VG&+ET0#bNQ%r zKP~O}09I1d;P{ftLS{rKkcVo@~l6-n0E`o>n` za9lEY{9l5|HJk;(or55uwK>cYlh%T3LvCW9v%h_9+D^107%-zZT6TRtTlZWC2zDpfjfs98eBwVz|B}`4}e3+q5rWX#}qBk&H1i26FElL~<{%e?paCm!b5MsbS3s-)UPqWs^HkPVlF%v?; zej^|S*t=83>bT()R-7bnS(s(RIoN`3pm~pW`oJXP=@Q$bA=+E(7?sqcr|X!sY1qCh z&?f!Nna@Bm*5QAY*)RWBSu&hn2IXS?v!P>(r6QXzhP5U1oqr&G#{xTV2#$S<8sP2E z(Nv)^UpQ@3y_aBua6Q81wTA$TlH39A2|@(`)Rf!kbl@vVs4t;{AkJ5|3&BdFd*-UZ zz*XyN5wP{Cg|=gYUxYdQ0oL=V1t643&wCMLP0U%-$=5ZFiJ~&)hC=gS)!3p>Wh~>h zV|={u){85p6uS~IsF~Lp`?xgZ4>gp^G0}y~f|e4^s}qpCUm$)G?Hcy1-tBGfxYDWn z3!b|V{aetzcMyZipP;9Tpkx^B?gPxqi156B52GMDb|&^}jkz!(xZPflvw00rg?(az zn?sg%w|>A{Mrcz|7`ojTlgTD~kwqMKUHLkf#0mTpgAQd;Ml<*rogNBU5GIe0)|&(e zUs~hoZ`jfNNC4L$P;R2y5-1jUel69;N8{>e$H_4vv`o@y8R^=RZ61|uEJ2*|T|Q)R zEo_anl|%upctA6;aoKn9u{qU>#&P3m^#%%Mec{EGIF`Xoh-0xVkW3WsAQ~pvO7Ans zo3-Dtz>)^Lldp`I#0;~O8bk<>{0Y_=50SznF%3&#qeGo&1m_DR+Q+vfzShVq6w~}yiK%*CX;k#rBklWdM%bDj#3fwjUUXI9C~p2>ntp;X z7Dkf91zW7~Z zVipBo0qp3#e%9zRn?!=?#(HA`$JC1Qp2VnfBDv-(I(y)(V0hP@W+Og4OMRo69OX;G zpel9hPuda~2gC{0)u?ANA|Z)2iE0u>ur)E^{dGLWr;@{X0el=WG&gZ>L|YNCfu(Tq zkfBw$FTVQZY$t>-;)DPE& zhZwz)E(jgwI4uRxIT}8+4H5&-o!x#l=3JM8fYRrI=9%FWo#>+i4@GQm02A$!F8gSz z0g+W_5QI+`^HoUxEKyjcvIV$W{dpCB`}W!210Tc7g4MiiB!y-Z7TpfzSSSo=`AUQBYH+TNt@ZOu z8__;F>NE}N08jh}6eXN+E&FQkmCdLpqJNHV>i^mzR31d-zLw2JCZXalh&^s2Y7rZ1 zwZz{07 zGy&-VHP!Y=@h|g1bzdFGlGhl>)qGYE$x+QlhtUN}DT$&50CNS@KSfY6Qz<&r7XBkE z+~xr-sGKrr1$<>Ur6yg&GP6Vo(E51MT6;M#tO2=8@L$rQy_^+bE@M z{vOZ}4kwX7%fmO6GUR|{#{825J3u_TH|y`DJj z`Pzg(Tqdg!hPI|>DVyt%DE|;L)KD3fcAz*{Y8!NioT0>G)lZ#edo}r2?rk54BiS+A zk-Q81CFnEtjT}lw3&^TK3?nbas%7CHv8{r8TO`vXt(~qeiI)?6n?nj+WpMlbp)CJ> zTfG`h)?i~&sWn2&*t=y0YHxLv#5I+1B&d3B%>Dy=cWX(sp7cW4%ZdQj4E_7GzKqyW zS1yd$+X{(W?$Y$(qH;qlsMyITPll_tmYtvQ8@1YUQad)M@FaM;pYS7`|xN5!5J&|f`8T+SBh`LmL z%5F>5VHWT7Eb8j+@JE~QF@$x8q@X(ns|eou-Ca^%%b{BzVb%xU9dBfR_JeN`ST|4G z9jAog`j#Y=Y>2G@Vl$;fNTpHI2x% zdq0UTQz|cFdEOZhl-s~5WX(z|p0F_aAGPNm>{2RtHLP=!YODSw`o zh*~SQIxKg{QK*EvOwlUzY7pyM7|}`J{qIrV)6C}u%uBUp^5J4%;X41{CpRn?tOu8} zpiHq*rD9yZ)R0DV%e%7sK@lhI?P zjErTHq?DQO`WWbnsOl~!reev+E5l?aO}>|$^I+#%3f3IvFIN6Kd6;B;AL-*L=oiCM z7fNoeBeRhiXNZ4gwxslW;CnU2#k~KP;EJ_)sH|4C4^5aecSU7%C^sZo=Z(natObej3%K@-(`5 zQVzF+1=SWQXaV3ary7H$M4eFh$J&hr>S?x3+Qc8*rUfq}q6kKMg!zqyacy%+OVW*r zH8)gVaX9N>>=Q)Dx6(8z;&}BNe+{cJ-UKQ`78@#V<&}^Kf)^+jnX(uDPyBVW>q(Qg z1rdOMp?_-_Y%1!9~*{U$%G z1(6dfkvvYulx0&V`A-M)Cn;NlMYu95=}gX0ysS{;iD|07rV9TQFER+;N}yqd_>L z)Ini_4WV93_HQT!7b5~PY!TH_HhV?lgzf_8PgRq*$5wWgf)`{THM112V76!Wtn%GJ}SP1Q)^39=X%^1>wV0!LT?t zI}y3~$bgM~cLgEe+71?n{ol%19MSb8d6jp*yV$;31uLNmgX9U?QQNmdtydY_6kie76HedxB#S%hC7=;W z)_Kd5nVa`nX%X}Kta9+3_)oe|PYr*Z?Y6B_D4}v5Yg=&hnI&1JL46X-e)y@6C~Tt{ zx=z1q$eugD#=_rbZ8`})9Kk~MjtaoL2*ImSW@bI7(_8N-p&gW?YVH^;L%wbnLrzSCQWfx9}(boqQ>6g2+RZ zvUq=!Gfru-ucO*Z@HZH*p`1=oROGqKP+3YD0#XR^ia&!(QTg&l--K zBHuKt5kys3SlHpSWByngIlhSoo_!zOV4t{+XNo8NGloayjt-aaMmO1d)BB=@5v-!w zz#o06=4g4GR9RX-CdrD&Tt_|hJ$6|S8#p~Jqu`2!q-fq9_cz8S1?XLe_g=xu5aUv| z<`WL()2Fw0jjsHW=Wgf>2sPg#$kL<&pWPChjS)4$MT_ zaf>lYT4VV*g>;}QX0CO0LOQqV5a<)xzj{*tcMtlrEPe{Ir~0v?I3&A6&6iT7N~%1L z*iv?H2^Q*uH9e|XL1eSIhqjtooF9G>FQDi6ae2z-C4Gq&8hWkMTk;SWafT5%bgTq4 z&@sZP)|CMUF>9%G&7=K)JG*90sg;v>NN5A;FT0Y(zYO3AIXt@MVSNeJ?)f|gM{T;uX9Korj!g&OB8olW z^0Ukj*Y`&C-;k|rUwa^)cYU85tA^i$R11A3Y|dpTa?qKcoA>UL2?`9oMOt?*DIb)+ znOgAAan_hb0;s5K33QrDnhd>|NZ6K7Wk^q~o=S1u4mI)jSB^`p_Aj4~gz`sm3E9IZ zY+OL%;xOg5-3itkKp~)12wOu zq(`vo=f5P_Sof1SjMTga33M&oiA0kroff$eC6Ng1vTF!}#Rc@A{_RQpm3d>4)&3Gr znS}3lEqz>e@>BX-PGM5Qzx#?c`F=){y8&6vCO+9wm5BHV@`bc^UK_VC!g>axH&wOv zK0~$A)KkZb-}H~)D>_Bx(S8hKF@liem)MqaTm5525X7M?kv`r&98u`+S=RhHXG&)p zbmQuplt)9--YnMS{e#?kA6$Q9!>B6x7l?l@oPfT_q@(hPPXa#WF)Ixo;kk-3B{kN^ ztX%&iMjpPx+}jEOKi{<v6LQbK1U!v3R zmlN62iBeyrsb?~&=YcuD;Tq@LW&VOu_mQp?r$h3|2S#h0WIRLPJGQ0(SJrDBsb#D7VcU!aV)0xAe}xQemIxzZB>@ zd>rKyAYGxe=$D$TuML78x$1_Oh#&?4eYjnLjxPmYV8hq5g{pG9Q$THCkEF@jM7NVs z3lZ;eLHQ#fHe&Sz53ipLBf*Qoxum7`U~Y7HB6_c4?732Ek=s>2{+8%d$lYDn($r`1 zrWN%LT2Uwg2BqEY`g(}~JIyJ}0ngf!t5Kd<4pYJ}~NIoPO`~<^{xH ztj%>#82##v=%-Mwk;Oe6h-ym7?RR5KvjHQQ3pfg8pTFJzueI8rKb9nluklW|7c%fI z-4RNP9Gw(ODUbM@60Ew?}Yl}31gCHWIqEd#g;e#wf>Ys-;;G2fnPChm70$x?kBxoY`H>2}9G<~|GleZtn@I2HAsJ&8`o zPvNI`SYWzdtF+ASKx(g@dRBmnuXm91k$oUU~IVVW>j(ipO+Mxb3aG@wOzDQldyOGE(9gB zfzik^{DqoCYve@ZU^$1uI2mHDe!)tIBy?YvA{+C4#!m+`xv6+?Pt86)fn#aZzFm7{ z6ZG~{v0Mhr@WjR14XN3a-=Sg0^0=<}?mhhY&2+_v=F4t75=L+QXEh5aJQ>5-!V%gT z$xRci@7_e65N7&D-=6@I+Ch2lB_8^*$4P8*i`>T(kVUTR2dxL-}8Gh3Pf?>PQXJx54*e zNU&njqkflJ&gyTj57G@jkzJQcqF`4veuW=Sw%@iUCHszlf0x{H>n@WEsOi(XXBSDI2vDv;~gR5PcW;sXqBsxe>2o=R~qIE5WgPD?(Z`cx^B zcTmdy5Czs2SUTZ>h6oUC(5UuREHVV-`z2Q48LCQlvK@MiZlRpV3y^5$tomQlZ$cCJ zWjZC`YxppL>-I^M$Cb^|<&jC8uo3iVvNTAK!N`^Wf z-KU6!YICr5g!oG2yQ~$>_uu`S8{u&4GE$&2H!7=rSmN)V z#M)SFrnSoje!)XHj5&3|EuC9ECWnXP70oG|5%CQ~F8(;>`I{leQ+P6)PvuQ_QHycQ z?S42J*G%@Z;W4lF|2H>zZ~z%?_kg)&NHibsIGXsvYe;7K-O7n9uo%@#26Xaa#D58p zS2-3WHc8_JnXL|BjQVspZIddztZvB)XIZnXZy_}?F5`!cZ zs~yA0K~IhYBuq)VIHJNn^UdAPTP6U@w;*f!%<2SIywPXT5*$bB z6ZOBA8q^yJdofDQB_s`NdVp5~<{Nj3i1M+1iXbKVhZl%@J#loG1gvn*YY!PfGp?z1`JyVF>0KQv?nYNeQ_guEIw9n zf1P|of^Ye?2mKaaZ*pFmQ@ef`h`;XJxII}K+r!{rbD{xT?@u%Iw*Lsor^AG0X2wv2?vHQ2G zG0Wf7#NWubi@Jmv8M+a&(o)K~3z2G|-Xi4OR9jM$bCtVebzu%hGwmn|V@oYOPh-rJ zYJu-7>~J{cKT>|W+*vN9pLd9*om}#o@S=4^B4$O0__YdN!G3VjPptR)l@LGo>YCLx z^Y!Oi`?(7v>QQ^KliXFElVI5mF4SrNCzSqk$=V3X}NMw4FR%Kr0#~Tl^;H)@mg5)j)8a1 z#PLdx6_9T=n$dlt!%Ru|3y;AQ7y#(Nw#>Nm)I-Voo0#6863cI!zwR%}wi-;XavMJ3 zagYP}|JJRGfzUU(SuwbB(2B^LV5bQNc&!beEkt4pdD(&)B;JPVMvD4qz$w^_X$O@% zzC3q(McJJLztIGSAT#z_wXz-w*%To4IO}PK#}Wx_m<7PRHS8sko%#)V>vA?486+hh zhkDY%ALTHNjvRm=a5W)6`rc>XfaWy%D{^PmRHnz@nBa3!c-rEvCrUlXKiDQ_o~l@%d3ru1K7ScogEKjCSRuy zhT0sHF5PGx$U zK_*6>Qv866fD??no-5Yw61M7bPphxsQayggF{x4K=@HFLIMVZh)x zK~rMs)hOVSR?ib30JH%OcLP28QP!JD@FE$SYjt|zF;i5@1!;q|`x3GiOm`5`=#Vh+ z6NgW8*qr95lHAZ7WPbwjbSUe z-CkdM(MZNGEaQ$MBKsjD8Qkw~kwiRN1O$28pomz))3^XTGrZy7WJCS5C@IKiOKN{g ztSAX_*GiQO%o>@NFEzwFnB4(KB+DP{ucWzG;ZaiJprZ837(k>Gid)gS69ucG0Kz#< zqSfE=+&0)A02LuW>9De-o21XX`l*IE6T8MJ#`z2Z3pD0tNi4n=KzdcL?M%^{Iv$Em z^zmI7^M@glo$IL5>lt8nb%!U}@C#k;Ai& z)%6I?$oQ3Z)a^LG%hffOXY^Q(T?wz_>i_!-b}_i6NIj_o!Zahiowg+gveB>HMyqCb z@bCu$sEx)h{m5=7RTbGw-*HSe;txrSyI}M>n#D7QDR0P6k(0_2R`t4C!`AV+L38;@ zfj7#QzG1`Th!^SZ^dH-$KYM&n9r(Dhyo17Wi&m{P)U5ZD!!+d+8Zf?BL{Foibf!Z zu_oIJ3ZN2D1eEJ%Bi0hg;^bf2=|QTg3$i%X;)XYn)Q3>S6H>jW7oC!ltPnhm(LJg; ztRgyIdd_f*ec4{@0a1m$fisjQl`is!;2Ix(H^Syk)CHwGJ^5!cdNZ?uhUFLs3lt;L zF_fXaZiqn(>eaA-Sqh5(X8rWyvg~o$IWGNl5@ldYK2x^D9iqgqhFSjLYgV-S_|+dS zF!)R?>dN^?@&z0E7zYlLmJ^G#$)*4c?-b5~?TxNM0MAYzc3){o7i_kf*CZd9swZw& zR42o0>#d51mY5fCQ(~&$zO0)~f_v_svqWUC&Fp`|%5BNgtXd&?M;pzM3jy8_vj zVe*Ty6wkQ`mVEOuUgVvkPKxnZL;C{4FZ9&a4>8!$q_rUSoQDvhKHgqsoFuO0&@kdF zlE-g~yxi2UvbebUibjr|8I>H-?-MQ#Z!~ykW5$zj*2&(*V_@5IgASm{uR2`)S;C@z zeBv#2<8{sdm=(U4EHX?_2skE2=SKG1CC(0XAK88(zmi^iH2I|I#Jy5J6ygRhm6 zBc=&e$uiHD$q6>rn1RQf!z7`f0zdA@IDlnOrkdi}AR=g2&7Y{~Ny!T|gf3a#NJ<~~ zegf|*4@e6WQc$iZe=3Oy{{d^dErDnp5pX$V2BhT|K&rZxDGoYB46svjh z7)fcE5>E>KT}*l4hoB^iWp^RurV7b?Fb2I@D$8-PgPmS3rl7@5VVq|P@rMLPqsrdg z@^QPa*cR*(RZVLB=cN|SQ8ziJiS~t`O($fGI_7!zW3gE{UKeNtIBJ{)#@NdP36uf2 zV!qeZJUhQK9FwWGzxS#8hpN8sY^xQKygT|1O0eAoN`ToXb>o856b_MbDE+4Z@LI(f z-_icjc+}G9rfa^~>h1co)uVF!oxYRP~ zP;7*lSKdIx{t!WF=*lu_3f#cRXVKd5v0Zt>9l^t{BX+`IR`SW38!-fik-=YnPAD)%ZN@>{PvV2a zWMu8L@MpRvQ-A00_$lS(`1s(CKR6`nMsft$V!JW95$W+E@`>C^L^_70P&5;m6hsE) zrAh^HOLwYt?~ybiB}r(aw%n5o%XLz$2inrLLMrF*I>ZWO}oq0Sx+ zYRMj2y^0*AF<~KsXNQGJVXXhMUs}-4?|)&lrot#%S*l3_X4-XEg3wVyEGq8wS`&hA zKUzfFKBPOXeE&O~WN*mJ;`KpZt2~t{CDDSOKeOh6HQf}4=)mNN2`q*_o;p~&!jShj zVGQqEl!Ipp&WCB=iR-gu`F7VOWts*4klBYSBXW=1rIL|xJ5&YB9&noqY>yN93S!x9 z(Rhs#9*DL4JVU8`yFct?*75%uLYI5)_$Kz>MCLqG!L|}G$%fl$?f2~R)g($@QbJB? z2OtXO?=rYG?t~jtdH5=sXVldld@V%K?j>%W*|+{W%DWGwU=|d28sQVP40}Og?6V3o z!5w9Z#?LbT)4$&h)rwA{T<=p0qVerCJR>~cm_Mtolw!{Tl6L2zSx*+f5^GOTd6H?X zP@XD>v0NQsI0hZ%wb^281SGe!nJ+YSD|+f=1~#RW<62UNyTFTmcrCSTMt_(`n=aCp zUunGfIMWpHo-Gd9Yvr@R4wmVA!dm{*Jhtp#8yn zVOai>z=97IK9Ky-3T0L4W`3V%2WtLi`HBJMV_V1*QvPp#ELDJ|Wsrf0Z#)f~gPR%+ zo(ZLt%C`jl5NoK&;`BV;0QRQLNg68R+tI{-T8x+O%i$wT;}){1mVMGmB~hiVGV1cQ z&}5F)ZhU1&Dr5bnCF4BtZUDM+-vki>w3|x=ZmpeIDNyz2oAgS$$O^8{e)2s?v;I7l z^b0lx6v(mf`}O9Uyc(tYzMT*NZ$MfwRiq4S1PWoBJ9GkqFLNXku_IijbQkd9uWsX zUOfgXz)`2^;0g(kQ34ZLQMDY0hwz8D(bW2vwnj)ceIoN05^&lsDoq*GTIr@Xq>X+= z@9tH556uwXR}sI}O4T!F#=4V>ur2-6i-&Ev21o-L20A6$Ri=lf@+Q{RH_?=bF(G<} zHobd{=sTvH=PgmPkSbaIXkQ9e;59|XQw-Gmz_PT z3Auhb%d4;9a`ehRx|X)ZZ;6mr4>?l;6VA!5DO%`x(tHMX`r7C07d^6yI?nRHue~ia z*?CBqJoYXy=u*m`9aHVNo8&Y^SY{ub}v-~Q{dWY&}G&g(?~XG;BP zPdDsSUd#*5z`*b4Nk1?)6TNt-s?nESQAj+T{oS%(>xq3}xP4hKViDrW8&@V3web67 zXtPbq+rPB>@9E%pdKPhO7Oovqf*3AxW;sXJcpF5D)1kF<2~WhsdjKz;F`P)SvmX~O zF;7{_9mpAWDV!L3q9nmJ8QJ$uOtqK%#+XgB>Zh6Hx8=whG7as`&Jwz&s7^t%Pnyxi zb`s-Iy4`EUcQ^>C9R7WSK)0~-15jUI)9$gRK-K^&3Ygesq>o z_R9=KdPIQG4_fNI7b8((_W=zVU#l&EKI-YCARuGag_m?#&9ior_;{0@bO5oc`p5nz z8iZu0mHC?bG)iDS!wn_1VvT5CxIYyBIU1kr=+#_5h#qY)%HjRjkL0~5YLt~n5{^09 z3<={ke-7T)FEg<)E-(%d)mqHDuOc+OMLcx#db@vPQJauVX*;RaAN$C3j&n}H_}3la zbwD*Ga{GC2nRftZvsvl!w*8xi)BWr{27DbpRFkrn-$e|&oGXOkH}_~z#-N6cO8{cx zP@WX`OSJ{4kDu?e=q#q=_cBJ~%`b^olE$NEVR@xBvAx-^ko1sbZY>)Qoo1j%UtV+S zV(W^KBdyw_Y`pOK+!^u`;nj;E-xJ@mjtxpT=@8ycBVQ@h_yn{a_w{xiG4&gL6}}E# zJ!(TxClqb;ohUwqD>nzy0if)>`w;`%D3GkChmmU?z}%A;WFZop!EsTjqhCu=vs0~@ zc2a)I>I)3_NJI_nNBr>)#W{lMAIpuuQ*^!Qs`ydl9~m%RYXbH<8m?|-tO}K%vCCE` z(sRT27EQv+s^D{M76Zu`#Aw+0h^@tH{ON^=#Jp2Xg)SAM@b69qvRMgo_6F@Bw`z`B z$(vw9oaVU~F-#Xh+eHT#JowpmQPia}R(eafRt_gQbxjXTGg``U zrbFud&MV>)SQ;aIyS|G7-+vQ>40OsWAV<)I6tJ05lMEKJdVTYT`)T5`T#$N0Et0dn zQ}V9d-!tACyAJYchb`ZZs+>qf)YhFJH$mMDfe=BI<56O9elAIN@H30rIQ;Nn+$uNV z6EUBP!_-ehWMpeyNlp5+!Y~=Gb|Le_C6ZOg`6Cd-hs~>vTjQev4VtF(9p+qJ@syOg z+aD?a5gY2e`w8+yjysI8c3X_^ml~d#dg`<@;HZgNpzgEtum`@5^p+~%-YG@YcUW?07(5&4 zVFAOerfmqWr96I(`;~>j#tjTZSnBn2?dD^O`lM-;!10MZyKEm(zHtv$FG&`+dIXVK zDcf9|reRd~S<1$zUcnU5Tn(dvcb9wJJ2UEptk@+JZog<$)EmR~wzKan%chc$OeJV- z$yXRY6H?d5wikY+d?BB{qTSS>hWC>mV-H=C2?{UUO{!|V`^)0wZ-VMmhVt2ROgZyL zKz~v9X4XsrCi8Kc8d*gWK5>^!&m+B0co{PQc?&S{TDmB*5a*~2*5?=B9{y=}tePVS z*+wPXkD^$x#7~2A**8}SKLvRS8BBx);iRzQ>i?!emoZbl6XK;@s?uxXw9x+QNl7u# zDSe;ia~@Grtug;?ygTMRf_Xd+?2#}YG8lnlB%7dcIr(z$6+8zFFOsEF82O<04ei0O zT_W{|c|{*W)LisM3yZf$;B5z?_m7u|h|%=#7-K%$1UZESo2r%y}xm9@KV?EPuJ5xg@a zG@l{+rCmZvl#q5F|L)N#`Z^oxE&(r==w8B$`&kR{17^@jHrG0Vo!^RTnQOMs%4NcB z6diOfZE=93uIM(`huS?yc1r5~IfYj|hY;)RM6DL7$BA@`sd@x15>A!>U!+Iun%iEG)` z;;*HX!s?y4I6~-;r9y0+r)1d6C={x)0bb9Xb_cdl6+dLkNZA@)>gx$f#d3+^W>bg6 z!g^;J>mSnZvjNdbBrMzsEi@?W!5&#-q7C9`8=u=FiI+B27q?J+vc!!mzeG4=%O?G!M^PSW$TIG?{?BxV>vYEByBd5EuS@CR-%Cj5D zxVITiK!s{bcYXg_Vd$vWcX14Ty@A?|{!HMqJD#vli0~yIqmFjc zzL^lz4Hk!f_r9i+UOv}6e_Ck766y=4w^_ZqJI9r<8-7LgIqD-_py7KtY#hAT^t!5A zT3vV@R3+BfuPt766f}Ob!;u&IgW|0w_YPa@og6zA)q6#Bpz9TSM8qt6m2}11H2UkY z0|r?s(Wu=^R#1B4jlE3P88Dhtqm1hkz9Fez8sRL1g!r^7);{fVUxgK-NOEijs1n^RV^Y=4NYB|6^8uz> zOF_;n)_(UQv=)yWoA!M@uX)WjF;L0?;6q5DG$PF8B3uuCLoM{Ex7 z;#A7aAKJ6GJbI(vB4kajkE8R}at7Oun+339OB*~@nv8_7-e2xd-#wjwE1t=rN#jS$ z{)&XQKBQg5hY8{3s!`Q|{>3f-G`U!4d?LJwp+WvID}mj{u4rYwEk3hEMi%q7B=-2P z<>r7rp7x;e^1}rwDh+jG{Yf1Vh7J!~v~dF~i%^f!1{u-8v-rS$$_ zi$Wg%=`R>1!-(%oDATbE_G!b}6jp>w7FLj`elG()`LtdAQ>kaDeSAZwzXr77FHO0O zWF0I;&_C`jBXMWkEJU^T0He*g(4Hj3c;7Pze$YIZSRQ_@2voU3hOt9zChf*3>1b4` zwEN?5m9u+V){S^aWW1It=0@&!{PzMlUrswmf_JU@ze{#3-<{`W7FS+mS{&yITx}2+ zrcS~nT6&>J$Hl34vRe2ajw=si3AQ@Tt4+U$9gxylje^M{NBxqDak$tIE=^~3Cnof+ zeqn$mjR-*3BuqnxJV|Lfr1Ye7Ow(GF)6?ibR6<`H?+Z-7o&krUIBN1>l^6^{!<>Li ztScyhxzX3MdP;dJjPGdHgK7)|UzTUKt!b>@TN@z{RS!EK?yQQv&APGgf5JQCiI%Q< zE|9uE(47Bv?bTYBhE(;4ICui%11gV5&Y`ILZm6S#C=CyYcJp5$lRGF0Ki~bXKx4xO z)kHYofwYYZ>n2~e!6F4)x3P(W22))B$|$LG`i_iZfFf9AlWO_4(owALc700B*Z{0A z`{#jKU_prLq^o0SV}l)|lf)3Y^@LeH>pdD?z^qh|bn?2yy7Qf=0HlGX5N080I^nm8 z{B<*%9_@8xWr)R`$9}&?N63Cce*5Q?hs#(%o!~UIDt>@`8I~A9$+0D(fnY&E0Jo3- zQ{O1CzvEU5-l#RF@_kW1gIYTqdNY?3WOo2+g3$!%-&i28rv*?0td}? zzYhBiANJfd3ua5g8t?dBHZ^8qf#5`;ea-knRH|EVxLa3M?k$Rx^JV5l0KR}>{ns(Woxg)CpIkyK^3<57kIWPyaQ9sod&x4hm)c-jAQ@;i>-&K ztw#4Wn4tva%fqtkvDRVh)8mu`vDGB7OsLu%l9nq!@5no-c}wKv&F#0|eyCMT7e3P# z3=A%BG4`ST_OWhVL+b*-2w^F#=mw z9d!~ZyFsQy6b9|hI(x%=ZDh1|n?w|>U23xFd7ZhG!TuOhCB}#-u!2H_(57v4_20tF zdHW&rQ0~=qyeIqL57deh*(4vRA94&k*N1PVDb=Ow%Hk$TNugMsmIWt&Ou8sbjN;5? zLr=j7!?eCdJy+_?o1)!YkooT^n3lVj6G=yyr5rq6N&$2#Ue|LW;-z4^0J`B_tu;-lyuQ2 zl9n~!wCIu)0Bu29H@}9L)M$BT6WXPKDXKti;5`m<9ik*SGO|hhSETDghS6*-_Mb5`JH~wAyp0pbZE*Li!pUs@_~k^fyuMaLbI{4db(OtZ9ZJs9$u=jXXJLd2IdWLY#qWP5za6*ceH zj=VS6!ky1w8!fr@W4G`TZ+nYDUP=V2H6JsKkg{t@nowgX-PgmJsm^Td`7!TBbj}5{ z*Lrkz@(FQonsf7b>F?hT9@@zUTA%(6m~V{~I^D#R`d&^cgv2@Aq**>|GRDGWci56S zo%(crQK)iUZ+nsB&XvF1uwp#L;IKry74_W+^Q26uMk32zH*Jc?iFPrESpP;;i{`!s zYXoXyPu~=dCIQFYbR6E*GA_(0bNgsO*4L31h?(#HwcRv$k$M z9-$;}l$qntSNrnGm>kJki$u$#`@KnL35Bu|(325V{tGE;$wG?yRF_sYj8Zv&5U9AG zliynUm5;{jk;vYum)#WHwLMPw{hiJJ5|(vUqn~4G>~w?eSuLc|k22Bj^RjsAK32&1 zbs7N{7W^G)WCJ{`cz1pp!Thl6r!NCY@%FT;tq$fg_7H zq;xL(lu^8h#q}4<2Esa#YxW(k124f$^$y?5+^(U?n zhUVMzVYLgouzt2j{Hq`vW}%eafun8uX*DzL>O1eL!q+w0H1=TQrWxK3C^Ze1BRwVB zOhtT(4&7e|tv{>GNtN{NJ5NvX(Q+tLC_C!F?jt+R~-BSgF_&g2i;M-Z+jD5=rP z;@jafx%Gn}WJ#QVT_X6QE1er;H_|GD!qBUe**oHNW8?vrL)Bem&=DfYz&=RKrs}qW zja;dNL&3K}h*w3&I$vs_WAFR|-Vjxp?wR5gLVm{+I`ugPPjWzE{%r}zi9bHo!nnKi zv7z!i!Vk5NJtUy{Dnwy*yQ1UU@<&Uj6@9rg!Q5B38imv0R+wL32kjuG@WI*1r>s#X z_(OC5xi;(YX65d}Y(xa^sdV7md%zL!J)9OXp+1Py{?nrRf-hLSX2NT?>aP9`^oIu1 zQ7vqK>T|6cP0cG#t3%Xq?fQB5$Gs^p&b4LF!fFH8A6yafON8;Nd}gP;)Zs-3^Cp6A z)zj*Q4S)__fx>rwPL!HflT>$yi)SI42eAxX5RpqE2!|+f4s+^O4B~3``5X5NCpIX= zzv0#lA7p?N-3+ePw&|i!CAvECn0$)mmi`4RbzLsh$I4LEVY_H+Rv#px^5~$kw~n|F z;cow|wBLSG=|r_WU5F&fSKiwg4wrAu3DZ3AX%*JQvgx6l2Uh_tVby`L(jGHK#BkI5 zy%7}ANHvpL3KIz7F3Z*46BT($kenS&yfg@8Gu}X3a;w8Ie5(ba&83~Unfv+|-{NMU z&}sK%+0HqK@uZ@9>AoSoLP*}j_;r@3OP2I)mV!&jz2>GiTz3ZfvIWkrU?au9F$dY_ z?sx5!70k}`zD;Ns4%?$>pg1G+E_tE{bWof&8kv@=?04WxUBvZz4<$o0+8+JBGnEd; zb5$PG+wuEatwp_^It#P)$9!`Fe}tSFfQGFg2#RMa$hMxz_#OdK8-i41#`j7XU~tXNXM$NtzTNv#DLj=mT`DD z7_9y5WfvNR@qF6SY(0Y>7jZ2+ZR`OWFZq~)_b1$%AIC_E8YL(F%%iL03a2fwUJn^l zR;nMeczr{?KNMXE8Q28Q*a;R9DXIDdBCeAmqY~7rf<;>MoB2KtRxDeT}ooP}u z8iyo!*JAm=zja#8a7JNs;l4bWy$}*9^Z94~4xBX;)OyXQ9&8_gX z@-SWZ?qePmrpVsR5tL{&Z-hw}pqs+#kXZ-`1s)9X*?tjrIIU9;gB1BZU6dYbaX;pY zSGgf=wzEPak{s$(H+S8w?Y(G1tWYR<;K#ZI6}4m?$K%`l;EZ>g$bn$xXH<1|nhisx<|)=gxo z&{pdN)(}=}=g*gVU}emY zxca|5zVO(MAlr><*+HM&Wr9ZoKhJWb5MV#iqges0IAGXfM%eJR@5Ic3Z6D^tsw9Kz zeY~&&caf4DR&0Anr>bYPHMD*Wah^K+U~r*?Uut&QlVDelnHMW`dHhn@AN8L@s)x0S zn?|y9q@({Bpj@mCwv-P2Pi9a?P>!VMC#ca7#5T@n^vQ7_3 zRHe`!`f2~dFr4G;kAw@pQC_SB^-JR78cWD3*M28oBmX4#tXX0yYHHybojDb7`FaC<7q9iC$$anty4 zC1+T;jSc@R+WK=<006V&Ta zn!gwx+*Q&NF2VGqtaUY?Qy-;mmc4o3uwuT1m+29?sC^qR4b&y%3>@J~V;b+jWP43+ zhS@~eTe(XXr{$n_&$*)hX{c>$hzn~WW%?K1gl!fNx9UIn`pas8r(lhO0Z(^Fh@=*( z#h^rx5t)26REb>8s&%bk>Z10EQu!mbVqj+QD9#uI)7jHre+y@o3wdBigJ}>)nPzqY;;8VUJwPx?T48{_83Zexw@!1Fo z&yWT}3MKVjhW4+0_o*R>iLWGv^A=(@(L(U4YTS(r5kJk4TKe%45woY#L3={T{%LH3zq}C#)d{E?CVyuv2L8V<06tO50@!U0cGPG&@f7Zm2OC8t0t3yZ-xf9 z9h+cG7>N+o!=)I~?n>Hl?Jh}R{qaXFd!HuCJxi~pF;X69iQ5Pw!|q*&nduQtjeRNV z(1-RaoG)Woc4#gYUBs)6^e~pFl z-fQbDe0-SIPzCj~H0~=iBfoUjL)&|Mk#l2}dvsQV(2}XAImGvz{`1o2 z3=g>jiKQd9OxzMpH+kN^CI7e^;Qe01pXu0Z3C}Fl0ss)o5XdEBMc?}=$?^x2YFV1P z2^7*kz^5V~c=0h#^DWJ{uwd2Kv5P9W`N#M0>Ail9qkQ7z>Cpq))80f?8@Vqi;jWY4 zARAkO+PTG3Vr8HH(L3X{O1zpgVhbd;QF-8O`YRRrZNdhHyL22bUERygQ}1abn}}`p zA)Fw<22YOzf%dnnaM8Zwf~)Fc6A4j1-WI?8v4SlePE|GjZ-NdwFr(+(Me5Q<9ALV@ zSL0zN8-HwrtJ2v}T|ME`Q7y$ox@fzSnz>Gc-0Di%Ui?zrC30`v?8GDVLp_rMuDOC# zglMRLaVN(+DTW)$MIv4JXGV3ne2OFMEBLB2DY5GcuQ)cUIVt0*XQtj;%$v#IrH$*< z9fdm)7?KXuA3)|r`CELwd((}_rH?;WR#B_+q%x=JG)O-o{Ii7(-T%FQgGf~VG|JVxt z<8z4Vy<2hDc`fo@qzE7-ubKnJ7i28@?rVMo68=X`XT#>r7t`hLW{UbA3bxcqSBr~=4*9rU7bD$V{K)j>Y|V4K<~ zr4>f7!-j7=&C7Il{Ui4mZvMcj@SdI9Xel$li4VF-eo;j~{bA$h5U-$%hpQExCHJc( z;k-EY{*xo8;m``FF@2c{EvG`gS;T7~yebL-*p598elB`vTSLSe&S88%;x-UN3;`sm zjS~6wKjebvo)Wfd*#J7WtB3{?@+{^aWQ8fC^pd9O_IZj-YNte=%}xlRpn0+VJS%Tb6&=q!G*q13-ChB7wfyMX^1* zrhi^1ek^Y3yz7C~1*M)3`%{2-v19pfn-+K(pGnwt8oAcGkzX|BRHadset+lu5xI@) z!a~8ez*YSeFjX2_9yhS5yXC8v%hG1OqlMxH zZ($V1^`ba1UC(3r6V04^AhH4ZEZlUCY3SyMryPHxZVSY`4dR|xObl4KKMXlCML0%{ z2D5SVm(EF6HEK>p&&aPmQSw{4nSB73t9t>DYi%MG)u-C2`(s}4Ro^ADfrRCqq=^0z z@XG?ga$$9g$GwI&nIh)$7wKG9#38nAC8P|vDvfXq_Ok`JhjLB_hDk?N)Q12gZCfXb zeY9>o{Hx%)#r?md*VVM=If>kI;OBlgpD1j;oM#A&t@Q%V@;4^01-=09^52qeWDR)LF5Cgyf+Pz-)#H-Glmb9;#(v}VzvKMy zR{AZ{r)khM4b=Vzqz#ck5t-ztkY&frkYDRPd;kDU|NjTOae(dWs@l56S(LqD3)2Vx>&J=SlhXgmOz&(PQsaQ>oR0BM1i<5Kmu2-k=f zP?gX2<|IVtp6ZAn&_@b2shQOe5g(D|($xR?=SQ69&45mUjoSwCR2PAc=91glP>6&Z z+0%7T510x7oqB-c2m#~bYRORt0#I00;xz5Pk~mcZ%;cVz$^gRK@t}6as%=p5@Sp3> z)n@efu!%1OjH+_Y@Yqtzr$j=e9ML$(C5Q@l_^{y9J-5+pB_K|2olIq^CC@xfjww+r z-J_jU<1);%tvI9O=^isQrL4iUz5)c_T)R`_d2gp+Kzp;+!;Ylj8~$aW-zUAt4~;eaAI#nz9veiNCdV9^$SKrU;S1@={_K(o|GwIx4sOT4JO~|g=jxx&!+A%*(wVk4 zi6)5klU?LV!bBb@^(GtMh2LJcqp|#{kyl1hXUxFbxyw;7Z^97+_*Nb`~|`Vc8Ue7Q?Zgz(=X7^KZ&e_w|FX= z<#_?Uy>SR`0E0Zp8(c3*=4^NolMDLDOG2dHouMMm1=S5iAD2%_sf?qJf{lOPrcC%& z*SSiV%^XV_8&TnHf7p23G6hh}HQg@?bwcYn7wLmLPttzFj4Z%7Pa%kH zZrBG7SfD&&m^WCa3v=fJV5NuB*%9GG>B9UzOm}qUL2g!_9#-V>L%EyIvssE$&XTu% zdxip|i#c$r60HCAAZAW~4Cm4h%>(e8HU+@$OLZc%X_LR4H3%;;WMPAx7fNTosaZJV z`w1r8wRme`MZ@m_W6(j>YFWdu39P}(-|AdP{c=c{kopx}lVK6qt$LkcWf1WH3!j4l zF1SZ$4f)By%{bym@%J5J3ajPy{kEW>KgRo5y*GFj>9k0b7+sBK3nC+RitpasKd0Cn z^7;a#(Zl3-e;}r{JAUt4btJ>Z>r>XS!oxuP?x0_nHgN2I>{{*<`6hnx!Tok3mF!As zbcq#@Z`E|wwj3{iZG@?IvEo5mKc29fdH4Grkt`mbGIPhDpN!vtxKqoW(`H z`gX6d=Y}pNeI#gpa~BA>CN4a7;(kXra44$(mdBG-@thgF(s|fZIpo{GXodl#bAHfy zQ*0MEVO)s3nbU)I+H3v1Q^(djtq7)A2d@$T;`>j3Ob7_TAE|~rb%8C=xZCT9hb&T@ z@dfV#8|Z|rFhYyocES5q`zD{(T_|Q^d@$)r-pTJ%WpW^)F(&`5bnAr8Tq^0@tB9N+l)IIgHa+CQE9_AgDxM)9l6kAh` zp+f7uMU$fFhYJxzasog77ZePWU3eyHP$pD zb5XcKiCxnlq0+`L!@E96SpjV)%G7F&CQrbDRB z77~g9x#RzD7>Pej*toUGY&&t-+Dl3}y?ZMYCxrZcJRm%3qq$*G4lyZ7yplDLEMw6C zM_ql{2ztt8?u2~=O6;vD-;9G#w&os3)1wXBiRhHtnswHvG`FIWurkQp4GFu|_DhAF zLAJ`{M!k~GpJTGAaxDZ)kc@?2P>0{93HT;?QH~R%RY(+UM8IX<(un<9bm;D|RtGXF zjNG-Tsemc~ym7!x<&9>BC-8u7LqL5iic>vf#%E|x1`p^X8_9X$KwsL8<`?J{@o^a& zYx(rgogh{)LL(~ww~h=VlES<=gdNWM^F(x>*yU(#qMMi$<@fC`y3=|NzVP!jm%K{t zlTUV8E9vsHxZHgEU=Y(_xhJ)_Ww;>RZnKr4wiwS#!W{9TA-#0#XI5)V?7kc8;HekCHnDB=yCT-onb|Q1nwE%mA=e|#4S~u+GjGh7%ce&If`kT`j#Vo-BoV{Lg@)VZ|r-(bPI9_0BU6$*cFGgSK&PhWlVHl z2HxC`EzP?G;JB+xSc>~jqW@r{!qy)F-TXT*F= z-~aE+(ME)PX4geS5~V9i9;YQDgW3lb_V-wOg$w4UM5)%2+R@xL&){0!j&bWc#KSoM}n?DcNo} zMMAsLc*VeI;_Sa^-9vxRV;3g0J8Ng>WDFR}K}&-b9elt+ltz<=`eg8nM^%SAbh8(v zMO%EgCeLYpq%Hn*Bgbp4yqzi3?e9bu)?gs+g33lo>=OlC61nRX6Z zOeu2FXhGluC(8&~=o_|dVlJ*^N|Ji75fpr97ceLXaR(M@VfKgSe@FeZ6wf!M!VsG5b1X53G4^{(gKj&=xB?` za&ZE_3Bs8}pOxF4QyswDsyq@%KjJ#t@*rln0oORJr>^9$j16r|n=ga8|9%K#{{{?E zY@QjE6Ut43A>U0}o%u*LJFl<;vF0)7VebsE;l+A&m5kv+GHWn|CMo1XC-7PGJ+)%@ zpe`!!f1V*=EEAfbixt&h)t?WMLaZCtex~p>WAkJ3qbz_=8(^AM|7%Wna%bA;AF}z* z>x;YA@}ji;6$4FeF~>6HpjVSj3slqp-(OQXmn~xI=Xt!|Fp&QTz!k`TX%0$$PVM%E zoEbecbbM(RKo*<4-=n1e&&|30G_CBG0$5vYLH8#eSmA!kM(Ho&6_2Vi0U!o5Xa*le zwLIbfydvsbZ2{*SSX__!VDr^7pK{ZeubkJ`3$=h9+r4Lg_x{uWcuybRZUnakRXAFGQ4I&PeM=48as|2!_>jXLWxZ1k-Po9(XK#AsWS zenJ25cNuQAo2~(mfFC^IJp3yKS3$&O4d}2g1OsNpEZt^N<*@mR?EiTxXzsWcd~Vze zKqMEJ^s&9t$}vLr%Tg8ZZdUZXBW}IT&Ya^I6|YvI(o>k@Uw|;Wl{Zu-d7Ad7xVz z`em7WUHk3WKsPBL03QeUy-D6Vs3o>(Dpv;_)DCMJ*B8*MdqBo0_+c-J)n5Y`eN%#YyB;tB2KuFJiZj2a-QW7h`%^Nmn>!CLCw(c zu@JbT(s^Mq3I)$=E!SNv%1@`{PdFyrvltfiX>r!DAs*}} zAeW%#zV$g3b)jO^^OF$QxXPxmL<>Rvc}1>XdR!>q>kenaV~?xG=j=!h@3UJAcu>r} z7ta?i6iVv2$QF2QxXN$i)InSj!rVYBb@5y>@@RBTTj47|DIGKy(!xKT9mlUmF;`er z@eS}KPhUJEFU2<2St&`&w)u~pr%D=+<{zv505a~v6d;LB1SG7rZ^z@99V8PyPICnx z=%n7+1Wt%OkP>j$?WO{+yiuhH=i5p1(GS1*wb(oPOt9IGNf#WtUVDe4# zKalf=VtNv-}Op^+*YThFnou}IxtfcEWoyk^Vf|IE6nCC3%gFdnF& ziAi2usIT+}P|F~=Yrngy3G|noru^r&65#>bS(|$m1I!_jfvq=5t!68-jHo+}#C{)$ za}o|>vv|kQi16?lsy#fh{*aPo;hC2f}|2Uv(c zf|L|_Q@^mdreGS7D7h@f`hE6ljC(uzmq_c9p_k&0B2)F`58?C4Au0XZ>uwCG=e!It zJMVM)Ew1^%D5S(h;4A@)s!8^p4f9(G$BB&uY z?)q2iou=E0K{$WGHeeSE|D4hMHMH|*w<*ldq*R-WnLh_c*~WXdU|A^}$^ymO^XsVT>nGiadCwx}p27=!jWDj1-A9f!WTWzf0#wm6ZNZ+HwWJ4Jkxs=%2q zMO>4MKSm_hCQ<$UWUc_-*}dZ5cGp~=D5vkuqCG;q7-r^wB20$k$F3_O$AMmsv7&KVYe2NdgX7z>!QPaZHVejGT+4Yj3U%uG zI%3rKn-k{awPJ}$4tn?bmb{XpaS^+02B<%Y9LWu$07EQCNtRcz_5Pw0`udiiUs zJq^Gr6m@><&p%pw=br(4>Jfaj&5B0vd)C4zVQ#rzM=4}G6x(}?EXmLfJrj-ENGz=%}HiD6lt1hG8s-=gLLof<>T z(yIvmg->xK9+#DRnfAjDJ3}UyO9(dfm zE%--JePF6j7P>_=&ccNy70p7TH7j4I zeASb7nMLDMaD1kaO#yKh*eEG!+1Hx(k|}A!bw2ml3Wg$3a5P5Xit8LAw4b^jZ+yRn z)o@TbON-l1*`dKp#{Qe&X%GM_#a7dHrB=<+rKsPV{gL~V>pBFXk{C9Bx2f`;xxoVb z9;fwwOsNm~At=Cd){ccZ_m}hC?My4#jS^WWO)0!2B~8JM@gfW^Drxy+zE=*4$O{W> z*v^X6OoVvfN~nW!N%a)qV*b1tmhJbJH^$rj=*Ye%iv-FEiZw6={z4h)ILB;??&{c45*RVHCX~7JfV2#EVz(ZMM>X zPdYQ_hr($HvOIoVzpRm2NlLI9^$#NHj=R86fAB_nyW5b3HZDeBH_7P_w#1B#iWyTE z6Uuk=MzJjtU?X*@T-WiPR|;zPC2X96b^jV4a=ay+vNS~R`@Vay(;J8W_8+<9_&5F$ zy*_XDL0mhl<7W#})?6K@d>|)Qgul3f5Pr&;Rs-kH%}-D`5J*ar%q%UBM)IB1IgTM~ z7`u*0^%qahnUG3C!cD*pTkIva9h(){cs~+2{M(7+h?n1fokfj;qZffRP$Tn0>9b>< ziL(eq(M27Iv{yI_Q2hLrUbBR^Kd1EntR1ksu~@A?2exrAxV*F345i1nq6BR#WX;k% z&1gFlF|%;wCq{$AOCo+^usWAlYP&=zn|Al#W8wVH?Uzv$=X@ zyp7)bmTipg+}e)8@Eu6HhL;>b9S(>duQPMipAGX#&hHk=l**^%iU6wM(n zM1mnfAqQDL53QHgrJ)tR5xX4aG#9UuEP=v!x-2I*A76Eody3^m` z$ZvqW1m|I>Rf0~j4F93oceIDGN;fD_d=+9jaCT1f#GAD~Z6@D6_+I%ahB_-k%Z1EY z$%Bti7xA1r{5fLZo>Ih6z7SVIO`7~FMFlH~K699ofcJx^^It9p;QjC&N?VMm_vBmq z$a&sKtH7BL+wt8U=IgfIm8YjX?Q<>bXk=TGcr(E3gb^wi#rKt8ZSet>v4Ik&g6vbB zN0?5=F9UOe2Pq$pv0}J{$7b>U!0Q{-keJFbEVtFyry$o;GFbdUm%==rQ6kt+VYxS9 zv3KsH46vs^@8MRy0e$R6vCCz%H#_LJfeHm;hrY(-rr3&8pS`U0ysMR8qXN?_>tTy$ zP2F3@rc0=0`a9*zq~34R^Z9`@82{FPyE#cvXWM>ashFl5`^}_T z$J(n#;|qic-81AXBldyvpFdYn`|+=l%A?m**d8-diM6-SxFG+y$af!#aESoC(^pp@ zSol7a0G{b3+Q8Yl^c$rPoqYe=v=c}CRxNp^4)ud*W)MQf%aA<#I*#sf3yyTu1_>nW zh7K%2kQ6pFqA)U)YC>CgB1Kq2=b}JGiTtKlvY-Q#j}c{GW94?5!lpOW?ZlnJM}XY( z{!|b7page3RP(560xbL~g7lVNE(cpc0n5p3K~)d$n{{g#5)0`)E>QNrTMIu>dR9DDLeoX zPJbR{8>undpi@DMhP0PqwDDL=^I~ z=#9UU${`}IkobZ9ZCM6E!^w3i8kPS!Las$HWpzVgg18KYlyvGDy*cC zWj32ii*!D%J9Ux84}7Dah9fyShkX;zE`$&LptX&@=F}&x{nj_ACzX+-8&31o9LTA5 zx>;_O6$6qLKhbs(J8=@^+=91V!n#a+gGjITUf`3S=1@*|;dl1=AX`=?Sptw=G%+#m z4}sdVr0n6N6kwF%yFhXc0&TKOAmm%7W)wycE}Jkih%^|q1SHThKKoZu(HuZ3;w^9S zkvs9*iF??c-BI(LL*Hz_O+p3;fl4W#PWLphc^ z+D#@)xhOL6TMoUXxb0^c2e;a|OeBfm8*cD$Wjrzthgx$THQtVx)MQvnrxsRfzv9Zz z47sPS4j^+eogCRCtx%8*F2&tr2t$A+3{O>W9@gtqZw3?*M8usJ5^w5g!PLw)(*OGZ zU@4cpP5%|=CX=oGZBRDLAJ{j&Ozk=F&6lk2_CANdc)Nreo7}DJ7e-5rKlPJ(@aT;G zMC$h&^+kV8CF^wpM@o++{|G)xQmL44>VCV8+*z`(k6Yd-85F(cv{!3tQ}C0JFvuEX z2o3L7+hD{nN(?!MD}lZ>H#I`BOWmRoOQZb3>YNeT=@ueno5*IHoSqxRD}?Z^_v2|! zwGt>}LU~ysZdnO3ok8{#$j~(6tl35!$qEKC!B7@{M<0%c%_SXPdq|GEtq_9!YOqX} zQsP`DQiD@M?+doAAW3#7^UzNe?;TiHgT!gEsqJ=<>_ie_bMNqOn4zzH$KGL)nK&?z zw{xDUv^c)j5VOxB$QK?D7SKGpYbNewc!D!99+MxZuR%Uw;AA0Zson12=ckz_KV1g&&w`n;P|O)#5IF%I*}Q{RXEL zjv|s>cfJe`)!ewuGn)+0zMT6jyO7%UXs zb=&j%u(u7Wg|~sJ~L4p{7f3^q^NN zn*AFR{1^@;o8@qdD@>qKsgEPH`A`lXq|Zy{Fb|{~`Gbb@Ys3aBw-(EjOfMB07~HCu z(Zt^LHcezg${ZUTA@uh#@XsBFY2}knUe}7t^sccMm3qvfY(Fx`<8rj|3RW606oP$v zayGlpU|K|{R9IJ89mhod+P)>Y>uktzG?6nzdY8-?E+*>P^3+zQaYZ<06@QP$XCps5 zHwL_mQixP~**@ls^^I&Ny-DMdL*l_fMo4ohCANFZJv9=KeOD&czkU%HOosEyRw}a< zCZZY1K{lYhtS~YVZG!VV$Ae#Vd;J)eor<#A+k(TyyJ~jEjL@dDDcO@wob{S+BOj)A z-h@fe?nRO?uhA<3%`*O#tRkh!~d_0^A&q z5+{wEtLCw*o53rbxEUz}lXoUT`j-4#al+)~!U-9>#a~;yNbL(mCx18Tgaak=QB*Ay zNflT#Zd+q>_)(IaK&N=FecIVaFfA-C28Wj;)c1=jS-{I%U954|xdxKSIH_v;NaVR# z`v#dAw(4&*g+kB|t%jO%aM~6zsvwB|^vf~v7mRP%2$Zt7v}qLGP*Qlp=*2ruKvYfC zTia%%IHqetu)>P%E`=NFE&!_Q+%F)>`cqm^5nv8_K;r< zAa#aF)#>mSLn9pYHYEw25uF*~jCyIknZ67ZAzOU-aRN|Sm+&o)d?pSoqcEo_b}DG| zd-pgqvoj;9Z_sK&SNbd?2f(3sZL0lj)$(P-#^Z>Q0C7(eQV1f{(xq8iy~!XrX6Ci@ z7KpXl6*>vIcbb!ptMGKH{8LxN#47R`y_co&Z=-HOduXxj6aUPhOLXrDHEfrSy?TeN%LfIC2*eu*X ztV|G&%kq%w$smXT9XBkhW?VO+g#En;>l+HZt+;4vn|Mt0iX~Kx{Q5wUyio~<8XAM3 z?0UX13>8o;g4345Eos#}0#LbtOCjLu9X}N<$l?Iu>*RMIXrF&dm*4d{TBmvfn^DI* za_YArK;%p;0@K-q02GXmLQlSxH{QDD>cHrplUS!>sFZRMCpmIAht@6uKH5*Cw1v}= zRZuC2#ev==y!-1mgkvm;2qSGCHwkXD7ivzY?tXOsHe|x$pgq1rPYd1C&uo^HYQ3J5 zC|9%1-eUJ zf`B6fb=QCZZSRcKANw+&Ap0={V#bLVut=tFI$tg3mX+%AGXTLPX0xx1@1^vi@esN9 z@4>b3Meld1OZy1NsO!E$2`Rc^Q1Ng9jj5$`s(jN(>R&#QRAee4_(OLSX(v0B9GM9E z)Wut?^N@dcjPaE(3gT)_C*^LaV{#_qS^ls(zE+D)YR$o$HI}2c!E7SMObi*t#te|A z_+Mjy&s8vYS0H^| z+*i~!?=#k1ueLNYq|n49&BE11lrmB*^Q>iiU*G3>|AU=hXTCGP&3tD*GyhVgJSW!! z2CVB}+UDYUm~dd_xi{Him$Z!wZuYe26;yH5RsD7Q?gdvT$dhtxe%^~~i-jSw6j4uA z8_Bslyu++1Q>TXnL!$fg%ZZqSdsx4bC!)(<0w-Ht6YHLLBx;P&i!*b&A)q(}Kvm$3 zg*)BJM#4s7g>xP$&VI25bysuV!I=088JKs-+tT1QW~^C;16Gevuf+V?yuKtdE{>g9 zqXNH#E@m^Rov?-_z8oz+fAMQ+>uKAJadnN~C&gJi&$9AI5+`pK?cjq{G8WGneN^Oe z8BTWe{N6#i)so0s;Z;DZd60#lsZ#Exg^9B`w*v>;Om!-l&FM&ll=CB`b^Jnzs*q4D zA8VAkiMkuI%+CafpMvXN17j!#HR_7$5pZb5y@4@wUS2ja1og$z{ijAUQq8NN6I(VX zgaH1@h`6`$ai^wcT~AiEX_sx@TWHK387?I@9G-yLAGw3ij7X;|M+m5aRb`2Ouh%QW zG#qS|1cp!lM678I$B;O({l30UkB{m~?}khWtY_O_VhQ(&+o!%5v}>%*~Pq@iqxZ(C^7sy^p&D?y?t()1ou-C zSzGcoHNc+60}D{=YcYBSS}Zrh{rINqZi3KZ`#@eh;F@5g0uSx`XW_%Z$Sz@o7q(rn zQ>8M1@ifj%icG_#bViHh`icouf*fAKMjZZTNGA;FcmpXD-g=T^eBtg{-lgfI2Ih*@Op|B6;*Z8J6wxT_wHj~@ zx&y^6aaiIyd-HE~)4S$o(LWG2>%h`|@LmP&+}UGs63laD@>$k zJrlijZg8k1AyP=02Oke$mw>0oSLj!hfOeXA{j(n&)^d3_E;mwAj}!YV7sOq)&owum zFglESBr`yrG`3mE@$m;Gj^p6c7=v0VkPv}o?B$w7eQ6dfc3j=jCWl6s{+ib2?BjXt z(CvL1vmzec!OY=M@6e+JJ@U)}(*A?X!Ei{I8>c3RWP@fOXivkY%Hf)3ZiaSZyHK@I zpVIdAa+kb*kWLXx&zI&!w&B+Mn#pcNt!xNL-$@PjdFZfSm zAWF&%P8PGra?FQcRzQ2$^kYl@4K*1&!HW4+=ou@DN2ONI_v%cuH?C@f*Y#ECYgU#1 zSQ?~f6_Zkrg?*Rn?Os%uczu*mAA2U_e74!EecQ^*iIcB02Jwh#T<|36mPgpv7irx_ zbcH39PF;Tl+&`6+76zP>^FMVcYbM$ASNlQ9}wMArw7qR$Txc{B#Wt-?a>GG?UOP3mw z{|^2W3+f^yXXrR%OVAG%F{$6dGFA-)4~{0VAJX=sKU2@kE~zcxLM}dRg>^h%YF-`~ zft=EA0WgzvEMI)ahumYZ!bGJX_2kAkqA-Z+Rc!&vX0OObyXX!-UH%zL4gr)6_%4Hl z87%}Ob}6RIDbVZxaZ8}GEbRhGO_l$9@@Itqs4P{L-|$@!S&(fa+V#uTR%XBd8ZmVD gF#nQ4a(n|m9Ufw%+@03(O@C90hwEuvn{!z1ABw6*rT_o{ literal 37911 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 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_3.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_3.png new file mode 100644 index 0000000000000000000000000000000000000000..19c3517285eadebfb688f4e5ea11c10ba38eaa70 GIT binary patch literal 30990 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 WefPTWD>0gwqH_4CV&)+;@Baa%tge;- literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_4.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_LIME_Analysis_Derived_Quality_vs_Magnitude_4.png new file mode 100644 index 0000000000000000000000000000000000000000..7378b691abfd182c232883ffe11c1c3972b8c688 GIT binary patch literal 31755 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 literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_1.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_1.png new file mode 100644 index 0000000000000000000000000000000000000000..95647a7be99329c3e960f2c114ba36b0f53176d1 GIT binary patch literal 30282 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 Ge*XiyL`anY literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_2.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f06b1c7ea745e3719e685a00bddc12b287f5dade GIT binary patch literal 31356 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 ofrnUe70`OsALjV8( literal 0 HcmV?d00001 diff --git a/simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_3.png b/simulation-container/simulations/tests/RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0100d64e85c103b8933f5e4455c446e12507ed GIT binary patch literal 32562 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�rNrF}d&$giEd=Hkwn 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 1: + mag = [i[0] for i in shap_quality] + weight = [1. / (i[1][0] + i[1][1]) for i in shap_quality] + sns.regplot(x=mag, y=weight, scatter=True, line_kws={'color':'red'}) + plt.title("Quality of SHAP Explanation vs Friction Fault Magnitude") + plt.ylabel("Derived Quality of Explanation") + plt.xlabel("Maximum Magnitude of Viscous Friction Coefficient") + plt.savefig("RW_Friction_Magnitude_SHAP_Analysis_Derived_Quality_vs_Magnitude_3.png") + plt.show() +else: + test, j, feature_names, labels_test, rf, exp, trues, td, times, explainer = runLIME() + #outputs + print(f"Observation Explained:") + print(f"time: {test[j][0]}") + for i in range(len(feature_names)): + print(f"{feature_names[i]}: {test[j, 1:-2][i]}") + print(f"Actual Observation Label: {labels_test[j]}") + print(f"Predicted Observation Label: {np.argmax(rf.predict_proba(test[j-1:j+1, 1:-2])[1])}") + print(f"LIME model bias for predicted class: {exp.intercept[0]}") + print(f"LIME model bias for other class: {exp.intercept[1]}") + print(f"R^2 of LIME's local linear model: {exp.score}") + + plt.figure(1) + #mrpFeedback Desired Torque Outputs + for i in range(len(td[0])): + plt.plot(times, td[:, i], label=f'RW {i+1}') + true_preds = np.array(test[trues]) + actual_preds = np.array([test[i][0] for i in range(len(labels_test)) if labels_test[i] == 1]) + for i in actual_preds: + plt.axvline(x=i, color='g') + for i in true_preds[:, 0]: + plt.axvline(x=i, linestyle='--', color='r') + plt.title("mrpFeedback Desired Torques") + plt.legend() + plt.xlabel("Time [orbits]") + plt.ylabel("Torque [N-m]") + plt.xlim(test[j][0] - 0.1, test[j][0] + 0.1) + + fig = exp.as_pyplot_figure(exp.top_labels[0]) + + if SHAP: + #SHAP STUFF + plt.figure(3) + + shap_values = explainer.shap_values(test[:, 1:-2], labels_test) + shap.waterfall_plot(shap.Explanation(values=shap_values[j, :, 1], base_values=explainer.expected_value[1], data=test[j, 1:-2], feature_names=feature_names)) + + plt.figure(4) + interaction = explainer.shap_interaction_values(test[j, 1:-2], labels_test[j])[:, :, 1] + sns.heatmap(interaction, xticklabels=feature_names, yticklabels=feature_names, cmap='coolwarm', center=0) + plt.title("SHAP Interaction Values for Explained Instance") + + plt.show() + + + + + diff --git a/simulation-container/simulations/utilities/CSSfault.py b/simulation-container/simulations/utilities/CSSfault.py index c13b1bc..a7ff7d2 100644 --- a/simulation-container/simulations/utilities/CSSfault.py +++ b/simulation-container/simulations/utilities/CSSfault.py @@ -31,7 +31,7 @@ def __init__(self, components : Collection[Any], **kwargs): self.builtin = ["OFF", "STUCK_CURRENT", "STUCK_MAX", "STUCK_RAND", "RAND", "NOMINAL"] self.types = kwargs.get("types") if not self.types: - self.types = self.builtin#["NOMINAL", "RAND", "NOMINAL", "RAND", "RAND", "NOMINAL"] + self.types = ["NOMINAL", "STUCK_CURRENT", "NOMINAL", "STUCK_CURRENT", "STUCK_CURRENT", "NOMINAL"] if len(self.types) < 6: self.types.extend(["NOMINAL"] * (6 - len(self.types))) super().__init__() From 447dba8e9f53884a67fe0747981eff6fa540f604 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Thu, 8 May 2025 15:49:19 -0400 Subject: [PATCH 09/11] untested thruster fault module --- .../simulations/utilities/thrusterfault.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 simulation-container/simulations/utilities/thrusterfault.py diff --git a/simulation-container/simulations/utilities/thrusterfault.py b/simulation-container/simulations/utilities/thrusterfault.py new file mode 100644 index 0000000..fb25f11 --- /dev/null +++ b/simulation-container/simulations/utilities/thrusterfault.py @@ -0,0 +1,87 @@ +from collections.abc import Collection +from collections import OrderedDict +from typing import Any +import random +from Basilisk.architecture import messaging, sysModel +import numpy as np + +class ThrusterFault(sysModel.SysModel): + #simulation, simulation timestep, simIncludeThruster.thrusterFactory(), thrusterDynamicEffector.ThrusterDynamicEffector(), location relative to body origin, thrust pointing vector in body frame + def __init__(self, sim, timestep, thFactory, thSet, locations, directions, **kwargs): + super().__init__() + self.sim = sim + self.components = thFactory.thrusterList + self.timestep = timestep + self.thFactory = thFactory + self.thSet = thSet + self.seed = kwargs.get("seed") + self.chance = kwargs.get("chance") + self.type = kwargs.get("type") + if not self.type: + self.type = 'Blank_Thruster' + self.locations = locations + self.directions = directions + self.thrTimeData = messaging.THRArrayOnTimeCmdMsgPayload() + self.thrTimeData.OnTimeRequest = np.zeros(len(self.components)) + self.thrTimeMsg = messaging.THRArrayOnTimeCmdMsg().write(self.thrTimeData) + self.thrusterSet.cmdsInMsg.subscribeTo(self.thrTimeMsg) + self.state = [(False, (l, d, 0, 0)) for (l, d) in zip(locations, directions)] + + def UpdateState(self, CurrentSimNanos): + self.state = self.inject_random(self.chance, CurrentSimNanos) + + def replaceThrusters(self, newSettings, currentTime): + self.thFactory.thrusterList = OrderedDict([]) + self.thrusterSet.thrusterData = self.thrusterSet.thrusterData[:0] + thrustTime = [] + for (pos, direct, force, time) in newSettings: + temp = self.thFactory.create('Blank_Thruster', pos, direct, MaxThrust=force) + self.thrusterSet.addThruster(temp) + thrustTime.append(time) + self.thrTimeData.OnTimeRequest = thrustTime + self.thrTimeMsg.write(self.thrTimeData, time=currentTime) + self.components = self.thFactory.thrusterList + + + def inject(self, newSettings, currentTime): + self.replaceThrusters(newSettings, currentTime) + return newSettings + + def inject_random(self, chance, currentTime): + if chance is None: + chance = 0.001 + toInject = self.randomize(chance, seed=self.seed) + forces = [] + thrustTime = [] + for i in range(len(self.components)): + randf = random.random() * 500. + randt = random.random() * self.timestep + self.timestep + #^^last between 1 and 2 timesteps, so it shows up on the plot + if toInject[i]: + forces.append(randf) + thrustTime.append(randt) + else: + forces.append(500.) + thrustTime.append(0.) + newSettings = zip(self.locations, self.directions, forces, thrustTime) + self.inject(newSettings, currentTime) + return np.array(zip(toInject, newSettings), dtype=object) + + """ + Choose which components to randomly have faults injected. + + Parameter: + chance (float): the chance that each component will fault. + + Returns: + toInject (list[bool]): Indicates whether a fault is to be injected to the component at this index + """ + def randomize(self, chance : float, **kwargs): + + if not 0. <= chance <= 1.: + raise ValueError("Chance must be between 0 and 1.") + seed = kwargs.get("seed") + if seed is not None: + random.seed(seed) + toInject = [random.random() < chance for _ in self.components] + return toInject From 32e55d926d8979db06b7e8e94d54aa4420cc0562 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Thu, 8 May 2025 15:49:37 -0400 Subject: [PATCH 10/11] basic thrusted hohmann transfer scenario --- .../simpleThrusterFaultScenario.py | 303 ++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 simulation-container/simulations/simpleThrusterFaultScenario.py diff --git a/simulation-container/simulations/simpleThrusterFaultScenario.py b/simulation-container/simulations/simpleThrusterFaultScenario.py new file mode 100644 index 0000000..a6eac49 --- /dev/null +++ b/simulation-container/simulations/simpleThrusterFaultScenario.py @@ -0,0 +1,303 @@ +import matplotlib.pyplot as plt +import numpy as np +import random +from utilities.thrusterfault import ThrusterFault +import psycopg2 +from psycopg2 import sql +import json +import sys + +#utilities? +from Basilisk.architecture import messaging +from Basilisk.utilities import macros +from Basilisk.utilities import orbitalMotion +from Basilisk.utilities import unitTestSupport +from Basilisk.utilities import RigidBodyKinematics as rbk +from Basilisk.utilities import simIncludeThruster +from Basilisk.utilities import simIncludeGravBody + + + +from Basilisk.simulation import spacecraft +from Basilisk.simulation import extForceTorque +from Basilisk.simulation import simpleNav +from Basilisk.simulation import thrusterDynamicEffector +from Basilisk.utilities import SimulationBaseClass +from Basilisk.fswAlgorithms import velocityPoint +from Basilisk.fswAlgorithms import mrpFeedback +from Basilisk.fswAlgorithms import attTrackingError + + +def simulate(plot): + #a bunch of initializations + simTaskName = "sim city" + simProcessName = "mr. sim" + + satSim = SimulationBaseClass.SimBaseClass() + timestep = 0.5 + dynamics = satSim.CreateNewProcess(simProcessName) + simulationTimeStep = macros.sec2nano(timestep) + dynamics.addTask(satSim.CreateNewTask(simTaskName, simulationTimeStep)) + + satellite = spacecraft.Spacecraft() + satellite.ModelTag = "oops" + + satSim.SetProgressBar(True) #completely useless for this sim + + + #satellite state definitions + inertia = [1000., 0., 0., + 0., 1000., 0., + 0., 0., 1000.] + + #note that all angular orientations (here and all throughout) are in MRPs + #angular velocities are in rad/s tho + #satellite mass + satellite.hub.mHub = 1000.0 + #distance from body frame origin to COM + satellite.hub.r_BcB_B= [[0.0], [0.0], [0.0]] + #adding inertia to the objectsatellite + satellite.hub.IHubPntBc_B = unitTestSupport.np2EigenMatrix3d(inertia) + #orientation of body frame relative to inertial + satellite.hub.sigma_BNInit = rbk.euler3212MRP([0, 0, 0]) + #ang velocity of body frame relative to inertial expressed in body frame coords + satellite.hub.omega_BN_BInit = [[0.0 * macros.D2R], [0.0], [0.0]]#[2.00 * macros.D2R]] + + satSim.AddModelToTask(simTaskName, satellite) + + + #gravity stuff + gravity = simIncludeGravBody.gravBodyFactory() + earth = gravity.createEarth() + earth.isCentralBody = True + + + gravity.addBodiesTo(satellite) + + #orbits! (first, for initial orbit) + oe1 = orbitalMotion.ClassicElements() + + r1 = 7000. * 1000 + oe1.a = r1 + oe1.e = 0.000 #1 + oe1.i = 0.0 #90.0 * macros.D2R + + oe1.Omega = 0 #110 gets permanent illumination at i = 90 + oe1.omega = 0 #90.0 * macros.D2R + oe1.f = 0 #85.3 * macros.D2R + rN1, vN1 = orbitalMotion.elem2rv(earth.mu, oe1) + oe1 = orbitalMotion.rv2elem(earth.mu, rN1, vN1) #yea idk why this exists + + #more satellite initializations + #for some reason these are relative to planet, but the + #satellite log's aren't + satellite.hub.r_CN_NInit = rN1 + satellite.hub.v_CN_NInit = vN1 + + #sim time + n1 = np.sqrt(earth.mu / oe1.a**3) + period1 = 2. * np.pi / n1 + maneuverTime1 = macros.sec2nano(period1) + + + #now, define final circular orbit as needed + r2 = 10000. * 1000 + a2 = r2 + + n2 = np.sqrt(earth.mu / a2**3) + period2 = 2. * np.pi / n2 + + finalTime = macros.sec2nano(period2) + + #finally, define hohmann elliptical transfer orbit as needed + rp = r1 + ra = r2 + at = (rp + ra) / 2. + periodTransfer = 2. * np.pi * np.sqrt(at**3 / earth.mu) + maneuverTime2 = macros.sec2nano(periodTransfer / 2.) + + #define the two impulse maneuvers that make up the hohmann transfer + v1 = np.sqrt(earth.mu / r1) + v2 = np.sqrt(earth.mu / r2) + vtp = np.sqrt(earth.mu * (2 / rp - 1 / at)) + vta = np.sqrt(earth.mu * (2 / ra - 1 / at)) + dv1 = (vtp - v1) + dv2 = (v2 - vta) + totalTime = maneuverTime2 + maneuverTime1 + finalTime + + #navigation module - can be done via the satellite's own thing, but + #i thought this would be good to use for future noise-addition purposes, + #which the satellite doesn't support (i don't think) + nav = simpleNav.SimpleNav() + nav.ModelTag = "navigation" + satSim.AddModelToTask(simTaskName, nav) + nav.scStateInMsg.subscribeTo(satellite.scStateOutMsg) + + "Thruster Setup" + #state effector + thrusterSet = thrusterDynamicEffector.ThrusterDynamicEffector() + satSim.AddModelToTask(simTaskName, thrusterSet) + + #creating the actual thrusters + thFactory = simIncludeThruster.thrusterFactory() + location = [[0, 0, 1], [0, 1, 0], [1, 0, 0]] + direction = [[0, 0, 1], [0, 1, 0], [1, 0, 0]] + maxThrust = 50000. + for (pos, direct) in zip(location, direction): + thFactory.create('Blank_Thruster', pos, direct, MaxThrust=maxThrust) + thrTimeData = messaging.THRArrayOnTimeCmdMsgPayload() + thrTimeData.OnTimeRequest = np.zeros(len(location)) + thrTimeMsg = messaging.THRArrayOnTimeCmdMsg().write(thrTimeData) + thrusterSet.cmdsInMsg.subscribeTo(thrTimeMsg) + + + #adding thrusters to satellite + thrModelTag = "Thrusters" + thFactory.addToSpacecraft(thrModelTag, thrusterSet, satellite) + + #calculate burn times + #note that because this uses thrusters capable of finite thrust, this isn't actually an ideal hohmann transfer. + t1 = dv1 / (maxThrust / satellite.hub.mHub) + t2 = dv2 / (maxThrust / satellite.hub.mHub) + totalTime = totalTime + macros.sec2nano(t1) + macros.sec2nano(t2) + + + # setup module that makes satellite point towards its velocity vector + attGuidance = velocityPoint.velocityPoint() + attGuidance.ModelTag = "velocityPoint" + attGuidance.transNavInMsg.subscribeTo(nav.transOutMsg) + attGuidance.mu = earth.mu + satSim.AddModelToTask(simTaskName, attGuidance) + + #attitude error from reference + attError = attTrackingError.attTrackingError() + attError.ModelTag = "attErrorInertial3D" + attError.attNavInMsg.subscribeTo(nav.attOutMsg) + attError.attRefInMsg.subscribeTo(attGuidance.attRefOutMsg) + satSim.AddModelToTask(simTaskName, attError) + + control = mrpFeedback.mrpFeedback() + + control.ModelTag = "mrpFeedback" + satSim.AddModelToTask(simTaskName, control) + #parameters taken from scenarioAttitudeFeedbackRW + control.K = 3.5 + control.Ki = -1 #negative turns integral control off + control.P = 30.0 + control.integralLimit = 2. / control.Ki * 0.1 + + #external torque + ext = extForceTorque.ExtForceTorque() + satellite.addDynamicEffector(ext) + satSim.AddModelToTask(simTaskName, ext) + ext.cmdTorqueInMsg.subscribeTo(control.cmdTorqueOutMsg) + + #some final module subscriptions + + #apparently mrpFeedback needs config info for the satellite + configData = messaging.VehicleConfigMsgPayload() + configData.ISCPntB_B = inertia + configDataMsg = messaging.VehicleConfigMsg() + configDataMsg.write(configData) + control.guidInMsg.subscribeTo(attError.attGuidOutMsg) + control.vehConfigInMsg.subscribeTo(configDataMsg) + + + """data collection""" + + #how often each logger samples + samplingTime = unitTestSupport.samplingTime(totalTime , simulationTimeStep,\ + totalTime / simulationTimeStep) + + #true satellite states (translational and rotational position/velocity) + satLog = satellite.scStateOutMsg.recorder(samplingTime) + satSim.AddModelToTask(simTaskName, satLog) + + + + #technically a module for adding noise to sensors, but eh i use it for sun pointing + navLog = nav.attOutMsg.recorder(samplingTime) + satSim.AddModelToTask(simTaskName, navLog) + + veloLog = nav.transOutMsg.recorder(samplingTime) + satSim.AddModelToTask(simTaskName, veloLog) + + #thruster recorders + thrLog = [] + for i in range(thFactory.getNumOfDevices()): + thrLog.append(thrusterSet.thrusterOutMsgs[i].recorder(samplingTime)) + satSim.AddModelToTask(simTaskName, thrLog[i]) + + """simulation start""" + satSim.SetProgressBar(True) + satSim.InitializeSimulation() + satSim.ConfigureStopTime(maneuverTime1) + satSim.ExecuteSimulation() + + + thrTimeData.OnTimeRequest = [0, t1, 0] + thrTimeMsg.write(thrTimeData, time=maneuverTime1) + + satSim.ConfigureStopTime(maneuverTime1 + macros.sec2nano(t1)) + satSim.ExecuteSimulation() + + thrTimeData.OnTimeRequest = [0, 0, 0] + thrTimeMsg.write(thrTimeData, time=maneuverTime1 + macros.sec2nano(t1)) + + satSim.ConfigureStopTime(maneuverTime1 + maneuverTime2) + satSim.ExecuteSimulation() + + + thrTimeData.OnTimeRequest = [0, t2, 0] + thrTimeMsg.write(thrTimeData, time=maneuverTime1 + maneuverTime2) + + satSim.ConfigureStopTime(maneuverTime1 + maneuverTime2 + macros.sec2nano(t2)) + satSim.ExecuteSimulation() + + thrTimeData.OnTimeRequest = [0, 0, 0] + thrTimeMsg.write(thrTimeData, time=maneuverTime1 + maneuverTime2 + macros.sec2nano(t2)) + + satSim.ConfigureStopTime(maneuverTime1 + maneuverTime2 + finalTime) + satSim.ExecuteSimulation() + #collecting some of the data for plotting and returning + + sat_pos = satLog.r_BN_N + + sat_velo = satLog.v_BN_N + + + pos = np.array(sat_pos[:]) + velo = np.array(sat_velo[:]) + #^^ cause i decided to add the sun, which centers the inertial frame of these loggers at the sun + + navVelo = veloLog.v_BN_N + + sigma = np.array(satLog.sigma_BN) + omega = np.array(satLog.omega_BN_B) + + thrustLog = [thruster.thrustForce for thruster in thrLog] + oeEnd = orbitalMotion.rv2elem(earth.mu, pos[-1], velo[-1]) + if plot: + plt.figure(1) + for i in range(3): + plt.plot(satLog.times() * macros.NANO2SEC / period1, pos[:, i] / 1000, + color=unitTestSupport.getLineColor(i, 3)) + plt.title("Planet-relative Cartesian Position") + plt.legend(["x", "y", "z", 'vx', 'vy', 'vz']) + plt.xlabel("Time [orbits]") + plt.ylabel("Position [km]") + + plt.figure(2) + for i in range(thFactory.getNumOfDevices()): + plt.plot(satLog.times() * macros.NANO2SEC / period1, thrustLog[i], label=f'Thruster {i+1}') + plt.legend() + plt.title("Thruster Outputs") + plt.xlabel("Time [orbits]") + plt.ylabel("Thrust [N]") + + + plt.show() + return + +if __name__ == "__main__": + simulate(True) \ No newline at end of file From f0ae057f7c8ad3c14abea5a3d31cbbf5567f9007 Mon Sep 17 00:00:00 2001 From: Pranav Narayan Date: Thu, 8 May 2025 16:22:04 -0400 Subject: [PATCH 11/11] tested thruster fault on its associated scenario --- .../simpleThrusterFaultScenario.py | 10 ++++ .../simulations/utilities/thrusterfault.py | 59 +++++++++---------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/simulation-container/simulations/simpleThrusterFaultScenario.py b/simulation-container/simulations/simpleThrusterFaultScenario.py index a6eac49..3f91dd2 100644 --- a/simulation-container/simulations/simpleThrusterFaultScenario.py +++ b/simulation-container/simulations/simpleThrusterFaultScenario.py @@ -161,6 +161,8 @@ def simulate(plot): t2 = dv2 / (maxThrust / satellite.hub.mHub) totalTime = totalTime + macros.sec2nano(t1) + macros.sec2nano(t2) + fault = ThrusterFault(satSim, timestep, thFactory, thrusterSet, thrTimeMsg, thrTimeData, location, direction) + satSim.AddModelToTask(simTaskName, fault) # setup module that makes satellite point towards its velocity vector attGuidance = velocityPoint.velocityPoint() @@ -295,6 +297,14 @@ def simulate(plot): plt.xlabel("Time [orbits]") plt.ylabel("Thrust [N]") + plt.figure(3) + for i in range(3): + plt.plot(satLog.times() * macros.NANO2SEC / period1, velo[:, i] / 1000, + color=unitTestSupport.getLineColor(i, 3)) + plt.title("Planet-relative Cartesian Velocity") + plt.legend(['vx', 'vy', 'vz']) + plt.xlabel("Time [orbits]") + plt.ylabel("Velocity [km/s]") plt.show() return diff --git a/simulation-container/simulations/utilities/thrusterfault.py b/simulation-container/simulations/utilities/thrusterfault.py index fb25f11..b0802e0 100644 --- a/simulation-container/simulations/utilities/thrusterfault.py +++ b/simulation-container/simulations/utilities/thrusterfault.py @@ -7,7 +7,7 @@ class ThrusterFault(sysModel.SysModel): #simulation, simulation timestep, simIncludeThruster.thrusterFactory(), thrusterDynamicEffector.ThrusterDynamicEffector(), location relative to body origin, thrust pointing vector in body frame - def __init__(self, sim, timestep, thFactory, thSet, locations, directions, **kwargs): + def __init__(self, sim, timestep, thFactory, thSet, timeMsg, timeData, locations, directions, **kwargs): super().__init__() self.sim = sim self.components = thFactory.thrusterList @@ -21,30 +21,22 @@ def __init__(self, sim, timestep, thFactory, thSet, locations, directions, **kwa self.type = 'Blank_Thruster' self.locations = locations self.directions = directions - self.thrTimeData = messaging.THRArrayOnTimeCmdMsgPayload() - self.thrTimeData.OnTimeRequest = np.zeros(len(self.components)) - self.thrTimeMsg = messaging.THRArrayOnTimeCmdMsg().write(self.thrTimeData) - self.thrusterSet.cmdsInMsg.subscribeTo(self.thrTimeMsg) + self.thrTimeMsg = timeMsg + self.thrTimeData = timeData + #self.thrTimeMsg.write(self.thrTimeData, time=0) self.state = [(False, (l, d, 0, 0)) for (l, d) in zip(locations, directions)] def UpdateState(self, CurrentSimNanos): self.state = self.inject_random(self.chance, CurrentSimNanos) - - def replaceThrusters(self, newSettings, currentTime): - self.thFactory.thrusterList = OrderedDict([]) - self.thrusterSet.thrusterData = self.thrusterSet.thrusterData[:0] - thrustTime = [] - for (pos, direct, force, time) in newSettings: - temp = self.thFactory.create('Blank_Thruster', pos, direct, MaxThrust=force) - self.thrusterSet.addThruster(temp) - thrustTime.append(time) - self.thrTimeData.OnTimeRequest = thrustTime - self.thrTimeMsg.write(self.thrTimeData, time=currentTime) - self.components = self.thFactory.thrusterList def inject(self, newSettings, currentTime): - self.replaceThrusters(newSettings, currentTime) + times = [] + for (_, _, _, thrustTime) in newSettings: + times.append(thrustTime) + + self.thrTimeData.OnTimeRequest = times + self.thrTimeMsg.write(self.thrTimeData, time=currentTime+1) return newSettings def inject_random(self, chance, currentTime): @@ -53,19 +45,24 @@ def inject_random(self, chance, currentTime): toInject = self.randomize(chance, seed=self.seed) forces = [] thrustTime = [] - for i in range(len(self.components)): - randf = random.random() * 500. - randt = random.random() * self.timestep + self.timestep - #^^last between 1 and 2 timesteps, so it shows up on the plot - if toInject[i]: - forces.append(randf) - thrustTime.append(randt) - else: - forces.append(500.) - thrustTime.append(0.) - newSettings = zip(self.locations, self.directions, forces, thrustTime) - self.inject(newSettings, currentTime) - return np.array(zip(toInject, newSettings), dtype=object) + ontimes = self.thrTimeData.OnTimeRequest + if ontimes[0] == 0 and ontimes[1] == 0 and ontimes[2] == 0: + for i in range(len(self.components)): + randf = random.random() * 500. + randt = (random.random() * self.timestep + self.timestep) * 10 + #^^last between 1 and 2 timesteps, so it shows up on the plot + if toInject[i]: + forces.append(randf) + thrustTime.append(randt) + else: + forces.append(500.) + thrustTime.append(0) + newSettings = zip(self.locations, self.directions, forces, thrustTime) + self.inject(newSettings, currentTime) + + return np.array(zip(toInject, newSettings), dtype=object) + else: + return [] """ Choose which components to randomly have faults injected.