18#ifndef RCEATTLE_LINKAGE_HPP
19#define RCEATTLE_LINKAGE_HPP
22#define RCEATTLE_PROC_RECRUIT 0
23#define RCEATTLE_PROC_M 1
24#define RCEATTLE_PROC_GROWTH 2
25#define RCEATTLE_PROC_Q 3
26#define RCEATTLE_PROC_SEL 4
27#define RCEATTLE_PROC_COMP 5
31#define RCEATTLE_N_GROWTH_PARAMS 4
35#define RCEATTLE_N_REC_PARAMS 4
36#define RCEATTLE_REC_R0 0
37#define RCEATTLE_REC_ALPHA 1
38#define RCEATTLE_REC_BETA 2
39#define RCEATTLE_REC_R_INIT 3
42#define RCEATTLE_LINK_IDENTITY 0
43#define RCEATTLE_LINK_LOG 1
44#define RCEATTLE_LINK_LOGIT 2
45#define RCEATTLE_LINK_EXPONENTIAL 3
49#define RCEATTLE_RE_IID 0
50#define RCEATTLE_RE_RW 1
51#define RCEATTLE_RE_AR1 2
55#define RCEATTLE_SEL_SLP_ASC 0
56#define RCEATTLE_SEL_SLP_DESC 1
57#define RCEATTLE_SEL_INF_ASC 2
58#define RCEATTLE_SEL_INF_DESC 3
59#define RCEATTLE_SEL_COFF 4
60#define RCEATTLE_SEL_APICAL 5
61#define RCEATTLE_SEL_DN_PEAK 6
62#define RCEATTLE_SEL_TOP_LOGIT 7
63#define RCEATTLE_SEL_ASCEND_SE 8
64#define RCEATTLE_SEL_DESCEND_SE 9
65#define RCEATTLE_SEL_START_LOGIT 10
66#define RCEATTLE_SEL_END_LOGIT 11
69#define RCEATTLE_COMP_THETA_COMP 0
70#define RCEATTLE_COMP_THETA_CAAL 1
71#define RCEATTLE_COMP_THETA_DIET 2
83 lo = (
id == 0) ? 0 : (
id - 1);
84 hi = (
id == 0) ? n_levels : id;
85 if (hi > n_levels) hi = n_levels;
105 const matrix<Type>&
X;
137 array<Type>& growth_offset,
141 const vector<int>& nsex,
144 int n = lt.
beta.size();
147 int yr_hi = std::min(nyrs, (
int)lt.
X.rows());
149 for (
int i = 0; i < n; ++i) {
151 if (lt.
link(i) != link_code)
continue;
153 int param = lt.
param(i);
156 int xc = lt.
X_col(i);
162 for (
int sp = sp_lo; sp < sp_hi; ++sp) {
166 for (
int sx = sx_lo; sx < sx_hi; ++sx) {
167 for (
int yr = 0; yr < yr_hi; ++yr) {
168 growth_offset(sp, sx, yr, param) += b * lt.
X(yr, xc);
186 array<Type>& M_offset,
190 const vector<int>& nsex,
191 const vector<int>& nages,
194 int n = lt.
beta.size();
197 int yr_hi = std::min(nyrs, (
int)lt.
X.rows());
199 for (
int i = 0; i < n; ++i) {
201 if (lt.
link(i) != link_code)
continue;
203 int xc = lt.
X_col(i);
209 for (
int sp = sp_lo; sp < sp_hi; ++sp) {
210 int sx_lo, sx_hi, ab_lo, ab_hi;
214 for (
int sx = sx_lo; sx < sx_hi; ++sx) {
215 for (
int ab = ab_lo; ab < ab_hi; ++ab) {
216 for (
int yr = 0; yr < yr_hi; ++yr) {
217 M_offset(sp, sx, ab, yr) += b * lt.
X(yr, xc);
237 array<Type>& rec_offset,
243 int n = lt.
beta.size();
246 int yr_hi = std::min(nyrs, (
int)lt.
X.rows());
248 for (
int i = 0; i < n; ++i) {
250 if (lt.
link(i) != link_code)
continue;
252 int param = lt.
param(i);
255 int xc = lt.
X_col(i);
261 for (
int sp = sp_lo; sp < sp_hi; ++sp) {
262 for (
int yr = 0; yr < yr_hi; ++yr) {
263 rec_offset(sp, param, yr) += b * lt.
X(yr, xc);
281 matrix<Type>& q_offset,
287 int n = lt.
beta.size();
290 int yr_hi = std::min(nyrs, (
int)lt.
X.rows());
292 for (
int i = 0; i < n; ++i) {
294 if (lt.
link(i) != link_code)
continue;
296 int xc = lt.
X_col(i);
302 for (
int flt = fl_lo; flt < fl_hi; ++flt) {
303 for (
int yr = 0; yr < yr_hi; ++yr) {
304 q_offset(flt, yr) += b * lt.
X(yr, xc);
329 array<Type>& slp_offset,
330 array<Type>& inf_offset,
331 array<Type>& coff_offset,
332 array<Type>& apical_offset,
333 array<Type>& dn6_offset,
341 int n = lt.
beta.size();
344 int yr_hi = std::min(nyrs, (
int)lt.
X.rows());
346 for (
int i = 0; i < n; ++i) {
348 if (lt.
link(i) != link_code)
continue;
350 int param = lt.
param(i);
351 int xc = lt.
X_col(i);
354 int fl_lo, fl_hi, sx_lo, sx_hi;
358 for (
int flt = fl_lo; flt < fl_hi; ++flt) {
359 for (
int sx = sx_lo; sx < sx_hi; ++sx) {
360 for (
int yr = 0; yr < yr_hi; ++yr) {
361 Type v = b * lt.
X(yr, xc);
367 for (
int bin = 0; bin < n_sel_bins; ++bin) {
368 coff_offset(flt, sx, bin, yr) += v;
371 apical_offset(flt, sx, yr) += v;
391 for (
int s = 0; s < group_of_slot.size(); ++s)
if (group_of_slot(s) == grp) len++;
392 vector<int> slots(len);
394 for (
int s = 0; s < group_of_slot.size(); ++s)
if (group_of_slot(s) == grp) slots(j++) = s;
415 Type& nll, Type& nll_unweighted)
418 for (
int t = 1; t < re.size(); ++t) {
419 Type log_dens = dnorm(re(t) - re(t - 1), Type(0), sigma,
true);
421 nll_unweighted -= log_dens;
424 Type neg_log_dens = density::SCALE(density::AR1(rho), sigma)(re);
426 nll_unweighted += neg_log_dens;
428 Type log_dens = sum(dnorm(re, Type(0), sigma,
true));
430 nll_unweighted -= log_dens;
#define RCEATTLE_SEL_COFF
#define RCEATTLE_SEL_DN_PEAK
#define RCEATTLE_N_REC_PARAMS
#define RCEATTLE_SEL_APICAL
#define RCEATTLE_SEL_END_LOGIT
#define RCEATTLE_PROC_RECRUIT
void rceattle_apply_q_linkages(matrix< Type > &q_offset, int link_code, const LinkageTable< Type > <, int n_flt, int nyrs)
Add catchability offsets to q_offset[fleet, yr].
#define RCEATTLE_PROC_GROWTH
#define RCEATTLE_N_GROWTH_PARAMS
void rceattle_apply_sel_linkages(array< Type > &slp_offset, array< Type > &inf_offset, array< Type > &coff_offset, array< Type > &apical_offset, array< Type > &dn6_offset, int link_code, const LinkageTable< Type > <, int n_flt, int max_sex, int n_sel_bins, int nyrs)
Add selectivity offsets, by fleet, sex and year, to one of five arrays.
void rceattle_apply_recruitment_linkages(array< Type > &rec_offset, int link_code, const LinkageTable< Type > <, int nspp, int nyrs)
Add recruitment offsets to rec_offset[sp, param, yr].
void rceattle_stratum_range(int id, int n_levels, int &lo, int &hi)
Expand a stratum id into the loop range [lo, hi).
void rceattle_apply_growth_linkages(array< Type > &growth_offset, int link_code, const LinkageTable< Type > <, int nspp, const vector< int > &nsex, int nyrs)
Add growth offsets to growth_offset[sp, sex, yr, param].
#define RCEATTLE_SEL_SLP_ASC
void rceattle_re_group_nll(int structure, vector< Type > re, Type sigma, Type rho, Type &nll, Type &nll_unweighted)
Add the negative log density of one group's deviations to two accumulators.
void rceattle_apply_M_linkages(array< Type > &M_offset, int link_code, const LinkageTable< Type > <, int nspp, const vector< int > &nsex, const vector< int > &nages, int nyrs)
Add natural-mortality offsets to M_offset[sp, sex, age, yr].
#define RCEATTLE_SEL_INF_DESC
vector< int > rceattle_group_slots(const vector< int > &group_of_slot, int grp)
The random-effect slots of one group, in slot order, which is time order within a group (....
#define RCEATTLE_SEL_SLP_DESC
#define RCEATTLE_SEL_INF_ASC
#define RCEATTLE_PROC_SEL
The linkage table: one entry per row, and the shared design matrix.
const vector< int > & link
const vector< int > & process
const vector< int > & param
const vector< int > & age_bin
const vector< int > & X_col
const vector< int > & species
const vector< int > & sex
const vector< Type > & beta
const vector< int > & fleet