88FUNCTION void make_timevaryparm()
99 {
1010 dvariable baseparm;
11- double baseparm_min = -999.;
12- double baseparm_max = 999;
11+ baseparm_min = -999.; // fill array with default
12+ baseparm_max = 999; // fill array with default
1313 dvariable endtrend;
1414 dvariable infl_year;
1515 dvariable slope;
@@ -36,8 +36,8 @@ FUNCTION void make_timevaryparm()
3636 case 1: // MG
3737 {
3838 baseparm = MGparm(timevary_setup(2)); // index of base parm
39- baseparm_min = MGparm_LO(timevary_setup(2));
40- baseparm_max = MGparm_HI(timevary_setup(2));
39+ baseparm_min(tvary) = MGparm_LO(timevary_setup(2));
40+ baseparm_max(tvary) = MGparm_HI(timevary_setup(2));
4141 if (do_once == 1)
4242 echoinput << " base MGparm " << baseparm << endl;
4343 for (j = timevary_setup(3); j < timevary_def[tvary + 1](3); j++)
@@ -53,8 +53,8 @@ FUNCTION void make_timevaryparm()
5353 case 2: // SR
5454 {
5555 baseparm = SR_parm(timevary_setup(2)); // index of base parm
56- baseparm_min = SR_parm_LO(timevary_setup(2));
57- baseparm_max = SR_parm_HI(timevary_setup(2));
56+ baseparm_min(tvary) = SR_parm_LO(timevary_setup(2));
57+ baseparm_max(tvary) = SR_parm_HI(timevary_setup(2));
5858 if (do_once == 1)
5959 echoinput << " base SR_parm " << baseparm << endl;
6060 for (j = timevary_setup(3); j < timevary_def[tvary + 1](3); j++)
@@ -70,8 +70,8 @@ FUNCTION void make_timevaryparm()
7070 case 3: // Q
7171 {
7272 baseparm = Q_parm(timevary_setup(2)); // index of base parm
73- baseparm_min = Q_parm_LO(timevary_setup(2));
74- baseparm_max = Q_parm_HI(timevary_setup(2));
73+ baseparm_min(tvary) = Q_parm_LO(timevary_setup(2));
74+ baseparm_max(tvary) = Q_parm_HI(timevary_setup(2));
7575 if (do_once == 1)
7676 echoinput << " base Qparm " << baseparm << endl;
7777 for (j = timevary_setup(3); j < timevary_def[tvary + 1](3); j++)
@@ -87,8 +87,8 @@ FUNCTION void make_timevaryparm()
8787 case 5: // selex
8888 {
8989 baseparm = selparm(timevary_setup(2)); // index of base parm
90- baseparm_min = selparm_LO(timevary_setup(2));
91- baseparm_max = selparm_HI(timevary_setup(2));
90+ baseparm_min(tvary) = selparm_LO(timevary_setup(2));
91+ baseparm_max(tvary) = selparm_HI(timevary_setup(2));
9292 if (do_once == 1)
9393 echoinput << " base selparm " << baseparm << endl;
9494 for (j = timevary_setup(3); j < timevary_def[tvary + 1](3); j++)
@@ -160,9 +160,9 @@ FUNCTION void make_timevaryparm()
160160 echoinput << " logistic trend over time " << endl;
161161 if (timevary_setup(4) == -1) // use logistic transform to keep with bounds of the base parameter
162162 {
163- endtrend = log((baseparm_max - baseparm_min + 0.0000002) / (baseparm - baseparm_min + 0.0000001) - 1.) / (-2.); // transform the base parameter
163+ endtrend = log((baseparm_max(tvary) - baseparm_min(tvary) + 0.0000002) / (baseparm - baseparm_min(tvary) + 0.0000001) - 1.) / (-2.); // transform the base parameter
164164 endtrend += timevary_parm(timevary_parm_cnt); // add the offset Note that offset value is in the transform space
165- endtrend = baseparm_min + (baseparm_max - baseparm_min) / (1. + mfexp(-2. * endtrend)); // backtransform
165+ endtrend = baseparm_min(tvary) + (baseparm_max(tvary) - baseparm_min(tvary) ) / (1. + mfexp(-2. * endtrend)); // backtransform
166166 infl_year = log(0.5) / (-2.); // transform the base parameter
167167 infl_year += timevary_parm(timevary_parm_cnt + 1); // add the offset Note that offset value is in the transform space
168168 infl_year = r_years(styr) + (r_years(endyr) - r_years(styr)) / (1. + mfexp(-2. * infl_year)); // backtransform
@@ -174,7 +174,7 @@ FUNCTION void make_timevaryparm()
174174 }
175175 else if (timevary_setup(4) == -3) // use parm as fraction of way between bounds
176176 {
177- endtrend = baseparm_min + (baseparm_max - baseparm_min) * timevary_parm(timevary_parm_cnt);
177+ endtrend = baseparm_min(tvary) + (baseparm_max(tvary) - baseparm_min(tvary) ) * timevary_parm(timevary_parm_cnt);
178178 infl_year = r_years(styr) + (r_years(endyr) - r_years(styr)) * timevary_parm(timevary_parm_cnt + 1);
179179 }
180180 slope = timevary_parm(timevary_parm_cnt + 2);
@@ -197,7 +197,7 @@ FUNCTION void make_timevaryparm()
197197 parm_timevary(tvary, styr - 1) = baseparm;
198198 }
199199
200- if (timevary_setup(7) > 0) // env link
200+ if (timevary_setup(7) > 0) // env link (negative value indicates density-dependence which is calculated year-by-year in different function)
201201 {
202202 if (do_once == 1)
203203 echoinput << " env_link to env_variable: " << timevary_setup(7) << " using link_type " << timevary_setup(6) << endl;
@@ -224,13 +224,13 @@ FUNCTION void make_timevaryparm()
224224 case 3: // result constrained by baseparm_min-max; input values are unit normal
225225 {
226226 dvariable temp;
227- double p_range = baseparm_max - baseparm_min;
227+ double p_range = baseparm_max(tvary) - baseparm_min(tvary) ;
228228
229229 for (int y1 = env_data_minyr(timevary_setup(7)); y1 <= env_data_maxyr(timevary_setup(7)); y1++)
230230 {
231- temp = log((parm_timevary(tvary, y1) - baseparm_min + 1.0e-7) / (baseparm_max - parm_timevary(tvary, y1) + 1.0e-7));
231+ temp = log((parm_timevary(tvary, y1) - baseparm_min(tvary) + 1.0e-7) / (baseparm_max(tvary) - parm_timevary(tvary, y1) + 1.0e-7));
232232 temp += timevary_parm(timevary_parm_cnt) * env_data(y1, timevary_setup(7));
233- parm_timevary(tvary, y1) = baseparm_min + p_range / (1.0 + exp(-temp));
233+ parm_timevary(tvary, y1) = baseparm_min(tvary) + p_range / (1.0 + exp(-temp));
234234 }
235235 timevary_parm_cnt++;
236236 break;
@@ -255,7 +255,7 @@ FUNCTION void make_timevaryparm()
255255 echoinput << " dev vector #: " << k << endl;
256256 parm_dev_stddev(k) = timevary_parm(timevary_parm_cnt);
257257 parm_dev_rho(k) = timevary_parm(timevary_parm_cnt + 1);
258- int picker = timevary_setup(9);
258+ int picker = timevary_setup(9); // selects the method for creating time-vary parameter from dev vector
259259
260260 switch (picker)
261261 {
@@ -314,19 +314,19 @@ FUNCTION void make_timevaryparm()
314314 {
315315 // NOTE: if the stddev parameter is greater than 1.8, the distribution of adjusted parameters will become U-shaped
316316 dvariable temp;
317- double p_range = baseparm_max - baseparm_min;
317+ double p_range = baseparm_max(tvary) - baseparm_min(tvary) ;
318318 int j = timevary_setup(10);
319319 parm_dev_rwalk(k, j) = parm_dev(k, j) * parm_dev_stddev(k); // 1st yr dev
320- // p_base=(parm_timevary(tvary,j)-baseparm_min) /(baseparm_max-baseparm_min); // convert parm to (0,1) scale
320+ // p_base=(parm_timevary(tvary,j)-baseparm_min(tvary)) /(baseparm_max(tvary) -baseparm_min(tvary) ); // convert parm to (0,1) scale
321321 // temp= log(p_base/(1.-p_base)) + parm_dev_rwalk(k,j); // convert to logit and add dev; so dev must be in units of the logit
322- temp = log((parm_timevary(tvary, j) - baseparm_min + 1.0e-7) / (baseparm_max - parm_timevary(tvary, j) + 1.0e-7));
323- parm_timevary(tvary, j) = baseparm_min + p_range / (1.0 + exp(-temp - parm_dev_rwalk(k, j)));
322+ temp = log((parm_timevary(tvary, j) - baseparm_min(tvary) + 1.0e-7) / (baseparm_max(tvary) - parm_timevary(tvary, j) + 1.0e-7));
323+ parm_timevary(tvary, j) = baseparm_min(tvary) + p_range / (1.0 + exp(-temp - parm_dev_rwalk(k, j)));
324324 for (j = timevary_setup(10) + 1; j <= timevary_setup(11); j++)
325325 {
326326 // =(1-rho)*mean + rho*prevval + dev // where mean = 0.0
327327 parm_dev_rwalk(k, j) = parm_dev_rho(k) * parm_dev_rwalk(k, j - 1) + parm_dev(k, j) * parm_dev_stddev(k); // update MRRW using annual dev
328- temp = log((parm_timevary(tvary, j) - baseparm_min + 1.0e-7) / (baseparm_max - parm_timevary(tvary, j) + 1.0e-7));
329- parm_timevary(tvary, j) = baseparm_min + p_range / (1.0 + exp(-temp - parm_dev_rwalk(k, j)));
328+ temp = log((parm_timevary(tvary, j) - baseparm_min(tvary) + 1.0e-7) / (baseparm_max(tvary) - parm_timevary(tvary, j) + 1.0e-7));
329+ parm_timevary(tvary, j) = baseparm_min(tvary) + p_range / (1.0 + exp(-temp - parm_dev_rwalk(k, j)));
330330 }
331331 break;
332332 }
@@ -351,29 +351,36 @@ FUNCTION void make_densitydependent_parm(int const y1)
351351 timevary_setup(1, 13) = timevary_def[tvary](1, 13);
352352 if (timevary_setup(7) < 0) // density-dependent
353353 {
354+ int env_var = timevary_setup(7);
354355 timevary_parm_cnt = timevary_setup(3); // link parameter index
355356 if (do_once == 1)
356- echoinput << y1 << " density-dependent to env_variable: " << timevary_setup(7) << " using link_type " << timevary_setup(6) << " env: " << env_data(y1, timevary_setup(7)) << " parm: " << timevary_parm(timevary_parm_cnt) << endl;
357+ echoinput << y1 << " density-dependent to env_variable: " << env_var << " using link_type "
358+ << timevary_setup(6) << " env: " << env_data(y1, env_var) << " parm: " << timevary_parm(timevary_parm_cnt) << endl;
357359 switch (int(timevary_setup(6)))
358360 {
359361 case 1: // exponential env link
360362 {
361- parm_timevary(tvary, y1) *= mfexp(timevary_parm(timevary_parm_cnt) * ( env_data(y1, timevary_setup(7)) ));
363+ parm_timevary(tvary, y1) *= mfexp(timevary_parm(timevary_parm_cnt) * env_data(y1, env_var ));
362364 break ;
363365 }
364366 case 2: // linear env link
365367 {
366- parm_timevary(tvary, y1) += timevary_parm(timevary_parm_cnt) * env_data(y1, timevary_setup(7) );
368+ parm_timevary(tvary, y1) += timevary_parm(timevary_parm_cnt) * env_data(y1, env_var );
367369 break ;
368370 }
369- case 3:
371+ case 3: // result constrained by baseparm_min-max; input values are unit normal
370372 {
371- // not implemented
373+ dvariable temp;
374+ double p_range = baseparm_max(tvary) - baseparm_min(tvary);
375+ temp = log((parm_timevary(tvary, y1) - baseparm_min(tvary) + 1.0e-7) / (baseparm_max(tvary) - parm_timevary(tvary, y1) + 1.0e-7));
376+ temp += timevary_parm(timevary_parm_cnt) * env_data(y1, env_var);
377+ parm_timevary(tvary, y1) = baseparm_min(tvary) + p_range / (1.0 + exp(-temp));
378+ break ;
372379 }
373- case 4: // logistic MGparm env link
380+ case 4: // logistic env link
374381 {
375382 // first parm is offset ; second is slope
376- parm_timevary(tvary, y1) = 2.00000 / (1.00000 + mfexp(-timevary_parm(timevary_parm_cnt + 1) * (env_data(y1, timevary_setup(7) ) - timevary_parm(timevary_parm_cnt))));
383+ parm_timevary(tvary, y1) = 2.00000 / (1.00000 + mfexp(-timevary_parm(timevary_parm_cnt + 1) * (env_data(y1, env_var ) - timevary_parm(timevary_parm_cnt))));
377384 break ;
378385 }
379386 }
0 commit comments