/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        Q U A D R A N G U L A T I O N   D ' U N   A R B R E                                                                        */
/*        G R A C E   A   L A   B I J E C T I O N   D E   S C H A E F F E R  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrv/QuadrangulationArbre.11$K' :                                                                               */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20150622141319).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   EDITER_LES_ARETES                                                                                                             \
                    FAUX                                                                                                                \
                                        /* Doit-on editer les aretes ('VRAI') ou uniquement les noeuds ('FAUX') ?                    */
#define   TRIER_LES_NOEUDS_DES_ARETES                                                                                                   \
                    VRAI                                                                                                                \
                                        /* Si 'IL_FAUT(editer_les_aretes)' doit-on alors trier les numeros de noeuds de facon        */ \
                                        /* croissante ('VRAI') ou les laisser tel quel ('FAUX') ? Ceci a ete introduit le            */ \
                                        /* 20150624112622...                                                                         */

#define   EDITER_LE_DERNIER_NUMERO                                                                                                      \
                    VRAI                                                                                                                \
                                        /* Doit-on editer le dernier numero ('VRAI') ou l'ignorer ('FAUX') ?                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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"
#include  xrv/ARITHMET.21.I"
#include  xrv/champs_5.41.I"

#define   NUMERO_IMPLICITE                                                                                                              \
                    FZERO
#define   ETIQUETTE_IMPLICITE                                                                                                           \
                    FZERO

gGENERATION_D_UN_FICHIER(fichier_des_numeros,liste_des_numeros);
gGENERATION_D_UN_FICHIER(fichier_des_etiquettes,liste_des_etiquettes);
                                        /* Definition en memoire des fichiers.                                                       */

#define   ELEMENT_DU_FICHIER_NUMEROS(index)                                                                                             \
                    gELEMENT_DU_FICHIER(liste_des_numeros,index)
#define   ELEMENT_DU_FICHIER_ETIQUETTES(index)                                                                                          \
                    gELEMENT_DU_FICHIER(liste_des_etiquettes,index)
                                        /* Acces a un element courant des fichiers.                                                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D ' U N E   A R E T E  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xrv/QuadrangulationArbre.11.I"
                                        /* Introduit le 20150624114117 a cause de 'v $xcc/cpp$Z 20111129084103'...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        Q U A D R A N G U L A T I O N   D ' U N   A R B R E                                                                        */
/*        G R A C E   A   L A   B I J E C T I O N   D E   S C H A E F F E R  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
#include  xrv/ARITHMET.22.I"
#include  xci/valeurs.03.I"

     DEFV(Logical,INIT(editer_les_aretes,EDITER_LES_ARETES));
                                        /* Doit-on editer les aretes ('VRAI') ou uniquement les noeuds ('FAUX') ?                    */
     DEFV(Logical,INIT(trier_les_noeuds_des_aretes,TRIER_LES_NOEUDS_DES_ARETES));
                                        /* Si 'IL_FAUT(editer_les_aretes)' doit-on alors trier les numeros de noeuds de facon        */
                                        /* croissante ('VRAI') ou les laisser tel quel ('FAUX') ? Ceci a ete introduit le            */
                                        /* 20150624112622...                                                                         */

     DEFV(Logical,INIT(editer_le_dernier_numero,EDITER_LE_DERNIER_NUMERO));
                                        /* Doit-on editer le dernier numero ('VRAI') ou l'ignorer ('FAUX') ?                         */
     /*..............................................................................................................................*/
#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;

                         PROKESF_ARGUMENT_FICHIER("numeros="
                                                 ,fichier_des_numeros
                                                 ,liste_des_numeros
                                                 ,NUMERO_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );
                         PROKESF_ARGUMENT_FICHIER("etiquettes="
                                                 ,fichier_des_etiquettes
                                                 ,liste_des_etiquettes
                                                 ,ETIQUETTE_IMPLICITE
                                                 ,lTRANSFORMAT_0d
                                                 ,iGENERATION_D_UN_FICHIER
                                                  );

                         GET_ARGUMENT_L("aretes=",editer_les_aretes);
                         GET_ARGUMENT_N("noeuds=",editer_les_aretes);

                         GET_ARGUMENT_L("trier_noeuds=""trier=",trier_les_noeuds_des_aretes);
                                        /* Argument introduit le 20150624112622...                                                   */

                         GET_ARGUMENT_L("editer_dernier_numero=""edn=""dernier=",editer_le_dernier_numero);
                         GET_ARGUMENT_N("tous_numeros=""tn=""tous=",editer_le_dernier_numero);

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3;

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_5;
                                        /* Cette procedure fut introduite le 20211005104742...                                       */
                         )
                    );

     gOPERATION_SUR_LES_FICHIERS(BLOC(
                                      DEFV(Float,INIT(etiquette_courante,ELEMENT_DU_FICHIER_ETIQUETTES(index)));
                                        /* Recuperation de l'etiquette courante...                                                   */
                                      DEFV(Logical,INIT(editer_le_numero,LUNDEF));
                                      DEFV(Float,INIT(numero_a_editer,FLOT__UNDEF));

                                      Test(IFGT(index,PREMIER_ELEMENT_D_UN_FICHIER))
                                           Bblock
                                           DEFV(Int,INIT(index_inferieur,PRED(index)));
                                           DEFV(Logical,INIT(chercher_l_etiquette_inferieure,VRAI));

                                           Tant(IL_FAUT(chercher_l_etiquette_inferieure))
                                                Bblock
                                                Test(IFGE(ELEMENT_DU_FICHIER_ETIQUETTES(index_inferieur),etiquette_courante))
                                                     Bblock
                                                     Test(IFGT(index_inferieur,PREMIER_ELEMENT_D_UN_FICHIER))
                                                          Bblock
                                                          DECR(index_inferieur,I);
                                        /* On s'eloigne un peu plus de 'index'...                                                    */
                                                          Eblock
                                                     ATes
                                                          Bblock
                                                          PRINT_ERREUR("erreur dans la liste des etiquettes");
                                                          EGAL(chercher_l_etiquette_inferieure,FAUX);
                                                          Eblock
                                                     ETes
                                                     Eblock
                                                ATes
                                                     Bblock
                                                     EGAL(chercher_l_etiquette_inferieure,FAUX);
                                        /* Ainsi, on s'arrete sur la premiere etiquette strictement inferieure a l'etiquette         */
                                        /* courante. C'est le numero associe (de meme index 'index_inferieur') que l'on editera      */
                                        /* plus loin...                                                                              */
                                        /*                                                                                           */
                                        /* On notera que d'une facon generale, l'etiquette d'un noeud donne la distance (en terme    */
                                        /* de nombre d'arcs) a la racine dite de "quadrangulation"...                                */
                                        /*                                                                                           */
                                        /* On notera qu'un noeud a en general plusieurs numeros car, en effet, lorsque l'on decrit   */
                                        /* l'arbre via son "contour exterieur", on passe plusieurs fois par les noeuds situes a des  */
                                        /* embranchements (c'est-a-dire des noeuds qui ne sont pas des feuilles...).                 */
                                        /*                                                                                           */
                                        /* Voici un exemple ('v $xiirv/.QUAD.21.1.$U LeGall') :                                      */
                                        /*                                                                                           */
                                        /*                  NUMEROS    = {0 1 2 3 4 5 6 7 8 9 10 11 12}                              */
                                        /*                  ETIQUETTES = {0 1 2 1 2 3 2 1 2 3  2  3  2}                              */
                                        /*                                                                                           */
                                        /* Les aretes du graphe obtenu par quadrangulation sont :                                    */
                                        /*                                                                                           */
                                        /*                  1   -->   0                                                              */
                                        /*                  2   -->   1                                                              */
                                        /*                  3   -->   0                                                              */
                                        /*                  4   -->   3                                                              */
                                        /*                  5   -->   4                                                              */
                                        /*                  6   -->   3                                                              */
                                        /*                  7   -->   0                                                              */
                                        /*                  8   -->   7                                                              */
                                        /*                  9   -->   8                                                              */
                                        /*                  10  -->   7                                                              */
                                        /*                  11  -->   10                                                             */
                                        /*                  12  -->   7                                                              */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Soit donc l'arbre (chaque noeud possede le numero "N" et l'etiquette "E" qui est          */
                                        /* en fait la distance -en nombre d'arcs franchis- pour aller de la racine dans la carte,    */
                                        /* soit le noeud d'etiquette E=0, a ce noeud) :                                              */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /*                                             N=7                                           */
                                        /*                                                                                           */
                                        /*                                              *                                            */
                                        /*                                             E=1                                           */
                                        /*                                            /                                              */
                                        /*                                           /                                               */
                                        /*                                          /                                                */
                                        /*                                         /                                                 */
                                        /*                                        /                                                  */
                                        /*                                       /                                                   */
                                        /*                                  N=6 * N=8           * N=10                               */
                                        /*                                       \             /                                     */
                                        /*                                     E=2\           /E=2                                   */
                                        /*                                         \         /                                       */
                                        /*                                          \       /                                        */
                                        /*                                           \     /                                         */
                                        /*                             N=3            \N=9/                                          */
                                        /*                                             \ /                                           */
                                        /*                              *           N=5 * N=11                                       */
                                        /*                               \             /                                             */
                                        /*                             E=1\           /E=3                                           */
                                        /*                                 \         /                                               */
                                        /*                                  \       /                                                */
                                        /*                                   \     /                                                 */
                                        /*                                    \N=4/                                                  */
                                        /*                                     \ /                                                   */
                                        /*                                  N=2 * N=12                                               */
                                        /*                                      |                                                    */
                                        /*                                     E=2                                                   */
                                        /*                                      |                                                    */
                                        /*                                      |                                                    */
                                        /*                                      |                                                    */
                                        /*                 N=0                  |                                                    */
                                        /*                                      |                                                    */
                                        /*                  *               N=1 * N=13                                               */
                                        /*                                                                                           */
                                        /*                 E=0                 E=1                                                   */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* La quadrangulation de cet arbre donne le graphe suivant grace a la bijection de           */
                                        /* Schaeffer ('v $xiirv/QUAD.21') :                                                          */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /*                                             N=7                                           */
                                        /*                                                                                           */
                                        /*                  + + + + + + + + + + + + + + * + + + + + + + + + + +                      */
                                        /*                                             E=1                                           */
                                        /*                  +                         /   +                   +                      */
                                        /*                                           /     +                                         */
                                        /*                  +                       /       +                 +                      */
                                        /*                                         /         +                                       */
                                        /*                  +                     /           +               +                      */
                                        /*                                       /             +                                     */
                                        /*                  +               N=6 * N=8           * N=10        +                      */
                                        /*                                     + \             /                                     */
                                        /*                  +                 +E=2\           /E=2            +                      */
                                        /*                                   +     \         /                                       */
                                        /*                  +               +       \       /                 +                      */
                                        /*                                 +         \     /                                         */
                                        /*                  +          N=3+           \N=9/                   +                      */
                                        /*                               +             \ /                                           */
                                        /*                  +           *           N=5 * N=11                +                      */
                                        /*                               \             /                                             */
                                        /*                  +          E=1\           /E=3                    +                      */
                                        /*                                 \         /                                               */
                                        /*                  +        +      \       /                         +                      */
                                        /*                                   \     /                                                 */
                                        /*                  +                 \N=4/                           +                      */
                                        /*                         +           \ /                                                   */
                                        /*                  +               N=2 * N=12  + + + + + + + + + + + +                      */
                                        /*                                      |                                                    */
                                        /*                  +    +             E=2                                                   */
                                        /*                                      |                                                    */
                                        /*                  +                   |                                                    */
                                        /*                     +                |                                                    */
                                        /*                 N=0                  |                                                    */
                                        /*                                      |                                                    */
                                        /*                  * + + + + + + + N=1 * N=13                                               */
                                        /*                                                                                           */
                                        /*                 E=0                 E=1                                                   */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Les symboles "*" representent les noeuds de l'arbre (leurs numeros sont "N" et leurs      */
                                        /* etiquettes "E"). Les symboles "\", "|" et "/" representent les branches de cet arbre      */
                                        /* (puis ils font partie du graphe obtenu par quadrangulation). Enfin, les symboles "+"      */
                                        /* representent les nouveauc arcs introduits pour completer le graphe...                     */
                                                     Eblock
                                                ETes
                                                Eblock
                                           ETan

                                           Test(IFOU(IFLT(index,DERNIER_ELEMENT_D_UN_FICHIER)
                                                    ,IFET(IFEQ(index,DERNIER_ELEMENT_D_UN_FICHIER)
                                                         ,IL_FAUT(editer_le_dernier_numero)
                                                          )
                                                     )
                                                )
                                        /* En effet, dans le cas d'une "vraie" quadrangulation, le dernier numero correspond         */
                                        /* theoriquement au premier numero (au niveau "physique"...).                                */
                                                Bblock
                                                DEFV(Float,INIT(numero2,ELEMENT_DU_FICHIER_NUMEROS(index_inferieur)));

                                                Test(IL_FAUT(editer_les_aretes))
                                                     Bblock
                                                     DEFV(Float,INIT(numero1,ELEMENT_DU_FICHIER_NUMEROS(index)));

                                                     EDITION_D_UNE_ARETE;
                                        /* Et ceci a cause de l'operateur 'OPC2' reference...                                        */
                                                     Eblock
                                                ATes
                                                     Bblock
                                                     EDITION_DANS_gOPERATION_SUR_LES_FICHIERS(numero2);
                                                     Eblock
                                                ETes

                                                CAL2(Prin0("\n"));
                                                Eblock
                                           ATes
                                                Bblock
                                                Eblock
                                           ETes
                                           Eblock
                                      ATes
                                           Bblock
                                           Eblock
                                      ETes
                                      )
                                ,FLOT__ARGUMENT_ABSENT
                                ,NE_PAS_EDITER_LA_VALEUR_RESULTANTE_DANS_gOPERATION_SUR_LES_FICHIERS
                                        /* On notera que l'edition ne peut avoir lieu ici a cause de la gestion des "K_NL" dans      */
                                        /* 'v $xrv/ARITHMET.21$I gOPERATION_SUR_LES_FICHIERS' qui provoquerait la mise des deux      */
                                        /* noeuds d'une meme arete sur deux lignes successives...                                    */
                                ,nombre_d_exemplaires_du_resultat_de_l_operation_sur_les_valeurs_courantes
                                 );
                                        /* Edition du numero...                                                                      */

     lGENERATION_D_UN_FICHIER(liste_des_etiquettes,ETIQUETTE_IMPLICITE);
     lGENERATION_D_UN_FICHIER(liste_des_numeros,NUMERO_IMPLICITE);

     RETU_Commande;
     Eblock
ECommande



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.