
    )jNe                        d dl mZmZmZ d dl Z	 d dlmZ n#  	 d dlZn#   ed          xY wY nxY wd Zd Zd Z	d Z
i i fd	Zi i fd
Zd Zi i fdZ G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"e          Z G d# d$e          Z G d% d&e          Z G d' d(e          Z G d) d*e          Z G d+ d,e          Z G d- d.e          Zi i di fd/Z d7d1Z!d8d5Z"d9d6Z#dS ):    )SXMXprint_operatorN)pydotzkTo use the functionality of casadi.tools.graph, you need to have pydot Installed. Try `easy_install pydot`.c                     d |D             }t          | |          }|                    dd                              dd          }|                    dd                              dd          }|S )Nc                 b    g | ],}|                     d d                               dd          -S )<{>})replace).0sis     R/DATA/AppData/hermes/venv/lib/python3.11/site-packages/casadi/tools/graph/graph.py
<listcomp>z*print_operator_escaped.<locals>.<listcomp>(   s6    	B	B	Bb2::c3''S11	B	B	B    r	   z\<r   z\>r
   r   )r   r   )exprstrsss      r   print_operator_escapedr   &   so    	B	BD	B	B	B$T4  !iiU##C//!iiS!!#s++!	
(r   c                 V    t          t          |           t          |                    S N)cmphashselfothers     r   hashcomparer   1   s    	T$ZZU	$	$$r   c                 B    t          |           t          |          k    S r   )r   r   s     r   equalityr    5   s    	dT%[[	  r   c                    g }t          | d          s|S t          |                                           D ]N}|                     |          }t          |j        _        t          |j        _        |	                    |           O|S )Nn_dep)
hasattrranger"   depr   	__class____cmp__r    __eq__append)r   depskds       r   getDepsr-   8   ss    	$	7		)Tk  a	aA%AK"AKKKNNNN	+r   c                     | |v r||                               |           nt          |g          || <   ||v r||                              |            d S t          | g          ||<   d S r   )addset)masterslaver%   invdeps       r   addDependencyr4   B   sq    s]]KOOEeWCK
f__
5MfMMF5MMMr   c                 d    |D ]}t          | |||           |D ]}t          |||           d S )Nr%   r3   )r4   dependencyGraph)r1   slavesr%   r3   r2   s        r   addDependenciesr9   M   s\     : :e&S&99999 5 5eEV444445 5r   c                 *    |                                  S r   )is_leaf)r   s    r   r;   r;   S   s    	
r   c                 t   t          | t                    rk|                     d          r0t          |           s t	          | t          |           ||           n[t	          | |                                 ||           n5t          | t                    r t	          | t          |           ||           ||fS )NTr6   )
isinstancer   	is_scalarr;   r9   r-   nonzerosr   )r   r%   r3   s      r   r7   r7   W   s    " <{{4 @QZZ @'!**3????a

3?????!B <AgajjsF;;;;
fr   c                   0    e Zd ZdZi i di fdZd ZddZdS )	DotArtistz#eeeeeeNc                 Z    || _         || _        || _        || _        || _        || _        d S r   )r   r%   r3   graphartistskwargs)r   r   r%   r3   rC   rD   rE   s          r   __init__zDotArtist.__init__d   s0    DFDHDKDJDLDKKKr   c                     dS )NF r   s    r   hasPortszDotArtist.hasPortsl   s    5r   c                    |!t          |                                          }|4t          |                    d                                                    }|| j        }|                                }t          |          }|Nt          t          t           t          t          |	                                                                        }d}|	                                |
                                k    r[|                    t          j        |d|                                |                                fz  d| j        d                     nd}	|	d|                                |                                fz  z  }	t          |                                          D ]m}
|	dz  }	t          |                                          D ]?}|                    |
|          }|d	k    r|	d
z  }	$|	d|| j        ||         fz  z  }	|dz  }@|	dz  }	n|	dz  }	|                    t          j        ||	d                     |                    t          j        ||                     d S )Nr   z%d x %d	rectanglefilled)labelshapecolorstyle2<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">><TR><TD COLSPAN='%d'><font color='#666666'>%s</font></TD></TR><TR>
<TD>.</TD>z#<TD PORT='f%d' BGCOLOR='%s'>%s</TD>   </TR>	</TABLE>>	plaintextrN   rO   )str__hash__r%   rC   sparsityr-   listmapr$   nnznumeladd_noder   Nodesize1size2sparsitycoldimget_nzadd_edgeEdge)r   r   iddepidrC   nzlabelsspr*   nzlabelcounterrN   ijr+   s                r   drawSparsityzDotArtist.drawSparsityo   sG   	zqzz||b}!%%((##%%&&e}je	
B1::Dc#d5??334455hNuuww		nnUZaggii		5J)JQ\cgcs  {C  D  D  D  E  E  E  EBeMQRQXQXQZQZ\]\a\a\c\cPdddeQWWYY 	 	!vqwwyy!! 	 	Aii!nn!UU<EE8Ad>NxXfOg;hhhEQNNw[ennUZ[AAABBB	NN5:eB''(((((r   )NNNN)__name__
__module____qualname__rg   rF   rJ   rs   rH   r   r   rA   rA   b   sY        +BT"      ) ) ) ) ) )r   rA   c                       e Zd Zd Zd ZdS )MXSymbolicArtistc                     dS NTrH   rI   s    r   rJ   zMXSymbolicArtist.hasPorts       4r   c                    | j         }| j        }|                                }|                                }d}|                                |                                k    r~|                                dk    rf|                    t          j        t          | j         
                                          dz   |                                d|                     d S d|z  }|d|                                |                                |                                fz  z  }t          |                                          D ]^}|dz  }t          |                                          D ]0}|                    ||          }	|	d	k    r|d
z  }$|d|	|||	fz  z  }1|dz  }_|dz  }|                    t          j        t          | j         
                                          |d                     d S )Nz#990000rW   :f0rL   rN   rO   rP   =<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" COLOR="%s">zB<TR><TD COLSPAN='%d'>%s: <font color='#666666'>%s</font></TD></TR>rT   rU   rV   zQ<TD PORT='f%d' BGCOLOR='#eeeeee'> <font color='#666666'>(%d,%d | %d)</font> </TD>rX   rY   rZ   r[   )r   rC   r^   rowra   rb   rc   r   rd   r\   r]   namerf   rh   r$   re   ri   )
r   r   rC   ro   r   colrN   rq   rr   r+   s
             r   drawzMXSymbolicArtist.draw   s   AJE	
B
&&((C
Cuuww!''))

nnUZDFOO$5$5 6 6u <16688R]dghhhiiiii NPSSeQUVU\U\U^U^_`_e_e_g_gijininipipTqqqeQWWYY  !vqwwyy!! 	s 	sAii!nn!UU<EEfjklmnopqirrrEEw[ennUZDFOO$5$5 6 6UUUUVVVVVr   Nrt   ru   rv   rJ   r   rH   r   r   rx   rx      s7          W W W W Wr   rx   c                       e Zd Zd ZdS )MXEvaluationArtistc                 $   | j         }| j        }|                                }|                                }t	          |          }|                                }t          |          D ]v\  }}|                    t          j	        t          |                                          dt          |                                          z   d|z  z   d                     wt          j        t          |                                          dd|                                z            }| j                            |           d|                                z  d	                    d
 t#          |                                          D                       z   }|                    t          j        dt          | j                                                   z   |d                     d|                                z  d	                    d t#          |                                          D                       z   }|                    t          j        t          | j                                                   |d                     d S )Nfuninput:f%dLR)rankdirmaxzFunction:
 %s)rankrN   z %d inputs: |z | c              3   $   K   | ]}d ||fz  V  dS z<f%d> %dNrH   r   rq   s     r   	<genexpr>z*MXEvaluationArtist.draw.<locals>.<genexpr>   s+      1^1^*!u2D1^1^1^1^1^1^r   Mrecordr[   z %d outputs: |c              3   $   K   | ]}d ||fz  V  dS r   rH   r   s     r   r   z*MXEvaluationArtist.draw.<locals>.<genexpr>  s+      2`2`!:13E2`2`2`2`2`2`r   )r   rC   r^   r   r-   which_function	enumeraterj   r   rk   r\   r]   Clusterr   add_subgraphn_injoinr$   rc   rd   n_out)	r   r   rC   ro   r   r*   fr+   r,   s	            r   r   zMXEvaluationArtist.draw   s   AJE	
B
&&((C 1::D	A l l!nnUZAJJLL 1 1*s1::<<?P?P2PRX[\R\2\eijjjkkkkM#ajjll++%?ORSRXRXRZRZ?Z[[[EJE"""	16688	#uzz1^1^eTUTZTZT\T\oo1^1^1^'^'^^A	NN5:j3tv/@/@+A+AAPYZZZ[[[	AGGII	%

2`2`uUVU\U\U^U^O_O_2`2`2`(`(``A	NN5:c$&//"3"34419MMMNNNNNr   Nrt   ru   rv   r   rH   r   r   r   r      s(        O O O O Or   r   c                       e Zd Zd Zd ZdS )MXConstantArtistc                     dS rz   rH   rI   s    r   rJ   zMXConstantArtist.hasPorts  r{   r   c           	      `   | j         }| j        }|                                }|                                }|                                }d}|                                |                                k    r|                                dk    rg|                    t          j	        t          | j                                                   dz   t          |d                   d|                     d S d|z  }|d|                                |                                fz  z  }d	| j        vs#|                                | j        d	         k     rt          |                                          D ]d}|d
z  }t          |                                          D ]6}	|                    ||	          }
|
dk    r|dz  }$|d|
|||	f         fz  z  }7|dz  }e|dz  }|                    t          j	        t          | j                                                   |d                     d S )Nz#009900rW   r}   r   r   rL   r~   r   rS   	max_numelrT   rU   rV   z*<TD PORT='f%d' BGCOLOR='#eeeeee'> %s </TD>rX   rY   rZ   r[   )r   rC   r^   r   to_DMra   rb   rc   r   rd   r\   r]   rf   rh   rE   r$   re   ri   )r   r   rC   ro   r   Mr   rN   rq   rr   r+   s              r   r   zMXConstantArtist.draw
  s   AJE	
B
&&((C			A
Cuuww!''))1nnUZDFOO$5$5 6 6u <3qv;;U`gjkkklllll NPSSeMQRQXQXQZQZ\]\a\a\c\cPdddeDK''17799t{;7O+O+Oqwwyy!! 	 	A
-%## O Oa		!AA"uu\!eeAQq1vJNNee
.%%[ennUZDFOO$5$5 6 6UUUUVVVVVr   Nr   rH   r   r   r   r     s7          W W W W Wr   r   c                       e Zd Zd ZdS )MXGenericArtistc                 j   | j         | j        }t                    }t          fd|D                        }|r<d}|                     |t                                                    z              nd}t          |          dk    r?t          | j         d t          t          |                    D                       }|
                    d          r|                    d          r
|d	d
         }|                    t          j        |t                                                    z   |d                     t          |          D ]t\  }}|                    t          j        t          |                                          |t                                                    z   d|z  z                        ud S t          dg          }| j                            t          j        |t                                                    z   |d                     t          |          D ]s\  }}| j                            t          j        t          |                                          |t                                                    z                        td S )Nc                 d    g | ],}|                                                                  k    -S rH   r^   )r   r,   r+   s     r   r   z(MXGenericArtist.draw.<locals>.<listcomp>*  s.    ???aqzz||QZZ\\1???r   oprm    rW   c                     g | ]}d |z  S )z
| <f%d> | rH   r   s     r   r   z(MXGenericArtist.draw.<locals>.<listcomp>5  s    (R(R(RQq(R(R(Rr   (||)   r   r[   r   .oval)r   rC   r-   allrs   r\   r]   lenr   r$   
startswithendswithrc   r   rd   r   rj   rk   )	r   rC   r%   show_spr   r   rq   nr+   s	           @r   r   zMXGenericArtist.draw%  sd   AJE
!**C????3???@@AG b
S%6%6 67777b
3xxzz !(R(R%C//(R(R(R
S
Sa	
d		 

4 0 0 
AbD'nnUZS%6%6 6QYOOOPPP3 X X#!Auz#ajjll"3"3BQZZ\\9J9J4J6TU:4UVVWWWWX X !C5
)
)a
j%*R#ajjll*;*;%;!&QQQRRR3 R R#!A
EJs1::<<'8'8c!**,,>O>O9OPPQQQQR Rr   Nr   rH   r   r   r   r   $  s(        R R R R Rr   r   c                       e Zd Zd ZdS )MXGetNonzerosArtistc           
      D   | j         }| j        }t          |          d         }|                                |                                k    o|                                dk     }|r<d}|                     ||t          |                                          z              nd}|                                }|	                                }|
                                }d}	|                                |                                k    r|                                dk    ri|                    t          j        |t          |                                          z   dz   dt          |d	                   z  d
dd                     n"d|	z  }
|
d|                                z  z  }
d| j        vs#|                                | j        d         k     rt!          |                                          D ]d}|
dz  }
t!          |                                          D ]6}|                    ||          }|dk    r|
dz  }
$|
d||||f         fz  z  }
7|
dz  }
e|
dz  }
|                    t          j        |t          |                                          z   |
d                     | j                            t          j        t          |                                          |t          |                                          z                        d S )Nr   rW   r   r   r   #333333r}   z[%s]r   rL   rM   z#eeeeff)rN   rO   rQ   	fillcolorr   z7<TR><TD COLSPAN='%d' PORT='entry'>getNonzeros</TD></TR>max_nnzrT   rU   rV   *<TD PORT='f%d' BGCOLOR='#eeeeff'> %s </TD>rX   rY   rZ   r[   )r   rC   r-   ra   rb   rs   r\   r]   r^   r   mappingrc   r   rd   rf   rE   r$   re   ri   rj   rk   )r   r   rC   r   r   r   ro   r   r   r   rN   rq   rr   r+   s                 r   r   zMXGetNonzerosArtist.drawC  s   AJE

1A %%''QWWYY&715577a<8G b
S%6%6 67777b	
B
&&((C			A
Cuuww!''))1nnUZ3qzz||#4#4 4U :#aPSf++AU\gnv  BK  L  L  L  M  M  M  M NPSSeF!''))TTe$+%%4;y3I)I)Iqwwyy!! 	 	A
-%## O Oa		!AA"uu\!eeAQq1vJNNee
.%%[ennUZ3qzz||#4#4 45{SSSTTTJ
3qzz||#4#4RAJJLL8I8I5IJJKKKKKr   Nr   rH   r   r   r   r   B  s(        $L $L $L $L $Lr   r   c                       e Zd Zd ZdS )MXSetNonzerosArtistc           
      D   | j         | j        }t                    d         }t                    d         }t          fdt                    D                        }|r<d}|                     |t                                                    z              nd}|                                }|                                }t          
                                          }d}	d}
d|
z  }|d	                                z  z  }t                                                    D ]}|d
z  }t                                                    D ]}|                                                    ||          }|dk    s|	t          |          k    s|||	         k    r3|dz  }|	t          |          dz
  k     r||	         dk    r|dk    r|	dz  }	|d|	|	fz  z  }|	dz  }	|dz  }|dz  }|                    t#          j        |t                                                    z   |d                     | j                            t#          j        t          |                                          |t                                                    z   dz                        | j                            t#          j        t          |                                          |t                                                    z                        d S )Nr   rW   c                 d    g | ],}|                                                                  k    -S rH   r   r   r,   r   s     r   r   z,MXSetNonzerosArtist.draw.<locals>.<listcomp>q  .    FFFaqzz||QZZ\\1FFFr   r   r   r   r   r   z7<TR><TD COLSPAN='%d' PORT='entry'>setNonzeros</TD></TR>rT   rU   rV   r   rX   rY   rZ   r[   :entryr   rC   r-   r   rs   r\   r]   r^   r   r_   r   rf   r$   re   ri   r   rc   r   rd   rj   rk   r   rC   entrytargetr   r   ro   r   r   Mkr   rN   rq   rr   r+   r   s                  @r   r   zMXSetNonzerosArtist.drawj  s   AJEAJJqMEQZZ]F FFFF71::FFFGGHG b
S%6%6 67777b			B
&&((CQYY[[A	
B
C LcQE	D		RRE17799 
 
VmeQWWYY  !NN##Aa((b55BQKK1"::

%Q\\aeRiiArEE2q52
=BG
G%
a%""Wnee	;E	NN5:bQZZ\\!2!22[QQQRRRJ
3u~~'7'7#8#8C

<M<M9Mh9VWWXXXJ
3v'8'8#9#9"S=N=N:NOOPPPPPr   Nr   rH   r   r   r   r   i  s(        &Q &Q &Q &Q &Qr   r   c                       e Zd Zd ZdS )MXAddNonzerosArtistc           
          | j         | j        }t                    d         }t                    d         }t          fdt                    D                        }|r<d}|                     |t                                                    z              nd}|                                }|                                }t          
                                          }d}	d}
d|
z  }|d	                                z  z  }t                                                    D ]}|d
z  }t                                                    D ]}|                    ||          }|dk    s|	t          |          k    s|||	         k    r3|dz  }|	t          |          dz
  k     r||	         dk    r|dk    r|	dz  }	p|d|	|	fz  z  }|	dz  }	|dz  }|dz  }|                    t#          j        |t                                                    z   |d                     | j                            t#          j        t          |                                          |t                                                    z   dz                        | j                            t#          j        t          |                                          |t                                                    z                        d S )Nr   rW   c                 d    g | ],}|                                                                  k    -S rH   r   r   s     r   r   z,MXAddNonzerosArtist.draw.<locals>.<listcomp>  r   r   r   r   r   r   r   z7<TR><TD COLSPAN='%d' PORT='entry'>addNonzeros</TD></TR>rT   rU   rV   r   rX   rY   rZ   r[   r   r   r   s                  @r   r   zMXAddNonzerosArtist.draw  s   AJEAJJqMEQZZ]FFFFF71::FFFGGHG b
S%6%6 67777b			B
&&((CQYY[[A	
B
C LcQE	D		RRE17799 
 
VmeQWWYY  !IIaNNb55BQKK1"::

%Q\\aeRiiArEE2q52
=BG
G%
a%""Wnee	;E	NN5:bQZZ\\!2!22[QQQRRRJ
3u~~'7'7#8#8C

<M<M9Mh9VWWXXXJ
3v'8'8#9#9"S=N=N:NOOPPPPPr   Nr   rH   r   r   r   r     s(        %Q %Q %Q %Q %Qr   r   c                       e Zd Zd ZdS )MXOperationArtistc                 <   | j         }| j        }t          |          }d}|                                r2|d                                         |                                k    rd}|                                rb|d                                         |                                k    r2|d                                         |                                k    rd}|r<d}|                     ||t          |                                          z              nd}|	                                st          | j         dd	g          }|                    d
          r|                    d          r
|dd         }|                    t          j        |t          |                                          z   |d                     t!          |          D ]t\  }}|                    t          j        t          |                                          |t          |                                          z   d|z  z                        ud S t          |ddg          }|                    d          r|                    d          r
|dd         }|                    d          r|                    d          r
|dd         }| j                            t          j        |t          |                                          z   |d                     t!          |          D ]s\  }}| j                            t          j        t          |                                          |t          |                                          z                        td S )NTr   FrW   r   r   r   	| <f0> | 	 | <f1> |r   r   r   r   r   r[   r   r   (..)()rU   r   )r   rC   r-   is_unaryr^   	is_binaryrs   r\   r]   is_commutativer   r   r   rc   r   rd   r   rj   rk   )	r   r+   rC   r%   r   r   r   rq   r   s	            r   r   zMXOperationArtist.draw  s*   AJE
!**CGzz|| A))1::<<77g{{}} Q**AJJLL88SV__=N=NPQPZPZP\P\=\=\g b
S%6%6 67777b R !k(B
C
Ca	
d		 

4 0 0 
AbD'nnUZS%6%6 6QYOOOPPP3 X X#!Auz#ajjll"3"3BQZZ\\9J9J4J6TU:4UVVWWWWX X !C:
.
.a	
d		 

4 0 0 
AbD'	
c		 qzz# 
AbD'
j%*R#ajjll*;*;%;!&QQQRRR3 R R#!A
EJs1::<<'8'8c!**,,>O>O9OPPQQQQR Rr   Nr   rH   r   r   r   r     s(        %R %R %R %R %Rr   r   c                       e Zd Zd ZdS )MXIfTestArtistc           
         | j         }| j        }t          |          }d}d}|                    t	          j        t          |                                          |d                     t          |          D ]q\  }}|	                    t	          j
        t          |                                          t          |                                          d|z  z                        rd S )NTz<f0> ? | <f1> truer   r[   r   r   rC   r-   rc   r   rd   r\   r]   r   rj   rk   )r   r+   rC   r%   r   r   rq   r   s           r   r   zMXIfTestArtist.draw  s    AJE
!**CGA	NN5:c!**,,//aiHHHIII~~ Q Q!nnUZAJJLL 1 1#ajjll2C2CFQJ2NOOPPPPQ Qr   Nr   rH   r   r   r   r     (        Q Q Q Q Qr   r   c                       e Zd Zd ZdS )MXDensificationArtistc           	         | j         }| j        }t          |          }| j                            t	          j        t          |                                          dd                     | j                            t	          j	        t          |d                                                   t          |                                                               d S )Nz
densify(.)r   r[   r   )
r   rC   r-   rc   r   rd   r\   r]   rj   rk   )r   r+   rC   r%   s       r   r   zMXDensificationArtist.draw  s    AJE
!**CJ
3qzz||#4#4<fUUUVVVJ
3s1v'8'8#9#9#ajjll:K:KLLMMMMMr   Nr   rH   r   r   r   r     (        N N N N Nr   r   c                       e Zd Zd ZdS )MXNormArtistc           	         | j         }| j        }t          |          }t          |ddg          }| j                            t          j        t          |                                          |d                     | j        	                    t          j
        t          |d                                                   t          |                                                               d S )Nr   r   r[   r   )r   rC   r-   r   rc   r   rd   r\   r]   rj   rk   )r   r+   rC   r%   r   s        r   r   zMXNormArtist.draw  s    AJE
!**Cq#s,,AJ
3qzz||#4#416JJJKKKJ
3s1v'8'8#9#9#ajjll:K:KLLMMMMMr   Nr   rH   r   r   r   r     r   r   r   c                       e Zd Zd ZdS )MXEvaluationOutputArtistc           
          | j         }|                     |t          t          |                    d                              d|                                z  z              d S )Nr   r   r   )r   rs   r\   r   r%   which_output)r   r+   s     r   r   zMXEvaluationOutputArtist.draw  sT    Aac$quuQxx..11FQ^^=M=M4MMNNNNNr   Nr   rH   r   r   r   r     s(        O O O O Or   r   c                       e Zd Zd ZdS )MXMultiplicationArtistc           
         | j         }| j        }t          |          }d}|                    t	          j        t          |                                          |d                     t          |          D ]q\  }}|	                    t	          j
        t          |                                          t          |                                          d|z  z                        rd S )Nzmul(| <f0> | , | <f1> | )r   r[   r   r   r   r+   rC   r%   r   rq   r   s          r   r   zMXMultiplicationArtist.draw  s    AJE
!**C 	$A	NN5:c!**,,//aiHHHIII~~ Q Q!nnUZAJJLL 1 1#ajjll2C2CFQJ2NOOPPPPQ Qr   Nr   rH   r   r   r   r     r   r   r   c                       e Zd Zd Zd ZdS )SXArtistc                 z   | j         }| j        }|                                }|                                }d}t	          |                                          D ]}|dz  }t	          |                                          D ]}|                    ||          }|dk    r|dz  }$|j        |         }	| 	                    |	          r|dt          |	          z  z  }\| j                            t          j        t          |	                                          dt          | j                                                   |fz                       |d||||fz  z  }|dz  }|d	z  }|                    t          j        t          | j                                                   |d
                     d S )NrR   rT   rU   rV   z<TD BGCOLOR='#eeeeee'>%s</TD>z%s:f%dzO<TD PORT='f%d' BGCOLOR='#eeeeee'> <font color='#666666'>(%d,%d|%d)</font> </TD>rX   rY   rZ   r[   )r   rC   r^   r   r$   re   rf   ri   nzshouldEmbedr\   rj   r   rk   r]   rc   rd   )
r   r   rC   ro   r   rN   rq   rr   r+   sxs
             r   r   zSXArtist.draw  s   AJE	
B
&&((C AE17799  VmeQWWYY 
q 
q!IIaNNb55

%%tAw"b!! q2SWW<<EEJ
3r{{}}+=+=h#dfooN_N_J`J`bcId>d e efffdhijklmnogpppEEWnee	;E	NN5:c$&//"3"3445{SSSTTTTTr   c                 f    t          | j        |                   dk    o|                                S )NrW   )r   r3   r;   )r   r   s     r   r   zSXArtist.shouldEmbed3  s(    t{21$55r   N)rt   ru   rv   r   r   rH   r   r   r   r     s5        U U U26 6 6 6 6r   r   c                       e Zd Zd ZdS )SXLeafArtistc                     t          | j        | j                           dk    rgt          | j        | j                           d         }t	          | j        |         d          r'| j        |                             | j                  rd S d}| j                                        rd}| j        	                    t          j        t          | j                                                  t          | j                  d|                     d S )NrW   r   r   solidboldbox)rN   rO   rQ   )r   r3   r   r_   r#   rD   r   is_constantrC   rc   r   rd   r\   r]   )r   r1   rQ   s      r   r   zSXLeafArtist.draw7  s    
4;tv1$$DK'((+f	f%m	4	4 <++DF33 	
&Ev eJ
3tv'8'8#9#9DFRW^cdddeeeeer   Nr   rH   r   r   r   r   6  s(        	f 	f 	f 	f 	fr   r   c                       e Zd Zd ZdS )SXNonLeafArtistc           
      |   | j         }| j        }t          |          }|                                sAt	          |          dk    rt          | j         ddg          }nt          | j         dg          }|                    d          r|                    d          r
|dd         }|                    t          j
        t          |                                          |d                     t          |          D ]q\  }}|                    t          j        t          |                                          t          |                                          d	|z  z                        rd S t          |d
d
g          }|                    d          r|                    d          r
|dd         }|                    d          r|                    d          r
|dd         }| j                            t          j
        t          |                                          |d                     t          |          D ]p\  }}| j                            t          j        t          |                                          t          |                                                               qd S )Nr   r   r   r   r   r   r   r[   r   r   r   r   r   r   rW   rU   r   )r   rC   r-   r   r   r   r   r   rc   r   rd   r\   r]   r   rj   rk   r   s          r   r   zSXNonLeafArtist.drawC  sb   AJE
!**C M 
S1"46;*DEE"46;-88	
d		 

4 0 0 
AbD'nnUZAJJLL 1 1	JJJKKK3 S S#!Auz#ajjll"3"3C

4E4Efqj4PQQRRRRS S !C:
.
.a	
d		 

4 0 0 
AbD'	
c		 qzz# 
AbD'
j%*S%6%6QVLLLMMM3 M M#!A
EJs1::<<'8'8QZZ\\9J9JKKLLLLM Mr   Nr   rH   r   r   r  r  B  s(        M M M M Mr   r  c                    t          | t                    rZ|                     d          r3t          |           rt	          | f||||d|S t          | f||||d|S t          | f||||d|S t          | t                    r|                                 rt          | f||||d|S | 
                                s|                                 rt          | f||||d|S |                                 rt          | f||||d|S |                                 rt!          | f||||d|S |                                 rt%          | f||||d|S |                                 rt)          | f||||d|S |                     t,          j                  rt1          | f||||d|S |                     t,          j                  rt5          | f||||d|S |                     t,          j                  rt9          | f||||d|S t;          | f||||d|S t=          dt?          tA          tB                              z            )NTr%   r3   rC   rD   zCannot create artist for %s)"r=   r   r>   r;   r   r  r   r   is_symbolicrx   r   r   r   r   r   is_callr   	is_outputr   is_normr   is_opCOP_GETNONZEROSr   OP_SETNONZEROSr   OP_ADDNONZEROSr   r   	Exceptionr\   typer   )noder%   r3   rC   rD   rE   s         r   createArtistr  a  s   R  B~~d W	 `D\SU7\\U[\\\t_6g__X^___dVs&uWVVvVVV $r B ^d^s&uW^^W]^^^			 ^T]]__ ^t_6g__X^___					 ^d^s&uW^^W]^^^	 ^`Fw``Y_```			 ^%dfs&uU\ff_efff	 	^$Z3f5ZZSYZZZ	A$	%	% ^ a#V%PWaaZ`aaa	A$	%	% ^ a#V%PWaaZ`aaa	A$	%	% ^ a#V%PWaaZ`aaaT]ceG]]V\]]]
1CQLL@
A
AAr   BTc           	      z   	 fd}t           j        |t           _        t          | i i           \  }}t          |                                                              t          |                                                    }i }t          j        dd|          }|D ]}	t          |	f||||d|||	<   |	                                D ]}
|
|

                                 t          dd                              |                                           t           _        n# t           _        w xY w|S )	zu
  Creates and returns a pydot graph structure that represents an SX.

  direction   one of "BT", "LR", "TB", "RL"
  c                     |                      d          r'	 |                                 S #   |           cY S xY wdS )NTr   )r>   element_hash)eSX__hash__backups    r   	getHashSXzdotgraph.<locals>.getHashSX  sQ    	
T		 	%!!
!	%!!!$$
$
$
$qs   , ;Gdigraph)
graph_typer   r  Nz
source.dotw)r   r]   r7   r0   keysunionr   Dotr  valuesr   openwrite	to_string)r   	directionrE   r  r%   r3   allnodesrD   rC   r  artistr  s              @r   dotgraphr'    sI   %#     {BK "!Br**KC388::$$S%7%788H GIci	BBBE d d"4cCvERYcc\bccgdmm..""  	kkmmmmc  !2!2333"BKK"BK""""	,s   DD* *D8pstempRLc                 h   t          | fd|i|}t          |d|z             r t          |d|z             |           dS d|z  } dg}t          |          D ]4}|                    d          r|                    |dd                    5| d                    |          z  } t          |           )a3  
  Make a drawing of an SX and save it.

  format can be one of:
    dot canon cmap cmapx cmapx_np dia dot fig gd gd2 gif hpgl imap imap_np
    ismap jpe jpeg jpg mif mp pcl pdf pic plain plain-ext png ps ps2 raw
    svg svgz vml vmlz vrml vtx wbmp xdot xlib

  direction   one of "BT", "LR", "TB", "RL"

  r$  write_z7Unknown format '%s'. Please pick one of the following:
dot   N )r'  r#   getattrdirr   r)   r   r  )r   formatfilenamer$  rE   glr   s           r   dotsaver6    s     q..9.v..!Qx 	GAhvox(((((BVKA	AVV  	
h		 	122OA
A,,r   c                    	 ddl m}m}m}m}m} n9#  t          d           t          | fd|i|                    d           Y dS xY wt          |d          r{|j
        j        dk    rkd	|j        t          |j                  |j        fz  }|xj        |fz  c_        t          | fd|i|                    |           t          d
|z             dS d}	t          | fd|i|                    |	            ||	          }
 |              |g dd          }|                                  ||
            |             dS )zZ
  Make a drawing of an SX and display it.

  direction   one of "BT", "LR", "TB", "RL"
  r   )imreadimshowshowfigureaxeszOcasadi.tools.graph.dotdraw: no pylab detected, will not show drawing on screen.r$  ztemp.psNr&   	PylabShowz%s%d.%szHere goes figure %s (dotdraw)z	_temp.png)r   r   rW   rW   F)frameon)pylabr8  r9  r:  r;  r<  printr'  write_psr#   r&   rt   basenamer   figure_listfigure_extension	write_pdf	write_pngset_axis_off)r   r$  rE   r8  r9  r:  r;  r<  figure_namer)  imaxs               r   dotdrawrK    s   666666666666666	
[\\\Q,,,V,,55i@@@
FFT+ 4>#:K#G#Gs43C/D/DdF[]]K'Q,,,V,,66{CCC	
)K
788888 
DQ,,,V,,66t<<<	B
FHHH	iii	'	'	'BOO
F2JJJDFFFFFs	    3A)r  )r(  r)  r*  )r*  )$casadir   r   r   r
  r   r  r   r   r    r-   r4   r9   r;   r7   rA   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r'  r6  rK  rH   r   r   <module>rM     s  0 * ) ) ) ) ) ) ) ) )    CCCLLLLC
)  B  C  C  C L  % % %! ! !   $&R 	" 	" 	" 	" ') 5 5 5 5    	 	 	 	*) *) *) *) *) *) *) *)XW W W W Wy W W W@O O O O O O O O2W W W W Wy W W W:R R R R Ri R R R<%L %L %L %L %L) %L %L %LN'Q 'Q 'Q 'Q 'Q) 'Q 'Q 'QT&Q &Q &Q &Q &Q) &Q &Q &QR&R &R &R &R &R	 &R &R &RPQ Q Q Q QY Q Q QN N N N NI N N NN N N N N9 N N NO O O O Oy O O OQ Q Q Q QY Q Q Q6 6 6 6 6y 6 6 6:
f 
f 
f 
f 
f9 
f 
f 
fM M M M Mi M M M> BT" !B !B !B !BF- - - -`   0     s    11,1