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