/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E S   D I S T A N C E S   D ' E N S E M B L E   D E   P O I N T S   { X , Y , Z }                          */
/*        A   U N   P O I N T   F I X E   { X0 , Y0 , Z0 }  :                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/distance.11$K' :                                                                                           */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20010725113145).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Le 20080311163521, fut supprime :                                                         */
                                        /*                                                                                           */
                                        /*                  @define   PRAGMA_CL_____MODULE_NON_OPTIMISABLE                           */
                                        /*                                                                                           */
                                        /* qui semblait inutile...                                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L E U R S   I M P L I C I T E S   D E S   P A R A M E T R E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PONDERATION_DE_LA_DISTANCE_EUCLIDIENNE                                                                                        \
                    FU
#define   PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_INFERIEURE                                                                    \
                    FZERO
#define   PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_SUPERIEURE                                                                    \
                    FZERO
#define   PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_CUMULEE                                                                       \
                    FZERO
#define   PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_MULTIPLIEE                                                                    \
                    FZERO
                                        /* Ponderation des differentes distances calculables (introduit le 20071025091825).          */
                                        /* On notera que cela pourrait faire disparaitre 'utiliser_la_distance_euclidienne', mais    */
                                        /* cet indicateur est conserve pour des raisons de compatibilite anterieure. Pour utiliser   */
                                        /* ces nouvelles ponderations, il faut que 'utiliser_la_distance_euclidienne' soit 'FAUX'... */
#define   UTILISER_LA_DISTANCE_EUCLIDIENNE                                                                                              \
                    VRAI                                                                                                                \
                                        /* Doit-on utiliser la distance euclidienne ('VRAI') ou celle dite "du chauffeur de taxi"    */ \
                                        /* ('FAUX') ?                                                                                */

#define   EDITER_L_ENSEMBLE_DES_DISTANCES                                                                                               \
                    VRAI                                                                                                                \
                                        /* Doit-on editer l'ensemble des distances ('VRAI') ou bien les extrema ('FAUX') ? Ceci a    */ \
                                        /* ete introduit le 20031129180830.                                                          */
#define   CONSERVER_LES_DISTANCES_NULLES                                                                                                \
                    VRAI                                                                                                                \
                                        /* Doit-on editer conserver les distances nulles ('VRAI') ou bien les eliminer ('FAUX') ?    */ \
                                        /* Ceci a ete introduit le 20200419103352 afin de pouvoir les inverser ensuite...            */

#define   EDITER_LES_INDICES_DES_EXTREMA                                                                                                \
                    FAUX                                                                                                                \
                                        /* Doit-on editer les indices des extrema ('VRAI') ou bien les extrema eux-memes ('FAUX') ?  */ \
                                        /* Ceci a ete introduit le 20031129181516.                                                   */
#define   EDITER_LA_DISTANCE_MINIMALE                                                                                                   \
                    VRAI
#define   EDITER_LA_DISTANCE_MAXIMALE                                                                                                   \
                    VRAI
                                        /* Afin de selectionner les distances minimale et maximale (introduit le 20031129181516).    */

#define   X_POINT_FIXE                                                                                                                  \
                    FZERO
#define   Y_POINT_FIXE                                                                                                                  \
                    FZERO
#define   Z_POINT_FIXE                                                                                                                  \
                    FZERO
                                        /* Definition du point fixe {X0,Y0,Z0}.                                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F I C H I E R S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
                                        /* Passage a l'allocation dynamique le 20060214190645...                                     */
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.I"

#define   X_IMPLICITE                                                                                                                   \
                    FZERO
#define   Y_IMPLICITE                                                                                                                   \
                    FZERO
#define   Z_IMPLICITE                                                                                                                   \
                    FZERO

gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Z,liste_initiale_des_Z);
                                        /* Definition en memoire des fichiers de coordonnees cartesiennes.                           */

#define   ELEMENT_DU_FICHIER_LISTE_X(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_X,index)
#define   ELEMENT_DU_FICHIER_LISTE_Y(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Y,index)
#define   ELEMENT_DU_FICHIER_LISTE_Z(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_initiale_des_Z,index)
                                        /* Acces a un element courant des fichiers de coordonnees cartesiennes.                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D E S   E X T R E M A  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EDITION_D_UNE_DISTANCE(editer,distance,indice)                                                                                \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(editer))                                                                                               \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(editer_les_indices_des_extrema))                                                                  \
                              Bblock                                                                                                    \
                              CAL2(Prin1("%d\n",indice));                                                                               \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(distance);                                    \
                                        /* Introduit sous cette forme le 20160804095025...                                           */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition d'une distance (introduit le 20031130093153).                                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E S   D I S T A N C E S   D ' E N S E M B L E   D E   P O I N T S   { X , Y , Z }                          */
/*        A   U N   P O I N T   F I X E   { X0 , Y0 , Z0 }  :                                                                        */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"

     DEFV(Float,INIT(ponderation_de_la_distance_euclidienne
                    ,PONDERATION_DE_LA_DISTANCE_EUCLIDIENNE
                     )
          );
     DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
                    ,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_INFERIEURE
                     )
          );
     DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
                    ,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_SUPERIEURE
                     )
          );
     DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
                    ,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_CUMULEE
                     )
          );
     DEFV(Float,INIT(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
                    ,PONDERATION_DE_LA_DISTANCE_DU_CHAUFFEUR_DE_TAXI_MULTIPLIEE
                     )
          );
                                        /* Ponderation des differentes distances calculables (introduit le 20071025091825).          */
                                        /* On notera que cela pourrait faire disparaitre 'utiliser_la_distance_euclidienne', mais    */
                                        /* cet indicateur est conserve pour des raisons de compatibilite anterieure. Pour utiliser   */
                                        /* ces nouvelles ponderations, il faut que 'utiliser_la_distance_euclidienne' soit 'FAUX'... */
     DEFV(Logical,INIT(utiliser_la_distance_euclidienne,UTILISER_LA_DISTANCE_EUCLIDIENNE));
                                        /* Doit-on utiliser la distance euclidienne ('VRAI') ou celle dite "du chauffeur de taxi"    */
                                        /* ('FAUX') ?                                                                                */

     DEFV(Logical,INIT(editer_l_ensemble_des_distances,EDITER_L_ENSEMBLE_DES_DISTANCES));
                                        /* Doit-on editer l'ensemble des distances ('VRAI') ou bien les extrema ('FAUX') ? Ceci a    */
                                        /* ete introduit le 20031129180830.                                                          */
     DEFV(Logical,INIT(conserver_les_distances_nulles,CONSERVER_LES_DISTANCES_NULLES));
                                        /* Doit-on editer conserver les distances nulles ('VRAI') ou bien les eliminer ('FAUX') ?    */
                                        /* Ceci a ete introduit le 20200419103352 afin de pouvoir les inverser ensuite...            */

     DEFV(Logical,INIT(editer_les_indices_des_extrema,EDITER_LES_INDICES_DES_EXTREMA));
                                        /* Doit-on editer les indices des extrema ('VRAI') ou bien les extrema eux-memes ('FAUX') ?  */
                                        /* Ceci a ete introduit le 20031129181516.                                                   */
     DEFV(Logical,INIT(editer_la_distance_minimale,EDITER_LA_DISTANCE_MINIMALE));
     DEFV(Logical,INIT(editer_la_distance_maximale,EDITER_LA_DISTANCE_MAXIMALE));
                                        /* Afin de selectionner les distances minimale et maximale (introduit le 20031129181516).    */

     DEFV(Float,INIT(coordonnee_X_point_fixe,X_POINT_FIXE));
     DEFV(Float,INIT(coordonnee_Y_point_fixe,Y_POINT_FIXE));
     DEFV(Float,INIT(coordonnee_Z_point_fixe,Z_POINT_FIXE));
                                        /* Definition du point fixe {X0,Y0,Z0}.                                                      */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"
                                        /* Ceci fut introduit le 20070103173526...                                                   */

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
                                                 Eblock
                                                 )
                                            );

                         PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;

                         PROKESF_ARGUMENT_FICHIER("LISTE_X="
                                                 ,fichier_LISTE_X
                                                 ,liste_initiale_des_X
                                                 ,X_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Y="
                                                 ,fichier_LISTE_Y
                                                 ,liste_initiale_des_Y
                                                 ,Y_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("LISTE_Z="
                                                 ,fichier_LISTE_Z
                                                 ,liste_initiale_des_Z
                                                 ,Z_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         PROCESS_ARGUMENT_F("sphere=""distance_euclidienne=",ponderation_de_la_distance_euclidienne
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 EGAL(utiliser_la_distance_euclidienne,FAUX);
                                                 Eblock
                                                 )
                                            );
                         PROCESS_ARGUMENT_F("tmin=""tinf=""taxi_minimum=""taxi_inferieur="
                                           ,ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 EGAL(utiliser_la_distance_euclidienne,FAUX);
                                                 Eblock
                                                 )
                                            );
                         PROCESS_ARGUMENT_F("tsup=""tmax=""taxi_maximum=""taxi_superieur="
                                           ,ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 EGAL(utiliser_la_distance_euclidienne,FAUX);
                                                 Eblock
                                                 )
                                            );
                         PROCESS_ARGUMENT_F("tcum=""taxi_cumul=""tadd=",ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 EGAL(utiliser_la_distance_euclidienne,FAUX);
                                                 Eblock
                                                 )
                                            );
                         PROCESS_ARGUMENT_F("tmul=""taxi_multiplication=",ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 EGAL(utiliser_la_distance_euclidienne,FAUX);
                                                 Eblock
                                                 )
                                            );
                                        /* Parametres introduits le 20071025091825...                                                */
                         PROCESS_ARGUMENT_L("euclidienne=""euclide=",utiliser_la_distance_euclidienne
                                           ,BLOC(VIDE;)
                                           ,BLOC(Bblock
                                                 Test(IL_FAUT(utiliser_la_distance_euclidienne))
                                        /* Ce test fut introduit le 20071025091825 pour garantir la compatibilite anterieure...      */
                                                      Bblock
                                                      EGAL(ponderation_de_la_distance_euclidienne,FU);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure,FZERO);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure,FZERO);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee,FZERO);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee,FZERO);
                                                      Eblock
                                                 ATes
                                                      Bblock
                                                      EGAL(ponderation_de_la_distance_euclidienne,FZERO);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure,FZERO);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_superieure,FZERO);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee,FU);
                                                      EGAL(ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee,FZERO);
                                                      Eblock
                                                 ETes
                                                 Eblock
                                                 )
                                            );

                         GET_ARGUMENT_L("distances=",editer_l_ensemble_des_distances);
                         GET_ARGUMENT_N("extrema=",editer_l_ensemble_des_distances);
                         GET_ARGUMENT_L("conserver_distances_nulles=""cdn=",conserver_les_distances_nulles);
                         GET_ARGUMENT_N("eliminer_distances_nulles=""edn=",conserver_les_distances_nulles);
                                        /* Parametres introduits le 20200419103352...                                                */

                         GET_ARGUMENT_L("indices=",editer_les_indices_des_extrema);
                         GET_ARGUMENT_L("minimale=""min=",editer_la_distance_minimale);
                         GET_ARGUMENT_L("maximale=""max=",editer_la_distance_maximale);

                         GET_ARGUMENT_F("x=""X=""X0=",coordonnee_X_point_fixe);
                         GET_ARGUMENT_F("y=""Y=""Y0=",coordonnee_Y_point_fixe);
                         GET_ARGUMENT_F("z=""Z=""Z0=",coordonnee_Z_point_fixe);

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
                                        /* Cette procedure fut introduite le 20070103173526...                                       */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                                        /* Cette procedure fut introduite le 20061226192507...                                       */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5;
                                        /* Cette procedure fut introduite le 20211005105506...                                       */
                         )
                    );

     begin_nouveau_block
          Bblock
          DEFV(Int,INIT(indice_de_la_distance_minimale,UNDEF));
          DEFV(Float,INIT(distance_minimale,F_INFINI));
          DEFV(Int,INIT(indice_de_la_distance_maximale,UNDEF));
          DEFV(Float,INIT(distance_maximale,F_MOINS_L_INFINI));
                                        /* Afin de rechercher les distances extremales (introduit le 20031129181516)...              */

          gOPERATION_SUR_LES_FICHIERS(BLOC(
                                           DEFV(Float,INIT(coordonnee_X,ELEMENT_DU_FICHIER_LISTE_X(index)));
                                           DEFV(Float,INIT(coordonnee_Y,ELEMENT_DU_FICHIER_LISTE_Y(index)));
                                           DEFV(Float,INIT(coordonnee_Z,ELEMENT_DU_FICHIER_LISTE_Z(index)));
                                        /* Recuperation des coordonnees {X,Y,Z} courantes dans les fichiers.                         */

                                           DEFV(Float,INIT(distance_courante,FLOT__UNDEF));
                                        /* Definition de la "distance"...                                                            */

                                           EGAL(distance_courante
                                               ,UdisF3D(coordonnee_X_point_fixe
                                                       ,coordonnee_Y_point_fixe
                                                       ,coordonnee_Z_point_fixe
                                                       ,coordonnee_X
                                                       ,coordonnee_Y
                                                       ,coordonnee_Z
                                                       ,ponderation_de_la_distance_euclidienne
                                                       ,ponderation_de_la_distance_du_chauffeur_de_taxi_inferieure
                                                       ,ponderation_de_la_distance_du_chauffeur_de_taxi_superieure
                                                       ,ponderation_de_la_distance_du_chauffeur_de_taxi_cumulee
                                                       ,ponderation_de_la_distance_du_chauffeur_de_taxi_multipliee
                                                        )
                                                );
                                        /* Et enfin, calcul de la "distance" du point courant {X,Y,Z} au point fixe {X0,Y0,Z0}.      */

                                           Test(IFLT(distance_courante,distance_minimale))
                                                Bblock
                                                EGAL(distance_minimale,distance_courante);
                                                EGAL(indice_de_la_distance_minimale,index);
                                        /* Memorisation de la distance minimale courante. On notera que le 'IFLT(...)' fait que      */
                                        /* si plusieurs points {X,Y,Z} sont a la meme distance minimale de {X0,Y0,Z0}, c'est le      */
                                        /* premier d'entre-eux dans la liste qui sera memorisee...                                   */
                                                Eblock
                                           ATes
                                                Bblock
                                                Eblock
                                           ETes

                                           Test(IFGT(distance_courante,distance_maximale))
                                                Bblock
                                                EGAL(distance_maximale,distance_courante);
                                                EGAL(indice_de_la_distance_maximale,index);
                                        /* Memorisation de la distance maximale courante. On notera que le 'IFGT(...)' fait que      */
                                        /* si plusieurs points {X,Y,Z} sont a la meme distance maximale de {X0,Y0,Z0}, c'est le      */
                                        /* premier d'entre-eux dans la liste qui sera memorisee...                                   */
                                                Eblock
                                           ATes
                                                Bblock
                                                Eblock
                                           ETes
                                           )
                                     ,distance_courante
                                     ,IFET(editer_l_ensemble_des_distances
                                          ,IFOU(IL_FAUT(conserver_les_distances_nulles)
                                               ,IFET(IL_NE_FAUT_PAS(conserver_les_distances_nulles)
                                                    ,IZNE(distance_courante)
                                                     )
                                                )
                                           )
                                     ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
                                      );
                                        /* Distance du point courant {X,Y,Z} au point fixe {X0,Y0,Z0}.                               */

          Test(IL_FAUT(editer_l_ensemble_des_distances))
                                        /* Test introduit le 20031129180830...                                                       */
               Bblock
               Eblock
          ATes
               Bblock
               EDITION_D_UNE_DISTANCE(editer_la_distance_minimale,distance_minimale,indice_de_la_distance_minimale);
               EDITION_D_UNE_DISTANCE(editer_la_distance_maximale,distance_maximale,indice_de_la_distance_maximale);
                                        /* On notera le 20050128103332 que les deux distances extremales editees eventuellement      */
                                        /* ci-dessus sont les premieres trouvees dans le 'gOPERATION_SUR_LES_FICHIERS(...)'          */
                                        /* ci-dessus ce qui peut etre un peu ennuyeux au cas ou d'autres points {X,Y,Z} seraient     */
                                        /* aussi a ces memes distances extremales de {X0,Y0,Z0}. Dans le cas ou il serait            */
                                        /* necessaire de connaitre toutes ces distances "synonymes", il suffirait d'editer           */
                                        /* l'ensemble des distances (via 'IL_FAUT(editer_l_ensemble_des_distances)') et non plus les */
                                        /* extrema, puis de proceder a un tri (via 'v $xrv/tri.11$K' avec "index=FAUX rang=FAUX") ;  */
                                        /* ensuite avec "$UNI -c", puis en recuperant la premiere et la derniere ligne on aura le    */
                                        /* nombre de points "synonymes" au niveau des distances...                                   */
               Eblock
          ETes
          Eblock
     end_nouveau_block

     lGENERATION_D_UN_FICHIER(liste_initiale_des_Z,Z_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.