o
    *ήc                     @   s   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	 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 G dd deZdS )    )Optional)Expr)
Derivative)Integer)MatrixCommon   )	NDimArray)derive_by_array)
MatrixExpr)
ZeroMatrix_matrix_derivativec                       s   e Zd ZdZ fddZdd Zedd Zedd	 Z	e
d
d Ze
dd Ze
dd Ze
dd Ze
dd Ze
dd Ze
dd Ze fddZ  ZS )ArrayDerivativeFc                    s4   t  j| |g|R i |}t|tr| |_|S N)super__new__
isinstancer   
_get_shape_shape)clsexpr	variableskwargsobj	__class__ K/tmp/pip-target-vg8gfxp4/lib/python/sympy/tensor/array/array_derivatives.pyr      s   

zArrayDerivative.__new__c                 C   sR   d}| j D ]\}}t|drt|D ]}||j7 }qqt| jdr'|| jj7 }|S )Nr   shape)variable_counthasattrranger   r   )selfr   vcountir   r   r   r      s   
zArrayDerivative._get_shapec                 C   s   | j S r   )r   )r"   r   r   r   r   "   s   zArrayDerivative.shapec                 C   s6   t |ttfr|j|j S t |trt|j S td)Nz.Unable to determine shape of array-derivative.)r   r   r   zerosr   r
   r   RuntimeError)r   r   r   r   r   _get_zero_with_shape_like&   s
   

z)ArrayDerivative._get_zero_with_shape_likec                       |  fddS )Nc                    
     | S r   diffxr   r   r   <lambda>1      
 z?ArrayDerivative._call_derive_scalar_by_matrix.<locals>.<lambda>	applyfuncr   r#   r   r/   r   _call_derive_scalar_by_matrix/      z-ArrayDerivative._call_derive_scalar_by_matrixc                 C   s   |  |r
t| |S t|j S r   )hasr   r   r   r4   r   r   r   _call_derive_scalar_by_matexpr3   s   


z.ArrayDerivative._call_derive_scalar_by_matexprc                    r)   )Nc                    r*   r   r+   r-   r/   r   r   r0   <   r1   z>ArrayDerivative._call_derive_scalar_by_array.<locals>.<lambda>r2   r4   r   r/   r   _call_derive_scalar_by_array:   r6   z,ArrayDerivative._call_derive_scalar_by_arrayc                 C   s
   t | |S r   r   r4   r   r   r   _call_derive_matrix_by_scalar>      
z-ArrayDerivative._call_derive_matrix_by_scalarc                 C   s
   |  |S r   )_eval_derivativer4   r   r   r   _call_derive_matexpr_by_scalarB   r;   z.ArrayDerivative._call_derive_matexpr_by_scalarc                    s   |   fddS )Nc                    s
   |   S r   r+   r-   r#   r   r   r0   H   r1   z>ArrayDerivative._call_derive_array_by_scalar.<locals>.<lambda>r2   r4   r   r>   r   _call_derive_array_by_scalarF   r6   z,ArrayDerivative._call_derive_array_by_scalarc                 C   s   |  |r
t| |S d S r   )r7   r   r4   r   r   r   _call_derive_defaultJ   s   

z$ArrayDerivative._call_derive_defaultc                    sf  t |ttfr|dkdkrd S |jrCt |tr| ||}nt |tr*| ||}ntt |tr6| 	||}nh|jrAt
 |||S d S |jrlt |trR| ||}nLt |tr^| ||}n@t |trj| ||}n4d S t |tsvt |tr|t||}n"t |trt |tr| ||}nt |tst |trd S t||}|d u rd S |dkr|S | |||d S )Nr   Tr   )r   intr   	is_scalarr   r5   r
   r8   r   r9   r   !_dispatch_eval_derivative_n_timesr:   r=   r?   r	   r@   )r   r   r#   r$   resultr   r   r   rC   Q   s@   






z1ArrayDerivative._dispatch_eval_derivative_n_times)__name__
__module____qualname__rB   r   r   propertyr   classmethodr(   staticmethodr5   r8   r9   r:   r=   r?   r@   rC   __classcell__r   r   r   r   r      s0    









r   N)typingr   sympy.core.exprr   sympy.core.functionr   sympy.core.numbersr   sympy.matrices.commonr   
ndim_arrayr   arrayopr	   "sympy.matrices.expressions.matexprr
   "sympy.matrices.expressions.specialr   r   r   r   r   r   r   <module>   s    