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