/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E V A L E U R S A L E A T O I R E S : */ /* */ /* */ /* Author of '$xrv/val_alea.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19990712131150). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.01.I" /* Introduit le 20110401184020... */ #define COMPATIBILITE_20051108 \ FAUX \ /* Permet de generer des sequences de nombres entiers identiques a celles qui auraient pu */ \ /* etre generees anterieurement au 20051108102739... */ #define COMPATIBILITE_20051113 \ FAUX \ /* Permet de retrouver les bornes {inf,sup} par defaut telles qu'elles etaient */ \ /* anterieurement au 20051113102538... */ #define GRAINE \ PARE(1789) #define LE_GENERATEUR_EST_DETERMINISTE \ VRAI #define EDITER_LA_GRAINE_NON_DETERMINISTE \ FAUX /* Definition du generateur aleatoire... */ /* */ /* La possibilite de generer des valeurs aleatoires non determinsites a ete introduite */ /* le 20220818092408... */ #define GENERER_UNE_LISTE_DE_VALEURS_CUMULEES \ FAUX \ /* Faut-il generer une liste de valeurs independantes ('VRAI') ou bien les cumuler comme */ \ /* pour un mouvement brownien ('FAUX'). Ceci fut introduit le 20051112212641... */ #define ITERER_SI_BESOIN_EST_LORS_DE_LA_GENERATION_DE_VALEURS_CUMULEES \ VRAI \ /* Est-il possible d'iterer la generation des valeurs aleatoires ('VRAI') ou pas ('FAUX'). */ \ /* Ceci fut introduit le 20051116114213 et passe de 'FAUX' a 'VRAI' le 20051116124239... */ #define GENERER_UNE_LISTE_DE_VALEURS_LOGIQUES \ FAUX \ /* Faut-il en fait generer des valeurs logiques {FAUX,VRAI} ? Ceci a ete introduit le */ \ /* 20051108104409 pour simplifier ce qui pouvait deja se faire "en quatre coups"... */ \ /* */ \ /* Le 20051117100532, je note que suite a l'introduction de 'v $xrv/booleens.01$K', cette */ \ /* possibilite de generer ici des valeurs logiques n'a plus d'interet. Elle est malgre */ \ /* tout conservee : on ne sait jamais... */ #define EDITER_LE_MESSAGE_DE_LA_BORNE_SUPERIEURE_ENTIERE \ VRAI \ /* Permet de supprimer le message d'erreur concernant la borne superieure lorsqu'elle est */ \ /* entiere et que des nombres entiers sont demandes (introduit le 20051108105629). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.11.I" /* On notera le 20060214222111 qu'il est difficile d'utiliser 'v $xrv/ARITHMET.1d$I' ici */ /* a cause de l'utilisation de 'compatibilite_20051113' dans 'iGENERATION_D_UN_FICHIE(...)' */ /* ci-apres... */ #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define INCREMENT_DE_LA_GRAINE_IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier_LISTE_INCREMENTS_DE_LA_GRAINE,liste_initiale_des_INCREMENTS_DE_LA_GRAINE); /* Definition en memoire du fichier des increments de la graine. */ /* */ /* Ceci a ete introduit le 20051202140816. L'interet est ainsi de permettre de regenerer */ /* des nombres aleatoires deja rencontres anterieurement dans la serie en cours de calcul. */ /* Pour ce faire, il suffit de changer la valeur de l'increment en lui donnant une valeur */ /* deja rencontree non nulle, un meme increment, donnant le meme nombre aleatoire. Ceci */ /* est utilise dans 'v $xiirv/.ENTR.61.1.$U LISTE_INCREMENTS_DE_LA_GRAINE'... */ #define ELEMENT_DU_FICHIER_LISTE_INCREMENTS_DE_LA_GRAINE(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_INCREMENTS_DE_LA_GRAINE,index) /* Acces a un element courant du fichier des increments de la graine... */ #define BORNE_INFERIEURE_IMPLICITE \ COND(IL_FAUT(compatibilite_20051113),FZERO,COORDONNEE_BARYCENTRIQUE_MINIMALE) #define BORNE_SUPERIEURE_IMPLICITE \ COND(IL_FAUT(compatibilite_20051113),FZERO,COORDONNEE_BARYCENTRIQUE_MAXIMALE) gGENERATION_D_UN_FICHIER(fichier_LISTE_BORNES_INFERIEURES,liste_initiale_des_BORNES_INFERIEURES); gGENERATION_D_UN_FICHIER(fichier_LISTE_BORNES_SUPERIEURES,liste_initiale_des_BORNES_SUPERIEURES); /* Definition en memoire des fichiers des bornes {inf,sup}. */ #define ELEMENT_DU_FICHIER_LISTE_BORNES_INFERIEURES(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_BORNES_INFERIEURES,index) #define ELEMENT_DU_FICHIER_LISTE_BORNES_SUPERIEURES(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_BORNES_SUPERIEURES,index) /* Acces a un element courant des fichiers des bornes {inf,sup}. */ #define BORNE_INFERIEURE_CUMULEE_IMPLICITE \ NEGA(FU) #define BORNE_SUPERIEURE_CUMULEE_IMPLICITE \ NEUT(FDEUX) gGENERATION_D_UN_FICHIER(fichier_LISTE_BORNES_INFERIEURES_CUMULEES,liste_initiale_des_BORNES_INFERIEURES_CUMULEES); gGENERATION_D_UN_FICHIER(fichier_LISTE_BORNES_SUPERIEURES_CUMULEES,liste_initiale_des_BORNES_SUPERIEURES_CUMULEES); /* Definition en memoire des fichiers des bornes {inf,sup}. */ #define ELEMENT_DU_FICHIER_LISTE_BORNES_INFERIEURES_CUMULEES(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_BORNES_INFERIEURES_CUMULEES,index) #define ELEMENT_DU_FICHIER_LISTE_BORNES_SUPERIEURES_CUMULEES(index) \ gELEMENT_DU_FICHIER(liste_initiale_des_BORNES_SUPERIEURES_CUMULEES,index) /* Acces a un element courant des fichiers des bornes {inf,sup}. */ #define VALEUR_INITIALE_DU_CUMUL \ MOYE(BORNE_INFERIEURE_CUMULEE_IMPLICITE,BORNE_SUPERIEURE_CUMULEE_IMPLICITE) DEFV(Local,DEFV(Float,INIT(valeur_initiale_du_cumul,VALEUR_INITIALE_DU_CUMUL))); /* Pour initialiser le cumul (introduit le 20051113110215...). */ #define VALIDATION_D_UN_COUPLE_DE_BORNES(borne_inferieure,borne_superieure) \ Bblock \ Test(IFLE(borne_inferieure,borne_superieure)) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la relation d'ordre ('inferieure <= superieure') n'est pas respectee"); \ CAL1(Prer2("Les bornes valent {%+.^^^,%+.^^^}\n" \ ,borne_inferieure \ ,borne_superieure \ ) \ ); \ /* Le 20060105161334, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123602, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ \ EGAL(borne_inferieure,COORDONNEE_BARYCENTRIQUE_MINIMALE); \ EGAL(borne_superieure,COORDONNEE_BARYCENTRIQUE_MAXIMALE); \ \ CAL1(Prer2("On force {%+.^^^,%+.^^^}\n" \ ,borne_inferieure \ ,borne_superieure \ ) \ ); \ /* Le 20060105161334, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123123602, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ Eblock \ ETes \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/substitue.02.I" /* Introduit le 20110401184020... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E V A L E U R S A L E A T O I R E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" DEFV(Logical,INIT(compatibilite_20051108,COMPATIBILITE_20051108)); /* Permet de generer des sequences de nombres entiers identiques a celles qui auraient pu */ /* etre generees anterieurement au 20051108102739... */ DEFV(Logical,INIT(compatibilite_20051113,COMPATIBILITE_20051113)); /* Permet de retrouver les bornes {inf,sup} par defaut telles qu'elles etaient */ /* anterieurement au 20051113102538... */ DEFV(Int,INIT(graine,GRAINE)); DEFV(Logical,INIT(le_generateur_est_deterministe,LE_GENERATEUR_EST_DETERMINISTE)); DEFV(Logical,INIT(editer_la_graine_non_deterministe,EDITER_LA_GRAINE_NON_DETERMINISTE)); /* Definition du generateur aleatoire... */ /* */ /* La possibilite de generer des valeurs aleatoires non determinsites a ete introduite */ /* le 20220818092408... */ DEFV(Logical,INIT(generer_une_liste_de_valeurs_cumulees,GENERER_UNE_LISTE_DE_VALEURS_CUMULEES)); /* Faut-il generer une liste de valeurs independantes ('VRAI') ou bien les cumuler comme */ /* pour un mouvement brownien ('FAUX'). Ceci fut introduit le 20051112212641... */ DEFV(Logical,INIT(iterer_si_besoin_est_lors_de_la_generation_de_valeurs_cumulees ,ITERER_SI_BESOIN_EST_LORS_DE_LA_GENERATION_DE_VALEURS_CUMULEES ) ); /* Est-il possible d'iterer la generation des valeurs aleatoires ('VRAI') ou pas ('FAUX'). */ /* Ceci fut introduit le 20051116114213 et passe de 'FAUX' a 'VRAI' le 20051116124239... */ DEFV(Logical,INIT(generer_une_liste_de_valeurs_logiques,GENERER_UNE_LISTE_DE_VALEURS_LOGIQUES)); /* Faut-il en fait generer des valeurs logiques {FAUX,VRAI} ? Ceci a ete introduit le */ /* 20051108104409 pour simplifier ce qui pouvait deja se faire "en quatre coups"... */ /* */ /* Le 20051117100532, je note que suite a l'introduction de 'v $xrv/booleens.01$K', cette */ /* possibilite de generer ici des valeurs logiques n'a plus d'interet. Elle est malgre */ /* tout conservee : on ne sait jamais... */ DEFV(Logical,INIT(editer_le_message_de_la_borne_superieure_entiere,EDITER_LE_MESSAGE_DE_LA_BORNE_SUPERIEURE_ENTIERE)); /* Permet de supprimer le message d'erreur concernant la borne superieure lorsqu'elle est */ /* entiere et que des nombres entiers sont demandes (introduit le 20051108105629). */ DEFV(pointI_3D,point_courant_de_l_espace_de_parametrage); /* Point courant d'un espace abstrait servant a parametrer le generateur d'evenements. */ SPIRALE_DEFINITION_GENERALE(SPIRALE_DELTA_HORIZONTAL_GLOBAL,SPIRALE_DELTA_VERTICAL_GLOBAL) /* Donnees de generation d'une spirale de parcours d'un espace abstrait bidimensionnel */ /* de parametrage de la generation des evenements. */ #include xci/substitue.03.I" /* Introduit le 20110401184020... */ DEFV(Float,INIT(cumul_courant,FLOT__UNDEF)); /* Cumul courant (introduit le 20051112212641). */ /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" /* Ceci fut introduit le 20070103174420... */ iGENERATION_D_UN_FICHIER(liste_initiale_des_INCREMENTS_DE_LA_GRAINE,INCREMENT_DE_LA_GRAINE_IMPLICITE); iGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_INFERIEURES,BORNE_INFERIEURE_IMPLICITE); iGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_SUPERIEURES,BORNE_SUPERIEURE_IMPLICITE); iGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_INFERIEURES_CUMULEES,BORNE_INFERIEURE_CUMULEE_IMPLICITE); iGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_SUPERIEURES_CUMULEES,BORNE_SUPERIEURE_CUMULEE_IMPLICITE); GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20051108=",compatibilite_20051108); PROCESS_ARGUMENT_L("compatibilite_20051113=",compatibilite_20051113 ,BLOC(VIDE;) ,BLOC(Bblock iGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_INFERIEURES ,BORNE_INFERIEURE_IMPLICITE ); iGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_SUPERIEURES ,BORNE_SUPERIEURE_IMPLICITE ); Eblock ) ); PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Test(IFGT(nombre_d_elements,nombre_maximal_d_elements_dans_le_fichier)) Bblock PRINT_ERREUR("les fichiers sont trop longs et vont donc etre tronques (1)"); CAL1(Prer2("Ils possedent %d elements alors que le maximum est de %d.\n" ,nombre_d_elements ,nombre_maximal_d_elements_dans_le_fichier ) ); EGAL(nombre_d_elements,nombre_maximal_d_elements_dans_le_fichier); Eblock ATes Bblock Eblock ETes Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROCESF_ARGUMENT_FICHIER("LISTE_INCREMENTS_DE_LA_GRAINE=" ,fichier_LISTE_INCREMENTS_DE_LA_GRAINE ,liste_initiale_des_INCREMENTS_DE_LA_GRAINE ,INCREMENT_DE_LA_GRAINE_IMPLICITE ,lTRANSFORMAT_01 ); PROCESF_ARGUMENT_FICHIER("LISTE_BORNES_INFERIEURES=" ,fichier_LISTE_BORNES_INFERIEURES ,liste_initiale_des_BORNES_INFERIEURES ,BORNE_INFERIEURE_IMPLICITE ,lTRANSFORMAT_01 ); PROCESF_ARGUMENT_FICHIER("LISTE_BORNES_SUPERIEURES=" ,fichier_LISTE_BORNES_SUPERIEURES ,liste_initiale_des_BORNES_SUPERIEURES ,BORNE_SUPERIEURE_IMPLICITE ,lTRANSFORMAT_01 ); PROCESF_ARGUMENT_FICHIER("LISTE_BORNES_INFERIEURES_CUMULEES=" ,fichier_LISTE_BORNES_INFERIEURES_CUMULEES ,liste_initiale_des_BORNES_INFERIEURES_CUMULEES ,BORNE_INFERIEURE_CUMULEE_IMPLICITE ,lTRANSFORMAT_01 ); PROCESF_ARGUMENT_FICHIER("LISTE_BORNES_SUPERIEURES_CUMULEES=" ,fichier_LISTE_BORNES_SUPERIEURES_CUMULEES ,liste_initiale_des_BORNES_SUPERIEURES_CUMULEES ,BORNE_SUPERIEURE_CUMULEE_IMPLICITE ,lTRANSFORMAT_01 ); GET_ARGUMENT_I("graine=""g=",graine); GET_ARGUMENT_L("deterministe=""gd=",le_generateur_est_deterministe); GET_ARGUMENT_N("non_deterministe=""gnd=",le_generateur_est_deterministe); GET_ARGUMENT_L("editer_graine_non_deterministe=""egnd=",editer_la_graine_non_deterministe); GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); /* Les parametres de non determinisme ont ete introduits le 20220818092408... */ GET_ARGUMENT_F("PrdnI3D_NEUT=""NEUT=",rdnI3D_____ponderation_NEUT); GET_ARGUMENT_F("PrdnI3D_GAUS=""GAUS=",rdnI3D_____ponderation_GAUS); GET_ARGUMENT_F("PrdnI3D_GAUS_esperance=""GAUS_esperance=",rdnI3D_____ponderation_GAUS_esperance_); GET_ARGUMENT_F("PrdnI3D_GAUS_ecart_type=""GAUS_ecart_type=",rdnI3D_____ponderation_GAUS_ecart_type); /* Parametres introduits le 20110325114302... */ CONTROLE_DE_L_ADAPTATION_A_UNE_LOI_DE_DISTRIBUTION_QUELCONQUE; /* Introduit le 20110401182451 sous cette forme... */ GET_ARGUMENT_L("cumuler=""brownien=",generer_une_liste_de_valeurs_cumulees); GET_ARGUMENT_L("iterer=",iterer_si_besoin_est_lors_de_la_generation_de_valeurs_cumulees); GET_ARGUMENT_F("cumul0=",valeur_initiale_du_cumul); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; /* Cette procedure fut introduite le 20070103174420... */ GET_ARGUMENT_L("logiques=""booleens=",generer_une_liste_de_valeurs_logiques); GET_ARGUMENT_L("message_borne_superieure_entiere=""mbse=",editer_le_message_de_la_borne_superieure_entiere); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; /* Cette procedure fut introduite le 20061226192850... */ PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5; /* Cette procedure fut introduite le 20211005105947... */ ) ); /* ATTENTION : jusqu'au 20010926155756, il y avait ici : */ /* */ /* SPIRALE_REINITIALISATION_BRAS_ET_DELTAS; */ /* */ /* qui provenait d'un "copier-coller" un peu large. Il ne sert a rien et a ete supprime... */ #include xci/substitue.05.I" /* Introduit le 20110401184020... */ Test(EST_FAUX(le_generateur_est_deterministe)) /* Test introduit le 20220818092408... */ Bblock DEFV(Positive,INIT(Secondes,UNDEF)); DEFV(Positive,INIT(MicroSecondes,UNDEF)); DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes); INCR(graine,ADD2(Secondes,MicroSecondes)); /* La graine est donc fonction de la duree ecoulee depuis le 01/01/1970 00:00:00 et le */ /* generateur n'est donc plus deterministe... */ Test(IL_FAUT(editer_la_graine_non_deterministe)) Bblock CAL2(Prin1("graine=%d\n",graine)); /* Il peut etre utile de connaitre la graine aleatoire utilisee au cas ou l'on voudrait */ /* reproduire cette generation... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(generer_une_liste_de_valeurs_logiques)) Bblock Test(IL_FAUT(generer_une_liste_de_valeurs_cumulees)) Bblock PRINT_ERREUR("le cumul de valeurs logiques n'a pas de sens"); EGAL(generer_une_liste_de_valeurs_cumulees,FAUX); Eblock ATes Bblock Eblock ETes EGAL(formater_le_resultat_de_l_operation_sur_les_valeurs_courantes,VRAI); EGAL(des_nombres_entiers,VRAI); EGAL(editer_le_message_de_la_borne_superieure_entiere,FAUX); EGAL(compatibilite_20051108,FAUX); EGAL(valeurs_signees,chain_Acopie(C_VIDE)); /* Ainsi, les options utiles sont forcees afin de generer des 'Logical's. Ceci fut introduit */ /* le 20051108104409, en notant bien qu'anterieurement a cette date, cela pouvait deja se */ /* faire en forcant quelques parametres individuellement. */ Eblock ATes Bblock Eblock ETes SPIRALE_VALIDATION; /* Validation des pas de parcours (pasX,pasY) de l'espace abstrait de parametrage du */ /* generateur d'evenements. */ INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,Xmin,Ymin,Zmin); /* Initialisation de l'espace de parametrage independante du format de l'image, puisque le */ /* point 'min' n'en depend pas... */ gOPERATION_SUR_LES_FICHIERS(BLOC( DEFV(Logical,INIT(iterer_si_besoin_est_la_generation_de_valeur_aleatoire,VRAI)); /* Introduit le 20051116114213, mais n'a d'interet que pour les valeurs cumulees... */ DEFV(Int,INIT(increment_de_la_graine,ELEMENT_DU_FICHIER_LISTE_INCREMENTS_DE_LA_GRAINE(index))); /* Increment de la gaine (introduit le 20051202140816...). */ DEFV(Float,INIT(borne_inferieure ,COND(IL_FAUT(generer_une_liste_de_valeurs_logiques) ,FLOT(FAUX) ,ELEMENT_DU_FICHIER_LISTE_BORNES_INFERIEURES(index) ) ) ); DEFV(Float,INIT(borne_superieure ,COND(IL_FAUT(generer_une_liste_de_valeurs_logiques) ,FLOT(VRAI) ,ELEMENT_DU_FICHIER_LISTE_BORNES_SUPERIEURES(index) ) ) ); /* Recuperation des bornes {inf,sup} courantes dans les fichiers. */ DEFV(Float,INIT(borne_inferieure_cumulee ,ELEMENT_DU_FICHIER_LISTE_BORNES_INFERIEURES_CUMULEES(index) ) ); DEFV(Float,INIT(borne_superieure_cumulee ,ELEMENT_DU_FICHIER_LISTE_BORNES_SUPERIEURES_CUMULEES(index) ) ); /* Recuperation des bornes {inf,sup} cumulees courantes dans les fichiers. */ DEFV(Float,INIT(valeur_aleatoire,FLOT__UNDEF)); /* Valeur aleatoire courante... */ Test(IFGT(index,PREMIER_ELEMENT_D_UN_FICHIER)) Bblock Test(IZNE(increment_de_la_graine)) Bblock SPIRALE_REINITIALISATION_BRAS_ET_DELTAS; SPIRALE_INITIALISATION; SPIRALE_VALIDATION; INITIALISATION_POINT_3D(point_courant_de_l_espace_de_parametrage,Xmin,Ymin,Zmin); /* Lorsque l'increment de la graine est non nul, le parcours de la spirale est reinitialise. */ /* */ /* Ceci a ete introduit le 20051202140816. L'interet est ainsi de permettre de regenerer */ /* des nombres aleatoires deja rencontres anterieurement dans la serie en cours de calcul. */ /* Pour ce faire, il suffit de changer la valeur de l'increment en lui donnant une valeur */ /* deja rencontree non nulle, un meme increment, donnant le meme nombre aleatoire. Ceci */ /* est utilise dans 'v $xiirv/.ENTR.61.1.$U LISTE_INCREMENTS_DE_LA_GRAINE'... */ /* */ /* Jusqu'au 20051205094741, le test utilise ici etait : */ /* */ /* Test(IFNE(increment_de_la_graine,increment_de_la_graine_precedent)) */ /* */ /* ce qui etait stupide car, en effet, si l'on trouvait alors deux fois de suite le meme */ /* 'increment_de_la_graine', le processus n'etait pas reinitialise et alors que l'on aurait */ /* du generer deux fois de suite le meme nombre aleatoire, c'etait en fait deux nombres */ /* differents qui etaient generes... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes VALIDATION_D_UN_COUPLE_DE_BORNES(borne_inferieure,borne_superieure); VALIDATION_D_UN_COUPLE_DE_BORNES(borne_inferieure_cumulee,borne_superieure_cumulee); Test(IFET(IL_FAUT(formater_le_resultat_de_l_operation_sur_les_valeurs_courantes) ,IL_FAUT(des_nombres_entiers) ) ) Bblock Test(IL_FAUT(compatibilite_20051108)) Bblock Eblock ATes Bblock Test(fEST_ENTIER(borne_superieure)) Bblock INCR(borne_superieure,SOUS(FU,mgEPSILON)); /* Cette majoration a ete introduite le 20051108102739 et permet donc d'atteindre la */ /* borne superieure en entier... */ Test(IL_FAUT(editer_le_message_de_la_borne_superieure_entiere)) Bblock PRINT_ERREUR("la borne superieure est entiere et donc inaccessible"); CAL1(Prer1("Elle est donc augmentee et prend la valeur %+.^^^\n" ,borne_superieure ) ); /* Le 20060105161334, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123602, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes Eblock ATes Bblock Eblock ETes Tant(IL_FAUT(iterer_si_besoin_est_la_generation_de_valeur_aleatoire)) /* Cette boucle fut introduite le 20051116114213... */ Bblock EGAL(valeur_aleatoire ,rdnI3D(ADRESSE(point_courant_de_l_espace_de_parametrage) ,ADD2(graine,increment_de_la_graine) ,RDN_INIT_AND_GENERE ,borne_inferieure,borne_superieure ) ); /* Generation d'une valeur aleatoire dans [borne_inferieure,borne_superieure] et parametree */ /* par le point courant de l'espace de parametrage. On notera que jusqu'au 19990916114633, */ /* il y avait ici : */ /* */ /* ,FLOT(borne_inferieure),FLOT(borne_superieure) */ /* */ /* mais, 'borne_inferieure' et 'borne_superieure' ayant le type 'Float', les 'FLOT(...)' */ /* sont donc inutiles... */ EGAL(iterer_si_besoin_est_la_generation_de_valeur_aleatoire,FAUX); /* A priori, cette generation ne sera pas iteree... */ Test(IL_FAUT(generer_une_liste_de_valeurs_cumulees)) Bblock Test(IFEQ(index,PREMIER_ELEMENT_D_UN_FICHIER)) Bblock EGAL(cumul_courant,valeur_initiale_du_cumul); /* Cas du premier element du fichier. On notera qu'anterieurement au 20051113110215, */ /* cette initialisation etait faite avec 'valeur_aleatoire' ce qui n'est pas une bonne idee */ /* puisque les bornes {inf,sup} des valeurs aleatoires et de leurs cumuls ne sont pas, en */ /* general, du tout les memes. D'ou cette initialisation arbitraire. On notera de plus que */ /* la valeur courante de 'valeur_aleatoire' (qui est la premiere generee...) n'est donc pas */ /* utilisee dans le cas de la generation d'une liste de valeurs cumulees... */ Eblock ATes Bblock INCR(cumul_courant,valeur_aleatoire); /* Cas des elements suivants du fichier... */ Eblock ETes Test(IFEXff(cumul_courant,borne_inferieure_cumulee,borne_superieure_cumulee)) Bblock Test(IL_FAUT(iterer_si_besoin_est_lors_de_la_generation_de_valeurs_cumulees)) Bblock Test(SONT_DE_MEME_SIGNE(borne_inferieure,borne_superieure)) Bblock PRINT_ATTENTION("les bornes sont de meme signe : risque de boucle"); CAL1(Prer2("Les bornes sont : {%+.^^^,%+.^^^}.\n" ,borne_inferieure ,borne_superieure ) ); /* En effet, dans le cas ou les bornes {inf,sup} sont de meme signe, il est quasiment */ /* impossible de "sortir" la valeur de 'cumul_courant' de ce piege (le 'IFEXff(...)' */ /* ci-dessus...). */ /* */ /* Le 20060105161334, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123602, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ATes Bblock DECR(cumul_courant,valeur_aleatoire); /* Le cumul precedent est "annule"... */ EGAL(iterer_si_besoin_est_la_generation_de_valeur_aleatoire,VRAI); /* Lorsque l'iteration est autorisee, il faut donc iterer... */ Eblock ETes Eblock ATes Bblock PRINT_ATTENTION("le cumul est hors des bornes extremales imposees"); CAL1(Prer3("Ce cumul vaut %+.^^^ et les bornes {%+.^^^,%+.^^^}.\n" ,cumul_courant ,borne_inferieure_cumulee ,borne_superieure_cumulee ) ); /* A la date du 20051113102824, je ne sais pas quoi faire d'autre. En particulier, */ /* appliquer des procedures du type 'TRON(...)' ou encore 'MODU(...)', ne ferait */ /* qu'introduire des artefacts et par exemple des risques d'accumulation au voisinage */ /* des bornes... Le 20051116114213, j'ai malgre tout trouve une solution : elle consiste */ /* a iterer la generation de 'valeur_aleatoire' jusqu'a trouver une valeur du cumul qui */ /* satisfasse au 'IFEXff(...)' ci-dessus...). */ /* */ /* Le 20060105161334, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123602, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes SPIRALE_INITIALISATION; /* Initialisation dynamique de 'spirale_nombre_de_points_a_traiter'. */ SPIRALE_DEPLACEMENT(ASD1(point_courant_de_l_espace_de_parametrage,x) ,ASD1(point_courant_de_l_espace_de_parametrage,y) ); /* Deplacement du point courant de la spirale de l'espace de parametrage. */ SPIRALE_PARCOURS; /* Parcours de la spirale avec rotation eventuelle de PI/2 du bras courant... */ Eblock ETan ) ,COND(IL_FAUT(generer_une_liste_de_valeurs_cumulees),cumul_courant,valeur_aleatoire) ,EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes ); /* Generation de la valeur aleatoire. */ lGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_SUPERIEURES,BORNE_SUPERIEURE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_INFERIEURES,BORNE_INFERIEURE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_SUPERIEURES_CUMULEES,BORNE_SUPERIEURE_CUMULEE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_INFERIEURES_CUMULEES,BORNE_INFERIEURE_CUMULEE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_SUPERIEURES,BORNE_SUPERIEURE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_BORNES_INFERIEURES,BORNE_INFERIEURE_IMPLICITE); lGENERATION_D_UN_FICHIER(liste_initiale_des_INCREMENTS_DE_LA_GRAINE,INCREMENT_DE_LA_GRAINE_IMPLICITE); RETU_Commande; Eblock ECommande