U
    9%ez/                     @   s.  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mZ dd Zdd Zd	d
 Zdd Zdd Zejdd Zejdd Zdd Zejdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!d+d, Z"d-d. Z#d/d0 Z$d1d2 Z%d3d4 Z&d5d6 Z'd7d8 Z(dS )9    N)ndimage)connected_components)PatchExtractor_extract_patchesextract_patches_2dgrid_to_graphimg_to_graphreconstruct_from_patches_2dc                  C   sh   t jd dd df d \} }t| }t|}|j|jks>tt j|j|jdk |j|jdk  d S )N   
   r   )npZmgridr   ZnnzAssertionErrortestingassert_array_equaldata)xygrad_xZgrad_y r   j/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sklearn/feature_extraction/tests/test_image.pytest_img_to_graph   s     r   c                  C   s   t jdtd} d| d< d| d d df< t d}d|d< d|d< d|d	< t|| d
 }t dddgdddgdddgg}t j|| d S )N      dtype   r   r   r   )r   r   r   r   maskr   )r   zerosboolr   todensearrayr   r   )r"   r   r   desiredr   r   r   test_img_to_graph_sparse!   s    
"r(   c                  C   s  d} d}t j| | ftd}d|d|d|f< d|| d | d f< || d }t| | |t jd}t|d dksztt jdtd}d|d< d|d d df< tdd	d| d
	 }t 
dddgdddgdddgg}t j|| t j| | ft jd}t| | | |d}t|d dks"tt | | f}t| | | |td}|jtksRtt| | | |td}|jtksttt| | | |t jd}|jt jkstd S )Nr   r   r   Tr   )n_xn_yr"   Z	return_asr   r   r   r!   )r)   r*   n_zr"   )r)   r*   r+   r"   r   )r   r#   r$   reshaper   Zndarrayr   r   Zravelr%   r&   r   r   ZonesZint16r   intZfloat64)sizeZroi_sizer"   Agraphr'   r   r   r   test_grid_to_graph0   s0    "r1   c                 C   s\   | }|d d dd d df }dD ]6}||k}t ||d}t|d t|d ks tq d S )Nr
   )2      r!   r   r   )r   r   labelr   r   )raccoon_face_fxtfaceZthrr"   r0   r   r   r   test_connect_regionsT   s    r7   c                 C   s   | }|d d dd d df }|dk}t |jd|i}t|d t|d ksRt|dk}t |j|d d}t|d t|d kstd S )Nr
   r2   r"   r   r   r3   )r"   r   )r   shaper   r4   r   r   )r5   r6   r"   r0   r   r   r   test_connect_regions_with_grid^   s    r9   c                 C   s   | }|d d dd d df |dd dd d df  |d d ddd df  |dd ddd df  }|d d dd d df |dd dd d df  |d d ddd df  |dd ddd df  }| tj}|d }|S )Nr   r   g      0@)Zastyper   Zfloat32)r5   r6   r   r   r   downsampled_facem   s    ``r:   c                 C   sn   | }t |jd }d| |d d d d df< d|d  |d d d d df< d|d  |d d d d df< |S )Nr      r   r   r   r
   r   r#   r8   )r:   r6   Z
face_colorr   r   r   orange_facew   s    r>   c                 C   s4   t d| j }| |d< | d |d< | d |d< |S )Nr;   r   r   r   r=   )r6   Zimagesr   r   r   _make_images   s
    r?   c                 C   s   t | S N)r?   )r:   r   r   r   downsampled_face_collection   s    rA   c                 C   sT   | }|j \}}d\}}|| d || d  }t|||f}|j |||fksPtd S )N   rC   r   r8   r   r   r:   r6   i_hi_wp_hp_wexpected_n_patchespatchesr   r   r   test_extract_patches_all   s    
rL   c                 C   s^   | }|j d d \}}d\}}|| d || d  }t|||f}|j |||dfksZtd S )Nr   rB   r   r   rD   )r>   r6   rF   rG   rH   rI   rJ   rK   r   r   r   test_extract_patches_all_color   s    rM   c                 C   sh   | }|d d ddf }|j \}}d\}}|| d || d  }t|||f}|j |||fksdtd S )N    a   )rC      r   rD   rE   r   r   r   test_extract_patches_all_rect   s    
rQ   c              	   C   s   | }|j \}}d\}}t|||fdd}|j d||fks<ttd|| d  || d  }t|||fdd}|j |||fksttt t|||fdd W 5 Q R X tt t|||fdd W 5 Q R X d S )NrB   d   max_patches      ?r   g       @g      )r8   r   r   r-   pytestraises
ValueError)r:   r6   rF   rG   rH   rI   rK   rJ   r   r   r    test_extract_patches_max_patches   s    
 rY   c                 C   s*   | }t ||jdd}|jd dks&td S )Nr   rS   r   r   )r   r8   r   )r:   r6   rK   r   r   r   "test_extract_patch_same_size_image   s    rZ   c                 C   sj   | }|j \}}d| d d| d  }}|| d || d  }t|||fdd}|j |||fksftd S )Nr   r
   r   i  rS   rD   rE   r   r   r   *test_extract_patches_less_than_max_patches   s    
r[   c                 C   s8   | }d\}}t |||f}t||j}tj|| d S NrB   r   r	   r8   r   r   Zassert_array_almost_equal)r:   r6   rH   rI   rK   face_reconstructedr   r   r    test_reconstruct_patches_perfect   s
    r_   c                 C   s8   | }d\}}t |||f}t||j}tj|| d S r\   r]   )r>   r6   rH   rI   rK   r^   r   r   r   &test_reconstruct_patches_perfect_color   s
    r`   c                 C   s(   | }t dddd}|||ks$td S )N   rb   rR   r   
patch_sizerT   random_state)r   fitr   )rA   facesextrr   r   r   test_patch_extractor_fit   s    ri   c           
      C   s   | }|j dd \}}d\}}d}t|| }t||f|dd}||}	|	j |||fks^td}t|t|| d || d  |  }t||f|dd}||}	|	j |||fkstd S )Nr   r   ra   rR   r   rc   rU   )r8   lenr   	transformr   r-   )
rA   rg   rF   rG   rH   rI   rT   rJ   rh   rK   r   r   r    test_patch_extractor_max_patches   s.      
  
rl   c                 C   s:   | }t ddd}||}|jt|d ddfks6td S )NrR   r   )rT   re         )r   rk   r8   rj   r   )rA   rg   rh   rK   r   r   r   (test_patch_extractor_max_patches_default  s    
ro   c           	      C   sp   | }|j dd \}}d\}}t||| d  || d  }t||fdd}||}|j |||fksltd S Nr   r   ra   r   )rd   re   )r8   rj   r   rk   r   )	rA   rg   rF   rG   rH   rI   rJ   rh   rK   r   r   r    test_patch_extractor_all_patches  s     
rq   c           	      C   sv   t | }|jdd \}}d\}}t||| d  || d  }t||fdd}||}|j|||dfksrtd S rp   )r?   r8   rj   r   rk   r   )	r>   rg   rF   rG   rH   rI   rJ   rh   rK   r   r   r   test_patch_extractor_color  s     
rr   c                  C   s  ddddg} ddddg}ddddg}ddddg}ddddg}d	d	d	d
g}ddddg}ddddg}ddddg}ddddg}	ddddg}
ddd d!g}d"d#d$d%g}d&dd'd(g}d)d#d*d+g}| | |
 }|| | }|| | }|| | }||	 | }t |||||D ]\}}}}}tt||}t|||d,}t|}|jd | |ksRtt	d-d. t ||D }|d/|  || 
 k s tq d S )0N)r   )   )r   )r   r;   )rb   )r
   )	   )r      )rs   ru   )r   r   )r   r   )r   rs   )   rv   )   rw   )r   r   )r   r
   )r
   r   )r   r
   r    )r   r   )r   rb   )rw      )r   r   )r   rb   )r
      )rw   r
   r   )r   r   r   )   rb   rt   )r   r   r   )r   r   r   )r   rz   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   r   r   )rv   r   rv   )rv   r   r
   )patch_shapeZextraction_stepc                 s   s"   | ]\}}t ||| d V  qd S r@   )slice).0ijr   r   r   	<genexpr>C  s    z/test_extract_patches_strided.<locals>.<genexpr>)r   NN)zipr   Zarangeprodr,   r   rj   r8   r   tupleZsqueezeall)Zimage_shapes_1DZpatch_sizes_1DZpatch_steps_1DZexpected_views_1DZlast_patch_1DZimage_shapes_2DZpatch_sizes_2DZpatch_steps_2DZexpected_views_2DZlast_patch_2DZimage_shapes_3DZpatch_sizes_3DZpatch_steps_3DZexpected_views_3DZlast_patch_3DZimage_shapesZpatch_sizesZpatch_stepsZexpected_viewsZlast_patchesZimage_shaperd   Z
patch_stepZexpected_viewZ
last_patchimagerK   ndimZlast_patch_slicesr   r   r   test_extract_patches_strided  sP          r   c                 C   sX   | }|j \}}d}|| d || d f}t||d}|j |d |d ||fksTtd S )Nrb   r   )r{   r   )r8   r   r   )r:   r6   rF   rG   prJ   rK   r   r   r   test_extract_patches_squareK  s    
r   c               	   C   sf   t dddgdddgddd	gg} tt t| d
 W 5 Q R X tt t| d W 5 Q R X d S )Nr   r   r   r
   rw   rv   rz   rb   rt   )r
   r   )r   r
   )r   r&   rV   rW   rX   r   )r   r   r   r   test_width_patchU  s
    "r   c              	   C   s>   t | }d}tdd}tjt|d || W 5 Q R X dS )zICheck that an informative error is raised if the patch_size is not valid.z*patch_size must be a tuple of two integers)rb   rb   rb   )rd   )matchN)r?   r   rV   rW   rX   rk   )r>   rg   err_msgZ	extractorr   r   r    test_patch_extractor_wrong_input^  s
    
r   ))numpyr   rV   Zscipyr   Zscipy.sparse.csgraphr   Z sklearn.feature_extraction.imager   r   r   r   r   r	   r   r(   r1   r7   r9   Zfixturer:   r>   r?   rA   rL   rM   rQ   rY   rZ   r[   r_   r`   ri   rl   ro   rq   rr   r   r   r   r   r   r   r   r   <module>   sB    
$

	
		
				

/
	