public void Run(Clock clock, IUtilitarianWelfareState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { s.cummulativewelfare[t] = 0; } else { if (t >= s.starttimestep) { var w = s.cummulativewelfare[t - 1]; var U = Funcifier.Funcify( (double consumption) => { if (s.elasticityofmarginalutility == 1.0) { return(s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Log(consumption)); } else { return(s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Pow(consumption, 1.0 - s.elasticityofmarginalutility) / (1.0 - s.elasticityofmarginalutility)); } } ); var DF = Funcifier.Funcify( (Timestep year) => { return(Math.Pow(1.0 + s.prtp, -(year.Value - s.starttimestep.Value))); } ); foreach (var r in dimensions.GetValues <Region>()) { var perCapitaConsumption = s.consumption[t, r] / s.population[t, r]; // This is a lower bound if (perCapitaConsumption <= 0.0) { perCapitaConsumption = 1.0; } w = w + (s.welfareweight[t, r] * U(perCapitaConsumption) * s.population[t, r] * DF(t)); s.marginalwelfare[t, r] = DF(t) * s.welfareweight[t, r] * s.utilitycalibrationmultiplicative / Math.Pow(perCapitaConsumption, s.elasticityofmarginalutility); } s.cummulativewelfare[t] = w; if (t == s.stoptimestep) { s.totalwelfare = s.cummulativewelfare[t]; } } else { s.cummulativewelfare[t] = 0; } } }
public void Run(Clock clock, IUtilitarianWelfareState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { s.cummulativewelfare[t] = 0; } else { if (t >= s.starttimestep) { var w = s.cummulativewelfare[t - 1]; var U = Funcifier.Funcify( (double consumption) => { if (s.elasticityofmarginalutility == 1.0) return s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Log(consumption); else return s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Pow(consumption, 1.0 - s.elasticityofmarginalutility) / (1.0 - s.elasticityofmarginalutility); } ); var DF = Funcifier.Funcify( (Timestep year) => { return Math.Pow(1.0 + s.prtp, -(year.Value - s.starttimestep.Value)); } ); foreach (var r in dimensions.GetValues<Region>()) { var perCapitaConsumption = s.consumption[t, r] / s.population[t, r]; // This is a lower bound if (perCapitaConsumption <= 0.0) perCapitaConsumption = 1.0; w = w + (s.welfareweight[t, r] * U(perCapitaConsumption) * s.population[t, r] * DF(t)); s.marginalwelfare[t, r] = DF(t) * s.welfareweight[t, r] * s.utilitycalibrationmultiplicative / Math.Pow(perCapitaConsumption, s.elasticityofmarginalutility); } s.cummulativewelfare[t] = w; if (t == s.stoptimestep) s.totalwelfare = s.cummulativewelfare[t]; } else s.cummulativewelfare[t] = 0; } }