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

Ouverte
#3,417 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
35/100
Type d'issue
Fonctionnalité
Clarté
Plutôt claire
Activité
Active
Stack technique
cpp
Domaine
backend

Piste de recherche

Start by reading the existing check_not_nan, check_positive, and check_finite implementations, including their vectorized overloads and index-reporting behavior. Define the lambda interfaces and confirm how check_foreach should handle arrays and Eigen matrices; it is done when one traversal performs all requested checks while preserving the failing index in errors.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

code cleanup new function

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

Langage dominant
C++
Étoiles
845
Forks
225
Merge moyen
3 j 9 h
PR mergées (30 j)
12

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de stan-dev/math

Toutes les issues de stan-dev/math

Issues similaires

Plus d'issues C++

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.