o
    biE"                     @   s   d dl 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d	Z
d&d
dZdd Zdd Zdd Zdd Zdd Zd'ddZd(ddZdd Zd&ddZd)d d!Zd*d"d#Zd&d$d%ZdS )+    N)config)standardize_dtype)dtypes)cast)convert_to_tensorFc                 C   s.   t j| }t j|d}|rt j|S |S )NCholesky)tflinalgcholesky	debuggingcheck_numericsadjoint)aupperout r   W/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/backend/tensorflow/linalg.pyr
   
   s
   r
   c                 C   sZ   t jt | d | jd}t jj| || d}|r#t j||dd}|S t j||dd}|S )N)num_rowsdtypelowerT)transpose_b)transpose_a)r   eyeshaper   r	   triangular_solvematmul)r   r   identityinv_chola_invr   r   r   cholesky_inverse   s   r!   c                 C      t j| S N)r   r	   detr   r   r   r   r$         r$   c                 C   r"   r#   )r   r	   eigr%   r   r   r   r'   !   r&   r'   c                 C   r"   r#   )r   r	   eighr%   r   r   r   r(   %   r&   r(   c                 C   r"   r#   )r   r	   invr%   r   r   r   r)   )   r&   r)   c                 C   s    t j| \}}|t j|fS r#   )r   r	   lumathinvert_permutation)r   r*   pr   r   r   	lu_factor-   s   r.   c                    sX  ddl m} t| } | j}|j |d u rtt }nt|tr#|f}t	 fdd|D r8t
d  d| t|dkrB|d n|}t|trKdnt|}t| jdkr[t }nt| jt}t| |} |dkr|d u ss|d	krttj| tj|  ||d
S |tdkrtjjtj| ||d
S |tdkrtjjtj| ||d
S |dkrtjjtjt| d| jd||d
S t|trt
d| t|| jd}tjjttj| |||d
}t|d| S |d	kr%|d |d }	}
|	dk r|	  n|	}	|
dk r|
  n|
}
|d u s|dkr,ttj| tj|  ||d
S |dkrR|s=|
|	kr=|
d8 }
tjjtjtj| |	|d
|
|d
} | S |dkrx|sc|
|	krc|
d8 }
tjjtjtj| |	|d
|
|d
} | S |tdkr|s|	|
kr|	d8 }	tjjtjtj| |
|d
|	|d
} | S |tdkr|s|	|
kr|	d8 }	tjjtjtj| |
|d
|	|d
} | S |dv r|| |d} |dkrtjjtjj | dddd} n"|d	krtjjtjj | dddd} ntjjtjj | dddd} |rt!| |d } t!| |d } | S t
d| t
d| )Nr   )moveaxisc                 3   s"    | ]}|  k p| kV  qd S r#   r   ).0r   ndimr   r   	<genexpr>=   s     znorm.<locals>.<genexpr>zPAll `axis` values must be in the range [-ndim, ndim). Received inputs with ndim=z, while axis=   int64   )axiskeepdimsinfz-infr   z6Invalid `ord` argument for vector norm. Received: ord=g      ?fror   )nucr6   )r=   r   r=   F)
compute_uvr7   z6Invalid `ord` argument for matrix norm. Received: ord=z$Invalid axis values. Received: axis=)""keras.src.backend.tensorflow.numpyr/   r   r   ranktuplerange
isinstanceintany
ValueErrorlenr   r   r   floatxr   result_typefloatr   r   sqrt
reduce_sumr+   conj
reduce_maxabs
reduce_min	not_equalstrpowr	   svdexpand_dims)xordr7   r8   r/   x_shapenum_axesr   r   row_axiscol_axisr   r1   r   norm2   s   





2
*"


r]   reducedc                 C   s:   |dvrt d| |dkrtj| S tjj| ddS )N>   r^   completez]`mode` argument value not supported. Expected one of {'reduced', 'complete'}. Received: mode=r^   Tfull_matrices)rG   r   r	   qr)rW   moder   r   r   rb      s   rb   c                 C   sH   |j j| j jd krtj|dd}tjtj| |ddS tj| |S )Nr4   r   r?   )r   ndimsr   rV   squeezer	   solve)r   br   r   r   rf      s   rf   c                 C   sP   |j j| j jd krtj|dd}tjtjj| ||dddS tjj| ||dS )Nr4   r   r?   r   )r   rd   r   rV   re   r	   r   )r   rg   r   r   r   r   solve_triangular   s   rh   Tc                 C   sD   |du rt jj| |ddS t jj| ||d\}}}||t j|fS )NF)ra   r>   )r   r	   rU   r   )rW   ra   r>   suvr   r   r   rU      s   rU   c                 C   s  t | } t |}| jd |jd krtd|j}|dkr%|d d d f }| jdkr2t| j d|jdkr?t|j d| j\}}| j}tjj	|j
}| jdkrntjd| jd}tj|g|jdd  R | jd}	ne|d u rz|t|| }n	t|dk ||}t| d	d
\}
}}|tj ||jd|d  k}tjt||d| jd}t|d| dd d tjf }tttj|
|}tttj||| }	|dkrt|	dg}	|	S )Nr   z-Leading dimensions of input arrays must matchr4   r6   z7-dimensional array given. Array must be two-dimensionalz>-dimensional array given. Array must be one or two-dimensionalr   r:   Fr`   r   )r   r   rG   r2   	TypeErrorr   r   experimentalnumpyfinfoepszerosmaxwhererU   r   newaxisr   	transposer+   rN   reshape)r   rg   rcondb_orig_ndimmnr   rp   ri   rW   rj   vtmasksafe_ss_invu_t_br   r   r   lstsq   sB   





$ r   c                    s   t j|}t j|}dd t||D }t j||$ |r'| | \}}n| | }t j|} fdd|D }	W d    n1 sDw   Y  t j||	}
|rW||
|fS ||
fS )Nc                 S   s   g | ]\}}t ||jqS r   )r   r   r   )r0   tr-   r   r   r   
<listcomp>   s    zjvp.<locals>.<listcomp>c                    s   g | ]}  |qS r   )jvp)r0   poaccr   r   r     s    )r   nestflattenzipautodiffForwardAccumulatorpack_sequence_as)funprimalstangentshas_auxprimal_flattangent_flatprimals_outauxprimals_out_flattangents_out_flattangents_outr   r   r   r      s    	
r   )F)NNF)r^   )TTr#   )
tensorflowr   keras.src.backendr   r   keras.src.backend.commonr   !keras.src.backend.tensorflow.corer   r   r
   r!   r$   r'   r(   r)   r.   r]   rb   rf   rh   rU   r   r   r   r   r   r   <module>   s(    

	


y

	
	(