/*************************************************************************************************************************************/
/* */
/* O P T I M I S A T I O N D E S D I S T A N C E S E N T R E D E S P O I N T S */
/* S U R U N E S P H E R E E N C O O R D O N N E E S C A R T E S I E N N E S */
/* P A R M A X I M I S A T I O N D E L A D I S T A N C E M I N I M A L E : */
/* */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * ** * * * * * ** * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * ** * * * * * ** */
/* * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* */
/* ATTENTION : */
/* */
/* Je note le 20080310144405 que lorsque */
/* les coordonnees {X(i),Y(i),Z(i)} sont */
/* generees par 'v $xci/valeurs_alea$K', */
/* il conviendra en general d'activer */
/* l'option (ATTENTION : voir plus loin */
/* les remarques du 20080311142744 qui */
/* remettent cela en cause...) : */
/* */
/* affiner_rdn=VRAI */
/* */
/* ce qui permet de positionner l'indicateur */
/* 'v $ximf/aleatoires$FON rdnIFnD_____affiner_la_generation' */
/* qui a pour effet d'activer la fonction 'drand48(...)'. */
/* dans le cas contraire, meme si les valeurs aletaoires */
/* semblent "bonnes", le processus d'optimisation converge */
/* bien pour la majorite des points, mais, par exemple, pour */
/* 26 points, l'un d'entre-eux ne converge pas. On notera */
/* au passage qu'en injectant directement ces {X(i),Y(i),Z(i)} */
/* generees par 'v $xci/valeurs_alea$K' dans 'v $xtc/PtsSphere.01$c' */
/* sous la forme : */
/* */
/* ListePoints[ 0].x=+0.51742357784762 ; ListePoints[ 0].y=+0.88228132244306 ; ListePoints[ 0].z=-0.25472461071551 */
/* ListePoints[ 1].x=-0.57007801652424 ; ListePoints[ 1].y=+0.039200911316649 ; ListePoints[ 1].z=-0.17059720594929 */
/* ListePoints[ 2].x=-0.40312922857847 ; ListePoints[ 2].y=-0.69382054204765 ; ListePoints[ 2].z=-0.70520463898089 */
/* ListePoints[ 3].x=-0.59993940619749 ; ListePoints[ 3].y=-0.54493343482955 ; ListePoints[ 3].z=+0.33056243151918 */
/* ListePoints[ 4].x=-0.51961812028644 ; ListePoints[ 4].y=+0.82385502887138 ; ListePoints[ 4].z=-0.71675944547949 */
/* ListePoints[ 5].x=-0.55625828008925 ; ListePoints[ 5].y=+0.97810393710532 ; ListePoints[ 5].z=-0.57104847793051 */
/* ListePoints[ 6].x=-0.73567431081816 ; ListePoints[ 6].y=+0.4740681734281 ; ListePoints[ 6].z=-0.45564653931914 */
/* ListePoints[ 7].x=-0.35555734501945 ; ListePoints[ 7].y=-0.69712093877472 ; ListePoints[ 7].z=-0.50120017328355 */
/* ListePoints[ 8].x=-0.34157893170676 ; ListePoints[ 8].y=-0.60410423418698 ; ListePoints[ 8].z=-0.12239020602889 */
/* ListePoints[ 9].x=+0.78582182982276 ; ListePoints[ 9].y=-0.91284677195961 ; ListePoints[ 9].z=-0.21440755539313 */
/* ListePoints[10].x=-0.2688586671226 ; ListePoints[10].y=-0.017764692668693 ; ListePoints[10].z=-0.078902251589532 */
/* ListePoints[11].x=-0.15770909523485 ; ListePoints[11].y=+0.57095781973142 ; ListePoints[11].z=+0.41609758204599 */
/* ListePoints[12].x=-0.29679698464312 ; ListePoints[12].y=-0.44883459967041 ; ListePoints[12].z=+0.32066993104325 */
/* ListePoints[13].x=+0.095621603585603 ; ListePoints[13].y=-0.48697452456084 ; ListePoints[13].z=-0.85742153919182 */
/* ListePoints[14].x=+0.5914744104219 ; ListePoints[14].y=+0.47747000329079 ; ListePoints[14].z=+0.66231164367046 */
/* ListePoints[15].x=-0.89445704263377 ; ListePoints[15].y=-0.75781762169572 ; ListePoints[15].z=+0.033517370016089 */
/* ListePoints[16].x=-0.75200886081532 ; ListePoints[16].y=-0.780393104898 ; ListePoints[16].z=+0.35176253940527 */
/* ListePoints[17].x=-0.51503727003701 ; ListePoints[17].y=-0.42529880973757 ; ListePoints[17].z=+0.66181677098471 */
/* ListePoints[18].x=-0.85750913054566 ; ListePoints[18].y=-0.94930307564759 ; ListePoints[18].z=+0.34091992924964 */
/* ListePoints[19].x=-0.11307605500942 ; ListePoints[19].y=+0.76718809537924 ; ListePoints[19].z=-0.86350694106124 */
/* ListePoints[20].x=+0.12388027697982 ; ListePoints[20].y=-0.87765657523538 ; ListePoints[20].z=+0.44752218455426 */
/* ListePoints[21].x=-0.36085067706222 ; ListePoints[21].y=+0.055740823063879 ; ListePoints[21].z=+0.79859563186699 */
/* ListePoints[22].x=+0.70304412800029 ; ListePoints[22].y=+0.28053856654118 ; ListePoints[22].z=+0.16656093307145 */
/* ListePoints[23].x=-0.84031405804693 ; ListePoints[23].y=-0.81095022187147 ; ListePoints[23].z=+0.025308662105961 */
/* ListePoints[24].x=+0.92492640853158 ; ListePoints[24].y=+0.10688464208827 ; ListePoints[24].z=+0.88004404021429 */
/* ListePoints[25].x=+0.91625575577666 ; ListePoints[25].y=+0.7852732310003 ; ListePoints[25].z=-0.10178277646274 */
/* */
/* (les coordonnees 'x', 'y' et 'z' ayant ete obtenues */
/* via 'v $xci/valeurs_alea$K' avec les graines */
/* {1111,3333,5555} respectivement) */
/* */
/* ce programme presente lui-aussi le meme comportement, */
/* ce qui donne les distances aux trois premiers voisins */
/* suivantes (pour 1000000 iterations) : */
/* */
/* d(00,05)=+0.69933589836612 d(00,19)=+0.69933606816643 d(00,25)=+0.69933646082043 */
/* d(01,15)=+0.69933591960808 d(01,03)=+0.69933630774520 d(01,06)=+0.69933633407418 */
/* d(02,04)=+0.69933611794276 d(02,07)=+0.69933642313145 d(02,10)=+0.69933845173217 */
/* d(03,21)=+0.69933630315896 d(03,01)=+0.69933630774520 d(03,11)=+0.69933633156361 */
/* d(04,02)=+0.69933611794276 d(04,19)=+0.69933620134043 d(04,10)=+0.69933629861543 */
/* d(05,00)=+0.69933589836612 d(05,11)=+0.69933623433475 d(05,06)=+0.69933627296799 */
/* d(06,05)=+0.69933627296799 d(06,01)=+0.69933633407418 d(06,04)=+0.69933657270373 */
/* d(07,08)=+0.69933624457462 d(07,13)=+0.69933641781871 d(07,02)=+0.69933642313145 */
/* d(08,20)=+0.69933609123018 d(08,07)=+0.69933624457462 d(08,18)=+0.69933646224464 */
/* d(09,20)=+0.69933589349184 d(09,13)=+0.69933689997989 d(09,07)=+0.69933718683495 */
/* d(10,04)=+0.69933629861543 d(10,23)=+0.69933631242580 d(10,15)=+0.69933653917322 */
/* d(11,05)=+0.69933623433475 d(11,03)=+0.69933633156361 d(11,21)=+0.69933636843623 */
/* d(12,20)=+0.69933582985665 d(12,18)=+0.69933671463457 d(12,17)=+0.69933686183158 */
/* d(13,25)=+0.69933598199669 d(13,19)=+0.69933624770986 d(13,07)=+0.69933641781871 */
/* d(14,22)=+0.69933627491089 d(14,21)=+0.69933664921493 d(14,00)=+0.69933669236661 */
/* d(15,18)=+0.69933589791265 d(15,01)=+0.69933591960808 d(15,10)=+0.69933653917322 */
/* d(16,18)=+0.70450594154025 d(16,01)=+0.70523897882213 d(16,17)=+0.70714268421571 */
/* -------------- -------------- -------------- */
/* d(17,21)=+0.69933598717966 d(17,03)=+0.69933642948900 d(17,12)=+0.69933686183158 */
/* d(18,15)=+0.69933589791265 d(18,08)=+0.69933646224464 d(18,23)=+0.69933650788423 */
/* d(19,00)=+0.69933606816643 d(19,04)=+0.69933620134043 d(19,13)=+0.69933624770986 */
/* d(20,12)=+0.69933582985665 d(20,09)=+0.69933589349184 d(20,08)=+0.69933609123018 */
/* d(21,17)=+0.69933598717966 d(21,03)=+0.69933630315896 d(21,11)=+0.69933636843623 */
/* d(22,25)=+0.69933585807804 d(22,14)=+0.69933627491089 d(22,20)=+0.69933664394205 */
/* d(23,10)=+0.69933631242580 d(23,18)=+0.69933650788423 d(23,07)=+0.69933669801614 */
/* d(24,20)=+0.69933629647099 d(24,21)=+0.69933665864453 d(24,22)=+0.69933672144081 */
/* d(25,22)=+0.69933585807804 d(25,13)=+0.69933598199669 d(25,19)=+0.69933640338539 */
/* */
/* Alors qu'en exploitant directement 'drand48(...)', la */
/* convergence est parfaite. Le probleme ne vient donc pas */
/* de 'v $xrv/optimise.12$K', mais des conditions initiales */
/* {X(i),Y(i),Z(i)} aleatoires... */
/* */
/* En fait, le 20080311142744, je note que ce qui precede */
/* est incomplet. En effet, l'option : */
/* */
/* affiner_rdn=FAUX */
/* */
/* de 'v $xci/valeurs_alea$K' produit une liste {X(i),Y(i),Z(i)} */
/* aleatoire de qualite (c'est-a-dire convergeant avec */
/* 'v $xrv/optimise.12$K') avec les trois graines {123,456,789}. */
/* Mon generateur aleatoire n'est dons pas en cause. Le probleme */
/* doit venir du fait que certains ensembles {X(i),Y(i),Z(i)} */
/* convergent et d'autre pas. Le 20080310144405, j'etais donc tombe, */
/* par hasard, sur un ensemble non convergent avec 'v $xci/valeurs_alea$K' */
/* et avec un qui convergeait avec 'drand48(...)'. D'ailleurs le */
/* 20080311142744, avec : */
/* */
/* affiner_rdn=VRAI */
/* */
/* (et donc 'drand48(...)') et les graines {1111,3333,5555}, */
/* l'ensemble genere {X(i),Y(i),Z(i)} ne converge pas (point 00). */
/* */
/* */
/* Nota : */
/* */
/* Ce programme s'inspire des programmes */
/* 'v $xtc/PtsSphere.01$c' et surtout de */
/* 'v $xtc/PtsSphere.02$c'... */
/* */
/* */
/* Author of '$xrv/optimise.12$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20080309170336). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define NOMBRE_MAXIMAL_D_ELEMENTS_DANS_LE_FICHIER \
CENT_MILLE \
/* Definition du nombre maximal d'elements dans un fichier. Ceci fut introduit le */ \
/* 20080228190114 au cas ou aucun argument de type 'lTRANSFORMAT_0d(...)' ne serait */ \
/* introduit auquel cas 'nombre_maximal_d_elements_dans_le_fichier' a comme valeur ce */ \
/* parametre. Cela provoque alors un defaut d'allocation memoire dans les 'MdTb2(...)' */ \
/* qui suivent... */
#define UTILISER_LES_COORDONNEES_CARTESIENNES_EN_ENTREE \
VRAI
#define UTILISER_LES_COORDONNEES_CARTESIENNES_EN_SORTIE \
VRAI
/* Afin de choisir entre les coordonnees cartesiennes ('VRAI') et les coordonnees */
/* spheriques ('VRAI') en entree et en sortie (introduit le 20080312092208). */
#define NOMBRE_D_ITERATIONS_D_OPTIMISATION \
CENT_MILLE \
/* Nombre d'iterations maximum... */
#define S_ARRETER_AVANT_LA_FIN \
FAUX
#define NOMBRE_D_ITERATIONS_D_OPTIMISATION_AU_BOUT_DUQUEL_S_ARRETER \
NOMBRE_D_ITERATIONS_D_OPTIMISATION
/* Faut-il s'arreter avant la fin et si oui, au bout de combien d'iterations ? Ceci a ete */
/* introduit le 20011107161207 afin de permettre la realisation des animations decrites */
/* par 'v $xiirs/.PSPH.31.1.$u optimise.01'. Il est en effet important que pour toutes */
/* les images d'une visualisation de la dynamique du processus, l'echelle de 'temps' soit la */
/* meme ; et pour ce faire, il est essentiel que 'nombre_d_iterations_d_optimisation' soit */
/* le meme pour toutes ces images ; il convient donc d'introduire un nouveau test d'arret, */
/* d'ou 'nombre_d_iterations_d_optimisation_au_bout_duquel_s_arreter'... */
#define CALCULER_LA_MATRICE_DES_VOISINS \
FAUX \
/* Indique si la calcul de la matrice des voisins doit etre fait meme s'il n'est pas utile */ \
/* ('VRAI')ou pas ('FAUX'). Ceci fut introduit le 20080301095446 afin des fins de mise au */ \
/* point... */
#define EDITER_TOUTES_LES_DISTANCES_MINIMALES \
FAUX \
/* Doit-on editer toutes les distances minimales pour voir l'amelioration comment converge */ \
/* le processus (possibilite introduite le 20080224095738) ? */
#define EDITER_LES_DISTANCES_MINIMALES_INITIALE_ET_FINALE \
FAUX \
/* Doit-on editer les distances minimales initiale et finale pour voir l'amelioration ? */
#define EDITER_LA_MATRICE_DES_DISTANCES \
FAUX
#define EDITER_LA_MATRICE_DES_DISTANCES_TRIEE_SUIVANT_LA_MATRICE_DES_VOISINS \
FAUX
#define NOMBRE_ELEMENTS_MATRICE_DES_DISTANCES_TRIEE_SUIVANT_LA_MATRICE_DES_VOISINS \
TROIS
#define EDITER_LA_MATRICE_DES_VOISINS \
FAUX
/* Doit-on editer les matrices des distances et des vosins (introduit le 20080227180930)... */
#define COORDONNEE_X_DU_CENTRE_DE_LA_SPHERE \
FXorigine
#define COORDONNEE_Y_DU_CENTRE_DE_LA_SPHERE \
FYorigine
#define COORDONNEE_Z_DU_CENTRE_DE_LA_SPHERE \
FZorigine
#define RAYON_DE_LA_SPHERE \
FU
/* Definition de la sphere... */
#define PERTURBER_LA_DISTANCE_MINIMALE \
VRAI
#define PERTURBER_LA_DISTANCE_MAXIMALE \
VRAI
/* Definition des distances a perturber... */
#define PONDERATION_INITIALE_DE_LA_DISTANCE_MINIMALE \
FRA10(FRA10(FU))
#define AJUSTER_AUTOMATIQUEMENT_LA_PONDERATION_FINALE___DE_LA_DISTANCE_MINIMALE \
VRAI
#define PONDERATION_FINALE___DE_LA_DISTANCE_MINIMALE \
GRO1(INVE(FLOT(NOMBRE_D_ITERATIONS_D_OPTIMISATION)))
#define PONDERATION_INITIALE_DE_LA_DISTANCE_MAXIMALE \
FRA10(FRA10(FU))
#define AJUSTER_AUTOMATIQUEMENT_LA_PONDERATION_FINALE___DE_LA_DISTANCE_MAXIMALE \
VRAI
#define PONDERATION_FINALE___DE_LA_DISTANCE_MAXIMALE \
GRO1(INVE(FLOT(NOMBRE_D_ITERATIONS_D_OPTIMISATION)))
/* Definition de la perturbation des distances minimale et maximale. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S F I C H I E R S : */
/* */
/*************************************************************************************************************************************/
#include xrv/ARITHMET.1d.I"
/* Passage a l'allocation dynamique le 20060214192917... */
#include xrv/ARITHMET.21.I"
#include xrv/champs_5.41.I"
#include xrq/nucleon.LB.I"
#define RHO__IMPLICITE \
FU
#define PHI__IMPLICITE \
FZERO
#define THETA_IMPLICITE \
FZERO
gGENERATION_D_UN_FICHIER(fichier_LISTE_RHO_,liste_initiale_des_RHO_);
gGENERATION_D_UN_FICHIER(fichier_LISTE_PHI_,liste_initiale_des_PHI_);
gGENERATION_D_UN_FICHIER(fichier_LISTE_THETA,liste_initiale_des_THETA);
/* Definition en memoire des fichiers de coordonnees spheriques (introduits le */
/* 20080312092208...). */
#define ELEMENT_DU_FICHIER_LISTE_RHO_(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_RHO_,index)
#define ELEMENT_DU_FICHIER_LISTE_PHI_(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_PHI_,index)
#define ELEMENT_DU_FICHIER_LISTE_THETA(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_THETA,index)
/* Acces a un element courant des fichiers de coordonnees spheriques. */
#define X_IMPLICITE \
FZERO
#define Y_IMPLICITE \
FZERO
#define Z_IMPLICITE \
FZERO
gGENERATION_D_UN_FICHIER(fichier_LISTE_X,liste_initiale_des_X);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Y,liste_initiale_des_Y);
gGENERATION_D_UN_FICHIER(fichier_LISTE_Z,liste_initiale_des_Z);
/* Definition en memoire des fichiers de coordonnees cartesiennes. */
#define ELEMENT_DU_FICHIER_LISTE_X(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_X,index)
#define ELEMENT_DU_FICHIER_LISTE_Y(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_Y,index)
#define ELEMENT_DU_FICHIER_LISTE_Z(index) \
gELEMENT_DU_FICHIER(liste_initiale_des_Z,index)
/* Acces a un element courant des fichiers de coordonnees cartesiennes. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define MATRICE_DES_DISTANCES(index_i,index_j) \
IdTb2(matrice_des_distances \
,INDX(index_i,PREMIER_ELEMENT_D_UN_FICHIER),nombre_maximal_d_elements_dans_le_fichier \
,INDX(index_j,PREMIER_ELEMENT_D_UN_FICHIER),nombre_maximal_d_elements_dans_le_fichier \
) \
/* Acces a un element courant de 'matrice_des_distances'... */
DEFV(Local,DEFV(Float,DdTb2(POINTERf
,matrice_des_distances
,nombre_maximal_d_elements_dans_le_fichier,nombre_maximal_d_elements_dans_le_fichier
,ADRESSE_NON_ENCORE_DEFINIE
)
)
);
/* Matrice des distances des points deux a deux (introduite le 20080225161158)... */
#define MATRICE_DES_VOISINS(index_i,index_j) \
IdTb2(matrice_des_voisins \
,INDX(index_i,PREMIER_ELEMENT_D_UN_FICHIER),nombre_maximal_d_elements_dans_le_fichier \
,INDX(index_j,PREMIER_ELEMENT_D_UN_FICHIER),nombre_maximal_d_elements_dans_le_fichier \
) \
/* Acces a un element courant de 'matrice_des_voisins'... */
DEFV(Local,DEFV(Int,DdTb2(POINTERi
,matrice_des_voisins
,nombre_maximal_d_elements_dans_le_fichier,nombre_maximal_d_elements_dans_le_fichier
,ADRESSE_NON_ENCORE_DEFINIE
)
)
);
/* Matrice des voisins de chaque point (introduite le 20080227101546). L'element {i,j} */
/* donne le j-ieme voisin du point d'index 'i'. */
DEFV(Local,DEFV(Logical,INIT(la_matrice_des_voisins_est_necessaire,FAUX)));
/* Indique si 'matrice_des_voisins' est necessaire ou pas... */
#define LISTE_DES_DISTANCES_DU_POINT_i_AUX_AUTRES_POINTS(index) \
gELEMENT_DU_FICHIER(liste_des_distances_du_point_i_aux_autres_points,index) \
/* Acces a un element courant de 'liste_des_distances_du_point_i_aux_autres_points'... */
#define LISTE_DES_VOISINS_DU_POINT_i(index) \
gELEMENT_DU_FICHIER(liste_des_voisins_du_point_i,index) \
/* Acces a un element courant de 'liste_des_voisins_du_point_i'... */
#define ACCES_DISTANCE(liste,index) \
IdTb1(liste,index,nombre_maximal_d_elements_dans_le_fichier) \
/* Afin de pouvoir utiliser 'TRI_D_UNE_LISTE_QUELCONQUE(...)'. */
DEFV(Local,DEFV(Float,INIT(distance_minimale,FLOT__UNDEF)));
DEFV(Local,DEFV(Int,INIT(index_i_de_la_distance_minimale,UNDEF)));
DEFV(Local,DEFV(Int,INIT(index_j_de_la_distance_minimale,UNDEF)));
/* Definition de la distance minimale... */
DEFV(Local,DEFV(Float,INIT(distance_maximale,FLOT__UNDEF)));
DEFV(Local,DEFV(Int,INIT(index_i_de_la_distance_maximale,UNDEF)));
DEFV(Local,DEFV(Int,INIT(index_j_de_la_distance_maximale,UNDEF)));
/* Definition de la distance maximale... */
#define NORMALISATION_D_UN_POINT(index) \
Bblock \
DEFV(Float,INIT(distance_courante \
,RdisF3D(coordonnee_X_du_centre_de_la_sphere \
,coordonnee_Y_du_centre_de_la_sphere \
,coordonnee_Z_du_centre_de_la_sphere \
,ELEMENT_DU_FICHIER_LISTE_X(index) \
,ELEMENT_DU_FICHIER_LISTE_Y(index) \
,ELEMENT_DU_FICHIER_LISTE_Z(index) \
) \
) \
); \
\
EGAL(ELEMENT_DU_FICHIER_LISTE_X(index) \
,SCAL(ELEMENT_DU_FICHIER_LISTE_X(index) \
,distance_courante \
,rayon_de_la_sphere \
) \
); \
EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index) \
,SCAL(ELEMENT_DU_FICHIER_LISTE_Y(index) \
,distance_courante \
,rayon_de_la_sphere \
) \
); \
EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index) \
,SCAL(ELEMENT_DU_FICHIER_LISTE_Z(index) \
,distance_courante \
,rayon_de_la_sphere \
) \
); \
Eblock \
/* Normalisation d'un point {X,Y,Z} de facon a ce qu'il se retrouve sur la sphere... */
#define CALCUL_DES_DISTANCES_DEUX_A_DEUX \
Bblock \
DEFV(Int,INIT(DM_index_i,UNDEF)); \
DEFV(Int,INIT(DM_index_j,UNDEF)); \
\
EGAL(distance_minimale,F_INFINI); \
EGAL(distance_maximale,F_MOINS_L_INFINI); \
\
DoIn(DM_index_i,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
DoIn(DM_index_j,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
Test(IFGT(DM_index_i,DM_index_j)) \
Bblock \
DEFV(Float,INIT(distance_courante \
,RdisF3D(ELEMENT_DU_FICHIER_LISTE_X(DM_index_i) \
,ELEMENT_DU_FICHIER_LISTE_Y(DM_index_i) \
,ELEMENT_DU_FICHIER_LISTE_Z(DM_index_i) \
,ELEMENT_DU_FICHIER_LISTE_X(DM_index_j) \
,ELEMENT_DU_FICHIER_LISTE_Y(DM_index_j) \
,ELEMENT_DU_FICHIER_LISTE_Z(DM_index_j) \
) \
) \
); \
\
EGAL(MATRICE_DES_DISTANCES(DM_index_i,DM_index_j),distance_courante); \
EGAL(MATRICE_DES_DISTANCES(DM_index_j,DM_index_i),distance_courante); \
/* Memorisation de la distance entre les points {DM_index_i,DM_index_j} qui est evidemment */ \
/* egale a celle entre les points {DM_index_j,DM_index_i}... */ \
\
Test(IL_FAUT(perturber_la_distance_minimale)) \
Bblock \
Test(IFLT(distance_courante,distance_minimale)) \
Bblock \
EGAL(distance_minimale,distance_courante); \
EGAL(index_i_de_la_distance_minimale,DM_index_i); \
EGAL(index_j_de_la_distance_minimale,DM_index_j); \
/* Memorisation de la distance minimale... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(perturber_la_distance_maximale)) \
Bblock \
Test(IFGT(distance_courante,distance_maximale)) \
Bblock \
EGAL(distance_maximale,distance_courante); \
EGAL(index_i_de_la_distance_maximale,DM_index_i); \
EGAL(index_j_de_la_distance_maximale,DM_index_j); \
/* Memorisation de la distance maximale... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
/* On notera que la diagonale 'DM_index_i=DM_index_j' est toujours a zero (par */ \
/* initialisation...). */ \
Eblock \
ETes \
Eblock \
EDoI \
Eblock \
EDoI \
\
Test(IL_FAUT(calculer_la_matrice_des_voisins)) \
/* Test introduit le 20080225163034. */ \
Bblock \
DoIn(DM_index_i,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
gGENERATION_D_UN_FICHIER_liste(liste_des_distances_du_point_i_aux_autres_points); \
gGENERATION_D_UN_FICHIER_liste(liste_des_voisins_du_point_i); \
\
iGENERATION_D_UN_FICHIER(liste_des_distances_du_point_i_aux_autres_points,FLOT__UNDEF); \
iGENERATION_D_UN_FICHIER(liste_des_voisins_du_point_i,UNDEF); \
\
DoIn(DM_index_j,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
EGAL(LISTE_DES_DISTANCES_DU_POINT_i_AUX_AUTRES_POINTS(DM_index_j) \
,MATRICE_DES_DISTANCES(DM_index_i,DM_index_j) \
); \
/* Recuperation de la liste des distances du point 'DM_index_i' a tous les autres (y compris */ \
/* lui-meme...). */ \
EGAL(LISTE_DES_VOISINS_DU_POINT_i(DM_index_j),DM_index_j); \
/* Et initialisation de la future liste des index tries... */ \
Eblock \
EDoI \
\
TRI_D_UNE_LISTE_QUELCONQUE(liste_des_distances_du_point_i_aux_autres_points \
,liste_des_voisins_du_point_i \
,PREMIER_ELEMENT_D_UN_FICHIER \
,DERNIER_ELEMENT_D_UN_FICHIER \
,EST_CE_LE_TRI_AUTOMATIQUE_D_UNE_LISTE_QUELCONQUE \
,EST_CE_LE_TRI_N_AU_CARRE_D_UNE_LISTE_QUELCONQUE \
,ACCES_DISTANCE \
); \
/* L'argument 'EST_CE_LE_TRI_AUTOMATIQUE_D_UNE_LISTE_QUELCONQUE' a ete introduit le */ \
/* 20170608104350... */ \
\
DoIn(DM_index_j,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
EGAL(MATRICE_DES_VOISINS(DM_index_i,DM_index_j) \
,LISTE_DES_VOISINS_DU_POINT_i(DM_index_j) \
); \
/* Generation de la liste des voisins du point 'i' : en toute logique, le premier element */ \
/* de cette liste doit donner 'i' lui-meme (puisque chaque point est evidemment son plus */ \
/* proche voisin -a distance nulle-) ; le deuxieme element donnera le point le plus proche */ \
/* (different de 'i') et ainsi de suite... */ \
Eblock \
EDoI \
\
lGENERATION_D_UN_FICHIER(liste_des_voisins_du_point_i,UNDEF); \
lGENERATION_D_UN_FICHIER(liste_des_distances_du_point_i_aux_autres_points,FLOT__UNDEF); \
Eblock \
EDoI \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Calcul de la distance minimale a un instant donne. */
#define EDITION_DE_LA_MATRICE_DES_DISTANCES \
Bblock \
Test(IL_FAUT(editer_la_matrice_des_distances)) \
Bblock \
DEFV(Int,INIT(EMD_index_i,UNDEF)); \
DEFV(Int,INIT(EMD_index_j,UNDEF)); \
/* Index de parcours des matrices... */ \
\
Test(IL_NE_FAUT_PAS(editer_la_matrice_des_distances_triee_suivant_la_matrice_des_voisins)) \
Bblock \
DoIn(EMD_index_i,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
DoIn(EMD_index_j \
,PREMIER_ELEMENT_D_UN_FICHIER \
,DERNIER_ELEMENT_D_UN_FICHIER \
,I \
) \
Bblock \
CAL3(Prme4(" d(%0*d,%0*d)=" \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,EMD_index_i \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,EMD_index_j \
) \
); \
gEDITION_DANS_gOPERATION_SUR_LES_FICHIERS(MATRICE_DES_DISTANCES(EMD_index_i,EMD_index_j) \
,CAL3,Prme1,Prme2 \
); \
Eblock \
EDoI \
\
CALS(Fsauts_de_lignes(UN)); \
Eblock \
EDoI \
Eblock \
ATes \
Bblock \
Test(IL_FAUT(calculer_la_matrice_des_voisins)) \
Bblock \
DoIn(EMD_index_i \
,PREMIER_ELEMENT_D_UN_FICHIER \
,DERNIER_ELEMENT_D_UN_FICHIER \
,I \
) \
Bblock \
DoIn(EMD_index_j \
,SUCC(PREMIER_ELEMENT_D_UN_FICHIER) \
,SUCC(LSTX(PREMIER_ELEMENT_D_UN_FICHIER \
,nombre_elements_matrice_des_distances_triee_suivant_la_matrice_des_voisins \
) \
) \
,I \
) \
Bblock \
DEFV(Int,INIT(index_j_trie,MATRICE_DES_VOISINS(EMD_index_i,EMD_index_j))); \
\
CAL3(Prme4(" d(%0*d,%0*d)=" \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,EMD_index_i \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,index_j_trie \
) \
); \
gEDITION_DANS_gOPERATION_SUR_LES_FICHIERS(MATRICE_DES_DISTANCES(EMD_index_i,index_j_trie) \
,CAL3,Prme1,Prme2 \
); \
Eblock \
EDoI \
\
CALS(Fsauts_de_lignes(UN)); \
Eblock \
EDoI \
Eblock \
ATes \
Bblock \
PRINT_ATTENTION("l'edition de la matrice des distances triees suivant les voisins n'a pas de sens"); \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition de la matrice des distances (introduite sous cette forme le 20080229211010). */
#define EDITION_DE_LA_MATRICE_DES_VOISINS \
Bblock \
Test(IL_FAUT(editer_la_matrice_des_voisins)) \
Bblock \
Test(IL_FAUT(calculer_la_matrice_des_voisins)) \
Bblock \
DEFV(Int,INIT(EMV_index_i,UNDEF)); \
DEFV(Int,INIT(EMV_index_j,UNDEF)); \
/* Index de parcours des matrices... */ \
\
DoIn(EMV_index_i,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I) \
Bblock \
DoIn(EMV_index_j \
,PREMIER_ELEMENT_D_UN_FICHIER \
,DERNIER_ELEMENT_D_UN_FICHIER \
,I \
) \
Bblock \
CAL3(Prme6(" v(%0*d,%0*d)=%0*d" \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,EMV_index_i \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,EMV_index_j \
,NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_d_elements) \
,MATRICE_DES_VOISINS(EMV_index_i,EMV_index_j) \
) \
); \
Eblock \
EDoI \
\
CALS(Fsauts_de_lignes(UN)); \
Eblock \
EDoI \
\
CALS(Fsauts_de_lignes(UN)); \
Eblock \
ATes \
Bblock \
PRINT_ATTENTION("l'edition de la matrice des voisins n'a pas de sens ici"); \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition de la matrice des voisins (introduite sous cette forme le 20080229211010). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* O P T I M I S A T I O N D E S D I S T A N C E S E N T R E D E S P O I N T S */
/* S U R U N E S P H E R E E N C O O R D O N N E E S C A R T E S I E N N E S */
/* P A R M A X I M I S A T I O N D E L A D I S T A N C E M I N I M A L E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
#include xrv/ARITHMET.22.I"
#include xci/valeurs.03.I"
DEFV(Logical,INIT(utiliser_les_coordonnees_cartesiennes_en_entree,UTILISER_LES_COORDONNEES_CARTESIENNES_EN_ENTREE));
DEFV(Logical,INIT(utiliser_les_coordonnees_cartesiennes_en_sortie,UTILISER_LES_COORDONNEES_CARTESIENNES_EN_SORTIE));
/* Afin de choisir entre les coordonnees cartesiennes ('VRAI') et les coordonnees */
/* spheriques ('VRAI') en entree et en sortie (introduit le 20080312092208). */
DEFV(Int,INIT(nombre_d_iterations_d_optimisation,NOMBRE_D_ITERATIONS_D_OPTIMISATION));
/* Nombre d'iterations maximum... */
DEFV(Logical,INIT(s_arreter_avant_la_fin,S_ARRETER_AVANT_LA_FIN));
DEFV(Int,INIT(nombre_d_iterations_d_optimisation_au_bout_duquel_s_arreter
,NOMBRE_D_ITERATIONS_D_OPTIMISATION_AU_BOUT_DUQUEL_S_ARRETER
)
);
/* Faut-il s'arreter avant la fin et si oui, au bout de combien d'iterations ? Ceci a ete */
/* introduit le 20011107161207 afin de permettre la realisation des animations decrites */
/* par 'v $xiirs/.PSPH.31.1.$u optimise.01'. Il est en effet important que pour toutes */
/* les images d'une visualisation de la dynamique du processus, l'echelle de 'temps' soit la */
/* meme ; et pour ce faire, il est essentiel que 'nombre_d_iterations_d_optimisation' soit */
/* le meme pour toutes ces images ; il convient donc d'introduire un nouveau test d'arret, */
/* d'ou 'nombre_d_iterations_d_optimisation_au_bout_duquel_s_arreter'... */
DEFV(Logical,INIT(calculer_la_matrice_des_voisins,CALCULER_LA_MATRICE_DES_VOISINS));
/* Indique si la calcul de la matrice des voisins doit etre fait meme s'il n'est pas utile */
/* ('VRAI')ou pas ('FAUX'). Ceci fut introduit le 20080301095446 afin des fins de mise au */
/* point... */
DEFV(Logical,INIT(editer_toutes_les_distances_minimales,EDITER_TOUTES_LES_DISTANCES_MINIMALES));
/* Doit-on editer toutes les distances minimales pour voir l'amelioration comment converge */
/* le processus (possibilite introduite le 20080224095738) ? */
DEFV(Logical,INIT(editer_les_distances_minimales_initiale_et_finale,EDITER_LES_DISTANCES_MINIMALES_INITIALE_ET_FINALE));
/* Doit-on editer les distances minimales initiale et finale pour voir l'amelioration ? */
DEFV(Logical,INIT(editer_la_matrice_des_distances,EDITER_LA_MATRICE_DES_DISTANCES));
DEFV(Logical,INIT(editer_la_matrice_des_distances_triee_suivant_la_matrice_des_voisins
,EDITER_LA_MATRICE_DES_DISTANCES_TRIEE_SUIVANT_LA_MATRICE_DES_VOISINS
)
);
DEFV(Int,INIT(nombre_elements_matrice_des_distances_triee_suivant_la_matrice_des_voisins
,NOMBRE_ELEMENTS_MATRICE_DES_DISTANCES_TRIEE_SUIVANT_LA_MATRICE_DES_VOISINS
)
);
DEFV(Logical,INIT(editer_la_matrice_des_voisins,EDITER_LA_MATRICE_DES_VOISINS));
/* Doit-on editer les matrices des distances et des vosins (introduit le 20080227180930)... */
DEFV(Float,INIT(coordonnee_X_du_centre_de_la_sphere,COORDONNEE_X_DU_CENTRE_DE_LA_SPHERE));
DEFV(Float,INIT(coordonnee_Y_du_centre_de_la_sphere,COORDONNEE_Y_DU_CENTRE_DE_LA_SPHERE));
DEFV(Float,INIT(coordonnee_Z_du_centre_de_la_sphere,COORDONNEE_Z_DU_CENTRE_DE_LA_SPHERE));
DEFV(Float,INIT(rayon_de_la_sphere,RAYON_DE_LA_SPHERE));
/* Definition de la sphere... */
DEFV(Logical,INIT(perturber_la_distance_minimale,PERTURBER_LA_DISTANCE_MINIMALE));
DEFV(Logical,INIT(perturber_la_distance_maximale,PERTURBER_LA_DISTANCE_MAXIMALE));
/* Definition des distances a perturber... */
DEFV(Float,INIT(ponderation_initiale_de_la_distance_minimale,PONDERATION_INITIALE_DE_LA_DISTANCE_MINIMALE));
DEFV(Logical,INIT(ajuster_automatiquement_la_ponderation_finale___de_la_distance_minimale
,AJUSTER_AUTOMATIQUEMENT_LA_PONDERATION_FINALE___DE_LA_DISTANCE_MINIMALE
)
);
DEFV(Float,INIT(ponderation_finale___de_la_distance_minimale,PONDERATION_FINALE___DE_LA_DISTANCE_MINIMALE));
DEFV(Float,INIT(ponderation_initiale_de_la_distance_maximale,PONDERATION_INITIALE_DE_LA_DISTANCE_MAXIMALE));
DEFV(Logical,INIT(ajuster_automatiquement_la_ponderation_finale___de_la_distance_maximale
,AJUSTER_AUTOMATIQUEMENT_LA_PONDERATION_FINALE___DE_LA_DISTANCE_MAXIMALE
)
);
DEFV(Float,INIT(ponderation_finale___de_la_distance_maximale,PONDERATION_FINALE___DE_LA_DISTANCE_MAXIMALE));
/* Definition de la perturbation des distances minimale et maximale. */
DEFV(Int,INIT(iteration_courante,UNDEF));
/* Index divers... */
/*..............................................................................................................................*/
#include xrv/champs_5.1A.I"
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements
,BLOC(VIDE;)
,BLOC(Bblock
PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers");
Eblock
)
);
PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01;
GET_ARGUMENT_L("cartesiennesA=""cartesienneA=""cA=",utiliser_les_coordonnees_cartesiennes_en_entree);
GET_ARGUMENT_N("spheriquesA=""spheriqueA=""sA=",utiliser_les_coordonnees_cartesiennes_en_entree);
GET_ARGUMENT_L("cartesiennesR=""cartesienneR=""cR=",utiliser_les_coordonnees_cartesiennes_en_sortie);
GET_ARGUMENT_N("spheriquesR=""spheriqueR=""sR=",utiliser_les_coordonnees_cartesiennes_en_sortie);
PROKESF_ARGUMENT_FICHIER("LISTE_RHO="
,fichier_LISTE_RHO_
,liste_initiale_des_RHO_
,RHO__IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_PHI="
,fichier_LISTE_PHI_
,liste_initiale_des_PHI_
,PHI__IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_THETA="
,fichier_LISTE_THETA
,liste_initiale_des_THETA
,THETA_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_X="
,fichier_LISTE_X
,liste_initiale_des_X
,X_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_Y="
,fichier_LISTE_Y
,liste_initiale_des_Y
,Y_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
PROKESF_ARGUMENT_FICHIER("LISTE_Z="
,fichier_LISTE_Z
,liste_initiale_des_Z
,Z_IMPLICITE
,lTRANSFORMAT_0d
,iGENERATION_D_UN_FICHIER
);
GET_ARGUMENT_I("iterations=",nombre_d_iterations_d_optimisation);
GET_ARGUMENT_L("avant_la_fin=",s_arreter_avant_la_fin);
GET_ARGUMENT_I("fin=",nombre_d_iterations_d_optimisation_au_bout_duquel_s_arreter);
GET_ARGUMENT_L("calculer_matrice_voisins=""cmv=",calculer_la_matrice_des_voisins);
GET_ARGUMENT_L("lister_all=""lia=""editer_all=""eda=",editer_toutes_les_distances_minimales);
GET_ARGUMENT_L("lister_initiale_finale=""liif=""editer_initiale_finale=""edif="
,editer_les_distances_minimales_initiale_et_finale
);
GET_ARGUMENT_L("editer_matrice_distances=""emd=",editer_la_matrice_des_distances);
GET_ARGUMENT_L("editer_matrice_distances_triee=""emdt=""emdv="
,editer_la_matrice_des_distances_triee_suivant_la_matrice_des_voisins
);
GET_ARGUMENT_I("nombre_points_matrice_distances_triee=""npmdt=""npmdv="
,nombre_elements_matrice_des_distances_triee_suivant_la_matrice_des_voisins
);
GET_ARGUMENT_L("editer_matrice_voisins=""emv=",editer_la_matrice_des_voisins);
GET_ARGUMENT_L("perturber_distance_minimale=""pdm=",perturber_la_distance_minimale);
GET_ARGUMENT_L("perturber_distance_maximale=""pdM=",perturber_la_distance_maximale);
GET_ARGUMENT_F("ponderation_initiale_distance_minimale=""pidm="
,ponderation_initiale_de_la_distance_minimale
);
GET_ARGUMENT_L("ajuster_ponderation_finale_distance_minimale=""apfdm="
,ajuster_automatiquement_la_ponderation_finale___de_la_distance_minimale
);
GET_ARGUMENT_F("ponderation_finale_distance_minimale=""pfdm="
,ponderation_finale___de_la_distance_minimale
);
GET_ARGUMENT_F("ponderation_initiale_distance_maximale=""pidM="
,ponderation_initiale_de_la_distance_maximale
);
GET_ARGUMENT_L("ajuster_ponderation_finale_distance_maximale=""apfdM="
,ajuster_automatiquement_la_ponderation_finale___de_la_distance_maximale
);
GET_ARGUMENT_F("ponderation_finale_distance_maximale=""pfdM="
,ponderation_finale___de_la_distance_maximale
);
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;
/* Cette procedure fut introduite le 20070103174132... */
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
/* Cette procedure fut introduite le 20061226192626... */
)
);
Test(IL_FAUT(ajuster_automatiquement_la_ponderation_finale___de_la_distance_minimale))
Bblock
EGAL(ponderation_finale___de_la_distance_minimale
,GRO1(INVE(FLOT(nombre_d_iterations_d_optimisation)))
);
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(ajuster_automatiquement_la_ponderation_finale___de_la_distance_maximale))
Bblock
EGAL(ponderation_finale___de_la_distance_maximale
,GRO1(INVE(FLOT(nombre_d_iterations_d_optimisation)))
);
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(editer_la_matrice_des_distances))
Bblock
Test(IL_FAUT(editer_la_matrice_des_distances_triee_suivant_la_matrice_des_voisins))
Bblock
Test(IFGE(nombre_elements_matrice_des_distances_triee_suivant_la_matrice_des_voisins,nombre_d_elements))
Bblock
PRINT_ATTENTION("le nombre de points a editer est superieur ou egal au nombre de points, il est donc seuille");
EGAL(nombre_elements_matrice_des_distances_triee_suivant_la_matrice_des_voisins,PRED(nombre_d_elements));
CAL1(Prer1("(le nombre de points a editer vaut donc %d)\n"
,nombre_elements_matrice_des_distances_triee_suivant_la_matrice_des_voisins
)
);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
MdTb2(matrice_des_distances
,nombre_maximal_d_elements_dans_le_fichier,nombre_maximal_d_elements_dans_le_fichier
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Allocation de la matrice des distances des points deux a deux... */
MdTb2(matrice_des_voisins
,nombre_maximal_d_elements_dans_le_fichier,nombre_maximal_d_elements_dans_le_fichier
,Int
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Allocation de la matrice des voisins de chaque point... */
begin_nouveau_block
Bblock
DEFV(Int,INIT(index_i,UNDEF));
DEFV(Int,INIT(index_j,UNDEF));
/* Index de parcours des matrices... */
DoIn(index_i,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
Bblock
DoIn(index_j,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
Bblock
EGAL(MATRICE_DES_DISTANCES(index_i,index_j),FZERO);
/* Par precaution ; cela est surtout destine a nettoyer la diagonale qui sans cela ne */
/* serait jamais initialisee et zero est de plus la bonne valeur puisque : */
/* */
/* distance(i,j) = 0 */
/* */
/* pour i=j... */
EGAL(MATRICE_DES_VOISINS(index_i,index_j),UNDEF);
/* Par precaution... */
Eblock
EDoI
Eblock
EDoI
Eblock
end_nouveau_block
DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
Bblock
Test(IL_FAUT(utiliser_les_coordonnees_cartesiennes_en_entree))
Bblock
Eblock
ATes
Bblock
EGAL(ELEMENT_DU_FICHIER_LISTE_X(index)
,Xcartesienne_3D(ELEMENT_DU_FICHIER_LISTE_RHO_(index)
,ELEMENT_DU_FICHIER_LISTE_PHI_(index)
,ELEMENT_DU_FICHIER_LISTE_THETA(index)
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index)
,Ycartesienne_3D(ELEMENT_DU_FICHIER_LISTE_RHO_(index)
,ELEMENT_DU_FICHIER_LISTE_PHI_(index)
,ELEMENT_DU_FICHIER_LISTE_THETA(index)
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index)
,Zcartesienne_3D(ELEMENT_DU_FICHIER_LISTE_RHO_(index)
,ELEMENT_DU_FICHIER_LISTE_PHI_(index)
,ELEMENT_DU_FICHIER_LISTE_THETA(index)
)
);
/* Et conversion spherique --> cartesienne... */
Eblock
ETes
Eblock
EDoI
DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,DERNIER_ELEMENT_D_UN_FICHIER,I)
Bblock
NORMALISATION_D_UN_POINT(index);
/* Initialement, on force les coordonnnees {X,Y,Z} sur la sphere... */
Eblock
EDoI
Komp(iteration_courante
,COND(IL_NE_FAUT_PAS(s_arreter_avant_la_fin)
,nombre_d_iterations_d_optimisation
,MIN2(nombre_d_iterations_d_optimisation_au_bout_duquel_s_arreter,nombre_d_iterations_d_optimisation)
)
)
Bblock
DEFV(Int,INIT(index_i,UNDEF));
DEFV(Int,INIT(index_j,UNDEF));
DEFV(Float,INIT(ponderation_courante_de_la_distance_minimale
,BARY(ponderation_initiale_de_la_distance_minimale
,ponderation_finale___de_la_distance_minimale
,DIVI(FLOT(SOUS(iteration_courante,PREMIERE_ITERATION_D_UN_Komp))
,FLOT(SOUS(nombre_d_iterations_d_optimisation,PREMIERE_ITERATION_D_UN_Komp))
)
)
)
);
DEFV(Float,INIT(ponderation_courante_de_la_distance_maximale
,BARY(ponderation_initiale_de_la_distance_maximale
,ponderation_finale___de_la_distance_maximale
,DIVI(FLOT(SOUS(iteration_courante,PREMIERE_ITERATION_D_UN_Komp))
,FLOT(SOUS(nombre_d_iterations_d_optimisation,PREMIERE_ITERATION_D_UN_Komp))
)
)
)
);
/* Definition des ponderations courantes... */
CALCUL_DES_DISTANCES_DEUX_A_DEUX;
/* Calcul des distances extremales... */
Test(IL_FAUT(editer_toutes_les_distances_minimales))
Bblock
CAL2(Prin0(" DistanceMinimale="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(distance_minimale);
/* Introduit sous cette forme le 20160804100535... */
Eblock
ATes
Bblock
Test(IFET(IL_FAUT(editer_les_distances_minimales_initiale_et_finale)
,IFEQ(iteration_courante,PREMIERE_ITERATION_D_UN_Komp)
)
)
Bblock
CAL2(Prin0(" DistanceMinimaleInitiale="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(distance_minimale);
/* Introduit sous cette forme le 20160804100535... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
Test(IL_FAUT(perturber_la_distance_minimale))
Bblock
DEFV(Float,INIT(delta_X
,MUL2(ponderation_courante_de_la_distance_minimale
,SOUS(ELEMENT_DU_FICHIER_LISTE_X(index_j_de_la_distance_minimale)
,ELEMENT_DU_FICHIER_LISTE_X(index_i_de_la_distance_minimale)
)
)
)
);
DEFV(Float,INIT(delta_Y
,MUL2(ponderation_courante_de_la_distance_minimale
,SOUS(ELEMENT_DU_FICHIER_LISTE_Y(index_j_de_la_distance_minimale)
,ELEMENT_DU_FICHIER_LISTE_Y(index_i_de_la_distance_minimale)
)
)
)
);
DEFV(Float,INIT(delta_Z
,MUL2(ponderation_courante_de_la_distance_minimale
,SOUS(ELEMENT_DU_FICHIER_LISTE_Z(index_j_de_la_distance_minimale)
,ELEMENT_DU_FICHIER_LISTE_Z(index_i_de_la_distance_minimale)
)
)
)
);
/* Generation de la perturbation {dX,dY,dZ} de la distance minimale... */
EGAL(ELEMENT_DU_FICHIER_LISTE_X(index_i_de_la_distance_minimale)
,SOUS(ELEMENT_DU_FICHIER_LISTE_X(index_i_de_la_distance_minimale)
,delta_X
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index_i_de_la_distance_minimale)
,SOUS(ELEMENT_DU_FICHIER_LISTE_Y(index_i_de_la_distance_minimale)
,delta_Y
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index_i_de_la_distance_minimale)
,SOUS(ELEMENT_DU_FICHIER_LISTE_Z(index_i_de_la_distance_minimale)
,delta_Z
)
);
NORMALISATION_D_UN_POINT(index_i_de_la_distance_minimale);
/* Perturbation de l'extremite 'i' de la distance minimale... */
EGAL(ELEMENT_DU_FICHIER_LISTE_X(index_j_de_la_distance_minimale)
,ADD2(ELEMENT_DU_FICHIER_LISTE_X(index_j_de_la_distance_minimale)
,delta_X
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index_j_de_la_distance_minimale)
,ADD2(ELEMENT_DU_FICHIER_LISTE_Y(index_j_de_la_distance_minimale)
,delta_Y
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index_j_de_la_distance_minimale)
,ADD2(ELEMENT_DU_FICHIER_LISTE_Z(index_j_de_la_distance_minimale)
,delta_Z
)
);
NORMALISATION_D_UN_POINT(index_j_de_la_distance_minimale);
/* Perturbation de l'extremite 'j' de la distance minimale... */
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(perturber_la_distance_maximale))
Bblock
DEFV(Float,INIT(delta_X
,MUL2(ponderation_courante_de_la_distance_maximale
,SOUS(ELEMENT_DU_FICHIER_LISTE_X(index_j_de_la_distance_maximale)
,ELEMENT_DU_FICHIER_LISTE_X(index_i_de_la_distance_maximale)
)
)
)
);
DEFV(Float,INIT(delta_Y
,MUL2(ponderation_courante_de_la_distance_maximale
,SOUS(ELEMENT_DU_FICHIER_LISTE_Y(index_j_de_la_distance_maximale)
,ELEMENT_DU_FICHIER_LISTE_Y(index_i_de_la_distance_maximale)
)
)
)
);
DEFV(Float,INIT(delta_Z
,MUL2(ponderation_courante_de_la_distance_maximale
,SOUS(ELEMENT_DU_FICHIER_LISTE_Z(index_j_de_la_distance_maximale)
,ELEMENT_DU_FICHIER_LISTE_Z(index_i_de_la_distance_maximale)
)
)
)
);
/* Generation de la perturbation {dX,dY,dZ} de la distance maximale... */
EGAL(ELEMENT_DU_FICHIER_LISTE_X(index_i_de_la_distance_maximale)
,SOUS(ELEMENT_DU_FICHIER_LISTE_X(index_i_de_la_distance_maximale)
,delta_X
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index_i_de_la_distance_maximale)
,SOUS(ELEMENT_DU_FICHIER_LISTE_Y(index_i_de_la_distance_maximale)
,delta_Y
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index_i_de_la_distance_maximale)
,SOUS(ELEMENT_DU_FICHIER_LISTE_Z(index_i_de_la_distance_maximale)
,delta_Z
)
);
NORMALISATION_D_UN_POINT(index_i_de_la_distance_maximale);
/* Perturbation de l'extremite 'i' de la distance maximale... */
EGAL(ELEMENT_DU_FICHIER_LISTE_X(index_j_de_la_distance_maximale)
,ADD2(ELEMENT_DU_FICHIER_LISTE_X(index_j_de_la_distance_maximale)
,delta_X
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Y(index_j_de_la_distance_maximale)
,ADD2(ELEMENT_DU_FICHIER_LISTE_Y(index_j_de_la_distance_maximale)
,delta_Y
)
);
EGAL(ELEMENT_DU_FICHIER_LISTE_Z(index_j_de_la_distance_maximale)
,ADD2(ELEMENT_DU_FICHIER_LISTE_Z(index_j_de_la_distance_maximale)
,delta_Z
)
);
NORMALISATION_D_UN_POINT(index_j_de_la_distance_maximale);
/* Perturbation de l'extremite 'j' de la distance maximale... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EKom
EDITION_DE_LA_MATRICE_DES_DISTANCES;
/* Edition eventuelle introduite le 20080227180930... */
EDITION_DE_LA_MATRICE_DES_VOISINS;
/* Edition eventuelle introduite le 20080227180930... */
DoIn(index
,PREMIER_ELEMENT_D_UN_FICHIER
,DERNIER_ELEMENT_D_UN_FICHIER
,I
)
Bblock
Test(IL_FAUT(utiliser_les_coordonnees_cartesiennes_en_sortie))
Bblock
CAL2(Prin0(" X="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_X(index));
CAL2(Prin0(" Y="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_Y(index));
CAL2(Prin0(" Z="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_Z(index));
/* Edition du triplet {X,Y,Z}. */
Eblock
ATes
Bblock
CAL2(Prin0(" rho="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_RHO_(index));
CAL2(Prin0(" phi="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_PHI_(index));
CAL2(Prin0(" theta="));
EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(ELEMENT_DU_FICHIER_LISTE_THETA(index));
/* Edition du triplet {rho,phi,theta}. */
Eblock
ETes
CAL2(Prin0("\n"));
/* ATTENTION : on notera bien l'espace qui est mis en bout de ligne (de meme celui qui */
/* a ete mis en debut de ligne precedemment, devant le "X=" par exemple) ; ceci est destine */
/* a faciliter la recuperation et la manipulation du fichier ainsi produit (par exemple, */
/* 'v $xiirs/.PSPH.21.1.$U Xx')... */
Eblock
EDoI
FdTb2(matrice_des_voisins
,nombre_maximal_d_elements_dans_le_fichier,nombre_maximal_d_elements_dans_le_fichier
,Int
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Matrice des voisins de chaque point (introduite le 20080227101546). L'element {i,j} */
/* donne le j-ieme voisin du point d'index 'i'. */
FdTb2(matrice_des_distances
,nombre_maximal_d_elements_dans_le_fichier,nombre_maximal_d_elements_dans_le_fichier
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Liberation de la matrice des distances des points deux a deux (introduite le */
/* 20080226090233...). */
lGENERATION_D_UN_FICHIER(liste_initiale_des_Z,Z_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_Y,Y_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_X,X_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_THETA,THETA_IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_PHI_,PHI__IMPLICITE);
lGENERATION_D_UN_FICHIER(liste_initiale_des_RHO_,RHO__IMPLICITE);
RETU_Commande;
Eblock
ECommande