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