
    EdR                          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dS )    )Basic)Expr)Symbol)IntegerRationalFloat)sreprdotprintblueellipse)colorshaper   blackFc                 :   d}t          | t                    st          |           }nm| j        st	          |           }nV| j        }t          t          t          |                    }t          |           j	        dd
                    |          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        2lib/python3.11/site-packages/sympy/printing/dot.pyr   r      s    b Ea ;VVV ;1XXvc'4(())Aww'''5)9)9)9)9: YI    c                 d    i }|D ]*\  }}t          | |          r|                    |           +|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   sF    $ E  SdC   	LLLr#   r   c                 ~    |                     d t          |                                           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  V  
dS )z	"%s"="%s"Nr   ).0items     r"   	<genexpr>zattrprint.<locals>.<genexpr>q   s'      IIt+d*IIIIIIr#   )r   sorteditems)d	delimiters     r"   	attrprintr5   g   s5     >>IIvaggii7H7HIII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   s     D&!!E$  t|  DN+,,	$E'Nt}}H %ECHH$$#88Yu%5%5%5%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          \  }|r0dt                    z  z  fdt          |          D             }fd|D             S )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   c                 F    g | ]\  }}|d t          |fz             S )_)r   )r.   iar=   s      r"   
<listcomp>zdotedges.<locals>.<listcomp>   sD     1 1 1Aq $%11c#*ooo6 1 1 1r#   c                 "    g | ]}d d|dS )r9   z" -> "z";r   )r.   rJ   r?   s     r"   rK   zdotedges.<locals>.<listcomp>   s(    BBBAA888QQQ/BBBr#   )r   r   	enumerate)r&   atomr=   r>   arg_strsr?   s     `  @r"   dotedgesrP      s     tDzz C	$TT:::( 	1C((H1 1 1 1%h//1 1 1HBBBBBBBBr#   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*B r#   Nc           	      .  	
 t                                           }|                    |           g 	g d	
fd	
 
| d           t          t	          |d          d                    	          d                              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,)";
    }

    r   c           	                               t          | 	                     rk    rd S                     t          |                      
fdt	          | j                  D              d S )N)r<   r=   r>   )rN   r=   r>   c                 T    g | ]$\  }} |           |d z   |fz             %S )   r   )r.   rI   argrN   depthr=   traverses      r"   rK   z.dotprint.<locals>.traverse.<locals>.<listcomp>!  sG    ]]]3SWSWX[S\S\]#uQwqd
	+	+]]]r#   )appendr@   extendrP   rM   r   )er[   r=   rN   edgesr<   maxdepthnodesr>   r'   r\   s    ``r"   r\   zdotprint.<locals>.traverse  s    WQ)VTTTUUU 	) 	FXadFCCCDDD]]]]]]])AF:K:K]]]]]]r#   r   
)r4   )
graphstylerb   r`   )r   )_graphstylecopyr%   templater5   r   )r&   r'   rN   ra   r>   r<   kwargsrd   r`   rb   r\   s    `````  @@@r"   r
   r
      s    z !!##JfEE^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ HT19Z4#H#H#H"ii.."ii..0 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@   rP   rg   re   r
   r   r#   r"   <module>rq      s   " " " " " "             $ $ $ $ $ $ 7 7 7 7 7 7 7 7 7 7 % % % % % %, fy112	Wg
 w%0< < < <~ (    2
J 
J 
J 
J (3Bt 7 7 7 70 ;:4 C C C C4 	& E22  B B$#l0 l0 l0 l0 l0 l0r#   