o
    GZhi                     @   s  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d Z,e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-ededefddZ.e,-e de defddZ.e,-ededefddZ.e,-e	de	defddZ.e,-e#de#defddZ.e,-ededefd dZ.e,-ededefd!dZ.e,-ededefd"dZ.e,-e)de)defd#dZ.d$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                 C   s   t dt|  )z8
    Derivatives (gradients) for array expressions.
    znot implemented for type )NotImplementedErrortypeexprx r&   c/var/www/auris/lib/python3.10/site-packages/sympy/tensor/array/expressions/arrayexpr_derivatives.pyarray_derive   s   r(   r$   r%   c                 C   s
   t |j S Nr   shaper#   r&   r&   r'   _   s   
r,   c                 C   s<  | j }g }t| j D ]|\}}t||}|dkrq
|d | }||d d  }ttjtt|d}	ttjtt|d}
tg |||R  }t	t|}|t	|	 }|t	t| }|t	|
 }t
t||t
t| t
t|| t
t|| }t|t|}|| q
t	|dkr|d S t	|dkrtjS t| S )Nr      r&   )args	enumerater(   r   operatoraddmapr   r   lenlistranger   r   appendr   ZZeror   )r$   r%   r.   Zaddend_listiargZdargZ	args_prevZ	args_succZ
shape_prevZ
shape_succaddendZtot1Ztot2Ztot3Ztot4permr&   r&   r'   r,   "   s:   

c                 C   s`   | |kr(t tdd | jD dd tt| jD dd tt| jD  S t|j| j  S )Nc                 s   s    | ]}t |V  qd S r)   )r
   .0r7   r&   r&   r'   	<genexpr>D       z_.<locals>.<genexpr>c                 S   s   g | ]}d | qS    r&   r;   r&   r&   r'   
<listcomp>E       _.<locals>.<listcomp>c                 S   s   g | ]}d | d qS )r@   r-   r&   r;   r&   r&   r'   rA   E   s    )r   r   Zfromiterr+   r5   r3   r   r#   r&   r&   r'   r,   @   s   .c                 C   s>   | j \}}| |krttt|t|g dS t|j | j   S )N)r   r@   r-      )r+   r   r   r
   r   )r$   r%   mnr&   r&   r'   r,   J   s   
c                 C      t |j| j  S r)   r*   r#   r&   r&   r'   r,   U      c                 C   rG   r)   r*   r#   r&   r&   r'   r,   Z   rH   c                 C   s   t | j|}t|g dS )N)r   r-   rD   r@   )r(   r8   r   )r$   r%   fdr&   r&   r'   r,   _   s   c                 C   s<   | j }t||}t|  || }t|dd}t|g d}|S )N)r-      )      )r-   r@   r   rD   )Ir(   r   r   r   )r$   r%   matdexprtpmpppr&   r&   r'   r,   g   s   
c                 C   sV   t | dksJ t |dksJ |  }t| j|}tt|| j|}t|dd}|S )Nr@   )r   rJ   )r-   rK   )r   _get_function_fdiffr(   r$   r   r   r   )r$   r%   fdiffrO   rP   tdr&   r&   r'   r,   q   s   
c                    s`   |   }| j}t||}t|t||}t| t|  fddtD }t|g|R  S )Nc                    s    g | ]} |   | fqS r&   r&   r;   bcr&   r'   rA      s     rC   )rS   r$   r(   r   r   r   r5   r   )r$   r%   rT   ZsubexprdsubexprrP   diag_indicesr&   rV   r'   r,      s   
c                 C   s   t | }t||S r)   )r    r(   )r$   r%   Zcgr&   r&   r'   r,      s   
c                 C   s   t  r)   )r!   r#   r&   r&   r'   r,      s   c                    s@   t | j|}tt| | j} fdd|D }t|g|R  S )Nc                    s"   g | ]}t  fd d|D qS )c                 3   s    | ]}|  V  qd S r)   r&   r<   jZrank_xr&   r'   r=      r>   z_.<locals>.<listcomp>.<genexpr>)tupler;   r]   r&   r'   rA      s   " rC   )r(   r$   r3   r   contraction_indicesr   )r$   r%   rI   r_   Znew_contraction_indicesr&   r]   r'   r,      s
   c                    s<   t | j|}tt|  fdd| jD }t|g|R  S )Nc                    s   g | ]} fd d|D qS )c                    s   g | ]}|  qS r&   r&   r[   r]   r&   r'   rA      rB   z _.<locals>.<listcomp>.<listcomp>r&   r;   r]   r&   r'   rA      s    rC   )r(   r$   r3   r   Zdiagonal_indicesr   )r$   r%   rY   rZ   r&   r]   r'   r,      s   c                    s   t  fdd| jD  S )Nc                    s   g | ]}t | qS r&   )r(   )r<   r8   r%   r&   r'   rA      s    rC   )r   r.   r#   r&   r`   r'   r,      s   c                 C   s0   t | j|}ddgdd | jjD  }t||S )Nr   r-   c                 S   s   g | ]}|d  qS r?   r&   r;   r&   r&   r'   rA      rB   rC   )r(   r$   ZpermutationZ
array_formr   )r$   r%   der:   r&   r&   r'   r,      s   
c                 C   s    t | j|}t|t|| j S r)   )r(   r$   r   r   r+   )r$   r%   ra   r&   r&   r'   r,      s   c                 C   s*   ddl m} t| }t||}|| S )Nr   )convert_array_to_matrix)Z3sympy.tensor.array.expressions.from_array_to_matrixrb   r    r(   Zdoit)r$   r%   rb   ZceZdcer&   r&   r'   matrix_derive   s   
rc   )0r0   	functoolsr   r   Zsympy.core.exprr   Zsympy.core.singletonr   Z#sympy.matrices.expressions.hadamardr   Z"sympy.matrices.expressions.inverser   Z"sympy.matrices.expressions.matexprr   r	   Z"sympy.matrices.expressions.specialr
   r   Z$sympy.matrices.expressions.transposer   Z sympy.combinatorics.permutationsr   Z$sympy.matrices.expressions.applyfuncr   Z0sympy.tensor.array.expressions.array_expressionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z3sympy.tensor.array.expressions.from_matrix_to_arrayr    r(   registerr,   rc   r&   r&   r&   r'   <module>   sd    L
	
	