Projet ANR EVA-Flo : Evaluation et Validation Automatique pour le calcul Flottant

Equipes
Présentation en français
Presentation in english
Réunions
Documents de travail
Rapports d'avancement
Contact
schematic organization of EVA-Flo


La présentation détaillée du projet (en anglais) est disponible ici.

Les équipes participant à ce projet


Réunions EVA-Flo


Documents de travail


Rapports d'avancement et autres documents pour l'ANR


Présentation générale du projet

Ce projet s'intéresse à la manière dont une formule mathématique (incluant des fonctions transcendantes et peut-être des itérations) se retrouve évaluée en virgule flottante dans un calculateur. Ce projet attaque cette question sous trois angles: comment évaluer une telle formule, comment automatiser la génération de code pour cette évaluation, comment valider la précision numérique du code obtenu.
Il s'agit d'améliorer la situation actuelle, qui est la suivante. Un programmeur expert sait écrire un code de qualité tenant compte par exemple des propriétés mathématiques des fonctions utilisées, des ordres de grandeurs et de l'accumulation des erreurs d'arrondis, et de propriétés fines de l'arithmétique virgule flottante utilisée, mais ne dispose pas des outils permettant de transmettre cette expertise au compilateur.
Le compilateur se contente d'assembler des opérateurs de base et des appels de fonctions de bibliothèques sans s'intéresser à la précision numérique du code produit. Quant à obtenir une garantie sur cette précision, c'est envisageable actuellement uniquement a posteriori, sur de tout petits codes, et de manière essentiellement manuelle.
Notre approche sera de travailler en parallèle sur trois aspects : l'étude d'algorithmes d'évaluation de formules mathématiques (du point de vue précision et performance), la validation de tels algorithmes (notamment des aspects numériques) au cours de leur développement, afin de guider les choix algorithmiques, enfin l'automatisation de l'ensemble, point pour lequel la difficulté essentielle consiste à faire coopérer les composants utilisés pour chaque étape.
Du point de vue algorithmique, on travaillera par exemple sur l'approximation d'une formule par un polynôme à une ou plusieurs variables. Si les mathématiques sont bien établies dans ce domaine, leur adaptation au monde du calcul flottant est souvent non triviale. Par exemple, il existe une grande variété de schémas d'évaluation d'un polynôme donné, certains minimisant les erreurs d'arrondis, d'autres maximisant le parallélisme, etc. De plus, si on peut construire le ``meilleur polynôme'' théorique d'approximation d'une fonction, dans un domaine et pour une norme donnés, obtenir le meilleur polynôme avec la contrainte que les coefficients sont exactement représentables en virgule flottante et en tenant compte de l'erreur d'arrondi due à l'évaluation du polynôme (et non plus seulement de l'écart entre la fonction et la valeur exacte que prend le polynôme) reste un problème ouvert, que l'on commence à attaquer sous divers angles.
Outre cet aspect algorithmique fondamental, il s'agira essentiellement de généraliser et mécaniser une expertise acquise par les porteurs de projets, dans le cadre notamment de l'évaluation des fonctions élémentaires et de la géométrie algorithmique.
Enfin, on cherchera à valider formellement la précision numérique du code final par rapport à la formule initiale. Une partie de l'automatisation est acquise, puisque des outils comme Coq, PVS ou HOL-light savent vérifier des preuve formelles incluant des aspects numériques. Toutefois ces outils ne rédigent pas la preuve, et notre apport sera de rechercher une classe de formules aussi large que possible pour laquelle cette rédaction d'une preuve de propriété numérique sera automatisable. Plus précisément, il s'agira de produire en parallèle le code évaluant la formule, et une preuve formelle d'une propriété de ce code, typiquement une borne de l'erreur totale entre le résultat du code et le résultat mathématique. Ici aussi, les porteurs du projet ont réalisé ce travail au cas par cas, et l'enjeu est de généraliser et d'automatiser.
En général, l'automatisation complète avec garantie de solution optimale n'a pas de sens sans information supplémentaire sur le contexte de l'application, et il faudra formaliser ce qu'un outil a besoin de connaître en plus de la formule à implémenter. On pense naturellement au domaine d'entrée des valeurs et à la précision finale demandée, et autres données héritées du contexte de la formule. Il faudra bien plus dans le cas général : par exemple, s'il est envisageable qu'un outil vérifie un invariant de boucle, il ne pourra en général pas l'inventer. De même, il faudra souvent suggérer à l'outil une identité mathématique à utiliser, etc.
Outre un prototype intégré dans un compilateur, ce projet produira une meilleure compréhension de la notion de formule et de preuve en arithmétique virgule flottante.
La présentation détaillée du projet (en anglais) est disponible ici.


General introduction to the EVA-Flo project

This project focuses on the way a mathematical formula (that includes transcendental functions and, possibly, iterations) is evaluated in floating-point arithmetic. Our approach will be threefold: how such a formula is evaluated, how we can automate code generation for that evaluation, how we can validate the numerical accuracy of the obtained code.
We aim at improving the current situation, which can be described as follows. An expert programmer knows how to write high quality code by using, for instance, known properties of the functions being used, orders of magnitudes of the variables being manipulated and of the accumulated round-off error. He may also use some special properties of the floating-point arithmetic being used. And yet, he does not know how to transfer this knowledge to a compiler.
The compiler merely uses a sequence of basic operations and functions from a library, without having clues on the numerical quality of the obtained code. One is able to check that quality and certify it for small and simple programs only, essentially by paper and pencil techniques.
We will work simultaneoulsy on three topics: study of algorithms for evaluating mathematical formulas (with accuracy and performance being at stake), validation of such algorithms (especially their numerical accuracy) when developing them, in order to influence the algorithmic choices, and automatization of the process.
From an algorithmic point of view, we will for instance work on the approximation of a formula by a univariate or multivariate polynomial. The mathematics of this domain are well established. And yet, their adaptation to floating-point computations is frequently nontrivial. For example, there are numerous ways of evaluating a polynomial. Some minimize the round-off error, some optimise parallelization, etc. Moreover, if building the ``best theoretical'' approximating polynomial to a function, for a given norm and a given domain, is easily done, building the best polynomial with the additional constraint that its coefficients are exactly representable in a given floating-point format and also taking into account the rounding error remains an open problem, that we are beginning to tackle with on several aspects.
Beyond this algorithmic aspect, we will need to generalize and automate some expert knowledge the applicants have accumulated these last years, especially on elementary function evaluation and computational geometry.
Finally, we will try to bound and validate, using formal proof, the numerical accuracy of the obtained code. Some part of the automatization is already done, since tools such as Coq, PVS or HOL-light are able to check proofs that include numerical aspects. And yet, these tools do not build a proof, they only check it. Our task will be to find a class of formulas, as large as possible, for which automatically building a proof of a numerical property is doable. More precisely, we will produce in parallel the code and a formal proof of a property of that code (typically, a bound of the difference between the computed result and the exact value). Up to now, the applicants have done that in some cases, and the goal is to generalize and automate.
This is not simple and a good knowledge of the subtleties of floating-point arithmetic is necessary for giving, for instance, a meaning to the program A = 1.0; B = 1.0; while ((A+1.0)-A-1 == 0.0) do A = 2.0 * A; while ((A + B) - A - B <> 0.0) do B = B + 1.0; that returns (in variable B) the base of the floating-point format being used.
A common problem is managing both approximation and rounding errors, and seing how they accumulate into an algorithm. Existing techniques of numerical analysis (forward and backward analysis) and computer science (computer algebra, interval arithmetic, multiple-precision arithmetic) can be used: what is difficult is to use them in order to obtain error bounds that are not overly pessimistic, and in an automated fashion. Some tools are missing (e.g., a general technique that computes a validated infinite norm). We will have to build these missing tools.
Complete automation of a program with a certificate of optimal solution is not really meaningful if no further information on the application is available. We will need to formalize the information a tool has to know beyond the formula being implemented. Examples are the input domain of the variables, the final required accuracy. In the general case, much more information will be needed. For instance, if a tool can check a loop invariant, it will not be able to invent it. Also, we will frequently have to suggest to the tool a mathematical relation that might be used, etc.
Beyond a prototype integrated into a compiler, this project will produce a better understanding of what is a formula or a proof in the domain of floating-point arithmetic.
The detailed presentation of the EVA-Flo project is available here.