FIMS  v0.8.0
Loading...
Searching...
No Matches
rcpp_distribution.hpp
Go to the documentation of this file.
1
9#ifndef FIMS_INTERFACE_RCPP_RCPP_OBJECTS_RCPP_DISTRIBUTION_HPP
10#define FIMS_INTERFACE_RCPP_RCPP_OBJECTS_RCPP_DISTRIBUTION_HPP
11
12#include "../../../distributions/distributions.hpp"
13#include "../../interface.hpp"
15
21 public:
25 static uint32_t id_g;
33 std::shared_ptr<std::vector<uint32_t>> key_m;
61 SharedString use_mean_m = fims::to_string("no");
67 static std::map<uint32_t, std::shared_ptr<DistributionsInterfaceBase>>
73
77 double lpdf_value = 0;
82 this->key_m = std::make_shared<std::vector<uint32_t>>();
84 /* Create instance of map: key is id and value is pointer to
85 DistributionsInterfaceBase */
86 // DistributionsInterfaceBase::live_objects[this->id_m] = this;
87 }
88
100
105
109 virtual uint32_t get_id() = 0;
110
119 virtual bool set_distribution_links(std::string input_type,
120 Rcpp::IntegerVector ids) {
121 return false;
122 }
123
147 virtual bool set_distribution_mean(double input_value) { return false; }
148
155 virtual bool set_observed_data(int observed_data_id) { return false; }
156
161 virtual double evaluate() = 0;
162};
163// static id of the DistributionsInterfaceBase object
165// local id of the DistributionsInterfaceBase object map relating the ID of the
166// DistributionsInterfaceBase to the DistributionsInterfaceBase objects
167std::map<uint32_t, std::shared_ptr<DistributionsInterfaceBase>>
169
175 public:
210
223
228
233 virtual uint32_t get_id() { return this->id_m; }
234
240 this->interface_observed_data_id_m.set(observed_data_id);
241 return true;
242 }
243
247 virtual bool set_distribution_mean(double input_value) {
248 this->expected_mean[0].initial_value_m = input_value;
249 this->expected_mean[0].estimation_type_m.set("fixed_effects");
250 this->use_mean_m.set(fims::to_string("yes"));
251 return true;
252 }
253
257 virtual bool set_distribution_links(std::string input_type,
258 Rcpp::IntegerVector ids) {
259 this->input_type_m.set(input_type);
260 this->key_m->resize(ids.size());
261 for (R_xlen_t i = 0; i < ids.size(); i++) {
262 this->key_m->at(i) = ids[i];
263 }
264 return true;
265 }
266
273 virtual double evaluate() {
275 dnorm.x.resize(this->x.size());
276 dnorm.expected_values.resize(this->expected_values.size());
277 dnorm.log_sd.resize(this->log_sd.size());
278 dnorm.expected_mean.resize(this->expected_mean.size());
279 for (size_t i = 0; i < x.size(); i++) {
280 dnorm.x[i] = this->x[i].initial_value_m;
281 }
282 for (size_t i = 0; i < expected_values.size(); i++) {
283 dnorm.expected_values[i] = this->expected_values[i].initial_value_m;
284 }
285 for (size_t i = 0; i < log_sd.size(); i++) {
286 dnorm.log_sd[i] = this->log_sd[i].initial_value_m;
287 }
288 for (size_t i = 0; i < expected_mean.size(); i++) {
289 dnorm.expected_mean[i] = this->expected_mean[i].initial_value_m;
290 }
291 dnorm.use_mean = this->use_mean_m;
292 return dnorm.evaluate();
293 }
294
299 virtual void finalize() {
300 if (this->finalized) {
301 // log warning that finalize has been called more than once.
302 FIMS_WARNING_LOG("DnormDistribution " + fims::to_string(this->id_m) +
303 " has been finalized already.");
304 }
305
306 this->finalized = true; // indicate this has been called already
307
308 std::shared_ptr<fims_info::Information<double>> info =
310
312
313 // search for density component in Information
314 it = info->density_components.find(this->id_m);
315 // if not found, just return
316 if (it == info->density_components.end()) {
317 FIMS_WARNING_LOG("DnormDistribution " + fims::to_string(this->id_m) +
318 " not found in Information.");
319 return;
320 } else {
321 std::shared_ptr<fims_distributions::NormalLPDF<double>> dnorm =
322 std::dynamic_pointer_cast<fims_distributions::NormalLPDF<double>>(
323 it->second);
324
325 this->lpdf_value = dnorm->lpdf;
326
327 size_t n_x = dnorm->get_n_x();
328
329 // If input log_sd is a scalar, resize to n_x and fill with the scalar
330 // value
331 if (this->log_sd.size() != n_x) {
332 // If log_sd size == 1 (scalar), repeat the entry
333 if (this->log_sd.size() == 1) {
334 auto tmp = this->log_sd[0]; // copy the one log_sd param
335 this->log_sd.resize(n_x);
336 for (size_t i = 0; i < n_x; ++i) {
337 this->log_sd[i] = tmp; // copies all fields in Param
338 }
339 } else {
340 // Handle error
342 "log_sd size does not match number of observations and is not "
343 "scalar.");
344 }
345 }
346 for (size_t i = 0; i < n_x; i++) {
347 if (this->log_sd[i].estimation_type_m.get() == "constant") {
348 this->log_sd[i].final_value_m = this->log_sd[i].initial_value_m;
349 } else {
350 this->log_sd[i].final_value_m = dnorm->log_sd.get_force_scalar(i);
351 }
352 }
353
354 for (size_t i = 0; i < this->expected_mean.size(); i++) {
355 if (this->expected_mean[i].estimation_type_m.get() == "constant") {
356 this->expected_mean[i].final_value_m =
357 this->expected_mean[i].initial_value_m;
358 } else {
359 this->expected_mean[i].final_value_m = dnorm->expected_mean[i];
360 }
361 }
362
363 this->lpdf_vec = RealVector(n_x);
364 if (this->expected_values.size() == 1) {
365 this->expected_values.resize(n_x);
366 }
367 if (this->x.size() == 1) {
368 this->x.resize(n_x);
369 }
370
371 for (size_t i = 0; i < this->lpdf_vec.size(); i++) {
372 this->lpdf_vec[i] = dnorm->report_lpdf_vec[i];
373 this->expected_values[i].final_value_m = dnorm->get_expected(i);
374 this->x[i].final_value_m = dnorm->get_observed(i);
375 }
376 }
377 }
378
386 virtual std::string to_json() {
387 std::stringstream ss;
388
389 ss << "{\n";
390 ss << " \"module_name\": \"density\",\n";
391 ss << " \"module_id\": " << this->id_m << ",\n";
392 ss << " \"module_type\": \"normal\",\n";
393 ss << " \"observed_data_id\" : " << this->interface_observed_data_id_m
394 << ",\n";
395 ss << " \"input_type\" : \"" << this->input_type_m << "\",\n";
396 ss << " \"density_component\": {\n";
397 ss << " \"lpdf_value\": " << this->lpdf_value << ",\n";
398 ss << " \"value\":[";
399 if (this->lpdf_vec.size() == 0) {
400 ss << "],\n";
401 } else {
402 for (size_t i = 0; i < this->lpdf_vec.size() - 1; i++) {
403 ss << this->value_to_string(this->lpdf_vec[i]);
404 ss << ", ";
405 }
406 ss << this->value_to_string(this->lpdf_vec[this->lpdf_vec.size() - 1]);
407
408 ss << "],\n";
409 }
410 ss << " \"expected_values\":[";
411 if (this->expected_values.size() == 0) {
412 ss << "],\n";
413 } else {
414 for (size_t i = 0; i < this->expected_values.size() - 1; i++) {
415 ss << this->value_to_string(this->expected_values[i].final_value_m)
416 << ", ";
417 }
418 ss << this->value_to_string(
419 this->expected_values[this->expected_values.size() - 1]
420 .final_value_m);
421 ss << "],\n";
422 }
423 ss << " \"log_sd_values\":[";
424 if (this->log_sd.size() == 0) {
425 ss << "],\n";
426 } else {
427 for (R_xlen_t i = 0; i < static_cast<R_xlen_t>(this->log_sd.size()) - 1;
428 i++) {
429 ss << this->value_to_string(this->log_sd[i].final_value_m) << ", ";
430 }
431 ss << this->value_to_string(
432 this->log_sd[this->log_sd.size() - 1].final_value_m)
433 << "],\n";
434 }
435 ss << " \"observed_values\":[";
436 if (this->x.size() == 0) {
437 ss << "]\n";
438 } else {
439 for (size_t i = 0; i < this->x.size() - 1; i++) {
440 ss << this->x[i].final_value_m << ", ";
441 }
442 ss << this->x[this->x.size() - 1].final_value_m << "]\n";
443 }
444 ss << " }}\n";
445 return ss.str();
446 }
447
448#ifdef TMB_MODEL
449
450 template <typename Type>
452 std::shared_ptr<fims_info::Information<Type>> info =
454
455 std::shared_ptr<fims_distributions::NormalLPDF<Type>> distribution =
456 std::make_shared<fims_distributions::NormalLPDF<Type>>();
457
458 // interface to data/parameter value
459
460 distribution->observed_data_id_m = interface_observed_data_id_m;
461 std::stringstream ss;
462 distribution->input_type = this->input_type_m;
463 distribution->key.resize(this->key_m->size());
464 for (size_t i = 0; i < this->key_m->size(); i++) {
465 distribution->key[i] = this->key_m->at(i);
466 }
467 distribution->id = this->id_m;
468 distribution->x.resize(this->x.size());
469 for (size_t i = 0; i < this->x.size(); i++) {
470 distribution->x[i] = this->x[i].initial_value_m;
471 }
472 // set relative info
473 distribution->expected_values.resize(this->expected_values.size());
474 for (size_t i = 0; i < this->expected_values.size(); i++) {
475 distribution->expected_values[i] =
476 this->expected_values[i].initial_value_m;
477 }
478 distribution->log_sd.resize(this->log_sd.size());
479 for (size_t i = 0; i < this->log_sd.size(); i++) {
480 distribution->log_sd[i] = this->log_sd[i].initial_value_m;
481 if (this->log_sd[i].estimation_type_m.get() == "fixed_effects") {
482 ss.str("");
483 ss << "dnorm." << this->id_m << ".log_sd." << this->log_sd[i].id_m;
484 info->RegisterParameterName(ss.str());
485 info->RegisterParameter(distribution->log_sd[i]);
486 }
487 if (this->log_sd[i].estimation_type_m.get() == "random_effects") {
488 FIMS_ERROR_LOG("standard deviations cannot be set to random effects");
489 }
490 }
491 info->variable_map[this->log_sd.id_m] = &(distribution)->log_sd;
492
493 distribution->use_mean = this->use_mean_m.get();
494 distribution->expected_mean.resize(this->expected_mean.size());
495 for (size_t i = 0; i < this->expected_mean.size(); i++) {
496 distribution->expected_mean[i] = this->expected_mean[i].initial_value_m;
497 if (this->expected_mean[i].estimation_type_m.get() == "fixed_effects") {
498 ss.str("");
499 ss << "dnorm." << this->id_m << ".expected_mean."
500 << this->expected_mean[i].id_m;
501 info->RegisterParameterName(ss.str());
502 info->RegisterParameter(distribution->expected_mean[i]);
503 }
504 if (this->expected_mean[i].estimation_type_m.get() == "random_effects") {
505 FIMS_ERROR_LOG("expected_mean cannot be set to random effects");
506 }
507 }
508 info->variable_map[this->expected_mean.id_m] =
510
511 info->density_components[distribution->id] = distribution;
512
513 return true;
514 }
515
520 virtual bool add_to_fims_tmb() {
521#ifdef TMBAD_FRAMEWORK
524#else
529#endif
530
531 return true;
532 }
533
534#endif
535};
536
542 public:
575
587
592
597 virtual uint32_t get_id() { return this->id_m; }
598
604 this->interface_observed_data_id_m.set(observed_data_id);
605 return true;
606 }
607
616 virtual bool set_distribution_links(std::string input_type,
617 Rcpp::IntegerVector ids) {
618 this->input_type_m.set(input_type);
619 this->key_m->resize(ids.size());
620 for (R_xlen_t i = 0; i < ids.size(); i++) {
621 this->key_m->at(i) = ids[i];
622 }
623 return true;
624 }
625
632 virtual double evaluate() {
634 dlnorm.x.resize(this->x.size());
635 dlnorm.expected_values.resize(this->expected_values.size());
636 dlnorm.log_sd.resize(this->log_sd.size());
637 // dlnorm.input_type = "prior";
638 for (size_t i = 0; i < x.size(); i++) {
639 dlnorm.x[i] = this->x[i].initial_value_m;
640 }
641 for (size_t i = 0; i < expected_values.size(); i++) {
642 dlnorm.expected_values[i] = this->expected_values[i].initial_value_m;
643 }
644 for (size_t i = 0; i < log_sd.size(); i++) {
645 dlnorm.log_sd[i] = this->log_sd[i].initial_value_m;
646 }
647 return dlnorm.evaluate();
648 }
649
654 virtual void finalize() {
655 if (this->finalized) {
656 // log warning that finalize has been called more than once.
657 FIMS_WARNING_LOG("LogNormalLPDF " + fims::to_string(this->id_m) +
658 " has been finalized already.");
659 }
660
661 this->finalized = true; // indicate this has been called already
662
663 std::shared_ptr<fims_info::Information<double>> info =
665
667
668 // search for density component in Information
669 it = info->density_components.find(this->id_m);
670 // if not found, just return
671 if (it == info->density_components.end()) {
672 FIMS_WARNING_LOG("LogNormalLPDF " + fims::to_string(this->id_m) +
673 " not found in Information.");
674 return;
675 } else {
676 std::shared_ptr<fims_distributions::LogNormalLPDF<double>> dlnorm =
677 std::dynamic_pointer_cast<fims_distributions::LogNormalLPDF<double>>(
678 it->second);
679
680 this->lpdf_value = dlnorm->lpdf;
681
682 size_t n_x = dlnorm->get_n_x();
683
684 if (this->log_sd.size() != n_x) {
685 // If log_sd size == 1 (scalar), repeat the entry
686 if (this->log_sd.size() == 1) {
687 auto tmp = this->log_sd[0]; // copy the one log_sd param
688 this->log_sd.resize(n_x);
689 for (size_t i = 0; i < n_x; ++i) {
690 this->log_sd[i] = tmp; // copies all fields in Param
691 }
692 } else {
693 // Handle error
695 "log_sd size does not match number of observations and is not "
696 "scalar.");
697 }
698 }
699
700 for (size_t i = 0; i < n_x; i++) {
701 if (this->log_sd[i].estimation_type_m.get() == "constant") {
702 this->log_sd[i].final_value_m = this->log_sd[i].initial_value_m;
703 } else {
704 this->log_sd[i].final_value_m = dlnorm->log_sd.get_force_scalar(i);
705 }
706 }
707
708 this->lpdf_vec = RealVector(n_x);
709 if (this->expected_values.size() == 1) {
710 this->expected_values.resize(n_x);
711 }
712 if (this->x.size() == 1) {
713 this->x.resize(n_x);
714 }
715 for (size_t i = 0; i < this->lpdf_vec.size(); i++) {
716 this->lpdf_vec[i] = dlnorm->report_lpdf_vec[i];
717 this->expected_values[i].final_value_m = dlnorm->get_expected(i);
718 this->x[i].final_value_m = dlnorm->get_observed(i);
719 }
720 }
721 }
722
730 virtual std::string to_json() {
731 std::stringstream ss;
732
733 ss << "{\n";
734 ss << " \"module_name\": \"density\",\n";
735 ss << " \"module_id\": " << this->id_m << ",\n";
736 ss << " \"module_type\": \"log_normal\",\n";
737 ss << " \"observed_data_id\" : " << this->interface_observed_data_id_m
738 << ",\n";
739 ss << " \"input_type\" : \"" << this->input_type_m << "\",\n";
740 ss << " \"density_component\": {\n";
741 ss << " \"lpdf_value\": " << this->lpdf_value << ",\n";
742 ss << " \"value\":[";
743 if (this->lpdf_vec.size() == 0) {
744 ss << "]\n";
745 } else {
746 for (size_t i = 0; i < this->lpdf_vec.size() - 1; i++) {
747 ss << this->value_to_string(this->lpdf_vec[i]) << ", ";
748 }
749 ss << this->value_to_string(this->lpdf_vec[this->lpdf_vec.size() - 1]);
750
751 ss << "],\n";
752 }
753 ss << " \"expected_values\":[";
754 if (this->expected_values.size() == 0) {
755 ss << "],\n";
756 } else {
757 for (size_t i = 0; i < this->expected_values.size() - 1; i++) {
758 ss << this->value_to_string(this->expected_values[i].final_value_m)
759 << ", ";
760 }
761 ss << this->value_to_string(
762 this->expected_values[this->expected_values.size() - 1]
763 .final_value_m);
764
765 ss << "],\n";
766 }
767 ss << " \"log_sd_values\":[";
768 if (this->log_sd.size() == 0) {
769 ss << "],\n";
770 } else {
771 for (R_xlen_t i = 0; i < static_cast<R_xlen_t>(this->log_sd.size()) - 1;
772 i++) {
773 ss << this->value_to_string(this->log_sd[i].final_value_m) << ", ";
774 }
775 ss << this->value_to_string(
776 this->log_sd[this->log_sd.size() - 1].final_value_m)
777 << "],\n";
778 }
779 ss << " \"observed_values\":[";
780 if (this->x.size() == 0) {
781 ss << "]\n";
782 } else {
783 for (size_t i = 0; i < this->x.size() - 1; i++) {
784 ss << this->x[i].final_value_m << ", ";
785 }
786 ss << this->x[this->x.size() - 1].final_value_m << "]\n";
787 }
788 ss << " }}\n";
789 return ss.str();
790 }
791
792#ifdef TMB_MODEL
793
794 template <typename Type>
796 std::shared_ptr<fims_info::Information<Type>> info =
798
799 std::shared_ptr<fims_distributions::LogNormalLPDF<Type>> distribution =
800 std::make_shared<fims_distributions::LogNormalLPDF<Type>>();
801
802 // set relative info
803 distribution->id = this->id_m;
804 std::stringstream ss;
805 distribution->observed_data_id_m = interface_observed_data_id_m;
806 distribution->input_type = this->input_type_m;
807 distribution->key.resize(this->key_m->size());
808 for (size_t i = 0; i < this->key_m->size(); i++) {
809 distribution->key[i] = this->key_m->at(i);
810 }
811 distribution->x.resize(this->x.size());
812 for (size_t i = 0; i < this->x.size(); i++) {
813 distribution->x[i] = this->x[i].initial_value_m;
814 }
815 // set relative info
816 distribution->expected_values.resize(this->expected_values.size());
817 for (size_t i = 0; i < this->expected_values.size(); i++) {
818 distribution->expected_values[i] =
819 this->expected_values[i].initial_value_m;
820 }
821 distribution->log_sd.resize(this->log_sd.size());
822 for (size_t i = 0; i < this->log_sd.size(); i++) {
823 distribution->log_sd[i] = this->log_sd[i].initial_value_m;
824 if (this->log_sd[i].estimation_type_m.get() == "fixed_effects") {
825 ss.str("");
826 ss << "dlnorm." << this->id_m << ".log_sd." << this->log_sd[i].id_m;
827 info->RegisterParameterName(ss.str());
828 info->RegisterParameter(distribution->log_sd[i]);
829 }
830 if (this->log_sd[i].estimation_type_m.get() == "random_effects") {
831 FIMS_ERROR_LOG("standard deviations cannot be set to random effects");
832 }
833 }
834 info->variable_map[this->log_sd.id_m] = &(distribution)->log_sd;
835
836 info->density_components[distribution->id] = distribution;
837
838 return true;
839 }
840
845 virtual bool add_to_fims_tmb() {
846#ifdef TMBAD_FRAMEWORK
849#else
854#endif
855
856 return true;
857 }
858
859#endif
860};
861
867 public:
894
904
917
926 virtual uint32_t get_id() { return this->id_m; }
927
933 this->interface_observed_data_id_m.set(observed_data_id);
934 return true;
935 }
936
945 virtual bool set_distribution_links(std::string input_type,
946 Rcpp::IntegerVector ids) {
947 this->input_type_m.set(input_type);
948 this->key_m->resize(ids.size());
949 for (R_xlen_t i = 0; i < ids.size(); i++) {
950 this->key_m->at(i) = ids[i];
951 }
952 return true;
953 }
954
960 void set_note(std::string note) { this->notes.set(note); }
961
967 virtual double evaluate() {
969 // Declare TMBVector in this scope
970 dmultinom.x.resize(this->x.size());
971 dmultinom.expected_values.resize(this->expected_values.size());
972 for (size_t i = 0; i < x.size(); i++) {
973 dmultinom.x[i] = this->x[i].initial_value_m;
974 }
975 for (size_t i = 0; i < expected_values.size(); i++) {
976 dmultinom.expected_values[i] = this->expected_values[i].initial_value_m;
977 }
978 dmultinom.dims.resize(2);
979 dmultinom.dims[0] = this->dims[0];
980 dmultinom.dims[1] = this->dims[1];
981 return dmultinom.evaluate();
982 }
983
984 void finalize() {
985 if (this->finalized) {
986 // log warning that finalize has been called more than once.
987 FIMS_WARNING_LOG("DmultinomDistributions " +
988 fims::to_string(this->id_m) +
989 " has been finalized already.");
990 }
991
992 this->finalized = true; // indicate this has been called already
993
994 std::shared_ptr<fims_info::Information<double>> info =
996
998
999 // search for density component in Information
1000 it = info->density_components.find(this->id_m);
1001 // if not found, just return
1002 if (it == info->density_components.end()) {
1003 FIMS_WARNING_LOG("DmultinomDistributions " + fims::to_string(this->id_m) +
1004 " not found in Information.");
1005 return;
1006 } else {
1007 std::shared_ptr<fims_distributions::MultinomialLPMF<double>> dmultinom =
1008 std::dynamic_pointer_cast<
1010
1011 this->lpdf_value = dmultinom->lpdf;
1012
1013 size_t n_x = dmultinom->report_lpdf_vec.size();
1014 this->lpdf_vec = Rcpp::NumericVector(n_x);
1015 if (this->expected_values.size() != n_x) {
1016 this->expected_values.resize(n_x);
1017 }
1018 if (this->x.size() != n_x) {
1019 this->x.resize(n_x);
1020 }
1021 for (size_t i = 0; i < this->lpdf_vec.size(); i++) {
1022 this->lpdf_vec[i] = dmultinom->report_lpdf_vec[i];
1023 this->expected_values[i].final_value_m = dmultinom->get_expected(i);
1024 if (dmultinom->input_type != "data") {
1025 this->x[i].final_value_m = dmultinom->get_observed(i);
1026 }
1027 }
1028 if (dmultinom->input_type == "data") {
1029 dims.resize(2);
1030 dims[0] = dmultinom->dims[0];
1031 dims[1] = dmultinom->dims[1];
1032 for (size_t i = 0; i < dims[0]; i++) {
1033 for (size_t j = 0; j < dims[1]; j++) {
1034 size_t idx = (i * dims[1]) + j;
1035 this->x[idx].final_value_m = dmultinom->get_observed(
1036 static_cast<size_t>(i), static_cast<size_t>(j));
1037 }
1038 }
1039 }
1040 }
1041 }
1042
1050 virtual std::string to_json() {
1051 std::stringstream ss;
1052
1053 ss << "{\n";
1054 ss << " \"module_name\": \"density\",\n";
1055 ss << " \"module_id\": " << this->id_m << ",\n";
1056 ss << " \"module_type\": \"multinomial\",\n";
1057 ss << "\"observed_data_id\" : " << this->interface_observed_data_id_m
1058 << ",\n";
1059 ss << " \"input_type\" : \"" << this->input_type_m << "\",\n";
1060 ss << " \"density_component\": {\n";
1061 ss << " \"lpdf_value\": " << this->lpdf_value << ",\n";
1062 ss << " \"value\":[";
1063 if (this->lpdf_vec.size() == 0) {
1064 ss << "],\n";
1065 } else {
1066 for (size_t i = 0; i < this->lpdf_vec.size() - 1; i++) {
1067 ss << this->value_to_string(this->lpdf_vec[i]);
1068 ss << ", ";
1069 }
1070 ss << this->value_to_string(this->lpdf_vec[this->lpdf_vec.size() - 1]);
1071
1072 ss << "],\n";
1073 }
1074 ss << " \"expected_values\":[";
1075 if (this->expected_values.size() == 0) {
1076 ss << "],\n";
1077 } else {
1078 for (size_t i = 0; i < this->expected_values.size() - 1; i++) {
1079 ss << this->value_to_string(this->expected_values[i].final_value_m)
1080 << ", ";
1081 }
1082 ss << this->value_to_string(
1083 this->expected_values[this->expected_values.size() - 1]
1084 .final_value_m);
1085
1086 ss << "],\n";
1087 }
1088 // no log_sd_values for multinomial
1089 ss << " \"observed_values\":[";
1090 if (this->x.size() == 0) {
1091 ss << "]\n";
1092 } else {
1093 for (size_t i = 0; i < this->x.size() - 1; i++) {
1094 ss << this->x[i].final_value_m << ", ";
1095 }
1096 ss << this->x[this->x.size() - 1].final_value_m << "]\n";
1097 }
1098 ss << " }}\n";
1099 return ss.str();
1100 }
1101
1102#ifdef TMB_MODEL
1103
1104 template <typename Type>
1106 FIMS_INFO_LOG("Adding multinomial to FIMS.");
1107 std::shared_ptr<fims_info::Information<Type>> info =
1109
1110 std::shared_ptr<fims_distributions::MultinomialLPMF<Type>> distribution =
1111 std::make_shared<fims_distributions::MultinomialLPMF<Type>>();
1112
1113 distribution->id = this->id_m;
1114 distribution->observed_data_id_m = interface_observed_data_id_m;
1115 distribution->input_type = this->input_type_m;
1116 distribution->key.resize(this->key_m->size());
1117 for (size_t i = 0; i < this->key_m->size(); i++) {
1118 distribution->key[i] = this->key_m->at(i);
1119 }
1120 distribution->x.resize(this->x.size());
1121 for (size_t i = 0; i < this->x.size(); i++) {
1122 distribution->x[i] = this->x[i].initial_value_m;
1123 }
1124 // set relative info
1125 distribution->expected_values.resize(this->expected_values.size());
1126 for (size_t i = 0; i < this->expected_values.size(); i++) {
1127 distribution->expected_values[i] =
1128 this->expected_values[i].initial_value_m;
1129 }
1130
1131 info->density_components[distribution->id] = distribution;
1132 FIMS_INFO_LOG("Done adding multinomial to FIMS.");
1133 return true;
1134 }
1135
1136 virtual bool add_to_fims_tmb() {
1137#ifdef TMBAD_FRAMEWORK
1140#else
1145#endif
1146
1147 return true;
1148 }
1149
1150#endif
1151};
1152
1153#endif
Rcpp interface that serves as the parent class for Rcpp distribution interfaces. This type should be ...
Definition rcpp_distribution.hpp:20
virtual bool set_observed_data(int observed_data_id)
Set the unique ID for the observed data object.
Definition rcpp_distribution.hpp:155
double lpdf_value
The log probability density function value.
Definition rcpp_distribution.hpp:77
virtual ~DistributionsInterfaceBase()
The destructor.
Definition rcpp_distribution.hpp:104
virtual double evaluate()=0
A method for each child distribution interface object to inherit so each distribution can have an eva...
std::shared_ptr< std::vector< uint32_t > > key_m
The unique ID for the variable map that points to a fims::Vector.
Definition rcpp_distribution.hpp:33
DistributionsInterfaceBase(const DistributionsInterfaceBase &other)
Construct a new Distributions Interface Base object.
Definition rcpp_distribution.hpp:94
uint32_t id_m
The local ID of the DistributionsInterfaceBase object.
Definition rcpp_distribution.hpp:29
virtual uint32_t get_id()=0
Get the ID for the child distribution interface objects to inherit.
SharedString use_mean_m
Control flag indicating whether to use the expected mean in the distribution calculations.
Definition rcpp_distribution.hpp:61
SharedInt interface_observed_data_id_m
The ID of the observed data object, which is set to -999.
Definition rcpp_distribution.hpp:72
virtual bool set_distribution_mean(double input_value)
Set the expected mean value for the distribution.
Definition rcpp_distribution.hpp:147
virtual bool set_distribution_links(std::string input_type, Rcpp::IntegerVector ids)
Sets pointers for data observations, random effects, or priors.
Definition rcpp_distribution.hpp:119
static uint32_t id_g
The static ID of the DistributionsInterfaceBase object.
Definition rcpp_distribution.hpp:25
static std::map< uint32_t, std::shared_ptr< DistributionsInterfaceBase > > live_objects
The map associating the ID of the DistributionsInterfaceBase to the DistributionsInterfaceBase object...
Definition rcpp_distribution.hpp:68
SharedString input_type_m
The type of density input. The options are prior, re, or data.
Definition rcpp_distribution.hpp:37
DistributionsInterfaceBase()
The constructor.
Definition rcpp_distribution.hpp:81
The Rcpp interface for Dlnorm to instantiate from R: dlnorm_ <- methods::new(DlnormDistribution).
Definition rcpp_distribution.hpp:541
virtual bool set_distribution_links(std::string input_type, Rcpp::IntegerVector ids)
Sets pointers for data observations, random effects, or priors.
Definition rcpp_distribution.hpp:616
DlnormDistributionsInterface(const DlnormDistributionsInterface &other)
Construct a new Dlnorm Distributions Interface object.
Definition rcpp_distribution.hpp:581
DlnormDistributionsInterface()
The constructor.
Definition rcpp_distribution.hpp:569
ParameterVector expected_values
The expected values, which would be the mean of log(x) for this distribution.
Definition rcpp_distribution.hpp:551
virtual std::string to_json()
Converts the data to json representation for the output.
Definition rcpp_distribution.hpp:730
virtual uint32_t get_id()
Gets the ID of the interface base object.
Definition rcpp_distribution.hpp:597
virtual double evaluate()
Evaluate lognormal probability density function (pdf). The natural log of the pdf is returned.
Definition rcpp_distribution.hpp:632
ParameterVector log_sd
The uncertainty, which would be the natural logarithm of the standard deviation (sd) of log(x) for th...
Definition rcpp_distribution.hpp:559
virtual bool set_observed_data(int observed_data_id)
Set the unique ID for the observed data object.
Definition rcpp_distribution.hpp:603
ParameterVector x
Observed data.
Definition rcpp_distribution.hpp:546
virtual void finalize()
Extracts the derived quantities from Information to the Rcpp object.
Definition rcpp_distribution.hpp:654
virtual ~DlnormDistributionsInterface()
The destructor.
Definition rcpp_distribution.hpp:591
RealVector lpdf_vec
Vector that records the individual log probability function for each observation.
Definition rcpp_distribution.hpp:564
The Rcpp interface for Dmultinom to instantiate from R: dmultinom_ <- methods::new(DmultinomDistribut...
Definition rcpp_distribution.hpp:866
virtual bool set_distribution_links(std::string input_type, Rcpp::IntegerVector ids)
Sets pointers for data observations, random effects, or priors.
Definition rcpp_distribution.hpp:945
SharedString notes
TODO: document this.
Definition rcpp_distribution.hpp:893
virtual uint32_t get_id()
Gets the ID of the interface base object.
Definition rcpp_distribution.hpp:926
ParameterVector x
Observed data, which should be a vector of length K of integers.
Definition rcpp_distribution.hpp:871
ParameterVector expected_values
The expected values, which should be a vector of length K where each value specifies the probability ...
Definition rcpp_distribution.hpp:877
void finalize()
Extracts derived quantities back to the Rcpp interface object from the Information object.
Definition rcpp_distribution.hpp:984
virtual double evaluate()
Definition rcpp_distribution.hpp:967
void set_note(std::string note)
Set the note object.
Definition rcpp_distribution.hpp:960
virtual bool set_observed_data(int observed_data_id)
Set the unique ID for the observed data object.
Definition rcpp_distribution.hpp:932
RealVector dims
The dimensions of the number of rows and columns of the multivariate dataset.
Definition rcpp_distribution.hpp:882
DmultinomDistributionsInterface()
The constructor.
Definition rcpp_distribution.hpp:898
virtual std::string to_json()
Converts the data to json representation for the output.
Definition rcpp_distribution.hpp:1050
RealVector lpdf_vec
Vector that records the individual log probability function for each observation.
Definition rcpp_distribution.hpp:887
DmultinomDistributionsInterface(const DmultinomDistributionsInterface &other)
Construct a new Dmultinom Distributions Interface object.
Definition rcpp_distribution.hpp:910
virtual ~DmultinomDistributionsInterface()
The destructor.
Definition rcpp_distribution.hpp:921
The Rcpp interface for Dnorm to instantiate from R: dnorm_ <- methods::new(DnormDistribution).
Definition rcpp_distribution.hpp:174
ParameterVector x
Observed data.
Definition rcpp_distribution.hpp:179
DnormDistributionsInterface(const DnormDistributionsInterface &other)
Construct a new Dnorm Distributions Interface object.
Definition rcpp_distribution.hpp:216
ParameterVector expected_mean
The expected mean, which would be the mean of x for this distribution.
Definition rcpp_distribution.hpp:189
DnormDistributionsInterface()
The constructor.
Definition rcpp_distribution.hpp:204
virtual std::string to_json()
Converts the data to json representation for the output.
Definition rcpp_distribution.hpp:386
virtual ~DnormDistributionsInterface()
The destructor.
Definition rcpp_distribution.hpp:227
RealVector lpdf_vec
Vector that records the individual log probability function for each observation.
Definition rcpp_distribution.hpp:199
virtual double evaluate()
Evaluate normal probability density function (pdf). The natural log of the pdf is returned.
Definition rcpp_distribution.hpp:273
ParameterVector expected_values
The expected values, which would be the mean of x for this distribution.
Definition rcpp_distribution.hpp:184
virtual void finalize()
Extracts the derived quantities from Information to the Rcpp object.
Definition rcpp_distribution.hpp:299
virtual bool set_observed_data(int observed_data_id)
Set the unique ID for the observed data object.
Definition rcpp_distribution.hpp:239
virtual bool set_distribution_mean(double input_value)
Set the expected mean value for the distribution.
Definition rcpp_distribution.hpp:247
ParameterVector log_sd
The uncertainty, which would be the standard deviation of x for the normal distribution.
Definition rcpp_distribution.hpp:194
virtual bool set_distribution_links(std::string input_type, Rcpp::IntegerVector ids)
Sets pointers for data observations, random effects, or priors.
Definition rcpp_distribution.hpp:257
virtual uint32_t get_id()
Gets the ID of the interface base object.
Definition rcpp_distribution.hpp:233
Base class for all interface objects.
Definition rcpp_interface_base.hpp:634
bool finalized
Is the object already finalized? The default is false.
Definition rcpp_interface_base.hpp:639
std::string value_to_string(double value)
Report the parameter value as a string.
Definition rcpp_interface_base.hpp:712
static std::vector< std::shared_ptr< FIMSRcppInterfaceBase > > fims_interface_objects
FIMS interface object vectors.
Definition rcpp_interface_base.hpp:644
virtual bool add_to_fims_tmb()
A virtual method to inherit to add objects to the TMB model.
Definition rcpp_interface_base.hpp:649
An Rcpp interface class that defines the ParameterVector class.
Definition rcpp_interface_base.hpp:178
void resize(size_t size)
Resizes a ParameterVector to the desired length.
Definition rcpp_interface_base.hpp:323
size_t size()
Returns the size of a ParameterVector.
Definition rcpp_interface_base.hpp:316
uint32_t id_m
The local ID of the Parameter object.
Definition rcpp_interface_base.hpp:191
Parameter & get(size_t pos)
An internal accessor for calling a position of a ParameterVector from R.
Definition rcpp_interface_base.hpp:295
void set(size_t pos, const Parameter &p)
An internal setter for setting a position of a ParameterVector from R.
Definition rcpp_interface_base.hpp:311
An Rcpp interface class that defines the RealVector class.
Definition rcpp_interface_base.hpp:434
size_t size()
Returns the size of a RealVector.
Definition rcpp_interface_base.hpp:595
void resize(size_t size)
Resizes a RealVector to the desired length.
Definition rcpp_interface_base.hpp:602
A class that provides shared ownership of an integer value.
Definition rcpp_shared_primitive.hpp:24
void set(int val)
Change the value of the integer.
Definition rcpp_shared_primitive.hpp:129
A class that provides shared ownership of a string.
Definition rcpp_shared_primitive.hpp:1508
std::string get() const
Retrieves the string value managed by the object.
Definition rcpp_shared_primitive.hpp:1612
void set(std::string val)
Sets the string value of the object.
Definition rcpp_shared_primitive.hpp:1621
std::map< uint32_t, std::shared_ptr< fims_distributions::DensityComponentBase< Type > > > density_components
Definition information.hpp:126
std::map< uint32_t, std::shared_ptr< fims_distributions::DensityComponentBase< Type > > >::iterator density_components_iterator
Definition information.hpp:131
static std::shared_ptr< Information< Type > > GetInstance()
Returns a singleton Information object for type T.
Definition information.hpp:238
#define FIMS_WARNING_LOG(MESSAGE)
Definition def.hpp:598
#define FIMS_INFO_LOG(MESSAGE)
Definition def.hpp:590
#define FIMS_ERROR_LOG(MESSAGE)
Definition def.hpp:606
void clear_internal()
Clears the internal objects.
Definition rcpp_interface.hpp:279
The Rcpp interface to declare objects that are used ubiquitously throughout the Rcpp interface,...
fims::Vector< Type > x
Definition density_components_base.hpp:41
Definition lognormal_lpdf.hpp:22
Definition multinomial_lpmf.hpp:22
Type lpdf
Definition multinomial_lpmf.hpp:23
Definition normal_lpdf.hpp:23
virtual const Type evaluate()
Evaluates the normal probability density function.
Definition normal_lpdf.hpp:40