
    \hR                          S SK Jr  S SKJr  S SKJr  S SKJrJrJ	r	  S SK
Jr  S/r\SSS	.4\S
S044r\\\\	4rSS jr\4S jrSS jr\\SS4S jrS SS4S jrSrSSS.r\S SS\4S jrg)    )Basic)Expr)Symbol)IntegerRationalFloat)sreprdotprintblueellipse)colorshaper   blackc                 <   Sn[        U [        5      (       d  [        U 5      nOnU R                  (       d  [	        U 5      nOQU R                  n[        [        [        U5      5      n[        U 5      R                  < SSR                  U5      < S3nU(       a  X24nU$ )a  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        J/var/www/auris/envauris/lib/python3.13/site-packages/sympy/printing/dot.pyr   r      sv    b EaVVV1Xvvc'4()Aw''5)9:YI    c                 f    0 nU H(  u  p4[        X5      (       d  M  UR                  U5        M*     U$ )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   s3    $ Ed  LL  Lr#   c                 `    UR                  S [        U R                  5       5       5       5      $ )zPrint a dictionary of attributes

Examples
========

>>> from sympy.printing.dot import attrprint
>>> print(attrprint({'color': 'blue', 'shape': 'ellipse'}))
"color"="blue", "shape"="ellipse"
c              3   ,   #    U  H
  nS U-  v   M     g7f)z	"%s"="%s"Nr   ).0items     r"   	<genexpr>attrprint.<locals>.<genexpr>q   s     I7Ht+d*7Hs   )r   sorteditems)d	delimiters     r"   	attrprintr6   g   s$     >>Ivaggi7HIIIr#   r   Tc                 *   [        X5      n[        U [        5      (       a1  U R                  (       d   [	        U R
                  R                  5      nOU" U 5      nXeS'   [        U 5      nU(       a  US[	        U5      -  -  nSU< S[        U5      < S3$ )zString 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   r6   )r&   r'   	labelfuncposrepeatr(   r8   expr_strs           r"   dotnoderA   t   su     D!E$t||DNN++,$'Nt}HECH$$#Yu%566r#   c                 ,    [        U [        5      (       + $ Nr   r   r   s    r"   <lambda>rF      s    jE&:":r#   c           
         U" U 5      (       a  / $ [        U SS9u  pEU(       aC  US[        U5      -  -  n[        U5       VVs/ s H  u  pgU< S[        X&4-   5      < 3PM     nnnU Vs/ s H  nSU< SU< S3PM     sn$ s  snnf s  snf )ag  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   r9   _r:   z" -> "z";)r   r   	enumerate)r&   atomr>   r?   r@   arg_strsias           r"   dotedgesrN      s     Dzz	$TT:C((H%h/1/DA $%c#*o6/  19ABA8Q/BB1Bs   !B*Bz|digraph{

# Graph style
%(graphstyle)s

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

%(nodes)s

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

%(edges)s
}TDout)rankdirorderingc                 ,    [        U [        5      (       + $ rC   rD   rE   s    r"   rF   rF      s    jE.B*Br#   Nc           	         ^^^^^^^	^
 [         R                  5       nUR                  U5        / m	/ mSUUUUU	UUU
4S jjm
T
" U S5        [        [	        USS9SR                  T	5      SR                  T5      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           
      &  > T	R                  [        U TTUT
S95        T(       a  UT:  a  g TR                  [        U TUT
S95        [	        U R
                  5       VVs/ s H#  u  p4T" U5      (       a  M  T" XAS-   X#4-   5      PM%       nng s  snnf )N)r=   r>   r?   )rJ   r>   r?      )appendrA   extendrN   rI   r   )edepthr>   rL   argrJ   edgesr=   maxdepthnodesr?   r'   traverses        r"   r_   dotprint.<locals>.traverse  s}    WQ)VTU)XadFCD:CAFF:K]:KSWX[S\	+#Qwd
	+:K]]s   B6Br   
)r5   )
graphstyler^   r\   )r   )_graphstylecopyr%   templater6   r   )r&   r'   rJ   r]   r?   r=   kwargsrb   r\   r^   r_   s    `````  @@@r"   r
   r
      sw    z !!#JfEE^ ^ T19Z4#H"ii."ii.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+   r6   r   rA   rN   re   rc   r
   r   r#   r"   <module>ro      s    "   $ 7 7 %, fy12	Wg
 w%0<~ ( 2
J (3Bt 70 ;4 C4 	& E2  B$#l0r#   