o
    *ήc                     @   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 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-d#d$ Z.dS )%    N)reducesingledispatch)Expr)S)HadamardProduct)Inverse)
MatrixExprMatrixSymbolIdentity)	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|  )Nznot implemented for type )NotImplementedErrortypeexprx r&   [/tmp/pip-target-vg8gfxp4/lib/python/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   sT  | 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	|
 }dd t
||D dd t
|D  dd t
||D  dd t
||D  }t|t|}|| q
t	|dkr|d S t	|dkrtjS t| S )Nr      r&   c                 S      g | ]}|qS r&   r&   .0ir&   r&   r'   
<listcomp>0       _.<locals>.<listcomp>c                 S   r.   r&   r&   r/   r&   r&   r'   r2   1   r3   c                 S   r.   r&   r&   r/   r&   r&   r'   r2   2   r3   )args	enumerater(   r   operatoraddmapr   r   lenranger   r   appendr   Zeror   )r$   r%   r5   addend_listr1   argdarg	args_prev	args_succ
shape_prev
shape_succaddendtot1tot2tot3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
   r/   r&   r&   r'   	<genexpr>A       z_.<locals>.<genexpr>c                 S   s   g | ]}d | qS    r&   r/   r&   r&   r'   r2   B       r4   c                 S   s   g | ]}d | d qS )rN   r-   r&   r/   r&   r&   r'   r2   B   s    )r   r   fromiterr+   r;   r:   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   rN   r-      )r+   r   r   r   r   )r$   r%   mnr&   r&   r'   r,   G   s   
c                 C   s   t |j| j  S r)   r*   r#   r&   r&   r'   r,   R   s   c                 C   s   t | j|}t|g dS )N)r   r-   rQ   rN   )r(   r?   r   )r$   r%   fdr&   r&   r'   r,   W   s   c                 C   s<   | j }t||}t|  || }t|dd}t|g d}|S )N)r-      )      )r-   rN   r   rQ   )Ir(   r   r   r   )r$   r%   matdexprtpmpppr&   r&   r'   r,   _   s   
c                 C   sV   t | dksJ t |dksJ |  }t| j|}tt|| j|}t|dd}|S )NrN   )r   rU   )r-   rV   )r   _get_function_fdiffr(   r$   r   r   r   )r$   r%   fdiffrZ   r[   tdr&   r&   r'   r,   i   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'   r2      s     r4   )r^   r$   r(   r   r   r   r;   r   )r$   r%   r_   subexprdsubexprr[   diag_indicesr&   ra   r'   r,   y   s   
c                 C   s   t | }t||S r)   )r    r(   )r$   r%   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&   r0   jrank_xr&   r'   rK      rL   z_.<locals>.<listcomp>.<genexpr>)tupler/   rj   r&   r'   r2      s   " r4   )r(   r$   r:   r   contraction_indicesr   )r$   r%   rT   rm   new_contraction_indicesr&   rj   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&   rh   rj   r&   r'   r2      rO   z _.<locals>.<listcomp>.<listcomp>r&   r/   rj   r&   r'   r2      s    r4   )r(   r$   r:   r   diagonal_indicesr   )r$   r%   re   rf   r&   rj   r'   r,      s   c                    s   t  fdd| jD  S )Nc                    s   g | ]}t | qS r&   )r(   )r0   r?   r%   r&   r'   r2      s    r4   )r   r5   r#   r&   rp   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 rM   r&   r/   r&   r&   r'   r2      rO   r4   )r(   r$   permutation
array_formr   )r$   r%   derJ   r&   r&   r'   r,      s   
c                 C   s    t | j|}t|t|| j S r)   )r(   r$   r   r   r+   )r$   r%   rs   r&   r&   r'   r,      s   c                 C   s*   ddl m} t| }t||}|| S )Nr   )convert_array_to_matrix)3sympy.tensor.array.expressions.conv_array_to_matrixrt   r    r(   doit)r$   r%   rt   cedcer&   r&   r'   matrix_derive   s   
ry   )/r7   	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   $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.conv_matrix_to_arrayr    r(   registerr,   ry   r&   r&   r&   r'   <module>   s`    L
	
	