Ë
    7^(hR   ã                   óÐ   — d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ dgZeddd	œfed
diffZeeee	fZdd„Zefd„Zdd„Zeeddfd„Zd„ ddfd„ZdZdddœZed„ ddefd„Zy)é    )ÚBasic)ÚExpr)ÚSymbol)ÚIntegerÚRationalÚFloat)ÚsreprÚdotprintÚblueÚellipse)ÚcolorÚshaper   Úblackc                 ó  — d}t        | t        «      st        | «      }ng| j                  st	        | «      }nO| j                  }t        t        t        |«      «      }t        | «      j                  ›ddj                  |«      ›d�}|r||f}|S )aN  A string that follows ```obj = type(obj)(*obj.args)``` exactly.

    Parameters
    ==========

    with_args : boolean, optional
        If ``True``, there will be a second argument for the return
        value, which is a tuple containing ``purestr`` applied to each
        of the subnodes.

        If ``False``, there will not be a second argument for the
        return.

        Default is ``False``

    Examples
    ========

    >>> from sympy import Float, Symbol, MatrixSymbol
    >>> from sympy import Integer # noqa: F401
    >>> from sympy.core.symbol import Str # noqa: F401
    >>> from sympy.printing.dot import purestr

    Applying ``purestr`` for basic symbolic object:
    >>> code = purestr(Symbol('x'))
    >>> code
    "Symbol('x')"
    >>> eval(code) == Symbol('x')
    True

    For basic numeric object:
    >>> purestr(Float(2))
    "Float('2.0', precision=53)"

    For matrix symbol:
    >>> code = purestr(MatrixSymbol('x', 2, 2))
    >>> code
    "MatrixSymbol(Str('x'), Integer(2), Integer(2))"
    >>> eval(code) == MatrixSymbol('x', 2, 2)
    True

    With ``with_args=True``:
    >>> purestr(Float(2), with_args=True)
    ("Float('2.0', precision=53)", ())
    >>> purestr(MatrixSymbol('x', 2, 2), with_args=True)
    ("MatrixSymbol(Str('x'), Integer(2), Integer(2))",
     ("Str('x')", 'Integer(2)', 'Integer(2)'))
    © ú(ú, ú))Ú
isinstancer   ÚstrÚargsr	   ÚtupleÚmapÚpurestrÚtypeÚ__name__Újoin)ÚxÚ	with_argsÚsargsÚrvr   s        úP/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/printing/dot.pyr   r      su   € ðb €EÜ�aœÔÜ�‹V‰Ø�VŠVÜ�1‹X‰à�v‰vˆÜ”cœ' 4Ó(Ó)ˆÜ˜A“w×'Ó'¨¯©°5Õ)9Ð:ˆÙØ�ˆYˆØ€Ió    c                 óZ   — i }|D ]#  \  }}t        | |«      sŒ|j                  |«       Œ% |S )aÚ   Merge style dictionaries in order

    Examples
    ========

    >>> from sympy import Symbol, Basic, Expr, S
    >>> from sympy.printing.dot import styleof
    >>> styles = [(Basic, {'color': 'blue', 'shape': 'ellipse'}),
    ...           (Expr,  {'color': 'black'})]

    >>> styleof(Basic(S(1)), styles)
    {'color': 'blue', 'shape': 'ellipse'}

    >>> x = Symbol('x')
    >>> styleof(x + 1, styles)  # this is an Expr
    {'color': 'black', 'shape': 'ellipse'}
    )r   Úupdate)ÚexprÚstylesÚstyleÚtypÚstys        r"   Ústyleofr+   N   s9   € ð$ €EØò ‰ˆˆSÜ�d˜CÕ Ø�L‰L˜Õðð €Lr#   c                 ó`   — |j                  d„ t        | j                  «       «      D «       «      S )zÙ Print a dictionary of attributes

    Examples
    ========

    >>> from sympy.printing.dot import attrprint
    >>> print(attrprint({'color': 'blue', 'shape': 'ellipse'}))
    "color"="blue", "shape"="ellipse"
    c              3   ó&   K  — | ]	  }d |z  –— Œ y­w)z	"%s"="%s"Nr   )Ú.0Úitems     r"   ú	<genexpr>zattrprint.<locals>.<genexpr>q   s   è ø€ ÒI¨t˜+ dÕ*ÑIùs   ‚)r   ÚsortedÚitems)ÚdÚ	delimiters     r"   Ú	attrprintr5   g   s$   € ð �>‰>ÑI´v¸a¿g¹g»iÓ7HÔIÓIÐIr#   r   Tc                 ó  — t        | |«      }t        | t        «      r,| j                  s t	        | j
                  j                  «      }n || «      }||d<   t        | «      }|r|dt	        |«      z  z  }d|›dt        |«      ›d�S )zé String defining a node

    Examples
    ========

    >>> from sympy.printing.dot import dotnode
    >>> from sympy.abc import x
    >>> print(dotnode(x))
    "Symbol('x')_()" ["color"="black", "label"="x", "shape"="ellipse"];
    Úlabelú_%sú"z" [z];)	r+   r   r   Úis_Atomr   Ú	__class__r   r   r5   )r&   r'   Ú	labelfuncÚposÚrepeatr(   r7   Úexpr_strs           r"   Údotnoder@   t   sv   € ô �D˜&Ó!€Eä�$œÔ t§|¢|Ü�D—N‘N×+Ñ+Ó,‰á˜$“ˆØ€Eˆ'�NÜ�t‹}€HÙØ�EœC ›HÑ$Ñ$ˆøÚ#¤Y¨uÕ%5Ð6Ð6r#   c                 ó$   — t        | t        «       S ©N©r   r   ©r   s    r"   ú<lambda>rE   Œ   s   € ¤j°´EÓ&:Ð":€ r#   c           
      óþ   —  || «      rg S t        | d¬«      \  }}|r@|dt        |«      z  z  }t        |«      D ��cg c]  \  }}|›dt        ||fz   «      ›�‘Œ }}}|D �cg c]  }d|›d|›d�‘Œ c}S c c}}w c c}w )a�   List of strings for all expr->expr.arg pairs

    See the docstring of dotprint for explanations of the options.

    Examples
    ========

    >>> from sympy.printing.dot import dotedges
    >>> from sympy.abc import x
    >>> for e in dotedges(x+2):
    ...     print(e)
    "Add(Integer(2), Symbol('x'))_()" -> "Integer(2)_(0,)";
    "Add(Integer(2), Symbol('x'))_()" -> "Symbol('x')_(1,)";
    T)r   r8   Ú_r9   z" -> "z";)r   r   Ú	enumerate)r&   Úatomr=   r>   r?   Úarg_strsÚiÚas           r"   ÚdotedgesrM   Œ   sŠ   € ñ ˆD„zØˆ	ä$ T°TÔ:Ñˆ�(ÙØ˜¤ C£Ñ(Ñ(ˆHä% hÓ/÷1Ù�A�qò $%¤c¨#°°©*¤oÒ6ð 1ˆHñ 1à9AÖB±A¢8ªQÒ/ÒBÐBùó1ùâBs   ¼A4Á!A:z|digraph{

# Graph style
%(graphstyle)s

#########
# Nodes #
#########

%(nodes)s

#########
# Edges #
#########

%(edges)s
}ÚTDÚout)ÚrankdirÚorderingc                 ó$   — t        | t        «       S rB   rC   rD   s    r"   rE   rE   »   s   € ¬j¸¼EÓ.BÐ*B€ r#   Nc           	      óü   ‡‡‡‡‡‡‡	‡
— t         j                  «       }|j                  |«       g Š	g Šdˆˆˆˆˆ	ˆˆˆ
fd„	Š
 ‰
| d«       t        t	        |d¬«      dj                  ‰	«      dj                  ‰«      dœz  S )a°	  DOT description of a SymPy expression tree

    Parameters
    ==========

    styles : list of lists composed of (Class, mapping), optional
        Styles for different classes.

        The default is

        .. code-block:: python

            (
                (Basic, {'color': 'blue', 'shape': 'ellipse'}),
                (Expr,  {'color': 'black'})
            )

    atom : function, optional
        Function used to determine if an arg is an atom.

        A good choice is ``lambda x: not x.args``.

        The default is ``lambda x: not isinstance(x, Basic)``.

    maxdepth : integer, optional
        The maximum depth.

        The default is ``None``, meaning no limit.

    repeat : boolean, optional
        Whether to use different nodes for common subexpressions.

        The default is ``True``.

        For example, for ``x + x*y`` with ``repeat=True``, it will have
        two nodes for ``x``; with ``repeat=False``, it will have one
        node.

        .. warning::
            Even if a node appears twice in the same object like ``x`` in
            ``Pow(x, x)``, it will still only appear once.
            Hence, with ``repeat=False``, the number of arrows out of an
            object might not equal the number of args it has.

    labelfunc : function, optional
        A function to create a label for a given leaf node.

        The default is ``str``.

        Another good option is ``srepr``.

        For example with ``str``, the leaf nodes of ``x + 1`` are labeled,
        ``x`` and ``1``.  With ``srepr``, they are labeled ``Symbol('x')``
        and ``Integer(1)``.

    **kwargs : optional
        Additional keyword arguments are included as styles for the graph.

    Examples
    ========

    >>> from sympy import dotprint
    >>> from sympy.abc import x
    >>> print(dotprint(x+2)) # doctest: +NORMALIZE_WHITESPACE
    digraph{
    <BLANKLINE>
    # Graph style
    "ordering"="out"
    "rankdir"="TD"
    <BLANKLINE>
    #########
    # Nodes #
    #########
    <BLANKLINE>
    "Add(Integer(2), Symbol('x'))_()" ["color"="black", "label"="Add", "shape"="ellipse"];
    "Integer(2)_(0,)" ["color"="black", "label"="2", "shape"="ellipse"];
    "Symbol('x')_(1,)" ["color"="black", "label"="x", "shape"="ellipse"];
    <BLANKLINE>
    #########
    # Edges #
    #########
    <BLANKLINE>
    "Add(Integer(2), Symbol('x'))_()" -> "Integer(2)_(0,)";
    "Add(Integer(2), Symbol('x'))_()" -> "Symbol('x')_(1,)";
    }

    c           
      ó  •— ‰	j                  t        | ‰‰|‰
¬«      «       ‰r|‰k\  ry ‰j                  t        | ‰|‰
¬«      «       t	        | j
                  «      D ��cg c]  \  }} ‰|«      rŒ ‰||dz   ||fz   «      ‘Œ! c}} y c c}}w )N)r<   r=   r>   )rI   r=   r>   é   )Úappendr@   ÚextendrM   rH   r   )ÚeÚdepthr=   rK   ÚargrI   Úedgesr<   ÚmaxdepthÚnodesr>   r'   Útraverses        €€€€€€€€r"   r^   zdotprint.<locals>.traverse  sz   ø€ Ø�‰”W˜Q °)ÀÈVÔTÔUÙ˜ Ò)ØØ�‰”X˜a d°¸FÔCÔDÜ:CÀAÇFÁFÓ:K×]±°°3ÑSWÐX[ÕS\‰�#�u˜Q‘w  q d¡
Õ	+Õ]ùÓ]s   ÁBÁ0Br   ú
)r4   )Ú
graphstyler]   r[   )r   )Ú_graphstyleÚcopyr%   Útemplater5   r   )r&   r'   rI   r\   r>   r<   Úkwargsr`   r[   r]   r^   s    `````  @@@r"   r
   r
   º   sw   ÿ€ ôz ×!Ñ!Ó#€JØ×Ñ�fÔà€EØ€E÷^ô ^ñ ˆT�1Ôä¤9¨ZÀ4Ô#HØ"Ÿi™i¨Ó.Ø"Ÿi™i¨Ó.ñ0ñ 0ð 0r#   )F)r   )Úsympy.core.basicr   Úsympy.core.exprr   Úsympy.core.symbolr   Úsympy.core.numbersr   r   r   Úsympy.printing.reprr	   Ú__all__Údefault_stylesÚslotClassesr   r+   r5   r   r@   rM   rc   ra   r
   r   r#   r"   ú<module>rm      s±   ðÝ "Ý  Ý $ß 7Ñ 7Ý %àˆ,€ð �f yÑ1Ð2Ø	ˆW�gÐÐð€ð
 �w ¨%Ð0€ó<ð~ (ó ó2
Jð (°3¸BÀtó 7ñ0 ;ÀÈ4ó Cð4ð 	ð& ¨EÑ2€ð Ñ BØ˜$¨#ôl0r#   