
    pjNe                     B   d dl mZmZmZ d dl Z	 d dlmZ 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 d3d0Z!d4d1Z"d5d2Z#y#  	 d dlZn#   ed      xY wY xY w)6    )SXMXprint_operatorN)pydotzkTo use the functionality of casadi.tools.graph, you need to have pydot Installed. Try `easy_install pydot`.c                    |D cg c]$  }|j                  dd      j                  dd      & }}t        | |      }|j                  dd      j                  dd      }|j                  dd      j                  dd      }|S c c}w )N<{>}z\<z\>)replacer   )exprstrssiss       E/DATA/.local/lib/python3.12/site-packages/casadi/tools/graph/graph.pyprint_operator_escapedr   &   s    <@	BDb2::c3''S1D$	BT4 !iiU##C/!iiS!!#s+!	
( 
Cs   )Bc                 >    t        t        |       t        |            S N)cmphashselfothers     r   hashcomparer   1   s    	T$ZU	$$    c                 0    t        |       t        |      k(  S r   )r   r   s     r   equalityr   5   s    	dT%[	  r   c                     g }t        | d      s|S t        | j                               D ]N  }| j                  |      }t        |j
                  _        t        |j
                  _        |j                  |       P |S )Nn_dep)
hasattrranger   depr   	__class____cmp__r   __eq__append)r   depskds       r   getDepsr*   8   sa    	$	7	Tka	aA%AKK"AKKKKN	 
 
+r   c                     | |v r||    j                  |       nt        |g      || <   ||v r||   j                  |        y t        | g      ||<   y r   )addset)masterslaver"   invdeps       r   addDependencyr1   B   sP    s]KOOEeWCK
f_
5MfMF5Mr   c                 Z    |D ]  }t        | |||        |D ]  }t        |||        y )Nr"   r0   )r1   dependencyGraph)r.   slavesr"   r0   r/   s        r   addDependenciesr6   M   s0    e&S&9 eEV4 r   c                 "    | j                         S r   )is_leaf)r   s    r   r8   r8   S   s    	
r   c                 ,   t        | t              rY| j                  d      r't        |       s9t	        | t        |       ||       ||fS t	        | | j                         ||       ||fS t        | t              rt	        | t        |       ||       ||fS )NTr3   )
isinstancer   	is_scalarr8   r6   r*   nonzerosr   )r   r"   r0   s      r   r4   r4   W   s    "{{4QZ'!*3?
 f a

3? f !BAgajsF;
fr   c                   .    e Zd ZdZi i di fdZd ZddZy)	DotArtistz#eeeeeeNc                 X    || _         || _        || _        || _        || _        || _        y r   )r   r"   r0   graphartistskwargs)r   r   r"   r0   r@   rA   rB   s          r   __init__zDotArtist.__init__d   s,    DFDHDKDJDLDKr   c                      y)NF r   s    r   hasPortszDotArtist.hasPortsl   s    r   c                 8   |t        |j                               }|(t        |j                  d      j                               }|| j                  }|j	                         }t        |      }|9t        t        t         t        t        |j                                                 }d}|j                         |j                         k(  rU|j                  t        j                  |d|j                         |j                         fz  d| j                   d             nd}	|	d|j                         |j#                         fz  z  }	t        |j                               D ]d  }
|	dz  }	t        |j                               D ]<  }|j%                  |
|      }|d	k(  r|	d
z  }	 |	d|| j                   ||   fz  z  }	|dz  }> |	dz  }	f |	dz  }	|j                  t        j                  ||	d             |j'                  t        j(                  ||             y )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rK   rL   )str__hash__r"   r@   sparsityr*   listmapr!   nnznumeladd_noder   Nodesize1size2sparsitycoldimget_nzadd_edgeEdge)r   r   iddepidr@   nzlabelsspr'   nzlabelcounterrK   ijr(   s                r   drawSparsityzDotArtist.drawSparsityo   s   	zqzz|b}!%%(##%&e}jje	
B1:Dc#d5?345hNuuw	nnUZZaggi	5J)JQ\cgcscs  {C  D  EBeMQRQXQXQZ\]\a\a\cPdddeQWWY!vqwwy!Aii!n!U<E8Ad>N>NxXfOg;hhhEQN " 	w   [ennUZZ[AB	NN5::eB'(r   )NNNN)__name__
__module____qualname__rd   rC   rG   rp   rE   r   r   r>   r>   b   s    +BT" )r   r>   c                       e Zd Zd Zd Zy)MXSymbolicArtistc                      yNTrE   rF   s    r   rG   zMXSymbolicArtist.hasPorts       r   c                    | j                   }| j                  }|j                         }|j                         }d}|j	                         |j                         k(  rn|j	                         dk(  r[|j                  t        j                  t        | j                   j                               dz   |j                         d|             y d|z  }|d|j                         |j                         |j                         fz  z  }t        |j                               D ]S  }|dz  }t        |j                               D ]+  }|j!                  ||      }	|	d	k(  r|d
z  } |d|	|||	fz  z  }- |dz  }U |dz  }|j                  t        j                  t        | j                   j                               |d             y )Nz#990000rT   :f0rI   rK   rL   rM   =<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" COLOR="%s">zB<TR><TD COLSPAN='%d'>%s: <font color='#666666'>%s</font></TD></TR>rQ   rR   rS   zQ<TD PORT='f%d' BGCOLOR='#eeeeee'> <font color='#666666'>(%d,%d | %d)</font> </TD>rU   rV   rW   rX   )r   r@   r[   rowr^   r_   r`   r   ra   rY   rZ   namerc   re   r!   rb   rf   )
r   r   r@   rl   r}   colrK   rn   ro   r(   s
             r   drawzMXSymbolicArtist.draw   sz   AJJE	
B
&&(C
Cuuw!'')
nnUZZDFFOO$5 6u <1668R]dghi NPSSeQUVU\U\U^_`_e_e_gijininipTqqqeQWWY!vqwwy!Aii!n!U<EfjklmnopqirrrE " 	w   [ennUZZDFFOO$5 6UUVr   Nrq   rr   rs   rG   r   rE   r   r   ru   ru      s    Wr   ru   c                       e Zd Zd Zy)MXEvaluationArtistc                 t   | j                   }| j                  }|j                         }|j                         }t	        |      }|j                         }t        |      D ]c  \  }}|j                  t        j                  t        |j                               dt        |j                               z   d|z  z   d             e t        j                  t        |j                               dd|j                         z        }| j                  j                  |       d|j                         z  d	j!                  d
 t#        |j                               D              z   }|j%                  t        j&                  dt        | j                   j                               z   |d             d|j)                         z  d	j!                  d t#        |j)                               D              z   }|j%                  t        j&                  t        | j                   j                               |d             y )Nfuninput:f%dLR)rankdirmaxzFunction:
 %s)rankrK   z %d inputs: |z | c              3   *   K   | ]  }d ||fz    ywz<f%d> %dNrE   .0rn   s     r   	<genexpr>z*MXEvaluationArtist.draw.<locals>.<genexpr>   s     1^o*!u2Do   MrecordrX   z %d outputs: |c              3   *   K   | ]  }d ||fz    ywr   rE   r   s     r   r   z*MXEvaluationArtist.draw.<locals>.<genexpr>  s     2`O_!:13EO_r   )r   r@   r[   r}   r*   which_function	enumeraterg   r   rh   rY   rZ   Clusterr~   add_subgraphn_injoinr!   r`   ra   n_out)	r   r   r@   rl   r}   r'   fr(   r)   s	            r   r   zMXEvaluationArtist.draw   s   AJJE	
B
&&(C 1:D	A!nnUZZAJJL 1*s1::<?P2PRX[\R\2\eijk  MM#ajjl+%?ORSRXRXRZ?Z[EJJE"	1668	#uzz1^eTUTZTZT\o1^'^^A	NN5::j3tvv/@+AAPYZ[	AGGI	%

2`uUVU\U\U^O_2`(``A	NN5::c$&&//"3419MNr   Nrq   rr   rs   r   rE   r   r   r   r      s    Or   r   c                       e Zd Zd Zd Zy)MXConstantArtistc                      yrw   rE   rF   s    r   rG   zMXConstantArtist.hasPorts  rx   r   c           	         | j                   }| j                  }|j                         }|j                         }|j	                         }d}|j                         |j                         k(  rl|j                         dk(  rY|j                  t        j                  t        | j                   j                               dz   t        |d         d|             y d|z  }|d|j                         |j                         fz  z  }d	| j                  vs |j                         | j                  d	   k  rrt        |j!                               D ]V  }|d
z  }t        |j                               D ].  }	|j#                  ||	      }
|
dk(  r|dz  } |d|
|||	f   fz  z  }0 |dz  }X |dz  }|j                  t        j                  t        | j                   j                               |d             y )Nz#009900rT   rz   r   r   rI   r{   r|   rP   	max_numelrQ   rR   rS   z*<TD PORT='f%d' BGCOLOR='#eeeeee'> %s </TD>rU   rV   rW   rX   )r   r@   r[   r}   to_DMr^   r_   r`   r   ra   rY   rZ   rc   re   rB   r!   rb   rf   )r   r   r@   rl   r}   Mr   rK   rn   ro   r(   s              r   r   zMXConstantArtist.draw
  s   AJJE	
B
&&(C		A
Cuuw!'')1nnUZZDFFOO$5 6u <3qv;U`gjkl NPSSeMQRQXQXQZ\]\a\a\cPdddeDKK'1779t{{;7O+Oqwwy!A
-%#a		!AA"u\!eAQq1vJNNe $ .% " [ennUZZDFFOO$5 6UUVr   Nr   rE   r   r   r   r     s    Wr   r   c                       e Zd Zd Zy)MXGenericArtistc                    | j                   }| j                  }t        |      }t        |D cg c]#  }|j	                         |j	                         k(  % c}       }|r0d}| j                  ||t        |j                               z          nd}t        |      dkD  rt        | j                   t        t        |            D cg c]  }d|z  	 c}      }|j                  d      r|j                  d      r|dd	 }|j                  t        j                  |t        |j                               z   |d
             t!        |      D ]a  \  }}	|j#                  t        j$                  t        |	j                               |t        |j                               z   d|z  z                c y t        |dg      }| j                  j                  t        j                  |t        |j                               z   |d             t!        |      D ]e  \  }}	| j                  j#                  t        j$                  t        |	j                               |t        |j                               z                g y c c}w c c}w )Noprj    rT   z
| <f%d> | (||)   r   rX   r   .oval)r   r@   r*   allr[   rp   rY   rZ   lenr   r!   
startswithendswithr`   r   ra   r   rg   rh   )
r   r(   r@   r"   r)   show_spr   rn   r   ns
             r   r   zMXGenericArtist.draw%  s   AJJE
!*C3?3aqzz|QZZ\13?@AGb
S%6 67b
3xz !%C/(R/Qq/(R
Sa	
d	

4 0
Ab'nnUZZS%6 6QYOP3#!Auzz#ajjl"3BQZZ\9J4J6TU:4UVW   !C5
)a
jj%**R#ajjl*;%;!&QR3#!A

EJJs1::<'8c!**,>O9OPQ  + @ )Ss   (I=J
Nr   rE   r   r   r   r   $  s    Rr   r   c                       e Zd Zd Zy)MXGetNonzerosArtistc           
      b   | j                   }| j                  }t        |      d   }|j                         |j	                         k(  xr |j                         dk(   }|r0d}| j                  ||t        |j                               z          nd}|j                         }|j                         }|j                         }d}	|j                         |j	                         k(  rj|j                         dk(  rW|j                  t        j                  |t        |j                               z   dz   dt        |d	         z  d
dd             nd|	z  }
|
d|j                         z  z  }
d| j                  vs |j                         | j                  d   k  rrt!        |j#                               D ]V  }|
dz  }
t!        |j                               D ].  }|j%                  ||      }|dk(  r|
dz  }
 |
d||||f   fz  z  }
0 |
dz  }
X |
dz  }
|j                  t        j                  |t        |j                               z   |
d             | j                  j'                  t        j(                  t        |j                               |t        |j                               z                y )Nr   rT   r   r   r   #333333rz   z[%s]r   rI   rJ   z#eeeeff)rK   rL   rN   	fillcolorr|   z7<TR><TD COLSPAN='%d' PORT='entry'>getNonzeros</TD></TR>max_nnzrQ   rR   rS   *<TD PORT='f%d' BGCOLOR='#eeeeff'> %s </TD>rU   rV   rW   rX   )r   r@   r*   r^   r_   rp   rY   rZ   r[   r}   mappingr`   r   ra   rc   rB   r!   rb   rf   rg   rh   )r   r   r@   r   r   r   rl   r}   r   r   rK   rn   ro   r(   s                 r   r   zMXGetNonzerosArtist.drawC  s;   AJJE
1A %%'QWWY&71557a<8Gb
S%6 67b	
B
&&(C			A
Cuuw!'')1nnUZZ3qzz|#4 4U :#aPSf+AU\gnv  BK  L  M NPSSeF!'')TTe$++%4;;y3I)Iqwwy!A
-%#a		!AA"u\!eAQq1vJNNe $ .% " [ennUZZ3qzz|#4 45{STJJ

3qzz|#4RAJJL8I5IJKr   Nr   rE   r   r   r   r   B  s    $Lr   r   c                       e Zd Zd Zy)MXSetNonzerosArtistc           
         | j                   }| j                  }t        |      d   }t        |      d   }t        t        |      D cg c]#  }|j	                         |j	                         k(  % c}       }|r0d}| j                  ||t        |j                               z          nd}|j	                         }|j                         }	t        |j                               }
d}d}d|z  }|d|j                         z  z  }t        |j                               D ]  }|d	z  }t        |j                               D ]x  }|j	                         j                  ||      }|d
k(  s|t        |
      k\  s||
|   k7  r,|dz  }|t        |
      dz
  k  sU|
|   d
k(  s^|d
k7  sd|dz  }j|d||fz  z  }|dz  }z |dz  } |dz  }|j!                  t#        j$                  |t        |j                               z   |d             | j                  j'                  t#        j(                  t        |j                               |t        |j                               z   dz                | j                  j'                  t#        j(                  t        |j                               |t        |j                               z                y c c}w )Nr   rT   r   r   r   r   r|   z7<TR><TD COLSPAN='%d' PORT='entry'>setNonzeros</TD></TR>rQ   rR   rS   r   rU   rV   rW   rX   :entryr   r@   r*   r   r[   rp   rY   rZ   r}   r\   r   rc   r!   rb   rf   r   r`   r   ra   rg   rh   r   r   r@   entrytargetr)   r   r   rl   r}   r   Mkr   rK   rn   ro   r(   s                    r   r   zMXSetNonzerosArtist.drawj  sW   AJJEAJqMEQZ]F 71:F:aqzz|QZZ\1:FGHGb
S%6 67b		B
&&(CQYY[A	
B
C LcQE	D	RRE1779VmeQWWY!NN##Aa(b5BQK1":

%Q\aeRiArE2q52
=BG
G%
a%"   Wne  
;E	NN5::bQZZ\!22[QRJJ

3u~~'7#8C

<M9Mh9VWXJJ

3v'8#9"S=N:NOP? Gs   (K	Nr   rE   r   r   r   r   i  s    &Qr   r   c                       e Zd Zd Zy)MXAddNonzerosArtistc           
         | j                   }| j                  }t        |      d   }t        |      d   }t        t        |      D cg c]#  }|j	                         |j	                         k(  % c}       }|r0d}| j                  ||t        |j                               z          nd}|j	                         }|j                         }	t        |j                               }
d}d}d|z  }|d|j                         z  z  }t        |j                               D ]  }|d	z  }t        |j                               D ]j  }|j                  ||      }|d
k(  s|t        |
      k\  s||
|   k7  r,|dz  }|t        |
      dz
  k  sG|
|   d
k(  sP|d
k7  sV|dz  }\|d||fz  z  }|dz  }l |dz  } |dz  }|j!                  t#        j$                  |t        |j                               z   |d             | j                  j'                  t#        j(                  t        |j                               |t        |j                               z   dz                | j                  j'                  t#        j(                  t        |j                               |t        |j                               z                y c c}w )Nr   rT   r   r   r   r   r|   z7<TR><TD COLSPAN='%d' PORT='entry'>addNonzeros</TD></TR>rQ   rR   rS   r   rU   rV   rW   rX   r   r   r   s                    r   r   zMXAddNonzerosArtist.draw  sK   AJJEAJqMEQZ]F71:F:aqzz|QZZ\1:FGHGb
S%6 67b		B
&&(CQYY[A	
B
C LcQE	D	RRE1779VmeQWWY!IIaNb5BQK1":

%Q\aeRiArE2q52
=BG
G%
a%"   Wne  
;E	NN5::bQZZ\!22[QRJJ

3u~~'7#8C

<M9Mh9VWXJJ

3v'8#9"S=N:NOP? Gs   (J;Nr   rE   r   r   r   r     s    %Qr   r   c                       e Zd Zd Zy)MXOperationArtistc                 
   | j                   }| j                  }t        |      }d}|j                         r&|d   j	                         |j	                         k(  rd}|j                         rJ|d   j	                         |j	                         k(  r&|d   j	                         |j	                         k(  rd}|r0d}| j                  ||t        |j                               z          nd}|j                         st        | j                   dd	g      }|j                  d
      r|j                  d      r|dd }|j                  t        j                  |t        |j                               z   |d             t!        |      D ]a  \  }}|j#                  t        j$                  t        |j                               |t        |j                               z   d|z  z                c y t        |ddg      }|j                  d      r|j                  d      r|dd }|j                  d      r|j                  d      r|dd }| j                  j                  t        j                  |t        |j                               z   |d             t!        |      D ]e  \  }}| j                  j#                  t        j$                  t        |j                               |t        |j                               z                g y )NTr   FrT   r   r   r   	| <f0> | 	 | <f1> |r   r   r   r   r   rX   r   r   (..)()rR   r   )r   r@   r*   is_unaryr[   	is_binaryrp   rY   rZ   is_commutativer   r   r   r`   r   ra   r   rg   rh   )	r   r(   r@   r"   r   r   r   rn   r   s	            r   r   zMXOperationArtist.draw  sD   AJJE
!*CGzz|A)1::<7g{{}Q*AJJL8SV__=NPQPZPZP\=\gb
S%6 67b !k(B
Ca	
d	

4 0
Ab'nnUZZS%6 6QYOP3#!Auzz#ajjl"3BQZZ\9J4J6TU:4UVW   !C:
.a	
d	

4 0
Ab'	
c	qzz#
Ab'
jj%**R#ajjl*;%;!&QR3#!A

EJJs1::<'8c!**,>O9OPQ  r   Nr   rE   r   r   r   r     s    %Rr   r   c                       e Zd Zd Zy)MXIfTestArtistc           
         | j                   }| j                  }t        |      }d}d}|j                  t	        j
                  t        |j                               |d             t        |      D ]^  \  }}|j                  t	        j                  t        |j                               t        |j                               d|z  z                ` y )NTz<f0> ? | <f1> truer   rX   r   r   r@   r*   r`   r   ra   rY   rZ   r   rg   rh   )r   r(   r@   r"   r   r   rn   r   s           r   r   zMXIfTestArtist.draw  s    AJJE
!*CGA	NN5::c!**,/aiHI~!nnUZZAJJL 1#ajjl2CFQJ2NOP r   Nr   rE   r   r   r   r         Qr   r   c                       e Zd Zd Zy)MXDensificationArtistc           	         | j                   }| j                  }t        |      }| j                  j                  t	        j
                  t        |j                               dd             | j                  j                  t	        j                  t        |d   j                               t        |j                                            y )Nz
densify(.)r   rX   r   )
r   r@   r*   r`   r   ra   rY   rZ   rg   rh   )r   r(   r@   r"   s       r   r   zMXDensificationArtist.draw  s    AJJE
!*CJJ

3qzz|#4<fUVJJ

3s1v'8#9#ajjl:KLMr   Nr   rE   r   r   r   r         Nr   r   c                       e Zd Zd Zy)MXNormArtistc           	         | j                   }| j                  }t        |      }t        |ddg      }| j                  j	                  t        j                  t        |j                               |d             | j                  j                  t        j                  t        |d   j                               t        |j                                            y )Nr   r   rX   r   )r   r@   r*   r   r`   r   ra   rY   rZ   rg   rh   )r   r(   r@   r"   r   s        r   r   zMXNormArtist.draw  s    AJJE
!*Cq#s,AJJ

3qzz|#416JKJJ

3s1v'8#9#ajjl:KLMr   Nr   rE   r   r   r   r     r   r   r   c                       e Zd Zd Zy)MXEvaluationOutputArtistc           
          | j                   }| j                  |t        t        |j	                  d                  d|j                         z  z          y )Nr   r   r   )r   rp   rY   r   r"   which_output)r   r(   s     r   r   zMXEvaluationOutputArtist.draw  s@    Aac$quuQx.1FQ^^=M4MMNr   Nr   rE   r   r   r   r     s    Or   r   c                       e Zd Zd Zy)MXMultiplicationArtistc           
         | j                   }| j                  }t        |      }d}|j                  t	        j
                  t        |j                               |d             t        |      D ]^  \  }}|j                  t	        j                  t        |j                               t        |j                               d|z  z                ` y )Nzmul(| <f0> | , | <f1> | )r   rX   r   r   r   r(   r@   r"   r   rn   r   s          r   r   zMXMultiplicationArtist.draw  s    AJJE
!*C 	$A	NN5::c!**,/aiHI~!nnUZZAJJL 1#ajjl2CFQJ2NOP r   Nr   rE   r   r   r   r     r   r   r   c                       e Zd Zd Zd Zy)SXArtistc                 ,   | j                   }| j                  }|j                         }|j                         }d}t	        |j                               D ]  }|dz  }t	        |j                               D ]  }|j                  ||      }|dk(  r|dz  } |j                  |   }	| j                  |	      r|dt        |	      z  z  }R| j                  j                  t        j                  t        |	j                               dt        | j                   j                               |fz               |d||||fz  z  } |dz  } |d	z  }|j                  t        j                   t        | j                   j                               |d
             y )NrO   rQ   rR   rS   z<TD BGCOLOR='#eeeeee'>%s</TD>z%s:f%dzO<TD PORT='f%d' BGCOLOR='#eeeeee'> <font color='#666666'>(%d,%d|%d)</font> </TD>rU   rV   rW   rX   )r   r@   r[   r}   r!   rb   rc   rf   nzshouldEmbedrY   rg   r   rh   rZ   r`   ra   )
r   r   r@   rl   r}   rK   rn   ro   r(   sxs
             r   r   zSXArtist.draw  sT   AJJE	
B
&&(C AE1779VmeQWWY!IIaNb5

%ttAw"b!2SW<<EJJ

3r{{}+=h#dffooN_J`bcId>d efdhijklmnogpppE   Wne  
;E	NN5::c$&&//"345{STr   c                 \    t        | j                  |         dk(  xr |j                         S )NrT   )r   r0   r8   )r   r   s     r   r   zSXArtist.shouldEmbed3  s%    t{{21$55r   N)rq   rr   rs   r   r   rE   r   r   r   r     s    U26r   r   c                       e Zd Zd Zy)SXLeafArtistc                 $   t        | j                  | j                           dk(  rgt        | j                  | j                           d   }t	        | j
                  |   d      r)| j
                  |   j                  | j                        ry d}| j                  j                         rd}| j                  j                  t        j                  t        | j                  j                               t        | j                        d|             y )NrT   r   r   solidboldbox)rK   rL   rN   )r   r0   r   r\   r    rA   r   is_constantr@   r`   r   ra   rY   rZ   )r   r.   rN   s      r   r   zSXLeafArtist.draw7  s    
4;;tvv1$DKK'(+f	f%m	4<<++DFF3
EvveJJ

3tvv'8#9DFFRW^cder   Nr   rE   r   r   r   r   6  s    	fr   r   c                       e Zd Zd Zy)SXNonLeafArtistc           
         | j                   }| j                  }t        |      }|j                         st	        |      dk(  rt        | j                   ddg      }nt        | j                   dg      }|j                  d      r|j                  d      r|dd }|j                  t        j                  t        |j                               |d             t        |      D ]^  \  }}|j                  t        j                  t        |j                               t        |j                               d	|z  z                ` y t        |d
d
g      }|j                  d      r|j                  d      r|dd }|j                  d      r|j                  d      r|dd }| j                  j                  t        j                  t        |j                               |d             t        |      D ]b  \  }}| j                  j                  t        j                  t        |j                               t        |j                                            d y )Nr   r   r   r   r   r   r   rX   r   r   r   r   r   r   rT   rR   r   )r   r@   r*   r   r   r   r   r   r`   r   ra   rY   rZ   r   rg   rh   r   s          r   r   zSXNonLeafArtist.drawC  s   AJJE
!*C 
S1"466;*DE"466;-8	
d	

4 0
Ab'nnUZZAJJL 1	JK3#!Auzz#ajjl"3C

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

4 0
Ab'	
c	qzz#
Ab'
jj%**S%6QVLM3#!A

EJJs1::<'8QZZ\9JKL  r   Nr   rE   r   r   r   r   B  s    Mr   r   c                    t        | t              rO| j                  d      r-t        |       rt	        | f||||d|S t        | f||||d|S t        | f||||d|S t        | t              rw| j                         rt        | f||||d|S | j                         s| j                         rt        | f||||d|S | j                         rt        | f||||d|S | j                         rt!        | f||||d|S | j#                         rt%        | f||||d|S | j'                         rt)        | f||||d|S | j+                  t,        j.                        rt1        | f||||d|S | j+                  t,        j2                        rt5        | f||||d|S | j+                  t,        j6                        rt9        | f||||d|S t;        | f||||d|S t=        dt?        tA        tB                    z        )NTr"   r0   r@   rA   zCannot create artist for %s)"r:   r   r;   r8   r   r   r   r   is_symbolicru   r   r   r   r   r   is_callr   	is_outputr   is_normr   is_opCOP_GETNONZEROSr   OP_SETNONZEROSr   OP_ADDNONZEROSr   r   	ExceptionrY   typer   )noder"   r0   r@   rA   rB   s         r   createArtistr	  a  s/   R~~d	D\SU7\U[\\t_6g_X^__dVs&uWVvVV $rd^s&uW^W]^^		T]]_t_6g_X^__				d^s&uW^W]^^	`Fw`Y_``		%dfs&uU\f_eff	$Z3f5ZSYZZ	A$$	% a#V%PWaZ`aa	A$$	% a#V%PWaZ`aa	A$$	% a#V%PWaZ`aaT]ceG]V\]]
1CQL@
AAr   c           	      *   	 fd}t         j                  |t         _        t        | i i       \  }}t        |j	                               j                  t        |j	                                     }i }t        j                  dd|      }|D ]  }	t        |	f||||d|||	<    |j                         D ]  }
|
|
j                           t        dd      j                  |j                                t         _        |S # t         _        w xY w)zu
  Creates and returns a pydot graph structure that represents an SX.

  direction   one of "BT", "LR", "TB", "RL"
  c                 h    | j                  d      r	 | j                         S y#   |       cY S xY w)NTr   )r;   element_hash)eSX__hash__backups    r   	getHashSXzdotgraph.<locals>.getHashSX  s8    	
T		%!
! 	%!!$
$s   % 
1Gdigraph)
graph_typer   r   z
source.dotw)r   rZ   r4   r-   keysunionr   Dotr	  valuesr   openwrite	to_string)r   	directionrB   r  r"   r0   allnodesrA   r@   r  artistr  s              @r   dotgraphr    s    %# {{BK "!Br*KC388:$$S%78H GIIci	BE"4cCvERYc\bcgdm  .."	kkm # 	c  !23"BK	, #BKs   C5D Dc                 "   t        | fd|i|}t        |d|z         r t        |d|z         |       yd|z  } dg}t        |      D ](  }|j	                  d      s|j                  |dd        * | dj                  |      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  rB   glr   s           r   dotsaver*    s     q.9.v.!QxGAhvox(BVKA	AV	
h		12  OA
A,r   c                 ^   	 ddl m}m}m}m}m} t        |d      r|j                  j                  dk(  rqd	|j                  t        |j                        |j                  fz  }|xj                  |fz  c_        t        | fd|i|j!                  |       t        d
|z         yd}	t        | fd|i|j#                  |	        ||	      }
 |         |g dd      }|j%                           ||
        |        y#  t        d       t        | fd|i|j                  d       Y yxY w)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   rT   rT   F)frameon)pylabr,  r-  r.  r/  r0  printr  write_psr    r#   rq   basenamer   figure_listfigure_extension	write_pdf	write_pngset_axis_off)r   r  rB   r,  r-  r.  r/  r0  figure_nametempimaxs               r   dotdrawr@    s   66 T+4>>#:#:K#Gs43C3C/DdF[F[]]K'Q,,V,66{C	
)K
78 
DQ,,V,66t<	B
H	i	'BOO
2JF-	
[\Q,,V,55i@
s   D   *D,)BT)psr=  RL)rC  )$casadir   r   r   r  r   r  r   r   r   r*   r1   r6   r8   r4   r>   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r*  r@  rE   r   r   <module>rE     s  0 * ) C%! $&R 	" ') 5  	*) *)XWy W@O O2Wy W:Ri R<%L) %LN'Q) 'QT&Q) &QR&R	 &RPQY QNI NN9 NOy OQY Q6y 6:
f9 
fMi M> BT" !BF-`0_CCC
  B  C  C s#   D D	DD
DD