1"""
2Created on Oct 1, 2012
3
4This is a simple example of the lookup uncertainty provided for
5use in conjunction with vensim models. This example is largely based on
6`Eker et al. (2014) <https://onlinelibrary.wiley.com/doi/10.1002/sdr.1518/suppinfo>`_
7
8@author: sibeleker
9@author: jhkwakkel
10"""
11
12import matplotlib.pyplot as plt
13
14from ema_workbench import TimeSeriesOutcome, perform_experiments, ema_logging
15from ema_workbench.analysis import lines, Density
16from ema_workbench.connectors.vensim import LookupUncertainty, VensimModel
17
18
19class Burnout(VensimModel):
20 model_file = r"\BURNOUT.vpm"
21 outcomes = [
22 TimeSeriesOutcome("accomplishments_to_date", variable_name="Accomplishments to Date"),
23 TimeSeriesOutcome("energy_level", variable_name="Energy Level"),
24 TimeSeriesOutcome("hours_worked_per_week", variable_name="Hours Worked Per Week"),
25 TimeSeriesOutcome("accomplishments_per_hour", variable_name="accomplishments per hour"),
26 ]
27
28 def __init__(self, working_directory, name):
29 super().__init__(working_directory, name)
30
31 self.uncertainties = [
32 LookupUncertainty(
33 "hearne2",
34 [(-1, 3), (-2, 1), (0, 0.9), (0.1, 1), (0.99, 1.01), (0.99, 1.01)],
35 "accomplishments per hour lookup",
36 self,
37 0,
38 1,
39 ),
40 LookupUncertainty(
41 "hearne2",
42 [(-0.75, 0.75), (-0.75, 0.75), (0, 1.5), (0.1, 1.6), (-0.3, 1.5), (0.25, 2.5)],
43 "fractional change in expectations from perceived adequacy lookup",
44 self,
45 -1,
46 1,
47 ),
48 LookupUncertainty(
49 "hearne2",
50 [(-2, 2), (-1, 2), (0, 1.5), (0.1, 1.6), (0.5, 2), (0.5, 2)],
51 "effect of perceived adequacy on energy drain lookup",
52 self,
53 0,
54 10,
55 ),
56 LookupUncertainty(
57 "hearne2",
58 [(-2, 2), (-1, 2), (0, 1.5), (0.1, 1.6), (0.5, 1.5), (0.1, 2)],
59 "effect of perceived adequacy of hours worked lookup",
60 self,
61 0,
62 2.5,
63 ),
64 LookupUncertainty(
65 "hearne2",
66 [(-1, 1), (-1, 1), (0, 0.9), (0.1, 1), (0.5, 1.5), (1, 1.5)],
67 "effect of energy levels on hours worked lookup",
68 self,
69 0,
70 1.5,
71 ),
72 LookupUncertainty(
73 "hearne2",
74 [(-1, 1), (-1, 1), (0, 0.9), (0.1, 1), (0.5, 1.5), (1, 1.5)],
75 "effect of high energy on further recovery lookup",
76 self,
77 0,
78 1.25,
79 ),
80 LookupUncertainty(
81 "hearne2",
82 [(-2, 2), (-1, 1), (0, 100), (20, 120), (0.5, 1.5), (0.5, 2)],
83 "effect of hours worked on energy recovery lookup",
84 self,
85 0,
86 1.5,
87 ),
88 LookupUncertainty(
89 "approximation",
90 [(-0.5, 0.35), (3, 5), (1, 10), (0.2, 0.4), (0, 120)],
91 "effect of hours worked on energy drain lookup",
92 self,
93 0,
94 3,
95 ),
96 LookupUncertainty(
97 "hearne1",
98 [(0, 1), (0, 0.15), (1, 1.5), (0.75, 1.25)],
99 "effect of low energy on further depletion lookup",
100 self,
101 0,
102 1,
103 ),
104 ]
105
106 self._delete_lookup_uncertainties()
107
108
109if __name__ == "__main__":
110 ema_logging.log_to_stderr(ema_logging.INFO)
111 model = Burnout(r"./models/burnout", "burnout")
112
113 # run policy with old cases
114 results = perform_experiments(model, 100)
115 lines(results, "Energy Level", density=Density.BOXPLOT)
116 plt.show()