Degradation Modelling

This rover shows how degradation modelling can be performed to model the resilience of an engineered system over its entire lifecycle.

[1]:
import fmdtools.analyze as an
import fmdtools.sim.propagate as prop
import numpy as np
import matplotlib.pyplot as plt
import multiprocessing as mp
[2]:
from examples.rover.rover_degradation import DriveDegradation, PSFDegradationLong, PSFDegradationShort

Degradation models are defined independently of the fault model, but have attributes (e.g., functions) which may correspond to it directly.

Because degradation may only occur in specific functions/flows (and may not have inter-functional dependencies), it is not necessary for the degradation model to have the same

[3]:
deg_mdl = DriveDegradation()
deg_mdl
[3]:
drivedegradation DriveDegradation
- DriveDegradationStates(wear=0.0, corrosion=0.0, friction=0.0, drift=0.0)
[4]:
deg_mdl_hum_long = PSFDegradationLong()
deg_mdl_hum_long
[4]:
psfdegradationlong PSFDegradationLong
- PSFDegradationLongStates(experience=0.0)
[5]:
deg_mdl_hum_short = PSFDegradationShort()
deg_mdl_hum_short
[5]:
psfdegradationshort PSFDegradationShort
- PSFDegradationShortStates(fatigue=0.0, stress=0.0, experience=1.0)
[6]:
from examples.rover.rover_model import Rover, plot_map
fault_mdl = Rover(p={'ground':{'linetype': 'turn'}})
graph = an.graph.FunctionArchitectureGraph(fault_mdl)
fig, ax = graph.draw()
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_7_0.png
[7]:
fig.savefig("func_model.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)
[8]:
endresults, mdlhist = prop.nominal(fault_mdl)
fig, ax = plot_map(fault_mdl, mdlhist)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_9_0.png
[9]:
fig.savefig("sine_rover_environment.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

As shown, there are two degradation models here: - one which focusses solely on faults in the drive system, and - one which focusses on the human degradation of fatigue Below we simulate these to model to the degradation behaviors being modelled in this drive system.

Drive Degradation

[10]:
deg_mdl = DriveDegradation()
endresults, mdlhist = prop.nominal(deg_mdl)
fig, ax = mdlhist.plot_line('s.wear', 's.corrosion', 's.friction', 's.drift', 'r.s.corrode_rate', 'r.s.wear_rate', 'r.s.yaw_load')
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_13_0.png

The major behaviors are: - wear - corrosion - friction - drift

These behaviors result from the accumulation of the following rates over each time-step: - yaw_load - corrode_rate - wear_rate

These degradation behaviors have additionally been defined to simulate stochastically if desired:

[11]:
deg_mdl = DriveDegradation()
endresults, mdlhist = prop.nominal(deg_mdl, run_stochastic=True)
fig, ax = mdlhist.plot_line('s.wear', 's.corrosion', 's.friction', 's.drift', 'r.s.corrode_rate', 'r.s.wear_rate', 'r.s.yaw_load')
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_15_0.png

To get averages/percentages over a number of scenarios, we can view these behaviors over a given number of random seeds:

[12]:
from fmdtools.sim.sample import ParameterSample
ps = ParameterSample()
ps.add_variable_replicates([], replicates=100, seed_comb='independent')
endclasses_deg, mdlhists_deg = prop.parameter_sample(deg_mdl, ps, run_stochastic=True)
SCENARIOS COMPLETE: 100%|██████████| 100/100 [00:00<00:00, 105.29it/s]
[13]:
fig, ax = mdlhists_deg.plot_line('s.wear', 's.corrosion', 's.friction', 's.drift',
                                 'r.s.corrode_rate', 'r.s.wear_rate', 'r.s.yaw_load',
                                 title="", xlabel='lifecycle time (months)', aggregation = 'mean_bound')
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_18_0.png
[14]:
fig.savefig("drive_degradations.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

As shown, while wear and friction proceed monotonically, drift can go one way or another, meaning that whether the rover drifts left or right is basically up to chance. We can further look at slices of these distributions:

[15]:
fig, axs = mdlhists_deg.plot_metric_dist([1, 10, 20, 25], 's.wear', 's.corrosion', 's.friction', 's.drift', bins=10, alpha=0.5)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_21_0.png

Given the parameter information (friction and drift) that the degradation model produced, we can now simulate the model with this information over time in the nominal scenarios.

[16]:
from fmdtools.sim.sample import ParameterDomain, ParameterHistSample
from examples.rover.rover_model import RoverParam

We can do this using a ParameterHistSample to sample the histories of the various scenarios at different times.

First, by defining a ParameterDomain:

[17]:
rpd = ParameterDomain(RoverParam)
rpd.add_variables('degradation.friction', 'degradation.drift')
rpd.add_constant('drive_modes', {"mode_args": "degradation"})
rpd(1, 10).degradation
[17]:
DegParam(friction=1.0, drift=10.0)

And then by defining the class:

[18]:
phs = ParameterHistSample(mdlhists_deg, 's.friction', 's.drift', paramdomain=rpd)
phs._get_repname('default', 1)
phs.add_hist_groups(reps= 10, ts = [1, 2, 5, 10])
len(phs.scenarios())
[18]:
40

Simulating the nominal scenario for these parameters:

[19]:
mdl=Rover(p={'drive_modes': {'mode_args': "degradation"}})
behave_endclasses, behave_mdlhists = prop.parameter_sample(fault_mdl, phs)
SCENARIOS COMPLETE: 100%|██████████| 40/40 [00:05<00:00,  7.00it/s]
[20]:
fig, ax = plot_map(fault_mdl, behave_mdlhists)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_30_0.png
[21]:
behave_endclasses.state_probabilities('prob')
[21]:
{'nominal mission': 13.0, 'incomplete mission': 27.0}
[22]:
from fmdtools.analyze.tabulate import NominalEnvelope
[23]:
ne = NominalEnvelope(phs, behave_endclasses, 'classification',
                     'p.degradation.friction', 'p.degradation.drift',
                     func = lambda x: x == 'nominal mission')
ne.plot_scatter()
[23]:
(<Figure size 600x400 with 1 Axes>,
 <Axes: xlabel='p.degradation.friction', ylabel='p.degradation.drift'>)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_33_1.png
[24]:
ne = NominalEnvelope(phs, behave_endclasses, 'classification',
                     'inputparams.t', 'inputparams.rep',
                     func = lambda x: x == 'nominal mission')
ne.plot_scatter()
[24]:
(<Figure size 600x400 with 1 Axes>,
 <Axes: xlabel='inputparams.t', ylabel='inputparams.rep'>)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_34_1.png
[25]:
fig.savefig("drive_deg_envelope.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

As shown, as the time (and thus degradation) increases, the rover becomes more likely to be unable to complete the mission. In this case, it results in the rover not completing the mission in time.

[26]:
from fmdtools.sim.sample import SampleApproach
sa = SampleApproach(mdl)
sa.add_faultdomain('drive_faults', 'all_fxnclass_modes', 'Drive')
sa.add_faultsample('drive_faults', 'fault_phases', 'drive_faults',"start")
# sa.scenarios()
[27]:
sa.scenarios()
[27]:
[SingleFaultScenario(sequence={15.0: Injection(faults={'drive': ['elec_open']}, disturbances={})}, times=(15.0,), function='drive', fault='elec_open', rate=0.25, name='drive_elec_open_t15p0', time=15.0, phase='start'),
 SingleFaultScenario(sequence={15.0: Injection(faults={'drive': ['stuck']}, disturbances={})}, times=(15.0,), function='drive', fault='stuck', rate=0.25, name='drive_stuck_t15p0', time=15.0, phase='start'),
 SingleFaultScenario(sequence={15.0: Injection(faults={'drive': ['stuck_right']}, disturbances={})}, times=(15.0,), function='drive', fault='stuck_right', rate=0.25, name='drive_stuck_right_t15p0', time=15.0, phase='start'),
 SingleFaultScenario(sequence={15.0: Injection(faults={'drive': ['stuck_left']}, disturbances={})}, times=(15.0,), function='drive', fault='stuck_left', rate=0.25, name='drive_stuck_left_t15p0', time=15.0, phase='start')]
[28]:
ec_nest, hist_nest, app_nest = prop.nested_sample(mdl, phs, faultdomains={'drive_faults':  (('all_fxnclass_modes', 'Drive'), {})},
                                                  faultsamples={'drive_faults': (('fault_phases', 'drive_faults', "start"), {})},
                                                  pool=mp.Pool(5))

NESTED SCENARIOS COMPLETE: 100%|██████████| 40/40 [00:12<00:00,  3.17it/s]

Finally, we can also visualize simulate and then view the effect of the degradation on average resilience…

[29]:
from fmdtools.analyze.tabulate import NestedComparison
nc = NestedComparison(ec_nest, phs, ['inputparams.t'], app_nest, ['fault'], metrics=['tot_deviation', 'end_dist'], default_stat=np.mean, ci_metrics=['end_dist', 'tot_deviation'])
[30]:
nc
[30]:
{'tot_deviation': {(1, 'stuck'): 0.1656534429093935, (1, 'stuck_left'): 0.22840449239531124, (1, 'elec_open'): 0.1656534429093935, (1, 'stuck_right'): 0.2104345414665274, (2, 'stuck'): 0.1964505310929426, (2, 'stuck_left'): 0.22971338066484437, (2, 'elec_open'): 0.1964505310929426, (2, 'stuck_right'): 0.2171773057493982, (10, 'stuck'): 0.23464383477165737, (10, 'stuck_left'): 0.23464383477165737, (10, 'elec_open'): 0.23464383477165737, (10, 'stuck_right'): 0.23464383477165737, (5, 'stuck'): 0.2306917450022139, (5, 'stuck_left'): 0.2306917450022139, (5, 'elec_open'): 0.2306917450022139, (5, 'stuck_right'): 0.2306917450022139}, 'end_dist': {(1, 'stuck'): 26.523731872257354, (1, 'stuck_left'): 25.860046798075114, (1, 'elec_open'): 26.57220260010677, (1, 'stuck_right'): 26.20166482967244, (2, 'stuck'): 27.172035370071647, (2, 'stuck_left'): 26.774848679610265, (2, 'elec_open'): 27.202916726140977, (2, 'stuck_right'): 27.021107712270826, (10, 'stuck'): 28.362409603866865, (10, 'stuck_left'): 28.362409603866865, (10, 'elec_open'): 28.362409603866865, (10, 'stuck_right'): 28.362409603866865, (5, 'stuck'): 28.111686851146953, (5, 'stuck_left'): 28.111686851146953, (5, 'elec_open'): 28.111686851146953, (5, 'stuck_right'): 28.111686851146953}, 'end_dist_lb': {(1, 'stuck'): 26.14623845069785, (1, 'stuck_left'): 25.09849571929241, (1, 'elec_open'): 26.208768797424284, (1, 'stuck_right'): 25.635946967502996, (2, 'stuck'): 26.468978251861866, (2, 'stuck_left'): 25.638159264485516, (2, 'elec_open'): 26.560561206455155, (2, 'stuck_right'): 26.1772176497683, (10, 'stuck'): 28.161389842836325, (10, 'stuck_left'): 28.159239573221075, (10, 'elec_open'): 28.156129261427825, (10, 'stuck_right'): 28.161445469444747, (5, 'stuck'): 27.75852584692127, (5, 'stuck_left'): 27.762770834653356, (5, 'elec_open'): 27.75860378996304, (5, 'stuck_right'): 27.764476249365128}, 'tot_deviation_lb': {(1, 'stuck'): 0.13571879166791948, (1, 'stuck_left'): 0.21736487115289727, (1, 'elec_open'): 0.13650860515369317, (1, 'stuck_right'): 0.20675561017036592, (2, 'stuck'): 0.16842015435357063, (2, 'stuck_left'): 0.22088398156476854, (2, 'elec_open'): 0.1685139747019079, (2, 'stuck_right'): 0.21226352139747595, (10, 'stuck'): 0.22265649411951755, (10, 'stuck_left'): 0.22247532866373992, (10, 'elec_open'): 0.2226670223209916, (10, 'stuck_right'): 0.22276138420517372, (5, 'stuck'): 0.22072429251141193, (5, 'stuck_left'): 0.22077090935724847, (5, 'elec_open'): 0.22078762849971775, (5, 'stuck_right'): 0.22084321310379285}, 'end_dist_ub': {(1, 'stuck'): 27.21564598024609, (1, 'stuck_left'): 26.819731296832206, (1, 'elec_open'): 27.227728922325657, (1, 'stuck_right'): 26.988638064657255, (2, 'stuck'): 27.813234007110612, (2, 'stuck_left'): 27.6596940062914, (2, 'elec_open'): 27.845948147666927, (2, 'stuck_right'): 27.76530129279673, (10, 'stuck'): 28.49298350826101, (10, 'stuck_left'): 28.495613180170622, (10, 'elec_open'): 28.494914550549257, (10, 'stuck_right'): 28.495405869884404, (5, 'stuck'): 28.369282787528242, (5, 'stuck_left'): 28.373611371491226, (5, 'elec_open'): 28.367918403960314, (5, 'stuck_right'): 28.38249279815492}, 'tot_deviation_ub': {(1, 'stuck'): 0.1953217725069562, (1, 'stuck_left'): 0.23931020471390319, (1, 'elec_open'): 0.19586022749332546, (1, 'stuck_right'): 0.21639285790963977, (2, 'stuck'): 0.21518468262643933, (2, 'stuck_left'): 0.2445274269212801, (2, 'elec_open'): 0.21545348208468065, (2, 'stuck_right'): 0.2228083137887025, (10, 'stuck'): 0.24831573141112775, (10, 'stuck_left'): 0.247827628595252, (10, 'elec_open'): 0.24805528959894926, (10, 'stuck_right'): 0.24839388175218036, (5, 'stuck'): 0.24519268153504145, (5, 'stuck_left'): 0.246064854354927, (5, 'elec_open'): 0.24541671498688775, (5, 'stuck_right'): 0.2452609507148084}}
[31]:
nc.sort_by_factor("fault")
nc.sort_by_factor("inputparams.t")
fig, ax = nc.as_plots('end_dist', 'tot_deviation', figsize=(8,4))
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_43_0.png
[32]:
nc
[32]:
{'tot_deviation': {(1, 'elec_open'): 0.1656534429093935, (1, 'stuck'): 0.1656534429093935, (1, 'stuck_left'): 0.22840449239531124, (1, 'stuck_right'): 0.2104345414665274, (2, 'elec_open'): 0.1964505310929426, (2, 'stuck'): 0.1964505310929426, (2, 'stuck_left'): 0.22971338066484437, (2, 'stuck_right'): 0.2171773057493982, (5, 'elec_open'): 0.2306917450022139, (5, 'stuck'): 0.2306917450022139, (5, 'stuck_left'): 0.2306917450022139, (5, 'stuck_right'): 0.2306917450022139, (10, 'elec_open'): 0.23464383477165737, (10, 'stuck'): 0.23464383477165737, (10, 'stuck_left'): 0.23464383477165737, (10, 'stuck_right'): 0.23464383477165737}, 'end_dist': {(1, 'elec_open'): 26.57220260010677, (1, 'stuck'): 26.523731872257354, (1, 'stuck_left'): 25.860046798075114, (1, 'stuck_right'): 26.20166482967244, (2, 'elec_open'): 27.202916726140977, (2, 'stuck'): 27.172035370071647, (2, 'stuck_left'): 26.774848679610265, (2, 'stuck_right'): 27.021107712270826, (5, 'elec_open'): 28.111686851146953, (5, 'stuck'): 28.111686851146953, (5, 'stuck_left'): 28.111686851146953, (5, 'stuck_right'): 28.111686851146953, (10, 'elec_open'): 28.362409603866865, (10, 'stuck'): 28.362409603866865, (10, 'stuck_left'): 28.362409603866865, (10, 'stuck_right'): 28.362409603866865}, 'end_dist_lb': {(1, 'elec_open'): 26.208768797424284, (1, 'stuck'): 26.14623845069785, (1, 'stuck_left'): 25.09849571929241, (1, 'stuck_right'): 25.635946967502996, (2, 'elec_open'): 26.560561206455155, (2, 'stuck'): 26.468978251861866, (2, 'stuck_left'): 25.638159264485516, (2, 'stuck_right'): 26.1772176497683, (5, 'elec_open'): 27.75860378996304, (5, 'stuck'): 27.75852584692127, (5, 'stuck_left'): 27.762770834653356, (5, 'stuck_right'): 27.764476249365128, (10, 'elec_open'): 28.156129261427825, (10, 'stuck'): 28.161389842836325, (10, 'stuck_left'): 28.159239573221075, (10, 'stuck_right'): 28.161445469444747}, 'tot_deviation_lb': {(1, 'elec_open'): 0.13650860515369317, (1, 'stuck'): 0.13571879166791948, (1, 'stuck_left'): 0.21736487115289727, (1, 'stuck_right'): 0.20675561017036592, (2, 'elec_open'): 0.1685139747019079, (2, 'stuck'): 0.16842015435357063, (2, 'stuck_left'): 0.22088398156476854, (2, 'stuck_right'): 0.21226352139747595, (5, 'elec_open'): 0.22078762849971775, (5, 'stuck'): 0.22072429251141193, (5, 'stuck_left'): 0.22077090935724847, (5, 'stuck_right'): 0.22084321310379285, (10, 'elec_open'): 0.2226670223209916, (10, 'stuck'): 0.22265649411951755, (10, 'stuck_left'): 0.22247532866373992, (10, 'stuck_right'): 0.22276138420517372}, 'end_dist_ub': {(1, 'elec_open'): 27.227728922325657, (1, 'stuck'): 27.21564598024609, (1, 'stuck_left'): 26.819731296832206, (1, 'stuck_right'): 26.988638064657255, (2, 'elec_open'): 27.845948147666927, (2, 'stuck'): 27.813234007110612, (2, 'stuck_left'): 27.6596940062914, (2, 'stuck_right'): 27.76530129279673, (5, 'elec_open'): 28.367918403960314, (5, 'stuck'): 28.369282787528242, (5, 'stuck_left'): 28.373611371491226, (5, 'stuck_right'): 28.38249279815492, (10, 'elec_open'): 28.494914550549257, (10, 'stuck'): 28.49298350826101, (10, 'stuck_left'): 28.495613180170622, (10, 'stuck_right'): 28.495405869884404}, 'tot_deviation_ub': {(1, 'elec_open'): 0.19586022749332546, (1, 'stuck'): 0.1953217725069562, (1, 'stuck_left'): 0.23931020471390319, (1, 'stuck_right'): 0.21639285790963977, (2, 'elec_open'): 0.21545348208468065, (2, 'stuck'): 0.21518468262643933, (2, 'stuck_left'): 0.2445274269212801, (2, 'stuck_right'): 0.2228083137887025, (5, 'elec_open'): 0.24541671498688775, (5, 'stuck'): 0.24519268153504145, (5, 'stuck_left'): 0.246064854354927, (5, 'stuck_right'): 0.2452609507148084, (10, 'elec_open'): 0.24805528959894926, (10, 'stuck'): 0.24831573141112775, (10, 'stuck_left'): 0.247827628595252, (10, 'stuck_right'): 0.24839388175218036}}
[33]:
# fig.savefig("drive_resilience_degradation.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

As shown, while there is some resilience early in the lifecycle (resulting in a small proportion of faults being recovered), this resilience goes away with degradation.

Human Degradation

We can also perform this assessment for the human error model, which is split up into two parts: - long term “degradation” of experience over months - short term “degradation” of stress and fatigue over a day

[34]:
psf_long = PSFDegradationLong()
endresults,  hist_psf_long = prop.nominal(psf_long)
[35]:
hist_psf_long.plot_line('s.experience')
[35]:
(<Figure size 300x200 with 1 Axes>,
 [<Axes: title={'center': 's.experience'}, xlabel='time'>])
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_50_1.png
[36]:
hist_psf_long.plot_line('s.experience')
[36]:
(<Figure size 300x200 with 1 Axes>,
 [<Axes: title={'center': 's.experience'}, xlabel='time'>])
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_51_1.png
[37]:
from examples.rover.rover_degradation import LongParams
pd_hl = ParameterDomain(LongParams)
pd_hl.add_variable("experience_param", var_lim=())
pd_hl
[37]:
ParameterDomain with:
 - variables: {'experience_param': ()}
 - constants: {}
 - parameter_initializer: LongParams
[38]:
pd_hl(10)
[38]:
LongParams(experience_param=10.0, training_frequency=8.0, experience_scale_max=10.0)
[39]:
ps_hl = ParameterSample(pd_hl)
xs = np.random.default_rng(seed=101).gamma(1,1.9,101)
# round so that dist is 0-10
xs = [min(x, 9.9) for x in xs]
weight = 1/len(xs)
for x in xs:
    ps_hl.add_variable_scenario(x, weight=weight)
ps_hl
[39]:
ParameterSample of scenarios:
 - var_0
 - var_1
 - var_2
 - var_3
 - var_4
 - var_5
 - var_6
 - var_7
 - var_8
 - var_9
 - ... (101 total)
[40]:
ec_psf_long, hist_psf_long= prop.parameter_sample(psf_long, ps_hl, run_stochastic=True)
SCENARIOS COMPLETE: 100%|██████████| 101/101 [00:00<00:00, 210.29it/s]
[41]:
hist_psf_long.plot_line('s.experience')
[41]:
(<Figure size 300x200 with 1 Axes>,
 [<Axes: title={'center': 's.experience'}, xlabel='time'>])
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_56_1.png
[42]:
fig, axs = hist_psf_long.plot_metric_dist([0, 40, 50, 60, 100], 's.experience', bins=20, alpha=0.5, figsize=(8,4))
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_57_0.png
[43]:
# fig.savefig("experience_degradation.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

Short-term degradation

[44]:
psf_short = PSFDegradationShort()
er, hist_short = prop.nominal(psf_short)
fig, axs = hist_short.plot_line('s.fatigue', 's.stress')
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_60_0.png

short-term degradation (over no external params)

[45]:
ps_psf_short = ParameterSample()
ps_psf_short.add_variable_replicates([], replicates=25)
ps_psf_short.scenarios()
[45]:
[ParameterScenario(sequence={}, times=(), p={}, r={'seed': 3285045779}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep0_var_0'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1542964779}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep1_var_1'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 155929569}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep2_var_2'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1001068241}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep3_var_3'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1154660988}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep4_var_4'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 505710824}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep5_var_5'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 56787704}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep6_var_6'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1421402450}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep7_var_7'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1924171662}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep8_var_8'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1927168098}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep9_var_9'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1046558955}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep10_var_10'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 2517908494}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep11_var_11'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1450249727}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep12_var_12'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 2439664966}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep13_var_13'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 4025176465}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep14_var_14'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1213330651}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep15_var_15'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1685855586}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep16_var_16'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 4230482484}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep17_var_17'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 3614657817}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep18_var_18'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1654294304}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep19_var_19'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 125061018}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep20_var_20'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 3883963532}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep21_var_21'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1640321439}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep22_var_22'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 3870496921}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep23_var_23'),
 ParameterScenario(sequence={}, times=(), p={}, r={'seed': 1172754840}, sp={}, prob=0.04, inputparams={}, rangeid='', name='rep24_var_24')]
[46]:
ec_psf_short, hist_psf_short = prop.parameter_sample(psf_short, ps_psf_short, run_stochastic=True)
fig, axs = hist_psf_short.plot_line('s.fatigue', 's.stress', 'r.s.fatigue_param', aggregation="percentile")
SCENARIOS COMPLETE: 100%|██████████| 25/25 [00:00<00:00, 558.95it/s]
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_63_1.png

short-term degradation over long-term params

[47]:
from examples.rover.rover_degradation import PSFShortParams
pd_short_long = ParameterDomain(PSFShortParams)
pd_short_long.add_variable("experience")
ps_short_long = ParameterHistSample(hist_psf_long, 's.experience', paramdomain=pd_short_long)
ps_short_long.add_hist_groups(reps= 10, ts = [0, 40, 50, 60, 100])

# note - need to add a way to combine replicates (seeds) over replicates (input times/groups/)
[48]:
pd_short_long(10)
[48]:
PSFShortParams(experience=10.0, stress_param=0.0, fatigue_param=1.0)
[49]:
ps_short_long.scenarios()
[49]:
[ParameterScenario(sequence={}, times=(), p={'experience': 0.0147852093576427}, r={'seed': 3467885988}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_0', 't': 0}, rangeid='', name='hist_0'),
 ParameterScenario(sequence={}, times=(), p={'experience': 4.355521540650882}, r={'seed': 3467885988}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_0', 't': 40}, rangeid='', name='hist_1'),
 ParameterScenario(sequence={}, times=(), p={'experience': 7.926159730949486}, r={'seed': 3467885988}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_0', 't': 50}, rangeid='', name='hist_2'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.498252713597697}, r={'seed': 3467885988}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_0', 't': 60}, rangeid='', name='hist_3'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.999122355752638}, r={'seed': 3467885988}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_0', 't': 100}, rangeid='', name='hist_4'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.003707397123126116}, r={'seed': 2004496604}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_1', 't': 0}, rangeid='', name='hist_5'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.6197044104299785}, r={'seed': 2004496604}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_1', 't': 40}, rangeid='', name='hist_6'),
 ParameterScenario(sequence={}, times=(), p={'experience': 4.890918517769909}, r={'seed': 2004496604}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_1', 't': 50}, rangeid='', name='hist_7'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.258304854924205}, r={'seed': 2004496604}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_1', 't': 60}, rangeid='', name='hist_8'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996496965739947}, r={'seed': 2004496604}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_1', 't': 100}, rangeid='', name='hist_9'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.0040328347821078905}, r={'seed': 1100168054}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_2', 't': 0}, rangeid='', name='hist_10'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.7372307652324728}, r={'seed': 1100168054}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_2', 't': 40}, rangeid='', name='hist_11'),
 ParameterScenario(sequence={}, times=(), p={'experience': 5.1013174827709795}, r={'seed': 1100168054}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_2', 't': 50}, rangeid='', name='hist_12'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.376073873906922}, r={'seed': 1100168054}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_2', 't': 60}, rangeid='', name='hist_13'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996779663860996}, r={'seed': 1100168054}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_2', 't': 100}, rangeid='', name='hist_14'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.004105645810848513}, r={'seed': 3138558212}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_3', 't': 0}, rangeid='', name='hist_15'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.7630764252943243}, r={'seed': 3138558212}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_3', 't': 40}, rangeid='', name='hist_16'),
 ParameterScenario(sequence={}, times=(), p={'experience': 5.1460417740129625}, r={'seed': 3138558212}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_3', 't': 50}, rangeid='', name='hist_17'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.40027584188355}, r={'seed': 3138558212}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_3', 't': 60}, rangeid='', name='hist_18'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996836779451714}, r={'seed': 3138558212}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_3', 't': 100}, rangeid='', name='hist_19'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.0037569908838189204}, r={'seed': 886760173}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_4', 't': 0}, rangeid='', name='hist_20'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.6378293230060559}, r={'seed': 886760173}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_4', 't': 40}, rangeid='', name='hist_21'),
 ParameterScenario(sequence={}, times=(), p={'experience': 4.924140166096661}, r={'seed': 886760173}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_4', 't': 50}, rangeid='', name='hist_22'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.277342402550868}, r={'seed': 886760173}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_4', 't': 60}, rangeid='', name='hist_23'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996543208332358}, r={'seed': 886760173}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_4', 't': 100}, rangeid='', name='hist_24'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.0035576861892378416}, r={'seed': 61537692}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_5', 't': 0}, rangeid='', name='hist_25'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.5645112885019485}, r={'seed': 61537692}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_5', 't': 40}, rangeid='', name='hist_26'),
 ParameterScenario(sequence={}, times=(), p={'experience': 4.7879419002260555}, r={'seed': 61537692}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_5', 't': 50}, rangeid='', name='hist_27'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.198196150411718}, r={'seed': 61537692}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_5', 't': 60}, rangeid='', name='hist_28'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996349553773157}, r={'seed': 61537692}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_5', 't': 100}, rangeid='', name='hist_29'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.006841983111062025}, r={'seed': 170932405}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_6', 't': 0}, rangeid='', name='hist_30'),
 ParameterScenario(sequence={}, times=(), p={'experience': 2.629719998704038}, r={'seed': 170932405}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_6', 't': 40}, rangeid='', name='hist_31'),
 ParameterScenario(sequence={}, times=(), p={'experience': 6.386297198063246}, r={'seed': 170932405}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_6', 't': 50}, rangeid='', name='hist_32'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.974697629346908}, r={'seed': 170932405}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_6', 't': 60}, rangeid='', name='hist_33'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.99810213629282}, r={'seed': 170932405}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_6', 't': 100}, rangeid='', name='hist_34'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.003743727872745982}, r={'seed': 2305383215}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_7', 't': 0}, rangeid='', name='hist_35'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.632989788946346}, r={'seed': 2305383215}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_7', 't': 40}, rangeid='', name='hist_36'),
 ParameterScenario(sequence={}, times=(), p={'experience': 4.915297962215212}, r={'seed': 2305383215}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_7', 't': 50}, rangeid='', name='hist_37'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.272292001415185}, r={'seed': 2305383215}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_7', 't': 60}, rangeid='', name='hist_38'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996530961505558}, r={'seed': 2305383215}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_7', 't': 100}, rangeid='', name='hist_39'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.014556312791561945}, r={'seed': 1153073133}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_8', 't': 0}, rangeid='', name='hist_40'),
 ParameterScenario(sequence={}, times=(), p={'experience': 4.317146303403044}, r={'seed': 1153073133}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_8', 't': 40}, rangeid='', name='hist_41'),
 ParameterScenario(sequence={}, times=(), p={'experience': 7.900357779757452}, r={'seed': 1153073133}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_8', 't': 50}, rangeid='', name='hist_42'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.490753491558548}, r={'seed': 1153073133}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_8', 't': 60}, rangeid='', name='hist_43'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.99910853568146}, r={'seed': 1153073133}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_8', 't': 100}, rangeid='', name='hist_44'),
 ParameterScenario(sequence={}, times=(), p={'experience': 0.003917700316414757}, r={'seed': 4153451606}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_9', 't': 0}, rangeid='', name='hist_45'),
 ParameterScenario(sequence={}, times=(), p={'experience': 1.6960297046671722}, r={'seed': 4153451606}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_9', 't': 40}, rangeid='', name='hist_46'),
 ParameterScenario(sequence={}, times=(), p={'experience': 5.028890434716651}, r={'seed': 4153451606}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_9', 't': 50}, rangeid='', name='hist_47'),
 ParameterScenario(sequence={}, times=(), p={'experience': 8.336273464537053}, r={'seed': 4153451606}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_9', 't': 60}, rangeid='', name='hist_48'),
 ParameterScenario(sequence={}, times=(), p={'experience': 9.996685016931059}, r={'seed': 4153451606}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'var_9', 't': 100}, rangeid='', name='hist_49')]
[50]:
ec, hist_short_long = prop.parameter_sample(psf_short, ps_short_long, run_stochastic=True)
SCENARIOS COMPLETE: 100%|██████████| 50/50 [00:00<00:00, 498.84it/s]
[51]:
fig, axs = hist_short_long.plot_line('s.fatigue', 's.stress', 'r.s.fatigue_param', aggregation="percentile")
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_69_0.png
[52]:
# fig.savefig("stress_degradation.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

Now sample in the model:

[53]:
from examples.rover.rover_model_human import RoverHuman, RoverHumanParam
pd_comb_mdl = ParameterDomain(RoverHumanParam)
# pd_comb_mdl.add_constant('drive_modes', {"mode_args": "degradation"})
pd_comb_mdl.add_variable("psfs.fatigue")
pd_comb_mdl.add_variables("psfs.stress")
rpd.add_constant('drive_modes', {"mode_args": "degradation"})
pd_comb_mdl(1,1)
[53]:
RoverHumanParam(ground=GroundParam(linetype='sine', amp=1.0, period=6.283185307179586, radius=20.0, x_start=10.0, y_end=10.0, x_min=0.0, x_max=30.0, x_res=0.1, path_buffer_on=0.2, path_buffer_poor=0.3, path_buffer_near=0.4, dest_buffer_on=1.0, dest_buffer_near=2.0), correction=ResCorrection(ub_f=10.0, lb_f=-1.0, ub_t=10.0, lb_t=0.0, ub_d=2.0, lb_d=-2.0, cor_d=0.0, cor_t=0.0, cor_f=0.0), degradation=DegParam(friction=0.0, drift=0.0), drive_modes={'mode_args': 'set'}, psfs=PSFParam(fatigue=1.0, stress=1.0))
[54]:
ps_comb_mdl = ParameterHistSample(hist_short_long, "s.fatigue", "s.stress", paramdomain=pd_comb_mdl)
ps_comb_mdl.add_hist_groups(reps= 10, ts = [0, 1, 3, 5, 6, 8])
ps_comb_mdl.scenarios()
[54]:
[ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.13875114452604548, 'stress': 0.0}}, r={'seed': 2449627439}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_0', 't': 0}, rangeid='', name='hist_0'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 1.6872879863352002, 'stress': 1.0}}, r={'seed': 2449627439}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_0', 't': 1}, rangeid='', name='hist_1'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.347118725164533, 'stress': 100.0}}, r={'seed': 2449627439}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_0', 't': 3}, rangeid='', name='hist_2'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 8.51570869416647, 'stress': 100.0}}, r={'seed': 2449627439}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_0', 't': 5}, rangeid='', name='hist_3'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 100.0}}, r={'seed': 2449627439}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_0', 't': 6}, rangeid='', name='hist_4'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 100.0}}, r={'seed': 2449627439}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_0', 't': 8}, rangeid='', name='hist_5'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.13875114452604548, 'stress': 0.0}}, r={'seed': 3860448276}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_1', 't': 0}, rangeid='', name='hist_6'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 1.6872879863352002, 'stress': 1.0}}, r={'seed': 3860448276}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_1', 't': 1}, rangeid='', name='hist_7'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.347118725164533, 'stress': 3.0}}, r={'seed': 3860448276}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_1', 't': 3}, rangeid='', name='hist_8'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 8.51570869416647, 'stress': 6.0}}, r={'seed': 3860448276}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_1', 't': 5}, rangeid='', name='hist_9'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 8.0}}, r={'seed': 3860448276}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_1', 't': 6}, rangeid='', name='hist_10'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 15.0}}, r={'seed': 3860448276}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_1', 't': 8}, rangeid='', name='hist_11'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.13875114452604548, 'stress': 0.0}}, r={'seed': 3342505869}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_2', 't': 0}, rangeid='', name='hist_12'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 1.6872879863352002, 'stress': 1.0}}, r={'seed': 3342505869}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_2', 't': 1}, rangeid='', name='hist_13'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.347118725164533, 'stress': 3.0}}, r={'seed': 3342505869}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_2', 't': 3}, rangeid='', name='hist_14'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 8.51570869416647, 'stress': 5.0}}, r={'seed': 3342505869}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_2', 't': 5}, rangeid='', name='hist_15'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 6.0}}, r={'seed': 3342505869}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_2', 't': 6}, rangeid='', name='hist_16'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 10.0}}, r={'seed': 3342505869}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_2', 't': 8}, rangeid='', name='hist_17'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.13875114452604548, 'stress': 0.0}}, r={'seed': 3046941470}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_3', 't': 0}, rangeid='', name='hist_18'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 1.6872879863352002, 'stress': 1.0}}, r={'seed': 3046941470}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_3', 't': 1}, rangeid='', name='hist_19'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.347118725164533, 'stress': 3.0}}, r={'seed': 3046941470}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_3', 't': 3}, rangeid='', name='hist_20'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 8.51570869416647, 'stress': 5.0}}, r={'seed': 3046941470}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_3', 't': 5}, rangeid='', name='hist_21'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 6.0}}, r={'seed': 3046941470}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_3', 't': 6}, rangeid='', name='hist_22'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 9.0}}, r={'seed': 3046941470}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_3', 't': 8}, rangeid='', name='hist_23'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.13875114452604548, 'stress': 0.0}}, r={'seed': 2304922095}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_4', 't': 0}, rangeid='', name='hist_24'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 1.6872879863352002, 'stress': 1.0}}, r={'seed': 2304922095}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_4', 't': 1}, rangeid='', name='hist_25'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.347118725164533, 'stress': 3.0}}, r={'seed': 2304922095}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_4', 't': 3}, rangeid='', name='hist_26'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 8.51570869416647, 'stress': 5.0}}, r={'seed': 2304922095}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_4', 't': 5}, rangeid='', name='hist_27'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 6.0}}, r={'seed': 2304922095}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_4', 't': 6}, rangeid='', name='hist_28'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 8.0}}, r={'seed': 2304922095}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_4', 't': 8}, rangeid='', name='hist_29'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.6871468344663529, 'stress': 0.0}}, r={'seed': 3110628389}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_5', 't': 0}, rangeid='', name='hist_30'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.9678132602873162, 'stress': 1.0}}, r={'seed': 3110628389}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_5', 't': 1}, rangeid='', name='hist_31'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.535991135698692, 'stress': 100.0}}, r={'seed': 3110628389}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_5', 't': 3}, rangeid='', name='hist_32'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 100.0}}, r={'seed': 3110628389}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_5', 't': 5}, rangeid='', name='hist_33'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 100.0}}, r={'seed': 3110628389}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_5', 't': 6}, rangeid='', name='hist_34'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 100.0}}, r={'seed': 3110628389}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_5', 't': 8}, rangeid='', name='hist_35'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.6871468344663529, 'stress': 0.0}}, r={'seed': 3540603870}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_6', 't': 0}, rangeid='', name='hist_36'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.9678132602873162, 'stress': 1.0}}, r={'seed': 3540603870}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_6', 't': 1}, rangeid='', name='hist_37'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.535991135698692, 'stress': 4.0}}, r={'seed': 3540603870}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_6', 't': 3}, rangeid='', name='hist_38'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 14.0}}, r={'seed': 3540603870}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_6', 't': 5}, rangeid='', name='hist_39'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 25.0}}, r={'seed': 3540603870}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_6', 't': 6}, rangeid='', name='hist_40'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 70.0}}, r={'seed': 3540603870}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_6', 't': 8}, rangeid='', name='hist_41'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.6871468344663529, 'stress': 0.0}}, r={'seed': 2144836773}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_7', 't': 0}, rangeid='', name='hist_42'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.9678132602873162, 'stress': 1.0}}, r={'seed': 2144836773}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_7', 't': 1}, rangeid='', name='hist_43'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.535991135698692, 'stress': 3.0}}, r={'seed': 2144836773}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_7', 't': 3}, rangeid='', name='hist_44'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 6.0}}, r={'seed': 2144836773}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_7', 't': 5}, rangeid='', name='hist_45'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 8.0}}, r={'seed': 2144836773}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_7', 't': 6}, rangeid='', name='hist_46'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 14.0}}, r={'seed': 2144836773}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_7', 't': 8}, rangeid='', name='hist_47'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.6871468344663529, 'stress': 0.0}}, r={'seed': 3685141643}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_8', 't': 0}, rangeid='', name='hist_48'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.9678132602873162, 'stress': 1.0}}, r={'seed': 3685141643}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_8', 't': 1}, rangeid='', name='hist_49'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.535991135698692, 'stress': 3.0}}, r={'seed': 3685141643}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_8', 't': 3}, rangeid='', name='hist_50'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 5.0}}, r={'seed': 3685141643}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_8', 't': 5}, rangeid='', name='hist_51'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 6.0}}, r={'seed': 3685141643}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_8', 't': 6}, rangeid='', name='hist_52'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 9.0}}, r={'seed': 3685141643}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_8', 't': 8}, rangeid='', name='hist_53'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.6871468344663529, 'stress': 0.0}}, r={'seed': 2794098631}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_9', 't': 0}, rangeid='', name='hist_54'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 0.9678132602873162, 'stress': 1.0}}, r={'seed': 2794098631}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_9', 't': 1}, rangeid='', name='hist_55'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 7.535991135698692, 'stress': 3.0}}, r={'seed': 2794098631}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_9', 't': 3}, rangeid='', name='hist_56'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 5.0}}, r={'seed': 2794098631}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_9', 't': 5}, rangeid='', name='hist_57'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 6.0}}, r={'seed': 2794098631}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_9', 't': 6}, rangeid='', name='hist_58'),
 ParameterScenario(sequence={}, times=(), p={'psfs': {'fatigue': 10.0, 'stress': 8.0}}, r={'seed': 2794098631}, sp={}, prob=1.0, inputparams={'comp_group': 'default', 'rep': 'hist_9', 't': 8}, rangeid='', name='hist_59')]
[55]:
mdl_hum = RoverHuman()
[56]:
ec, hist = prop.nominal(mdl_hum)
plot_map(mdl_hum, hist)
ec
[56]:
endclass:
--rate:                              1.0
--cost:                                0
--prob:                              1.0
--expected_cost:                       0
--in_bound:                         True
--at_finish:                        True
--line_dist:                           1
--num_modes:                           0
--end_dist:                          0.0
--tot_deviation:     0.11859644458085598
--faults:                             {}
--classification:        nominal mission
--end_x:              29.254775331608617
--end_y:             -0.7827640334587979
--endpt:                        array(2)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_75_1.png
[57]:
ec_comb, hist_comb = prop.parameter_sample(mdl_hum, ps_comb_mdl)
SCENARIOS COMPLETE: 100%|██████████| 60/60 [00:15<00:00,  3.98it/s]
[58]:
fig, ax = plot_map(mdl_hum, hist_comb)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_77_0.png
[59]:
hist_comb.plot_line('flows.psfs.s.attention', 'flows.motor_control.s.rpower', 'flows.motor_control.s.lpower')
[59]:
(<Figure size 600x400 with 4 Axes>,
 array([<Axes: title={'center': 'flows.psfs.s.attention'}, xlabel=' '>,
        <Axes: title={'center': 'flows.motor_control.s.rpower'}, xlabel='time'>,
        <Axes: title={'center': 'flows.motor_control.s.lpower'}, xlabel='time'>,
        <Axes: >], dtype=object))
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_78_1.png
[60]:
ne = NominalEnvelope(ps_comb_mdl, ec_comb, 'at_finish',
                     'p.psfs.fatigue', 'p.psfs.stress',
                     func=lambda x: x == True)
ne.plot_scatter()
[60]:
(<Figure size 600x400 with 1 Axes>,
 <Axes: xlabel='p.psfs.fatigue', ylabel='p.psfs.stress'>)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_79_1.png

(note, this is different in the turn case because of the long straightaway)

[61]:
mdl_hum = RoverHuman(p={'ground': {'linetype': 'turn'}})
ec, hist = prop.nominal(mdl_hum)
plot_map(mdl_hum, hist)
ec
[61]:
endclass:
--rate:                              1.0
--cost:                                0
--prob:                              1.0
--expected_cost:                       0
--in_bound:                         True
--at_finish:                        True
--line_dist:                           1
--num_modes:                           0
--end_dist:                          0.0
--tot_deviation:    0.005246344989065292
--faults:                             {}
--classification:        nominal mission
--end_x:              29.813614084369863
--end_y:               17.26588133276667
--endpt:                        array(2)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_81_1.png
[62]:
ec_comb, hist_comb = prop.parameter_sample(mdl_hum, ps_comb_mdl)
SCENARIOS COMPLETE: 100%|██████████| 60/60 [00:14<00:00,  4.00it/s]
[63]:
fig, ax = plot_map(mdl_hum, hist_comb)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_83_0.png
[64]:
hist_comb.plot_line('flows.psfs.s.attention', 'flows.motor_control.s.rpower', 'flows.motor_control.s.lpower')
[64]:
(<Figure size 600x400 with 4 Axes>,
 array([<Axes: title={'center': 'flows.psfs.s.attention'}, xlabel=' '>,
        <Axes: title={'center': 'flows.motor_control.s.rpower'}, xlabel='time'>,
        <Axes: title={'center': 'flows.motor_control.s.lpower'}, xlabel='time'>,
        <Axes: >], dtype=object))
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_84_1.png
[65]:
ne = NominalEnvelope(ps_comb_mdl, ec_comb, 'at_finish',
                     'p.psfs.fatigue', 'p.psfs.stress',
                     func=lambda x: x == True)
ne.plot_scatter()
[65]:
(<Figure size 600x400 with 1 Axes>,
 <Axes: xlabel='p.psfs.fatigue', ylabel='p.psfs.stress'>)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_85_1.png

We can thus see how degradation time effects this:

[66]:
ne = NominalEnvelope(ps_comb_mdl, ec_comb, 'at_finish',
                     'inputparams.t', 'inputparams.rep',
                     func=lambda x: x == True)
ne.plot_scatter()
[66]:
(<Figure size 600x400 with 1 Axes>,
 <Axes: xlabel='inputparams.t', ylabel='inputparams.rep'>)
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_87_1.png

To re-implement: - Need to be able to jointly plot/tabulate by single-day time + multi-day time - Combining approaches?

As for the human resilience:

[67]:
ec_nest, hist_nest, app_nest = prop.nested_sample(mdl, phs, faultdomains={'drive_faults':  (('all_fxnclass_modes', 'Drive'), {})},
                                                  faultsamples={'drive_faults': (('fault_phases', 'drive_faults', "start"), {})},
                                                  pool=mp.Pool(5))
NESTED SCENARIOS COMPLETE: 100%|██████████| 40/40 [00:12<00:00,  3.15it/s]
[68]:
nc = NestedComparison(ec_nest, phs, ['inputparams.t'], app_nest, ['fault'], metrics=['tot_deviation', 'end_dist'], default_stat=np.mean, ci_metrics=['end_dist', 'tot_deviation'])
[69]:
nc.sort_by_factor("fault")
nc.sort_by_factor("inputparams.t")
fig, ax = nc.as_plots('end_dist', 'tot_deviation', figsize=(8,4))
../../../_images/examples_rover_degradation_modelling_Degradation_Modelling_Notebook_92_0.png
[70]:
# fig.savefig("human_resilience_degradation.pdf", format="pdf", bbox_inches = 'tight', pad_inches = 0)

Combined Degradation

Idea: make same resilience plots as before but with degradation of resilience to drive faults at 0, 4, and 8 hours of fatigue.

Need method of doing this: - take params for one and replace with the other (kind of hacky and requires independence) - create composite of both? (how do you determine the merge between output params?) - use a combined method with both histories as input and sample over t_life and t_day (use this one)

[ ]:

Resilience assessment

[ ]: