o
    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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&   h/var/www/vscode/kcb/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   Zeror   )r$   r%   r.   addend_listi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
   .0r9   r&   r&   r'   	<genexpr>D       z_.<locals>.<genexpr>c                 S   s   g | ]}d | qS    r&   rF   r&   r&   r'   
<listcomp>E       _.<locals>.<listcomp>c                 S   s   g | ]}d | d qS )rK   r-   r&   rF   r&   r&   r'   rL   E   s    )r   r   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   rK   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   rS   r)   r*   r#   r&   r&   r'   r,   Z   rT   c                 C   s   t | j|}t|g dS )N)r   r-   rP   rK   )r(   r:   r   )r$   r%   fdr&   r&   r'   r,   _   s   c                 C   s<   | j }t||}t|  || }t|dd}t|g d}|S )N)r-      )      )r-   rK   r   rP   )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 )NrK   )r   rV   )r-   rW   )r   _get_function_fdiffr(   r$   r   r   r   )r$   r%   fdiffr[   r\   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&   rF   bcr&   r'   rL      s     rN   )r_   r$   r(   r   r   r   r5   r   )r$   r%   r`   subexprdsubexprr\   diag_indicesr&   rb   r'   r,      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&   rG   jrank_xr&   r'   rH      rI   z_.<locals>.<listcomp>.<genexpr>)tuplerF   rk   r&   r'   rL      s   " rN   )r(   r$   r3   r   contraction_indicesr   )r$   r%   rU   rn   new_contraction_indicesr&   rk   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&   ri   rk   r&   r'   rL      rM   z _.<locals>.<listcomp>.<listcomp>r&   rF   rk   r&   r'   rL      s    rN   )r(   r$   r3   r   diagonal_indicesr   )r$   r%   rf   rg   r&   rk   r'   r,      s   c                    s   t  fdd| jD  S )Nc                    s   g | ]}t | qS r&   )r(   )rG   r:   r%   r&   r'   rL      s    rN   )r   r.   r#   r&   rq   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 rJ   r&   rF   r&   r&   r'   rL      rM   rN   )r(   r$   permutation
array_formr   )r$   r%   derE   r&   r&   r'   r,      s   
c                 C   s    t | j|}t|t|| j S r)   )r(   r$   r   r   r+   )r$   r%   rt   r&   r&   r'   r,      s   c                 C   s*   ddl m} t| }t||}|| S )Nr   )convert_array_to_matrix)3sympy.tensor.array.expressions.from_array_to_matrixru   r    r(   doit)r$   r%   ru   cedcer&   r&   r'   matrix_derive   s   
rz   )0r0   	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,   rz   r&   r&   r&   r'   <module>   sd    L
	
	