a
    8gh`                     @   s  d dl mZ d dlZd dlm  mZ d dlm  m  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 ddlmZ e  D ]\ZZejeedd qd+eed
f dddZej eed
f dddZ!ej eed
f dddZ"ej eed
f eed
f dddZ#d	dej eed
f dddZ$dddej eed
f dddZ%d,ej eed
f dddZ&dddeed
f d d!d"Z'dd	dd#eed
f d$d%d&Z(d'd( Z)d)d* Z*dS )-    )SequenceN)
xla_client   )	custom_callhlo_u8hlo_s32ensure_hlo_s32hlo_addhlo_minDimensionSizeShapeTypePairmk_result_types_and_shapes)_lapackcpu)platformF.)b_shape_valsc	                C   sj  t   t|j}
|	dd  \}}|	d d }t|}td}|D ]}t|t	|}qD| t
jkrjd}n>| t
jkrzd}n.| t
jkrd}n| t
jkrd}ntd|  |r|stdg }||d ftt|d d	d	 }t|	|
jfg\}}t||tt|tt|t|r |rd
ndndtt|t	|t	|||||g
|gd |gd
  |gddi|djS )Nr   Z
blas_strsmZ
blas_dtrsmZ
blas_ctrsmZ
blas_ztrsmUnsupported dtype z/Conjugation without transposition not supported   r      	   result_typesoperandsoperand_layoutsresult_layoutsoperand_output_aliasesresult_shapes)r   
initializeirRankedTensorTypetypelenr   hlomultiplyr   npfloat32float64	complex64
complex128NotImplementedErrortupleranger   element_typer   intresults)dtypealphaabZ	left_sidelowerZtrans_aZconj_aZdiagr   b_typemnbatch_dims_valsnum_bdbatch_size_valb_vfnscalar_layoutlayoutr   r    r@   ]/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/jaxlib/lapack.pytrsm_hlo*   sJ    



 
$rB   )r3   a_shape_valsc                C   sx  t   t|j}t|dks$J |d d }t|d }|dd  \}}| tjkr\d}n>| tjkrld}n.| tj	kr|d}n| tj
krd}ntd|  g }	||d ftt|d d	d	 }
tjd
}||jf|t||f |f||fg}t|\}}td}|D ]}t|t|}qt|||t|t||g|	gd |
g |
tt|d	d	tt|d d	d	gddi|djS )Nr   r   Zlapack_sgetrfZlapack_dgetrfZlapack_cgetrfZlapack_zgetrfr   r   r          r   r   )r   r   r    r!   r"   r#   r&   r'   r(   r)   r*   r+   r,   r-   IntegerTypeget_signlessr.   r
   r   r   r$   r%   r   r   r0   )r1   r3   rC   a_typer9   r:   r7   r8   r=   r>   r?   i32_typeshape_type_pairsr   r   r;   r<   r@   r@   rA   	getrf_hloY   sL    



 rK   c                C   s  t   t|j}t|dks$J |dd  \}}t|tu sDJ t|tu sTJ |d d }t|}| tjkrd}t 	||}	nb| tj
krd}t ||}	nF| tjkrd}t ||}	n*| tjkrd}t ||}	ntd|  g }
||d ftt|d d	d	 }tjd
}td}|D ]}t|t|}q"||jf|t||f |jf||f|	g|jfg}t|\}}t|||t|t|t|	|g|
gd |g |tt|d	d	tt|d d	d	dggddi|dj}|d d S )Nr   r   Zlapack_sgeqrfZlapack_dgeqrfZlapack_cgeqrfZlapack_zgeqrfr   r   r   rD      r   r   rE   )r   r   r    r!   r"   r#   r/   r&   r'   Zlapack_sgeqrf_workspacer(   Zlapack_dgeqrf_workspacer)   Zlapack_cgeqrf_workspacer*   Zlapack_zgeqrf_workspacer+   r,   r-   rF   rG   r   r$   r%   r   r.   minr   r   r0   )r1   r3   rC   rH   r7   r8   r9   r:   r=   lworkr>   r?   rI   r;   r<   rJ   r   r   outr@   r@   rA   	geqrf_hlo   s^    



 
rP   )r3   rC   tau_shape_valsc                C   s
  t   t|j}|j}|}t|dks.J |dd  \}}	|tj ksPJ |	tj ksbJ |d d }
t|
}t	d}|
D ]}t
|t|}q|d }t|tu sJ | tjkrd}t ||	|}nl| tjkrd}t ||	|}nN| tjkrd}t ||	|}n.| tjkr,d}t ||	|}ntd	|  g }||d ftt|d dd }tjd
}||jf|
|f|g|jfg}t|\}}t|||t	|t	|	t	|t	|||g|gd |tt|ddg |tt|d dddggddi|dj}|d d S )Nr   r   r   r   Zlapack_sorgqrZlapack_dorgqrZlapack_cungqrZlapack_zungqrr   rD      r   r   ) r   r   r    r!   r"   shaper#   Z
ShapedTypeZget_dynamic_sizer   r$   r%   r   r/   r&   r'   Zlapack_sorgqr_workspacer(   Zlapack_dorgqr_workspacer)   Zlapack_cungqr_workspacer*   Zlapack_zungqr_workspacer+   r,   r-   rF   rG   r.   r   r   r0   )r1   r3   taurC   rQ   rH   dimsZ	dims_valsr7   r8   r9   r:   r;   r<   kr=   rN   r>   r?   rI   rJ   r   r   rO   r@   r@   rA   	orgqr_hlo   sl    

 

rW   )r5   c             	   C   sJ  t   t|j}|d }| tjkr,d}n>| tjkr<d}n.| tjkrLd}n| tj	kr\d}nt
d|  |d d }t|}td}	|D ]}
t|	t|
}	qg }||d ftt|d dd }tt|d dd}||jf|tjd	fg}t|\}}t||tt||	t||g|gd
 |g ||gd
di|dj}|d d S )Nr   Zlapack_spotrfZlapack_dpotrfZlapack_cpotrfZlapack_zpotrfr   r   r   rD   rE   r   r   r   )r   r   r    r!   r"   r&   r'   r(   r)   r*   r+   r#   r   r$   r%   r   r,   r-   r.   rF   rG   r   r   r/   r0   )r1   r3   r5   rC   rH   r8   r=   r9   r:   r;   r<   r>   r?   info_layoutrJ   r   r   rO   r@   r@   rA   	potrf_hlo	  sD    



 	rY   T)full_matrices
compute_uvc                C   sf  t   t|j}t|dks$J |dd  \}}t|tu sDJ t|tu sTJ |d d }t|}	td}
|D ]}t	|
t
|}
qttjd}| tjkrd}tj }t ||||}t ||g|f|g|jfg}dgdgg}nP| tjkrBd}tj }t ||||}t ||g|f|g|jfg}dgdgg}n| tjkrd}tj }t ||||}t ||g|ft ||t|gtj f|g|jfg}dgdgdgg}n| tjkr.d	}tj }t ||||}t ||g|ft ||t|gtj f|g|jfg}dgdgdgg}ntd
|  g }|	|	d ftt|	d dd }||jf|t||f |f|||r|nt||f |jf||r|nt|||f |jf||fg| }t |\}}t!||tt|tt||
t|t|t||g|gd |g ||	ftt|	d dd ||tt|	d ddg| ddi|dj"}|dd S )Nr   r   r   rD   Zlapack_sgesddr   Zlapack_dgesddZlapack_cgesddZlapack_zgesddr   r      r   rR   )#r   r   r    r!   r"   r#   r/   r   r$   r%   r   rF   rG   r&   r'   F32TypegetZsgesdd_work_sizeZgesdd_iwork_sizer.   r(   F64TypeZdgesdd_work_sizer)   Zcgesdd_work_sizeZcgesdd_rwork_sizer*   Zzgesdd_work_sizer+   r,   r-   rM   r   r   r0   )r1   r3   rZ   r[   rC   rH   r7   r8   r9   r:   r;   r<   rI   r=   Zsingular_vals_typerN   	workspaceworkspace_layoutsr>   r?   rJ   r   r   rO   r@   r@   rA   	gesdd_hlo5  s    








   rb   c                 C   s  t   t|j}t|dks$J |dd  \}}t|tu rTt|tu rT||ks\J ||d d }t|d }tjd}	| t	j
krd}
tj }t |g|jft |g|	fg}n| t	jkrd}
tj }t |g|jft |g|	fg}n| t	jkrDd}
tj }t |g|jft |g|ft |g|	fg}nZ| t	jkrd}
tj }t |g|jft |g|ft |g|	fg}ntd|  td	}|D ]}t|t|}qg }d
g}|gt| }||d	 ftt|d	 dd }t||jf||f |f||	fg| \}}t|
|t|r6d	nd
|t||g|gd |g |tt|ddtt|d	 ddg| dd
i|dj}|d d S )Nr   r   rD   Zlapack_ssyevdZlapack_dsyevdZlapack_cheevdZlapack_zheevdr   r   r   r   rE   r   ) r   r   r    r!   r"   r#   r/   rF   rG   r&   r'   r]   r^   Zsyevd_work_sizer.   Zsyevd_iwork_sizer(   r_   r)   Zheevd_work_sizeZheevd_rwork_sizer*   r+   r   r$   r%   r   r,   r-   r   r   r0   )r1   r3   rC   r5   rH   r7   r8   r9   r:   rI   r=   Zeigvals_typer`   r;   r<   r>   Zshape_layoutra   r?   r   r   rO   r@   r@   rA   	syevd_hlo  s    (





 rc   )jobvljobvr)input_shape_valsc                 C   sZ  t   t|jj}t|dks&J |d }|d d }t|}||d ftt|d dd }	t	|rldnd}
t	|r|dnd}tj
d}tj }tj }tjtj }tjtj }| tjkr,d}d	}|}||g|fgd
 }ddggd
 }||f |fgd }tt|ddgd }n>| tjkrd}d	}|}||g|fgd
 }ddggd
 }||f |fgd }tt|ddgd }n| tjkrd}d}|}||g|ft||g|fg}ddgdgg}||f |fg}tt|ddg}nt| tjkr\d}d}|}||g|ft||g|fg}ddgdgg}||f |fg}tt|ddg}ntd|  g }tt|d dd}td}|D ]}t|t|}q|| ||f||f||fg }t|\}}t|||t|t|
t||g|gd |	g || |	gd  |g |dj}|rJt|d
 |d |d |d |d fS |dd S d S )Nr   r   r   r   VNrD   Zlapack_sgeevTrE   r   Zlapack_dgeevZlapack_cgeevFZlapack_zgeevr   rL   )r   r   r   r   r   rR   r\      ) r   r   r    r!   r"   rS   r#   r,   r-   ordrF   rG   r]   r^   r_   ComplexTyper&   r'   r(   r)   r	   r*   r+   r   r$   r%   r   r   r   r   r0   complex) r1   inputrf   rd   re   Zinput_shaper8   r9   r:   r?   Zjobvl_cZjobvr_crI   Zf32_typeZf64_typeZc64_typeZ	c128_typer=   realZeigvecs_type
workspacesra   eigvalseigvals_layoutsr>   rX   r;   r<   rJ   r   r   rO   r@   r@   rA   geev_hlo  s     

(rr   )jobvssortselect)rC   c                C   s  t   t|j}|j}t|dks*J |d }|d d }	t|	}
|
|
d ftt|
d dd }|rrt	dt
|r|dnd}t
|rdnd}| tjkrd	}n>| tjkrd
}n.| tjkrd}n| tjkrd}nt	d|  t| tjs,||fg}|g}|	|f |fgd }tt|
ddgd }nF||f|gt|jfg}|dgg}|	|f |fg}tt|
ddg}tjd}g }td}|	D ]}t|t|}q|| ||f|	|f|	|fg }t|\}}t|||t|t|t||g|gd |g || |tt|
d ddtt|
d ddg ddi|dj}|t
dkrf|d |d |d |d fS |d |d |d fS d S )Nr   r   r   r   z=The sort feature of LAPACK's gees routine is not implemented.rg   rh   SZlapack_sgeesZlapack_dgeesZlapack_cgeesZlapack_zgeesr   r   rD   rL   r   rE   rR   )r   r   r    r!   r"   r.   r#   r,   r-   r+   rj   r&   r'   r(   r)   r*   Z
issubdtypeZcomplexfloatingrk   rF   rG   r   r$   r%   r   r   r   r   r0   )r1   r3   rs   rt   ru   rC   rH   etyper8   r9   r:   r?   r=   ro   ra   rp   rq   rI   r>   r;   r<   rJ   r   r   rO   r@   r@   rA   gees_hlo9  s     





rx   c                 C   s  t   t|j}|j}t|dks*J |dd  \}}||ksNJ ||ft|d d }t|}d}|D ]}	||	9 }qn| tj	krd}
t 
||d|}nn| tjkrd}
t ||d|}nN| tjkrd}
t ||d|}n.| tjkrd}
t ||d|}ntd|  ||d ftt|d d	d	 }tjd
}t|
|jtj||d f |jtj||tj|g|jgt|tdt|t|t|t||gg gd |g ||ftt|d d	d	 tt|d d	d	dggddidj}|d d S )Nr   r   r   Zlapack_sgehrdZlapack_dgehrdZlapack_cgehrdZlapack_zgehrdr   r   rD   r\   r   r   r   r   r   r   rE   )r   r   r    r!   r"   rS   r#   r,   r&   r'   Zlapack_sgehrd_workspacer(   Zlapack_dgehrd_workspacer)   Zlapack_cgehrd_workspacer*   Zlapack_zgehrd_workspacer+   r-   rF   rG   r   r^   r.   r   r0   )r1   r3   rH   rU   r7   r8   
batch_dimsr:   r4   dr=   rN   r?   rI   rO   r@   r@   rA   	gehrd_hlo  sZ    




 r|   c                C   sj  t   t|j}|j}t|dks*J |dd  \}}||ksNJ ||ft|d d }t|}d}	|D ]}
|	|
9 }	qn| tj	krd}t 
||}|j}n~| tjkrd}t ||}|j}n\| tjkrd}t ||}tj }n6| tjkrd}t ||}tj }ntd|  ||d ftt|d d	d	 }tjd
}t||jtj||f |tj||d f |tj||d f |jtj||tj|g|jgt|t|rdndttd|t|	t||gg gd |g ||ftt|d d	d	 |ftt|d d	d	 |ftt|d d	d	 tt|d d	d	dggddidj}|d d S )Nr   r   r   Zlapack_ssytrdZlapack_dsytrdZlapack_chetrdZlapack_zhetrdr   r   rD   r   rR   ry   )r   r   r    r!   r"   rS   r#   r,   r&   r'   Zlapack_ssytrd_workspacer.   r(   Zlapack_dsytrd_workspacer)   Zlapack_chetrd_workspacer]   r^   r*   Zlapack_zhetrd_workspacer_   r+   r-   rF   rG   r   r   maxr0   )r1   r3   r5   rH   rU   r7   r8   rz   r:   r4   r{   r=   rN   Z	diag_typer?   rI   rO   r@   r@   rA   	sytrd_hlo  sj    



 "r~   )FFFFF)F)+collections.abcr   numpyr&   Zjaxlib.mlir.irZmlirr    Zjaxlib.mlir.dialects.stablehloZdialectsZ	stablehlor$   Zjaxlibr   Zhlo_helpersr   r   r   r   r	   r
   r   r   r   r   r   Zregistrationsitems_name_valueZregister_custom_call_targetr,   rB   ValuerK   rP   rW   rY   rb   rc   rr   rx   r|   r~   r@   r@   r@   rA   <module>   sT   ,  
/
3
;

B

,
[ 
S
Z

R5