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



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.