
    Qii                        d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+ ed             Z,e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e           de defd            Z.e,-                    e          dedefd            Z.e,-                    e	          de	defd            Z.e,-                    e#          de#defd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd            Z.e,-                    e          dedefd             Z.e,-                    e)          de)defd!            Z.d" Z/dS )#    N)reducesingledispatch)Expr)S)HadamardProduct)Inverse)
MatrixExprMatrixSymbol)Identity	OneMatrix)	Transpose)
_af_invert)ElementwiseApplyFunction)
_ArrayExpr	ZeroArrayArraySymbolArrayTensorProductArrayAddPermuteDimsArrayDiagonalArrayElementwiseApplyFuncget_rank	get_shapeArrayContraction_array_tensor_product_array_contraction_array_diagonal
_array_add_permute_dimsReshape)convert_matrix_to_arrayc                 @    t          dt          |                      )z8
    Derivatives (gradients) for array expressions.
    znot implemented for type )NotImplementedErrortypeexprxs     /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/sympy/tensor/array/expressions/arrayexpr_derivatives.pyarray_deriver)      s!    
 F$t**FF
G
GG    r&   r'   c                     t          |j         S Nr   shaper%   s     r(   _r/      s    agr*   c                    | j         }g }t          | j                   D ]\  }}t          ||          }|dk    r|d |         }||dz   d          }t          t          j        t          t          |          d          }	t          t          j        t          t          |          d          }
t          g |||R  }t          t          |                    }|t          |	          z   }|t          t          |                    z   }|t          |
          z   }t          t          ||                    t          t          |                    z   t          t          ||                    z   t          t          ||                    z   }t          |t          |                    }|                    |           t          |          dk    r|d         S t          |          dk    rt          j        S t#          | S )Nr       )args	enumerater)   r   operatoraddmapr   r   lenlistranger   r   appendr   Zeror   )r&   r'   r3   addend_listiargdarg	args_prev	args_succ
shape_prev
shape_succaddendtot1tot2tot3tot4perms                    r(   r/   r/   "   s   9DKDI&& # #3C##199!H	1J	HL#i*C*CRHH
HL#i*C*CRHH
&D	D4D)DDD9Q<<  c*oo%c)C..)))c*oo%E$%%&&E$KK  !#'dD(9(9#:#:;E$%%&&' vz$'7'7886""""
;11~	[		Q		v;''r*   c           
      F   | |k    rt          t          j        d | j        D                       d t	          t          | j                            D             d t	          t          | j                            D             z             S t          |j        | j        z    S )Nc              3   4   K   | ]}t          |          V  d S r,   )r   .0r>   s     r(   	<genexpr>z_.<locals>.<genexpr>D   s(      'H'H'H'H'H'H'H'Hr*   c                     g | ]}d |z  S    r2   rM   s     r(   
<listcomp>z_.<locals>.<listcomp>E   s    111QQqS111r*   c                     g | ]
}d |z  dz   S )rR   r1   r2   rM   s     r(   rS   z_.<locals>.<listcomp>E   s     4[4[4[qQqSU4[4[4[r*   )r   r   fromiterr.   r:   r8   r   r%   s     r(   r/   r/   @   s    qyy''H'HTZ'H'H'HHH11%DJ001114[4[E#dj//DZDZ4[4[4[[
 
 	
 qw+--r*   c                     | j         \  }}| |k    r:t          t          t          |          t          |                    g d          S t	          |j         | j         z    S )N)r   rR   r1      )r.   r   r   r   r   )r&   r'   mns       r(   r/   r/   J   s^    :DAqqyy!(1++x{{;;LL
 
 	
 qw+--r*   c                 .    t          |j        | j        z    S r,   r-   r%   s     r(   r/   r/   U       qw+--r*   c                 .    t          |j        | j        z    S r,   r-   r%   s     r(   r/   r/   Z   r[   r*   c                 P    t          | j        |          }t          |g d          S )N)r   r1   rW   rR   )r)   r?   r   )r&   r'   fds      r(   r/   r/   _   s)     
dh	"	"B\\\***r*   c                     | j         }t          ||          }t          |  ||           }t          |dd          }t	          |g d          }|S )N)r1      )      )r1   rR   r   rW   )Ir)   r   r   r   )r&   r'   matdexprtpmppps          r(   r/   r/   g   sT    
&Ca  E	ueT	2	2B	B	/	/B	r<<<	(	(BIr*   c                    t          |           dk    sJ t          |          dk    sJ |                                 }t          | j        |          }t	          t          || j                  |          }t          |dd          }|S )NrR   )r   r`   )r1   ra   )r   _get_function_fdiffr)   r&   r   r   r   )r&   r'   fdiffre   rf   tds         r(   r/   r/   q   s    D>>QA;;!$$&&EA&&E	 	22
 
B 

FF
 
B Ir*   c                 &   |                                  }| j        }t          ||          }t          |t	          ||                    }t          |          t          |           fdt                    D             }t          |g|R  S )Nc                 *    g | ]}|z   z   |z   fS r2   r2   )rN   r>   bcs     r(   rS   z_.<locals>.<listcomp>   s*    9991QUAEAI&999r*   )rj   r&   r)   r   r   r   r:   r   )	r&   r'   rk   subexprdsubexprrf   diag_indicesro   rp   s	          @@r(   r/   r/      s    $$&&EiGGQ''H	!%11
 
B 	AA99999a999L2-----r*   c                 @    t          |           }t          ||          S r,   )r!   r)   )r&   r'   cgs      r(   r/   r/      s    	 	&	&BAr*   c                     t                      r,   )r#   r%   s     r(   r/   r/      s    


r*   c                     t          | j        |          }t          t          |                    | j        }fd|D             }t          |g|R  S )Nc                 F    g | ]}t          fd |D                       S )c              3   "   K   | ]	}|z   V  
d S r,   r2   rN   jrank_xs     r(   rO   z_.<locals>.<listcomp>.<genexpr>   s'      $;$;AQZ$;$;$;$;$;$;r*   )tuplerN   r>   r|   s     r(   rS   z_.<locals>.<listcomp>   s6    YYYu$;$;$;$;$;$;$;;;YYYr*   )r)   r&   r8   r   contraction_indicesr   )r&   r'   r^   r   new_contraction_indicesr|   s        @r(   r/   r/      sb    	di	#	#B1F2YYYYEXYYYb;#:;;;;r*   c                     t          | j        |          }t          t          |                    fd| j        D             }t          |g|R  S )Nc                 ,    g | ]}fd |D             S )c                     g | ]}|z   S r2   r2   rz   s     r(   rS   z _.<locals>.<listcomp>.<listcomp>   s    +++AQZ+++r*   r2   r~   s     r(   rS   z_.<locals>.<listcomp>   s.    KKK+++++++KKKr*   )r)   r&   r8   r   diagonal_indicesr   )r&   r'   rr   rs   r|   s       @r(   r/   r/      sY    DIq))H1FKKKKT5JKKKL83l3333r*   c                 8    t          fd| j        D              S )Nc                 0    g | ]}t          |          S r2   )r)   )rN   r?   r'   s     r(   rS   z_.<locals>.<listcomp>   s#    BBBS!,,BBBr*   )r   r3   r%   s    `r(   r/   r/      s%    BBBB	BBBCCr*   c                     t          | j        |          }ddgd | j        j        D             z   }t	          ||          S )Nr   r1   c                     g | ]}|d z   S rQ   r2   rM   s     r(   rS   z_.<locals>.<listcomp>   s    @@@qQU@@@r*   )r)   r&   permutation
array_formr   )r&   r'   derJ   s       r(   r/   r/      sF    	di	#	#Bq6@@D$4$?@@@@DT"""r*   c                 v    t          | j        |          }t          |t          |          | j        z             S r,   )r)   r&   r    r   r.   )r&   r'   r   s      r(   r/   r/      s0    	di	#	#B2y||dj0111r*   c                     ddl m} t          |           }t          ||          } ||                                          S )Nr   )convert_array_to_matrix)3sympy.tensor.array.expressions.from_array_to_matrixr   r!   r)   doit)r&   r'   r   cedces        r(   matrix_deriver      sM    [[[[[[	 	&	&B
r1

C""3'',,...r*   )0r5   	functoolsr   r   sympy.core.exprr   sympy.core.singletonr   #sympy.matrices.expressions.hadamardr   "sympy.matrices.expressions.inverser   "sympy.matrices.expressions.matexprr	   r
   "sympy.matrices.expressions.specialr   r   $sympy.matrices.expressions.transposer    sympy.combinatorics.permutationsr   $sympy.matrices.expressions.applyfuncr   0sympy.tensor.array.expressions.array_expressionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    3sympy.tensor.array.expressions.from_matrix_to_arrayr!   r)   registerr/   r   r2   r*   r(   <module>r      s    , , , , , , , ,             " " " " " " ? ? ? ? ? ? 6 6 6 6 6 6 I I I I I I I I B B B B B B B B : : : : : : 7 7 7 7 7 7 I I I I I I9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
 X W W W W W H H H tD Z     )**( (4 ( ( ( +*(: {##.K .J . . . $#. |$$.L .Z . . . %$. x  .H . . . . ! . y!!.I .* . . . "!. y!!+I +$ + + + "!+ wG       /00$     10 011.% .$ . . . 21. z""J 4    #"
 '' O         ('  '((< < < < < )(< }%%4M 4d 4 4 4 &%4 x  DH D D D D ! D {###K #D # # # $## w2G 2 2 2 2  2
/ / / / /r*   