Often we have code that does a series of checks on an std::vector or Eigen matrix like the following
check_not_nan(function, "log odds parameter", beta);
check_positive(function, "log odds parameter", beta);
check_finite(function, "log odds parameter", beta);
The issue is that this causes three separate passes over beta. If beta is a large vector this can be kind of expensive.
We could make this nicer via one of two schems
- Just use a loop for these types of checks
for (auto&& beta_i : beta)
check_not_nan(function, "log odds parameter", beta_i);
check_positive(function, "log odds parameter", beta_i);
check_finite(function, "log odds parameter", beta_i);
}
But then we lose the nice information that the vectorized checks do where it also tells us what index caused the errors.
- A
check_foreach function that checks multiple things at every line.
For this we would also need lambdas for each of the check functions. The user would call something like this
check_foreach(function, "log odds parameter", beta, check_not_nan_p, check_positive_p, check_finite_p);
Under the hood this would expand into a loop that handles all of the indexing so that the end error still has the correct index information.
for (Eigen::Index = 0; i < x.size(); i++) {
check_not_nan_p(function, name, x[i], i);
check_positive_p(function, name, x[i], i);
check_finite_p(function, name, x[i], i);
}
So then we only do one pass over the memory and still get the pretty checks
Often we have code that does a series of checks on an
std::vectoror Eigen matrix like the followingThe issue is that this causes three separate passes over
beta. Ifbetais a large vector this can be kind of expensive.We could make this nicer via one of two schems
But then we lose the nice information that the vectorized checks do where it also tells us what index caused the errors.
check_foreachfunction that checks multiple things at every line.For this we would also need lambdas for each of the check functions. The user would call something like this
Under the hood this would expand into a loop that handles all of the indexing so that the end error still has the correct index information.
So then we only do one pass over the memory and still get the pretty checks