/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   E N   E V I D E N C E   D E   C L A S S E S   D ' E Q U I V A L E N C E                                          */
/*        D A N S   U N   F I C H I E R   N U M E R I Q U E                                                                          */
/*        D E   P R E F E R E N C E   M O N O T O N E   E T   M E M E   C R O I S S A N T  :                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Le principe est, en supposant le fichier                                                                       */
/*                  Argument monotone croissant, de regrouper                                                                        */
/*                  les valeurs successives en classes d'equivalence                                                                 */
/*                  de valeurs proches (voir a ce propos                                                                             */
/*                  'v $xrCC/EImAgEs.04$vv$Y ClassesEquivalence.01.X'                                                                */
/*                  pour un exemple d'utilisation).                                                                                  */
/*                                                                                                                                   */
/*                    Ainsi, par exemple, avec un epsilon egal a 0.2,                                                                */
/*                  voici (a gauche) les deux classes d'equivalence d'un                                                             */
/*                  fichier (a droite) :                                                                                             */
/*                                                                                                                                   */
/*                                      +1.0  ->  +1                                                                                 */
/*                                      +1.2      +1                                                                                 */
/*                                      +1.4      +1                                                                                 */
/*                                      +1.6      +1                                                                                 */
/*                                                                                                                                   */
/*                                      +2.0  ->  +2                                                                                 */
/*                                      +2.2      +2                                                                                 */
/*                                      +2.4      +2                                                                                 */
/*                                      +2.6      +2                                                                                 */
/*                                                                                                                                   */
/*                  (voir l'usage qui en est fait dans 'v $xrCC/EImAgEs.04$vv$Y .xrv.ClassesEquivalence.01.X').                      */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/ClassesEquivalence.01$K' :                                                                                 */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20160705092441).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   COMPATIBILITE_20160706                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20160706124204...  */

#define   EPSILON_DE_DEFINITION_DES_CLASSES_D_EQUIVALENCE                                                                               \
                    FRA10(FRA10(FU))                                                                                                    \
                                        /* Epsilon de definition des classes d'equivalence.                                          */
#define   AIDER_AU_CHOIX_DE_L_EPSILON_DE_DEFINITION_DES_CLASSES_D_EQUIVALENCE                                                           \
                    FAUX                                                                                                                \
                                        /* Afin d'aider le choix de l'epsilon de definition des classes d'equivalence.               */
#define   VERIFIER_QUE_LE_FICHIER_EST_MONOTONE_CROISSANT                                                                                \
                    FAUX                                                                                                                \
                                        /* Afin de verifier que le fichier est monotone croissant (introduit le 20160706101911).     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   F I C H I E R  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"

#define   FORMATER_LE_RESULTAT_DE_L_OPERATION_SUR_LES_VALEURS_COURANTES                                                                 \
                    VRAI

#include  xrv/ARITHMET.21.I"

#include  xrv/champs_5.41.I"

#define   VALEUR_IMPLICITE                                                                                                              \
                    FZERO

gGENERATION_D_UN_FICHIER(fichier_des_valeurs,liste_des_valeurs);
                                        /* Definition en memoire du fichier.                                                         */

#define   ELEMENT_DU_FICHIER(index)                                                                                                     \
                    gELEMENT_DU_FICHIER(liste_des_valeurs,index)                                                                        \
                                        /* Acces a un element courant du fichier.                                                    */

gGENERATION_D_UN_FICHIER(fichier_intermediaire_des_valeurs,liste_intermediaire_des_valeurs);
                                        /* Definition en memoire du fichier intermediaire.                                           */

#define   ELEMENT_DU_FICHIER_INTERMEDIAIRE(index)                                                                                       \
                    gELEMENT_DU_FICHIER(liste_intermediaire_des_valeurs,index)                                                          \
                                        /* Acces a un element courant du fichier intermediaire.                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   E N   E V I D E N C E   D E   C L A S S E S   D ' E Q U I V A L E N C E                                          */
/*        D A N S   U N   F I C H I E R   N U M E R I Q U E                                                                          */
/*        D E   P R E F E R E N C E   M O N O T O N E   E T   M E M E   C R O I S S A N T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"

     DEFV(Logical,INIT(compatibilite_20160706,COMPATIBILITE_20160706));
                                        /* Permet de faire des calculs compatibles a ceux faits anterieurement au 20160706124204...  */

     DEFV(Float,INIT(epsilon_de_definition_des_classes_d_equivalence,EPSILON_DE_DEFINITION_DES_CLASSES_D_EQUIVALENCE));
                                        /* Epsilon de definition des classes d'equivalence.                                          */
     DEFV(Logical,INIT(aider_au_choix_de_l_epsilon_de_definition_des_classes_d_equivalence
                      ,AIDER_AU_CHOIX_DE_L_EPSILON_DE_DEFINITION_DES_CLASSES_D_EQUIVALENCE
                       )
          );
                                        /* Afin d'aider le choix de l'epsilon de definition des classes d'equivalence.               */
     DEFV(Logical,INIT(verifier_que_le_fichier_est_monotone_croissant,VERIFIER_QUE_LE_FICHIER_EST_MONOTONE_CROISSANT));
                                        /* Afin de verifier que le fichier est monotone croissant (introduit le 20160706101911).     */
     /*..............................................................................................................................*/
#include  xrv/champs_5.1A.I"

     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20160706=",compatibilite_20160706);

                         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("fichier="
                                                 ,fichier_des_valeurs
                                                 ,liste_des_valeurs
                                                 ,VALEUR_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         GET_ARGUMENT_F("epsilon_classes_equivalence=""ece=""eps=",epsilon_de_definition_des_classes_d_equivalence);
                         GET_ARGUMENT_L("aider=",aider_au_choix_de_l_epsilon_de_definition_des_classes_d_equivalence);
                         GET_ARGUMENT_L("verifier_monotone_croissant=""verifier=""vmc="
                                       ,verifier_que_le_fichier_est_monotone_croissant
                                        );

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                         )
                    );

     iGENERATION_D_UN_FICHIER(liste_intermediaire_des_valeurs,VALEUR_IMPLICITE);

     begin_nouveau_block
          Bblock
          DEFV(Float,INIT(valeur_n_0_,FLOT__UNDEF));
                                        /* Valeur courante dans le fichier.                                                          */
          DEFV(Float,INIT(valeur_n_m1,FLOT__UNDEF));
                                        /* Valeur precedente dans le fichier.                                                        */
          DEFV(Float,INIT(classe_d_equivalence_courante,FLOT__UNDEF));
                                        /* Classe d'equivalence courante...                                                          */

          DoIn(index
              ,PREMIER_ELEMENT_D_UN_FICHIER
              ,DERNIER_ELEMENT_D_UN_FICHIER
              ,I
               )
               Bblock
               DEFV(Float,INIT(valeur_a_editer,FLOT__UNDEF));
                                        /* Valeur courante a editer...                                                               */

               EGAL(valeur_n_0_,ELEMENT_DU_FICHIER(index));
                                        /* Recuperation de la valeur courante dans le fichier.                                       */

               Test(IFEQ(index,PREMIER_ELEMENT_D_UN_FICHIER))
                    Bblock
                    EGAL(classe_d_equivalence_courante,valeur_n_0_);
                                        /* Cas de la premiere classe d'equivalence...                                                */

                    EGAL(valeur_a_editer,valeur_n_0_);
                    Eblock
               ATes
                    Bblock
                    DEFV(Float,INIT(discriminateur,FLOT__UNDEF));
                                        /* Discriminateur d'appartenance a la classe d'equivalence courante. Au passage, on notera   */
                                        /* qu'il est evidemment preferable que le fichier soit trie (de facon croissante est le      */
                                        /* mieux).                                                                                   */

                    Test(IL_FAUT(verifier_que_le_fichier_est_monotone_croissant))
                                        /* Validation introduite le 20160706101911...                                                */
                         Bblock
                         Test(IFLT(valeur_n_0_,valeur_n_m1))
                              Bblock
                              PRINT_ATTENTION("le fichier n'est pas monotone croissant");
                              CAL1(Prer2("(%+.^^^ < %+.^^^)\n",valeur_n_0_,valeur_n_m1));
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(discriminateur,DIVI(SOUA(valeur_n_0_,valeur_n_m1),valeur_n_m1));
                                        /* Le 20160706095627 :                                                                       */
                                        /*                                                                                           */
                                        /*                  valeur_n_m1                                                              */
                                        /*                                                                                           */
                                        /* a ete remplace par :                                                                      */
                                        /*                                                                                           */
                                        /*                  MIN2(valeur_n_0_,valeur_n_m1)                                            */
                                        /*                                                                                           */
                                        /* mais, malheureusement, cela ne suiffit pas a obtenir les memes resultats pour un fichier  */
                                        /* monotone croissant et sa version monotone de croissant...                                 */
                                        /*                                                                                           */
                                        /* Le 20160706111722, je reviens finalement en arriere car, en effet, c'est plus logique...  */

                    Test(IFLE(discriminateur,epsilon_de_definition_des_classes_d_equivalence))
                         Bblock
                                        /* Cas ou la valeur courante appartient a la classe d'equivalence courante :                 */
                         Test(IL_FAUT(compatibilite_20160706))
                              Bblock
                              EGAL(valeur_n_0_,valeur_n_m1);
                                        /* Dans le cas de la compatibilite, la mesure de voisinnage se fait par rapport au           */
                                        /* debut de la classe d'equivalence courante. L'inconvenient est que plus on s'eloigne       */
                                        /* de son debut, plus le discriminateur augmente ce qui fait donc changer artificiellement   */
                                        /* et frequemment de classe d'equivalence...                                                 */
                              Eblock
                         ATes
                              Bblock
                                        /* Dans le cas "standard", la mesure de voisinnage se fait par rapport a la valeur           */
                                        /* precedente (qui se deplace donc du debut vers la fin du fichier lors du processus),       */
                                        /* ce qui fait que l'on peut avoir des suites de longueur quelconque de valeurs voisines...  */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         EGAL(classe_d_equivalence_courante,valeur_n_0_);
                                        /* Cas d'une nouvelle classe d'equivalence...                                                */
                         Eblock
                    ETes

                    EGAL(valeur_a_editer,classe_d_equivalence_courante);

                    Test(IL_FAUT(aider_au_choix_de_l_epsilon_de_definition_des_classes_d_equivalence))
                         Bblock
                         EGAL(valeur_a_editer,discriminateur);
                                        /* On notera que dans ce cas la valeur donnee a 'valeur_a_editer' est ignoree. On ne peut    */
                                        /* faire autrement a cause de l'option 'compatibilite_20160706' ci-dessus qui modifie alors  */
                                        /* la valeur de 'valeur_n_0_' et donc le prochain 'discriminateur'...                        */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETes

               EGAL(ELEMENT_DU_FICHIER_INTERMEDIAIRE(index),valeur_a_editer);

               EGAL(valeur_n_m1,valeur_n_0_);
               Eblock
          EDoI
          Eblock
     end_nouveau_block

     DoIn(index
         ,PREMIER_ELEMENT_D_UN_FICHIER
         ,DERNIER_ELEMENT_D_UN_FICHIER
         ,I
          )
          Bblock
          Test(IFOU(IFGT(index,PREMIER_ELEMENT_D_UN_FICHIER)
                   ,IFET(IFEQ(index,PREMIER_ELEMENT_D_UN_FICHIER)
                        ,IL_NE_FAUT_PAS(aider_au_choix_de_l_epsilon_de_definition_des_classes_d_equivalence)
                         )
                    )
               )
               Bblock
               EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(ELEMENT_DU_FICHIER_INTERMEDIAIRE(index));
                                        /* Introduit sous cette forme le 20160804093309...                                           */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     EDoI

     lGENERATION_D_UN_FICHIER(liste_intermediaire_des_valeurs,VALEUR_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_des_valeurs,VALEUR_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.