example_vensim_lookup.py

  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()