U
    /e                     @   sn  d dl Z d dlZed ed d dlZd dlZd dlmZ	 d dl
mZ d dlmZmZmZmZmZ d dlmZ d dlmZmZmZ ejdd	d
dddddddddddddddefdddefdddefdddefgdd Zejdd d!d"d#d$d%d&d'd(d)d*d+d,d-d.gd/d0 Zd1d2 Zejddddefddd3efddd4efddd5efd6d7d8efd9d7d8efd:d7d8efd;d7d8efd<dd=efd<dd>efd<dd?efdddd@dAdBdddefgdCdD Zejdd	d
ddddddddddddd@dAdBddde fgdEdF Z!dGdH Z"ejdIdJdKd?gdLdM Z#ejdNdOdPgdQdR Z$ejdNdSdTgdUdV Z%ejdWej&ej&fej'ej'fgdXdY Z(ejdZd[d\d]gejd^ej&ej'gd_d` Z)dadb Z*ejdcddddedgejdfddddedgejdgddgejdZdhdigdjdk Z+dldm Z,dndo Z-ejj.ejdpdddqdrgej/dsdtdu Z0ejj.ejdpdrdvdwgdxdy Z1dzd{ Z2ejd|d?d\d}gd~d Z3ejd|d?d\dgdd Z4ejd|d?d\dgdd Z5dd Z6ejd|d?d\gdd Z7ejd|d?d\gdd Z8dd Z9dd Z:ejd|d?dgdd Z;ejd|d?dddgdd Z<ejdddgejdddgdd Z=dd Z>ejddJdd?gejdZd]ddgejd^ddgdd Z?ejd^dddddddgejdddgdd Z@ejdZddddgejddddgdd ZAdd ZBejdd ddgdd ZCejjDe jEdkopee	dk dddejddddgddd gdddgdddggejddddejFejF gejdddgddʄ ZGejj.ejjDe jEdkoee	dk dddejdddgddgddgddgddggejddddejFejF gejdddgddԄ ZHejddddgddd gdddggejdd d7ddgejdddgdd؄ ZIejddddgdddgdddggejdddd7dgejdddgddބ ZJejddddgdddggejddd7dgejdddgdd ZKdS )    Nnumpyscipy)parse)qrsfqrsvdsvd_compressedtsqr)_np_version)	assert_eq	same_keyssvd_flipzm,n,chunks,error_type)   
   r   N)r   r      r   N)r   r   )      r   r   N)(   r         r   r      r   N)         r   N)   r   r   N)   r   r   N)   r   r   N),  r   r   r   N)r"   r      r   N)r"   r   r   r   N)r   r   r   N)r   r   r   N)r   r   r   Nr   r   r   r   r   r   r   r   r   c              
   C   s  t j| |}tj||dd}| }t| |}|}|}	| }
t| |}|}|}|}t||}|d krt|\}}t||f|j	 t||	f|j	 t|t
|| tt ||t
|j| t|t||j	d  t|dd\}}}t j|d }t|| t|
|f|j	 t|f|j	 t||f|j	 tt ||t
|j| tt ||t
||j t|t
t
|t||d |  nJt| t|\}}W 5 Q R X t| t|dd\}}}W 5 Q R X d S )NAchunksnamer   TZcompute_svd   )nprandomrandda
from_arrayminmaxr	   r   shapedoteyeTtriurechunklinalgr   diagpytestraises)mnr,   
error_typematdatam_qn_qm_rn_rm_un_un_sm_vhn_vhd_vhqrusvhs_exact rV   @/tmp/pip-unpacked-wheel-dbjnr7gq/dask/array/tests/test_linalg.py	test_tsqr   s@    ,




*rX   z1m_min,n_max,chunks,vary_rows,vary_cols,error_type)r   r   r   r   TFN)r   r   rY   FTN)r   r   rY   TTN)r   r   rY   TFN)r   r   rY   FTN)r   r   rY   TTN)r"   r   r#   TFN)r"   r   r$   TFN)r"   r   r&   TFN)r"   r   r#   FTN)r"   r   r$   FTN)r"   r   r&   FTN)r"   r   r#   TTN)r"   r   r$   TTN)r"   r   r&   TTNc              
   C   s  t j| d |}| d | }}|d| df  d7  < |d d df }	|dd d f }
tj|	| dd}tj|
|dd}tj||dd}|r||dkd d f }||	dkd d f }|jd }|r|d d |dkf }|d d |
dkf }|jd }|}t||}|}|}|}t||}|}|}|}t||}|d krt|\}}|	 }|	 }t
||f|j t
||f|j t
|t || t
t ||t |j| t
|t | t|d	d
\}}}|	 }|	 }|	 }t j|d }t
|| t
||f|j t
|f|j t
||f|j t
t ||t |j| t
t ||t ||j t
|t t |t ||d |  nJt| t|\}}W 5 Q R X t| t|d	d
\}}}W 5 Q R X d S )Nr   r   r/   cr+   rQ   r*         ?Tr.   )r0   r1   r2   r3   r4   r7   r5   r6   r	   computer   r8   r9   r:   r;   r=   r   r>   r?   r@   )Zm_minZn_maxr,   Z	vary_rowsZ	vary_colsrC   rD   rA   rB   Z_c0Z_r0Zc0Zr0rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rV   rW   test_tsqr_uncertaini   sf    T






*r]   c                  C   s~  d} d}d}d}t jdd}tj|dd}tj|\}}t| |f|j t||f|j t|t	|| tt 
||t	|j| t|t||jd  t |t d g}|d d df }	tj|dd}
tj|	dd}|
|dkd d f }tj|\}}| }| }t| |f|j t||f|j t|t 	|| tt 
||t 	|j| t|t | d S )Nr   r   ))r   r   r/   r   r   r   r,   r   rY   )r0   r1   r2   r3   r4   r=   r   r   r7   r8   r9   r:   r;   r<   Zvstackonesr\   )rF   rG   rH   rI   rD   xrP   rQ   Zmat2v2Zx2rZ   rV   rV   rW   test_tsqr_zero_height_chunks   s2    rc   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r&   )r   r   r'   N)r   r   r(   N)r   r   r)   Nc              	   C   s   t j| |}tj||dd}| }t| |}|}|}	|}
|d krt|\}}t||f|j t||	f|j t|t	|| tt 
|
|
t	|j| t|t||jd  n"t| t|\}}W 5 Q R X d S Nr*   r+   r   )r0   r1   r2   r3   r4   r5   r   r   r7   r8   r9   r:   r;   r<   r?   r@   rA   rB   r,   rC   rD   rE   rF   rG   rH   rI   Zm_qtqrP   rQ   rV   rV   rW   	test_sfqr  s     @
rf   c              	   C   s   t j| |}tj||dd}| }t| |}|}|}	|}
|d krt|\}}t||f|j t||	f|j t|t	|| tt 
|
|
t	|j| t|t||jd  n"t| t|\}}W 5 Q R X d S rd   )r0   r1   r2   r3   r4   r5   r   r   r7   r8   r9   r:   r;   r<   r?   r@   re   rV   rV   rW   test_qro  s     '
rg   c                  C   s   d\} }t j| |}tj|d|fdd}t|\}}t|\}}t||sPtt||s^tt|\}}	}
t|\}}}t||stt|	|stt|
|std S )Nr&   r   r*   r+   )	r0   r1   r2   r3   r4   r   r   AssertionErrorr   )rA   rB   rD   rE   Zq1Zr1Zq2Zr2u1s1Zv1u2s2rb   rV   rV   rW   test_linalg_consistent_names  s    rm   zm,n)r   r   )r   r   c                 C   s   t j| |}tj|d|fdd}tj|\}}}t|||\}}}	t|||g|||	gD ](\}
}|
j	|j	ksvt
|
j|jks^t
q^d S )Nr   r*   r+   )r0   r1   r2   r3   r4   r=   r   r\   zipr7   rh   dtype)rA   rB   aZd_aZd_uZd_sZd_vtrR   rS   vtZd_eerV   rV   rW   test_dask_svd_self_consistent  s    rs   iteratorpowerQRc                 C   sn   t jddd}t jj|d| dddd\}}}t jj|d| ddd	\}}}t|jt|jk s`tt|| d S )
N)d   rw   r'   r_   r   r/   T{   )krt   n_power_iterr\   seed)ry   rt   rz   r{   )r3   r`   r=   r   lenZdaskrh   r   )rt   ra   rR   rS   vuussvvrV   rV   rW   test_svd_compressed_compute  s$             r   )ru   r   )rv   r   c              	   C   sB  d\}}d}t jj||f||fd}t|d| | d | d dd\}}}tjj| d	d
}tj||d d d |f |d |  |d |d d f    d}	|	||d   d }
d}|
|k stt	t
||t |d d d |f j|d d d |f  t	t
||t |d |d d f |d |d d f j d S )N)rw   2   r   r_   r   r   r/     )rt   rz   r{   F)Z
compute_uvg?)r3   r1   r   r   r=   r   r\   normrh   r   r0   r9   r8   r:   )rt   rA   rB   rQ   rp   rR   rS   rq   Zs_truer   fracZtolrV   rV   rW   test_svd_compressed  s"        F<r   zinput_dtype, output_dtypec                 C   sX   t jjddd| }t|ddd\}}}|j|j  krN|j  krN|ksTn td S )Nr   r   r_   r/   r   r{   )r3   r1   astyper   ro   rh   )Zinput_dtypeZoutput_dtypera   rR   rS   rq   rV   rV   rW   &test_svd_compressed_dtype_preservation  s    r   r,   )r   r   )r   r   )r   ro   c                 C   sR   t jjd| d|}t|\}}}|j|j  krH|j  krH|ksNn td S )Nr   r_   )r3   r1   r   r   ro   rh   )r,   ro   ra   rR   rS   r}   rV   rV   rW   test_svd_dtype_preservation  s    r   c            	      C   s|   d\} }t jdj| |fdd}t|ddd\}}}t|ddd\}}}tt ||k ||k ||k sxtd S )N)r%      i  r   r   sizer,   r   r   )r3   r1   ZRandomStateZrandom_sampler   allr\   rh   )	rA   rB   ra   rR   rS   rq   rk   rl   Zvt2rV   rV   rW   !test_svd_compressed_deterministic  s
    r   rA   r   r   rB   ry   )r   r   rY   c           	      C   s   t jj| |f|d}t||dddd\}}}t |||\}}}t| ||}|j| |fks^t|j|fksnt|j||fkstd S )Nr   r/   T)rz   r\   r{   )r3   r1   r   r\   r5   r7   rh   )	rA   rB   ry   r,   ra   rR   rS   r}   rQ   rV   rV   rW   test_svd_compressed_shapes  s    r   c                 C   sH   t | |||stt|t|dd t|t|dd d S )NFcheck_graph)r0   Zallcloser8   rh   r   r3   trilr;   )plrR   r*   rV   rV   rW   _check_lu_result  s    r   c                  C   s  t ddddgddddgddddgdddd	gg} t dd
d
d
d
d
gd
dd
d
d
d
gd
d
dd
d
d
gd
d
d
d	d
d
gd
d
d
d
dd
gd
d
d
d
d
dgg}t| |gddgD ]v\}}tj|||fd}tj|\}}}tj|\}}	}
t||dd t||	dd t||
dd t	||	|
| qt ddddddgddddddgddddddgddddddgddddddgd
dddddgg}t|gdgD ]N\}}tj|||fd}tj|\}}}tj|\}}	}
t	||	|
| qd S )Nr   r   r   r   r   r/   r      r   r   r_   Fr         r   r   r   )            .            8         )
r0   arrayrn   r3   r4   r   r=   lur   r   )A1A2r*   chunkdAr   r   rR   dpdlduZA3rV   rV   rW   	test_lu_1#  s@    2r   r   r%   r   z4ignore:Increasing:dask.array.core.PerformanceWarningc                 C   sR   t jd t jdd| | f}tj|dd}tj|\}}}t|||| d S )Nr   r   r   r_   	r0   r1   r{   randintr3   r4   r=   r   r   r   r*   r   r   r   r   rV   rV   rW   	test_lu_2M  s
    r   rw      c                 C   sR   t jd t jdd| | f}tj|dd}tj|\}}}t|||| d S )Nr   r   )r   r   r_   r   r   rV   rV   rW   	test_lu_3Y  s
    r   c                     s   t jddd} tj| dd tt fdd t jddd} tj| d	d tt fd
d t jddd} tj| d	d tt fdd d S )Nr   r   r   r   r   r   r   r   r_   c                      s   t j S Nr3   r=   r   rV   r   rV   rW   <lambda>g      z test_lu_errors.<locals>.<lambda>)r   r   )r   r   c                      s   t j S r   r   rV   r   rV   rW   r   k  r   )r   r   c                      s   t j S r   r   rV   r   rV   rW   r   o  r   r0   r1   r   r3   r4   r?   r@   
ValueError)r*   rV   r   rW   test_lu_errorsd  s    r   )r7   r   )F   r   c           
      C   s   t jd t jdd| | f}t jdd| }t |}t|||f}t||}tj||}t	|t
j|| t	|||t t |}t|||f}	t||}tjj|	|dd}t	|t
jj||dd t	|	||t d S )Nr/   r   Tlowerr0   r1   r{   r   r;   r3   r4   r=   solve_triangularr   r   r8   r   floatr   
r7   r   r*   bZAuZdAudbresZAlZdAlrV   rV   rW   test_solve_triangular_vectorr  s    

r   )r   r   c           
      C   s  t jd t jdd| | f}t jdd| df}t |}t|||f}t||df}tj||}t	|t
j|| t	|||t t |}t|||f}	t||df}tjj|	|dd}t	|t
jj||dd t	|	||t d S )Nr/   r   r   Tr   r   r   rV   rV   rW   test_solve_triangular_matrix  s    

r   c           
      C   s  t jd t jdd| | f}t jdd| | f}t |}t|||f}t|||f}tj||}t	|t
j|| t	|||t t |}t|||f}	t|||f}tjj|	|dd}t	|t
jj||dd t	|	||t d S )Nr/   r   Tr   r   r   rV   rV   rW   test_solve_triangular_matrix2  s    

r   c                     s   t jddd} t jddd}tj| dd tj|ddtt fdd	 t jddd
} t jddd}tj| dd tj|ddtt fdd	 d S )Nr   r   r   r/   r   r_   r   c                      s   t j S r   r3   r=   r   rV   r   r   rV   rW   r     r   z.test_solve_triangular_errors.<locals>.<lambda>r'   )r   r   c                      s   t j S r   r   rV   r   rV   rW   r     r   r   )r*   r   rV   r   rW   test_solve_triangular_errors  s    r   c                 C   sX  t jd t jdd| | f}t|||f}t jdd| }t||}tj||}t|t	j||dd t|
||tdd t jdd| df}t||df}tj||}t|t	j||dd t|
||tdd t jdd| | f}t|||f}tj||}t|t	j||dd t|
||tdd d S )Nr/   r   Fr   r   )r0   r1   r{   r   r3   r4   r=   solver   r   r8   r   r   r7   r   r*   r   r   r   r   rV   rV   rW   
test_solve  s$    r   c                 C   st   t jd t jdd| | f}t|||f}tj|}t|t	j|dd t|
|t j| tddd d S )Nr/   r   Fr   ro   )r0   r1   r{   r   r3   r4   r=   invr   r   r8   r9   r   )r7   r   r*   r   r   rV   rV   rW   test_inv  s    r   c                 C   s6   t jd t jdd| | f}t |}||jS )Nr/   r   )r0   r1   r{   r   r   r8   r:   )r   r*   ZlArV   rV   rW   _get_symmat  s    
r   c                 C   sR   t tjt dkr$tjj| ||dS |dkr>tjj| |ddS tjj| |dS d S )Nz1.9.0rp   r   assume_aposT)rp   r   sym_pos)rp   r   )parse_versionr   __version__r=   r   r   rV   rV   rW   _scipy_linalg_solve  s
    r   )r%   r   c              	   C   s  t jd t| }t|||f}t jdd| }t||}tjj||dd}t	|t
||dddd t	|||tdd t jdd| df}t||df}tjj||dd}t	|t
||dddd t	|||tdd t jdd| | f}t|||f}tjj||dd}t	|t
||dddd t	|||tdd tjtdd	J tjj||d
d}t	|t
||dddd t	|||tdd W 5 Q R X tjtdd	J tjj||dd}t	|t
||dddd t	|||tdd W 5 Q R X d S )Nr/   r   r   )r   Fr   r   zsym_pos keyword is deprecatedmatchT)r   gen)r0   r1   r{   r   r3   r4   r   r=   r   r   r   r8   r   r   r?   r@   FutureWarningr   rV   rV   rW   test_solve_assume_a  s4    $r   )   r   )r%   r   c                 C   sh   t | }t|||f}ttj| tj|ddd ttjj|ddtjj|ddddd d S )NF)r   Zcheck_chunksTr   )r   r3   r4   r   r=   Zcholeskyr\   r   )r7   r   r*   r   rV   rV   rW   test_cholesky0  s    
r   	iscomplexFT)nrowncolr   )r   r   r   )rw   r   r   c                 C   sp  t jd t jdd| |f}t jdd| }|rh|dt jdd|j  }|dt jdd|j  }t|||f}t||}t jj||dd\}}	}
}tj||\}}}}t	|| t	||	 |
 |
kstt	|| |d d df |d d df< t|||f}t||}t jj||t t jjt| | d\}}	}
}|
|d ksZttj||\}}}}|
 |
kstt jdd| |f}t jdd| |d f}|r|dt jdd|j  }|dt jdd|j  }t|||f}t|||d f}t jj||dd\}}	}
}tj||\}}}}t	|| t	||	 |
 |
ksbtt	|| d S )Nr/   r   y              ?r   )Zrcondr   )r0   r1   r{   r   r7   r3   r4   r=   Zlstsqr   r\   rh   ZfinfodoubleZepsr6   )r   r   r   r   r*   r   r   r   ra   rQ   ZrankrS   dxZdrZdrankdsZb2DZdb2DrV   rV   rW   
test_lstsqC  sL    


  

r   c            	      C   s&  t jd} t jj| dd\}}}t jfd dft jfd t jfffD ]}tj| dd}||_tj|\}}}t|| t|	t 
|	||	t
|	| t|j	|t d t|j	|t d tj| dd}t jfd t jff|_tt|t| tt|t| qFd S )Nrw   r   FZfull_matricesr   r   r'   r_   )r0   r1   r=   r   nanr3   r4   _chunksr   r8   r>   r:   r9   abs)	ra   rR   rS   r}   r,   r   r   r   dvrV   rV   rW   test_no_chunks_svdt  s    (
.r   r7   )r   r   )r   r   Zf4Zf8c                 C   s   t jj| |d|}t j|\}}}t|jdkr<dnd}t||\}}	|j|jks^t	|	j|jksnt	tj
jtt|| |	||d tt || \}
}|
j|jkst	|j|jkst	tj
jtt|
| |||d d S )Nr   r   	   r   )decimal)r3   r1   r   r=   r   r0   ro   itemsizer   rh   ZtestingZassert_almost_equalZasarrayr8   r\   )r7   r,   ro   ra   rR   rS   r}   r   ZufZvfZucZvcrV   rV   rW   test_svd_flip_correction  s    $r   f2Zf16Zc8Zc16Zc32u_basedc                 C   s   z:t jddddgddddgddddgddddgg| d}W n tk
rX   td Y nX t||j|d\}}|j|jks~t|j|jkst|	 }|d d df  |j
d9  < t|| t||j d S )Nr/   r   r   z%128-bit floats not supported by NumPy)Zu_based_decision)r0   r   	TypeErrorr?   skipr   r:   ro   rh   copytyper   )ro   r   ra   rR   r}   yrV   rV   rW   test_svd_flip_sign  s    *
 
r  )r   r   )r   r   )r   rw   r   c           
      C   s   t j|}tj|| d}tj|\}}}t||\}}t jj|dd\}}}	t||\}}t||	\}}	t|| t|| t||	 d S )Nr_   Fr   )	r0   r1   r3   r4   r=   r   r\   r   r   )
r,   r7   ra   r   r   r   r   nunsnvrV   rV   rW   test_svd_supported_array_shapes  s    

r  c               	   C   s:   t jtdd" tjjddd} tj|  W 5 Q R X d S )Nz+Array must be chunked in one dimension onlyr   r'   r   r_   )r?   r@   NotImplementedErrorr3   r1   r=   r   )ra   rV   rV   rW   test_svd_incompatible_chunking  s     r  ndimr/   r   c              	   C   sB   t jtdd* tjjd|  d|  d}tj| W 5 Q R X d S )NzArray must be 2Dr   r   )r   r_   )r?   r@   r   r3   r1   r=   r   )r	  ra   rV   rV   rW    test_svd_incompatible_dimensions  s    r
  darwinz1.22z(https://github.com/dask/dask/issues/7189)reasonstrictzshape, chunks, axisr^   )r   )r   )r   r   )r   r   r   r   keepdimsc           	      C   sP   t j| }tj||d}t jj||||d}tjj||||d}t|| d S Nr_   ordaxisr  r0   r1   r3   r4   r=   r   r   	r7   r,   r  r   r  rp   da_rd_rrV   rV   rW   test_norm_any_ndim  s
    r  zshape, chunks)r   r   )r   r   r   )r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   c                 C   s   t j| }tj||d}tt| D ]^}tt| D ]L}||krL||f}n|}t jj||||d}	tjj||||d}
t|	|
 q6q&d S r  )	r0   r1   r3   r4   ranger|   r=   r   r   )r7   r,   r   r  rp   r  Z	firstaxisZ
secondaxisr  r  r  rV   rV   rW   test_norm_any_slice  s    
r  r[   c           	      C   sP   t j| }tj||d}t jj||||d}tjj||||d}t|| d S r  r  r  rV   rV   rW   test_norm_1dim  s
    r  )r   r/   )r/   r   Zfronucc           	      C   sv   t j| }tj||d}|dks2|dks2|dkr@|ddi}t jj||||d}tjj||||d}t|| d S )Nr_   r  r   r  r   r  )r0   r1   r3   r4   r<   r=   r   r   r  rV   rV   rW   test_norm_2dim"  s    r  )r   r   r   )r/   r   )r   r   r   r   )r   r  c              	   C   s`   t j| }tj||d}t| dkr\t|dkr\tt tjj	||||d W 5 Q R X d S )Nr_   r   r  )
r0   r1   r3   r4   r|   r?   r@   r  r=   r   )r7   r,   r  r   r  rp   r  rV   rV   rW   test_norm_implemented_errors6  s
    r  )Lsysr?   Zimportorskipr   r0   Zscipy.linalgr   Zpackaging.versionr   r   Z
dask.arrayr   r3   Zdask.array.linalgr   r   r   r   r	   Zdask.array.numpy_compatr
   Zdask.array.utilsr   r   r   markZparametrizer   rX   r]   rc   rf   r  rg   rm   rs   r   r   Zfloat32Zfloat64r   r   r   r   r   r   Zslowfilterwarningsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  Zxfailplatforminfr  r  r  r  r  rV   rV   rV   rW   <module>   s  




+
,S
? 



?

&



 
	
*
		




		
)
/
"

 	