K iR ddlmZddlmZddlmZddlmZmZm Z ddl m Z dgZ eddd fed d iffZ eeee fZdd Ze fd ZddZe eddfdZdddfdZdZdddZe dddefdZy))Basic)Expr)Symbol)IntegerRationalFloat)sreprdotprintblueellipse)colorshaper blackcd}t|ts t|}ng|js t |}nO|j}t t t|}t|jddj|d}|r||f}|S)aNA 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)')) (, )) isinstancerstrargsr tuplemappurestrtype__name__join)x with_argssargsrvrs X/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/printing/dot.pyrrsub E a  V VV 1Xvvc'4()Aw''5)9 : Y IcZi}|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'} )rupdate)exprstylesstyletypstys r"styleofr+Ns9$ ES dC LL  Lr#c`|jdt|jDS)z Print a dictionary of attributes Examples ======== >>> from sympy.printing.dot import attrprint >>> print(attrprint({'color': 'blue', 'shape': 'ellipse'})) "color"="blue", "shape"="ellipse" c3&K|] }d|z yw)z "%s"="%s"Nr).0items r" zattrprint..qsIt+d*Is)rsorteditems)d delimiters r" attrprintr5gs$ >>Ivaggi7HI IIr#rTc t||}t|tr,|js t |j j }n||}||d<t|}|r|dt |zz }d|dt|dS)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+rris_Atomr __class__rrr5)r&r' labelfuncposrepeatr(r7expr_strs r"dotnoder@tsv D& !E$t||DNN++,$E'Nt}H ECH$$#Yu%5 66r#c$t|t SNrrrs r"rEsjE&:":r#c ||rgSt|d\}}|r@|dt|zz }t|Dcgc]\}}|dt||fz}}}|Dcgc] }d|d|d c}Scc}}wcc}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)rr8_r9z" -> "z";)rr enumerate)r&atomr=r>r?arg_strsias r"dotedgesrMs Dz $TT:(  C( (H%h/1Aq$%c#*o61H19ABA8Q/BB1Bs A4!A:z|digraph{ # Graph style %(graphstyle)s ######### # Nodes # ######### %(nodes)s ######### # Edges # ######### %(edges)s }TDout)rankdirorderingc$t|t SrBrCrDs r"rErEsjE.B*Br#Nc  tj}|j|g gd  fd  |dtt |ddj dj dzS)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{ # Graph style "ordering"="out" "rankdir"="TD" ######### # Nodes # ######### "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"]; ######### # Edges # ######### "Add(Integer(2), Symbol('x'))_()" -> "Integer(2)_(0,)"; "Add(Integer(2), Symbol('x'))_()" -> "Symbol('x')_(1,)"; } c  jt| | r|k\ryjt|| t |j Dcgc]\}}|r ||dz||fz!c}}ycc}}w)N)r<r=r>)rIr=r>)appendr@extendrMrHr) edepthr=rKargrIedgesr<maxdepthnodesr>r'traverses r"r^zdotprint..traversesz WQ)VTU )  XadFCD:CAFF:K]3SWX[S\#uQwqd +]]s B0Br )r4) graphstyler]r[)r) _graphstylecopyr%templater5r) r&r'rIr\r>r<kwargsr`r[r]r^s ````` @@@r"r r swz!!#Jf E E^^  T1 9Z4#H"ii."ii.0 00r#)F)r)sympy.core.basicrsympy.core.exprrsympy.core.symbolrsympy.core.numbersrrrsympy.printing.reprr __all__default_styles slotClassesrr+r5rr@rMrcrar rr#r"rms" $77% , fy 12 Wg  w%0 <~(2 J(3Bt70;4C4 &E2   B $#l0r#