U
    L?hi                     @   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eedddZ.e,-eeedddZ.e,-eeedddZ.e,-eeedddZ.e,-eeedddZ.e,-eeedddZ.e,-eeedddZ.e,-eeedddZ.e,-eeedddZ.e,-e e edddZ.e,-eeedddZ.e,-e	e	edddZ.e,-e#e#edddZ.e,-eeedddZ.e,-eeedd dZ.e,-eeedd!dZ.e,-e)e)ed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|  dS )z8
    Derivatives (gradients) for array expressions.
    znot implemented for type N)NotImplementedErrortypeexprx r&   f/var/www/html/venv/lib/python3.8/site-packages/sympy/tensor/array/expressions/arrayexpr_derivatives.pyarray_derive   s    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r0q|d | }||d d  }ttjtt|d}	ttjtt|d}
t||f| }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r2tjS t| S d 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rPt 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   s     z_.<locals>.<genexpr>c                 S   s   g | ]}d | qS    r&   r;   r&   r&   r'   
<listcomp>E   s     _.<locals>.<listcomp>c                 S   s   g | ]}d | d qS )r?   r-   r&   r;   r&   r&   r'   r@   E   s     )r   r   Zfromiterr+   r5   r3   r   r#   r&   r&   r'   r,   @   s    .c                 C   sB   | j \}}| |kr2ttt|t|ddddgS t|j | j   S )Nr   r?   r-      )r+   r   r   r
   r   )r$   r%   mnr&   r&   r'   r,   J   s    

c                 C   s   t |j| j  S r)   r*   r#   r&   r&   r'   r,   U   s    c                 C   s   t |j| j  S r)   r*   r#   r&   r&   r'   r,   Z   s    c                 C   s   t | j|}t|ddddgS )Nr   r-   rB   r?   )r(   r8   r   )r$   r%   fdr&   r&   r'   r,   _   s    c                 C   s@   | j }t||}t|  || }t|dd}t|ddddg}|S )N)r-      )      r-   r?   r   rB   )Ir(   r   r   r   )r$   r%   Zmatdexprtpmpppr&   r&   r'   r,   g   s    
c                 C   sV   t | dkstt |dks t|  }t| j|}tt|| j|}t|dd}|S )Nr?   )r   rF   )r-   rG   )r   AssertionError_get_function_fdiffr(   r$   r   r   r   )r$   r%   fdiffrJ   rK   tdr&   r&   r'   r,   q   s    
  c                    s^   |   }| j}t||}t|t||}t| t|  fddtD }t|f| S )Nc                    s    g | ]} |   | fqS r&   r&   r;   bcr&   r'   r@      s     rA   )rO   r$   r(   r   r   r   r5   r   )r$   r%   rP   ZsubexprdsubexprrK   diag_indicesr&   rR   r'   r,      s    
c                 C   s   t | }t||S r)   )r    r(   )r$   r%   Zcgr&   r&   r'   r,      s    c                 C   s
   t  d S r)   )r!   r#   r&   r&   r'   r,      s    c                    s>   t | j|}tt| | j} fdd|D }t|f| 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=      s     z_.<locals>.<listcomp>.<genexpr>)tupler;   rY   r&   r'   r@      s     rA   )r(   r$   r3   r   contraction_indicesr   )r$   r%   rE   r[   Znew_contraction_indicesr&   rY   r'   r,      s
    c                    s:   t | j|}tt|  fdd| jD }t|f| S )Nc                    s   g | ]} fd d|D qS )c                    s   g | ]}|  qS r&   r&   rW   rY   r&   r'   r@      s     z _.<locals>.<listcomp>.<listcomp>r&   r;   rY   r&   r'   r@      s     rA   )r(   r$   r3   r   Zdiagonal_indicesr   )r$   r%   rU   rV   r&   rY   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'   r@      s     rA   )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'   r@      s     rA   )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%   r]   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_matrixr^   r    r(   Zdoit)r$   r%   r^   ZceZdcer&   r&   r'   matrix_derive   s    
r_   )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,   r_   r&   r&   r&   r'   <module>   sb   L
	
	