#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         R E C O N S T I T U T I O N   D ' U N E   A R B O R E S C E N C E   C O M P L E T E  :                                      #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                   $xci/valeurs_Arbre.01$Z       <Arguments> [<Simplifier> [<ConserverSegments> [<Unique>]]]                         #
#                                                                                                                                     #
#                                                                                                                                     #
#         Fonction :                                                                                                                  #
#                                                                                                                                     #
#                     La fonction de ce '$Z' est d'editer                                                                             #
#                   la definition "non optimisee" d'un arbre                                                                          #
#                   (la version "optimisee" etant produite par                                                                        #
#                   'v $xci/valeurs_Arbre.01$K'). Cela signifie                                                                       #
#                   que l'on obtient ainsi une liste exhaustive                                                                       #
#                   de toutes les suites de branches menant de la                                                                     #
#                   racine aux feuilles. Cela implique evidemment                                                                     #
#                   qu'on voit alors apparaitre des redondances :                                                                     #
#                   par exemple, la racine de l'arbre apparait                                                                        #
#                   autant de fois qu'il y a de feuilles...                                                                           #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xci/valeurs_Arbre.01$Z' :                                                                                       #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, 20160209123809).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set       Arguments=($1)
set       Simplifier=$2
                                        # Parametre introduit le 20160210091210...                                                    #
set       ConserverSegments=$3
                                        # Parametre introduit le 20160210140821...                                                    #
set       Unique=$4
                                        # Parametre introduit le 20200423104105...                                                    #

setArgum  Simplifier                    $NEXIST

if        ("$ConserverSegments" == "$K_VIDE") then
          set       ConserverSegments=$EXIST
                                        # Ce parametre controle la nature de la liste des points obtenue et donc de l'usage           #
                                        # qui en pourra en etre fait avec, par exemple, 'v $xrv/particule.10$K' :                     #
                                        #                                                                                             #
                                        #                   $NEXIST   sur une ligne les points sont tous differents et sont           #
                                        #                             donc chainables les uns aux autres grace a l'option :           #
                                        #                                                                                             #
                                        #                                       isoles=FAUX chainer=VRAI                              #
                                        #                                                                                             #
                                        #                                                                                             #
                                        #                   $EXIST    sur une ligne les points sont en couples, chaque couple         #
                                        #                             definissant un segment grace aux options :                      #
                                        #                                                                                             #
                                        #                                       isoles=FAUX chainer=FAUX                              #
                                        #                                                                                             #
                                        #                                                                                             #
                                        # C'est cette derniere option qui est la plus utile car, en effet, la premiere conduit        #
                                        # necessairement a des chainages intempestfis (par exemple d'une feuille appartenant a        #
                                        # une certaine branche a la racine de la branche suivante...).                                #
else
endif

setArgum  Unique                        $NEXIST
                                        # La valeur par defaut garantit la compatibilite anterieure au 20200423104105...              #

FilSTmpB  FArBrE_PaRtIeL
                                        # Fichiers de manoeuvre...                                                                    #

set       FinDeBranche="FinDeBranche"

$xci/valeurs_Arbre.01$X                                                                                                                 \
                    marquer_extremite_branches=VRAI                                                                                     \
                    ChiffresFlot=14                                                                                                     \
                    $Arguments                                                                                                    |     \
$xcp/substitue.01$X                                                                                                                     \
                    c01="\n\($FinDeBranche\n\)"   s01="\1"                                                                              \
                                                            >> $FArBrE_PaRtIeL
                                        # Recuperation de l'arbre avec marquage des fins de branche.                                  #

$CA       $FArBrE_PaRtIeL                                                                                                         |     \
$NL                                                                                                                               |     \
$R        "$K_TAB" "$K_BLANC"                                                                                                     |     \
$SE       -e "s/^ */+/"                                                                                                                 \
                                                            >  $FArBrE_PaRtIeL.NUMEROS
                                        # Numerotage des lignes de l'arbre.                                                           #

set       LiStE_ArBoReScEnCeS=`$CA $FArBrE_PaRtIeL | $AW ' { print $1 } ' | $SE -e "s/^.*=//"`
                                        # Recuperation de la liste de toutes les arborescences sous-arborescences de l'arbre.         #

FilSTmpB  FArBrE_CoMplEt

set       CoMpTeUr=1

foreach   ArBoReScEnCe ($LiStE_ArBoReScEnCeS)
          set       LiStE_BrAnChEs=`echo "$ArBoReScEnCe" | $R "/" " "`
                                        # Recuperation de la liste de toutes les branches de la sous-arborescence courante.           #

          set       FiN_BrAnChE=`$CA $FArBrE_PaRtIeL.NUMEROS | $GRE "^+$CoMpTeUr " | $GRE " $FinDeBranche"'$'`
                                        # L'arborescence courante est-elle une fin de branche ?                                       #

          if        ("$FiN_BrAnChE" != "$K_VIDE") then
                    set       FiN_BrAnChE=" $FinDeBranche"
          else
                    set       FiN_BrAnChE="$K_VIDE"
          endif

          if        ($#LiStE_BrAnChEs > 1) then
                    set       NuMeRo=1
                    set       SoUs_ArBoReScEnCe="$K_VIDE"

                    while     ($NuMeRo <= $#LiStE_BrAnChEs)
                              set       SoUs_ArBoReScEnCe=$SoUs_ArBoReScEnCe$LiStE_BrAnChEs[$NuMeRo]/
                                        # Construction progressive en partant de la racine de toutes les sous-arborescences           #
                                        # contenues (depuis la racine) dans '$SoUs_ArBoReScEnCe'.                                     #
                              set       LiGnE=`$CA $FArBrE_PaRtIeL |$GRE "=$SoUs_ArBoReScEnCe "`
                                        # Recherche de la ligne de l'arbre contenant cette sous-arborescence.                         #

                              if        ("$LiGnE" != "$K_VIDE") then
                                        echo      $LiGnE                                                                          |     \
                                        $SE       -e 's/$'"/$FiN_BrAnChE/"                                                              \
                                                                                                    >> $FArBrE_CoMplEt
                                        # La ligne de l'arbre qui definit '$SoUs_ArBoReScEnCe' est introduite, avec ajout eventuel    #
                                        # de la marque '$FiN_BrAnChE'. Il est donc possible qu'a ce stade une ligne possede deux      #
                                        # telles marques (cela sera corrige plus tard).                                               #
                              else
                              endif

                              @         NuMeRo = $NuMeRo + 1
                    end
          else
                    set       LiGnE=`$CA $FArBrE_PaRtIeL.NUMEROS | $GRE "^+$CoMpTeUr " | $SE -e "s/^+$CoMpTeUr  *//"`

                    echo      $LiGnE                                                                                                    \
                                                                                >> $FArBrE_CoMplEt
                                        # Cas de la ligne definissant la racine de l'arbre...                                         #
          endif

          @         CoMpTeUr = $CoMpTeUr + 1
end

FilSTmpB  FArBrE_CoRrIgE

$CA       $FArBrE_CoMplEt                                                                                                         |     \
$GRE      " $FinDeBranche"'$'                                                                                                     |     \
$SE       -e "s/ $FinDeBranche"'$//'                                                                                              |     \
$UNI                                                                                                                                    \
                                                            >> $FArBrE_CoRrIgE
                                        # Traitement final qui ne conserve que les lignes possedant au moins une '$FinDeBranche',     #
                                        # les marques '$FinDeBranche' n'etant conservees que si elles sont en double. On trouvera     #
                                        # donc ainsi dans le fichier genere ici une suite de lignes du type :                         #
                                        #                                                                                             #
                                        #    Arborescence=1/     X1=+0.5 Y1=+0 Z1=+0.5 X2=+0.5 Y2=+0.5 Z2=+0.5                        #
                                        #    Arborescence=1/2/   X1=+0.5 Y1=+0.5 Z1=+0.5 X2=+0.5 Y2=+0.75 Z2=+0.5                     #
                                        #    Arborescence=1/2/3/ X1=+0.5 Y1=+0.75 Z1=+0.5 X2=+0.375 Y2=+0.75 Z2=+0.5 FinDeBranche     #
                                        #                                                                                             #
                                        # La derniere ligne de ce "paquet" se termine par '$FinDeBranche' et celles qui la precede    #
                                        # definissent toutes les sous-arborescence partant de la racine et aboutissant a celle        #
                                        # definie par la derniere ligne (marquee donc par '$FinDeBranche')...                         #

FilSTmpB  FArBrE_SiMplIfIe

if        ($Simplifier == $EXIST) then
          if        ($ConserverSegments == $EXIST) then
                    set       GeNeReR_SeGmEnTs="CONSERVER_LES_SEGMENTS"
                                        # Cette definition permet de bloquer l'elimination du deuxieme point d'une branche            #
                                        # dans la subsitition {c01,s01} ci-apres...                                                   #
          else
                    set       GeNeReR_SeGmEnTs="$K_VIDE"
          endif

          set       MaRqUeUr="@"
          set       Feuille="Feuille"
          set       Noeud="Noeud"

          $CA       $FArBrE_CoRrIgE                                                                                               |     \
          $SE       -e "s/^[^ ][^ ]*  *//"                                                                                              \
                    -e "s/ $FinDeBranche"'$'"/$MaRqUeUr/"                                                                               \
                    -e "s/\([^$MaRqUeUr]\)"'$'"/\1 $Noeud/"                                                                             \
                    -e "s/$MaRqUeUr"'$'"/ $Feuille/"                                                                                    \
                    -e "s/\([XYZRPT]\)[12]\(=\)/\1\2/g"                                                                           |     \
          $xcp/substitue.01$X                                                                                                           \
                    c01="$GeNeReR_SeGmEnTs\([XR]=[^ ][^ ]*  *[YP]=[^ ][^ ]*  *[ZT]=[^ ][^ ]*  *\)$Noeud\n"                              \
                    s01=""                                                                                                              \
                    c11=" $Feuille\n"                                                                                                   \
                    s11="\n"                                                                                                            \
                    c12=" $Noeud\n"                                                                                                     \
                    s12="\n"                                                                                                            \
                                                                      >> $FArBrE_SiMplIfIe
                                        # Cette operation met sur une seule ligne tous les noeuds menant de la racine a chaque        #
                                        # feuille de l'arbre...                                                                       #
else
          $CA       $FArBrE_CoRrIgE                                                                                                     \
                                                                      >> $FArBrE_SiMplIfIe
endif

if        ($Unique == $NEXIST) then
          $CA       $FArBrE_SiMplIfIe
                                        # Edition finale, chaque apparaissant plusieurs fois (le tronc apparait le plus, soit         #
                                        # autant que d'iterations, puis de moins en moins en s'approchant des feuilles...).           #
else
          $CA       $FArBrE_SiMplIfIe                                                                                             |     \
          $SOR      -u
                                        # Edition finale, chaque n'apparaissant qu'une seule fois (introduit le 20200423104105).      #
endif

FilSTmpE  FArBrE_SiMplIfIe
FilSTmpE  FArBrE_CoRrIgE
FilSTmpE  FArBrE_CoMplEt
FilSTmpE  FArBrE_PaRtIeL



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.