Hi @christophercallahan your interpretation here is likely correct. That
complex result requires a complex argument generally comes from something like taking the square root of a of a negative, and to be more specific as you point out it often occurs in the discounting calculation in the
post_trial_function of the Monte Carlo Simulation, likely in the Ramsey discounting formula here:
df = [((cpc[year_index]/cpc[i])^dr.eta * 1/(1+dr.prtp)^(t-year) for (i,t) in enumerate(_model_years) if year<=t<=last_year)...]
Looking at that formula, and the fact you are adding a damage function and modifying the base GIVE model, I would presume something in your damage function might be causing (in extreme outlier cases, given as you say it only happens a few times 10k trials) consumption per capita to go negative, and thus
((cpc[year_index]/cpc[i]) becomes negative. The stack trace of your error should point to a line of code.
First off, you should feel free to use a seed (
Random.seed(1234) to run the same mcs every time, I recommend setting the seed right before
compute_scc. This is not completely fool proof over time, it can change in Julia versions or OS in some cases etc., but for a local machine it’s quite dependable.
In terms of debugging, one thing that’s worked for me in the past is as follows:
(1) Add a
domain_error_trialnums empty vector to the
payload (anywhere you create, load, or unload the payload you add this in).
(2) Add a
try ... catch block to the
df computation that does something like the following
df = try
[((cpc[year_index]/cpc[i])^dr.eta * 1/(1+dr.prtp)^(t-year) for (i,t) in enumerate(MimiGIVE._model_years) if year<=t<=last_year)...]
if isa(err, DomainError)
[(1. for (i,t) in enumerate(MimiGIVE._model_years) if year<=t<=last_year)...]
which basically just sets the
df to all ones (you could use anything you just want something that won’t break) and then adds the trial number to your list of errors.
(3) Additionally add some things to the
save_list like the
id, and perhaps consumption per capita, damages from sectors, etc. anything that will help you figure out what is causing consumption to drop. You can also exogenously set the
fair_parameter_set_ids to some random set, so that when you are done you will be able to recover the fair parameter set and the RFF-SPs id, which is often enough to recreate a model with that error.
For the sake of simplicity, I am going to move any further conversation about behavior of, and debugging of, MimiGIVE to an issue here: Complex Exponentiation Error in SCC Monte Carlo Calculation · Issue #21 · rffscghg/MimiGIVE.jl · GitHub since further discussion will likely be very model-specific. That said don’t hesitate to reach out about this I’m happy to help further, I’ve debugged this before and have some good insights on how to do it so you don’t have to reinvent the wheel