R/bage_prior-methods.R

Defines functions values_known.bage_prior_known values_known uses_offset_effectfree_effect.bage_prior_svd_rw2zero uses_offset_effectfree_effect.bage_prior_svd_rw2random uses_offset_effectfree_effect.bage_prior_svd_rwzero uses_offset_effectfree_effect.bage_prior_svd_rwrandom uses_offset_effectfree_effect.bage_prior_svd_ar uses_offset_effectfree_effect.bage_prior_svd uses_offset_effectfree_effect.bage_prior uses_offset_effectfree_effect uses_matrix_effectfree_effect.bage_prior_svd_rw2zero uses_matrix_effectfree_effect.bage_prior_svd_rw2random uses_matrix_effectfree_effect.bage_prior_svd_rwzero uses_matrix_effectfree_effect.bage_prior_svd_rwrandom uses_matrix_effectfree_effect.bage_prior_svd_ar uses_matrix_effectfree_effect.bage_prior_svd uses_matrix_effectfree_effect.bage_prior_spline uses_matrix_effectfree_effect.bage_prior_rw2zeroseasvary uses_matrix_effectfree_effect.bage_prior_rw2zeroseasfix uses_matrix_effectfree_effect.bage_prior_rw2zero uses_matrix_effectfree_effect.bage_prior_rw2randomseasvary uses_matrix_effectfree_effect.bage_prior_rw2randomseasfix uses_matrix_effectfree_effect.bage_prior_rw2random uses_matrix_effectfree_effect.bage_prior_rw2infant uses_matrix_effectfree_effect.bage_prior_rwzeroseasvary uses_matrix_effectfree_effect.bage_prior_rwzeroseasfix uses_matrix_effectfree_effect.bage_prior_rwzero uses_matrix_effectfree_effect.bage_prior_rwrandomseasvary uses_matrix_effectfree_effect.bage_prior_rwrandomseasfix uses_matrix_effectfree_effect.bage_prior_rwrandom uses_matrix_effectfree_effect.bage_prior_linex uses_matrix_effectfree_effect.bage_prior_linar uses_matrix_effectfree_effect.bage_prior_lin uses_matrix_effectfree_effect.bage_prior uses_matrix_effectfree_effect uses_hyperrandfree.bage_prior_rw2zeroseasvary uses_hyperrandfree.bage_prior_rw2zeroseasfix uses_hyperrandfree.bage_prior_rw2randomseasvary uses_hyperrandfree.bage_prior_rw2randomseasfix uses_hyperrandfree.bage_prior_rwzeroseasvary uses_hyperrandfree.bage_prior_rwzeroseasfix uses_hyperrandfree.bage_prior_rwrandomseasvary uses_hyperrandfree.bage_prior_rwrandomseasfix uses_hyperrandfree.bage_prior_linar uses_hyperrandfree.bage_prior_lin uses_hyperrandfree.bage_prior uses_hyperrandfree uses_along.bage_prior_svd_rw2zero uses_along.bage_prior_svd_rw2random uses_along.bage_prior_svd_rwzero make_matrix_along_by_effectfree.bage_prior make_matrix_along_by_effectfree make_i_along.bage_prior_svd_rw2zero make_i_along.bage_prior_svd_rw2random make_i_along.bage_prior_svd_rwzero make_i_along.bage_prior_svd_rwrandom make_i_along.bage_prior_svd_ar make_i_along.bage_prior_spline make_i_along.bage_prior_rw2zeroseasvary make_i_along.bage_prior_rw2zeroseasfix make_i_along.bage_prior_rw2zero make_i_along.bage_prior_rw2randomseasvary make_i_along.bage_prior_rw2randomseasfix make_i_along.bage_prior_rw2random make_i_along.bage_prior_rw2infant make_i_along.bage_prior_rwzeroseasvary make_i_along.bage_prior_rwzeroseasfix make_i_along.bage_prior_rwzero make_i_along.bage_prior_rwrandomseasvary make_i_along.bage_prior_rwrandomseasfix make_i_along.bage_prior_rwrandom make_i_along.bage_prior_linex make_i_along.bage_prior_linar make_i_along.bage_prior_lin make_i_along.bage_prior_ar make_i_along.bage_prior make_i_along make_hyperrand_one.bage_prior_rw2zeroseasvary make_hyperrand_one.bage_prior_rw2zeroseasfix make_hyperrand_one.bage_prior_rw2randomseasvary make_hyperrand_one.bage_prior_rw2randomseasfix make_hyperrand_one.bage_prior_rwzeroseasvary make_hyperrand_one.bage_prior_rwzeroseasfix make_hyperrand_one.bage_prior_rwrandomseasvary make_hyperrand_one.bage_prior_rwrandomseasfix make_hyperrand_one.bage_prior_linar make_hyperrand_one.bage_prior_lin make_hyperrand_one.bage_prior make_hyperrand_one levels_hyperrand.bage_prior_rw2zeroseasvary levels_hyperrand.bage_prior_rw2zeroseasfix levels_hyperrand.bage_prior_rw2randomseasvary levels_hyperrand.bage_prior_rw2randomseasfix levels_hyperrand.bage_prior_rwzeroseasvary levels_hyperrand.bage_prior_rwzeroseasfix levels_hyperrand.bage_prior_rwrandomseasvary levels_hyperrand.bage_prior_rwrandomseasfix levels_hyperrand.bage_prior_linar levels_hyperrand.bage_prior_lin levels_hyperrand.bage_prior levels_hyperrand levels_hyper.bage_prior_svd_rw2zero levels_hyper.bage_prior_svd_rw2random levels_hyper.bage_prior_svd_rwzero levels_hyper.bage_prior_svd_rwrandom levels_hyper.bage_prior_svd_ar levels_hyper.bage_prior_svd levels_hyper.bage_prior_spline levels_hyper.bage_prior_rw2zeroseasvary levels_hyper.bage_prior_rw2zeroseasfix levels_hyper.bage_prior_rw2zero levels_hyper.bage_prior_rw2randomseasvary levels_hyper.bage_prior_rw2randomseasfix levels_hyper.bage_prior_rw2random levels_hyper.bage_prior_rw2infant levels_hyper.bage_prior_rwzeroseasvary levels_hyper.bage_prior_rwzeroseasfix levels_hyper.bage_prior_rwzero levels_hyper.bage_prior_rwrandomseasvary levels_hyper.bage_prior_rwrandomseasfix levels_hyper.bage_prior_rwrandom levels_hyper.bage_prior_normfixed levels_hyper.bage_prior_norm levels_hyper.bage_prior_linex levels_hyper.bage_prior_linar levels_hyper.bage_prior_lin levels_hyper.bage_prior_known levels_hyper.bage_prior_ar levels_hyper length_hyperrandfree.bage_prior_rw2zeroseasvary length_hyperrandfree.bage_prior_rw2zeroseasfix length_hyperrandfree.bage_prior_rw2randomseasvary length_hyperrandfree.bage_prior_rw2randomseasfix length_hyperrandfree.bage_prior_rwzeroseasvary length_hyperrandfree.bage_prior_rwzeroseasfix length_hyperrandfree.bage_prior_rwrandomseasvary length_hyperrandfree.bage_prior_rwrandomseasfix length_hyperrandfree.bage_prior_linar length_hyperrandfree.bage_prior_lin length_hyperrandfree.bage_prior length_hyperrandfree is_svd.bage_prior_svd_rw2zero is_svd.bage_prior_svd_rw2random is_svd.bage_prior_svd_rwzero is_svd.bage_prior_svd_rwrandom is_svd.bage_prior_svd_ar is_svd.bage_prior_svd is_svd.bage_prior is_svd is_spline.bage_prior_spline is_spline.bage_prior is_spline is_prior_ok_for_term.bage_prior_svd_rw2zero is_prior_ok_for_term.bage_prior_svd_rw2random is_prior_ok_for_term.bage_prior_svd_rwzero is_prior_ok_for_term.bage_prior_svd_rwrandom is_prior_ok_for_term.bage_prior_svd_ar is_prior_ok_for_term.bage_prior_svd is_prior_ok_for_term.bage_prior_spline is_prior_ok_for_term.bage_prior_rw2zeroseasvary is_prior_ok_for_term.bage_prior_rw2zeroseasfix is_prior_ok_for_term.bage_prior_rw2zero is_prior_ok_for_term.bage_prior_rw2randomseasvary is_prior_ok_for_term.bage_prior_rw2randomseasfix is_prior_ok_for_term.bage_prior_rw2random is_prior_ok_for_term.bage_prior_rw2infant is_prior_ok_for_term.bage_prior_rwzeroseasvary is_prior_ok_for_term.bage_prior_rwzeroseasfix is_prior_ok_for_term.bage_prior_rwzero is_prior_ok_for_term.bage_prior_rwrandomseasvary is_prior_ok_for_term.bage_prior_rwrandomseasfix is_prior_ok_for_term.bage_prior_rwrandom is_prior_ok_for_term.bage_prior_normfixed is_prior_ok_for_term.bage_prior_norm is_prior_ok_for_term.bage_prior_linex is_prior_ok_for_term.bage_prior_linar is_prior_ok_for_term.bage_prior_lin is_prior_ok_for_term.bage_prior_known is_prior_ok_for_term.bage_prior_ar is_prior_ok_for_term is_known.bage_prior_known is_known.bage_prior is_known infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2zeroseasvary infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2zeroseasfix infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2randomseasva infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2randomseasfi infer_trend_cyc_seas_err_forecast_one.bage_prior_rwzeroseasvary infer_trend_cyc_seas_err_forecast_one.bage_prior_rwzeroseasfix infer_trend_cyc_seas_err_forecast_one.bage_prior_rwrandomseasvar infer_trend_cyc_seas_err_forecast_one.bage_prior_rwrandomseasfix infer_trend_cyc_seas_err_forecast_one.bage_prior_linar infer_trend_cyc_seas_err_forecast_one.bage_prior infer_trend_cyc_seas_err_forecast_one has_hyperrandfree.bage_prior_rw2zeroseasvary has_hyperrandfree.bage_prior_rw2zeroseasfix has_hyperrandfree.bage_prior_rw2randomseasvary has_hyperrandfree.bage_prior_rw2randomseasfix has_hyperrandfree.bage_prior_rwzeroseasvary has_hyperrandfree.bage_prior_rwzeroseasfix has_hyperrandfree.bage_prior_rwrandomseasvary has_hyperrandfree.bage_prior_rwrandomseasfix has_hyperrandfree.bage_prior_linar has_hyperrandfree.bage_prior_lin has_hyperrandfree.bage_prior has_hyperrandfree generate.bage_prior_svd_rw2zero generate.bage_prior_svd_rw2random generate.bage_prior_svd_rwzero generate.bage_prior_svd_rwrandom generate.bage_prior_svd_ar generate.bage_prior_svd generate.bage_prior_spline generate.bage_prior_rw2zeroseasvary generate.bage_prior_rw2zeroseasfix generate.bage_prior_rw2zero generate.bage_prior_rw2randomseasvary generate.bage_prior_rw2randomseasfix generate.bage_prior_rw2random generate.bage_prior_rwzeroseasvary generate.bage_prior_rwzeroseasfix generate.bage_prior_rwzero generate.bage_prior_rwrandomseasvary generate.bage_prior_rwrandomseasfix generate.bage_prior_rwrandom generate.bage_prior_normfixed generate.bage_prior_norm generate.bage_prior_linex generate.bage_prior_linar generate.bage_prior_lin generate.bage_prior_known generate.bage_prior_ar forecast_term.bage_prior_svd_rw2zero forecast_term.bage_prior_svd_rw2random forecast_term.bage_prior_svd_rwzero forecast_term.bage_prior_svd_rwrandom forecast_term.bage_prior_svd_ar forecast_term.bage_prior_rw2zeroseasvary forecast_term.bage_prior_rw2zeroseasfix forecast_term.bage_prior_rw2zero forecast_term.bage_prior_rw2randomseasvary draw_vals_svd.bage_prior_svd_rwrandom draw_vals_svd.bage_prior_svd_ar draw_vals_svd.bage_prior_svd draw_vals_svd.bage_prior draw_vals_svd draw_vals_spline.bage_prior_spline draw_vals_spline.bage_prior draw_vals_spline draw_vals_hyperrand.bage_prior_rw2zeroseasvary draw_vals_hyperrand.bage_prior_rw2zeroseasfix draw_vals_hyperrand.bage_prior_rw2randomseasvary draw_vals_hyperrand.bage_prior_rw2randomseasfix draw_vals_hyperrand.bage_prior_rwzeroseasvary draw_vals_hyperrand.bage_prior_rwzeroseasfix draw_vals_hyperrand.bage_prior_rwrandomseasvary draw_vals_hyperrand.bage_prior_rwrandomseasfix draw_vals_hyperrand.bage_prior_linar draw_vals_hyperrand.bage_prior_lin draw_vals_hyperrand.bage_prior draw_vals_hyperrand draw_vals_hyper.bage_prior_svd_rw2zero draw_vals_hyper.bage_prior_svd_rw2random draw_vals_hyper.bage_prior_svd_rwzero draw_vals_hyper.bage_prior_svd_rwrandom draw_vals_hyper.bage_prior_svd_ar draw_vals_hyper.bage_prior_svd draw_vals_hyper.bage_prior_spline draw_vals_hyper.bage_prior_rw2zeroseasvary draw_vals_hyper.bage_prior_rw2zeroseasfix draw_vals_hyper.bage_prior_rw2zero draw_vals_hyper.bage_prior_rw2randomseasvary draw_vals_hyper.bage_prior_rw2randomseasfix draw_vals_hyper.bage_prior_rw2random draw_vals_hyper.bage_prior_rw2infant draw_vals_hyper.bage_prior_rwzeroseasvary draw_vals_hyper.bage_prior_rwzeroseasfix draw_vals_hyper.bage_prior_rwzero draw_vals_hyper.bage_prior_rwrandomseasvary draw_vals_hyper.bage_prior_rwrandomseasfix draw_vals_hyper.bage_prior_rwrandom draw_vals_hyper.bage_prior_normfixed draw_vals_hyper.bage_prior_norm draw_vals_hyper.bage_prior_linar draw_vals_hyper.bage_prior_lin draw_vals_hyper.bage_prior_known draw_vals_hyper.bage_prior_ar draw_vals_hyper uses_along.bage_prior_svd_rwrandom uses_along.bage_prior_svd_ar uses_along.bage_prior_svd uses_along.bage_prior_spline uses_along.bage_prior_rw2zeroseasvary uses_along.bage_prior_rw2zeroseasfix uses_along.bage_prior_rw2zero uses_along.bage_prior_rw2randomseasvary uses_along.bage_prior_rw2randomseasfix uses_along.bage_prior_rw2random uses_along.bage_prior_rw2infant uses_along.bage_prior_rwzeroseasvary uses_along.bage_prior_rwzeroseasfix uses_along.bage_prior_rwzero uses_along.bage_prior_rwrandomseasvary uses_along.bage_prior_rwrandomseasfix uses_along.bage_prior_rwrandom uses_along.bage_prior_normfixed uses_along.bage_prior_norm uses_along.bage_prior_linex uses_along.bage_prior_linar uses_along.bage_prior_lin uses_along.bage_prior_known uses_along.bage_prior_ar uses_along transform_hyper.bage_prior_svd_rw2zero transform_hyper.bage_prior_svd_rw2random transform_hyper.bage_prior_svd_rwzero transform_hyper.bage_prior_svd_rwrandom transform_hyper.bage_prior_svd_ar transform_hyper.bage_prior_svd transform_hyper.bage_prior_spline transform_hyper.bage_prior_rw2zeroseasvary transform_hyper.bage_prior_rw2zeroseasfix transform_hyper.bage_prior_rw2zero transform_hyper.bage_prior_rw2randomseasvary transform_hyper.bage_prior_rw2randomseasfix transform_hyper.bage_prior_rw2random transform_hyper.bage_prior_rw2infant transform_hyper.bage_prior_rwzeroseasvary transform_hyper.bage_prior_rwzeroseasfix transform_hyper.bage_prior_rwzero transform_hyper.bage_prior_rwrandomseasvary transform_hyper.bage_prior_rwrandomseasfix transform_hyper.bage_prior_rwrandom transform_hyper.bage_prior_normfixed transform_hyper.bage_prior_norm transform_hyper.bage_prior_linex transform_hyper.bage_prior_linar transform_hyper.bage_prior_lin transform_hyper.bage_prior_known transform_hyper.bage_prior_ar transform_hyper str_nm_prior.bage_prior_svd_rw2zero str_nm_prior.bage_prior_svd_rw2random str_nm_prior.bage_prior_svd_rwzero str_nm_prior.bage_prior_svd_rwrandom str_nm_prior.bage_prior_svd_ar str_nm_prior.bage_prior_svd str_nm_prior.bage_prior_spline str_nm_prior.bage_prior_rw2zeroseasvary str_nm_prior.bage_prior_rw2zeroseasfix str_nm_prior.bage_prior_rw2zero str_nm_prior.bage_prior_rw2randomseasvary str_nm_prior.bage_prior_rw2randomseasfix str_nm_prior.bage_prior_rw2random str_nm_prior.bage_prior_rw2infant str_nm_prior.bage_prior_rwzeroseasvary str_nm_prior.bage_prior_rwzeroseasfix str_nm_prior.bage_prior_rwzero str_nm_prior.bage_prior_rwrandomseasvary str_nm_prior.bage_prior_rwrandomseasfix str_nm_prior.bage_prior_rwrandom str_nm_prior.bage_prior_normfixed str_nm_prior.bage_prior_norm str_nm_prior.bage_prior_linex str_nm_prior.bage_prior_linar str_nm_prior.bage_prior_lin str_nm_prior.bage_prior_known str_nm_prior.bage_prior_ar str_nm_prior str_call_prior.bage_prior_svd_rw2zero str_call_prior.bage_prior_svd_rw2random str_call_prior.bage_prior_svd_rwzero str_call_prior.bage_prior_svd_rwrandom str_call_prior.bage_prior_svd_ar str_call_prior.bage_prior_svd str_call_prior.bage_prior_spline str_call_prior.bage_prior_rw2zeroseasvary str_call_prior.bage_prior_rw2zeroseasfix str_call_prior.bage_prior_rw2zero str_call_prior.bage_prior_rw2randomseasvary str_call_prior.bage_prior_rw2randomseasfix str_call_prior.bage_prior_rw2random str_call_prior.bage_prior_rw2infant str_call_prior.bage_prior_rwzeroseasvary str_call_prior.bage_prior_rwzeroseasfix str_call_prior.bage_prior_rwzero str_call_prior.bage_prior_rwrandomseasvary str_call_prior.bage_prior_rwrandomseasfix str_call_prior.bage_prior_rwrandom str_call_prior.bage_prior_normfixed str_call_prior.bage_prior_norm str_call_prior.bage_prior_linex str_call_prior.bage_prior_linar str_call_prior.bage_prior_lin str_call_prior.bage_prior_known str_call_prior.bage_prior_ar str_call_prior print.bage_prior_svd_rw2zero print.bage_prior_svd_rw2random print.bage_prior_svd_rwzero print.bage_prior_svd_rwrandom print.bage_prior_svd_ar print.bage_prior_svd print.bage_prior_spline print.bage_prior_rw2zeroseasvary print.bage_prior_rw2zeroseasfix print.bage_prior_rw2zeroseasfix print.bage_prior_rw2zero print.bage_prior_rw2randomseasvary print.bage_prior_rw2randomseasfix print.bage_prior_rw2random print.bage_prior_rw2infant print.bage_prior_rwzeroseasvary print.bage_prior_rwzeroseasfix print.bage_prior_rwzero print.bage_prior_rwrandomseasvary print.bage_prior_rwrandomseasfix print.bage_prior_rwrandom print.bage_prior_normfixed print.bage_prior_norm print.bage_prior_linex print.bage_prior_linar print.bage_prior_lin print.bage_prior_known print.bage_prior_ar make_offset_effectfree_effect.bage_prior_svd_rw2zero make_offset_effectfree_effect.bage_prior_svd_rw2random make_offset_effectfree_effect.bage_prior_svd_rw2random make_offset_effectfree_effect.bage_prior_svd_rwzero make_offset_effectfree_effect.bage_prior_svd_rwrandom make_offset_effectfree_effect.bage_prior_svd_ar make_offset_effectfree_effect.bage_prior_svd make_offset_effectfree_effect.bage_prior make_offset_effectfree_effect make_matrix_sub_orig.bage_prior_svd_rw2zero make_matrix_sub_orig.bage_prior_svd_rw2random make_matrix_sub_orig.bage_prior_svd_rwzero make_matrix_sub_orig.bage_prior_svd_rwrandom make_matrix_sub_orig.bage_prior_svd_ar make_matrix_sub_orig.bage_prior_svd make_matrix_sub_orig.bage_prior_spline make_matrix_sub_orig.bage_prior make_matrix_sub_orig make_matrix_effectfree_effect.bage_prior_svd_rw2zero make_matrix_effectfree_effect.bage_prior_svd_rw2random make_matrix_effectfree_effect.bage_prior_svd_rwzero make_matrix_effectfree_effect.bage_prior_svd_rwrandom make_matrix_effectfree_effect.bage_prior_svd_ar make_matrix_effectfree_effect.bage_prior_svd make_matrix_effectfree_effect.bage_prior_spline make_matrix_effectfree_effect.bage_prior_rw2zeroseasvary make_matrix_effectfree_effect.bage_prior_rw2zeroseasfix make_matrix_effectfree_effect.bage_prior_rw2zero make_matrix_effectfree_effect.bage_prior_rw2randomseasvary make_matrix_effectfree_effect.bage_prior_rw2randomseasfix make_matrix_effectfree_effect.bage_prior_rw2random make_matrix_effectfree_effect.bage_prior_rw2infant make_matrix_effectfree_effect.bage_prior_rwzeroseasvary make_matrix_effectfree_effect.bage_prior_rwzeroseasfix make_matrix_effectfree_effect.bage_prior_rwzero make_matrix_effectfree_effect.bage_prior_rwrandomseasvary make_matrix_effectfree_effect.bage_prior_rwrandomseasfix make_matrix_effectfree_effect.bage_prior_rwrandom make_matrix_effectfree_effect.bage_prior_linex make_matrix_effectfree_effect.bage_prior_linar make_matrix_effectfree_effect.bage_prior_lin make_matrix_effectfree_effect.bage_prior_ar make_matrix_effectfree_effect.bage_prior make_matrix_effectfree_effect make_matrix_draws_svd.bage_prior_svd_rw2zero make_matrix_draws_svd.bage_prior_svd_rw2random make_matrix_draws_svd.bage_prior_svd_rwzero make_matrix_draws_svd.bage_prior_svd_rwrandom make_matrix_draws_svd.bage_prior_svd_ar make_matrix_draws_svd.bage_prior_svd make_matrix_draws_svd.bage_prior make_matrix_draws_svd make_matrix_along_by_effectfree_innermost.bage_prior_svd_rw2zero make_matrix_along_by_effectfree_innermost.bage_prior_svd_rw2rand make_matrix_along_by_effectfree_innermost.bage_prior_svd_rwzero make_matrix_along_by_effectfree_innermost.bage_prior_svd_rwrando make_matrix_along_by_effectfree_innermost.bage_prior_svd_ar make_matrix_along_by_effectfree_innermost.bage_prior_svd make_matrix_along_by_effectfree_innermost.bage_prior_spline make_matrix_along_by_effectfree_innermost.bage_prior make_matrix_along_by_effectfree_innermost make_matrix_along_by_effectfree.bage_prior_svd_rw2zero make_matrix_along_by_effectfree.bage_prior_svd_rw2random make_matrix_along_by_effectfree.bage_prior_svd_rwzero make_matrix_along_by_effectfree.bage_prior_svd_rwrandom make_matrix_along_by_effectfree.bage_prior_svd_ar make_matrix_along_by_effectfree.bage_prior_svd make_matrix_along_by_effectfree.bage_prior_spline make_matrix_along_by_effectfree.bage_prior_rw2zeroseasvary make_matrix_along_by_effectfree.bage_prior_rw2zeroseasfix make_matrix_along_by_effectfree.bage_prior_rw2zero make_matrix_along_by_effectfree.bage_prior_rw2zeroseasvary make_matrix_along_by_effectfree.bage_prior_rw2zeroseasfix make_matrix_along_by_effectfree.bage_prior_rw2random make_matrix_along_by_effectfree.bage_prior_rw2infant make_matrix_along_by_effectfree.bage_prior_rwzeroseasvary make_matrix_along_by_effectfree.bage_prior_rwzeroseasfix make_matrix_along_by_effectfree.bage_prior_rwzero make_matrix_along_by_effectfree.bage_prior_rwrandomseasvary make_matrix_along_by_effectfree.bage_prior_rwrandomseasfix make_matrix_along_by_effectfree.bage_prior_rwrandom make_matrix_along_by_effectfree.bage_prior_linex make_matrix_along_by_effectfree.bage_prior_linar make_matrix_along_by_effectfree.bage_prior_lin make_matrix_along_by_effectfree.bage_prior_ar forecast_term.bage_prior_rw2randomseasfix forecast_term.bage_prior_rw2random forecast_term.bage_prior_rwzeroseasvary forecast_term.bage_prior_rwzeroseasfix forecast_term.bage_prior_rwzero forecast_term.bage_prior_rwrandomseasvary forecast_term.bage_prior_rwrandomseasfix forecast_term.bage_prior_rwrandom forecast_term.bage_prior_normfixed forecast_term.bage_prior_norm forecast_term.bage_prior_linex forecast_term.bage_prior_linar forecast_term.bage_prior_lin forecast_term.bage_prior_ar forecast_term.bage_prior forecast_term draw_vals_svd.bage_prior_svd_rw2zero draw_vals_svd.bage_prior_svd_rw2random draw_vals_svd.bage_prior_svd_rwzero draw_vals_effect.bage_prior_svd_rw2zero draw_vals_effect.bage_prior_svd_rw2random draw_vals_effect.bage_prior_svd_rwzero draw_vals_effect.bage_prior_svd_rwrandom draw_vals_effect.bage_prior_svd_ar draw_vals_effect.bage_prior_svd draw_vals_effect.bage_prior_spline draw_vals_effect.bage_prior_rw2zeroseasvary draw_vals_effect.bage_prior_rw2zeroseasfix draw_vals_effect.bage_prior_rw2zero draw_vals_effect.bage_prior_rw2randomseasvary draw_vals_effect.bage_prior_rw2randomseasfix draw_vals_effect.bage_prior_rw2random draw_vals_effect.bage_prior_rw2infant draw_vals_effect.bage_prior_rwzeroseasvary draw_vals_effect.bage_prior_rwzeroseasfix draw_vals_effect.bage_prior_rwzero draw_vals_effect.bage_prior_rwrandomseasvary draw_vals_effect.bage_prior_rwrandomseasfix draw_vals_effect.bage_prior_rwrandom draw_vals_effect.bage_prior_normfixed draw_vals_effect.bage_prior_norm draw_vals_effect.bage_prior_linex draw_vals_effect.bage_prior_linar draw_vals_effect.bage_prior_lin draw_vals_effect.bage_prior_known draw_vals_effect.bage_prior_ar draw_vals_effect const.bage_prior const comp_hyperrand.bage_prior_rw2zeroseasvary comp_hyperrand.bage_prior_rw2zeroseasfix comp_hyperrand.bage_prior_rw2randomseasvary comp_hyperrand.bage_prior_rw2randomseasfix comp_hyperrand.bage_prior_rwzeroseasvary comp_hyperrand.bage_prior_rwzeroseasfix comp_hyperrand.bage_prior_rwrandomseasvary comp_hyperrand.bage_prior_rwrandomseasfix comp_hyperrand.bage_prior_linar comp_hyperrand.bage_prior_lin comp_hyperrand.bage_prior comp_hyperrand

Documented in generate.bage_prior_ar generate.bage_prior_known generate.bage_prior_lin generate.bage_prior_linar generate.bage_prior_linex generate.bage_prior_norm generate.bage_prior_normfixed generate.bage_prior_rw2random generate.bage_prior_rw2randomseasfix generate.bage_prior_rw2randomseasvary generate.bage_prior_rw2zero generate.bage_prior_rw2zeroseasfix generate.bage_prior_rw2zeroseasvary generate.bage_prior_rwrandom generate.bage_prior_rwrandomseasfix generate.bage_prior_rwrandomseasvary generate.bage_prior_rwzero generate.bage_prior_rwzeroseasfix generate.bage_prior_rwzeroseasvary generate.bage_prior_spline generate.bage_prior_svd generate.bage_prior_svd_ar generate.bage_prior_svd_rw2random generate.bage_prior_svd_rw2zero generate.bage_prior_svd_rwrandom generate.bage_prior_svd_rwzero

## Note that methods require an '@export' tag,
## even when the generic function is not exported
## https://github.com/r-lib/devtools/issues/2293


## 'comp_hyperrand' -----------------------------------------------------------

#' Type of Hyper-Parameter
#'
#' Names for type of hyper-parameter represented by
#' hyperrand. Choices include "trend", "season", "error".
#' Used for creating output for 'components' function.
#' 
#' @param prior An object of class 'bage_prior'.
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#'
#' @returns A character vector.
#'
#' @noRd
comp_hyperrand <- function(prior, dimnames_term, var_age, var_time) {
  UseMethod("comp_hyperrand")
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior <- function(prior, dimnames_term, var_age, var_time) {
  character()
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_lin <- function(prior, dimnames_term, var_age, var_time) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  n_by <- prod(lengths(dimnames_term[-i_along]))
  n_effect <- prod(lengths(dimnames_term))
  rep(c("hyper", "trend", "error"), times = c(n_by, n_effect, n_effect))
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_linar <- function(prior, dimnames_term, var_age, var_time) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  n_by <- prod(lengths(dimnames_term[-i_along]))
  n_effect <- prod(lengths(dimnames_term))
  rep(c("hyper", "trend", "error"), times = c(n_by, n_effect, n_effect))
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rwrandomseasfix <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rwrandomseasvary <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rwzeroseasfix <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rwzeroseasvary <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rw2randomseasfix <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rw2randomseasvary <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rw2zeroseasfix <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}

## HAS_TESTS
#' @export
comp_hyperrand.bage_prior_rw2zeroseasvary <- function(prior, dimnames_term, var_age, var_time) {
  n <- prod(lengths(dimnames_term))
  rep(c("trend", "season"), each = n)
}


## 'const' -------------------------------------------------------------------

#' Extract Constants from Prior Spec
#'
#' @param prior Object of class 'bage_prior'
#'
#' @returns A named numeric vector.
#'
#' @noRd
const <- function(prior) {
  UseMethod("const")
}

## HAS_TESTS
#' @export
const.bage_prior <- function(prior) prior$const


## 'draw_vals_effect' ------------------------------------------------------------

#' Draw Values for Main Effect or Interactions
#'
#' Effect is centered, unless it has a Known or SVD prior.
#' 
#' @param prior Object of class 'bage_prior'
#' @param vals_hyper Named list with values of ordinary hyper-parameters
#' @param vals_hyperrand Named list with values of hyper-parameters
#' that can be treated as random effects
#' @param vals_spline Named list of values for free parameters
#' for spline-based priors
#' @param vals_svd Named list of values for free parameters
#' for SVD-based priors
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#' @param n_sim Number of draws
#'
#' @returns A named list.
#'
#' @noRd
draw_vals_effect <- function(prior,
                             vals_hyper,
                             vals_hyperrand,
                             vals_spline,
                             vals_svd,
                             dimnames_term,
                             var_time,
                             var_age,
                             var_sexgender,
                             n_sim) {
  UseMethod("draw_vals_effect")
}


## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_ar <- function(prior,
                                           vals_hyper,
                                           vals_hyperrand,
                                           vals_spline,
                                           vals_svd,
                                           dimnames_term,
                                           var_time,
                                           var_age,
                                           var_sexgender,
                                           n_sim) {
  con <- prior$specific$con
  coef <- vals_hyper$coef
  sd <- vals_hyper$sd
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_inner(i_along = i_along,
                                                       dim = dim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_ar(coef = coef,
                      sd = sd,
                      matrix_along_by = matrix_along_by_effect,
                      levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_known <- function(prior,
                                              vals_hyper,
                                              vals_hyperrand,
                                              vals_spline,
                                              vals_svd,
                                              dimnames_term,
                                              var_time,
                                              var_age,
                                              var_sexgender,
                                              n_sim) {
  values <- prior$specific$values
  levels_effect <- dimnames_to_levels(dimnames_term)
  n_effect <- length(levels_effect)
  matrix(values,
         nrow = n_effect,
         ncol = n_sim,
         dimnames = list(levels_effect, NULL))
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_lin <- function(prior,
                                            vals_hyper,
                                            vals_hyperrand,
                                            vals_spline,
                                            vals_svd,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            n_sim) {
  trend <- vals_hyperrand$trend
  error <- vals_hyperrand$error
  trend + error
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_linar <- function(prior,
                                              vals_hyper,
                                              vals_hyperrand,
                                              vals_spline,
                                              vals_svd,
                                              dimnames_term,
                                              var_time,
                                              var_age,
                                              var_sexgender,
                                              n_sim) {
  trend <- vals_hyperrand$trend
  error <- vals_hyperrand$error
  trend + error
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_linex <- function(prior,
                                              vals_hyper,
                                              vals_hyperrand,
                                              vals_spline,
                                              vals_svd,
                                              dimnames_term,
                                              var_time,
                                              var_age,
                                              var_sexgender,
                                              n_sim) {
  con <- prior$specific$con
  sd_slope <- prior$specific$sd_slope
  mean_slope <- prior$specific$mean_slope
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by <- make_matrix_along_by(i_along = i_along,
                                          dim = dim,
                                          dimnames = dimnames_term)
  slope <- draw_vals_slope(mean_slope = mean_slope,
                           sd_slope = sd_slope,
                           matrix_along_by = matrix_along_by,
                           n_sim = n_sim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_lintrend(slope = slope,
                            matrix_along_by = matrix_along_by,
                            labels = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans  
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_norm <- function(prior,
                                             vals_hyper,
                                             vals_hyperrand,
                                             vals_spline,
                                             vals_svd,
                                             dimnames_term,
                                             var_time,
                                             var_age,
                                             var_sexgender,
                                             n_sim) {
  sd <- vals_hyper$sd
  levels_effect <- dimnames_to_levels(dimnames_term)
  draw_vals_norm(sd = sd, labels = levels_effect)
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_normfixed <- function(prior,
                                                  vals_hyper,
                                                  vals_hyperrand,
                                                  vals_spline,
                                                  vals_svd,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender,
                                                  n_sim) {
  sd <- prior$specific$sd
  levels_effect <- dimnames_to_levels(dimnames_term)
  n_effect <- length(levels_effect)
  n <- n_effect * n_sim
  ans <- stats::rnorm(n = n, sd = sd)
  ans <- matrix(ans,
                nrow = n_effect,
                ncol = n_sim,
                dimnames = list(levels_effect, NULL))
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rwrandom <- function(prior,
                                               vals_hyper,
                                               vals_hyperrand,
                                               vals_spline,
                                               vals_svd,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               n_sim) {
  sd_init <- prior$specific$sd
  con <- prior$specific$con
  sd <- vals_hyper$sd
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_inner(i_along = i_along,
                                                       dim = dim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_rw(sd = sd,
                      sd_init = sd_init,
                      matrix_along_by = matrix_along_by_effect,
                      levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans  
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rwrandomseasfix <- function(prior,
                                                  vals_hyper,
                                                  vals_hyperrand,
                                                  vals_spline,
                                                  vals_svd,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender,
                                                  n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rwrandomseasvary <- function(prior,
                                                   vals_hyper,
                                                   vals_hyperrand,
                                                   vals_spline,
                                                   vals_svd,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}


## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rwzero <- function(prior,
                                               vals_hyper,
                                               vals_hyperrand,
                                               vals_spline,
                                               vals_svd,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               n_sim) {
  con <- prior$specific$con
  sd <- vals_hyper$sd
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_inner(i_along = i_along,
                                                       dim = dim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_rw(sd = sd,
                      sd_init = 0,
                      matrix_along_by = matrix_along_by_effect,
                      levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans  
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rwzeroseasfix <- function(prior,
                                                  vals_hyper,
                                                  vals_hyperrand,
                                                  vals_spline,
                                                  vals_svd,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender,
                                                  n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rwzeroseasvary <- function(prior,
                                                   vals_hyper,
                                                   vals_hyperrand,
                                                   vals_spline,
                                                   vals_svd,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2infant <- function(prior,
                                                  vals_hyper,
                                                  vals_hyperrand,
                                                  vals_spline,
                                                  vals_svd,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender,
                                                  n_sim) {
  con <- prior$specific$con
  sd_slope <- prior$specific$sd_slope
  sd <- vals_hyper$sd
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_inner(i_along = i_along,
                                                       dim = dim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_rw2(sd = sd,
                       sd_init = 0,
                       sd_slope = sd_slope,
                       matrix_along_by = matrix_along_by_effect,
                       levels_effect = levels_effect)
  matrix_along_by <- make_matrix_along_by_inner(i_along = i_along,
                                                dim = dim)
  i_infant <- matrix_along_by[1L, ] + 1L
  n_by <- ncol(matrix_along_by)
  ans[i_infant] <- stats::rnorm(n = n_by)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans  
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2random <- function(prior,
                                                vals_hyper,
                                                vals_hyperrand,
                                                vals_spline,
                                                vals_svd,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender,
                                                n_sim) {
  sd_init <- prior$specific$sd
  sd_slope <- prior$specific$sd_slope
  con <- prior$specific$con
  sd <- vals_hyper$sd
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_inner(i_along = i_along,
                                                       dim = dim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_rw2(sd = sd,
                       sd_init = sd_init,
                       sd_slope = sd_slope,
                       matrix_along_by = matrix_along_by_effect,
                       levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans  
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2randomseasfix <- function(prior,
                                                       vals_hyper,
                                                       vals_hyperrand,
                                                       vals_spline,
                                                       vals_svd,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender,
                                                       n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2randomseasvary <- function(prior,
                                                          vals_hyper,
                                                          vals_hyperrand,
                                                          vals_spline,
                                                          vals_svd,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender,
                                                          n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2zero <- function(prior,
                                                vals_hyper,
                                                vals_hyperrand,
                                                vals_spline,
                                                vals_svd,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender,
                                                n_sim) {
  con <- prior$specific$con
  sd_slope <- prior$specific$sd_slope
  sd <- vals_hyper$sd
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_inner(i_along = i_along,
                                                       dim = dim)
  levels_effect <- dimnames_to_levels(dimnames_term)
  ans <- draw_vals_rw2(sd = sd,
                       sd_init = 0,
                       sd_slope = sd_slope,
                       matrix_along_by = matrix_along_by_effect,
                       levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    ans <- m %*% ans
    ans <- Matrix::as.matrix(ans)
  }
  ans  
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2zeroseasfix <- function(prior,
                                                       vals_hyper,
                                                       vals_hyperrand,
                                                       vals_spline,
                                                       vals_svd,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender,
                                                       n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_rw2zeroseasvary <- function(prior,
                                                        vals_hyper,
                                                        vals_hyperrand,
                                                        vals_spline,
                                                        vals_svd,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender,
                                                        n_sim) {
  trend <- vals_hyperrand$trend
  season <- vals_hyperrand$season
  trend + season
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_spline <- function(prior,
                                               vals_hyper,
                                               vals_hyperrand,
                                               vals_spline,
                                               vals_svd,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               n_sim) {
  m <- make_matrix_effectfree_effect(prior = prior,
                                     dimnames_term = dimnames_term,
                                     var_time = var_time,
                                     var_age = var_age,
                                     var_sexgender = var_sexgender)
  ans <- m %*% vals_spline
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_svd <- function(prior,
                                            vals_hyper,
                                            vals_hyperrand,
                                            vals_spline,
                                            vals_svd,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            n_sim) {
  matrix <- make_matrix_effectfree_effect(prior = prior,
                                          dimnames_term = dimnames_term,
                                          var_time = var_time,
                                          var_age = var_age,
                                          var_sexgender = var_sexgender)
  offset <- make_offset_effectfree_effect(prior = prior,
                                          dimnames_term = dimnames_term,
                                          var_time = var_time,
                                          var_age = var_age,
                                          var_sexgender = var_sexgender)
  ans <- matrix %*% vals_svd + offset
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_svd_ar <- function(prior,
                                               vals_hyper,
                                               vals_hyperrand,
                                               vals_spline,
                                               vals_svd,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               n_sim) {
  matrix <- make_matrix_effectfree_effect(prior = prior,
                                          dimnames_term = dimnames_term,
                                          var_time = var_time,
                                          var_age = var_age,
                                          var_sexgender = var_sexgender)
  offset <- make_offset_effectfree_effect(prior = prior,
                                          dimnames_term = dimnames_term,
                                          var_time = var_time,
                                          var_age = var_age,
                                          var_sexgender = var_sexgender)
  ans <- matrix %*% vals_svd + offset
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_svd_rwrandom <- function(prior,
                                               vals_hyper,
                                               vals_hyperrand,
                                               vals_spline,
                                               vals_svd,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               n_sim) {
  con <- prior$specific$con
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_term,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_term,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ans <- matrix %*% vals_svd + offset
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_svd_rwzero <- function(prior,
                                                   vals_hyper,
                                                   vals_hyperrand,
                                                   vals_spline,
                                                   vals_svd,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   n_sim) {
  con <- prior$specific$con
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_term,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_term,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ans <- matrix %*% vals_svd + offset
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}

## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_svd_rw2random <- function(prior,
                                                      vals_hyper,
                                                      vals_hyperrand,
                                                      vals_spline,
                                                      vals_svd,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender,
                                                      n_sim) {
  con <- prior$specific$con
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_term,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_term,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ans <- matrix %*% vals_svd + offset
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}


## HAS_TESTS
#' @export
draw_vals_effect.bage_prior_svd_rw2zero <- function(prior,
                                                    vals_hyper,
                                                    vals_hyperrand,
                                                    vals_spline,
                                                    vals_svd,
                                                    dimnames_term,
                                                    var_time,
                                                    var_age,
                                                    var_sexgender,
                                                    n_sim) {
  con <- prior$specific$con
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_term,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_term,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ans <- matrix %*% vals_svd + offset
  ans <- Matrix::as.matrix(ans)
  rownames(ans) <- dimnames_to_levels(dimnames_term)
  ans
}


## 'draw_vals_hyper' ----------------------------------------------------------

#' Draw values for hyper-parameters
#'
#' @param prior Object of class 'bage_prior'
#' @param n_sim Number of simulation draws
#'
#' @returns A named list.
#'
#' @noRd
draw_vals_hyper <- function(prior, n_sim) {
  UseMethod("draw_vals_hyper")
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_ar <- function(prior, n_sim) {
  coef <- draw_vals_coef(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(coef = coef,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_known <- function(prior, n_sim)
  list()

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_lin <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_linar <- function(prior, n_sim) {
  coef <- draw_vals_coef(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(coef = coef,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_norm <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_normfixed <- function(prior, n_sim)
  list()

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rwrandom <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rwrandomseasfix <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rwrandomseasvary <- function(prior, n_sim) {
  sd_seas <- draw_vals_sd_seas(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd_seas = sd_seas,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rwzero <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rwzeroseasfix <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rwzeroseasvary <- function(prior, n_sim) {
  sd_seas <- draw_vals_sd_seas(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd_seas = sd_seas,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2infant <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2random <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2randomseasfix <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2randomseasvary <- function(prior, n_sim) {
  sd_seas <- draw_vals_sd_seas(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd_seas = sd_seas,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2zero <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2zeroseasfix <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_rw2zeroseasvary <- function(prior, n_sim) {
  sd_seas <- draw_vals_sd_seas(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd_seas = sd_seas,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_spline <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_svd <- function(prior, n_sim)
  list()

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_svd_ar <- function(prior, n_sim) {
  coef <- draw_vals_coef(prior = prior, n_sim = n_sim)
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(coef = coef,
       sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_svd_rwrandom <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_svd_rwzero <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_svd_rw2random <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}

## HAS_TESTS
#' @export
draw_vals_hyper.bage_prior_svd_rw2zero <- function(prior, n_sim) {
  sd <- draw_vals_sd(prior = prior, n_sim = n_sim)
  list(sd = sd)
}


## 'draw_vals_hyperrand' ------------------------------------------------------

#' Draw Values for Hyper-Parameters that can be Treated as Random Effects
#'
#' @param prior Object of class 'bage_prior'
#' @param vals_hyper Named list with values of ordinary hyper-parameters
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param n_sim Number of simulation draws
#'
#' @returns A named list.
#'
#' @noRd
draw_vals_hyperrand <- function(prior,
                                vals_hyper,
                                dimnames_term,
                                var_time,
                                var_age,
                                n_sim) {
  UseMethod("draw_vals_hyperrand")
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior <- function(prior,
                                           vals_hyper,
                                           dimnames_term,
                                           var_time,
                                           var_age,
                                           n_sim) {
  list()
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_lin <- function(prior,
                                               vals_hyper,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               n_sim) {
  con <- prior$specific$con
  mean_slope <- prior$const[["mean_slope"]]
  sd_slope <- prior$const[["sd_slope"]]
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  slope <- draw_vals_slope(mean_slope = mean_slope,
                           sd_slope = sd_slope,
                           matrix_along_by = matrix_along_by_effect,
                           n_sim = n_sim)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_lintrend(slope = slope,
                              matrix_along_by = matrix_along_by_effect,
                              labels = labels)
  error <- draw_vals_norm(sd = sd,
                          labels = labels)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    error <- m %*% error
    trend <- Matrix::as.matrix(trend)
    error <- Matrix::as.matrix(error)
    n_by <- ncol(matrix_along_by_effect)
    slope <- matrix(nrow = n_by, ncol = n_sim)
    for (i_by in seq_len(n_by)) {
      i_1 <- matrix_along_by_effect[1L, i_by] + 1L
      i_2 <- matrix_along_by_effect[2L, i_by] + 1L
      slope[i_by, ] <- trend[i_2, ] - trend[i_1, ]
    }
  }
  list(slope = slope,
       trend = trend,
       error = error)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_linar <- function(prior,
                                                 vals_hyper,
                                                 dimnames_term,
                                                 var_time,
                                                 var_age,
                                                 n_sim) {
  con <- prior$specific$con
  coef <- vals_hyper$coef
  sd <- vals_hyper$sd
  mean_slope <- prior$const[["mean_slope"]]
  sd_slope <- prior$const[["sd_slope"]]
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  slope <- draw_vals_slope(mean_slope = mean_slope,
                           sd_slope = sd_slope,
                           matrix_along_by = matrix_along_by_effect,
                           n_sim = n_sim)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_lintrend(slope = slope,
                              matrix_along_by = matrix_along_by_effect,
                              labels = labels)
  error <- draw_vals_ar(coef = coef,
                        sd = sd,
                        matrix_along_by = matrix_along_by_effect,
                        levels_effect = labels)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    error <- m %*% error
    trend <- Matrix::as.matrix(trend)
    error <- Matrix::as.matrix(error)
    n_by <- ncol(matrix_along_by_effect)
    slope <- matrix(nrow = n_by, ncol = n_sim)
    for (i_by in seq_len(n_by)) {
      i_1 <- matrix_along_by_effect[1L, i_by] + 1L
      i_2 <- matrix_along_by_effect[2L, i_by] + 1L
      slope[i_by, ] <- trend[i_2, ] - trend[i_1, ]
    }
  }
  list(slope = slope,
       trend = trend,
       error = error)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rwrandomseasfix <- function(prior,
                                                     vals_hyper,
                                                     dimnames_term,
                                                     var_time,
                                                     var_age,
                                                     n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd_init <- prior$specific$sd
  sd_init_seas <- prior$specific$sd_seas
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw(sd = sd,
                        sd_init = sd_init,
                        matrix_along_by = matrix_along_by_effect,
                        levels_effect = labels)
  season <- draw_vals_seasfix(n_seas = n_seas,
                              sd_init = sd_init_seas,
                              matrix_along_by = matrix_along_by_effect,
                              n_sim = n_sim)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rwrandomseasvary <- function(prior,
                                                            vals_hyper,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd <- vals_hyper$sd
  sd_init <- prior$specific$sd
  sd_init_seas <- prior$specific$sd_seas
  sd_innov_seas <- vals_hyper$sd_seas
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw(sd = sd,
                        sd_init = sd_init,
                        matrix_along_by = matrix_along_by_effect,
                        levels_effect = labels)
  season <- draw_vals_seasvary(n_seas = n_seas,
                               sd_init = sd_init_seas,
                               sd_innov = sd_innov_seas,
                               matrix_along_by = matrix_along_by_effect)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rwzeroseasfix <- function(prior,
                                                         vals_hyper,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd_init_seas <- prior$specific$sd_seas
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw(sd = sd,
                        sd_init = 0,
                        matrix_along_by = matrix_along_by_effect,
                        levels_effect = labels)
  season <- draw_vals_seasfix(n_seas = n_seas,
                              sd_init = sd_init_seas,
                              matrix_along_by = matrix_along_by_effect,
                              n_sim = n_sim)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rwzeroseasvary <- function(prior,
                                                          vals_hyper,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd <- vals_hyper$sd
  sd_init_seas <- prior$specific$sd_seas
  sd_innov_seas <- vals_hyper$sd_seas
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw(sd = sd,
                        sd_init = 0,
                        matrix_along_by = matrix_along_by_effect,
                        levels_effect = labels)
  season <- draw_vals_seasvary(n_seas = n_seas,
                               sd_init = sd_init_seas,
                               sd_innov = sd_innov_seas,
                               matrix_along_by = matrix_along_by_effect)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rw2randomseasfix <- function(prior,
                                                      vals_hyper,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd_init <- prior$specific$sd
  sd_slope <- prior$specific$sd_slope
  sd_init_seas <- prior$specific$sd_seas
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw2(sd = sd,
                         sd_init = sd_init,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by_effect,
                         levels_effect = labels)
  season <- draw_vals_seasfix(n_seas = n_seas,
                              sd_init = sd_init_seas,
                              matrix_along_by = matrix_along_by_effect,
                              n_sim = n_sim)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rw2randomseasvary <- function(prior,
                                                             vals_hyper,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd_init <- prior$specific$sd
  sd_slope <- prior$specific$sd_slope
  sd_init_seas <- prior$specific$sd_seas
  sd_innov_seas <- vals_hyper$sd_seas
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw2(sd = sd,
                         sd_init = sd_init,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by_effect,
                         levels_effect = labels)
  season <- draw_vals_seasvary(n_seas = n_seas,
                               sd_init = sd_init_seas,
                               sd_innov = sd_innov_seas,
                               matrix_along_by = matrix_along_by_effect)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}


## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rw2zeroseasfix <- function(prior,
                                                          vals_hyper,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd_slope <- prior$specific$sd_slope
  sd_init_seas <- prior$specific$sd_seas
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw2(sd = sd,
                         sd_init = 0,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by_effect,
                         levels_effect = labels)
  season <- draw_vals_seasfix(n_seas = n_seas,
                              sd_init = sd_init_seas,
                              matrix_along_by = matrix_along_by_effect,
                              n_sim = n_sim)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}

## HAS_TESTS
#' @export
draw_vals_hyperrand.bage_prior_rw2zeroseasvary <- function(prior,
                                                           vals_hyper,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           n_sim) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  sd_slope <- prior$specific$sd_slope
  sd_init_seas <- prior$specific$sd_seas
  sd_innov_seas <- vals_hyper$sd_seas
  sd <- vals_hyper$sd
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  labels <- dimnames_to_levels(dimnames_term)
  trend <- draw_vals_rw2(sd = sd,
                         sd_init = 0,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by_effect,
                         levels_effect = labels)
  season <- draw_vals_seasvary(n_seas = n_seas,
                               sd_init = sd_init_seas,
                               sd_innov = sd_innov_seas,
                               matrix_along_by = matrix_along_by_effect)
  if (con == "by") {
    i_along <- make_i_along(prior = prior,
                            dimnames_term = dimnames_term,
                            var_time = var_time,
                            var_age = var_age)
    dim <- lengths(dimnames_term)
    m <- make_matrix_con_by(i_along = i_along,
                              dim = dim)
    trend <- m %*% trend
    season <- m %*% season
    trend <- Matrix::as.matrix(trend)
    season <- Matrix::as.matrix(season)
  }
  list(trend = trend,
       season = season)
}


## 'draw_vals_spline' ---------------------------------------------------------

#' Draw Subspace Coefficients for Spline Priors
#'
#' If return value is matrix, the matrix
#' has 'n_effectfree' rows
#' and 'n_sim' columns.
#' 
#' @param prior Object of class 'bage_prior'
#' @param vals_hyper Named list with values of ordinary hyper-parameters
#' @param dimnames_term Dimnames for array
#' representing term
#' @param var_time Name of time variable, or NULL
#' @param var_age Name of age variable, or NULL
#' @param levels_spline Labels for spline coefficients
#' @param n_sim Number of simulation draws
#'
#' @returns A matrix or NULL
#'
#' @noRd
draw_vals_spline <- function(prior,
                             vals_hyper,
                             dimnames_term,
                             var_time,
                             var_age,
                             levels_spline,
                             n_sim) {
  UseMethod("draw_vals_spline")
}

## HAS_TESTS
#' @export
draw_vals_spline.bage_prior <- function(prior,
                                        vals_hyper,
                                        dimnames_term,
                                        var_time,
                                        var_age,
                                        levels_spline,
                                        n_sim) {
  NULL
}

## HAS_TESTS
#' @export
draw_vals_spline.bage_prior_spline <- function(prior,
                                               vals_hyper,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               levels_spline,
                                               n_sim) {
  sd_init <- prior$specific$sd
  sd_slope <- prior$specific$sd_slope
  sd <- vals_hyper$sd
  con <- prior$specific$con
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  dim <- lengths(dimnames_term)
  if (con == "by")
    dim[-i_along] <- dim[-i_along] - 1L
  n_along <- dim[[i_along]]
  n_comp <- get_n_comp_spline(prior = prior,
                              n_along = n_along)
  dim[[i_along]] <- n_comp
  matrix_along_by <- make_matrix_along_by_inner(i_along = i_along,
                                                dim = dim)
  draw_vals_rw2(sd = sd,
                sd_init = sd_init,
                sd_slope = sd_slope,
                matrix_along_by = matrix_along_by,
                levels_effect = levels_spline)
}


## 'draw_vals_svd' -----------------------------------------------------------

#' Draw Values in Subspace for SVD-Based Priors
#'
#' If return value is matrix, the matrix
#' has 'n_effectfree' rows
#' and 'n_sim' columns.
#' 
#' @param prior Object of class 'bage_prior'
#' @param vals_hyper Named list with values of ordinary hyper-parameters
#' @param dimnames_term Dimnames for array
#' representing term
#' @param var_time Name of time variable, or NULL
#' @param var_age Name of age variable, or NULL
#' @param var_sexgender Name of sex/gender variable, or NULL
#' @param levels_svd Labels for spline coefficients
#' @param n_sim Number of simulation draws
#'
#' @returns A matrix or NULL
#'
#' @noRd
draw_vals_svd <- function(prior,
                          vals_hyper,
                          dimnames_term,
                          var_time,
                          var_age,
                          var_sexgender,
                          levels_svd,
                          n_sim) {
  UseMethod("draw_vals_svd")
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior <- function(prior,
                                     vals_hyper,
                                     dimnames_term,
                                     var_time,
                                     var_age,
                                     var_sexgender,
                                     levels_svd,
                                     n_sim) {
  NULL
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior_svd <- function(prior,
                                         vals_hyper,
                                         dimnames_term,
                                         var_time,
                                         var_age,
                                         var_sexgender,
                                         levels_svd,
                                         n_sim) {
  n_svd <- length(levels_svd)
  matrix(stats::rnorm(n = n_svd * n_sim),
         nrow = n_svd,
         ncol = n_sim,
         dimnames = list(levels_svd, NULL))
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior_svd_ar <- function(prior,
                                            vals_hyper,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            levels_svd,
                                            n_sim) {
  coef <- vals_hyper$coef
  sd <- vals_hyper$sd
  matrix_along_by <- make_matrix_along_by_effectfree(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age,
                                                     var_sexgender = var_sexgender)
  draw_vals_ar(coef = coef,
               sd = sd,
               matrix_along_by = matrix_along_by,
               levels_effect = levels_svd)
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior_svd_rwrandom <- function(prior,
                                            vals_hyper,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            levels_svd,
                                            n_sim) {
  sd <- vals_hyper$sd
  sd_init <- prior$specific$sd
  matrix_along_by <- make_matrix_along_by_effectfree_inner(prior = prior,
                                                           dimnames_term = dimnames_term,
                                                           var_time = var_time,
                                                           var_age = var_age,
                                                           var_sexgender = var_sexgender,
                                                           append_zero = FALSE)
  draw_vals_rw(sd = sd,
               sd_init = sd_init,
               matrix_along_by = matrix_along_by,
               levels_effect = levels_svd)
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior_svd_rwzero <- function(prior,
                                            vals_hyper,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            levels_svd,
                                            n_sim) {
  sd <- vals_hyper$sd
  matrix_along_by <- make_matrix_along_by_effectfree_inner(prior = prior,
                                                           dimnames_term = dimnames_term,
                                                           var_time = var_time,
                                                           var_age = var_age,
                                                           var_sexgender = var_sexgender,
                                                           append_zero = FALSE)
  draw_vals_rw(sd = sd,
               sd_init = 0,
               matrix_along_by = matrix_along_by,
               levels_effect = levels_svd)
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior_svd_rw2random <- function(prior,
                                                   vals_hyper,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   levels_svd,
                                                   n_sim) {
  sd <- vals_hyper$sd
  sd_init <- prior$specific$sd
  sd_slope <- prior$specific$sd_slope
  matrix_along_by <- make_matrix_along_by_effectfree_inner(prior = prior,
                                                           dimnames_term = dimnames_term,
                                                           var_time = var_time,
                                                           var_age = var_age,
                                                           var_sexgender = var_sexgender,
                                                           append_zero = FALSE)
  draw_vals_rw2(sd = sd,
                sd_init = sd_init,
                sd_slope = sd_slope,
                matrix_along_by = matrix_along_by,
                levels_effect = levels_svd)
}

## HAS_TESTS
#' @export
draw_vals_svd.bage_prior_svd_rw2zero <- function(prior,
                                                 vals_hyper,
                                                 dimnames_term,
                                                 var_time,
                                                 var_age,
                                                 var_sexgender,
                                                 levels_svd,
                                                 n_sim) {
  sd <- vals_hyper$sd
  sd_slope <- prior$specific$sd_slope
  matrix_along_by <- make_matrix_along_by_effectfree_inner(prior = prior,
                                                           dimnames_term = dimnames_term,
                                                           var_time = var_time,
                                                           var_age = var_age,
                                                           var_sexgender = var_sexgender,
                                                           append_zero = FALSE)
  draw_vals_rw2(sd = sd,
                sd_init = 0,
                sd_slope = sd_slope,
                matrix_along_by = matrix_along_by,
                levels_effect = levels_svd)
}


## 'forecast_term' ------------------------------------------------------------

#' Forecast a Main Effect or Interaction
#'
#' Forecast values for a main effect or interaction,
#' given values for hyper-parameters. If the term
#' is an interaction and contains an "along"
#' dimension, then that dimension is guaranteed
#' to be time (checked via function
#' 'check_along_is_time'.
#'
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#' @param components Tibble with with output
#' from function 'components'
#' @param labels_forecast Vector
#' with labels for future time periods.
#'
#' @returns A tibble
#'
#' @noRd
forecast_term <- function(prior,
                          dimnames_term,
                          var_time,
                          var_age,
                          var_sexgender,
                          components,
                          labels_forecast) {
  UseMethod("forecast_term")
}

## HAS_TESTS
#' @export
forecast_term.bage_prior <- function(prior,
                                     dimnames_term,
                                     var_time,
                                     var_age,
                                     var_sexgender,
                                     components,
                                     labels_forecast) {
  nm <- dimnames_to_nm(dimnames_term)
  cli::cli_abort(c("Can't forecast term {.val {nm}}.",
                   i = "Term {.val {nm}} has a {.val {str_nm_prior(prior)}} prior.",
                   i = "Terms with a {.val {str_nm_prior(prior)}} prior cannot be forecasted.",
                   i = "For a list of priors that can be forecasted, see {.topic bage::priors}."))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_ar <- function(prior,
                                        dimnames_term,
                                        var_time,
                                        var_age,
                                        var_sexgender,
                                        components,
                                        labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_ar <- with(components,
                term == nm & component == "effect")
  is_coef <- with(components,
                  term == nm & component == "hyper" & startsWith(level, "coef"))
  is_sd <- with(components,
                term == nm & component == "hyper" & level == "sd")
  ar_est <- components$.fitted[is_ar]
  coef <- components$.fitted[is_coef]
  sd <- components$.fitted[is_sd]
  .fitted <- forecast_ar(ar_est = ar_est,
                         coef = coef,
                         sd = sd,
                         matrix_along_by_est = matrix_along_by_est,
                         matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                               fitted = .fitted,
                               dimnames_term = dimnames_forecast,
                               var_time = var_time,
                               var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_lin <- function(prior,
                                         dimnames_term,
                                         var_time,
                                         var_age,
                                         var_sexgender,
                                         components,
                                         labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_slope <- with(components, term == nm & component == "hyper" & startsWith(level, "slope"))
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  slope <- components$.fitted[is_slope]
  sd <- components$.fitted[is_sd]
  .fitted <- forecast_lin(slope = slope,
                          sd = sd,
                          matrix_along_by_est = matrix_along_by_est,
                          matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                               fitted = .fitted,
                               dimnames_term = dimnames_forecast,
                               var_time = var_time,
                               var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_linar <- function(prior,
                                           dimnames_term,
                                           var_time,
                                           var_age,
                                           var_sexgender,
                                           components,
                                           labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_effect <- with(components, term == nm & component == "effect")
  is_coef <- with(components, term == nm & component == "hyper" & startsWith(level, "coef"))
  is_slope <- with(components, term == nm & component == "hyper" & startsWith(level, "slope"))
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  effect_est <- components$.fitted[is_effect]
  coef <- components$.fitted[is_coef]
  slope <- components$.fitted[is_slope]
  sd <- components$.fitted[is_sd]
  trend_est <- make_lin_trend(slope = slope,
                              matrix_along_by = matrix_along_by_est)
  trend_forecast <- forecast_lin_trend(slope = slope,
                                       matrix_along_by_est = matrix_along_by_est,
                                       matrix_along_by_forecast = matrix_along_by_forecast)
  error_est <- effect_est - trend_est
  error_forecast <- forecast_ar(ar_est = error_est,
                                coef = coef,
                                sd = sd,
                                matrix_along_by_est = matrix_along_by_est,
                                matrix_along_by_forecast = matrix_along_by_forecast)
  effect_forecast <- trend_forecast + error_forecast
  if (con == "by") {
    effect_forecast_old <- effect_forecast
    effect_forecast <- con_by_fitted(prior = prior,
                                       fitted = effect_forecast_old,
                                       dimnames_term = dimnames_forecast,
                                       var_time = var_time,
                                       var_age = var_age)
    diff <- effect_forecast - effect_forecast_old
    error_forecast <- error_forecast + diff
  }
  component <- rep(c("effect", "trend", "error"), each = length(effect_forecast))
  level <- rep(levels_forecast, times = 3L)
  .fitted <- c(effect_forecast, trend_forecast, error_forecast)
  tibble::tibble(term = nm,
                 component = component,
                 level = level,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_linex <- function(prior,
                                           dimnames_term,
                                           var_time,
                                           var_age,
                                           var_sexgender,
                                           components,
                                           labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_effect <- with(components, term == nm & component == "effect")
  effect <- components$.fitted[is_effect]
  n_by <- ncol(matrix_along_by_est)
  n_draw <- rvec::n_draw(effect)
  slope <- rvec::new_rvec(length = n_by, n_draw = n_draw)
  for (i_by in seq_len(n_by)) {
    i1 <- matrix_along_by_est[1L, i_by] + 1L
    i2 <- matrix_along_by_est[2L, i_by] + 1L
    slope[[i_by]] <- effect[[i2]] - effect[[i1]]
  }
  .fitted <- forecast_lin_trend(slope = slope,
                                matrix_along_by_est = matrix_along_by_est,
                                matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                               fitted = .fitted,
                               dimnames_term = dimnames_forecast,
                               var_time = var_time,
                               var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_norm <- function(prior,
                                        dimnames_term,
                                        var_time,
                                        var_age,
                                        var_sexgender,
                                        components,
                                        labels_forecast) {
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  n_forecast <- length(levels_forecast)
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  sd <- components$.fitted[is_sd]
  .fitted <- rvec::rnorm_rvec(n = n_forecast, sd = sd)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_normfixed <- function(prior,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               components,
                                               labels_forecast) {
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  n_forecast <- length(levels_forecast)
  sd <- prior$specific$sd
  n_draw <- rvec::n_draw(components$.fitted[[1L]])
  .fitted <- rvec::rnorm_rvec(n = n_forecast,
                              sd = sd,
                              n_draw = n_draw)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rwrandom <- function(prior,
                                              dimnames_term,
                                              var_time,
                                              var_age,
                                              var_sexgender,
                                              components,
                                              labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_effect <- with(components, term == nm & component == "effect")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw_est <- components$.fitted[is_effect]
  sd <- components$.fitted[is_sd]
  .fitted <- forecast_rw(rw_est = rw_est,
                         sd = sd,
                         matrix_along_by_est = matrix_along_by_est,
                         matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                             fitted = .fitted,
                             dimnames_term = dimnames_forecast,
                             var_time = var_time,
                             var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rwrandomseasfix <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   components,
                                                   labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd <- components$.fitted[is_sd]
  rw_forecast <- forecast_rw(rw_est = rw_est,
                             sd = sd,
                             matrix_along_by_est = matrix_along_by_est,
                             matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasfix(n_seas = n_seas,
                                    seas_est = seas_est,
                                    matrix_along_by_est = matrix_along_by_est,
                                    matrix_along_by_forecast = matrix_along_by_forecast)
  
  if (con == "by") {
    rw_forecast <- con_by_fitted(prior = prior,
                                   fitted = rw_forecast,
                                   dimnames_term = dimnames_forecast,
                                   var_time = var_time,
                                   var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw_forecast, seas_forecast))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rwrandomseasvary <- function(prior,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender,
                                                components,
                                                labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd_seas <- with(components, term == nm & component == "hyper" & level == "sd_seas")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd_seas <- components$.fitted[is_sd_seas]
  sd <- components$.fitted[is_sd]
  rw_forecast <- forecast_rw(rw_est = rw_est,
                             sd = sd,
                             matrix_along_by_est = matrix_along_by_est,
                             matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasvary(n_seas = n_seas,
                                     seas_est = seas_est,
                                     sd = sd_seas,
                                     matrix_along_by_est = matrix_along_by_est,
                                     matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by") {
    rw_forecast <- con_by_fitted(prior = prior,
                                   fitted = rw_forecast,
                                   dimnames_term = dimnames_forecast,
                                   var_time = var_time,
                                   var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw_forecast, seas_forecast))
}



## HAS_TESTS
#' @export
forecast_term.bage_prior_rwzero <- function(prior,
                                        dimnames_term,
                                        var_time,
                                        var_age,
                                        var_sexgender,
                                        components,
                                        labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_effect <- with(components, term == nm & component == "effect")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw_est <- components$.fitted[is_effect]
  sd <- components$.fitted[is_sd]
  .fitted <- forecast_rw(rw_est = rw_est,
                         sd = sd,
                         matrix_along_by_est = matrix_along_by_est,
                         matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                               fitted = .fitted,
                               dimnames_term = dimnames_forecast,
                               var_time = var_time,
                               var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rwzeroseasfix <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   components,
                                                   labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd <- components$.fitted[is_sd]
  rw_forecast <- forecast_rw(rw_est = rw_est,
                             sd = sd,
                             matrix_along_by_est = matrix_along_by_est,
                             matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasfix(n_seas = n_seas,
                                    seas_est = seas_est,
                                    matrix_along_by_est = matrix_along_by_est,
                                    matrix_along_by_forecast = matrix_along_by_forecast)
  
  if (con == "by") {
    rw_forecast <- con_by_fitted(prior = prior,
                                   fitted = rw_forecast,
                                   dimnames_term = dimnames_forecast,
                                   var_time = var_time,
                                   var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw_forecast, seas_forecast))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rwzeroseasvary <- function(prior,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender,
                                                components,
                                                labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd_seas <- with(components, term == nm & component == "hyper" & level == "sd_seas")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd_seas <- components$.fitted[is_sd_seas]
  sd <- components$.fitted[is_sd]
  rw_forecast <- forecast_rw(rw_est = rw_est,
                             sd = sd,
                             matrix_along_by_est = matrix_along_by_est,
                             matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasvary(n_seas = n_seas,
                                     seas_est = seas_est,
                                     sd = sd_seas,
                                     matrix_along_by_est = matrix_along_by_est,
                                     matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by") {
    rw_forecast <- con_by_fitted(prior = prior,
                                   fitted = rw_forecast,
                                   dimnames_term = dimnames_forecast,
                                   var_time = var_time,
                                   var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw_forecast, seas_forecast))
}





## HAS_TESTS
#' @export
forecast_term.bage_prior_rw2random <- function(prior,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender,
                                               components,
                                               labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_effect <- with(components, term == nm & component == "effect")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw2_est <- components$.fitted[is_effect]
  sd <- components$.fitted[is_sd]
  .fitted <- forecast_rw2(rw2_est = rw2_est,
                          sd = sd,
                          matrix_along_by_est = matrix_along_by_est,
                          matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                               fitted = .fitted,
                               dimnames_term = dimnames_forecast,
                               var_time = var_time,
                               var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rw2randomseasfix <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender,
                                                      components,
                                                      labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw2_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd <- components$.fitted[is_sd]
  rw2_forecast <- forecast_rw2(rw2_est = rw2_est,
                               sd = sd,
                               matrix_along_by_est = matrix_along_by_est,
                               matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasfix(n_seas = n_seas,
                                    seas_est = seas_est,
                                    matrix_along_by_est = matrix_along_by_est,
                                    matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by") {
    rw2_forecast <- con_by_fitted(prior = prior,
                                    fitted = rw2_forecast,
                                    dimnames_term = dimnames_forecast,
                                    var_time = var_time,
                                    var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw2_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw2_forecast, seas_forecast))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rw2randomseasvary <- function(prior,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender,
                                                       components,
                                                       labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd_seas <- with(components, term == nm & component == "hyper" & level == "sd_seas")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw2_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd_seas <- components$.fitted[is_sd_seas]
  sd <- components$.fitted[is_sd]
  rw2_forecast <- forecast_rw2(rw2_est = rw2_est,
                               sd = sd,
                               matrix_along_by_est = matrix_along_by_est,
                               matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasvary(n_seas = n_seas,
                                     seas_est = seas_est,
                                     sd = sd_seas,
                                     matrix_along_by_est = matrix_along_by_est,
                                     matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by") {
    rw2_forecast <- con_by_fitted(prior = prior,
                                    fitted = rw2_forecast,
                                    dimnames_term = dimnames_forecast,
                                    var_time = var_time,
                                    var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw2_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw2_forecast, seas_forecast))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rw2zero <- function(prior,
                                             dimnames_term,
                                             var_time,
                                             var_age,
                                             var_sexgender,
                                             components,
                                             labels_forecast) {
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_effect <- with(components, term == nm & component == "effect")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw2_est <- components$.fitted[is_effect]
  sd <- components$.fitted[is_sd]
  .fitted <- forecast_rw2(rw2_est = rw2_est,
                          sd = sd,
                          matrix_along_by_est = matrix_along_by_est,
                          matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by")
    .fitted <- con_by_fitted(prior = prior,
                               fitted = .fitted,
                               dimnames_term = dimnames_forecast,
                               var_time = var_time,
                               var_age = var_age)
  tibble::tibble(term = nm,
                 component = "effect",
                 level = levels_forecast,
                 .fitted = .fitted)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rw2zeroseasfix <- function(prior,
                                                    dimnames_term,
                                                    var_time,
                                                    var_age,
                                                    var_sexgender,
                                                    components,
                                                    labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw2_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd <- components$.fitted[is_sd]
  rw2_forecast <- forecast_rw2(rw2_est = rw2_est,
                               sd = sd,
                               matrix_along_by_est = matrix_along_by_est,
                               matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasfix(n_seas = n_seas,
                                    seas_est = seas_est,
                                    matrix_along_by_est = matrix_along_by_est,
                                    matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by") {
    rw2_forecast <- con_by_fitted(prior = prior,
                                    fitted = rw2_forecast,
                                    dimnames_term = dimnames_forecast,
                                    var_time = var_time,
                                    var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw2_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw2_forecast, seas_forecast))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_rw2zeroseasvary <- function(prior,
                                                     dimnames_term,
                                                     var_time,
                                                     var_age,
                                                     var_sexgender,
                                                     components,
                                                     labels_forecast) {
  con <- prior$specific$con
  n_seas <- prior$specific$n_seas
  nm <- dimnames_to_nm(dimnames_term)
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  levels_forecast <- dimnames_to_levels(dimnames_forecast)
  matrix_along_by_est <- make_matrix_along_by_effect(prior = prior,
                                                     dimnames_term = dimnames_term,
                                                     var_time = var_time,
                                                     var_age = var_age)
  matrix_along_by_forecast <- make_matrix_along_by_effect(prior = prior,
                                                          dimnames_term = dimnames_forecast,
                                                          var_time = var_time,
                                                          var_age = var_age)
  is_trend <- with(components, term == nm & component == "trend")
  is_season <- with(components, term == nm & component == "season")
  is_sd_seas <- with(components, term == nm & component == "hyper" & level == "sd_seas")
  is_sd <- with(components, term == nm & component == "hyper" & level == "sd")
  rw2_est <- components$.fitted[is_trend]
  seas_est <- components$.fitted[is_season]
  sd_seas <- components$.fitted[is_sd_seas]
  sd <- components$.fitted[is_sd]
  rw2_forecast <- forecast_rw2(rw2_est = rw2_est,
                               sd = sd,
                               matrix_along_by_est = matrix_along_by_est,
                               matrix_along_by_forecast = matrix_along_by_forecast)
  seas_forecast <- forecast_seasvary(n_seas = n_seas,
                                     seas_est = seas_est,
                                     sd = sd_seas,
                                     matrix_along_by_est = matrix_along_by_est,
                                     matrix_along_by_forecast = matrix_along_by_forecast)
  if (con == "by") {
    rw2_forecast <- con_by_fitted(prior = prior,
                                    fitted = rw2_forecast,
                                    dimnames_term = dimnames_forecast,
                                    var_time = var_time,
                                    var_age = var_age)
    seas_forecast <- con_by_fitted(prior = prior,
                                     fitted = seas_forecast,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age)
  }
  effect_forecast <- rw2_forecast + seas_forecast
  n_level <- length(effect_forecast)
  tibble::tibble(term = nm,
                 component = rep(c("effect", "trend", "season"), each = n_level),
                 level = rep(levels_forecast, times = 3L),
                 .fitted = c(effect_forecast, rw2_forecast, seas_forecast))
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_svd_ar <- function(prior,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            components,
                                            labels_forecast) {
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  svd_forecast <- forecast_ar_svd(prior = prior,
                                  dimnames_term = dimnames_term,
                                  dimnames_forecast = dimnames_forecast,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  components = components,
                                  labels_forecast)
  matrix <- make_matrix_effectfree_effect(prior = prior,
                                          dimnames_term = dimnames_forecast,
                                          var_time = var_time,
                                          var_age = var_age,
                                          var_sexgender = var_sexgender)
  offset <- make_offset_effectfree_effect(prior = prior,
                                          dimnames_term = dimnames_forecast,
                                          var_time = var_time,
                                          var_age = var_age,
                                          var_sexgender = var_sexgender)
  ## tricky combining rvecs with sparse matrices
  effect_forecast <- matrix %*% as.matrix(svd_forecast) + offset
  effect_forecast <- rvec::rvec_dbl(as.matrix(effect_forecast))
  nm <- dimnames_to_nm(dimnames_term)
  levels_effect <- dimnames_to_levels(dimnames_forecast)
  levels_svd <- make_levels_svd_term(prior = prior,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age,
                                     var_sexgender = var_sexgender)
  svd <- tibble::tibble(term = nm,
                        component = "svd",
                        level = levels_svd,
                        .fitted = svd_forecast)
  effect <- tibble::tibble(term = nm,
                           component = "effect",
                           level = levels_effect,
                           .fitted = effect_forecast)
  vctrs::vec_rbind(effect, svd)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_svd_rwrandom <- function(prior,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            components,
                                            labels_forecast) {
  con <- prior$specific$con
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  svd_forecast <- forecast_rw_svd(prior = prior,
                                  dimnames_term = dimnames_term,
                                  dimnames_forecast = dimnames_forecast,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  components = components,
                                  labels_forecast)
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_forecast,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_forecast,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ## tricky combining rvecs with sparse matrices
  effect_forecast <- matrix %*% as.matrix(svd_forecast) + offset
  effect_forecast <- rvec::rvec_dbl(as.matrix(effect_forecast))
  nm <- dimnames_to_nm(dimnames_term)
  levels_effect <- dimnames_to_levels(dimnames_forecast)
  levels_svd <- make_levels_svd_term(prior = prior,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age,
                                     var_sexgender = var_sexgender)
  svd <- tibble::tibble(term = nm,
                        component = "svd",
                        level = levels_svd,
                        .fitted = svd_forecast)
  effect <- tibble::tibble(term = nm,
                           component = "effect",
                           level = levels_effect,
                           .fitted = effect_forecast)
  vctrs::vec_rbind(effect, svd)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_svd_rwzero <- function(prior,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            components,
                                            labels_forecast) {
  con <- prior$specific$con
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  svd_forecast <- forecast_rw_svd(prior = prior,
                                  dimnames_term = dimnames_term,
                                  dimnames_forecast = dimnames_forecast,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  components = components,
                                  labels_forecast)
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_forecast,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_forecast,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ## tricky combining rvecs with sparse matrices
  effect_forecast <- matrix %*% as.matrix(svd_forecast) + offset
  effect_forecast <- rvec::rvec_dbl(as.matrix(effect_forecast))
  nm <- dimnames_to_nm(dimnames_term)
  levels_effect <- dimnames_to_levels(dimnames_forecast)
  levels_svd <- make_levels_svd_term(prior = prior,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age,
                                     var_sexgender = var_sexgender)
  svd <- tibble::tibble(term = nm,
                        component = "svd",
                        level = levels_svd,
                        .fitted = svd_forecast)
  effect <- tibble::tibble(term = nm,
                           component = "effect",
                           level = levels_effect,
                           .fitted = effect_forecast)
  vctrs::vec_rbind(effect, svd)
}


## HAS_TESTS
#' @export
forecast_term.bage_prior_svd_rw2random <- function(prior,
                                             dimnames_term,
                                             var_time,
                                             var_age,
                                             var_sexgender,
                                             components,
                                             labels_forecast) {
  con <- prior$specific$con
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  svd_forecast <- forecast_rw2_svd(prior = prior,
                                   dimnames_term = dimnames_term,
                                   dimnames_forecast = dimnames_forecast,
                                   var_time = var_time,
                                   var_age = var_age,
                                   var_sexgender = var_sexgender,
                                   components = components,
                                   labels_forecast)
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_forecast,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_forecast,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ## tricky combining rvecs with sparse matrices
  effect_forecast <- matrix %*% as.matrix(svd_forecast) + offset
  effect_forecast <- rvec::rvec_dbl(as.matrix(effect_forecast))
  nm <- dimnames_to_nm(dimnames_term)
  levels_effect <- dimnames_to_levels(dimnames_forecast)
  levels_svd <- make_levels_svd_term(prior = prior,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age,
                                     var_sexgender = var_sexgender)
  svd <- tibble::tibble(term = nm,
                        component = "svd",
                        level = levels_svd,
                        .fitted = svd_forecast)
  effect <- tibble::tibble(term = nm,
                           component = "effect",
                           level = levels_effect,
                           .fitted = effect_forecast)
  vctrs::vec_rbind(effect, svd)
}

## HAS_TESTS
#' @export
forecast_term.bage_prior_svd_rw2zero <- function(prior,
                                                 dimnames_term,
                                                 var_time,
                                                 var_age,
                                                 var_sexgender,
                                                 components,
                                                 labels_forecast) {
  con <- prior$specific$con
  dimnames_forecast <- replace(dimnames_term, var_time, list(labels_forecast))
  svd_forecast <- forecast_rw2_svd(prior = prior,
                                   dimnames_term = dimnames_term,
                                   dimnames_forecast = dimnames_forecast,
                                   var_time = var_time,
                                   var_age = var_age,
                                   var_sexgender = var_sexgender,
                                   components = components,
                                   labels_forecast)
  matrix <- make_matrix_effectfree_effect_inner(prior = prior,
                                                dimnames_term = dimnames_forecast,
                                                var_time = var_time,
                                                var_age = var_age,
                                                var_sexgender = var_sexgender,
                                                append_zero = FALSE,
                                                con = con)
  offset <- make_offset_effectfree_effect_svd(prior = prior,
                                              dimnames_term = dimnames_forecast,
                                              var_time = var_time,
                                              var_age = var_age,
                                              var_sexgender = var_sexgender)
  ## tricky combining rvecs with sparse matrices
  effect_forecast <- matrix %*% as.matrix(svd_forecast) + offset
  effect_forecast <- rvec::rvec_dbl(as.matrix(effect_forecast))
  nm <- dimnames_to_nm(dimnames_term)
  levels_effect <- dimnames_to_levels(dimnames_forecast)
  levels_svd <- make_levels_svd_term(prior = prior,
                                     dimnames_term = dimnames_forecast,
                                     var_time = var_time,
                                     var_age = var_age,
                                     var_sexgender = var_sexgender)
  svd <- tibble::tibble(term = nm,
                        component = "svd",
                        level = levels_svd,
                        .fitted = svd_forecast)
  effect <- tibble::tibble(term = nm,
                           component = "effect",
                           level = levels_effect,
                           .fitted = effect_forecast)
  vctrs::vec_rbind(effect, svd)
}


## 'generate' -----------------------------------------------------------------

#' @importFrom generics generate
#' @export
generics::generate

## HAS_TESTS
#' Generate Values from Priors
#'
#' Generate draws from priors for model terms.
#'
#' Some priors distinguish between 'along' and 'by'
#' dimensions, while others do not: see [priors]
#' for a complete list. Arguments `n_along` and `n_by`
#' are used with priors that make the distinction,
#' and argument `n_element` is used with priors that do not.
#'
#' @param x Object of class `"bage_prior"`
#' @param n_element Number of elements in term,
#' in priors that do not distinguish
#' 'along' and 'by' dimensions.
#' Default is `20`.
#' @param n_along Number of elements of
#' 'along' dimension. Default is `20`.
#' @param n_by Number of combinations of
#' 'by' variables. Default is `1`.
#' @param n_draw Number of draws. Default
#' is `25`.
#' @param ... Unused. Included for generic consistency only.
#'
#' @returns A [tibble][tibble::tibble()]
#'
#' @seealso
#' - [priors] Overview of priors implemented in **bage**
#'
#' @examples
#' ## prior that distinguishes 'along' and 'by'
#' x <- RW()
#' generate(x, n_along = 10, n_by = 2)
#'
#' ## prior that does not distinguish
#' x <- N()
#' generate(x, n_element = 20)
#'
#' ## SVD_AR(), SVD_RW(), and SVD_RW2()
#' ## distinguish 'along' and 'by'
#' x <- SVD_AR(HFD)
#' generate(x, n_along = 5, n_by = 2)
#'
#' ## SVD() does not
#' x <- SVD(HFD)
#' generate(x, n_element = 10)
#' @export
generate.bage_prior_ar <- function(x,
                                   n_along = 20,
                                   n_by = 1,
                                   n_draw = 25,
                                   ...) {
  check_has_no_dots(...)
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_efect
  coef <- draw_vals_coef(prior = x, n_sim = n_draw)
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  value <- draw_vals_ar(coef = coef,
                        sd = sd,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_known <- function(x,
                                      n_element = 20,
                                      n_draw = 25,
                                      ...) {
  if (!isTRUE(all.equal(n_element, 20))) {
    str <- str_nm_prior(x)
    cli::cli_alert("Non-default value of {.arg n_element} ignored with {.val {str}} prior.")
  }
  check_has_no_dots(...)
  value <- x$specific$values
  n_element <- length(value)
  l <- generate_prior_helper(x = x,
                             n_element = n_element,
                             n_draw = n_draw)
  value <- rep(value, times = n_draw)
  ans <- l$ans
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_lin <- function(x,
                                    n_along = 20,
                                    n_by = 1,
                                    n_draw = 25,
                                    ...) {
  check_has_no_dots(...)
  mean_slope <- x$specific$mean_slope
  sd_slope <- x$specific$sd_slope
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  slope <- draw_vals_slope(mean_slope = mean_slope,
                           sd_slope = sd_slope,
                           matrix_along_by = matrix_along_by,
                           n_sim = n_draw)
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  value <- draw_vals_lin(slope = slope,
                         sd = sd,
                         matrix_along_by = matrix_along_by,
                         labels = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}


## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_linar <- function(x,
                                      n_along = 20,
                                      n_by = 1,
                                      n_draw = 25,
                                      ...) {
  check_has_no_dots(...)
  mean_slope <- x$specific$mean_slope
  sd_slope <- x$specific$sd_slope
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  slope <- draw_vals_slope(mean_slope = mean_slope,
                           sd_slope = sd_slope,
                           matrix_along_by = matrix_along_by,
                           n_sim = n_draw)
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  coef <- draw_vals_coef(prior = x, n_sim = n_draw)
  value <- draw_vals_linar(slope = slope,
                           sd = sd,
                           coef = coef,
                           matrix_along_by = matrix_along_by,
                           labels = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}


## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_linex <- function(x,
                                      n_along = 20,
                                      n_by = 1,
                                      n_draw = 25,
                                      ...) {
  check_has_no_dots(...)
  mean_slope <- x$specific$mean_slope
  sd_slope <- x$specific$sd_slope
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  slope <- draw_vals_slope(mean_slope = mean_slope,
                           sd_slope = sd_slope,
                           matrix_along_by = matrix_along_by,
                           n_sim = n_draw)
  value <- draw_vals_lintrend(slope = slope,
                              matrix_along_by = matrix_along_by,
                              labels = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_norm <- function(x,
                                     n_element = 20,
                                     n_draw = 25,
                                     ...) {
  check_has_no_dots(...)
  l <- generate_prior_helper(x = x,
                             n_element = n_element,
                             n_draw = n_draw)
  ans <- l$ans
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  sd <- rep(sd, each = n_element)
  value <- stats::rnorm(n = n_element * n_draw, sd = sd)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_normfixed <- function(x,
                                          n_element = 20,
                                          n_draw = 25,
                                          ...) {
  check_has_no_dots(...)
  l <- generate_prior_helper(x = x,
                             n_element = n_element,
                             n_draw = n_draw)
  ans <- l$ans
  sd <- x$specific$sd
  value <- stats::rnorm(n = n_element * n_draw, sd = sd)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rwrandom <- function(x,
                                         n_along = 20,
                                         n_by = 1,
                                         n_draw = 25,
                                         ...) {
  check_has_no_dots(...)
  sd_init <- x$specific$sd
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  value <- draw_vals_rw(sd = sd_innov,
                        sd_init = sd_init,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rwrandomseasfix <- function(x,
                                                n_along = 20,
                                                n_by = 1,
                                                n_draw = 25,
                                                ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_init <- x$specific$sd
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw(sd = sd_innov,
                        sd_init = sd_init,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  seas <- draw_vals_seasfix(n_seas = n_seas,
                            sd_init = sd_init_seas,
                            matrix_along_by = matrix_along_by,
                            n_sim = n_draw)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rwrandomseasvary <- function(x,
                                                 n_along = 20,
                                                 n_by = 1,
                                                 n_draw = 25,
                                                 ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_init <- x$specific$sd
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  sd_innov_seas <- draw_vals_sd_seas(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw(sd = sd_innov,
                        sd_init = sd_init,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  seas <- draw_vals_seasvary(n_seas = n_seas,
                             sd_init = sd_init_seas,
                             sd_innov = sd_innov_seas,
                             matrix_along_by = matrix_along_by)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rwzero <- function(x,
                                       n_along = 20,
                                       n_by = 1,
                                       n_draw = 25,
                                       ...) {
  check_has_no_dots(...)
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  value <- draw_vals_rw(sd = sd_innov,
                        sd_init = 0,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rwzeroseasfix <- function(x,
                                              n_along = 20,
                                              n_by = 1,
                                              n_draw = 25,
                                              ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_init <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw(sd = sd_innov,
                        sd_init = 0,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  seas <- draw_vals_seasfix(n_seas = n_seas,
                            sd_init = sd_init,
                            matrix_along_by = matrix_along_by,
                            n_sim = n_draw)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rwzeroseasvary <- function(x,
                                               n_along = 20,
                                               n_by = 1,
                                               n_draw = 25,
                                               ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  sd_innov_seas <- draw_vals_sd_seas(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw(sd = sd_innov,
                        sd_init = 0,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect)
  seas <- draw_vals_seasvary(n_seas = n_seas,
                             sd_init = sd_init_seas,
                             sd_innov = sd_innov_seas,
                             matrix_along_by = matrix_along_by)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rw2random <- function(x,
                                          n_along = 20,
                                          n_by = 1,
                                          n_draw = 25,
                                          ...) {
  check_has_no_dots(...)
  con <- x$specific$con
  sd_init <- x$specific$sd
  sd_slope <- x$specific$sd_slope
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  value <- draw_vals_rw2(sd = sd,
                         sd_init = sd_init,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rw2randomseasfix <- function(x,
                                                 n_along = 20,
                                                 n_by = 1,
                                                 n_draw = 25,
                                                 ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_init <- x$specific$sd
  sd_slope <- x$specific$sd_slope
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw2(sd = sd_innov,
                         sd_init = sd_init,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect)
  seas <- draw_vals_seasfix(n_seas = n_seas,
                            sd_init = sd_init_seas,
                            matrix_along_by = matrix_along_by,
                            n_sim = n_draw)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rw2randomseasvary <- function(x,
                                                  n_along = 20,
                                                  n_by = 1,
                                                  n_draw = 25,
                                                  ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_init <- x$specific$sd
  sd_slope <- x$specific$sd_slope
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  sd_innov_seas <- draw_vals_sd_seas(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw2(sd = sd_innov,
                         sd_init = sd_init,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect)
  seas <- draw_vals_seasvary(n_seas = n_seas,
                             sd_init = sd_init_seas,
                             sd_innov = sd_innov_seas,
                             matrix_along_by = matrix_along_by)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rw2zero <- function(x,
                                        n_along = 20,
                                        n_by = 1,
                                        n_draw = 25,
                                        ...) {
  check_has_no_dots(...)
  sd_slope <- x$specific$sd_slope
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  value <- draw_vals_rw2(sd = sd,
                         sd_init = 0,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect)
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rw2zeroseasfix <- function(x,
                                               n_along = 20,
                                               n_by = 1,
                                               n_draw = 25,
                                               ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_slope <- x$specific$sd_slope
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw2(sd = sd_innov,
                         sd_init = 0,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect)
  seas <- draw_vals_seasfix(n_seas = n_seas,
                            sd_init = sd_init_seas,
                            matrix_along_by = matrix_along_by,
                            n_sim = n_draw)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_rw2zeroseasvary <- function(x,
                                                n_along = 20,
                                                n_by = 1,
                                                n_draw = 25,
                                                ...) {
  check_has_no_dots(...)
  n_seas <- x$specific$n_seas
  sd_slope <- x$specific$sd_slope
  sd_init_seas <- x$specific$sd_seas
  con <- x$specific$con
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  matrix_along_by <- l$matrix_along_by
  levels_effect <- l$levels_effect
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  sd_innov_seas <- draw_vals_sd_seas(prior = x, n_sim = n_draw)
  alpha <- draw_vals_rw2(sd = sd_innov,
                         sd_slope = sd_slope,
                         sd_init = 0,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect)
  seas <- draw_vals_seasvary(n_seas = n_seas,
                             sd_init = sd_init_seas,
                             sd_innov = sd_innov_seas,
                             matrix_along_by = matrix_along_by)
  value <- alpha + seas
  if (con == "by") {
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_spline <- function(x,
                                       n_along = 20,
                                       n_by = 1,
                                       n_draw = 25,
                                       ...) {
  check_has_no_dots(...)
  con <- x$specific$con
  sd_init <- x$specific$sd
  sd_slope <- x$specific$sd_slope
  l <- generate_prior_helper(x = x,
                             n_along = n_along,
                             n_by = n_by,
                             n_draw = n_draw)
  ans <- l$ans
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  n_comp <- get_n_comp_spline(prior = x, n_along = n_along)
  matrix_along_by <- matrix(seq_len(n_comp * n_by) - 1L,
                            nrow = n_comp,
                            ncol = n_by)
  levels_spline <- seq_len(n_comp * n_by)
  rw2 <- draw_vals_rw2(sd = sd,
                       sd_init = sd_init,
                       sd_slope = sd_slope,
                       matrix_along_by = matrix_along_by,
                       levels_effect = levels_spline)
  rw2 <- matrix(rw2, nrow = n_comp, ncol = n_by * n_draw)
  m <- make_matrix_spline(n_along = n_along,
                          n_comp = n_comp)
  value <- m %*% rw2
  if (con == "by") {
    value <- matrix(value, nrow = n_along * n_by, ncol = n_draw)
    m <- make_matrix_con_by(i_along = 1L, dim = c(n_along, n_by))
    value <- m %*% value
  }
  value <- as.double(value)
  ans$value <- value
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_svd <- function(x,
                                    n_element = 1,
                                    n_draw = 25,
                                    ...) {
  check_has_no_dots(...)
  l <- generate_prior_svd_helper(x = x,
                                 n_element = n_element,
                                 n_draw = n_draw)
  ans <- l$ans
  matrix <- l$matrix
  offset <- l$offset
  sd <- rep(1, times = n_draw)
  labels <- seq_len(ncol(matrix))
  alpha <- draw_vals_norm(sd = sd, labels = labels)
  value <- matrix %*% alpha + offset
  ans$value <- as.double(value)
  ans
}


## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_svd_ar <- function(x,
                                       n_along = 5,
                                       n_by = 1,
                                       n_draw = 25,
                                       ...) {
  check_has_no_dots(...)
  con <- x$specific$con
  l <- generate_prior_svd_helper(x = x,
                                 n_along = n_along,
                                 n_by = n_by,
                                 n_draw = n_draw)
  ans <- l$ans
  matrix <- l$matrix
  offset <- l$offset
  matrix_along_by <- l$matrix_along_by
  coef <- draw_vals_coef(prior = x, n_sim = n_draw)
  sd <- draw_vals_sd(prior = x, n_sim = n_draw)
  n_level_svd <- length(matrix_along_by)
  levels_effect_svd <- seq_len(n_level_svd)
  alpha <- draw_vals_ar(coef = coef,
                        sd = sd,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect_svd)
  value <- matrix %*% alpha + offset
  if (con == "by") {
    n_level_agesex <- nrow(matrix)
    n_agesex <- n_level_agesex %/% (n_by * n_along)
    m <- make_matrix_con_by(i_along = 3L, dim = c(n_agesex, n_by, n_along))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_svd_rwrandom <- function(x,
                                             n_along = 5,
                                             n_by = 1,
                                             n_draw = 25,
                                             ...) {
  check_has_no_dots(...)
  sd_init <- x$specific$sd
  con <- x$specific$con
  l <- generate_prior_svd_helper(x = x,
                                 n_along = n_along,
                                 n_by = n_by,
                                 n_draw = n_draw)
  ans <- l$ans
  matrix <- l$matrix
  offset <- l$offset
  matrix_along_by <- l$matrix_along_by
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  n_level_svd <- length(matrix_along_by)
  levels_effect_svd <- seq_len(n_level_svd)
  alpha <- draw_vals_rw(sd = sd_innov,
                        sd_init = sd_init,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect_svd)
  value <- matrix %*% alpha + offset
  if (con == "by") {
    n_level_agesex <- nrow(matrix)
    n_agesex <- n_level_agesex %/% (n_by * n_along)
    m <- make_matrix_con_by(i_along = 3L, dim = c(n_agesex, n_by, n_along))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_svd_rwzero <- function(x,
                                           n_along = 5,
                                           n_by = 1,
                                           n_draw = 25,
                                           ...) {
  check_has_no_dots(...)
  con <- x$specific$con
  l <- generate_prior_svd_helper(x = x,
                                 n_along = n_along,
                                 n_by = n_by,
                                 n_draw = n_draw)
  ans <- l$ans
  matrix <- l$matrix
  offset <- l$offset
  matrix_along_by <- l$matrix_along_by
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  n_level_svd <- length(matrix_along_by)
  levels_effect_svd <- seq_len(n_level_svd)
  alpha <- draw_vals_rw(sd = sd_innov,
                        sd_init = 0,
                        matrix_along_by = matrix_along_by,
                        levels_effect = levels_effect_svd)
  value <- matrix %*% alpha + offset
  if (con == "by") {
    n_level_agesex <- nrow(matrix)
    n_agesex <- n_level_agesex %/% (n_by * n_along)
    m <- make_matrix_con_by(i_along = 3L, dim = c(n_agesex, n_by, n_along))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_svd_rw2random <- function(x,
                                              n_along = 5,
                                              n_by = 1,
                                              n_draw = 25,
                                              ...) {
  check_has_no_dots(...)
  sd_init <- x$specific$sd
  sd_slope <- x$specific$sd_slope
  con <- x$specific$con
  l <- generate_prior_svd_helper(x = x,
                                 n_along = n_along,
                                 n_by = n_by,
                                 n_draw = n_draw)
  ans <- l$ans
  matrix <- l$matrix
  offset <- l$offset
  matrix_along_by <- l$matrix_along_by
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  n_level_svd <- length(matrix_along_by)
  levels_effect_svd <- seq_len(n_level_svd)
  alpha <- draw_vals_rw2(sd = sd_innov,
                         sd_init = sd_init,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect_svd)
  value <- matrix %*% alpha + offset
  if (con == "by") {
    n_level_agesex <- nrow(matrix)
    n_agesex <- n_level_agesex %/% (n_by * n_along)
    m <- make_matrix_con_by(i_along = 3L, dim = c(n_agesex, n_by, n_along))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}

## HAS_TESTS
#' @rdname generate.bage_prior_ar
#' @export
generate.bage_prior_svd_rw2zero <- function(x,
                                            n_along = 5,
                                            n_by = 1,
                                            n_draw = 25,
                                            ...) {
  check_has_no_dots(...)
  sd_slope <- x$specific$sd_slope
  con <- x$specific$con
  l <- generate_prior_svd_helper(x = x,
                                 n_along = n_along,
                                 n_by = n_by,
                                 n_draw = n_draw)
  ans <- l$ans
  matrix <- l$matrix
  offset <- l$offset
  matrix_along_by <- l$matrix_along_by
  sd_innov <- draw_vals_sd(prior = x, n_sim = n_draw)
  n_level_svd <- length(matrix_along_by)
  levels_effect_svd <- seq_len(n_level_svd)
  alpha <- draw_vals_rw2(sd = sd_innov,
                         sd_init = 0,
                         sd_slope = sd_slope,
                         matrix_along_by = matrix_along_by,
                         levels_effect = levels_effect_svd)
  value <- matrix %*% alpha + offset
  if (con == "by") {
    n_level_agesex <- nrow(matrix)
    n_agesex <- n_level_agesex %/% (n_by * n_along)
    m <- make_matrix_con_by(i_along = 3L, dim = c(n_agesex, n_by, n_along))
    value <- m %*% value
  }
  ans$value <- as.double(value)
  ans
}


## 'has_hyperrandfree' ------------------------------------------------------------

#' Has Hyper-Parameters that can be Treated as Random Effects
#'
#' @param prior Object of class 'bage_prior'
#'
#' @returns TRUE or FALSE.
#'
#' @noRd
has_hyperrandfree <- function(prior) {
  UseMethod("has_hyperrandfree")
}

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior <- function(prior) FALSE


## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_lin <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_linar <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rwrandomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rwrandomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rwzeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rwzeroseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rw2randomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rw2randomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rw2zeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
has_hyperrandfree.bage_prior_rw2zeroseasvary <- function(prior) TRUE


## 'infer_trend_cyc_seas_err_forecast_one' ---------------------------------------------------

#' Derive Parts of 'Components' Output Dealing with a
#' Prior that has Hyper-Parameters Treated as Random Effects - Forecasts
#'
#' In all priors with 'hyperrand' elements, the reformatting involves
#' renaming columns. 
#'
#' @param prior Object of class 'bage_prior'.
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param matrix_along_by Matrix with mapping for along, by dimensions
#' @param components A data frame.
#'
#' @returns A modifed version of 'components'
#'
#' @noRd
infer_trend_cyc_seas_err_forecast_one <- function(prior,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  components) {
  UseMethod("infer_trend_cyc_seas_err_forecast_one")
}

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior <- function(prior,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             components)
  components

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_linar <- function(prior,
                                                                   dimnames_term,
                                                                   var_time,
                                                                   var_age,
                                                                   components) {
  nm <- dimnames_to_nm(dimnames_term)
  is_effect <- with(components, (term == nm) & (component == "effect"))
  is_trend <- with(components, (term == nm) & (component == "trend"))
  is_error <- with(components, (term == nm) & (component == "error"))
  effect <- components$.fitted[is_effect]
  trend <- components$.fitted[is_trend]
  error <- effect - trend
  components$.fitted[is_error] <- error
  components
}

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rwrandomseasfix <- function(prior,
                                                                             dimnames_term,
                                                                             var_time,
                                                                             var_age,
                                                                             components)
  infer_trend_cyc_seas_err_seasfix_forecast(prior = prior,
                                            dimnames_term = dimnames_term,
                                            var_time = var_time,
                                            var_age = var_age,
                                            components = components)

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rwrandomseasvary <- function(prior,
                                                                              dimnames_term,
                                                                              var_time,
                                                                              var_age,
                                                                              components)
  infer_trend_cyc_seas_err_seasvary_forecast(prior = prior,
                                             dimnames_term = dimnames_term,
                                             var_time = var_time,
                                             var_age = var_age,
                                             components = components)
## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rwzeroseasfix <- function(prior,
                                                                           dimnames_term,
                                                                           var_time,
                                                                           var_age,
                                                                           components)
  infer_trend_cyc_seas_err_seasfix_forecast(prior = prior,
                                            dimnames_term = dimnames_term,
                                            var_time = var_time,
                                            var_age = var_age,
                                            components = components)

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rwzeroseasvary <- function(prior,
                                                                            dimnames_term,
                                                                            var_time,
                                                                            var_age,
                                                                            components)
  infer_trend_cyc_seas_err_seasvary_forecast(prior = prior,
                                             dimnames_term = dimnames_term,
                                             var_time = var_time,
                                             var_age = var_age,
                                             components = components)

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2randomseasfix <- function(prior,
                                                                              dimnames_term,
                                                                              var_time,
                                                                              var_age,
                                                                              components)
  infer_trend_cyc_seas_err_seasfix_forecast(prior = prior,
                                            dimnames_term = dimnames_term,
                                            var_time = var_time,
                                            var_age = var_age,
                                            components = components)

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2randomseasvary <- function(prior,
                                                                               dimnames_term,
                                                                               var_time,
                                                                               var_age,
                                                                               components)
  infer_trend_cyc_seas_err_seasvary_forecast(prior = prior,
                                             dimnames_term = dimnames_term,
                                             var_time = var_time,
                                             var_age = var_age,
                                             components = components)

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2zeroseasfix <- function(prior,
                                                                            dimnames_term,
                                                                            var_time,
                                                                            var_age,
                                                                            components)
  infer_trend_cyc_seas_err_seasfix_forecast(prior = prior,
                                            dimnames_term = dimnames_term,
                                            var_time = var_time,
                                            var_age = var_age,
                                            components = components)

## HAS_TESTS
#' @export
infer_trend_cyc_seas_err_forecast_one.bage_prior_rw2zeroseasvary <- function(prior,
                                                                             dimnames_term,
                                                                             var_time,
                                                                             var_age,
                                                                             components)
  infer_trend_cyc_seas_err_seasvary_forecast(prior = prior,
                                             dimnames_term = dimnames_term,
                                             var_time = var_time,
                                             var_age = var_age,
                                             components = components)


## 'is_known' -----------------------------------------------------------------

#' Test whether a prior treats an intercept,
#' main effect, or interaction as known and fixed
#'
#' @param prior An object of class 'bage_prior'.
#'
#' @returns TRUE or FALSE
#'
#' @noRd
is_known <- function(prior) {
  UseMethod("is_known")
}

## HAS_TESTS
#' @export
is_known.bage_prior <- function(prior) FALSE

## HAS_TESTS
#' @export
is_known.bage_prior_known <- function(prior) TRUE


## 'is_prior_ok_for_term' -----------------------------------------------------

#' Test whether a prior can be used with
#' a particular effect or interaction
#'
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#'
#' @returns TRUE or raises an error
#'
#' @noRd
is_prior_ok_for_term <- function(prior,
                                 dimnames_term,
                                 var_time,
                                 var_age,
                                 var_sexgender) {
  UseMethod("is_prior_ok_for_term")
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_ar <- function(prior,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender) {
  n_coef <- prior$specific$n_coef
  con <- prior$specific$con
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = n_coef + 1L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_known <- function(prior,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender) {
  values <- prior$specific$values
  nm <- dimnames_to_nm(dimnames_term)
  n_values <- length(values)
  length_effect <- prod(lengths(dimnames_term))
  if (n_values != length_effect) {
    str <- str_call_prior(prior)
    cli::cli_abort(c("{.var {str}} prior for {.var {nm}} term invalid.",
                     i = "Prior specifies {n_values} element{?s}.",
                     i = "{.var {nm}} has {length_effect} element{?s}."))
  }
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_lin <- function(prior,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 2L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_linar <- function(prior,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender) {
  con <- prior$specific$con  
  n_coef <- prior$specific$n_coef
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = n_coef + 1L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_linex <- function(prior,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 2L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_norm <- function(prior,
                                                 dimnames_term,
                                                 var_time,
                                                 var_age,
                                                 var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  length_effect <- prod(lengths(dimnames_term))
  check_length_effect_ge(length_effect = length_effect,
                         min = 1L,
                         nm = nm,
                         prior = prior)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_normfixed <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  length_effect <- prod(lengths(dimnames_term))
  check_length_effect_ge(length_effect = length_effect,
                         min = 1L,
                         nm = nm,
                         prior = prior)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rwrandom <- function(prior,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 3L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rwrandomseasfix <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 3L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rwrandomseasvary <- function(prior,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 3L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rwzero <- function(prior,
                                               dimnames_term,
                                               var_time,
                                               var_age,
                                               var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 3L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rwzeroseasfix <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 3L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rwzeroseasvary <- function(prior,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 3L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2infant <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_prior_age(prior = prior,
                  nm = nm,
                  var_age = var_age)
  check_n_along_ge(n_along = n_along,
                   min = 4L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2random <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 4L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}


## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2randomseasfix <- function(prior,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 4L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2randomseasvary <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 4L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2zero <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 4L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}


## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2zeroseasfix <- function(prior,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 4L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_rw2zeroseasvary <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  n_seas <- prior$specific$n_seas
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = max(n_seas, 4L),
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_spline <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender) {
  con <- prior$specific$con  
  nm <- dimnames_to_nm(dimnames_term)
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_length_effect_ge(length_effect = n_along,
                         min = 4L,
                         nm = nm,
                         prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_svd <- function(prior,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  agesex <- make_agesex(nm = nm,
                        var_age = var_age,
                        var_sexgender = var_sexgender)
  check_svd_agesex(prior = prior,
                   nm = nm,
                   var_age = var_age,
                   agesex = agesex)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_svd_ar <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  agesex <- make_agesex(nm = nm,
                        var_age = var_age,
                        var_sexgender = var_sexgender)
  check_svd_agesex(prior = prior,
                   nm = nm,
                   var_age = var_age,
                   agesex = agesex)
  check_prior_time(prior = prior,
                 nm = nm,
                 var_time = var_time)
  con <- prior$specific$con  
  n_coef <- prior$specific$n_coef
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = n_coef + 1L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_svd_rwrandom <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  agesex <- make_agesex(nm = nm,
                        var_age = var_age,
                        var_sexgender = var_sexgender)
  check_svd_agesex(prior = prior,
                   nm = nm,
                   var_age = var_age,
                   agesex = agesex)
  check_prior_time(prior = prior,
                   nm = nm,
                   var_time = var_time)
  con <- prior$specific$con  
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 3L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}


## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_svd_rwzero <- function(prior,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  agesex <- make_agesex(nm = nm,
                        var_age = var_age,
                        var_sexgender = var_sexgender)
  check_svd_agesex(prior = prior,
                   nm = nm,
                   var_age = var_age,
                   agesex = agesex)
  check_prior_time(prior = prior,
                   nm = nm,
                   var_time = var_time)
  con <- prior$specific$con  
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 3L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}


## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_svd_rw2random <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  agesex <- make_agesex(nm = nm,
                        var_age = var_age,
                        var_sexgender = var_sexgender)
  check_svd_agesex(prior = prior,
                   nm = nm,
                   var_age = var_age,
                   agesex = agesex)
  check_prior_time(prior = prior,
                   nm = nm,
                   var_time = var_time)
  con <- prior$specific$con  
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 4L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}

## HAS_TESTS
#' @export
is_prior_ok_for_term.bage_prior_svd_rw2zero <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  nm <- dimnames_to_nm(dimnames_term)
  agesex <- make_agesex(nm = nm,
                        var_age = var_age,
                        var_sexgender = var_sexgender)
  check_svd_agesex(prior = prior,
                   nm = nm,
                   var_age = var_age,
                   agesex = agesex)
  check_prior_time(prior = prior,
                   nm = nm,
                   var_time = var_time)
  con <- prior$specific$con  
  matrix_along_by_effect <- make_matrix_along_by_effect(prior = prior,
                                                        dimnames_term = dimnames_term,
                                                        var_time = var_time,
                                                        var_age = var_age)
  n_along <- nrow(matrix_along_by_effect)
  n_by <- ncol(matrix_along_by_effect)
  check_n_along_ge(n_along = n_along,
                   min = 4L,
                   nm = nm,
                   prior = prior)
  check_con_n_by(con = con,
                 n_by = n_by,
                 nm = nm)
  invisible(TRUE)
}


## 'is_spline' -------------------------------------------------------------------

#' Test Whether Prior is Spline Prior
#'
#' @param prior An object of class 'bage_prior'.
#'
#' @returns TRUE or FALSE
#'
#' @noRd
is_spline <- function(prior) {
  UseMethod("is_spline")
}

## HAS_TESTS
#' @export
is_spline.bage_prior <- function(prior) FALSE

## HAS_TESTS
#' @export
is_spline.bage_prior_spline <- function(prior) TRUE


## 'is_svd' -------------------------------------------------------------------

#' Test Whether Prior is SVD Prior
#'
#' @param prior An object of class 'bage_prior'.
#'
#' @returns TRUE or FALSE
#'
#' @noRd
is_svd <- function(prior) {
  UseMethod("is_svd")
}

## HAS_TESTS
#' @export
is_svd.bage_prior <- function(prior) FALSE

## HAS_TESTS
#' @export
is_svd.bage_prior_svd <- function(prior) TRUE

## HAS_TESTS
#' @export
is_svd.bage_prior_svd_ar <- function(prior) TRUE

## HAS_TESTS
#' @export
is_svd.bage_prior_svd_rwrandom <- function(prior) TRUE

## HAS_TESTS
#' @export
is_svd.bage_prior_svd_rwzero <- function(prior) TRUE

## HAS_TESTS
#' @export
is_svd.bage_prior_svd_rw2random <- function(prior) TRUE

## HAS_TESTS
#' @export
is_svd.bage_prior_svd_rw2zero <- function(prior) TRUE


## 'length_hyperrandfree' -----------------------------------------------------

#' Lengths of Hyper-Parameters that Can Be Treated as Random Effects
#'
#' Most priors don't have hyper-parameters that can be treated
#' as random effects, so default value 0
#' 
#' @param prior An object of class 'bage_prior'.
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#'
#' @returns A character vector.
#'
#' @noRd
length_hyperrandfree <- function(prior,
                                 dimnames_term,
                                 var_time,
                                 var_age,
                                 var_sexgender) {
  UseMethod("length_hyperrandfree")
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior <- function(prior,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender) {
  0L
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_lin <- function(prior,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender) {
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  ncol(matrix_along_by_effectfree)
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_linar <- function(prior,
                                                  dimnames_term,
                                                  var_time,
                                                  var_age,
                                                  var_sexgender) {
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  ncol(matrix_along_by_effectfree)
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rwrandomseasfix <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_by <- ncol(matrix_along_by_effectfree)
  (n_seas - 1L) * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rwrandomseasvary <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                 var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_along <- nrow(matrix_along_by_effectfree)
  n_by <- ncol(matrix_along_by_effectfree)
  s <- seq_len(n_along) - 1L
  is_last_season <- (s %% n_seas) == n_seas - 1L
  n_seas_free <- sum(!is_last_season)
  n_seas_free * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rwzeroseasfix <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_by <- ncol(matrix_along_by_effectfree)
  (n_seas - 2L) * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rwzeroseasvary <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                 var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_along <- nrow(matrix_along_by_effectfree)
  n_by <- ncol(matrix_along_by_effectfree)
  s <- seq_len(n_along) - 1L
  is_first_period <- s == 0L
  is_last_season <- (s %% n_seas) == n_seas - 1L
  n_seas_free <- sum(!is_first_period & !is_last_season)
  n_seas_free * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rw2randomseasfix <- function(prior,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_by <- ncol(matrix_along_by_effectfree)
  (n_seas - 1L) * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rw2randomseasvary <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_along <- nrow(matrix_along_by_effectfree)
  n_by <- ncol(matrix_along_by_effectfree)
  s <- seq_len(n_along) - 1L
  is_last_season <- (s %% n_seas) == n_seas - 1L
  n_seas_free <- sum(!is_last_season)
  n_seas_free * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rw2zeroseasfix <- function(prior,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_by <- ncol(matrix_along_by_effectfree)
  (n_seas - 2L) * n_by
}

## HAS_TESTS
#' @export
length_hyperrandfree.bage_prior_rw2zeroseasvary <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  n_seas <- prior$specific$n_seas
  matrix_along_by_effectfree <- make_matrix_along_by_effectfree(prior = prior,
                                                                dimnames_term = dimnames_term,
                                                                var_time = var_time,
                                                                var_age = var_age,
                                                                var_sexgender = var_sexgender)
  n_along <- nrow(matrix_along_by_effectfree)
  n_by <- ncol(matrix_along_by_effectfree)
  s <- seq_len(n_along) - 1L
  is_first_period <- s == 0L
  is_last_season <- (s %% n_seas) == n_seas - 1L
  n_seas_free <- sum(!is_first_period & !is_last_season)
  n_seas_free * n_by
}
## 'levels_hyper' -------------------------------------------------------------

#' Names of hyper-parameters
#'
#' @param prior An object of class 'bage_prior'.
#'
#' @returns A character vector.
#'
#' @noRd
levels_hyper <- function(prior) {
  UseMethod("levels_hyper")
}

## HAS_TESTS
#' @export
levels_hyper.bage_prior_ar <- function(prior) {
  n_coef <- prior$specific$n_coef
  if (n_coef == 1L)
    coef <- "coef"
  else
    coef <- paste0("coef", seq_len(n_coef))
  c(coef, "sd")
}

## HAS_TESTS
#' @export
levels_hyper.bage_prior_known <- function(prior)
  character()

## HAS_TESTS
#' @export
levels_hyper.bage_prior_lin <- function(prior) {
  "sd"
}

## HAS_TESTS
#' @export
levels_hyper.bage_prior_linar <- function(prior) {
  n_coef <- prior$specific$n_coef
  if (n_coef == 1L)
    coef <- "coef"
  else
    coef <- paste0("coef", seq_len(n_coef))
  c(coef, "sd")
}

## HAS_TESTS
#' @export
levels_hyper.bage_prior_linex <- function(prior) {
  character()
}

## HAS_TESTS
#' @export
levels_hyper.bage_prior_norm <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_normfixed <- function(prior)
  character()

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rwrandom <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rwrandomseasfix <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rwrandomseasvary <- function(prior)
  c("sd_seas", "sd")

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rwzero <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rwzeroseasfix <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rwzeroseasvary <- function(prior)
  c("sd_seas", "sd")

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2infant <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2random <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2randomseasfix <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2randomseasvary <- function(prior)
  c("sd_seas", "sd")

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2zero <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2zeroseasfix <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_rw2zeroseasvary <- function(prior)
  c("sd_seas", "sd")

## HAS_TESTS
#' @export
levels_hyper.bage_prior_spline <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_svd <- function(prior)
  character()

## HAS_TESTS
#' @export
levels_hyper.bage_prior_svd_ar <- function(prior) {
  n_coef <- prior$specific$n_coef
  if (n_coef == 1L)
    coef <- "coef"
  else
    coef <- paste0("coef", seq_len(n_coef))
  c(coef, "sd")
}

## HAS_TESTS
#' @export
levels_hyper.bage_prior_svd_rwrandom <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_svd_rwzero <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_svd_rw2random <- function(prior)
  "sd"

## HAS_TESTS
#' @export
levels_hyper.bage_prior_svd_rw2zero <- function(prior)
  "sd"


## 'levels_hyperrand' ---------------------------------------------------------

#' Names of Hyper-Parameters that Can Be Treated as Random Effects
#'
#' Most priors don't have hyper-parameters that can be treated
#' as random effects, so default value is a character vector
#' of length 0.
#' 
#' @param prior An object of class 'bage_prior'.
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#'
#' @returns A character vector.
#'
#' @noRd
levels_hyperrand <- function(prior, dimnames_term, var_age, var_time) {
  UseMethod("levels_hyperrand")
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior <- function(prior, dimnames_term, var_age, var_time) {
  character()
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_lin <- function(prior, dimnames_term, var_age, var_time) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  if (length(dimnames_term) > 1L) {
    levels_by <- dimnames_to_levels(dimnames_term[-i_along])
    slope <- paste("slope", levels_by, sep = ".")
  }
  else
    slope <- "slope"
  levels <- dimnames_to_levels(dimnames_term)
  c(slope, levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_linar <- function(prior, dimnames_term, var_age, var_time) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  if (length(dimnames_term) > 1L) {
    levels_by <- dimnames_to_levels(dimnames_term[-i_along])
    slope <- paste("slope", levels_by, sep = ".")
  }
  else
    slope <- "slope"
  levels <- dimnames_to_levels(dimnames_term)
  c(slope, levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rwrandomseasfix <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rwrandomseasvary <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rwzeroseasfix <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rwzeroseasvary <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rw2randomseasfix <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rw2randomseasvary <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rw2zeroseasfix <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}

## HAS_TESTS
#' @export
levels_hyperrand.bage_prior_rw2zeroseasvary <- function(prior, dimnames_term, var_age, var_time) {
  levels <- dimnames_to_levels(dimnames_term)
  c(levels, levels)
}


## 'make_hyperrand_one' -------------------------------------------------------

#' Derive Values From Hyper-Parameters Treated as Random Effects
#'
#' @param prior Object of class 'bage_prior'.
#' @param hyperrandfree Values for unconstrained hyper-parameters. An rvec.
#' @param effectfree Values for unconstrained effect. An rvec.
#' @param dimnames_term Dimnames for array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#'
#' @returns An rvec or NULL
#'
#' @noRd
make_hyperrand_one <- function(prior,
                               hyperrandfree,
                               effectfree,
                               dimnames_term,
                               var_time,
                               var_age,
                               var_sexgender) {
  UseMethod("make_hyperrand_one")
}

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior <- function(prior,
                                          hyperrandfree,
                                          effectfree,
                                          dimnames_term,
                                          var_time,
                                          var_age,
                                          var_sexgender)
  NULL

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_lin <- function(prior,
                                              hyperrandfree,
                                              effectfree,
                                              dimnames_term,
                                              var_time,
                                              var_age,
                                              var_sexgender)
  make_hyperrand_lin(prior = prior,
                     hyperrandfree = hyperrandfree,
                     effectfree = effectfree,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age,
                     var_sexgender = var_sexgender)


## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_linar <- function(prior,
                                                hyperrandfree,
                                                effectfree,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender)
  make_hyperrand_lin(prior = prior,
                     hyperrandfree = hyperrandfree,
                     effectfree = effectfree,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age,
                     var_sexgender = var_sexgender)
  

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rwrandomseasfix <- function(prior,
                                                          hyperrandfree,
                                                          effectfree,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender)
  make_hyperrand_randomseasfix(prior = prior,
                               hyperrandfree = hyperrandfree,
                               effectfree = effectfree,
                               dimnames_term = dimnames_term,
                               var_time = var_time,
                               var_age = var_age,
                               var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rwrandomseasvary <- function(prior,
                                                           hyperrandfree,
                                                           effectfree,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           var_sexgender)
  make_hyperrand_randomseasvary(prior = prior,
                                hyperrandfree = hyperrandfree,
                                effectfree = effectfree,
                                dimnames_term = dimnames_term,
                                var_time = var_time,
                                var_age = var_age,
                                var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rwzeroseasfix <- function(prior,
                                                        hyperrandfree,
                                                        effectfree,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender)
  make_hyperrand_zeroseasfix(prior = prior,
                             hyperrandfree = hyperrandfree,
                             effectfree = effectfree,
                             dimnames_term = dimnames_term,
                             var_time = var_time,
                             var_age = var_age,
                             var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rwzeroseasvary <- function(prior,
                                                         hyperrandfree,
                                                         effectfree,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender)
  make_hyperrand_zeroseasvary(prior = prior,
                              hyperrandfree = hyperrandfree,
                              effectfree = effectfree,
                              dimnames_term = dimnames_term,
                              var_time = var_time,
                              var_age = var_age,
                              var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rw2randomseasfix <- function(prior,
                                                           hyperrandfree,
                                                           effectfree,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           var_sexgender)
  make_hyperrand_randomseasfix(prior = prior,
                               hyperrandfree = hyperrandfree,
                               effectfree = effectfree,
                               dimnames_term = dimnames_term,
                               var_time = var_time,
                               var_age = var_age,
                               var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rw2randomseasvary <- function(prior,
                                                            hyperrandfree,
                                                            effectfree,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender)
  make_hyperrand_randomseasvary(prior = prior,
                                hyperrandfree = hyperrandfree,
                                effectfree = effectfree,
                                dimnames_term = dimnames_term,
                                var_time = var_time,
                                var_age = var_age,
                                var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rw2zeroseasfix <- function(prior,
                                                         hyperrandfree,
                                                         effectfree,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender)
  make_hyperrand_zeroseasfix(prior = prior,
                             hyperrandfree = hyperrandfree,
                             effectfree = effectfree,
                             dimnames_term = dimnames_term,
                             var_time = var_time,
                             var_age = var_age,
                             var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_hyperrand_one.bage_prior_rw2zeroseasvary <- function(prior,
                                                          hyperrandfree,
                                                          effectfree,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender)
  make_hyperrand_zeroseasvary(prior = prior,
                              hyperrandfree = hyperrandfree,
                              effectfree = effectfree,
                              dimnames_term = dimnames_term,
                              var_time = var_time,
                              var_age = var_age,
                              var_sexgender = var_sexgender)


## 'make_i_along' -------------------------------------------------------------

## HAS_TESTS
#' Find the Index of the Along Dimension,
#' Throwing an Error If Cannot be Found
#'
#' If 'along' is non-NULL, look for a dimension
#' with that name. Otherwise, use the dimension
#' identified by 'var_time', or by 'var_age'.
#'
#' @param Object of class 'bage_prior'
#' @param dimnames_term Dimnames for array
#' representing term
#' @param var_time Name of the time dimension, or NULL
#' @param var_age Name of the age dimension, or NULL
#'
#' @returns An integer
#'
#' @noRd
make_i_along <- function(prior, dimnames_term, var_time, var_age) {
  UseMethod("make_i_along")
}

## HAS_TESTS
#' @export
make_i_along.bage_prior <- function(prior, dimnames_term, var_time, var_age) {
  1L
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_ar <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_lin <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_linar <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_linex <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rwrandom <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rwrandomseasfix <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rwrandomseasvary <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rwzero <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rwzeroseasfix <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rwzeroseasvary <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2infant <- function(prior, dimnames_term, var_time, var_age) {
  make_i_along_agetime(prior = prior,
                       dimnames_term = dimnames_term,
                       var_time = var_time,
                       var_age = var_age,
                       agetime = "age")
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2random <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2randomseasfix <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2randomseasvary <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2zero <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2zeroseasfix <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_rw2zeroseasvary <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_spline <- function(prior, dimnames_term, var_time, var_age) {
  along <- prior$specific$along
  make_i_along_inner(along = along,
                     dimnames_term = dimnames_term,
                     var_time = var_time,
                     var_age = var_age)
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_svd_ar <- function(prior, dimnames_term, var_time, var_age) {
  make_i_along_agetime(prior = prior,
                       dimnames_term = dimnames_term,
                       var_time = var_time,
                       var_age = var_age,
                       agetime = "time")
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_svd_rwrandom <- function(prior, dimnames_term, var_time, var_age) {
  make_i_along_agetime(prior = prior,
                       dimnames_term = dimnames_term,
                       var_time = var_time,
                       var_age = var_age,
                       agetime = "time")
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_svd_rwzero <- function(prior, dimnames_term, var_time, var_age) {
  make_i_along_agetime(prior = prior,
                       dimnames_term = dimnames_term,
                       var_time = var_time,
                       var_age = var_age,
                       agetime = "time")
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_svd_rw2random <- function(prior, dimnames_term, var_time, var_age) {
  make_i_along_agetime(prior = prior,
                       dimnames_term = dimnames_term,
                       var_time = var_time,
                       var_age = var_age,
                       agetime = "time")
}

## HAS_TESTS
#' @export
make_i_along.bage_prior_svd_rw2zero <- function(prior, dimnames_term, var_time, var_age) {
  make_i_along_agetime(prior = prior,
                       dimnames_term = dimnames_term,
                       var_time = var_time,
                       var_age = var_age,
                       agetime = "time")
}


## 'make_matrix_along_by_effectfree' ------------------------------------------

#' Make a 'matrix_along_by' Matrix for Free Parameters for One Term
#'
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames for array
#' representing term
#' @param var_time Name of time variable, or NULL
#' @param var_age Name of age variable, or NULL
#' @param var_sexgender Name of sexgender variable, or NULL
#'
#' @returns A matrix.
#'
#' @noRd
make_matrix_along_by_effectfree <- function(prior,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender) {
  UseMethod("make_matrix_along_by_effectfree")
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior <- function(prior,
                                                       dimnames_term,
                                                       var_time,
                                                       var_age,
                                                       var_sexgender) {
  n_dim <- length(dimnames_term)
  if (n_dim == 0L) {
    matrix(0L, nrow = 1L)
  }
  else {
    dim <- lengths(dimnames_term)
    make_matrix_along_by_inner(i_along = 1L,
                               dim = dim)
  }
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_ar <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_lin <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_linar <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_linex <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rwrandom <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rwrandomseasfix <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rwrandomseasvary <- function(prior,
                                                                  dimnames_term,
                                                                  var_time,
                                                                  var_age,
                                                                  var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}


## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rwzero <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = TRUE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rwzeroseasfix <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rwzeroseasvary <- function(prior,
                                                                  dimnames_term,
                                                                  var_time,
                                                                  var_age,
                                                                  var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2infant <- function(prior,
                                                                 dimnames_term,
                                                                 var_time,
                                                                 var_age,
                                                                 var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2random <- function(prior,
                                                                 dimnames_term,
                                                                 var_time,
                                                                 var_age,
                                                                 var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2zeroseasfix <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2zeroseasvary <- function(prior,
                                                                  dimnames_term,
                                                                  var_time,
                                                                  var_age,
                                                                  var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2zero <- function(prior,
                                                                  dimnames_term,
                                                                  var_time,
                                                                  var_age,
                                                                  var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = TRUE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2zeroseasfix <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_rw2zeroseasvary <- function(prior,
                                                                  dimnames_term,
                                                                  var_time,
                                                                  var_age,
                                                                  var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_spline <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_svd <- function(prior,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           var_sexgender) {
  dim <- lengths(dimnames_term)
  make_matrix_along_by_effectfree_innermost(prior = prior,
                                            dimnames_term = dimnames_term,
                                            var_time = var_time,
                                            var_age = var_age,
                                            var_sexgender = var_sexgender,
                                            dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_svd_ar <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_svd_rwrandom <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_svd_rwzero <- function(prior,
                                                              dimnames_term,
                                                              var_time,
                                                              var_age,
                                                              var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = TRUE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_svd_rw2random <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree.bage_prior_svd_rw2zero <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_along_by_effectfree_inner(prior = prior,
                                        dimnames_term = dimnames_term,
                                        var_time = var_time,
                                        var_age = var_age,
                                        var_sexgender = var_sexgender,
                                        append_zero = TRUE)
}


## 'make_matrix_along_by_effectfree_innermost' ------------------------------------------

#' Helper function for 'make_matrix_along_by_effectfree'
#'
#' Called by (ordinary, non-method) helper function
#' 'make_matrix_along_by_effectfree_inner'.
#'
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames for array
#' representing term
#' @param var_time Name of time variable, or NULL
#' @param var_age Name of age variable, or NULL
#' @param var_sexgender Name of sexgender variable, or NULL
#' @param dim Dimension of the term, once arguments
#' such as 'con' and 'append_zero' have been applied.
#'
#' @returns A matrix.
#'
#' @noRd
make_matrix_along_by_effectfree_innermost <- function(prior,
                                                      dimnames_term,
                                                      var_time,
                                                      var_age,
                                                      var_sexgender,
                                                      dim) {
  UseMethod("make_matrix_along_by_effectfree_innermost")
}


## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior <- function(prior,
                                                                 dimnames_term,
                                                                 var_time,
                                                                 var_age,
                                                                 var_sexgender,
                                                                 dim) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  make_matrix_along_by_inner(i_along = i_along,
                             dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_spline <- function(prior,
                                                                        dimnames_term,
                                                                        var_time,
                                                                        var_age,
                                                                        var_sexgender,
                                                                        dim) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  n_along <- dim[[i_along]]
  n_comp <- get_n_comp_spline(prior = prior,
                              n_along = n_along)
  dim[[i_along]] <- n_comp
  make_matrix_along_by_inner(i_along = i_along,
                             dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_svd <- function(prior, 
                                                                     dimnames_term,
                                                                     var_time,
                                                                     var_age,
                                                                     var_sexgender,
                                                                     dim) {
  dim <- make_dim_svd(prior = prior,
                      dimnames_term = dimnames_term,
                      var_sexgender = var_sexgender,
                      var_age = var_age)
  make_matrix_along_by_inner(i_along = 1L,
                             dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_svd_ar <- function(prior, 
                                                                        dimnames_term,
                                                                        var_time,
                                                                        var_age,
                                                                        var_sexgender,
                                                                        dim) {
  make_matrix_along_by_svddynamic(prior = prior,
                                  dimnames_term = dimnames_term,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_svd_rwrandom <- function(prior, 
                                                                              dimnames_term,
                                                                              var_time,
                                                                              var_age,
                                                                              var_sexgender,
                                                                              dim) {
  make_matrix_along_by_svddynamic(prior = prior,
                                  dimnames_term = dimnames_term,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_svd_rwzero <- function(prior, 
                                                                            dimnames_term,
                                                                            var_time,
                                                                            var_age,
                                                                            var_sexgender,
                                                                            dim) {
  make_matrix_along_by_svddynamic(prior = prior,
                                  dimnames_term = dimnames_term,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_svd_rw2random <- function(prior, 
                                                                               dimnames_term,
                                                                               var_time,
                                                                               var_age,
                                                                               var_sexgender,
                                                                               dim) {
  make_matrix_along_by_svddynamic(prior = prior,
                                  dimnames_term = dimnames_term,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  dim = dim)
}

## HAS_TESTS
#' @export
make_matrix_along_by_effectfree_innermost.bage_prior_svd_rw2zero <- function(prior, 
                                                                             dimnames_term,
                                                                             var_time,
                                                                             var_age,
                                                                             var_sexgender,
                                                                             dim) {
  make_matrix_along_by_svddynamic(prior = prior,
                                  dimnames_term = dimnames_term,
                                  var_time = var_time,
                                  var_age = var_age,
                                  var_sexgender = var_sexgender,
                                  dim = dim)
}


## 'make_matrix_draws_svd' ----------------------------------------------------

#' Make Matrix to Transform Draws for SVD
#'
#' The transform is to add zeros to the
#' start of the time dimension, which is
#' only done with some dynamic SVD priors.
#'
#' Return NULL with non-SVD priors
#' 
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames for array
#' representing term
#' @param var_time Name of time variable, or NULL
#' @param var_age Name of age variable, or NULL
#' @param var_sexgender Name of sexgender variable, or NULL
#'
#' @returns A sparse matrix
#'
#' @noRd
make_matrix_draws_svd <- function(prior,
                                  dimnames_term,
                                  var_time,
                                  var_age,
                                  var_sexgender) {
  UseMethod("make_matrix_draws_svd")
}

#' @export
make_matrix_draws_svd.bage_prior <- function(prior,
                                             dimnames_term,
                                             var_time,
                                             var_age,
                                             var_sexgender) {
  NULL
}

## HAS_TESTS
#' @export
make_matrix_draws_svd.bage_prior_svd <- function(prior,
                                                 dimnames_term,
                                                 var_time,
                                                 var_age,
                                                 var_sexgender) {
  make_matrix_draws_svd_nozero(prior = prior,
                               dimnames_term = dimnames_term,
                               var_time = var_time,
                               var_age = var_age,
                               var_sexgender = var_sexgender)
}

## HAS_TESTS
#' @export
make_matrix_draws_svd.bage_prior_svd_ar <- function(prior,
                                                    dimnames_term,
                                                    var_time,
                                                    var_age,
                                                    var_sexgender) {
  make_matrix_draws_svd_nozero(prior = prior,
                               dimnames_term = dimnames_term,
                               var_time = var_time,
                               var_age = var_age,
                               var_sexgender = var_sexgender)
}

## HAS_TESTS
#' @export
make_matrix_draws_svd.bage_prior_svd_rwrandom <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender) {
  make_matrix_draws_svd_nozero(prior = prior,
                               dimnames_term = dimnames_term,
                               var_time = var_time,
                               var_age = var_age,
                               var_sexgender = var_sexgender)
}

## HAS_TESTS
#' @export
make_matrix_draws_svd.bage_prior_svd_rwzero <- function(prior,
                                                    dimnames_term,
                                                    var_time,
                                                    var_age,
                                                    var_sexgender) {
  make_matrix_draws_svd_appendzero(prior = prior,
                                   dimnames_term = dimnames_term,
                                   var_time = var_time,
                                   var_age = var_age,
                                   var_sexgender = var_sexgender)
}

## HAS_TESTS
#' @export
make_matrix_draws_svd.bage_prior_svd_rw2random <- function(prior,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           var_sexgender) {
  make_matrix_draws_svd_nozero(prior = prior,
                               dimnames_term = dimnames_term,
                               var_time = var_time,
                               var_age = var_age,
                               var_sexgender = var_sexgender)
}

## HAS_TESTS
#' @export
make_matrix_draws_svd.bage_prior_svd_rw2zero <- function(prior,
                                                     dimnames_term,
                                                     var_time,
                                                     var_age,
                                                     var_sexgender) {
  make_matrix_draws_svd_appendzero(prior = prior,
                                   dimnames_term = dimnames_term,
                                   var_time = var_time,
                                   var_age = var_age,
                                   var_sexgender = var_sexgender)
}


## 'make_matrix_effectfree_effect' --------------------------------------------

#' Make matrix mapping effectfree to effect
#'
#' Make matrices mapping free parameters
#' for main effects or interactions to
#' full parameter vectors
#' 
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames of array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#'
#' @returns A sparse matrix.
#'
#' @noRd
make_matrix_effectfree_effect <- function(prior,
                                          dimnames_term,
                                          var_time,
                                          var_age,
                                          var_sexgender) {
  UseMethod("make_matrix_effectfree_effect")
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior <- function(prior,
                                                     dimnames_term,
                                                     var_time,
                                                     var_age,
                                                     var_sexgender) {
  n <- prod(lengths(dimnames_term))
  Matrix::.sparseDiagonal(n)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_ar <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_lin <- function(prior,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_linar <- function(prior,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_linex <- function(prior,
                                                           dimnames_term,
                                                           var_time,
                                                           var_age,
                                                           var_sexgender) {
  con <- prior$specific$con
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  is_along_first <- i_along == 1L
  dim <- lengths(dimnames_term)
  s <- seq_along(dim)
  n_along <- dim[[i_along]]
  ans <- matrix(seq_len(n_along) - 0.5 * (n_along + 1),
                nrow = n_along,
                ncol = 1L)
  if (con == "by") {
    I <- Matrix::.sparseDiagonal(prod(dim[-i_along] - 1L))
    ans <- Matrix::kronecker(I, ans)
    dim_after <- dim[c(i_along, s[-i_along])]
    m_zero <- make_matrix_unconstr_constr_along(dim_after)
    ans <- m_zero %*% ans
    if (!is_along_first) {
      dim_after <- c(1L, dim[-i_along] - 1L)
      m_to <- make_matrix_perm_along_to_front(i_along = i_along,
                                              dim_after = dim_after)
      m_from <- make_matrix_perm_along_from_front(i_along = i_along,
                                                  dim_after = dim)
      ans <- m_from %*% ans %*% m_to
    }
  }
  else {
    I <- Matrix::.sparseDiagonal(prod(dim[-i_along]))
    ans <- Matrix::kronecker(I, ans)
    if (!is_along_first) {
      dim_after <- c(1L, dim[-i_along])
      m_to <- make_matrix_perm_along_to_front(i_along = i_along,
                                              dim_after = dim_after)
      m_from <- make_matrix_perm_along_from_front(i_along = i_along,
                                                  dim_after = dim)
      ans <- m_from %*% ans %*% m_to
    }
  }
  ans
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rwrandom <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rwrandomseasfix <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rwrandomseasvary <- function(prior,
                                                                      dimnames_term,
                                                                      var_time,
                                                                      var_age,
                                                                      var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rwzero <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = TRUE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rwzeroseasfix <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rwzeroseasvary <- function(prior,
                                                                dimnames_term,
                                                                var_time,
                                                                var_age,
                                                                var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2infant <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2random <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2randomseasfix <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2randomseasvary <- function(prior,
                                                                dimnames_term,
                                                                var_time,
                                                                var_age,
                                                                var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2zero <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = TRUE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2zeroseasfix <- function(prior,
                                                               dimnames_term,
                                                               var_time,
                                                               var_age,
                                                               var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_rw2zeroseasvary <- function(prior,
                                                                dimnames_term,
                                                                var_time,
                                                                var_age,
                                                                var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_spline <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_svd <- function(prior,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_svd_ar <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_svd_rwrandom <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_svd_rwzero <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = TRUE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_svd_rw2random <- function(prior,
                                                                   dimnames_term,
                                                                   var_time,
                                                                   var_age,
                                                                   var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = FALSE)
}

## HAS_TESTS
#' @export
make_matrix_effectfree_effect.bage_prior_svd_rw2zero <- function(prior,
                                                             dimnames_term,
                                                             var_time,
                                                             var_age,
                                                             var_sexgender) {
  make_matrix_effectfree_effect_inner(prior = prior,
                                      dimnames_term = dimnames_term,
                                      var_time = var_time,
                                      var_age = var_age,
                                      var_sexgender = var_sexgender,
                                      append_zero = TRUE)
}


## 'make_matrix_sub_orig' -----------------------------------------------------

#' Make Matrix from Subspace to Original Space
#'
#' Used with spline and SVD priors
#'
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames of array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#' @param dim_after Dimension after applying the
#' transform (which is not necessarily the same as the dimension
#' implied by 'dimnames_term')
#'
#' @returns A sparse matrix or NULL
#'
#' @noRd
make_matrix_sub_orig <- function(prior,
                                 dimnames_term,
                                 var_time,
                                 var_age,
                                 var_sexgender,
                                 dim_after) {
  UseMethod("make_matrix_sub_orig")
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior <- function(prior,
                                            dimnames_term,
                                            var_time,
                                            var_age,
                                            var_sexgender,
                                            dim_after) {
  NULL
}

## HAS_TESTS
## Note that the spline is always along the "along"
## dimension, so is never subject to the "by" constraint
#' @export
make_matrix_sub_orig.bage_prior_spline <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   dim_after) {
  i_along <- make_i_along(prior = prior,
                          dimnames_term = dimnames_term,
                          var_time = var_time,
                          var_age = var_age)
  n_along <- dim_after[[i_along]]
  n_by <- prod(dim_after[-i_along])
  n_comp <- get_n_comp_spline(prior = prior, n_along = n_along)
  ans <- make_matrix_spline(n_comp = n_comp, n_along = n_along)
  I <- Matrix::.sparseDiagonal(n_by)
  ans <- Matrix::kronecker(I, ans)
  is_along_first <- i_along == 1L
  if (!is_along_first) {
    m_from <- make_matrix_perm_along_from_front(i_along = i_along,
                                                dim_after = dim_after)
    dim_after <- c(n_comp, dim_after[-i_along])
    m_to <- make_matrix_perm_along_to_front(i_along = i_along,
                                            dim_after = dim_after)
    ans <- m_from %*% ans %*% m_to
  }
  ans
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior_svd <- function(prior,
                                                dimnames_term,
                                                var_time,
                                                var_age,
                                                var_sexgender,
                                                dim_after) {
  make_matrix_sub_orig_svd(prior = prior,
                           dimnames_term = dimnames_term,
                           var_age = var_age,
                           var_sexgender = var_sexgender,
                           dim_after = dim_after,
                           con = "none")
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior_svd_ar <- function(prior,
                                                   dimnames_term,
                                                   var_time,
                                                   var_age,
                                                   var_sexgender,
                                                   dim_after) {
  con <- prior$specific$con
  make_matrix_sub_orig_svd(prior = prior,
                           dimnames_term = dimnames_term,
                           var_age = var_age,
                           var_sexgender = var_sexgender,
                           dim_after = dim_after,
                           con = con)
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior_svd_rwrandom <- function(prior,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender,
                                                         dim_after) {
  con <- prior$specific$con
  make_matrix_sub_orig_svd(prior = prior,
                           dimnames_term = dimnames_term,
                           var_age = var_age,
                           var_sexgender = var_sexgender,
                           dim_after = dim_after,
                           con = con)
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior_svd_rwzero <- function(prior,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender,
                                                         dim_after) {
  con <- prior$specific$con
  make_matrix_sub_orig_svd(prior = prior,
                           dimnames_term = dimnames_term,
                           var_age = var_age,
                           var_sexgender = var_sexgender,
                           dim_after = dim_after,
                           con = con)
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior_svd_rw2random <- function(prior,
                                                          dimnames_term,
                                                          var_time,
                                                          var_age,
                                                          var_sexgender,
                                                          dim_after) {
  con <- prior$specific$con
  make_matrix_sub_orig_svd(prior = prior,
                           dimnames_term = dimnames_term,
                           var_age = var_age,
                           var_sexgender = var_sexgender,
                           dim_after = dim_after,
                           con = con)
}

## HAS_TESTS
#' @export
make_matrix_sub_orig.bage_prior_svd_rw2zero <- function(prior,
                                                        dimnames_term,
                                                        var_time,
                                                        var_age,
                                                        var_sexgender,
                                                        dim_after) {
  con <- prior$specific$con
  make_matrix_sub_orig_svd(prior = prior,
                           dimnames_term = dimnames_term,
                           var_age = var_age,
                           var_sexgender = var_sexgender,
                           dim_after = dim_after,
                           con = con)
}



## 'make_offset_effectfree_effect' --------------------------------------------------

#' Make offset used in converting effectfree to effect
#'
#' Make offset used in converting
#' free parameters
#' for main effects or interactions to
#' full parameter vectors
#' 
#' @param prior Object of class 'bage_prior'
#' @param dimnames_term Dimnames of array representation of term
#' @param var_time Name of time variable
#' @param var_age Name of age variable
#' @param var_sexgender Name of sex/gender variable
#'
#' @returns A named numeric vector.
#'
#' @noRd
make_offset_effectfree_effect <- function(prior,
                                          dimnames_term,
                                          var_time,
                                          var_age,
                                          var_sexgender) {
  UseMethod("make_offset_effectfree_effect")
}

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior <- function(prior,
                                                     dimnames_term,
                                                     var_time,
                                                     var_age,
                                                     var_sexgender) {
  n <- prod(lengths(dimnames_term))
  rep.int(0, times = n)
}

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd <- function(prior,
                                                         dimnames_term,
                                                         var_time,
                                                         var_age,
                                                         var_sexgender)
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)


## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd_ar <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender) {
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)
}

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd_rwrandom <- function(prior,
                                                            dimnames_term,
                                                            var_time,
                                                            var_age,
                                                            var_sexgender)
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd_rwzero <- function(prior,
                                                                dimnames_term,
                                                                var_time,
                                                                var_age,
                                                                var_sexgender)
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd_rw2random <- function(prior,
                                                                   dimnames_term,
                                                                   var_time,
                                                                   var_age,
                                                                   var_sexgender)
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd_rw2random <- function(prior,
                                                                   dimnames_term,
                                                                   var_time,
                                                                   var_age,
                                                                   var_sexgender)
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)

## HAS_TESTS
#' @export
make_offset_effectfree_effect.bage_prior_svd_rw2zero <- function(prior,
                                                                 dimnames_term,
                                                                 var_time,
                                                                 var_age,
                                                                 var_sexgender)
  make_offset_effectfree_effect_svd(prior = prior,
                                    dimnames_term = dimnames_term,
                                    var_time = var_time,
                                    var_age = var_age,
                                    var_sexgender = var_sexgender)


## 'print' --------------------------------------------------------------------

## HAS_TESTS
#' @export
print.bage_prior_ar <- function(x, ...) {
  nms <- c("min", "max", "s", "along", "con")
  slots <- c("min", "max", "scale", "along", "con")
  nm <- x$specific$nm
  if (identical(nm, "AR")) {
    nms <- c("n_coef", nms)
    slots <- c("n_coef", slots)
  }
  print_prior(x, nms = nms, slots = slots)
}

## HAS_TESTS
#' @export
print.bage_prior_known <- function(x, ...) {
  cat(str_call_prior(x), "\n")
}

## HAS_TESTS
#' @export
print.bage_prior_lin <- function(x, ...) {
  print_prior(x,
              nms = c("s", "mean_slope", "sd_slope", "along", "con"),
              slots = c("scale", "mean_slope", "sd_slope", "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_linar <- function(x, ...) {
  nms <- c("s", "mean_slope", "sd_slope", "min", "max", "along", "con")
  slots <- c("scale", "mean_slope", "sd_slope", "min", "max", "along", "con")
  nm <- x$specific$nm
  if (identical(nm, "Lin_AR")) {
    nms <- c("n_coef", nms)
    slots <- c("n_coef", slots)
  }
  print_prior(x, nms = nms, slots = slots)
}


## HAS_TESTS
#' @export
print.bage_prior_linex <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  cat(sprintf("% *s: %s\n", n_offset, "s", 0))
  print_prior_slot(prior = x, nm = "mean_slope", slot = "mean_slope")
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}


## HAS_TESTS
#' @export
print.bage_prior_norm <- function(x, ...) {
  print_prior(x,
              nms = "s",
              slots = "scale")
}

## HAS_TESTS
#' @export
print.bage_prior_normfixed <- function(x, ...) {
  print_prior(x,
              nms = "sd",
              slots = "sd")
}

## HAS_TESTS
#' @export
print.bage_prior_rwrandom <- function(x, ...) {
  print_prior(x,
              nms = c("s", "sd", "along", "con"),
              slots = c("scale", "sd", "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_rwrandomseasfix <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "n_seas", slot = "n_seas")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "sd", slot = "sd")
  cat(sprintf("% *s: %s\n", n_offset, "s_seas", 0))
  print_prior_slot(prior = x, nm = "sd_seas", slot = "sd_seas")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rwrandomseasvary <- function(x, ...) {
  print_prior(x,
              nms = c("n", "s", "sd", "s_seas", "sd_seas", "along", "con"),
              slots = c("n", "scale", "sd", "scale_seas", "sd_seas", "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_rwzero <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  cat(sprintf("% *s: %s\n", n_offset, "sd", 0))
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rwzeroseasfix <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "n_seas", slot = "n_seas")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  cat(sprintf("% *s: %s\n", n_offset, "sd", 0))
  cat(sprintf("% *s: %s\n", n_offset, "s_seas", 0))
  print_prior_slot(prior = x, nm = "sd_seas", slot = "sd_seas")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rwzeroseasvary <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "n_seas", slot = "n_seas")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  cat(sprintf("% *s: %s\n", n_offset, "sd", 0))
  print_prior_slot(prior = x, nm = "s_seas", slot = "scale_seas")
  print_prior_slot(prior = x, nm = "sd_seas", slot = "sd_seas")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rw2infant <- function(x, ...) {
  print_prior(x,
              nms = c("s", "sd_slope", "con"),
              slots = c("scale", "sd_slope", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_rw2random <- function(x, ...) {
  print_prior(x,
              nms = c("s", "sd", "sd_slope", "along", "con"),
              slots = c("scale", "sd", "sd_slope", "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_rw2randomseasfix <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "n_seas", slot = "n_seas")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "sd", slot = "sd")
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  cat(sprintf("% *s: %s\n", n_offset, "s_seas", 0))
  print_prior_slot(prior = x, nm = "sd_seas", slot = "sd_seas")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rw2randomseasvary <- function(x, ...) {
  print_prior(x,
              nms = c("n_seas",
                      "s", "sd", "sd_slope",
                      "s_seas", "sd_seas",
                      "along", "con"),
              slots = c("n_seas",
                        "scale", "sd", "sd_slope",
                        "scale_seas", "sd_seas",
                        "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_rw2zero <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  cat(sprintf("% *s: %s\n", n_offset, "sd", 0))
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rw2zeroseasfix <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "n_seas", slot = "n_seas")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  cat(sprintf("% *s: %s\n", n_offset, "sd", 0))
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  cat(sprintf("% *s: %s\n", n_offset, "s_seas", 0))
  print_prior_slot(prior = x, nm = "sd_seas", slot = "sd_seas")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rw2zeroseasfix <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "n_seas", slot = "n_seas")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  cat(sprintf("% *s: %s\n", n_offset, "sd", 0))
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  print_prior_slot(prior = x, nm = "s_seas", slot = "scale_seas")
  print_prior_slot(prior = x, nm = "sd_seas", slot = "sd_seas")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_rw2zeroseasvary <- function(x, ...) {
  print_prior(x,
              nms = c("n_seas",
                      "s", "sd", "sd_slope",
                      "s_seas", "sd_seas",
                      "along", "con"),
              slots = c("n_seas",
                        "scale", "sd", "sd_slope",
                        "scale_seas", "sd_seas",
                        "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_spline <- function(x, ...) {
  print_prior(x,
              nms = c("n_comp", "s", "sd", "sd_slope", "along", "con"),
              slots = c("n_comp", "scale", "sd", "sd_slope", "along", "con"))
}

## HAS_TESTS
#' @export
print.bage_prior_svd <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "ssvd", slot = "nm_ssvd")
  print_prior_slot(prior = x, nm = "n_comp", slot = "n_comp")
  indep <- x$specific$indep
  if (!indep)
    print_prior_slot(prior = x, nm = "indep", slot = "indep")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_svd_ar <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "ssvd", slot = "nm_ssvd")
  print_prior_slot(prior = x, nm = "n_comp", slot = "n_comp")
  indep <- x$specific$indep
  if (!indep)
    print_prior_slot(prior = x, nm = "indep", slot = "indep")
  nm <- x$specific$nm
  is_ar <- identical(sub("^(.*)_(.*)$", "\\2", nm), "AR")
  if (is_ar)
    print_prior_slot(prior = x, nm = "n_coef", slot = "n_coef")
  print_prior_slot(prior = x, nm = "min", slot = "min")
  print_prior_slot(prior = x, nm = "max", slot = "max")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_svd_rwrandom <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "ssvd", slot = "nm_ssvd")
  print_prior_slot(prior = x, nm = "n_comp", slot = "n_comp")
  indep <- x$specific$indep
  if (!indep)
    print_prior_slot(prior = x, nm = "indep", slot = "indep")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "sd", slot = "sd")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_svd_rwzero <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "ssvd", slot = "nm_ssvd")
  print_prior_slot(prior = x, nm = "n_comp", slot = "n_comp")
  indep <- x$specific$indep
  if (!indep)
    print_prior_slot(prior = x, nm = "indep", slot = "indep")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_svd_rw2random <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "ssvd", slot = "nm_ssvd")
  print_prior_slot(prior = x, nm = "n_comp", slot = "n_comp")
  indep <- x$specific$indep
  if (!indep)
    print_prior_slot(prior = x, nm = "indep", slot = "indep")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "sd", slot = "sd")
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}

## HAS_TESTS
#' @export
print.bage_prior_svd_rw2zero <- function(x, ...) {
  n_offset <- get_print_prior_n_offset()
  print_prior_header(x)
  print_prior_slot(prior = x, nm = "ssvd", slot = "nm_ssvd")
  print_prior_slot(prior = x, nm = "n_comp", slot = "n_comp")
  indep <- x$specific$indep
  if (!indep)
    print_prior_slot(prior = x, nm = "indep", slot = "indep")
  print_prior_slot(prior = x, nm = "s", slot = "scale")
  print_prior_slot(prior = x, nm = "sd_slope", slot = "sd_slope")
  print_prior_slot(prior = x, nm = "along", slot = "along")
  print_prior_slot(prior = x, nm = "con", slot = "con")
  invisible(x)
}


## 'str_call_prior' -----------------------------------------------------------

#' Create string describing prior
#'
#' Creates string describing prior that
#' (inspired by printing of objects in Python)
#' looks like a call to the constructor function
#'
#' @param prior An object of class "bage_prior"
#'
#' @returns A string
#'
#' @noRd
str_call_prior <- function(prior) {
  UseMethod("str_call_prior")
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_ar <- function(prior) {
  nm <- prior$specific$nm
  args_ar <- str_call_args_ar(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_ar, args_along, args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("%s(%s)", nm, args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_known <- function(prior) {
  values <- values_known(prior)
  n <- length(values)
  if (n == 1L)
    inner <- sprintf("%s", values)
  else if (n <= 5)
    inner <- sprintf("c(%s)", paste(values, collapse = ","))
  else
    inner <- sprintf("c(%s,...,%s)", values[[1L]], values[[n]])
  sprintf("Known(%s)", inner)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_lin <- function(prior) {
  args_scale <- str_call_args_scale(prior)
  args_lin <- str_call_args_lin(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale, args_lin, args_along, args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("Lin(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_linar <- function(prior) {
  nm <- prior$specific$nm
  args_ar <- str_call_args_ar(prior)
  args_lin <- str_call_args_lin(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_ar, args_lin, args_along, args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("%s(%s)", nm, args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_linex <- function(prior) {
  args_scale <- "s=0"
  args_lin <- str_call_args_lin(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale, args_lin, args_along, args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("Lin(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_norm <- function(prior) {
  args <- str_call_args_scale(prior)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("N(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_normfixed <- function(prior) {
  arg <- str_call_args_sd(prior)
  sprintf("NFix(%s)", arg)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rwrandom <- function(prior) {
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale, args_sd, args_along, args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rwrandomseasfix <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rwrandomseasvary <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_s_seas <- str_call_args_s_seas(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_s_seas,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rwzero <- function(prior) {
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale,
            args_sd,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rwzeroseasfix <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rwzeroseasvary <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_s_seas <- str_call_args_s_seas(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_s_seas,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2infant <- function(prior) {
  args_scale <- str_call_args_scale(prior)
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale,
            args_sd_slope,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2_Infant(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2random <- function(prior) {
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale,
            args_sd,
            args_sd_slope,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2randomseasfix <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_sd_slope,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2randomseasvary <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_s_seas <- str_call_args_s_seas(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_sd_slope,
            args_s_seas,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2zero <- function(prior) {
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_scale,
            args_sd,
            args_sd_slope,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2zeroseasfix <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_sd_slope,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_rw2zeroseasvary <- function(prior) {
  args_n_seas <- str_call_args_n_seas(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_s_seas <- str_call_args_s_seas(prior)
  args_sd_seas <- str_call_args_sd_seas(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_seas,
            args_scale,
            args_sd,
            args_sd_slope,
            args_s_seas,
            args_sd_seas,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("RW2_Seas(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_spline <- function(prior) {
  args_n_comp <- str_call_args_n_comp(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_n_comp,
            args_scale,
            args_sd,
            args_sd_slope,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("Sp(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_svd <- function(prior) {
  args <- str_call_args_svd(prior)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("SVD(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_svd_ar <- function(prior) {
  nm <- prior$specific$nm
  args_svd <- str_call_args_svd(prior)
  args_ar <- str_call_args_ar(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_svd,
            args_ar,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("%s(%s)", nm, args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_svd_rwrandom <- function(prior) {
  args_svd <- str_call_args_svd(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_svd,
            args_scale,
            args_sd,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("SVD_RW(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_svd_rwzero <- function(prior) {
  args_svd <- str_call_args_svd(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_svd,
            args_scale,
            args_sd,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("SVD_RW(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_svd_rw2random <- function(prior) {
  args_svd <- str_call_args_svd(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- str_call_args_sd(prior)
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_svd,
            args_scale,
            args_sd,
            args_sd_slope,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("SVD_RW2(%s)", args)
}

## HAS_TESTS
#' @export
str_call_prior.bage_prior_svd_rw2zero <- function(prior) {
  args_svd <- str_call_args_svd(prior)
  args_scale <- str_call_args_scale(prior)
  args_sd <- "sd=0"
  args_sd_slope <- str_call_args_sd_slope(prior)
  args_along <- str_call_args_along(prior)
  args_con <- str_call_args_con(prior)
  args <- c(args_svd,
            args_scale,
            args_sd,
            args_sd_slope,
            args_along,
            args_con)
  args <- args[nzchar(args)]
  args <- paste(args, collapse = ",")
  sprintf("SVD_RW2(%s)", args)
}


## 'str_nm_prior' -----------------------------------------------------------

#' Create Function Call Describing Prior
#'
#' Creates string describing prior that
#' looks like the constructor function
#'
#' @param prior An object of class "bage_prior"
#'
#' @returns A string
#'
#' @noRd
str_nm_prior <- function(prior) {
  UseMethod("str_nm_prior")
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_ar <- function(prior) {
  nm <- prior$specific$nm
  sprintf("%s()", nm)
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_known <- function(prior) {
  "Known()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_lin <- function(prior) {
  "Lin()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_linar <- function(prior) {
  nm <- prior$specific$nm
  sprintf("%s()", nm)
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_linex <- function(prior) {
  "Lin()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_norm <- function(prior) {
  "N()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_normfixed <- function(prior) {
  "NFix()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rwrandom <- function(prior) {
  "RW()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rwrandomseasfix <- function(prior) {
  "RW_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rwrandomseasvary <- function(prior) {
  "RW_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rwzero <- function(prior) {
  "RW()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rwzeroseasfix <- function(prior) {
  "RW_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rwzeroseasvary <- function(prior) {
  "RW_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2infant <- function(prior) {
  "RW2_Infant()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2random <- function(prior) {
  "RW2()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2randomseasfix <- function(prior) {
  "RW2_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2randomseasvary <- function(prior) {
  "RW2_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2zero <- function(prior) {
  "RW2()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2zeroseasfix <- function(prior) {
  "RW2_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_rw2zeroseasvary <- function(prior) {
  "RW2_Seas()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_spline <- function(prior) {
  "Sp()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_svd <- function(prior) {
  "SVD()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_svd_ar <- function(prior) {
  nm <- prior$specific$nm
  sprintf("%s()", nm)
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_svd_rwrandom <- function(prior) {
  "SVD_RW()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_svd_rwzero <- function(prior) {
  "SVD_RW()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_svd_rw2random <- function(prior) {
  "SVD_RW2()"
}

## HAS_TESTS
#' @export
str_nm_prior.bage_prior_svd_rw2zero <- function(prior) {
  "SVD_RW2()"
}


## 'transform_hyper' ----------------------------------------------------------

#' Transform to convert working TMB version
#' of parameter back to original units
#'+
#' @param prior An object of class 'bage_prior'.
#'
#' @returns A list of functions.
#'
#' @noRd
transform_hyper <- function(prior) {
  UseMethod("transform_hyper")
}

## HAS_TESTS
#' @export
transform_hyper.bage_prior_ar <- function(prior)
  transform_hyper_ar(prior)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_known <- function(prior)
  list()

## HAS_TESTS
#' @export
transform_hyper.bage_prior_lin <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_linar <- function(prior)
  transform_hyper_ar(prior)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_linex <- function(prior)
  list()

## HAS_TESTS
#' @export
transform_hyper.bage_prior_norm <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_normfixed <- function(prior)
  list()

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rwrandom <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rwrandomseasfix <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rwrandomseasvary <- function(prior)
  list(sd_seas = exp,
       sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rwzero <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rwzeroseasfix <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rwzeroseasvary <- function(prior)
  list(sd_seas = exp,
       sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2infant <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2random <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2randomseasfix <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2randomseasvary <- function(prior)
  list(sd_seas = exp,
       sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2zero <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2zeroseasfix <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_rw2zeroseasvary <- function(prior)
  list(sd_seas = exp,
       sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_spline <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_svd <- function(prior)
  list()

## HAS_TESTS
#' @export
transform_hyper.bage_prior_svd_ar <- function(prior)
  transform_hyper_ar(prior)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_svd_rwrandom <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_svd_rwzero <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_svd_rw2random <- function(prior)
  list(sd = exp)

## HAS_TESTS
#' @export
transform_hyper.bage_prior_svd_rw2zero <- function(prior)
  list(sd = exp)


## 'uses_along' ---------------------------------------------------------------

#' Whether Prior uses an 'along' Dimension
#'
#' @param prior Object of class 'bage_prior'
#'
#' @returns TRUE or FALSE.
#'
#' @noRd
uses_along <- function(prior) {
  UseMethod("uses_along")
}


## HAS_TESTS
#' @export
uses_along.bage_prior_ar <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_known <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_along.bage_prior_lin <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_linar <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_linex <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_norm <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_along.bage_prior_normfixed <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_along.bage_prior_rwrandom <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rwrandomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rwrandomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rwzero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rwzeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rwzeroseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2infant <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2random <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2randomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2randomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2zero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2zeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_rw2zeroseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_spline <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_svd <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_along.bage_prior_svd_ar <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_svd_rwrandom <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_svd_rwzero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_svd_rw2random <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_along.bage_prior_svd_rw2zero <- function(prior) TRUE


## 'uses_hyperrandfree' -------------------------------------------------------

#' Whether Prior Uses Hyper-Paremters that
#' Can Be Treated As Random Effects
#'
#' @param prior Object of class 'bage_prior'
#'
#' @returns TRUE or FALSE.
#'
#' @noRd
uses_hyperrandfree <- function(prior) {
  UseMethod("uses_hyperrandfree")
}

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_lin <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_linar <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rwrandomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rwrandomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rwzeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rwzeroseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rw2randomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rw2randomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rw2zeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_hyperrandfree.bage_prior_rw2zeroseasvary <- function(prior) TRUE


## 'uses_matrix_effectfree_effect' --------------------------------------------

#' Whether prior uses matrix to convert effectfree to effect
#'
#' @param prior Object of class 'bage_prior'
#'
#' @returns TRUE or FALSE.
#'
#' @noRd
uses_matrix_effectfree_effect <- function(prior) {
  UseMethod("uses_matrix_effectfree_effect")
}

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_lin <- function(prior) {
  con <- prior$specific$con
  identical(con, "by")
}

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_linar <- function(prior) {
  con <- prior$specific$con
  identical(con, "by")
}

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_linex <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rwrandom <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rwrandomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rwrandomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rwzero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rwzeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rwzeroseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2infant <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2random <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2randomseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2randomseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2zero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2zeroseasfix <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_rw2zeroseasvary <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_spline <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_svd <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_svd_ar <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_svd_rwrandom <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_svd_rwzero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_svd_rw2random <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_matrix_effectfree_effect.bage_prior_svd_rw2zero <- function(prior) TRUE


## 'uses_offset_effectfree_effect' --------------------------------------------------

#' Whether prior uses offset to convert effectfree to effect
#'
#' @param prior Object of class 'bage_prior'
#'
#' @returns TRUE or FALSE.
#'
#' @noRd
uses_offset_effectfree_effect <- function(prior) {
  UseMethod("uses_offset_effectfree_effect")
}

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior <- function(prior) FALSE

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior_svd <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior_svd_ar <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior_svd_rwrandom <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior_svd_rwzero <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior_svd_rw2random <- function(prior) TRUE

## HAS_TESTS
#' @export
uses_offset_effectfree_effect.bage_prior_svd_rw2zero <- function(prior) TRUE


## 'values_known' -------------------------------------------------------------

#' Given a prior that treats a term as known,
#' extract the known values
#'
#' @param An object of class 'bage_prior'
#'
#' @returns A vector of doubles.
#'
#' @noRd
values_known <- function(prior) {
  UseMethod("values_known")
}

## HAS_TESTS
#' @export
values_known.bage_prior_known <- function(prior) prior$specific$values

Try the bage package in your browser

Any scripts or data that you put into this service are public.

bage documentation built on April 3, 2025, 8:53 p.m.