Skip to content

Add check_foreach(...) function that does multiple checks at once on an array or matrix #3417

Description

@SteveBronder

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

  1. 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.

  1. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions