9#ifndef FIMS_INTERFACE_RCPP_RCPP_OBJECTS_RCPP_GROWTH_HPP
10#define FIMS_INTERFACE_RCPP_RCPP_OBJECTS_RCPP_GROWTH_HPP
39 static std::map<uint32_t, std::shared_ptr<GrowthInterfaceBase>>
live_objects;
45 this->
id = GrowthInterfaceBase::id_g++;
93 const GrowthDerivedObservationInterfaceBase& other)
99 template <
typename Type>
104 std::shared_ptr<fims_popdy::GrowthDerivedObservationBase<Type>>
106 std::shared_ptr<fims_info::Information<Type>> info =
110 info->growth_models.find(this->
id);
114 " not found in Information.");
118 std::shared_ptr<fims_popdy::GrowthDerivedObservationBase<Type>>
119 growth_observation = std::dynamic_pointer_cast<
121 if (!growth_observation) {
127 return growth_observation;
130 template <
typename Type>
137 growth_observation)
const {
138 std::shared_ptr<fims_info::Information<Type>> info =
140 info->growth_models[growth_observation->id] = growth_observation;
168 std::shared_ptr<std::map<int, std::map<double, double>>>
ewaa;
178 this->ewaa = std::make_shared<std::map<int, std::map<double, double>>>();
180 std::make_shared<EWAAGrowthInterface>(*
this);
182 std::make_shared<EWAAGrowthInterface>(*
this));
219 std::map<int, std::map<double, double>> mymap;
220 const size_t n_years_plus_one =
static_cast<size_t>(
n_years.get() + 1);
225 Rcpp::stop(
"EWAA Error:: n_years must be at least 1");
230 Rcpp::stop(
"EWAA Error:: ages and weights must have at least one value");
236 if ((
weights.size() !=
ages.size() * n_years_plus_one) &&
239 "weights size does not match ages size or ages size times "
240 "(n_years + 1), where the plus one is for the beginning "
241 "of the year after the terminal year spawning-biomass "
242 "calculations. weights size: " +
243 std::to_string(
weights.size()) +
244 " ages size: " + std::to_string(
ages.size()) +
245 " n_years: " + std::to_string(
n_years.get()));
249 for (
size_t y = 0; y < n_years_plus_one; y++) {
250 for (
size_t i = 0; i <
ages.size(); i++) {
254 }
else if (
weights.size() ==
ages.size() * n_years_plus_one) {
257 for (
size_t y = 0; y < n_years_plus_one; y++) {
258 for (
size_t i = 0; i <
ages.size(); i++) {
277 EWAAGrowth.
ewaa =
make_map(this->ages, this->weights, this->n_years);
281 Rcpp::stop(
"this empirical weight at age object is already initialized");
294 std::stringstream ss;
296 ss <<
" \"module_name\": \"Growth\",\n";
297 ss <<
" \"module_type\": \"EWAA\",\n";
298 ss <<
" \"module_id\":" << this->
id <<
",\n";
299 ss <<
" \"parameters\": [\n{\n";
300 ss <<
" \"name\": \"weight_at_age\",\n";
301 ss <<
" \"id\": null,\n";
302 ss <<
" \"type\": \"vector\",\n";
303 ss <<
" \"dimensionality\": {\n";
304 ss <<
" \"header\": [\"n_years+1\",\"n_ages\"],\n";
305 ss <<
" \"dimensions\": [" << this->n_years.
get() + 1 <<
","
306 << this->ages.
size() <<
"]\n},\n";
308 ss <<
" \"values\": [\n";
309 for (
size_t i = 0; i <
weights.size() - 1; i++) {
311 ss <<
"\"id\": null,\n";
312 ss <<
"\"value\": " <<
weights[i] <<
",\n";
313 ss <<
"\"estimated_value\": " <<
weights[i] <<
",\n";
314 ss <<
"\"estimation_type\": \"constant\"\n";
318 ss <<
"\"id\": null,\n";
320 ss <<
"\"estimated_value\": " <<
weights[
weights.size() - 1] <<
",\n";
321 ss <<
"\"estimation_type\": \"constant\"\n";
329 template <
typename Type>
330 bool add_to_fims_tmb_internal() {
331 std::shared_ptr<fims_info::Information<Type>> info =
334 std::shared_ptr<fims_popdy::EWAAGrowth<Type>> ewaa_growth =
335 std::make_shared<fims_popdy::EWAAGrowth<Type>>();
338 ewaa_growth->id = this->
id;
340 make_map(this->ages, this->weights, this->n_years);
342 info->growth_models[ewaa_growth->id] = ewaa_growth;
352 this->add_to_fims_tmb_internal<TMB_FIMS_REAL_TYPE>();
353 this->add_to_fims_tmb_internal<TMBAD_FIMS_TYPE>();
368 :
public GrowthDerivedObservationInterfaceBase {
431 : GrowthDerivedObservationInterfaceBase() {
434 this->length_at_age_sd_young.
resize(0);
435 this->length_at_age_sd_old.
resize(0);
436 this->log_sd_mean_length_young.
resize(0);
437 this->log_sd_mean_length_old.
resize(0);
438 this->log_sd_growth_coefficient.
resize(0);
439 this->mean_length_young_mean_length_old_logit_corr.
resize(0);
440 this->mean_length_young_growth_coefficient_logit_corr.
resize(0);
441 this->mean_length_old_growth_coefficient_logit_corr.
resize(0);
446 std::make_shared<VonBertalanffySchnuteGrowthInterface>(*
this);
448 std::make_shared<VonBertalanffySchnuteGrowthInterface>(*
this));
457 : GrowthDerivedObservationInterfaceBase(other),
491 " has been finalized already.");
496 std::shared_ptr<fims_popdy::GrowthDerivedObservationBase<double>>
498 if (!growth_observation) {
502 std::shared_ptr<fims_popdy::VonBertalanffySchnuteGrowthModelAdapter<double>>
503 vb = std::dynamic_pointer_cast<
514 for (
size_t i = 0; i < pv.
size(); i++) {
515 if (pv[i].estimation_type_m.
get() ==
"constant") {
516 pv[i].final_value_m = pv[i].initial_value_m;
520 v = fims_math::exp(v);
522 pv[i].final_value_m = v;
527 SetFinalLengthParameter(
528 this->mean_length_young,
529 FinalMeanLengthYoungFromWorkingScale(vb->MeanLengthYoungVector()));
530 SetFinalLengthParameter(
531 this->mean_length_old,
532 FinalMeanLengthOldFromWorkingScale(vb->MeanLengthYoungVector(),
533 vb->MeanLengthOldVector()));
534 set_final(this->growth_coefficient, vb->GrowthCoefficientVector(),
true);
535 set_final(this->reference_age_for_length_young,
536 vb->ReferenceAgeForLengthYoungVector(),
false);
537 set_final(this->reference_age_for_length_old,
538 vb->ReferenceAgeForLengthOldVector(),
false);
539 set_final(this->length_weight_a, vb->LengthWeightAVector(),
true);
540 set_final(this->length_weight_b, vb->LengthWeightBVector(),
true);
541 set_final(this->length_at_age_sd_young, vb->LengthAtAgeSdYoungVector(),
543 set_final(this->length_at_age_sd_old, vb->LengthAtAgeSdOldVector(),
true);
544 set_final(this->log_sd_mean_length_young,
545 vb->LogSdLengthAtRefAgeYoungVector(),
false);
546 set_final(this->log_sd_mean_length_old, vb->LogSdLengthAtRefAgeOldVector(),
548 set_final(this->log_sd_growth_coefficient,
549 vb->LogSdGrowthCoefficientVector(),
false);
550 set_final(this->mean_length_young_mean_length_old_logit_corr,
551 vb->LogitCorrLengthAtRefAgeYoungLengthAtRefAgeOldVector(),
false);
552 set_final(this->mean_length_young_growth_coefficient_logit_corr,
553 vb->LogitCorrLengthAtRefAgeYoungKVector(),
false);
554 set_final(this->mean_length_old_growth_coefficient_logit_corr,
555 vb->LogitCorrLengthAtRefAgeOldKVector(),
false);
560 Rcpp::stop(
"Negative age not supported");
562 if (this->n_ages.
get() <= 0) {
563 Rcpp::stop(
"n_ages not set");
565 const double age_round = std::round(age);
566 const double tol = 1e-8;
567 if (std::fabs(age - age_round) > tol) {
568 Rcpp::stop(
"Non-integer age not supported yet");
570 ValidateVonBertalanffySchnuteGrowthInputs(
false);
578 this->reference_age_for_length_young[0].initial_value_m;
580 this->reference_age_for_length_old[0].initial_value_m;
589 enum class LengthReferenceParameterization {
590 kEstimatedReferenceLengths = 0,
591 kConstantLengthYoungEstimatedLengthOld,
592 kEstimatedLengthYoungBelowConstantLengthOld,
596 bool IsEstimated(VariableVector& pv) {
597 return pv.
size() > 0 && pv[0].estimation_type_m.
get() !=
"constant";
600 double InitialLengthAtRefAgeYoung() {
604 double InitialLengthAtRefAgeOld() {
608 LengthReferenceParameterization GetLengthReferenceParameterization() {
612 if (estimate_length_young && estimate_length_old) {
613 return LengthReferenceParameterization::kEstimatedReferenceLengths;
615 if (!estimate_length_young && estimate_length_old) {
616 return LengthReferenceParameterization::
617 kConstantLengthYoungEstimatedLengthOld;
619 if (estimate_length_young && !estimate_length_old) {
620 return LengthReferenceParameterization::
621 kEstimatedLengthYoungBelowConstantLengthOld;
623 return LengthReferenceParameterization::kBothConstant;
626 double FinalMeanLengthYoungFromWorkingScale(
627 const fims::Vector<double>& mean_length_young_src) {
628 switch (GetLengthReferenceParameterization()) {
629 case LengthReferenceParameterization::kEstimatedReferenceLengths:
630 return fims_math::exp(mean_length_young_src[0]);
632 case LengthReferenceParameterization::
633 kConstantLengthYoungEstimatedLengthOld:
634 return InitialLengthAtRefAgeYoung();
636 case LengthReferenceParameterization::
637 kEstimatedLengthYoungBelowConstantLengthOld:
639 mean_length_young_src[0]);
641 case LengthReferenceParameterization::kBothConstant:
642 return InitialLengthAtRefAgeYoung();
645 return InitialLengthAtRefAgeYoung();
648 double FinalMeanLengthOldFromWorkingScale(
649 const fims::Vector<double>& mean_length_young_src,
650 const fims::Vector<double>& mean_length_old_src) {
651 switch (GetLengthReferenceParameterization()) {
652 case LengthReferenceParameterization::kEstimatedReferenceLengths:
653 case LengthReferenceParameterization::
654 kConstantLengthYoungEstimatedLengthOld:
655 return fims_math::exp(mean_length_old_src[0]);
657 case LengthReferenceParameterization::
658 kEstimatedLengthYoungBelowConstantLengthOld:
659 return InitialLengthAtRefAgeOld();
661 case LengthReferenceParameterization::kBothConstant:
662 return InitialLengthAtRefAgeOld();
665 return InitialLengthAtRefAgeOld();
668 void SetFinalLengthParameter(VariableVector& pv,
double final_value)
const {
669 for (
size_t i = 0; i < pv.
size(); i++) {
670 if (pv[i].estimation_type_m.get() ==
"constant") {
671 pv[i].final_value_m = pv[i].initial_value_m;
673 pv[i].final_value_m = final_value;
678 template <
typename Type>
679 void ConfigureLengthReferenceParameterization(
680 const std::shared_ptr<
681 fims_popdy::VonBertalanffySchnuteGrowthModelAdapter<Type>>& vb) {
682 switch (GetLengthReferenceParameterization()) {
683 case LengthReferenceParameterization::kEstimatedReferenceLengths:
684 vb->UseEstimatedReferenceMeanLengths();
687 case LengthReferenceParameterization::
688 kConstantLengthYoungEstimatedLengthOld:
689 vb->UseConstantMeanLengthYoungWithEstimatedMeanLengthOld(
690 static_cast<Type
>(InitialLengthAtRefAgeYoung()));
693 case LengthReferenceParameterization::
694 kEstimatedLengthYoungBelowConstantLengthOld:
695 vb->UseEstimatedMeanLengthYoungBelowConstantMeanLengthOld(
696 static_cast<Type
>(InitialLengthAtRefAgeOld()));
699 case LengthReferenceParameterization::kBothConstant:
700 vb->UseConstantReferenceMeanLengths(
701 static_cast<Type
>(InitialLengthAtRefAgeYoung()),
702 static_cast<Type
>(InitialLengthAtRefAgeOld()));
707 void ValidateVonBertalanffySchnuteGrowthInputs(
bool require_variability) {
709 this->mean_length_old.size() < 1 ||
710 this->growth_coefficient.size() < 1 ||
711 this->reference_age_for_length_young.size() < 1 ||
712 this->reference_age_for_length_old.size() < 1 ||
713 this->length_weight_a.size() < 1 || this->length_weight_b.size() < 1) {
714 Rcpp::stop(
"VonBertalanffySchnuteGrowth parameters not set");
719 const bool has_any_structured_delta =
726 const bool has_structured_delta =
734 if (require_variability && !has_sd && !has_any_structured_delta) {
736 "VonBertalanffySchnuteGrowth requires either "
737 "both length_at_age_sd_young and length_at_age_sd_old, "
738 "or the structured delta-method growth variability inputs");
741 if (has_any_structured_delta && !has_structured_delta) {
743 "von Bertalanffy--Schnute growth requires all six structured "
745 "variability inputs when using that path");
748 if (has_sd && has_structured_delta) {
750 "von Bertalanffy--Schnute growth requires variability inputs for "
751 "one supported path. Supply either the interpolation inputs "
753 "length_at_age_sd_young and length_at_age_sd_old or the full "
754 "delta-method variability inputs, but not both");
758 this->length_at_age_sd_old.size() != 1)) {
760 "Interpolation requires exactly one length_at_age_sd_young value "
761 "and one length_at_age_sd_old value");
764 if (has_structured_delta &&
766 this->log_sd_mean_length_old.size() != 1 ||
767 this->log_sd_growth_coefficient.size() != 1 ||
768 this->mean_length_young_mean_length_old_logit_corr.size() != 1 ||
769 this->mean_length_young_growth_coefficient_logit_corr.size() != 1 ||
770 this->mean_length_old_growth_coefficient_logit_corr.size() != 1)) {
772 "VonBertalanffySchnuteGrowth currently supports a single structured "
773 "delta-method variability parameter set; expected size 1 for "
774 "each structured uncertainty input");
779 if (!std::isfinite(a1)) {
780 Rcpp::stop(
"reference_age_for_length_young must be finite");
782 if (!std::isfinite(a2)) {
783 Rcpp::stop(
"reference_age_for_length_old must be finite");
787 "VonBertalanffySchnuteGrowth reference_age_for_length_old must be > "
788 "reference_age_for_length_young");
791 auto check_finite = [](VariableVector& pv,
const std::string& base_name) {
792 for (
size_t i = 0; i < pv.
size(); i++) {
793 if (!std::isfinite(pv[i].initial_value_m)) {
794 Rcpp::stop((base_name +
" must be finite").c_str());
799 auto check_positive = [&check_finite](VariableVector& pv,
800 const std::string& base_name) {
801 check_finite(pv, base_name);
802 for (
size_t i = 0; i < pv.
size(); i++) {
803 if (pv[i].initial_value_m <= 0.0) {
804 Rcpp::stop((base_name +
" must be > 0").c_str());
818 "VonBertalanffySchnuteGrowth mean_length_old must be > "
819 "mean_length_young");
826 if (has_structured_delta) {
830 "log_sd_growth_coefficient");
832 "mean_length_young_mean_length_old_logit_corr");
834 "mean_length_young_growth_coefficient_logit_corr");
836 "mean_length_old_growth_coefficient_logit_corr");
842 std::stringstream ss;
845 ss <<
" \"module_name\":\"Growth\",\n";
846 ss <<
" \"module_type\": \"VonBertalanffySchnute\",\n";
847 ss <<
" \"module_id\": " << this->
id <<
",\n";
849 ss <<
" \"parameters\": [\n";
853 ss <<
" \"name\": \"mean_length_young\",\n";
854 ss <<
" \"id\":" << this->mean_length_young.
id_m <<
",\n";
855 ss <<
" \"type\": \"vector\",\n";
856 ss <<
" \"dimensionality\": {\n";
857 ss <<
" \"header\": [null],\n";
858 ss <<
" \"dimensions\": [" << this->mean_length_young.
size() <<
"]\n";
860 ss <<
" \"values\":" << this->mean_length_young <<
"\n";
865 ss <<
" \"name\": \"growth_coefficient\",\n";
866 ss <<
" \"id\":" << this->growth_coefficient.
id_m <<
",\n";
867 ss <<
" \"type\": \"vector\",\n";
868 ss <<
" \"dimensionality\": {\n";
869 ss <<
" \"header\": [null],\n";
870 ss <<
" \"dimensions\": [" << this->growth_coefficient.
size() <<
"]\n";
872 ss <<
" \"values\":" << this->growth_coefficient <<
"\n";
877 ss <<
" \"name\": \"mean_length_old\",\n";
878 ss <<
" \"id\":" << this->mean_length_old.
id_m <<
",\n";
879 ss <<
" \"type\": \"vector\",\n";
880 ss <<
" \"dimensionality\": {\n";
881 ss <<
" \"header\": [null],\n";
882 ss <<
" \"dimensions\": [" << this->mean_length_old.
size() <<
"]\n";
884 ss <<
" \"values\":" << this->mean_length_old <<
"\n";
889 ss <<
" \"name\": \"reference_age_for_length_young\",\n";
890 ss <<
" \"id\":" << this->reference_age_for_length_young.
id_m <<
",\n";
891 ss <<
" \"type\": \"vector\",\n";
892 ss <<
" \"dimensionality\": {\n";
893 ss <<
" \"header\": [null],\n";
894 ss <<
" \"dimensions\": [" << this->reference_age_for_length_young.
size()
897 ss <<
" \"values\":" << this->reference_age_for_length_young <<
"\n";
902 ss <<
" \"name\": \"reference_age_for_length_old\",\n";
903 ss <<
" \"id\":" << this->reference_age_for_length_old.
id_m <<
",\n";
904 ss <<
" \"type\": \"vector\",\n";
905 ss <<
" \"dimensionality\": {\n";
906 ss <<
" \"header\": [null],\n";
907 ss <<
" \"dimensions\": [" << this->reference_age_for_length_old.
size()
910 ss <<
" \"values\":" << this->reference_age_for_length_old <<
"\n";
915 ss <<
" \"name\": \"length_weight_a\",\n";
916 ss <<
" \"id\":" << this->length_weight_a.
id_m <<
",\n";
917 ss <<
" \"type\": \"vector\",\n";
918 ss <<
" \"dimensionality\": {\n";
919 ss <<
" \"header\": [null],\n";
920 ss <<
" \"dimensions\": [" << this->length_weight_a.
size() <<
"]\n";
922 ss <<
" \"values\":" << this->length_weight_a <<
"\n";
927 ss <<
" \"name\": \"length_weight_b\",\n";
928 ss <<
" \"id\":" << this->length_weight_b.
id_m <<
",\n";
929 ss <<
" \"type\": \"vector\",\n";
930 ss <<
" \"dimensionality\": {\n";
931 ss <<
" \"header\": [null],\n";
932 ss <<
" \"dimensions\": [" << this->length_weight_b.
size() <<
"]\n";
934 ss <<
" \"values\":" << this->length_weight_b <<
"\n";
938 auto append_optional_parameter = [&](
const std::string& name,
940 if (pv.
size() == 0) {
946 ss <<
" \"name\": \"" << name <<
"\",\n";
947 ss <<
" \"id\":" << pv.
id_m <<
",\n";
948 ss <<
" \"type\": \"vector\",\n";
949 ss <<
" \"dimensionality\": {\n";
950 ss <<
" \"header\": [null],\n";
951 ss <<
" \"dimensions\": [" << pv.
size() <<
"]\n";
953 ss <<
" \"values\":" << pv <<
"\n";
957 append_optional_parameter(
"length_at_age_sd_young",
958 this->length_at_age_sd_young);
959 append_optional_parameter(
"length_at_age_sd_old",
960 this->length_at_age_sd_old);
961 append_optional_parameter(
"log_sd_mean_length_young",
962 this->log_sd_mean_length_young);
963 append_optional_parameter(
"log_sd_mean_length_old",
964 this->log_sd_mean_length_old);
965 append_optional_parameter(
"log_sd_growth_coefficient",
966 this->log_sd_growth_coefficient);
967 append_optional_parameter(
968 "mean_length_young_mean_length_old_logit_corr",
969 this->mean_length_young_mean_length_old_logit_corr);
970 append_optional_parameter(
971 "mean_length_young_growth_coefficient_logit_corr",
972 this->mean_length_young_growth_coefficient_logit_corr);
973 append_optional_parameter(
974 "mean_length_old_growth_coefficient_logit_corr",
975 this->mean_length_old_growth_coefficient_logit_corr);
983 template <
typename Type>
984 bool add_to_fims_tmb_internal() {
985 std::shared_ptr<fims_info::Information<Type>> info =
988 std::shared_ptr<fims_popdy::GrowthDerivedObservationBase<Type>>
989 growth_observation = std::make_shared<
991 std::shared_ptr<fims_popdy::VonBertalanffySchnuteGrowthModelAdapter<Type>>
992 vb = std::dynamic_pointer_cast<
997 "Failed to create VonBertalanffySchnute growth-derived observation "
1006 ValidateVonBertalanffySchnuteGrowthInputs(
true);
1008 std::stringstream ss;
1009 auto load_and_register = [&](VariableVector& pv, fims::Vector<Type>& target,
1010 const std::string& base_name,
bool log_scale) {
1011 target.resize(pv.
size());
1012 for (
size_t i = 0; i < pv.
size(); i++) {
1013 double v = pv[i].initial_value_m;
1016 Rcpp::stop((base_name +
" must be > 0").c_str());
1020 GetLengthReferenceParameterization() ==
1021 LengthReferenceParameterization::
1022 kEstimatedLengthYoungBelowConstantLengthOld) {
1026 v = fims_math::log(v);
1029 target[i] =
static_cast<Type
>(v);
1030 if (pv[i].estimation_type_m.get() ==
"fixed_effects") {
1032 ss <<
"Growth." << this->
id <<
"." << base_name <<
"." << pv[i].
id_m;
1033 info->RegisterParameterName(ss.str());
1034 info->RegisterParameter(target[i]);
1036 if (pv[i].estimation_type_m.get() ==
"random_effects") {
1038 ss <<
"Growth." << this->
id <<
"." << base_name <<
"." << pv[i].
id_m;
1039 info->RegisterRandomEffectName(ss.str());
1040 info->RegisterRandomEffect(target[i]);
1043 info->variable_map[pv.
id_m] = ⌖
1046 auto load_optional_and_register =
1047 [&](VariableVector& pv, fims::Vector<Type>& target,
1048 const std::string& base_name,
bool log_scale) {
1049 if (pv.
size() == 0) {
1053 load_and_register(pv, target, base_name, log_scale);
1056 ConfigureLengthReferenceParameterization<Type>(vb);
1059 "mean_length_young",
true);
1061 "mean_length_old",
true);
1063 "growth_coefficient",
true);
1065 vb->ReferenceAgeForLengthYoungVector(),
1066 "reference_age_for_length_young",
false);
1068 vb->ReferenceAgeForLengthOldVector(),
1069 "reference_age_for_length_old",
false);
1071 "length_weight_a",
true);
1073 "length_weight_b",
true);
1075 vb->LengthAtAgeSdYoungVector(),
1076 "length_at_age_sd_young",
true);
1078 vb->LengthAtAgeSdOldVector(),
1079 "length_at_age_sd_old",
true);
1081 vb->LogSdLengthAtRefAgeYoungVector(),
1082 "log_sd_mean_length_young",
false);
1084 vb->LogSdLengthAtRefAgeOldVector(),
1085 "log_sd_mean_length_old",
false);
1087 vb->LogSdGrowthCoefficientVector(),
1088 "log_sd_growth_coefficient",
false);
1089 load_optional_and_register(
1091 vb->LogitCorrLengthAtRefAgeYoungLengthAtRefAgeOldVector(),
1092 "mean_length_young_mean_length_old_logit_corr",
false);
1093 load_optional_and_register(
1095 vb->LogitCorrLengthAtRefAgeYoungKVector(),
1096 "mean_length_young_growth_coefficient_logit_corr",
false);
1097 load_optional_and_register(
1099 vb->LogitCorrLengthAtRefAgeOldKVector(),
1100 "mean_length_old_growth_coefficient_logit_corr",
false);
1107 this->add_to_fims_tmb_internal<TMB_FIMS_REAL_TYPE>();
1108 this->add_to_fims_tmb_internal<TMBAD_FIMS_TYPE>();
virtual ~EWAAGrowthInterface()
The destructor.
Definition rcpp_growth.hpp:201
SharedInt n_years
An integer specifying the number of years.
Definition rcpp_growth.hpp:163
std::shared_ptr< std::map< int, std::map< double, double > > > ewaa
A map of empirical weight-at-age values allowing multiple modules to access and modify the weights wi...
Definition rcpp_growth.hpp:168
virtual uint32_t get_id()
Gets the ID of the interface base object.
Definition rcpp_growth.hpp:207
RealVector ages
Ages (years) for each age class.
Definition rcpp_growth.hpp:158
virtual double evaluate(double age)
Evaluate the growth using empirical weight at age.
Definition rcpp_growth.hpp:271
EWAAGrowthInterface(const EWAAGrowthInterface &other)
Construct a new EWAAGrowthInterface object.
Definition rcpp_growth.hpp:190
std::map< int, std::map< double, double > > make_map(RealVector ages, RealVector weights, SharedInt n_years)
Create a map of input numeric vectors.
Definition rcpp_growth.hpp:216
bool initialized
Have weight and age vectors been set? The default is false.
Definition rcpp_growth.hpp:172
RealVector weights
Weights (mt) for each age class.
Definition rcpp_growth.hpp:154
EWAAGrowthInterface()
The constructor.
Definition rcpp_growth.hpp:177
virtual std::string to_json()
Converts the data to json representation for the output.
Definition rcpp_growth.hpp:293
Base class for all interface objects.
Definition rcpp_interface_base.hpp:655
bool finalized
Is the object already finalized? The default is false.
Definition rcpp_interface_base.hpp:660
static std::vector< std::shared_ptr< FIMSRcppInterfaceBase > > fims_interface_objects
FIMS interface object vectors.
Definition rcpp_interface_base.hpp:665
virtual bool add_to_fims_tmb()
A virtual method to inherit to add objects to the TMB model.
Definition rcpp_interface_base.hpp:670
Rcpp interface base for growth models that can register a growth-derived observation capability with ...
Definition rcpp_growth.hpp:84
void RegisterGrowthObservationInInfo(const std::shared_ptr< fims_popdy::GrowthDerivedObservationBase< Type > > &growth_observation) const
Register a runtime growth-derived observation in Information.
Definition rcpp_growth.hpp:135
GrowthDerivedObservationInterfaceBase(const GrowthDerivedObservationInterfaceBase &other)
Copy constructor.
Definition rcpp_growth.hpp:92
std::shared_ptr< fims_popdy::GrowthDerivedObservationBase< Type > > GetGrowthObservationFromInfo() const
Look up the registered growth-derived observation object.
Definition rcpp_growth.hpp:105
static std::map< uint32_t, std::shared_ptr< GrowthInterfaceBase > > live_objects
The map associating the IDs of GrowthInterfaceBase to the objects. This is a live object,...
Definition rcpp_growth.hpp:39
virtual double evaluate(double age)=0
A method for each child growth interface object to inherit so each growth option can have an evaluate...
GrowthInterfaceBase(const GrowthInterfaceBase &other)
Construct a new Growth Interface Base object.
Definition rcpp_growth.hpp:57
virtual ~GrowthInterfaceBase()
The destructor.
Definition rcpp_growth.hpp:62
GrowthInterfaceBase()
The constructor.
Definition rcpp_growth.hpp:44
uint32_t id
The local id of the GrowthInterfaceBase object.
Definition rcpp_growth.hpp:33
virtual uint32_t get_id()=0
Get the ID for the child growth interface objects to inherit.
An Rcpp interface class that defines the RealVector class.
Definition rcpp_interface_base.hpp:431
size_t size()
Returns the size of a RealVector.
Definition rcpp_interface_base.hpp:602
A class that provides shared ownership of an integer value.
Definition rcpp_shared_primitive.hpp:29
int get() const
Retrieve the value of the integer.
Definition rcpp_shared_primitive.hpp:127
An Rcpp interface class that defines the VariableVector class.
Definition rcpp_interface_base.hpp:143
Variable & get(size_t pos)
An internal accessor for calling a position of a VariableVector from R.
Definition rcpp_interface_base.hpp:266
uint32_t id_m
The local ID of the Variable object.
Definition rcpp_interface_base.hpp:156
void resize(size_t size)
Resizes a VariableVector to the desired length.
Definition rcpp_interface_base.hpp:294
size_t size()
Returns the size of a VariableVector.
Definition rcpp_interface_base.hpp:287
Rcpp-facing VonBertalanffySchnute growth module. Inherits "derived observation" capability so this gr...
Definition rcpp_growth.hpp:368
VonBertalanffySchnuteGrowthInterface(const VonBertalanffySchnuteGrowthInterface &other)
Copy constructor.
Definition rcpp_growth.hpp:455
VariableVector log_sd_growth_coefficient
Working-scale von Bertalanffy–Schnute variability parameter for sd(log(growth_coefficient)).
Definition rcpp_growth.hpp:408
virtual void finalize()
Extracts derived quantities back to the Rcpp interface object from the Information object.
Definition rcpp_growth.hpp:487
VariableVector mean_length_young
Expected length at the first reference age.
Definition rcpp_growth.hpp:371
virtual uint32_t get_id()
Get the ID for the child growth interface objects to inherit.
Definition rcpp_growth.hpp:481
VariableVector log_sd_mean_length_young
Working-scale von Bertalanffy–Schnute variability parameter for sd(log(mean_length_young)).
Definition rcpp_growth.hpp:398
VariableVector reference_age_for_length_young
First reference age for the length parameterization.
Definition rcpp_growth.hpp:378
VariableVector mean_length_young_growth_coefficient_logit_corr
Working-scale von Bertalanffy–Schnute variability parameter for corr(log(mean_length_young),...
Definition rcpp_growth.hpp:418
VariableVector growth_coefficient
Growth coefficient.
Definition rcpp_growth.hpp:375
virtual double evaluate(double age)
A method for each child growth interface object to inherit so each growth option can have an evaluate...
Definition rcpp_growth.hpp:558
VonBertalanffySchnuteGrowthInterface()
Construct a new VonBertalanffySchnute growth interface.
Definition rcpp_growth.hpp:430
VariableVector length_at_age_sd_old
Natural-scale length-at-age SD at the older reference age.
Definition rcpp_growth.hpp:393
SharedInt n_ages
Modeled number of ages used for validation.
Definition rcpp_growth.hpp:425
VariableVector reference_age_for_length_old
Second reference age for the length parameterization.
Definition rcpp_growth.hpp:380
VariableVector length_weight_a
Coefficient in the length-weight relationship, W = a * L^b.
Definition rcpp_growth.hpp:383
VariableVector log_sd_mean_length_old
Working-scale von Bertalanffy–Schnute variability parameter for sd(log(mean_length_old)).
Definition rcpp_growth.hpp:403
VariableVector mean_length_old_growth_coefficient_logit_corr
Working-scale von Bertalanffy–Schnute variability parameter for corr(log(mean_length_old),...
Definition rcpp_growth.hpp:423
VariableVector mean_length_young_mean_length_old_logit_corr
Working-scale von Bertalanffy–Schnute variability parameter for corr(log(mean_length_young),...
Definition rcpp_growth.hpp:413
VariableVector mean_length_old
Expected length at the second reference age.
Definition rcpp_growth.hpp:373
virtual std::string to_json()
Convert the data to json representation for the output.
Definition rcpp_growth.hpp:841
VariableVector length_weight_b
Exponent in the length-weight relationship, W = a * L^b.
Definition rcpp_growth.hpp:385
VariableVector length_at_age_sd_young
Natural-scale length-at-age SD at the younger reference age.
Definition rcpp_growth.hpp:389
Definition fims_vector.hpp:27
Generic capability interface for growth models that can feed the growth-derived age-to-length convers...
Definition growth_model_adapter.hpp:26
von Bertalanffy–Schnute growth model adapter implementing the generic growth-derived observation capa...
Definition growth_model_adapter.hpp:79
#define FIMS_WARNING_LOG(MESSAGE)
Definition def.hpp:648
std::string to_string(T v)
Definition def.hpp:735
A collection of mathematical functions used in FIMS.
const Type logit(const Type &a, const Type &b, const Type &x)
A logit function for bounding of parameters.
Definition fims_math.hpp:261
const Type inv_logit(const Type &a, const Type &b, const Type &logit_x)
An inverse logit function for bounding of parameters.
Definition fims_math.hpp:276
Establishes the FIMS Vector class.
Includes any .hpp files within the subfolders so that only this file needs to included in include sta...
The Rcpp interface to declare objects that are used ubiquitously throughout the Rcpp interface,...
uint32_t id
Definition model_object.hpp:56
EWAAGrowth class that returns the EWAA function value.
Definition ewaa.hpp:23
std::map< int, std::map< double, double > > ewaa
Definition ewaa.hpp:29
virtual const Type evaluate(int year, const double &a)
Returns the weight at age a (in kg) from the input vector.
Definition ewaa.hpp:44
VonBertalanffySchnute growth functor for length-at-age and weight-at-age.
Definition vonb_schnute.hpp:32
Type mean_length_young
Expected length at the first reference age.
Definition vonb_schnute.hpp:34
Type reference_age_for_length_old
Second reference age for the length parameterization.
Definition vonb_schnute.hpp:42
Type growth_coefficient
Growth coefficient.
Definition vonb_schnute.hpp:38
Type length_weight_b
Exponent in the length-weight relationship, W = a * L^b.
Definition vonb_schnute.hpp:47
Type reference_age_for_length_young
First reference age for the length parameterization.
Definition vonb_schnute.hpp:40
Type length_weight_a
Coefficient in the length-weight relationship, W = a * L^b.
Definition vonb_schnute.hpp:45
virtual const Type evaluate(int year, const double &a) override
Calculates the growth at the independent variable value.
Definition vonb_schnute.hpp:194
Type mean_length_old
Expected length at the second reference age.
Definition vonb_schnute.hpp:36