/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R I   D ' U N   F I C H I E R   N U M E R I Q U E  :                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/tri.11$K' :                                                                                                */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19990525091333).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   INVERSER_L_ORDRE_DU_TRI                                                                                                       \
                    FAUX                                                                                                                \
                                        /* Faut-il sortir dans l'ordre croissant ('VRAI') ou bien inverser l'ordre du tri et sortir  */ \
                                        /* dans l'ordre croissant ('FAUX') ?                                                         */

#define   EDITER_LA_LISTE_DE_PERMUTATION_DES_INDEX                                                                                      \
                    VRAI                                                                                                                \
                                        /* Indique si l'on doit editer la liste de permutation des index ('VRAI') ou bien la         */ \
                                        /* liste triee ou le rang ('FAUX').                                                          */
#define   EDITER_LE_RANG_DES_ELEMENTS                                                                                                   \
                    FAUX                                                                                                                \
                                        /* Si 'IL_NE_FAUT_PAS(editer_la_liste_de_permutation_des_index)', indique si l'on doit       */ \
                                        /* editer le rang des elements ('VRAI') ou la liste triee ('FAUX'). Le rang est un           */ \
                                        /* numero dans [0,...] qui ne progresse d'une unite que lorsque deux elements consecutifs    */ \
                                        /* de la liste triee sont differents ; le RANG ne doit donc pas etre confondu avec l'INDEX,  */ \
                                        /* meme s'ils sont identiques lorsque la liste a trier ne contient que des elements tous     */ \
                                        /* differents. Le RANG est donc un CLASSEMENT (premier, second,...).                         */

#define   TRANSLATION_DES_INDEX                                                                                                         \
                    ZERO                                                                                                                \
                                        /* Translation des index de tri si 'IL_FAUT(editer_la_liste_de_permutation_des_index)'.      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   T R I  :                                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrk/attractor.11.I"
#include  xrv/particule.41.I"
#include  xrk/attractor.12.I"
#include  xrk/attractor.1D.I"
#include  xrk/attractor.13.I"
#include  xrk/attractor.1C.I"
#include  xrv/champs_5.14.I"
#include  xrk/attractor.14.I"
#include  xrk/attractor.16.I"
DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,FLOT__UNDEF)));
#include  xrk/attractor.17.I"
#include  xrk/attractor.18.I"
#include  xrk/integr.1B.vv.I"
#include  xrv/champs_5.1A.I"
                                        /* Au cas ou...                                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   F I C H I E R  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/ARITHMET.1d.I"
                                        /* Passage a l'allocation dynamique le 20060214193838...                                     */
#include  xrv/ARITHMET.21.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.                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   INDEX_COURANT                                                                                                                 \
                    COND(IL_NE_FAUT_PAS(inverser_l_ordre_du_tri)                                                                        \
                        ,index_courant                                                                                                  \
                        ,INVX(index_courant                                                                                             \
                             ,CONX(PREMIER_ELEMENT_D_UN_FICHIER                                                                         \
                                  ,PREMIER_ELEMENT_D_UN_FICHIER                                                                         \
                                  ,PREMIER_POINT_DES_LISTES                                                                             \
                                   )                                                                                                    \
                             ,CONX(DERNIER_ELEMENT_D_UN_FICHIER                                                                         \
                                  ,PREMIER_ELEMENT_D_UN_FICHIER                                                                         \
                                  ,PREMIER_POINT_DES_LISTES                                                                             \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Index reellement utilise lors de l'edition finale...                                      */

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

     DEFV(Logical,INIT(inverser_l_ordre_du_tri,INVERSER_L_ORDRE_DU_TRI));
                                        /* Faut-il sortir dans l'ordre croissant ('VRAI') ou bien inverser l'ordre du tri et sortir  */
                                        /* dans l'ordre croissant ('FAUX') ?                                                         */

     DEFV(Logical,INIT(editer_la_liste_de_permutation_des_index,EDITER_LA_LISTE_DE_PERMUTATION_DES_INDEX));
                                        /* Indique si l'on doit editer la liste de permutation des index ('VRAI') ou bien la         */
                                        /* liste triee ou le rang ('FAUX').                                                          */
     DEFV(Logical,INIT(editer_le_rang_des_elements,EDITER_LE_RANG_DES_ELEMENTS));
                                        /* Si 'IL_NE_FAUT_PAS(editer_la_liste_de_permutation_des_index)', indique si l'on doit       */
                                        /* editer le rang des elements ('VRAI') ou la liste triee ('FAUX'). Le rang est un           */
                                        /* numero dans [0,...] qui ne progresse d'une unite que lorsque deux elements consecutifs    */
                                        /* de la liste triee sont differents ; le RANG ne doit donc pas etre confondu avec l'INDEX,  */
                                        /* meme s'ils sont identiques lorsque la liste a trier ne contient que des elements tous     */
                                        /* differents. Le RANG est donc un CLASSEMENT (premier, second,...).                         */
     DEFV(Int,INIT(rang_de_l_element_courant,UNDEF));
                                        /* Rang de l'element courant.                                                                */

     DEFV(Int,INIT(translation_des_index,TRANSLATION_DES_INDEX));
                                        /* Translation des index de tri si 'IL_FAUT(editer_la_liste_de_permutation_des_index)'.      */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(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("fichier="
                                                 ,fichier_des_valeurs
                                                 ,liste_des_valeurs
                                                 ,VALEUR_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         GET_ARGUMENT_L("trier=""tri=",trier_la_liste_des_points);
                         GET_ARGUMENT_L("tri_automatique=""tri_auto="
                                       ,choisir_automatiquement_la_methode_de_tri_d_une_liste_de_points
                                        );
                                        /* Introduit le 20170608094202                                                               */
                         GET_ARGUMENT_L("tri_N2=""N_carre=""N_au_carre=""N_AU_CARRE=""N2="
                                       ,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
                                        );
                         GET_ARGUMENT_N("tri_NlogN=""NlN=""N_log_N=""N1=",utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE);
                                        /* Les parametres "N_log_N=", "N_log_N",... ont ete introduits le 20111028201253...          */
                         GET_ARGUMENT_L("IFGT_N_carre=""IFGT_N_au_carre=""IFGT_N_AU_CARRE=""IFGT_N2="
                                       ,TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE_____faire_un_IFGT
                                        );
                         GET_ARGUMENT_L("message_N_carre=""message_N_au_carre=""message_N_AU_CARRE=""mN2="
                                       ,TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE_____editer_le_message_de_duree_excessive
                                        );
                                        /* Arguments introduits le 20120509095429...                                                 */

                         GET_ARGUMENT_L("inverser=",inverser_l_ordre_du_tri);

                         GET_ARGUMENT_L("permutation=""index=",editer_la_liste_de_permutation_des_index);
                         GET_ARGUMENT_L("rang=",editer_le_rang_des_elements);

                         GET_ARGUMENT_I("translation=""t=",translation_des_index);

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

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

                         GET_ARGUMENT_I("exemplaires=",nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes);
                         )
                    );

     BSaveModifyVariable(Logical,generation_de__liste_des_Z_____compatibilite_2008030913,VRAI);
                                        /* Introduit le 20110325093530 car, en effet, manquait dramatiquement...                     */

#include  xrv/champs_5.19.I"
                                        /* Pour eviter le message :                                                                  */
                                        /*                                                                                           */
                                        /*                  Static function is not referenced.                                       */
                                        /*                                                                                           */
                                        /* sur 'SYSTEME_ES9000_AIX_CC'...                                                            */

#include  xrk/attractor.19.I"
                                        /* Validations et definition de l'espace physique.                                           */

     EGAL(nombre_d_iterations,nombre_d_elements);
     INITIALISATION_DE_LA_LISTE_DES_POINTS;
                                        /* Pour initialiser la liste des index de tri...                                             */

     gOPERATION_SUR_LES_FICHIERS(BLOC(
                                      DEFV(Float,INIT(numero_de_l_iteration_courante,FLOT__UNDEF));

                                      MEMORISATION_D_UN_POINT(FLOT__UNDEF,FLOT__UNDEF,ELEMENT_DU_FICHIER(index)
                                                             ,FLOT__UNDEF
                                                             ,FLOT__UNDEF
                                                             ,FLOT__UNDEF,FLOT__UNDEF,FLOT__UNDEF
                                                              );
                                      )
                                ,FLOT__UNDEF
                                ,NE_PAS_EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS
                                ,UNDEF
                                 );
                                        /* Transfert du fichier vers la liste des 'Z'...                                             */

     DECR(index_de_rangement_dans_la_liste,I);
                                        /* Retour sur le dernier point memorise dans la liste...                                     */
                                        /*                                                                                           */
                                        /* Le 20020828170851 j'ai fait en sorte que l'argument '????_dernier_element' des            */
                                        /* procedures de tri pointe bien sur le dernier element de la liste et non pas sur son       */
                                        /* successeur, d'ou le remplacement des operateurs 'SUCC(...)' par des 'NEUT(...)' (voir     */
                                        /* a ce propos 'v $ximd/operator.1$FON 20020828170851').                                     */

     Test(IL_FAUT(trier_la_liste_des_points))
          Bblock
                                        /* Cas ou il faut trier les points...                                                        */
          Test(IFGT(index_de_rangement_dans_la_liste,PREMIER_POINT_DES_LISTES))
               Bblock
                                        /* Cas ou il y a au moins deux points : il faut donc trier...                                */
               TRI_D_UNE_LISTE_DE_POINTS(PREMIER_POINT_DES_LISTES
                                        ,index_de_rangement_dans_la_liste
                                         );
                                        /* Tri suivant la methode choisie ('N*N' ou 'N*log(N)').                                     */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     gOPERATION_SUR_LES_FICHIERS(BLOC(
                                      DEFV(Int,INIT(index_courant
                                                   ,CONX(index,PREMIER_ELEMENT_D_UN_FICHIER,PREMIER_POINT_DES_LISTES)
                                                    )
                                           );
                                        /* Conversion d'un index dans un fichier (qui commence a 'PREMIER_ELEMENT_D_UN_FICHIER')     */
                                        /* en un index dans une liste de points (qui commence a 'PREMIER_POINT_DES_LISTES').         */

                                      Test(IL_FAUT(editer_le_rang_des_elements))
                                           Bblock
                                           Test(IFEQ(index_courant,PREMIER_POINT_DES_LISTES))
                                                Bblock
                                                EGAL(rang_de_l_element_courant
                                                    ,CONX(PREMIER_POINT_DES_LISTES
                                                         ,PREMIER_POINT_DES_LISTES
                                                         ,PREMIER_ELEMENT_D_UN_FICHIER
                                                          )
                                                     );
                                        /* Cas du premier element, son rang est force evidemment...                                  */
                                                Eblock
                                           ATes
                                                Bblock
                                        /* Cas des elements suivants :                                                               */
                                                Test(IFEQ(ACCES_LISTE(liste_des_Z
                                                                     ,ACCES_LISTE(liste_des_index
                                                                                 ,NEUT(INDEX_COURANT)
                                                                                  )
                                                                      )
                                                         ,ACCES_LISTE(liste_des_Z
                                                                     ,ACCES_LISTE(liste_des_index
                                                                                 ,COND(IL_NE_FAUT_PAS(inverser_l_ordre_du_tri)
                                                                                      ,PRED(INDEX_COURANT)
                                                                                      ,SUCC(INDEX_COURANT)
                                                                                       )
                                                                                  )
                                                                      )
                                                          )
                                                     )
                                        /* On notera l'impossiblite d'utiliser 'OPC1(COND(...),PRED,SUCC,...)' parce que nous        */
                                        /* sommes au premier niveau d'un '$K' ('v $xil/defi_K2$vv$DEF OPC1')...                      */
                                                     Bblock
                                        /* Cas de deux elements successifs de meme valeur : le rang ne progresse pas...              */
                                                     Eblock
                                                ATes
                                                     Bblock
                                                     INCR(rang_de_l_element_courant,I);
                                        /* Cas de deux elements successifs de valeurs differentes : le rang progresse...             */
                                                     Eblock
                                                ETes
                                                Eblock
                                           ETes
                                           Eblock
                                      ATes
                                           Bblock
                                           Eblock
                                      ETes
                                      )
                                ,COND(IL_FAUT(editer_la_liste_de_permutation_des_index)
                                     ,ADD2(CONX(ACCES_LISTE(liste_des_index,INDEX_COURANT)
                                               ,PREMIER_POINT_DES_LISTES
                                               ,PREMIER_ELEMENT_D_UN_FICHIER
                                                )
                                          ,translation_des_index
                                           )
                                     ,COND(IL_FAUT(editer_le_rang_des_elements)
                                          ,rang_de_l_element_courant
                                          ,ACCES_LISTE(liste_des_Z,ACCES_LISTE(liste_des_index,INDEX_COURANT))
                                           )
                                      )
                                ,EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS
                                ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
                                 );
                                        /* Tri du fichier argument en editant soit les index de tri, soit les valeurs triees.        */

     lGENERATION_D_UN_FICHIER(liste_des_valeurs,VALEUR_IMPLICITE);

     ESaveModifyVariable(Logical,generation_de__liste_des_Z_____compatibilite_2008030913);

     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.