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