
    )j1                     J   d dl T d dlZd dlZd dlZej        dk    rd dlZnd dlZeZd dlZ	 ej	        Z
n#  ej        j	        Z
Y nxY wd Zd Zd Zd Zd Zd`d
Zd Zd Zd Zd Zd Zd Zd Z G d de          Z G d d          Zd Z G d d          Z e            Zd Z G d d          Z  G d de!          Z" G d d          Z# G d  d!          Z$ G d" d#e#          Z% G d$ d%e#          Z& G d& d'          Z' G d( d)          Z(d* Z)dad+Z* G d, d-          Z+ G d. d/          Z, G d0 d1e"e$          Z- G d2 d3e!          Z. G d4 d5e.e$          Z/ G d6 d7e0          Z1 G d8 d9e/e'          Z2 G d: d;          Z3 G d< d=e/e'e3          Z4 G d> d?e/e'e(          Z5 G d@ dAe5          Z6 G dB dCe5          Z7 G dD dEe5e3          Z8 G dF dGe/e'          Z9e2Z:e4Z;e7Z<e8Z=e9Z>e/Z?e Z@ G dH dIe           ZAdJ Z@ G dK dL          ZB G dM dN          ZC G dO dPeC          ZD G dQ dReC          ZE G dS dT          ZF eFeD          ZG eFeE          ZH G dU dV          ZI G dW dXeI          ZJ G dY dZeI          ZK G d[ d\eI          ZL G d] d^eI          ZMd_ ZNdS )b    )*N)   r   c                 `    t          | t                    pt          | t          j                  S N)
isinstanceintnpintegeras    Q/DATA/AppData/hermes/venv/lib/python3.11/site-packages/casadi/tools/structure3.py
is_integerr   +   s#    	Ac			6j2:666    c                 ,    t          | t                    S r   )r   strr   s    r   	is_stringr   .   s    	Ac		r   c                 V    t          | t                    pt          | t                    S r   )r   listtupler   s    r   
isIterabler   1   s!    	Ad			2z!E222r   c                     d | D             S )Nc                     g | ]}|gS  r   .0xs     r   
<listcomp>zlpack.<locals>.<listcomp>;   s    %%%aqc%%%r   r   )Ls    r   lpackr   ;   s    %%1%%%%r   c                  X     t                     dk    rg gS  fd d         D             S )Nr   c                 B    g | ]}t          d d          D ]}||z   S )   Ncombine)r   r   bargss      r   r   zcombine.<locals>.<listcomp>A   s7    ???aGT!""X,>??qAE????r   )lenr&   s   `r   r$   r$   =   s7    YY\\4K????47????r   Fc           
      *   t          |           dk    r	|rg ggS g gS t          | dd                    |r!fdt          | d                   D             S t          t	          t          t          | d                                                 S )Nr   r"   c                 4    g | ]}t          |gg          S r   r#   )r   itails     r   r   zlistindices.<locals>.<listcomp>L   s'    :::agseD!!:::r   )r'   listindicesranger$   r   r   )dimsnestr,   s     @r   r-   r-   C   s    YY\\ dVmTktABBx  D 7::::5a>>::::U4d1g//00666r   c               '   ,  K   t          t          t          |                     }dgt          |           z  }d}t	          |          rK	 t          ||                   V  n#  d||<   Y nxY w|dz   t          |           z  }t	          |          Id S d S )NTr   Fr"   )r   mapiterr'   anynext)r&   	iteratorsactiver+   s       r   intersperseItr8   P   s      3tD>>"")6#d))&!F 1fQiii	
Q#d))A 	F     s   
A" "A+c                  .    t          t          |            S r   )r   r8   r(   s    r   intersperser:   [   s    
}d#
$
$$r   c                     t          |           dk    rg S | gt          | d t          t          t          | d d d                                                 d          dz                       z   S )Nr   Tr"   )r'   canonicalIndexAncestorsr   r2   r   index)inds    r   r=   r=   ^   sj    XXq[[)
(-]S3ttt95M5M0N0N0T0TUY0Z0Z[\0\.]-])^__	__r   c                     | dk     r| |z   S | S )Nr   r   )r?   ss     r   	canonicalrB   b   s    1WW7NJr   c                     t          d | D                       r5t          j        t          t	          t
          |                     g           S | S )Nc              3   @   K   | ]}t          |t                    V  d S r   )r   r   r   r+   s     r   	<genexpr>zvec.<locals>.<genexpr>i   s,      ''Ad		''''''r   )r4   builtinssumr   r2   veces    r   rI   rI   h   sH    ''Q''''' <SQZZ((,,,Hr   c                 N    t                               | |         |j                  S r   )casadireshapeshape)r   r+   s     r   correct_vector_indexingrP   o   s    	!ag	&	&&r   c                       fd}|S )zi
    This decorator modifies a __getitem__/__setitem__ method such that it will always receive a tuple
  c                 H    t          |t                    s|f} | |g|R  S r   r   r   )selfmbtr&   fs      r   properzproperGetitem.<locals>.properx   s6    c%   Fc1T#tr   r   )rV   rW   s   ` r   properGetitemrX   t   s#         
-r   c                       e Zd Zd ZdS )SafeDictc                     || vrAt          d|dt          t          |                                                               t                              | |          S )NzUnknown keyword 'z'. Available entries: )	Exceptionr   r   keysdict__getitem__)rT   ks     r   r_   zSafeDict.__getitem__   sZ    }}IqqqTRVR[R[R]R]M^M^I_I_I_`aaaD###r   N)__name__
__module____qualname__r_   r   r   r   rZ   rZ      s#        $ $ $ $ $r   rZ   c                       e Zd Zd ZdS )Repeaterc                     || _         d S r   rJ   )rT   rK   s     r   __init__zRepeater.__init__   s    r   Nra   rb   rc   rg   r   r   r   re   re      s        """""r   re   c                      t          |           S )z
    From the arguemnt, constructs something that acts like a 'list' with the argument repeated the 'correct' number of times

    s = struct_symSX([entry("x",repeat=6)])
    s["x"] = repeated(12)

  )re   rJ   s    r   repeatedrj      s     
!r   c                       e Zd ZdZdS )NestedDictLiteralzT
    NestedDictLiteral will cause all dictionaries to become explicit recursively
  N)ra   rb   rc   __doc__r   r   r   rl   rl      s           r   rl   c                    t          |          rt          d|z            t          |           r>|t          |           k    r#t          d|dt          |           d          | |         S t	          | t
                    r| j        S | S )Nz$Got string %s where number expected.z!Rhs out of range. Got list index z  but rhs list is only of length .)r   r\   r   r'   r   re   rK   )payloadr+   s     r   payloadUnpackrq      s    q\\ ?
:A=
>
>> #g,,Ibcbcbcdghodpdpdpdpqrrr1:'(## 9Nr   c                   J    e Zd Zddg fdZddZeZd Zd ZddZd	 Z	ddZ
dS )StructEntryNc                 0    || _         || _        || _        d S r   )namer/   struct)rT   ru   rv   datar/   s        r   rg   zStructEntry.__init__   s    DIDIDKKKr   Fc                    d}t          | j                  dk    r|dt          | j                  z  z  }|                                 r||                                 z  }n|| j                            d          z  }|S )N r"   zrepeated(%s): Tcompact)r'   r/   r   isPrimitiveprimitiveStringrv   __str__)rT   r{   rA   s      r   r~   zStructEntry.__str__   s    	QDIc$)nn,,q ,$


 
  qq$+

d

+
++qXr   c                     dS )Nr   r   rT   s    r   r}   zStructEntry.primitiveString   s    3r   c                     | j         d u S r   rv   r   s    r   r|   zStructEntry.isPrimitive   s    ;$r     c                     | j         |dk    rg gn| j                             |dz
            t          | j        |          }| j        gg|rfd|D             S t          |          S )Nr   r"   limitc                 2    g | ]}t          |          S r   r#   )r   r+   childrenns     r   r   z6StructEntry.traverseCanonicalIndex.<locals>.<listcomp>   s%    000ga(##000r   )rv   traverseCanonicalIndexr-   r/   ru   r$   )rT   r0   r   lir   r   s       @@r   r   z"StructEntry.traverseCanonicalIndex   s    +uaxxttdk>`>`glmngn>`>o>oH	TYt	$	$B
)A $00000R0000Qr(###r   c                 6    | j                             |          S r   )rv   getStructEntryByStructIndex)rT   structIndexs     r   r   z'StructEntry.getStructEntryByStructIndex   s    ;22;???r   r   c           	         	 	  j         t                    dk    rEt                    dk    r$                     d D                       S             S t                    dk    rN                                 r t	                               S  j                                      S d         d         	t          t                    r)t          t          
                    	                     t                    r<                     dd          dd          t          	          fz             S t          t                    r	 fdD             S t          t                    rt          d	          t          t                    rt          d
          t          t                     r!	 fdt          	          D             S t          t"                    rW                      dd                                                              }                    d d |          S t          dt)                    z            # t          $ r5}t          dt)                    dt)                              |d }~ww xY w)Nr   c                 ,    g | ]}t          d           S r   )slicerE   s     r   r   z4StructEntry.traverseByPowerIndex.<locals>.<listcomp>   s    ...AE$KK...r   r/   canonicalIndex
dispatcherrp   )entry
extraIndexr   r   r   rp   r"   c                     g | ]L}                     d d         d d         t          |          fz   t          |                    MS r"   Nr   traverseByPowerIndexrB   rq   )	r   r+   r   r/   r   rp   
powerIndexrA   rT   s	     r   r   z4StructEntry.traverseByPowerIndex.<locals>.<listcomp>   sy         -- n8%3Yq^^4E%E!+ -ga 8 8 .    r   z3powerIndex entry {} cannot be used in list context.z>powerIndex entry {"foo","bar"} cannot be used in list context.c                     g | ]E}                     gd d         t          |          fz   t          |                    FS r   r   )	r   r+   r   r/   r   prp   rA   rT   s	     r   r   z4StructEntry.traverseByPowerIndex.<locals>.<listcomp>  ss     $ $ $  --c8%3Yq^^4E%E!+ -ga 8 8 .  $ $ $r   r   r   inner%I don't know what to do with this: %sz/Error occured in entry context with powerIndex , at canonicalIndex )r/   r'   r   r|   r   rv   r   r   r   r.   indicesr   rB   r^   r\   setrl   callablecallableInnercallableOuterr   )
rT   r   r/   r   r   rp   rrK   r   rA   s
   ``````  @@r   r   z StructEntry.traverseByPowerIndex   s   JP	dit	Z!		t99Q;;**....."0(" +    GN>>>
>	TA 	GNeJ>O>OVZ[[[
[11"0("	 2    qMGa 	)5!))A,,'((!a== *	L**abb>QRR"0)Aa..1B"B(" +    $ "	L              $ 	LOPP
P# 	L^__
_+,, 	L$ $ $ $ $ $ $ $ $ $  (($ $ $ $ 8$$ 
	La))122-%3355 *    ! ))'.DW[bc)dd
dACFFJKK
K P P PIcfgqcrcrcrcrsv  xF  tG  tG  tG  H  I  I  OP  PPsL   AJ J +AJ .J BJ %(J A=J A+J 8J 
K!0KKF)Fr   )Nr   NN)ra   rb   rc   rg   r~   __repr__r}   r|   r   r   r   r   r   r   rs   rs      s         $$B    
    (    $ $ $ $@ @ @KP KP KP KP KP KPr   rs   c                   J    e Zd ZddZd ZddZeZddZd Zd	 Z	d
 Z
ddZdS )	StructureNc                    || _         |d | j         D             n|| _        t          j        d | j        D             g           | _        t          d | j         D                       | _        | j        D ]b}t          |          r|| j        vrt          d|z            -t          |t                    r |D ]}|| j        vrt          d|z            cd S )Nc                     g | ]	}|j         
S r   ru   r   rK   s     r   r   z&Structure.__init__.<locals>.<listcomp>      ///Q!&///r   c                 v    g | ]6}t          |t                    rt          |          nt          |g          7S r   )r   r   r   rE   s     r   r   z&Structure.__init__.<locals>.<listcomp>  s:    !e!e!eUVj5.A.A#P4777tQCyy!e!e!er   c                      g | ]}|j         |fS r   r   r   s     r   r   z&Structure.__init__.<locals>.<listcomp>   s    ;;;16!*;;;r   zOrder '%s' is invalid.)entriesorderrG   rH   keyslistrZ   r^   r   r\   r   r   )rT   r   r   rK   ees        r   rg   zStructure.__init__  s   DL38=//$,////eDJL!e!eZ^Zd!e!e!efhiiDM;;dl;;;<<DIZ ; ;	1 ;DI2Q677
7 a ; 	; 	;Bty  4r9::: !; ;r   c                     | j         S r   )r   r   s    r   r]   zStructure.keys+  s
    =r   Fc           	         d}|rM|dd                     d t          | j                                                  D                       z   dz   z  }n|dt	          | j                  z  z  }|dt          | j                  z  z  }t          | j                                                  D ]*\  }}|d|z   d	z   |                    d
          z   dz   z  }+|S )Nry   {,c              3   T   K   | ]#\  }}|d z   |                     d          z   V  $dS )z: Trz   N)r~   )r   r`   vs      r   rF   z$Structure.__str__.<locals>.<genexpr>1  s=      aa#!A!d(aiii&=&==aaaaaar   }zStructure holding %d entries.
z  Order: %s
z  z = Trz   
)joinr   r^   itemsr'   r   r   r~   )rT   r{   rA   r`   r   s        r   r~   zStructure.__str__.  s    	Q A3aadiooN_N_I`I`aaaaaadgggqq,s49~~==q/C
OO
++qty(()) A A31Q
dQh!))D)"9"99D@
@!!Xr   r   c                      g } j         D ]]}t          |t                    rt           fd|D              D ]}||z  }6| j        |                             dz
            z  }^|S )Nc                 Z    g | ]'}j         |                             d dz
            (S )Tr"   r   )r^   r   )r   der   rT   s     r   r   z4Structure.traverseCanonicalIndex.<locals>.<listcomp>?  s8    ddd\^ty}CCDuUVwCWWdddr   r"   r   )r   r   r   r:   r^   r   )rT   r   retdr   s   ``   r   r   z Structure.traverseCanonicalIndex;  s    
CZ B B	Ae		 Bdddddbcddde 	 	A
(##	 	ty|22q2AAAJr   c                     | j         |d                  }t          |          dk    r|                    |dd                    S |S )Nr   r"   )r^   r'   r   )rT   r   rK   s      r   r   z%Structure.getStructEntryByStructIndexE  sF    	+a.!A
;**;qrr?;;;hr   c                 @    |                      d |D                       S )Nc                 0    g | ]}t          |          |S r   r   r   s     r   r   z<Structure.getStructEntryByCanonicalIndex.<locals>.<listcomp>M  s#    ,P,P,P19Q<<,PQ,P,P,Pr   )r   )rT   r   s     r   getStructEntryByCanonicalIndexz(Structure.getStructEntryByCanonicalIndexL  s%    ++,P,P,P,P,PQQQr   c           
         || j         j        vrMt          dt          |          t          t	          |                                                    fz            | j         j        |         j         }|t          d|z            |S )Nz-Cannot find entry with key '%s'. Candidates: zEntry '%s' has no structure.)rv   r^   r\   r   r   r]   )rT   ru   r   s      r   	getStructzStructure.getStructO  s    4;###ETSVW[\`\e\e\g\gWhWhSiSiHjjkkk
+
4
 
'C
{4=>>>jr   r   c           	          	 t                    dk    r           S d         t                    r0 j                                     dd          fz             S t	          t
                    rt          d          t	          t          t                              r2	  fdt           
                                          D             S t	          t                    st	          t                    r|t	          t                    r1t           fd                                D                       S t          fd j                                        D                       S t	          t                    ret	          t                    r1t           fd                                D                       S t           fd	D                       S t	          t                    r fd
t                    D             S t	          t                    rV                      dd                                                              }                    d d |          S t          dt%                    z            # t          $ r5}t          dt%                    dt%                              |d }~ww xY w)Nr   r"   r   z,slice not allowed here, did you mean '...' ?c                     g | ]C\  }}j         |                             d d         |fz   t          |                    DS r"   Nr   )r^   r   rq   )r   r+   r`   r   r   rp   r   rT   s      r   r   z2Structure.traverseByPowerIndex.<locals>.<listcomp>i  so     5 5 5 a Yq\66!!""~&4aT&9",,WQ77	 7  5 5 5r   c           	          g | ]O\  }}|j         |                             t          t                     r
d d         ng|fz   |          fPS r   )r^   r   r   r   r`   r   r   r   r   r   rT   s      r   r   z2Structure.traverseByPowerIndex.<locals>.<listcomp>s  s     	 	 	 !A il77*4Qt*<*<E
1221#'5qd':#- !	 8  	 	 	r   c           	          g | ]D\  }}||                     t          t                    r
d d         ng|fz             fES r   )r   r   r^   )r   r`   r   r   r   r   rp   r   s      r   r   z2Structure.traverseByPowerIndex.<locals>.<listcomp>~  s|     	 	 	 !A ,,*4Qt*<*<E
1221#'5qd':#- '	 -  	 	 	r   c           	          g | ];\  }}|v 	|j         |                             d d         |fz   |          f<S r   r^   r   r   s      r   r   z2Structure.traverseByPowerIndex.<locals>.<listcomp>  so     	 	 	 !AAFF il77"122'5qd':#- !	 8   5;FFr   c           	      t    g | ]4}|j         |                             d d         |fz             f5S r   r   )r   r`   r   r   rp   r   rT   s     r   r   z2Structure.traverseByPowerIndex.<locals>.<listcomp>  si     	 	 	  il77"122'5qd':#- '	 8  	 	 	r   c                 |    g | ]8\  }}                     d d         |fz   t          |                    9S r   )r   rq   )r   r+   rA   r   r   rp   r   rT   s      r   r   z2Structure.traverseByPowerIndex.<locals>.<listcomp>  si     * * * Qq ..!!""~&4aT&9",,WQ77	 /  * * *r   r   r   z0Error occured in struct context with powerIndex r   )r'   r   r^   r   r   r   r\   typeEllipsis	enumerater]   rl   r   r   r   r   r   r   r   )rT   r   r   r   rp   r   rK   r   s   `````  @r   r   zStructure.traverseByPowerIndexX  sF   ZSz??Ajj&H&HHqMQ<< U	L122qrrN)1$.!	 3    %   N	LHII
I$x..)) L	L5 5 5 5 5 5 5 5 'tyy{{335 5 5 5 $ @	L:a0A#B#B @	L%%  	 	 	 	 	 	 	 	 ")	 	 	 	 	 	  	 	 	 	 	 	 	 	 "&!2!2	 	 	 	 	 	 # )	L%%  	 	 	 	 	 	 	 	 ")	 	 	 	 	 	  	 	 	 	 	 	 	 	  !	 	 	 	 	 	 $ 	L* * * * * * * * &aLL* * * * 8$$ 		La))122-%3355	 *    ! ))'.DW[bc)dd
dACFFJKK
K S S Sifijtfufufufuvy  {I  wJ  wJ  wJ  K  L  L  RS  	SSsQ   K AK .A7K &A/K 5K AK 'K 3K :A*K %K 
L0K>>Lr   r   )r   )r   NN)ra   rb   rc   rg   r]   r~   r   r   r   r   r   r   r   r   r   r   r     s        ; ; ; ;"  	 	 	 	 (     R R R  [S [S [S [S [S [Sr   r   c                   "    e Zd Zd Zd ZddZdS )
Dispatcherc                 v    t          |                                          D ]\  }}t          | ||           d S r   )r   r   setattr)rT   r&   r`   r   s       r   rg   zDispatcher.__init__  sD    DJJLL!!  !d1Q r   c                     | S r   r   r   s    r   r   zDispatcher.callableInner  s    Kr   Nc                     |S r   r   )rT   rp   r   r   r   r   s         r   r   zDispatcher.callableOuter  s    Lr   NNN)ra   rb   rc   rg   r   r   r   r   r   r   r     sF                 r   r   c                   <    e Zd Zd Zd	dZd	dZd	dZd	dZd	dZdS )
CasadiStructureDerivablec                    d }t          |t                    r
|}t          }nIt          |t                    s4t          |t                    s	 t          |          }t          }n#  Y nxY w|>t          |t                    r
|}t          }n	 t          |          }t          }n#  Y nxY w|Kt          |t                    r
|}t          }n,	 t          |          }t          }n#  t	          d          xY w||fS )NzSCall to Structure has weird argument: expecting DM-like or MX-like or SXMatrix-like)r   DMMXSXr\   )rT   argmtyper   s       r   argtypez CasadiStructureDerivable.argtype  s   E#b 
aeeB 
3r(:(: sGG}	C		 	gg!%%	
$}	C		 q	qgg!%%	qopp
pe9s$   A$ $A(B$ $B(C$ $C5r   c                    |                      |          \  }}t          |t                    ra|j        d         dk    r?|j        d         dk    r.| j        dk    r#t                              | j        d          |z  }t          | |          S t          |t                    rt          | |          S t          |t                    rt          | |          S d S )Nr   r"   rw   )r   r   r   rO   sizeonesDMStructr   MXStructr   SXStruct)rT   r   r   r   s       r   __call__z!CasadiStructureDerivable.__call__  s    S!!IQu!B #	
qQWQZ1__AGGDIa  "d""""!B #d""""!B #d""""# #r   c           	          |                      |          \  }}|j        d         | j        k    s+t          d| j        |                                fz            t          t          d| |j        d                   g          }t          t          ft          t          ft          t          ffD ];\  }}t          ||          r& ||t          ||j        d                             }<|j        d         }d|_        |S )Nr   zExpecting %d x n DM. Got %str"   )rv   repeatr   T)r   rO   r   r\   dimrv   r   r   r   r   r   r   r   r   DataReferenceRepeatedprefix
castmaster	rT   r   r   r   rA   r   cnumbersr   s	            r   rj   z!CasadiStructureDerivable.repeated  s    S!!IQu71:""4	!%%''7JJKKKcQWQZ8889::Ah-"h"h@ @ @1	Aa @!A0171:>>???sAALHr   c           	         |                      |          \  }}|j        d         dk    rD|j        d         dk    r3| j        dk    r(t                              | j        | j                  |z  }|j        d         |j        d         k    r|j        d         | j        k    s,t          d| j        d|                                          t          t          d| | f          g          }t          t          ft          t          ft          t          ffD ];\  }}t          ||          r& ||t          ||j        d                             }<|j        d         }d|_        |S )	Nr   r"   zExpecting square DM of size z. Got r   shapestructr   T)r   rO   r   r   r   r\   r   rv   r   r   r   r   r   r   r   DataReferenceSquaredr   r   r   s	            r   squaredz CasadiStructureDerivable.squared  s=   S!!IQuwqzQ171:??ty!||7749TY'')q71:##
DI(=(=Y4999QUUWWWUVVVctDk222344Ah-"h"h@ ? ?1	Aa ?!A/!'!*==>>>sAALHr   c           
         |                      |          \  }}|j        d         dk    rD|j        d         dk    r3| j        dk    r(t                              | j        |j                  |z  }|j        d         |j        k    r|j        d         | j        k    s4t          d| j        d|j        d|                                          t          t          d| |f          g          }t          t          ft          t          ft          t          ffD ]G\  }}t          ||          r2 ||t          ||j        d         |j        d                             }H|j        d         }	d	|	_        |	S )
Nr   r"   zExpecting DM of shape (r   z). Got r   r   r   T)r   rO   r   r   r   r\   r   rv   r   r   r   r   r   r   r   DataReferenceProductr   r   )
rT   otherstructr   r   r   rA   r   r   r   r   s
             r   productz CasadiStructureDerivable.product  sX   S!!IQuwqzQ171:??ty!||7749[-..q0q71:{'''AGAJ	,A,AY$)))KL\L\L\]^]b]b]d]d]defffctK&8999:;;Ah-"h"h@ J J1	Aa J!A/!'!*QWQZHHIIIsAALHr   c                    |                      |          \  }}|j        d         | j        k    r|j        d         | j        z  dk    s+t          d| j        |                                fz            t          t          d| | ft          |j        d         | j        z                      g          }t          t          ft          t          ft          t          ffD ]V\  }}t          ||          rA ||t          || j        t          |j        d         | j        z                                }W|j        d         }d|_        |S )Nr   r"   z%Expecting square (%d) DM by N. Got %sr   )r   r   r   T)r   rO   r   r\   r   rv   r   r   r   r   r   r   r   r   r   DataReferenceSquaredRepeatedr   r   r   s	            r   squared_repeatedz)CasadiStructureDerivable.squared_repeated$  s)   S!!IQu71:ty  QWQZ$)%;q%@%@>$)AEEGGATTUUUctDkQWQZ$)=S9T9TUUUVWWAh-"h"h@ b b1	Aa b!A7$)CPQ
UYU^H^D_D_``aaasAALHr   N)r   )	ra   rb   rc   r   r   rj   r  r  r	  r   r   r   r   r     s        " " "H# # # #              r   r   c                       e Zd ZddZdS )GetterDispatcherNc                 n   |d n|j         }|| j        j        v r|| j        v rR|t	          |          dk    r=| j        |         }||S |dk    rt          |          S t          d|j         z            t          | j        j        |         ||          }	 |t          | j	        |          S |dk    rt          | j	        |                   S t          d|j         z            # t          $ r%}t          dt          |          z            |d }~ww xY wt          dt          |          z            )Nr   symmCannot handle type '%s'.r   1Error in powerIndex slicing for canonicalIndex %s"Canonical index %s does not exist.)r   rv   r2   priority_object_mapr'   	triu2symmr\   performExtraIndexrP   masterr   )	rT   rp   r   r   r   r   r   r+   rK   s	            r   r   zGetterDispatcher.__call__4  sV   =44ejD((	43	3	39KsS]`aOaOa$^4<(6\\1
4uzABB
B
DKON;zX]
^
^
^al<(a88
86\\4;q>**
*4uzABB
B l l lKsSaObObcddjkkl :S=P=PPQQQs$   C& /C& C& &
D0 DDNNra   rb   rc   r   r   r   r   r  r  3  s.        R R R R R Rr   r  c                   $    e Zd ZddZd ZddZdS )SetterDispatcherNc                    |                      |          }|d n|j        }|| j        j        v rt	          | j        j        |         ||          }	 ||| j        |<   nL|dk    r.t	          | j        j        |         ||d          }|                                r|| j        |<   || j        |<   nt	          t                              |j	                  ||          }	|	
                                |
                                k    r?t          d|                                z   dz   |	                                z   dz             |j        |
                                         | j        |<   ||
                                         | j        |<   nt          d|j        z            d S d S d S # t          $ r}
t          d	t!          |          d
t!          | j                  dt!          t#          j        | j                            dt!          |          dt!          t#          j        |                    dt!          |          dt!          t#          j        |                    dt!          |
                    d }
~
wt          $ r%}
t          dt!          |          z            |
d }
~
ww xY wt          dt!          |          z            )Nr   r  Tr   r   flipzPayload sparsity z does not match lhs sparsity ro   r  $Error in canonicalIndex slicing for &: Incompatible types in a[i]=b with a  (z) and b z) and i z
). Error: r  r  )r   r   rv   r2   r  r  	is_scalarr   r   originalsparsitysparsityr\   r   TNotImplementedErrorCompatibilityExceptionr   rG   )rT   rp   r   r   r   payload_r   r+   iflipoirK   s              r   r   zSetterDispatcher.__call__P  s   zz'""H=44ejD((
DKON;zX]
^
^
^al<#$+a..6\\#DKON$Cz`ekoppp%!! 4%DKN!)DK"2775+A#B#Bj_deeeB{{}}h//11111HLLNNBFeehjhnhnhphppsvvxxx!)ENN,<,<!=DK%ajjll3DKNN4uzABB
B . N  ! y y y$$  fi  jx  fy  fy  fy  fy  z}  ~B  ~I  zJ  zJ  zJ  zJ  KN  OW  O\  ]a  ]h  Oi  Oi  Kj  Kj  Kj  Kj  kn  ov  kw  kw  kw  kw  x{  |D  |I  JQ  |R  |R  xS  xS  xS  xS  TW  XY  TZ  TZ  TZ  TZ  [^  _g  _l  mn  _o  _o  [p  [p  [p  [p  qt  uv  qw  qw  qw  &x  y  y  	y l l lKsSaObObcddjkkl :S=P=PPQQQs&   EF3 3
J>=CJJ> J99J>c                 B    t                               | j                  S )Nr   )CasadiStructureIMDispatcherrv   r   s    r   r   zSetterDispatcher.callableInnerl  s    ''t{';;;r   c                    	 || j         |<   d S # t          $ rF t          dt          |          dt          | j                   dt          |          d          t          $ r%}t	          dt          |          z            |d }~ww xY w)Nr  r  z and b ro   r  )r  r#  r$  r   r\   )rT   rp   r   r   r   r   rK   s          r   r   zSetterDispatcher.callableOutero  s   j"dk% u u u""  BE  FT  BU  BU  BU  BU  VY  Z^  Ze  Vf  Vf  Vf  Vf  gj  kr  gs  gs  gs  gs  $t  u  u  u j j jISQ_M`M`abbhiijs   
 AB& BBr  r   )ra   rb   rc   r   r   r   r   r   r   r  r  O  sU        R R R R8< < <j j j j j jr   r  c                   $    e Zd Zed             ZdS )MasterGettablec                 x    | j                             |t          | j         | j        | j                            S )N)rv   r  r  r   )rv   r   r  r  r  rT   r   s     r   r_   zMasterGettable.__getitem__x  sV    ;++JBRZ^Zemqmx  NR  Nf  Cg  Cg  Cg+  h  h  hr   Nra   rb   rc   rX   r_   r   r   r   r-  r-  w  s2        h h =h h hr   r-  c                   $    e Zd Zed             ZdS )MasterSettablec                 z    | j                             |t          | j         | j        | j                  |          S )N)rv   r  r   r   rp   )rv   r   r  r  r   )rT   r   values      r   __setitem__zMasterSettable.__setitem__}  sA    ;++JDKt{LLLUZ , \ \ \r   N)ra   rb   rc   rX   r7  r   r   r   r3  r3  |  s2        \ \ =\ \ \r   r3  c                    t          |           sAt          | t                    r;t          |           dk    r(t	          d | D                       rt          |           } t          | t                    rl|t          d          |j        t          d          t          |j        |         t                    st          d           | |j        |                   S | S )Nr   c                 ,    g | ]}t          |          S r   r   r   s     r   r   zdelegation.<locals>.<listcomp>  s#    Y{Y{Y{klZcdeZfZfY{Y{Y{r   z0Cannot use delayed index without supplied entry.z6Cannot use delayed index without supplied shapestruct.z=Cannot use delayed index with a integer shapestruct argument.)
r   r   r   r'   allFlatIndexDelegater	Delegaterr\   r   r   )r   r   r+   s      r   
delegationr=    s    z 0z*T:: 0s:q?P?PUXY{Y{pzY{Y{Y{U|U|?P#J//J
9%% }I&XYYY 	2j(k(k"ke'*955  Jy  JI  @J  @J  :J:e'*+++r   c                 X   |t          |          dk    r| S t          |d         t                    rEt          |d         t                    s* |d         t	          | |dd          ||                    S t          |d         t
                    st          |          dk    st          |          dk    rt          dt          |          z            	 t          |          dk    r.|d         }t          ||d          }| 	                    |          S |\  }}t          ||d          }t          ||d          }| 	                    |r||fn||f          S # t          $ r> t          dt          |          dt          t          |                     d          w xY w| S )	Nr   r"   r     z[Powerindex exhausted. Remaining %s is interpreted as extraIndex, but length must be 1 or 2.z!Powerindex exhausted. Passing on z to z(, but it doesn't know what to do with it)r'   r   r   r<  r  rl   r\   r   r=  r_   r#  r   )r+   r   r   r  r   r%   s         r   r  r    s   3z??A--H
1x(( _JqM)1T1T _:a=*1
122UX\]]]^^^	JqM"3	4	4 
:qC
OOQ..svy  {E  wF  wF  F  G  G  GM	Z!		qMqq!!}}Q!qq!!qq!!}}d5aUU1666 M M MYnqr|n}n}n}n}  B  CG  HI  CJ  CJ  K  K  K  K  L  M  M  MM Hs   A E AE AF'c                   j    e Zd ZddZd Zd Zd Zd Zd ZeZ	d Z
ed	             Zed
             ZdS )PrefixerFc                     || _         || _        || _        g d}|D ]-}t          | j         |          rt	          | || j                   .d S )N)__DM____SX____MX__)rv   r   r   hasattrr   cast)rT   rv   r   r   methodsms         r   rg   zPrefixer.__init__  sd    DKDK DO,,,G " "	Q		 "Qty!!!" "r   c                 X    |                      |d         |d         |d                    d S )Nrv   r   r   rg   rT   states     r   __setstate__zPrefixer.__setstate__  s+    MM%/%/%2EFFFFFr   c                 ,    | j         | j        | j        dS )Nrv   r   r   rP  r   s    r   __getstate__zPrefixer.__getstate__  s    kT[tWWWr   c                 &   t          | j        j        t                    r| j        j        j        }n| j        j        }t          |t
                    s:t          |t                    s't          |t                    st          ||          S d S d S d S r   )	r   rv   r  DataReferencer   r   r^   r   getattr)rT   ru   r   s      r   __getattr__zPrefixer.__getattr__  s     $+$]33 
+

aa
+
aa Ad!3!3 z!E7J7J Qt__     r   c                     | j         r<t          | j        j        t                    r| j        j        j        S | j        j        S  |             S r   )r   r   rv   r  rS  r   r   s    r   rG  zPrefixer.cast  sG     	DK&}	5	5 "{!##{!!TVVmr   c                 t    dt          | j                  z   dz   | j                            d          z   dz   S )Nzprefix( r   Trz   ))r   r   rv   r~   r   s    r   r~   zPrefixer.__str__  s:    DK(((3.1D1DT1D1R1RRUXXXr   c                 @    | j                             | j                  S r   rv   r_   r   r   s    r   r   zPrefixer.__call__  s    ;""4;///r   c                 F    | j                             | j        |z             S r   rZ  r0  s     r   r_   zPrefixer.__getitem__  s    ;""4;#;<<<r   c                 H    | j                             | j        |z   |          S r   )rv   r7  r   )rT   r   rw   s      r   r7  zPrefixer.__setitem__  s!    ;""4;#;DAAAr   Nr   )ra   rb   rc   rg   rN  rQ  rU  rG  r~   r   r   rX   r_   r7  r   r   r   rA  rA    s        " " " "G G GX X X    Y Y Y (0 0 0 = = == B B =B B Br   rA  c                   6    e Zd Zd ZeZddZed             ZdS )PrefixConstructorc                 D    d| j                             d          z   dz   S )NzprefixConstructor(Trz   rX  )rv   r~   r   s    r   r~   zPrefixConstructor.__str__  s%    $+"5"5d"5"C"CCcIIr   Fc                 "    || _         || _        d S r   )rv   r   )rT   rv   r   s      r   rg   zPrefixConstructor.__init__  s    DKDOOOr   c                 :    t          | j        || j                  S )N)r   )rA  rv   r   )rT   r   s     r   r_   zPrefixConstructor.__getitem__  s    DK$/BBBBr   Nr   )ra   rb   rc   r~   r   rg   rX   r_   r   r   r   r^  r^    sa        J J J (    C C =C C Cr   r^  c                       e Zd ZdZd Z G d de          Z G d de          Zd Zd Z	d	 Z
ddZddZddZddZddZdS )r)  z
    size
    map
  c                 X    dd l }|                    | t          |d          d           d S Nr   wbr?  pickledumpfilerT   filenamerg  s      r   savezCasadiStructure.save  1    MMM
KKT(4((+++++r   c                       e Zd ZddZdS )#CasadiStructure.FlatIndexDispatcherNc           	         || j         j        v rt          | j         j        |         ||          }t          |t                    rW|                                sJ t          t          t          t          |                                                              S t          |          S t          dt          |          z            Nr   zCanonical index %s not found.)rv   r2   r  r   r   is_denser   r   nonzerosr\   r   )rT   rp   r   r   r   ress         r   r   z,CasadiStructure.FlatIndexDispatcher.__call__  s    	4;?	*	* ?:\abbbc" 	5

c#d3<<>>223344
4Cyy7#n:M:MMNNNr   r  r  r   r   r   FlatIndexDispatcherro    s.        O O O O O Or   ru  c                       e Zd ZddZdS )CasadiStructure.IMDispatcherNc                     || j         j        v r"t          | j         j        |         ||          S t          dt	          |          z            rq  )rv   r2   r  r\   r   )rT   rp   r   r   r   s        r   r   z%CasadiStructure.IMDispatcher.__call__  sL    	4;?	*	* !@J]bcccc7#n:M:MMNNNr   r  r  r   r   r   r*  rw    s.        O O O O O Or   r*  c                 8     | j         |d         i |d          d S )Nr&   kwargsrK  rL  s     r   rN  zCasadiStructure.__setstate__  s'    DM5=35?33333r   c                 *    t          | j                  S r   )r^   initializerr   s    r   rQ  zCasadiStructure.__getstate__  s     !!!r   c                 p   ||d| _         t          j        | g|R i | i | _        g | _        i }d}|                                 D ]L}|                     |          }|j        t          	                    dd          n|j        }t          |t          t          |||                                z                                 }||                                z  }t          |          || j        <   | xj        fdt          t!          |                                |                                                    D             z  c_        t'                    dd          D ](}	|	|v r||	                             |           "|g||	<   )N|| _        |                                D ]\  }}
t/          d |
D              ||<   | j                            |            G d d          } G d d	|          } G d
 d|          } ||           | _         ||           | _        | | _        d S )Nr&   rz  r   r"   c                      g | ]
\  }}||fS r   r   )r   kkr   its      r   r   z,CasadiStructure.__init__.<locals>.<listcomp>  s#    UUUtr!"RUUUr   c                 ,    g | ]}|j         d d          S r   nzrE   s     r   r   z,CasadiStructure.__init__.<locals>.<listcomp>"  s"    ---a!$qqq'---r   c                       e Zd Zd ZdS )1CasadiStructure.__init__.<locals>.StructureGetterc                     || _         d S r   r   rT   rv   s     r   rg   z:CasadiStructure.__init__.<locals>.StructureGetter.__init__&  s    r   Nrh   r   r   r   StructureGetterr  %  s#            r   r  c                   $    e Zd Zed             ZdS )*CasadiStructure.__init__.<locals>.IMGetterc                 v    | j                             |t                              | j                             S Nr   r/  )rv   r   r)  r*  r0  s     r   r_   z6CasadiStructure.__init__.<locals>.IMGetter.__getitem__*  s2    {//
oFbFbjnjuFbFvFv/wwwr   Nr1  r   r   r   IMGetterr  )  s2        x x }x x xr   r  c                   $    e Zd Zed             ZdS )1CasadiStructure.__init__.<locals>.FlatIndexGetterc                     t          | j                            |t                              | j                                      S r  )rI   rv   r   r)  ru  r0  s     r   r_   z=CasadiStructure.__init__.<locals>.FlatIndexGetter.__getitem__/  sU    4;33J/JmJmuy  vAJm  KB  KB3  C  C  D  D  	Dr   Nr1  r   r   r   FlatIndexGetterr  .  s2        D D }D D Dr   r  )r|  r   rg   r2   lookuptabler   r   r!  Sparsitydenser   r   r.   nnzr   r   zipget_colrowr=   appendr   r   vertcatupdater+   rV   rv   )rT   r&   rz  hmapr`   r+   rK   sprI  r   r   r  r  r  r  s                 @r   rg   zCasadiStructure.__init__
  s    $77Dt+T+++F+++DHDD	A((**  

-
-a
0
0a"#*"48>>!A!*b
RU1QrvvxxZ(())
*
*a26688ma88bdhrl
UUUUyRZZ\\"&&((9S9S/T/TUUUU&r**122.  !99
q'..



C$q''	
 DIzz|| / /!--1---.d1ggHOOD       x x x x x? x x x
D D D D D/ D D D
 Xd^^DF_T""DFDKKKr   Fc                 X    |rdn	d| j         z  t                              | |          z   S )Nry   zStructure with total size %d.
rz   )r   r   r~   rT   r{   s     r   r~   zCasadiStructure.__str__7  s3    LBB@49LyO`O`aenuO`OvOvvvr   r"   c                     |dk     s|| j         k    rt          d|| j         fz            | j        |         \  }}}|dk    r|S |dk    r||fz   S ||z   S )z
      Returns the canonicalIndex of the entry with a given flatIndex
      extraMode influences wether nothing (0), [i] (1) or [i,j] (2) will be returned as extra index
    r   z>Lookup index out of range. Got %d, but structure is of size %dr"   )r   r\   r  )rT   r+   	extraModecanr`   r   s         r   getCanonicalIndexz!CasadiStructure.getCanonicalIndex:  ss    
 	ssallVZ[\`\eYffgggq!GC!!||j	A!XoUlr   c                 H      fdt           j                  D             S )Nc                 >    g | ]}                     |           S r  )r  r   r+   r  rT   s     r   r   z4CasadiStructure.canonicalIndices.<locals>.<listcomp>J  s,    TTTaD""1y"99TTTr   r.   r   rT   r  s   ``r   canonicalIndicesz CasadiStructure.canonicalIndicesI  s+    TTTTT5CSCSTTTTr   c                     |                      ||          }dd                    t          t          |                    z   dz   S )Nr  [r   ])r  r   r2   r   )rT   r+   r  r   s       r   getLabelzCasadiStructure.getLabelL  s>    q955AS$$$s**r   c                 H      fdt           j                  D             S )Nc                 >    g | ]}                     |           S r  )r  r  s     r   r   z*CasadiStructure.labels.<locals>.<listcomp>Q  s)    KKKQDMM!iM00KKKr   r  r  s   ``r   labelszCasadiStructure.labelsP  s+    KKKKK%	:J:JKKKKr   Nr   )r"   )ra   rb   rc   rm   rl  r   ru  r*  rN  rQ  rg   r~   r  r  r  r  r   r   r   r)  r)    s1        
, , ,	O 	O 	O 	O 	OJ 	O 	O 	OO O O O OZ O O O4 4 4" " "+ + +Zw w w w   U U U U+ + + +L L L L L Lr   r)  c                   R    e Zd ZdZd Zed             Zed             Zd	dZd Z	dS )

StructuredGeneric Structured objectc                     |j         | _         | j         j        | _        | j         j        | _        | j         j        | _        t	          |           | _        d S r   )rv   r+   rV   r   r^  r   )rT   	structures     r   rg   zStructured.__init__V  sA    "DK[]DF[]DF[*DN#D))DKKKr   c                     | j         j        S r   )rv   r   r   s    r   r   zStructured.size]  s    ;r   c                 \    t          | j        t                    r| j        j        S | j        S r   )r   r  rS  r   r   s    r   catzStructured.cata  s(    $+m,, [][r   Fc                     |du r$| j         dz   | j                                        z   S | j         dz   | j                            d          z   dz   S )NFz with following structure:
r  Trz   rX  )descriptionrv   r~   r  s     r   r~   zStructured.__str__h  sZ    % >>ATATAVAVVV$t{':':4':'H'HH3NNr   c                 N    t          | j                                                  S r   )r   rv   r]   r   s    r   r]   zStructured.keysn  s      ""###r   Nr   )
ra   rb   rc   r  rg   propertyr   r  r~   r]   r   r   r   r  r  S  s        ++* * *   8   8O O O O$ $ $ $ $r   r  c                   H    e Zd ZdZd Zd Zd	dZed             Zd Z	d Z
dS )
CasadiStructuredr  c                     t                               t                     }|                    |d         |d         d           |                     ||d                    d S )Nr&   rz  r~  r   r   r)  __new__rN  rg   rT   rM  css      r   rN  zCasadiStructured.__setstate__t  sW    		 	 	1	1BOOU6]U8_EEFFFMM"5>M*****r   c                 L    | j                                         }| j        |d<   |S )Nr   )rv   rQ  r   rT   r   s     r   rQ  zCasadiStructured.__getstate__y  s%      ""AAgJHr   Nc                    || _         t          |d          r(t                              | |j                   g | _        nQt          ||          }|j        | _        t                              | t          | j        |j                              | j        j        | _        | j        j	        | _	        | j        j
        | _
        | j        j        | _        i | _        d S )Nrv   r  )r   rF  r  rg   rv   r   	EntryListr)  r  r  r  r  r  )rT   rv   r   	entrylists       r   rg   zCasadiStructured.__init__~  s    DJvh U$v}---dllF///i&dl$t|9?SSSTTT![:D K8DK(DM+$DK!Dr   c                     | j         dfS Nr"   )r   r   s    r   rO   zCasadiStructured.shape  s    Ia=r   c                 B    t                               | j        d          S r  )r  r  r   r   s    r   r!  zCasadiStructured.sparsity  s    >>$)A&&&r   c                 &     | j         j        |i |S r   )rv   lookup)rT   r&   rz  s      r   r  z"CasadiStructured.getCanonicalIndex  s    4;t-f---r   r   )ra   rb   rc   r  rN  rQ  rg   r  rO   r!  r  r   r   r   r  r  q  s        +++ + +
  
" " " "    8' ' '. . . . .r   r  c                       e Zd ZdS )r$  N)ra   rb   rc   r   r   r   r$  r$    s        $r   r$  c                        e Zd ZdZddZd ZdS )
ssymStructzsymbolic SXNc                 p   t                               | ||           t          d | j        D                       rt	          d          g }| j                                        D ]}| j                            |          }|                    t          
                    d                    t          t          |                    |j                                                             t!          d |D              | _        | j        D ](}|j
        |j
        | j        | j        |j                 <   )d S )Nr  c              3   (   K   | ]}|j         d uV  d S r   exprr   s     r   rF   z&ssymStruct.__init__.<locals>.<genexpr>  )      
4
4!16
4
4
4
4
4
4r   zmstruct_symSX does not accept entries with an 'expr' argument, because such an element is not purely symbolic._c                 ,    g | ]}|j         d d          S r   r  rE   s     r   r   z'ssymStruct.__init__.<locals>.<listcomp>  s"    ///ADG///r   )r  rg   r4   r   r\   rv   r   r   r  r   symr   r2   r   r!  r  r  r  r+   ru   )rT   rv   r   rA   r+   rK   s         r   rg   zssymStruct.__init__  s)   d6666

4
4t|
4
4
444 G  F  G  G  G
A[//11 > >
+
4
4Q
7
7ahhrvvchhs3qzz**1:>>+;+;<<====//Q///0DK\ , ,	
	&'eDF16N#, ,r   c                     | j         S r   r  r   s    r   rD  zssymStruct.__SX__  	    8Or   r   )ra   rb   rc   r  rg   rD  r   r   r   r  r    s<        +, , , ,"    r   r  c                       e Zd ZddZdS )VertsplitStructureNr   c                     || j         }|| j        }t          |t                    r|j        }g }g }g }g }d}|                    d          D ]}	|                    |	          }
d }|
                                r*|
j        t          
                    dd          n|
j        }n%t          
                    |
j         j        d          }|                    |           t          |	          }|                    |
           |                    |           |                    |           ||                                z  }|                    |                                           t!          |t#          ||          ||          D ]p\  }}}}
|
                                s |                     |
j         ||z   |           |                                |k    r|nt'          ||          | j        ||z   <   qd S )Nr   r"   r   )rv   parentIndexparent)rv   r  r   rS  r   r   r   r|   r!  r  r  r   r  r   r  size1r  	vertsplitbuildMapr   r  )rT   rv   r  r  ksitsspsesr`   r+   rK   r  r  s                r   r  zVertsplitStructure.buildMap  s   ~~&'' xf
B
C
C
B	A***33  

/
/
2
2ab	
 -$%J$6X^^Aa   AJ^^AHM!,,iilll88biilll	jjnnn	jjnnn26688maaIIfllnn3y33C;; U UAr!]]__ OQXK"4DANNN67jjllB6F6FBrRSHHd{2~..U Ur   )Nr   N)ra   rb   rc   r  r   r   r   r  r    s.        U U U U U Ur   r  c                        e Zd ZdZddZd ZdS )
msymStructzMX.symNc                 h   t                               | ||           t          d | j        D                       rt	          d          t          d | j        D                       rt	          d          t
                              d| j        d          | _        | 	                                 d S )Nr  c              3   (   K   | ]}|j         d uV  d S r   r  r   s     r   rF   z&msymStruct.__init__.<locals>.<genexpr>  r  r   zmstruct_symMX does not accept entries with an 'expr' argument, because such an element is not purely symbolic.c              3   (   K   | ]}|j         d uV  d S r   )r  r   s     r   rF   z&msymStruct.__init__.<locals>.<genexpr>  s)      
3
315
3
3
3
3
3
3r   z<struct_symMX does not accept entries with an 'sym' argument.Vr"   )
r  rg   r4   r   r\   r   r  r   r  r  )rT   rv   r   s      r   rg   zmsymStruct.__init__  s    d6666

4
4t|
4
4
444 G  F  G  G  G

3
3dl
3
3
333 VTUUU&&TYq))DKMMOOOOOr   c                     | j         S r   r  r   s    r   rE  zmsymStruct.__MX__  r  r   r   )ra   rb   rc   r  rg   rE  r   r   r   r  r    s<        +
 
 
 
    r   r  c                   ,    e Zd Zed             ZddZdS )MatrixStructc                      d| j         j        z   S )NzMutable )r   ra   r   s    r   r  zMatrixStruct.description  s    
+++r   Nc                    t                               | |d            t          d | j        D                       rt	          d          || _        t          ||          st          |t                    r|| _        n3|!|	                    | j
        d          | _        n ||          | _        | j        j        d         | j
        k    r0t	          d| j
        | j                                        fz            | j        j        d         dk    rF| j        j        d         dk    r0t	          d| j
        | j                                        fz            | j        D ]}|j        | |j        <   d S )Nr  c              3   (   K   | ]}|j         d u V  d S r   r  r   s     r   rF   z(MatrixStruct.__init__.<locals>.<genexpr>  (      
0
0a16T>
0
0
0
0
0
0r   z;struct_SX does only accept entries with an 'expr' argument.r"   r   z<MatrixStruct: dimension error. Expecting %d-by-1, but got %s)r  rg   r4   r   r\   r   r   rS  r  nanr   rO   r   r  ru   )rT   rv   r   rw   r   rK   s         r   rg   zMatrixStruct.__init__  sr   d6555

0
04<
0
0
000 USTTTDJ$u  D!?!?  dkk	IIdi**dkkE$KKdk{TY&&TX\XabfbmbqbqbsbsWttuuu{Q4;#4Q#7#9#9TX\XabfbmbqbqbsbsWttuuu\  Vd16ll r   r  )ra   rb   rc   r  r  rg   r   r   r   r  r    sA        , , 8,     r   r  c                   .    e Zd Zd Zd Zd ZddZd ZdS )r   c                 X    dd l }|                    | t          |d          d           d S rd  rf  rj  s      r   rl  zDMStruct.save  rm  r   c                     t                               t                     }|                    |d         |d         d           |                     ||d                    d S )Nr&   rz  r~  r  r   r  r  s      r   rN  zDMStruct.__setstate__  sW    		 	 	1	1BOOU6]U8_EEFFFMM"%/M*****r   c                 L    | j                                         }| j        |d<   |S )Nr  )rv   rQ  r  r  s     r   rQ  zDMStruct.__getstate__  s%      ""A+AhKHr   Nc                 L    t                               | |t          |           d S )Nr   )r  rg   r   )rT   rv   rw   s      r   rg   zDMStruct.__init__  s%    $vbd33333r   c                     | j         S r   r  r   s    r   rC  zDMStruct.__DM__  r  r   r   )ra   rb   rc   rl  rN  rQ  rg   rC  r   r   r   r   r     sd        , , ,+ + +
  
4 4 4 4    r   r   c                       e Zd ZddZd ZdS )r   Nc                 N    t                               | |t          ||           d S N)rw   r   )r  rg   r   rT   rv   rw   r   s       r   rg   zSXStruct.__init__  s'    $vbd?????r   c                     | j         S r   r  r   s    r   rD  zSXStruct.__SX__  r  r   r  )ra   rb   rc   rg   rD  r   r   r   r   r     s;        @ @ @ @    r   r   c                       e Zd ZddZd ZdS )r   Nc                 v    t                               | |t          ||           |                                  d S r  )r  rg   r   r  r  s       r   rg   zMXStruct.__init__  s2    $vbd???MMOOOOOr   c                     | j         S r   r  r   s    r   rE  zMXStruct.__MX__$  r  r   r  )ra   rb   rc   rg   rE  r   r   r   r   r     s7           
    r   r   c                   <    e Zd ZdZddZd Zd Zed             ZdS )MXVeccatStructzPartially mutable MXNc                    t                               | ||           t          d | j        D                       rt	          d          g | _        i | _        t          | j        	                    d                    D ]6\  }}| j        
                    d            || j        t          |          <   7| j        D ]}|j        | |j        <   d| _        d S )Nr  c              3   (   K   | ]}|j         d u V  d S r   r  r   s     r   rF   z*MXVeccatStruct.__init__.<locals>.<genexpr>+  r  r   z;struct_MX does only accept entries with an 'expr' argument.r"   r   T)r  rg   r4   r   r\   storagemappingr   rv   r   r  r   r  ru   dirty)rT   r   r   r`   r+   rK   s         r   rg   zMXVeccatStruct.__init__)  s    d3U333

0
04<
0
0
000 USTTTDLDL;;!;DDEE ! !!
l$ dl588\  Vd16llDJJJr   c                 ~     t          t                    sfd fd	} j                            ||          S )Nc                    |t          d          t          d          st          d          |j        v rމj        j        |                                         |                                 k    rt          dt                    dt          |          dj        j        |                                                                         d|                                                                 d	          | j        j        |         <   nt          d	t          |          z            d
_	        d S )NzLAn MX veccat structure does not accept indexing on MX level for __setitem__.r!  zKAn MX veccat structure __setitem__ accepts only objects that have sparsity.zError in powerIndex slicing z for canonicalIndex z: Shape mismatch. lhs is z	, rhs is ro   zNot found: %s T)
r\   rF  r  rv   r2   r!  r   r   r  r  )rp   r   r   r   r   rT   s       r   injectz*MXVeccatStruct.__setitem__.<locals>.inject=  s   		fgggT*%% gefff	4<	'	';?>*3355w7G7G7I7III	{~  @J  |K  |K  |K  |K  LO  P^  L_  L_  L_  L_  `d  `k  `o  p~  `  `H  `H  `J  `J  `N  `N  `P  `P  `P  `P  QX  Qa  Qa  Qc  Qc  Qg  Qg  Qi  Qi  Qi  Qi  j  k  k  k5<T\.122(3~+>+>>???djjjr   r5  r  )r   r   rv   r   )rT   r   r6  r  s   ``  r   r7  zMXVeccatStruct.__setitem__9  s`    j'' !=j       ;++J&QV+WWWr   c                     | j         S r   r  r   s    r   rE  zMXVeccatStruct.__MX__L  r  r   c                 8    t          d  j        D                       rQ fdt           j                                                  D             }t          dt          |          z             j        rt          d  j        D               _	         j	        S )Nc              3      K   | ]}|d u V  	d S r   r   r   s     r   rF   z(MXVeccatStruct.master.<locals>.<genexpr>Q  s&      
+
+19
+
+
+
+
+
+r   c                 D    g | ]}j         j        |                  |S r   )r  r  r   r`   rT   s     r   r   z)MXVeccatStruct.master.<locals>.<listcomp>R  s,    ___qdlSTo9V9^9^9^9^r   z`Problem in MX vecNZcat structure cat: missing expressions. The following entries are missing: %sc                     g | ]?}t                               |                                r|n|j        d d                    @S r   )rM   rI   rr  r  rE   s     r   r   z)MXVeccatStruct.master.<locals>.<listcomp>V  s@    $f$f$fTUVZZQZZ\\0NqtAAAw%O%O$f$f$fr   )
r4   r  r   r  r]   r\   r   r  r  master_cached)rT   missings   ` r   r  zMXVeccatStruct.masterO  s    

+
+dl
+
+
+++ I____D!2!2!4!455___gx{~  @G  |H  |H  H  I  I  Iz h"$f$fY]Ye$f$f$fgdr   r   )	ra   rb   rc   r  rg   r7  rE  r  r  r   r   r   r	  r	  '  si        &+    X X X&     8  r   r	  c                        e Zd Zd Zd Zd ZdS )CasadiStructEntryc           	         t          |          dk    rt          d          |d         | _        || _        t          |          dk    r't          dt	          |dd                    z            t          |                                          }g d}|D ])}||vr#t          d|dt	          |          d          *d	d
gfd
d	dgfdd
gfdg dfdg dffD ](\  }}||v r|D ]}||v rt          d|d|d          )g | _        d|v r1t          |d         t
                    r|d         n|d         g| _        t          d | j        D                       s$t          dt	          | j                  z            d | _
        d
|v rF|d
         }	t          |	t                    r|	| _
        n!t          |	t                    r|	j
        | _
        d | _        d	|v r|d	         }
t          |
          r!t                              |
d          | _        nt          |
t
                    st          |
t"                    rIt          |
          dk    st          |
          dk    rt          d          t          j        |
 | _        n\t          |
t                    r|
| _        n?t          dt	          |
          z            t                              dd          | _        d | _        d|v r|d         }t          |t                    st          |t                    r|j
        df| _        nt          |t"                    rmt          d |D                       r&t          |          dk    st          |          dk    rt          d          t#          d |D                       | _        nt          d          d	|vr"t          j        d | j        D              | _        d | _        d|v r|d         }t          |t(                    r|                                r|| _        nRt          |t                    r|j
        | _
        |j        | _        n$t          dt	          | j                  z            | j                                        | _        d | _        d|v r|d         | _        g ffd	 | j                  \  }}|)dg| _        t                              dd          | _        nP|| _        t1          |d           r|                                | _        nt          d!t	          |          z            d | _        d"|v r |d"         | _        d#g}| j        |vr2t          d$t	          | j        t	          |                    z            | j        d#k    r| j                                        | j                                        k    r,t          d%| j                                        z  dz             | j        | _        | j        t                              | j                                                  z  | _        t>                               | | j        | j
        | j        | j        &           d S )'Nr   z/Missing name argument (first argument of Entry)r"   z/Don't know what to do with unnamed arguments %s)r   rO   r  r  rv   r   r   zUnknown keyword argument 'z'. Please use one of ro   rO   rv   r   r  )rO   r   r  r  )rO   r   r  zYou supplied keyword argument 'z4', but it cannot be combined with keyword argument 'z'.r   c                 ,    g | ]}t          |          S r   )r   r   s     r   r   z.CasadiStructEntry.__init__.<locals>.<listcomp>  s    333!
1333r   zIThe 'repeat' argument, if present, must be a list of integers, but got %sr?  zeThe 'shape' argument, if present, must be an integer, a tuple of 1 or 2 integers, a sparsity pattern.zpThe 'shape' argument, if present, must be an integer, a tuple of 1 or 2 integers, or a sparsity pattern. Got %s c                     g | ];}t          |t                    p#t          |t                    pt          |          <S r   )r   r  r   r   r   s     r   r   z.CasadiStructEntry.__init__.<locals>.<listcomp>  s>    nnn]^Jq,,X
1Y0G0GX:VW==nnnr   z_The 'shapestruct' argument, if present, must be a structure or a tuple of structures or numbersc                 >    g | ]}t          |          r|n|j        S r   )r   rv   r   s     r   r   z.CasadiStructEntry.__init__.<locals>.<listcomp>  s)    !X!X!Xqz!}}"B!!!(!X!X!Xr   z\The 'shapestruct' argument, if present, must be a structure or a tuple of at most structuresc                 >    g | ]}t          |          r|n|j        S r   )r   r   r   s     r   r   z.CasadiStructEntry.__init__.<locals>.<listcomp>  s)    (b(b(bAjmm)G(b(b(br   zYThe 'sym' argument must be a purely symbolic SX or a structured symbolic. Got %s instead.c                     t          | t                    r?t          |           dk    rd |dgz   fS  | d         |t          |           gz             S | |fS )Nr   )r   )r   r   r'   )rK   r   getPrimitives     r   r"  z0CasadiStructEntry.__init__.<locals>.getPrimitive  sb    a 	VVQYYs
?"<!FCFF8O<<<<6/r   r!  zeThe 'expr' argument must be a matrix expression or nested list of matrix expressions. Got %s instead.r   r  zIYou supplied a type argument '%s' but it is not recognised. Use one of %sz:You supplied a type 'symm', but matrix is not square. Got )rv   r/   rw   )!r'   r\   ru   r^   r   r   r]   r   r   r:  rv   r   r  r!  r   r  r  r   r   r  r   is_valid_inputr  r  rF  r   r  size2r   r   upperrs   rg   )rT   r&   rz  kwkwsr`   kcfkfkirv   rO   r   r  r   r   allowedclassr"  s                   @r   rg   zCasadiStructEntry.__init__g  s   
4yy!||GHHHq'diDI
4yy{{G#dSTSUSUh--WXXX 
fkkmm		B
G
G
GC _ _	
#iRSRSRSTWX[T\T\T\T\]^^^ 
 H:
W]+
,(
$***
+***
+
 
F 
FB << F Fcf}}I}}}  AD  AD  AD  E  F  F  F  DK6(26(3CD(I(IaF8$$PVW_P`Oadk33t{33344 vadghlhsdtdttuuu DK6hf	F9	%	% $fZ(( $m DM&Woe	E		 
Y uQ//eD!! YZe%<%< Yu::q==CJJqLL  B  C  C  C".%0$--eH%% Y  K  NQ  RW  NX  NX  X  Y  Y  	YnnQq))dmD=)k	K
	+	+ xz+i/P/P x'.q1k%(( xnnbmnnnoo 	}tw  yD  uE  uE  GH  uH  uH  LO  P[  L\  L\  ]^  L^  L^{||
| !X!XK!X!X!XYYvwww			 (b(bQUQa(b(b(bc DH5Mc	C		 E 2 2 4 4 Ec*%% Ej7svyz~  {C  wD  wD  D  E  E  	Eh''))dm DI.di "       L##ca	
c q++1Z   	L**,,$--  B  EH  IJ  EK  EK  K  L  L  LDIdiXl	,	&	&cgjkoktux  zF  vG  vG  hH  hH  I  J  J  	J	F		=  DM$7$7$9$999VY]YfYjYjYlYllorrss
s $hnnT]5H5H5J5J&K&KK dit{QUQ^_____r   c                     | j         | j                                        S | j         dk    rd| j                                        z   dz   S d S )Nr  zsymm(rX  )r   r!  r   r   s    r   r}   z!CasadiStructEntry.primitiveString  sQ    y]   	F		))+++c11 
	r   c                 :     t           fddD                       S )Nc              3   <   K   | ]}|t          |          fV  d S r   )rT  r  s     r   rF   z1CasadiStructEntry.__getstate__.<locals>.<genexpr>  s0      qq74??#qqqqqqr   )ru   rv   r!  r   r   r   r/   )r^   r   s   `r   rQ  zCasadiStructEntry.__getstate__  s'    qqqq-pqqqqqqr   N)ra   rb   rc   rg   r}   rQ  r   r   r   r  r  f  sM        N` N` N``2 2 2r r r r rr   r  c                      t          |           dk    r#t          | d         t                    r| d         S t          | i |S )Nr"   r   )r'   r   r  r~  s     r   r   r     s@    YY\\ja):;;\7N	D	*6	*	**r   c                       e Zd ZddZdS )r  Nc           
      :   g | _         g | _        t          |t                    st	          dt          |          z            |D ]}t          |t                    rdt          t          t          |                    }| j        	                    t          d |D                                  | xj         |z  c_         {t          |          }| j        	                    |j
                   | j         	                    |           |4t          d | j        D                       rt	          d          || _        d | j         D             | _        t          | j                  t          t          | j                            k    rg }t          | j                  D ]?\  }}|| j        d |         v s|| j        |dz   d          v r|	                    |           @t	          dt          t          t          |                              z            d S )NzHExpecting list of entries, with possible tuples for grouping, but got %sc              3   $   K   | ]}|j         V  d S r   r   r   s     r   rF   z%EntryList.__init__.<locals>.<genexpr>  s$      881888888r   c              3   @   K   | ]}t          |t                    V  d S r   rS   r   s     r   rF   z%EntryList.__init__.<locals>.<genexpr>  s,      55QZ%  555555r   zYou supplied an order by using tuple syntax on entries %s, but you overwrite it with the 'order' keyword. Use one or the other, not both.c                     g | ]	}|j         
S r   r   r   s     r   r   z&EntryList.__init__.<locals>.<listcomp>  r   r   r"   z,Your list of entries contains duplicates: %s)r   r   r   r   r\   r   r   r2   r   r  ru   r4   namesr'   r   r   )rT   r   r   rK   r   r   
duplicatesr+   s           r   rg   zEntryList.__init__  s   DLDJc$ m`cfgjckckklll    	Ae		  s5||$$
%8888888999g1XX
"'"""B 	55$*555	5	5 e  d  e  e  	edj//$,///DJ
4:C
OO,,,,j4:&&  #!A
2A2!tz!A#$$'7"7"7


A


Ds4PST^P_P_K`K`GaGaabbb -,r   r   rh   r   r   r   r  r    s.        c c c c c cr   r  c                       e Zd Zd Zd ZeZdS )r<  c                     || _         d S r   )r   rT   r   s     r   rg   zDelegater.__init__'  s    DHHHr   c                 J    | j         j        dt          | j                  dS )Nr  r  )	__class__ra   r   r   r   s    r   r~   zDelegater.__str__*  s$    ~...s48}}}}==r   N)ra   rb   rc   rg   r~   r   r   r   r   r<  r<  &  s3          > > > (((r   r<  c                       e Zd Zd ZdS )IndexDelegaterc                 @    |j                             | j                  S r   )r+   r_   r   r  s     r   r   zIndexDelegater.__call__1      8)))r   Nr  r   r   r   r=  r=  0  #        * * * * *r   r=  c                       e Zd Zd ZdS )r;  c                 @    |j                             | j                  S r   )rV   r_   r   r  s     r   r   zFlatIndexDelegater.__call__5  r?  r   Nr  r   r   r   r;  r;  4  r@  r   r;  c                   0    e Zd ZdZddZed             ZdS )DelegaterConstructorz
    Creates an object that delegates a slicing operation.

    Example usage:
      s = struct_symSX([])
      x = struct_symSX(entry("x",Sparsity.diag(4)))
      x["x",0,index[:]]

  r   c                 "    || _         || _        d S r   )prepend	delegater)rT   rG  rF  s      r   rg   zDelegaterConstructor.__init__C  s    DLDNNNr   c                 <    |                      | j        |z             S r   )rG  rF  r9  s     r   r_   z DelegaterConstructor.__getitem__G  s    >>$,,---r   N)r   )ra   rb   rc   rm   rg   rX   r_   r   r   r   rD  rD  9  sM             . . =. . .r   rD  c                   *    e Zd Zed             Zd ZdS )rS  c                     | j         j        S r   )r   rO   r   s    r   rO   zDataReference.shapeO  s    6<r   c                 4    | j                                         S r   )r   r   r   s    r   r   zDataReference.dimS  s    6::<<r   N)ra   rb   rc   r  rO   r   r   r   r   rS  rS  N  s<          8    r   rS  c                        e Zd Zd Zd Zd ZdS )r   c                     |                                 sJ || _        || _        |                    ||                                z  df          | _        d S r  )rr  r   r   rN   r  r   rT   r   r   s      r   rg   zDataReferenceRepeated.__init__X  sJ    ::<<<DFDFYY!''))A''DFFFr   c                     || j         j        |<   | j                                                                        }| j         j        |         | j        j        |<   d S r   r   r  r   r!  findrT   r   r%   Is       r   r7  z!DataReferenceRepeated.__setitem__^  E    DFIaL  A69Q<DFIaLLLr   c                 &    | j         j        |         S r   r   r  rT   r   s     r   r_   z!DataReferenceRepeated.__getitem__c      69Q<r   Nra   rb   rc   rg   r7  r_   r   r   r   r   r   W  sA        ( ( (     
    r   r   c                   6    e Zd Zd Zd Zd Zed             ZdS )r  c                 \    |                                 sJ || _        || _        || _        d S r   )rr  r   r   r   rN  s      r   rg   zDataReferenceSquared.__init__g  s.    ::<<<DFDFDFFFr   c                 $    || j         j        |<   d S r   r   r  rT   r   r%   s      r   r7  z DataReferenceSquared.__setitem__m      DFIaLLLr   c                 &    | j         j        |         S r   r]  rW  s     r   r_   z DataReferenceSquared.__getitem__p  rX  r   c                 $    | j         | j         z  dfS r  r   r   s    r   rO   zDataReferenceSquared.shapes      F46M!r   N)ra   rb   rc   rg   r7  r_   r  rO   r   r   r   r  r  f  s\                 8  r   r  c                   B    e Zd Zd Zd Zd Zed             Zd Zd Z	dS )r  c                 j    |                                 sJ || _        || _        || _        || _        d S r   )rr  r   r   r   rI  )rT   r   r   rI  s       r   rg   zDataReferenceProduct.__init__x  s5    ::<<<DFDFDFDFFFr   c                 $    || j         j        |<   d S r   r]  r^  s      r   r7  z DataReferenceProduct.__setitem__  r_  r   c                 &    | j         j        |         S r   r]  rW  s     r   r_   z DataReferenceProduct.__getitem__  rX  r   c                 $    | j         | j        z  dfS r  )r   rI  r   s    r   rO   zDataReferenceProduct.shape  rc  r   c                     | j         S r   rb  r   s    r   r  zDataReferenceProduct.size1  	    6Mr   c                     | j         S r   )rI  r   s    r   r$  zDataReferenceProduct.size2  rj  r   N)
ra   rb   rc   rg   r7  r_   r  rO   r  r$  r   r   r   r  r  w  sz                 8      r   r  c                        e Zd Zd Zd Zd ZdS )r  c                     |                                 sJ || _        || _        || _        |                    ||z  |z  df          | _        d S r  )rr  r   r   NrN   r   )rT   r   r   rn  s       r   rg   z%DataReferenceSquaredRepeated.__init__  sM    ::<<<DFDFDFYY!Aay!!DFFFr   c                     || j         j        |<   | j                                                                        }| j         j        |         | j        j        |<   d S r   rP  rR  s       r   r7  z(DataReferenceSquaredRepeated.__setitem__  rT  r   c                 &    | j         j        |         S r   rV  rW  s     r   r_   z(DataReferenceSquaredRepeated.__getitem__  rX  r   NrY  r   r   r   r  r    sA        " " "     
    r   r  c                 P    dd l }|                    t          | d                    S )Nr   rb)rg  loadri  )rk  rg  s     r   struct_loadrt    s'    MMM;;tHT**+++r   r   )NNF)OrM   numpyr	   operatorsysversion_inforG   __builtin__collectionsCallabler   abcr   r   r   r   r$   r-   r8   r:   r=   rB   rI   rP   rX   r^   rZ   re   rj   rl   
nesteddictrq   rs   objectr   r   r   r  r  r-  r3  r=  r  rA  r^  r)  r  r  r\   r$  r  r  r  r  r   r   r   r	  struct_symSXstruct_symMX	struct_SXstruct_MX_mutable	struct_MXrv   r   r  r  r<  r=  r;  rD  r>   indexfrS  r   r  r  r  rt  r   r   r   <module>r     s  0          



v////(    &!((&_%(((7 7 7  3 3 3 & % %@ @ @7 7 7 7	 	 	% % %` ` `    ' ' '
  $ $ $ $ $t $ $ $# # # # # # # #         
   

 
 
oP oP oP oP oP oP oP oPbZS ZS ZS ZS ZS ZS ZS ZSz	 	 	 	 	 	 	 	n n n n n n n n`R R R R Rz R R R8&j &j &j &j &jz &j &j &jPh h h h h h h h
\ \ \ \ \ \ \ \	 	 	   02B 2B 2B 2B 2B 2B 2B 2BhC C C C C C C CiL iL iL iL iLi 8 iL iL iLV$ $ $ $ $ $ $ $<%. %. %. %. %.z": %. %. %.N    Y       !.   ,U U U U U U U UB    !.1C   (    #N>   6    |   ,    |       |.   1 1 1 1 1%n 1 1 1h 	 		 	Xr Xr Xr Xr Xr Xr Xr Xrv+ + +
c c c c c c c c@       * * * * *Y * * ** * * * * * * *
. . . . . . . .$ 
	n	-	-		0	1	1           M       =   "    =   0    =    , , , , ,s	   4 A