(***********************************************************************
This file was generated automatically by the Mathematica front end.
It contains Initialization cells from a Notebook file, which typically
will have the same name as this file except ending in ".nb" instead of
".m".

This file is intended to be loaded into the Mathematica kernel using
the package loading commands Get or Needs.  Doing so is equivalent to
using the Evaluate Initialization Cells menu command in the front end.

DO NOT EDIT THIS FILE.  This entire file is regenerated automatically 
each time the parent Notebook file is saved in the Mathematica front end.
Any changes you make to this file will be overwritten.
***********************************************************************)

(* :Title: HierarchicalCluster  *)

(* :Summary:	 
      M\[EAcute]todos de Clasificaci\[OAcute]n Jer\[AAcute]rquica Ascendente	*)
\


(* :Author:   Carlos L. Arce S.  
			  Escuela de Matem\[AAcute]tica.
	          Universidad de Costa Rica.   *)	          

(* :Package Version: 1.0   Nov. 1999 *)

(* :Mathematica Version: 3.0 *)

(* :References: 
	   Diday, E., Lemaire, J., Pouget, J. et Testu. (1982) 
		  \[CapitalEAcute]l\[EAcute]ments d'Analyse de Donn\[EAcute]es. Dunod, 
  Paris.  *)

(* :Keywords: Clasificaci\[OAcute]n Jer\[AAcute]rquica, Particionamiento  *)

 (* :Warnings: En las tablas de datos con variables continuas, 
  los n\[UAcute]meros
	              deben incluir punto decimal, 
  para evitar los c\[AAcute]lculos con 
		             aritm\[EAcute]tica exacta.    *)

(* :Limitation:  *)

(* :Requirements: 
      DataAnalysis`Frequencies`, DataAnalysis`Inertias`, \
DataAnalysis`Covariances`, DataAnalysis`Dissimilarity`      *) 
 

BeginPackage["DataAnalysis`HierarchicalCluster`",
    "DataAnalysis`Dissimilarity`","DataAnalysis`Covariances`",
    "DataAnalysis`Inertias`","DataAnalysis`Symbols`","Graphics`Colors`"];

HierarchicalTree::usage = 
    "HierarchicalTree[Part0,dis0,IndAg], construye el \[AAcute]rbol binario \
al aplicar el algoritmo de la clasificaci\[OAcute]n jer\[AAcute]rquica \
ascendente, a partir del arreglo triangular de disimilitudes dis0 y	\
correspondiente a la lista de individuos Part0 y utilizando la \
funci\[OAcute]n de agregaci\[OAcute]n IndAg.";

MinDistance::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree.";
MaxDistance::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree.";
MeanDistance::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree."; 
GravityCenter::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree.";
Ward::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree.";
IncreaseVariance::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree."; 
JoinInertia::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree.";
JoinVariance::usage = 
    "Criterio de agregaci\[OAcute]n para construir una jerarqu\[IAcute]a con \
HierarchicalTree.";
CutTree::usage = 
    "CutTree[A,k] lista los nodos del \[AAcute]rbol A (construido con \
ClasJer), al nivel k.";
ClusterPartition::usage = 
    "Partition[A,k] lista las clases correspondientes a los nodos del nivel \
k.";
TreePlot::usage = 
    "TreePlot[A,opciones] Grafica el \[AAcute]rbol definido por la jerarqu\
\[IAcute]a A, 
    		obtenida con ClasJer o Nivel. opciones representa ninguna,una, o m\
\[AAcute]s 
    		especificaciones de estilo para el gr\[AAcute]fico. Ver \
Opciones[PlotArbol].";
Leaf1Position::usage = 
    "Leaf1Position->{0,0} da las coordenadas del primer nodo hoja, a la \
izquierda si la orientaci\[OAcute]n del gr\[AAcute]fico es horizontal y \
arriba si es vertical.";
 LeafDistance::usage=
    "LeafDistance->d, especifica la  distancia entre hojas consecutivas. Por \
omisi\[OAcute]n d = 1, las unidades de medida var\[IAcute]an con la escala \
del gr\[AAcute]fico, las cuales dependen de n (n\[UAcute]mero de hojas del \
\[AAcute]rbol) y el valor m\[AAcute]ximo de la funci\[OAcute]n de agregaci\
\[OAcute]n.";
 LeafLabelDistance::usage=
    "LeafLabelDistance->d, especifica la  distancia entre un nodo hoja \
(terminal). y su etiqueta.";
 LeafDirection::usage=
    "LeafDirection->Vertical|Horizontal, especifica la orientaci\[OAcute]n de \
las hojas del \[AAcute]rbol, con vertical los nodos terminales se grafican \
verticalmente.	Por omisi\[OAcute]n la orientaci\[OAcute]n es Horizontal.";
Vertical::usage=
    "Vertical es un valor posible para la opci\[OAcute]n OrientacionHojas.";
Horizontal::usage=
    "Horizontal es un valor posible para la opci\[OAcute]n \
OrientacionHojas.";	
LevelCut::usage=
    "LevelCut->k, provoca que TreePlot trace el gr\[AAcute]fico del \
\[AAcute]rbol desde
    el nodo ra\[IAcute]z hasta los nodos del nivel k. En este caso, las \
etiquetas de los nodos del nivel k son las cardinalidades de estos nodos. Por \
omisi\[OAcute]n k = 0, con lo que traza el gr\[AAcute]fico completo.";
 ClustersNumber::usage=
    "ClustersNumber->r, especifica que en el gr\[AAcute]fico se distinguir\
\[AAcute]n r clases empleando diferentes colores. Estas clases corresponden a \
la partici\[OAcute]n del nivel n-r.	Por omisi\[OAcute]n	r = 0, lo que \
significa que esta opci\[OAcute]n no se aplica. ";		
ClusterStyle::usage = 
    "ClusterStyle->{Green,Back,...}, especifica una lista de colores a 
    		emplear por	ClusterColoring. Por omisi\[OAcute]n estos son {Red,Blue}.
    		Cuando ClusterColoring agota la lista de colores, repite estos en la \
misma secuencia. La especificaci\[OAcute]n de estilos para las l\[IAcute]neas \
pueden incluir, las funciones Thickness[] y similares adem\[AAcute]s de los \
colores.";
LinesStyle::usage = 
    "LinesStyle->{Thickness[a],PointSize[b],...}, especifica una lista de \
directrices gr\[AAcute]ficas que definen el estilo de las l\[IAcute]neas y \
puntos a emplear en el gr\[AAcute]fico. Similar a la opci\[OAcute]n PlotStyle \
de la primitiva Plot.";
AspectRatio::usage = 
    "AspectRatio->r|Automatic|GoldenRatio, el n\[UAcute]mero r corresponde a \
la raz\[OAcute]n entre el alto y ancho del \[AAcute]rea del gr\[AAcute]fico, \
con Automatic el programa calcula una proporci\[OAcute]n apropiada, para que \
las unidades en el eje X y eje Y sean las mismas, con GoldenRatio la proporci\
\[OAcute]n es 1/GoldenRatio (0.618034) si la orientaci\[OAcute]n de las hojas \
es horizontal y GoldenRatio (1.61803) si es vertical.	 Por omisi\[OAcute]n el \
valor es GoldenRatio.";

TreeHeight::usage = "TreeHeight[A] determina la lista alturas: puntos 
    		{{1,f(A1)},...,{k,f(Ak)},...} donde f(Ak) es el valor de la funci\
\[OAcute]n de 
    		agregacion en el k-esimo paso de la aplicaci\[OAcute]n del algoritmo de \
clasific. jerarq. ascendente. A es una jerarqu\[IAcute]a obtenida con \
HierarchicalTree.";

HeightPlot::usage = 
    "HeightPlot[A,opciones] Hace un gr\[AAcute]fica de la lista de puntos 
    		{{1,f(A1)},...,{k,f(Ak)},...} donde f(Ak) es el valor de la funci\
\[OAcute]n de 
    		agregacion en el k-esimo paso de la aplicaci\[OAcute]n del algoritmo de \
clasific. jerarq. ascendente. A es una jerarqu\[IAcute]a obtenida con \
HierarchicalTree. Opciones representa ninguna,una, o m\[AAcute]s \
especificaciones de estilo para el gr\[AAcute]fico, como en Plot.";

MaxJump::usage = "MaxJump[A] da lista {{1,f(A1)},...,{k,f(Ak)},...} donde
    		f(Ak) es mayor que f(Ai) para todo i < k.";

Disimilitud::NoConocida = 
    "Este procedimiento no conoce la funci\[OAcute]n `1`";

Begin["`Privado`"];

\!\(\(MMin[A : {{__} .. }] := 
      Module[{vmin, iv, jv}, \n\t\tvmin = Min[A]; \n\t\t{iv, jv} = 
          First[Position[A, vmin]]; \n\t\t{iv, jv + iv, vmin}];\)\n\n
  \(DelFC[m_, i_, j_] := 
      Module[{nk, MDel, DelCol, DelFil}, \n\t\tnk = 
          Length[m]; \n\t\tMDel[v_, k_, l_] := 
          Which[k > 0, 
            Delete[v, {{k}, {l}}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\ \ \t\tl > 0, 
            Delete[v, 
              l], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \tTrue, 
            v]; \n\t\tDelCol[s_, k_, l_] := 
          Table[MDel[s\[LeftDoubleBracket]t\[RightDoubleBracket], k - t, 
              l - t], {t, 1, nk}]; \n\t\tDelFil[s_, k_, l_] := 
          Which[k == nk, 
            Drop[s, \(-2\)], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\ \ l > nk, 
            Delete[s, {{k}, {l - 
                    1}}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
True, Delete[s, {{k}, {l}}]]; \n\t\tDelFil[DelCol[m, i, j], i, j]];\)\n
  \(OtroDel[m_, i0_, j0_]\  := \ 
      Module[{nk, Dc1, Dc2, mm}, \n\t\tnk\  = \ 
          Length[m] + 1; \n\t\tDc1[v_, i_]\  := \ 
          Join[Table[
              v[\([j - i]\)], {j, i + 1, 
                i0 - 1}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Table[
              v[\([j - i]\)], {j, i0 + 1, 
                j0 - 1}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Table[
              v[\([j - i]\)], {j, j0 + 1, nk}]]; \n\t\tDc2[v_, i_]\  := \ 
          Join[Table[
              v[\([j - i]\)], {j, i + 1, 
                j0 - 1}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Table[
              v[\([j - i]\)], {j, j0 + 1, nk}]]; \n\t\tmm\  = \ 
          Join[Table[
              Dc1[m[\([i]\)], i], {i, 1, 
                i0 - 1}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
Table[Dc2[m[\([i]\)], i], {i, i0 + 1, 
                j0 - 1}], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
Table[m[\([i]\)], {i, j0 + 1, nk - 1}\ ]]; \n\t\t\ If[j0\  == \ nk, 
          Drop[mm, \(-1\)], mm]\n\t\ ];\)\n\n
  \(IndAg[_Integer | _Symbol] := 0;\)\n
  \(IndAg[{a_Complex, _, _}] := \ Re[a];\)\n
  \(Card[x_] := Count[x, _Integer | _Symbol, {\(-1\)}];\)\n
  \(PasoDos[{P_, d_, nk_, k_\ }, 
        fa_] := \[IndentingNewLine]Module[{i0, j0, a, f, d1, dst, crd, 
          ClasesViejas, NuevasD}, \n\t\t\ dst[i_, j_] := 
          If[i < j, d\[LeftDoubleBracket]i, j - i\[RightDoubleBracket], 
            d\[LeftDoubleBracket]j, i - j\[RightDoubleBracket]]; \n\t\t{i0, 
            j0, a} = MMin[d]; \n\t\tf = Map[IndAg, P]; \n\t\tcrd = \ 
          Map[Card, P]; \n\t\tClasesViejas = 
          Delete[Range[nk], {{i0}, {j0}}]; \n\t\tNuevasD\  = \ 
          Map[fa[crd\[LeftDoubleBracket]i0\[RightDoubleBracket], 
                crd\[LeftDoubleBracket]j0\[RightDoubleBracket], 
                crd\[LeftDoubleBracket]#\[RightDoubleBracket], dst[i0, j0], 
                dst[i0, #], \n\t\t\t\tdst[j0, #], 
                f\[LeftDoubleBracket]i0\[RightDoubleBracket], 
                f\[LeftDoubleBracket]j0\[RightDoubleBracket], 
                f\[LeftDoubleBracket]#\[RightDoubleBracket]] &, 
            ClasesViejas]; \n\t\td1 = 
          Prepend[DelFC[d, i0, j0], NuevasD]; \n\t\t{Prepend[
            Delete[P, {{i0}, {j0}}], {a + I\ k, 
              P\[LeftDoubleBracket]i0\[RightDoubleBracket], 
              P\[LeftDoubleBracket]j0\[RightDoubleBracket]}], d1, nk - 1, 
          k + 1}];\)\n\n
  \(HierarchicalTree[P_, d_, fa_] := 
      Module[{n, Jrq, s, d1, t1, t2}, \n\t\tn\  = \ Length[P]; \n\t\td1\  = \ 
          Switch[fa, \n\t\t\t\ \ \ \ \ \ \ \ \ \ Ward | JoinInertia, 
            N[d^2/\((2  
                    n)\)], \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ IncreaseVariance | 
              JoinVariance, d^2/4, \n\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ _, 
            d]; \n\t\t{Jrq, {{s}}, t1, t2} = 
          Nest[PasoDos[#1, fa] &, {P, d1, n, 1}, n - 2]; \n\t\tPrepend[Jrq, 
          s + \ I \((n - 1)\)]];\)\n
  \(Ward[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := 
      With[{mt = 
            ma + mb + 
              mc}, \n\t\(\((ma + mc)\)\ dac + \((mb + mc)\)\ dbc - mc\ \
dab\)\/mt];\)\n
  \(MinDistance[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := \n\t
      1\/2\ \((dac + dbc - Abs[dac - dbc])\);\)\n
  \(MaxDistance[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := \n\t
      1\/2\ \((dac + dbc\  + \ Abs[dac - dbc])\);\)\n
  \ \(MeanDistance[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := 
      With[{mt = ma + mb}, \n\t\(ma\ \ dac + mb\ dbc\)\/mt];\)\n
  \(GravityCenter[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := 
      With[{mt = 
            ma + mb}, \n\t\(\((ma)\)\ dac + \((mb)\)\ dbc - ma\ \
mb\ \ dab/mt\)\/mt];\)\n
  \(JoinInertia[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := 
      With[{mt = 
            ma + mb + 
              mc}, \n\t\(\((ma + mc)\)\ dac + \((mb + mc)\)\ dbc + \((ma + \
mb)\) dab - mc\ ic - ma\ ia - \ mb\ ib\)\/mt];\)\n
  \(JoinVariance[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := 
      With[{mt = 
            ma + mb + 
              mc}, \n\t\(\((ma + mc)\)^2\ dac + \((mb + mc)\)^2\ dbc + \((ma \
+ mb)\)^2  dab - mc^2\ ic - ma^2\ ia - \ mb^2\ ib\)\/mt^2];\)\n
  \(IncreaseVariance[ma_, mb_, mc_, dab_, dac_, dbc_, ia_, ib_, ic_] := \n\t
      With[{mt = 
            ma + mb + 
              mc}, \t\(\((ma + mc)\)^2\ dac + \((mb + mc)\)^2\ dbc - mc \((ma \
+ mb)\) dab\)\/mt^2];\)\n\n
  \(CutTree[arb : {cb_Complex, _, _}, nv_]\  := \ 
      Module[{Rgl}, \n\t\ Rgl\  = \ {\ {x_Complex\ , niz_, nde_} /; \ 
                Im[x] > nv\  -> {niz, 
                nde}, \n\t\t\t{A___, {x_Complex, niz_, nde_}, B___} /; 
                Im[x] > nv\  -> {A, niz, nde, B}}; \n\ \ \ \ \ \ \ \ \ arb //. 
          Rgl];\)\n
  Leafs[Jrq_] := Cases[Jrq, _Integer | _Symbol, {\(-1\)}]; 
  ClusterPartition[A_, k_]\  := \ Map[Leafs, CutTree[A, k]];\n
  \(TreeHeight[arb_]\ \ \  := \ 
      With[{Agr = 
            Cases[arb, _Complex, {\(-1\)}]}, \n\ \ \ \ \ \ \ \ \ \ \
Map[{Im[#], Re[#]} &, Sort[Agr]]];\)\n
  \(MaxJump[arb : {_Complex, _, _}]\  := \ MaxJump[\ TreeHeight[arb]];\)\n
  \(MaxJump[agr : {{_, _} .. }]\  := \ 
      Module[{slt}, \n\tslt\  = \ Last[Transpose[agr]]; \n\t
        slt\  = \ Drop[slt, 1]\  - \ Drop[slt, \(-1\)]; \n\t\ slt\  = \ 
          Transpose[{Range[Length[slt]], slt}]; \n\t
        slt //. \(({r1___, {k_, a_}, {l_, b_}, r2___} /; b < a)\) -> {r1, {k, 
                a}, r2}\n\t];\)\[IndentingNewLine]\n
  \(HeightPlot[A_, opc___]\  := \ 
      Module[{aeje, alt, sltm, g1, 
          g2}, \n\t\taeje[{a_, b_}]\  := \ {a, 0}; \n\t\talt\  = \ 
          TreeHeight[A]; \n\t\tsltm\  = \ 
          Map[aeje, MaxJump[alt]]; \n\t\tg1\  = \ 
          ListPlot[alt, DisplayFunction -> Identity]; \n\t\tg2\  = \ 
          ListPlot[sltm, 
            DisplayFunction -> 
              Identity, \n\t\t\t\tPlotStyle -> {PointSize[0.013], 
                RGBColor[1, 0, 0]}]; \n\t\tShow[g1, g2, opc, 
          DisplayFunction -> $DisplayFunction]\n\t];\)\)

\!\(\(EstaOpcNo[opcion : _Rule | _RuleDelayed] := 
      FreeQ[{Leaf1Position, LeafDistance, LeafLabelDistance, LeafDirection, 
          ClusterStyle, ClustersNumber, LevelCut, \ AspectRatio, LinesStyle}, 
        opcion\[LeftDoubleBracket]1\[RightDoubleBracket]];\)\n
  \(Options[TreePlot] := {Leaf1Position \[Rule] {1, 0}, 
        LeafDistance \[Rule] 1, LeafLabelDistance -> 0.025, 
        LeafDirection \[Rule] Horizontal, ClustersNumber \[Rule] 0, 
        ClusterStyle \[Rule] {Red, Blue}, LevelCut \[Rule] 0, 
        AspectRatio \[Rule] GoldenRatio, 
        LinesStyle -> {AbsoluteThickness[0.5], AbsolutePointSize[1.5]}};\)\n
  \(Ifrontera[arb_, 0]\  := \ \(-1\);\)\n
  \(Ifrontera[arb_, 1]\  := \ Im[First[arb]];\)\n
  \(Ifrontera[arb_, 
        cls_Integer]\  := \ \(Sort[
          Im[Cases[arb, _Complex, {\(-1\)}]], \n\t\tGreater]\)[\([cls - 
            1]\)];\)\n
  \(TreePlot[arbol : \((_Integer | _String)\), 
        Opc : \((_Rule | _RuleDelayed)\) ... ] := \ {};\)\n
  \(TreePlot[arbol : {cbza_Complex, _, _}, 
        Opc : \((_Rule | _RuleDelayed)\) ... ] := \n\t
      Module[{agraf, x0, y0, dh, a, Orien, Stls, Sti0, AgregaEsti, cls, g, 
          rng, \n\t\t\tifrt, hnv, aPto, dsm, deh, cc, n, xini, yini, 
          StiGbl}, \n\t\tdsm\  = \ Re[cbza]; \ 
        n\  = \ Im[cbza] + 1; \n\t\tOrien = \(LeafDirection /. {Opc}\) /. 
            Options[TreePlot]; \n\t\tdeh\  = \ \(LeafLabelDistance /. {Opc}\) \
/. Options[TreePlot]; \n\t\tdh = \(LeafDistance /. {Opc}\) /. 
            Options[TreePlot]; \n\t\t{xini, 
            yini} = \(Leaf1Position /. {Opc}\) /. 
            Options[TreePlot]; \n\t\t{x0, y0} = \ 
          If[Orien\  === \ Horizontal, {xini - dh, yini}, \ {xini, 
              yini + dh}]; \n\t\tAspR\  = \ \(AspectRatio\  /. {Opc}\) /. 
            Options[TreePlot]; \[IndentingNewLine]\t\ \ If[
          AspR\  === \ 
            GoldenRatio, \[IndentingNewLine]\ \ \ \ \ \ \ \ \ \ \ \ \ \ AspR\ \
 = \ If[Orien\  === \ Horizontal, 1/GoldenRatio, 
              GoldenRatio], ]; \n\t\tcls = \(ClustersNumber /. {Opc}\) /. 
            Options[TreePlot]; \n\t\thnv = \(LevelCut /. {Opc}\) /. 
            Options[TreePlot]; \n\t\tcls = 
          If[hnv > 0, n - hnv, cls]; \n\t\tifrt\  = \ 
          Ifrontera[arbol, cls]; \n\t\tStiGbl\  = \ \(LinesStyle /. {Opc}\) /. 
            Options[TreePlot]; \n\t\tSti0 = \(ClusterStyle /. {Opc}\) /. 
            Options[TreePlot]; \n\t\tStls = Sti0; \n\t\tOpcns = 
          Select[{Opc}, EstaOpcNo]; \n\t\tcc\  = \ 
          If[Orien\  === \ Horizontal, {0, deh}, {\(-deh\), 
              0}]; \n\t\taPto = {{___, Point[{x_, y_}], __} \[Rule] {x, 
                y}, \n\t\t\t\ \ \ \ \ \ \ {___, 
                Circle[{x_, y_}, _], __} \[Rule] {x, y} + 
                cc}; \n\t\tAgregaEsti[r_] := 
          With[{res = Prepend[r, First[Stls]]}, \n\t\t\t\tStls = 
              If[Length[Stls] == 1, Sti0, 
                Rest[Stls]]; \n\t\t\t\tres]; \n\t\tagraf[
            nk : _Symbol | _Integer, StlYa_] := \ 
          Module[{rep}, \n\t\t\trep\  = \ 
              If[Orien === Horizontal, \n\t\t\t\t{Point[{x0 = x0 + dh, y0}], 
                  Text[nk, {x0, y0 - deh}, {0, 0}]}, \n\t\t\t\t{Point[{x0, 
                      y0 = y0 - dh}], 
                  Text[nk, {x0 + deh, y0}, {0, 0}]}]; \n\t\t\tIf[
              StlYa || \((cls\  == \ 0)\), rep, 
              AgregaEsti[rep]]]; \n\t\t\t\tagraf[
            Nodo : {cb_Complex, NodoIzq_, NodoDer_}, StlYa_] := 
          Module[{sarb1, sarb2, ag, ni, x1, y1, x2, y2, rgnd, 
              AgStl}, \n\t\t\t\ \ ag\  = \ 
              If[Orien\  === \ Horizontal, Re[cb] + yini, 
                Re[cb] - xini]; \n\t\t\t\tni\  = \ Im[cb]; \n\t\t\t\tAgStl = 
              Xor[ni < ifrt, StlYa]; \n\t\t\t\tIf[
              AgStl && hnv > 0, \n\t\t\t\t\tIf[
                Orien === Horizontal, \n\t\t\t\t\t\t{Circle[{x0 += dh, 
                      y0 - \ deh}, {dh/4, deh}], 
                  Text[Card[Nodo], {x0, y0 - deh}, {0, 
                      0}]}, \n\t\t\t\t\t\t{Circle[{x0 + deh, 
                      y0 = y0 - dh}, {deh, dh/4}], 
                  Text[Card[Nodo], {x0 + deh, y0}, {0, 
                      0}]}], \n\t\t\t\t\tsarb1 = 
                agraf[NodoIzq, AgStl || StlYa]; \n\t\t\t\t\tsarb2 = 
                agraf[NodoDer, AgStl || StlYa]; \n\t\t\t\t\t{x1, y1} = 
                sarb1 /. aPto; \n\t\t\t\t\t{x2, y2} = 
                sarb2 /. aPto; \n\t\t\t\t\trgnd = 
                If[Orien === 
                    Horizontal, \n\t\t\t\t\t\t\t{Point[{N[\(x1 + x2\)\/2], 
                        ag}], Line[{{x1, y1}, {x1, ag}, {x2, ag}, {x2, y2}}], 
                    sarb1, sarb2}, \n\t\t\t\t\t\t\t{Point[{\(-ag\), 
                        N[\(y1 + y2\)\/2]}], 
                    Line[{{x2, y2}, {\(-ag\), y2}, {\(-ag\), y1}, {x1, y1}}], 
                    sarb1, sarb2}]; \n\t\t\t\t\tIf[AgStl, AgregaEsti[rgnd], 
                rgnd]]]; \n\t\tg\  = \ 
          Join[StiGbl, {agraf[arbol, False]}]; \n\t\trng = 
          If[Orien === 
              Horizontal, \n\t\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ {{xini - dh, 
                x0 + dh}, {yini - \ 2.5*deh, 
                yini + dsm + 
                  deh}}, \n\t\t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ {{xini - dsm - 
                  deh, xini + 2.5*deh}, Automatic}]; \n\t\tShow @@ 
          Join[{Graphics[g, PlotRange \[Rule] rng, 
                AspectRatio \[Rule] AspR]}, Opcns]];\)\)

			End[];

		EndPackage[];