FIMS  v0.10.0
Loading...
Searching...
No Matches
size_grid_builder.hpp
Go to the documentation of this file.
1
9#ifndef FIMS_POPULATION_DYNAMICS_SIZE_GRID_BUILDER_HPP
10#define FIMS_POPULATION_DYNAMICS_SIZE_GRID_BUILDER_HPP
11
12#include <stdexcept>
13
14#include "../size_grid.hpp"
15
16namespace fims_popdy {
17
31 if (edges.size() < 2) {
32 throw std::runtime_error(
33 "SizeGridBuilder requires at least 2 edges to define a size grid");
34 }
35
37 grid.n_bins = edges.size() - 1;
38 grid.edges = edges;
39 grid.centers.resize(grid.n_bins);
40
41 for (std::size_t i = 0; i < grid.n_bins; ++i) {
42 grid.centers[i] = 0.5 * (grid.edges[i] + grid.edges[i + 1]);
43 }
44
45 if (!grid.IsConsistent()) {
46 throw std::runtime_error(
47 "SizeGridBuilder produced an inconsistent population size grid");
48 }
49
50 return grid;
51 }
52
62 double bin_width) {
63 if (!(upper_edge > lower_edge)) {
64 throw std::runtime_error(
65 "SizeGridBuilder requires upper_edge > lower_edge");
66 }
67
68 if (!(bin_width > 0.0)) {
69 throw std::runtime_error("SizeGridBuilder requires bin_width > 0");
70 }
71
74
75 const double span = upper_edge - lower_edge;
76 const double tolerance = 1e-12 * (span > 1.0 ? span : 1.0);
77
78 std::size_t bin_index = 1;
79 while (true) {
80 const double next_edge = lower_edge + bin_index * bin_width;
81
83 break;
84 }
85
87 ++bin_index;
88 }
89
91
92 return BuildFromEdges(edges);
93 }
94
108 const fims::Vector<double>& centers) {
109 if (centers.size() < 2) {
110 throw std::runtime_error(
111 "SizeGridBuilder requires at least 2 observation-bin centers to "
112 "build fleet edges");
113 }
114
115 for (std::size_t center_index = 1; center_index < centers.size();
116 ++center_index) {
117 if (!(centers[center_index] > centers[center_index - 1])) {
118 throw std::runtime_error(
119 "SizeGridBuilder requires observation-bin centers to be strictly "
120 "increasing");
121 }
122 }
123
125 edges.resize(centers.size() + 1);
126
127 edges[0] = centers[0] - 0.5 * (centers[1] - centers[0]);
128
129 for (std::size_t center_index = 0; center_index + 1 < centers.size();
130 ++center_index) {
131 edges[center_index + 1] =
132 0.5 * (centers[center_index] + centers[center_index + 1]);
133 }
134
135 edges[centers.size()] =
136 centers[centers.size() - 1] +
137 0.5 * (centers[centers.size() - 1] - centers[centers.size() - 2]);
138
139 return edges;
140 }
141
162 if (fleet_edges.size() == 0) {
163 throw std::runtime_error(
164 "SizeGridBuilder requires at least 1 fleet edge vector to build the "
165 "default population size grid");
166 }
167
168 double min_lower_edge = 0.0;
169 double max_upper_edge = 0.0;
170 bool first_fleet = true;
171
172 for (std::size_t fleet_index = 0; fleet_index < fleet_edges.size();
173 ++fleet_index) {
175
176 if (edges.size() < 2) {
177 throw std::runtime_error(
178 "SizeGridBuilder requires each fleet edge vector to contain at "
179 "least 2 edges");
180 }
181
182 for (std::size_t edge_index = 1; edge_index < edges.size();
183 ++edge_index) {
184 if (!(edges[edge_index] > edges[edge_index - 1])) {
185 throw std::runtime_error(
186 "SizeGridBuilder requires fleet edge vectors to be strictly "
187 "increasing");
188 }
189 }
190
191 const double fleet_lower_edge = edges[0];
192 const double fleet_upper_edge = edges[edges.size() - 1];
193
194 if (first_fleet) {
197 first_fleet = false;
198 } else {
201 }
202
205 }
206 }
207 }
208
209 const double built_in_bin_width = 1.0;
211 const double span = max_upper_edge - min_lower_edge;
212 const double tolerance = 1e-12 * (span > 1.0 ? span : 1.0);
213
216 }
217
220
223
225 }
226};
227
228} // namespace fims_popdy
229
230#endif /* FIMS_POPULATION_DYNAMICS_SIZE_GRID_BUILDER_HPP */
Definition fims_vector.hpp:27
void emplace_back(Args &&...args)
Constructs an element in-place at the end.
Definition fims_vector.hpp:389
void resize(size_t s)
Changes the number of elements stored.
Definition fims_vector.hpp:401
size_type size() const
Returns the number of elements.
Definition fims_vector.hpp:299
The population dynamics of FIMS.
Definition catch_at_age.hpp:45
std::shared_ptr< AgeToLengthConversionBase< Type > > BuildAgeToLengthConversionFleet(const std::shared_ptr< Population< Type > > &population, const std::shared_ptr< Fleet< Type > > &fleet)
Build the active age-to-length conversion for a fleet from the current population and fleet state.
Definition runtime.hpp:44
Helper for constructing internally consistent population size grids.
Definition size_grid_builder.hpp:24
static SizeGrid BuildFromEdges(const fims::Vector< double > &edges)
Build a size grid from an explicit vector of bin edges.
Definition size_grid_builder.hpp:30
static SizeGrid BuildRegularGrid(double lower_edge, double upper_edge, double bin_width)
Build a regular size grid from lower edge, upper edge, and bin width.
Definition size_grid_builder.hpp:61
static fims::Vector< double > BuildObservationEdgesFromCenters(const fims::Vector< double > &centers)
Build one fleet observation-bin edge vector from stored bin centers.
Definition size_grid_builder.hpp:107
static SizeGrid BuildDefaultFromFleetEdges(const fims::Vector< fims::Vector< double > > &fleet_edges)
Build the default population biological size grid from resolved fleet observation-bin edges.
Definition size_grid_builder.hpp:160
Population-level biological size grid.
Definition size_grid.hpp:26
std::size_t n_bins
Definition size_grid.hpp:27