a
    ÂÖ9]ó  ã                   @   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 eejeƒ ƒ dd	„ Zee
jd
ƒZdd„ Zeedd„ ƒ eedd„ ƒ dd„ Zeeeƒ dd„ Zeeeƒ dd„ Zeeeed ƒeedƒƒ d dd„Zeeeƒ d!dd„Zeeeƒ dd„ Zee eƒ d"dd„Z!ee"e!ƒ dS )#é    )Úabsolute_import)ÚpartialNé   )Úwrap_namespace)Únumpy_wrapper)Údefvjpc                 C   s   t  | dd¡S )Néÿÿÿÿéþÿÿÿ)ÚanpZswapaxes©Úx© r   úe/var/www/html/gerincmet/prog_calc/prog_calc/venv/lib/python3.9/site-packages/autograd/numpy/linalg.pyÚT   ó    r   z...ij,...jk->...ikc                 C   s   t  | t  | ¡d ¡S )N)r   r   )r
   ÚreshapeÚshaper   r   r   r   Úadd2d   r   r   c                    s   ‡ ‡fdd„S )Nc                    s   t | ƒt ˆ ƒ ttˆƒƒ S ©N©r   r   Úinv©Úg©Úansr   r   r   Ú<lambda>   r   ú<lambda>.<locals>.<lambda>r   r   r   r   r   r      r   r   c                    s   ‡ fdd„S )Nc                    s   t | d ƒttˆ ƒƒ S ©Nr   r   r   r   r   r   r      r   r   r   r   r   r   r   r      r   c                    s   ‡ fdd„S )Nc                    s   t t tˆ ƒ| ƒtˆ ƒƒ S r   )Ú_dotr   r   ©r   r   r   r      r   zgrad_inv.<locals>.<lambda>r   r   r   r   r   Úgrad_inv   s    r    c                    s   ‡ ‡fdd„S )Nc              	      sz   t ttˆ t | ƒƒˆ ƒ tttˆ t ˆ ƒƒ| ƒt ˆjd ¡tˆˆ ƒ ƒ tttt ˆ jd ¡tˆ ˆƒ | ƒt ˆ ƒƒˆ ƒ ƒS )Nr	   )r   r   r
   Úeyer   r   r   r   r   r   !   s   .ÿ.þÿzgrad_pinv.<locals>.<lambda>r   r   r   r   r   Ú	grad_pinv   s    r"   c                    s4   ‡ fdd„‰| dkr$‡ ‡‡fdd„S ‡ fdd„S d S )Nc                    s   | j ˆ j kr| S | d S )N).N)Úndimr   ©Úar   r   r   )   r   zgrad_solve.<locals>.<lambda>r   c                    s"   t ˆttˆ ƒ| ƒƒtˆˆƒƒƒ S r   )r   Úsolver   r   ©r%   r   Zupdimr   r   r   +   r   c                    s   t tˆ ƒ| ƒS r   ©r&   r   r   r$   r   r   r   -   r   r   )Zargnumr   r%   Úbr   r'   r   Ú
grad_solve(   s    r*   c                    sÖ   ‡‡‡fdd„}ˆd u r"dd„ ‰n>t ˆtƒrTˆ\‰‰ˆˆkrDˆd ‰‡‡fdd„‰n‡fdd„‰ˆdkr¶ˆd u r‚d	d„ ‰d
d„ ‰n4ˆ\‰‰ˆˆkršˆd ‰‡‡fdd„‰‡‡fdd„‰|ƒ  ‡ ‡‡‡‡‡fdd„}|S )Nc                     sj   ˆj dkrˆ d u ptˆ tƒ} | rHˆd u sfˆdksfˆdksftd ˆ¡ƒ‚nˆd u sfˆdksftd ˆ¡ƒ‚d S )Né   ÚfroÚnucz2Gradient of matrix norm not implemented for ord={}r   z+Gradient of norm not implemented for ord={})r#   Ú
isinstanceÚtupleÚNotImplementedErrorÚformat)Zmatrix_norm)ÚaxisÚordr   r   r   Úcheck_implemented1   s    ÿÿz$grad_norm.<locals>.check_implementedc                 S   s   | S r   r   r$   r   r   r   r   =   r   zgrad_norm.<locals>.<lambda>r   c                    s   t  t  | ˆ¡ˆ ¡S r   ©r
   Zexpand_dimsr$   ©Úcol_axisÚrow_axisr   r   r   B   s   
ÿÿc                    s   t j| ˆ dS )N©r2   r5   r$   r9   r   r   r   E   r   r-   c                 S   s   | S r   r   r$   r   r   r   r   I   r   c                 S   s   | S r   r   r$   r   r   r   r   J   r   c                    s    t  t  | ˆ | j¡ˆ| jd ¡S r   ©r
   Zrollaxisr#   r$   r6   r   r   r   P   s   
ÿc                    s$   t  t  | | jd ˆ¡| jd ˆ ¡S )Nr+   r   r:   r$   r6   r   r   r   S   s   
ÿc                    sŠ   ˆdv rˆ| ˆ  ƒˆ S ˆdkr\ˆˆƒ}t |dd\}}}t||ƒ}ˆ|ƒ}ˆ| ƒ} | | S ˆ| ˆ ˆd   ƒˆ t ˆ¡ˆd   S d S )N)Nr+   r,   r-   F©Úfull_matricesr   r+   )Úsvdr   r
   Úabs)r   Zx_rolledÚuÚsZvtZ
uvt_rolledZuvt)r   Úexpandr3   ÚrollÚunrollr   r   r   ÚvjpW   s    
zgrad_norm.<locals>.vjp)r.   r/   )r   r   r3   r2   r4   rD   r   )	r   r2   r7   rA   r3   rB   r8   rC   r   r   Ú	grad_norm0   s*    


rE   ÚLc                    s&   |j d ‰ | \‰‰‡ ‡‡fdd„}|S )z;Gradient for eigenvalues and vectors of a symmetric matrix.r   c                    sŽ   | \}}t jˆdt jf ˆ dd}t  ˆ ˆ f¡t  ˆ ¡ }|t|ƒ| t  ˆ ¡  }tˆ|dt jd d …f  tˆ|ttˆƒ|ƒ ƒ tˆƒƒS )N.r   r9   )r
   ÚrepeatÚnewaxisÚonesr!   r   r   )r   ZwgZvgZ
w_repeatedZoff_diagÚF©ÚNÚvÚwr   r   rD   l   s
    zgrad_eigh.<locals>.vjp)r   )r   r   ZUPLOrD   r   rK   r   Ú	grad_eighh   s    
rO   c                    s0   dd„ ‰dd„ ‰‡fdd„‰‡ ‡‡fdd„}|S )Nc                 S   s   t t| ƒ|ƒS r   r(   )r%   r)   r   r   r   r   z   r   zgrad_cholesky.<locals>.<lambda>c                 S   s   t  | ¡dt  | jd ¡  S )Ng      ð?r   )r
   Ztrilr!   r   )ÚXr   r   r   r   {   r   c                    s   ˆ | t ˆ | t |ƒƒƒƒS r   )r   )rF   rP   )Úsolve_transr   r   Úconjugate_solve|   s    z&grad_cholesky.<locals>.conjugate_solvec                    s(   ˆˆ ˆt  dˆ | ¡ƒƒ}|t|ƒ d S )Nz...ki,...kj->...ijg       @)r
   Úeinsumr   )r   ÚS)rF   rR   Úphir   r   rD   €   s    zgrad_cholesky.<locals>.vjpr   )rF   ÚArD   r   )rF   rR   rU   rQ   r   Úgrad_choleskyu   s
    rW   Tc                    s   ‡ ‡‡‡fdd„}|S )Nc              
      s   ˆ}ˆsN|}t ˆ dd}|d }t|d ƒ}t|| dtjd d …f  t|ƒƒS ˆr^tdƒ‚n¾|d }|d }t|d ƒ}ˆ jdd … \}}t ||f¡}t t 	|¡t 
tjˆ jd td	||ff¡¡}d|dtjd d …f d |dd d …tjf d  |  }	||k r.| d }
| d }t| d ƒ}tt|ƒ|
ƒ}tt|ƒ|ƒ}t t 	|¡t 
tjˆ jd td	||ff¡¡t|t|ƒƒ }|	|t|ƒ  |dtjd d …f  }|||dd d …tjf   }||dd d …tjf |	|t|ƒ    }tt||ƒt|ƒƒ}|tt||dtjd d …f  t|ƒƒ|ƒ }|S ||krð| d }
| d }t| d ƒ}tt|ƒ|
ƒ}tt|ƒ|ƒ}|	|t|ƒ  |dtjd d …f  }|||dd d …tjf   }||dd d …tjf |	|t|ƒ    }tt||ƒt|ƒƒ}|S ||kr| d }
| d }t| d ƒ}tt|ƒ|
ƒ}tt|ƒ|ƒ}t t 	|¡t 
tjˆ jd td	||ff¡¡t|t|ƒƒ }|	|t|ƒ  |dtjd d …f  }|||dd d …tjf   }||dd d …tjf |	|t|ƒ    }tt||ƒt|ƒƒ}|t|t|
t|ƒ|dd d …tjf  ƒƒ }|S d S )
NFr;   r   r+   .z6Gradient of svd not implemented for full_matrices=Truer   r	   )Zdtype)r=   r   r   r
   rH   r0   r   Úminr   r!   ZconcatenaterI   r#   Úint)r   Zusvr@   r?   rM   ÚmÚnÚkÚiÚfZguZgsÚgvZutguZvtgvZi_minus_vvtÚt1Zi_minus_uut©r%   Ú
compute_uvr<   Úusv_r   r   rD   ‡   sv    "ÿ08
.ÿ$(,
$(
.ÿ$(,zgrad_svd.<locals>.vjpr   )rc   r%   r<   rb   rD   r   ra   r   Úgrad_svd†   s    Wrd   )NN)rF   )TT)#Ú
__future__r   Ú	functoolsr   Znumpy.linalgZlinalgZnplar   r   Ú r
   Zautograd.extendr   Ú__dict__Úglobalsr   rS   r   r   ZdetZslogdetr    r   r"   Zpinvr*   r&   rE   ZnormrO   ZeighrW   Zcholeskyrd   r=   r   r   r   r   Ú<module>   s2   	


6




Y