o
    i0                     @   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J t j|j|jdk |j|jdk  d S )N   
   r   )npZmgridr   Znnztestingassert_array_equaldata)xygrad_xZgrad_y r   e/home/kim/smarthome/.venv/lib/python3.10/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 g dg dg dg}t j|| d S )N      dtype   r   r   r   )r   r   r   r   maskr   r   r   )r   r   r   )r   r   r   )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s=J t jdtd}d|d< d|d d df< tdd	d| d
 }t 	g dg dg dg}t j
|| t j| | ft jd}t| | | |d}t|d dksJ t | | f}t| | | |td}|jtksJ t| | | |td}|jtksJ t| | | |t jd}|jt jksJ d S )Nr   r   r   Tr   )n_xn_yr!   Z	return_asr   r   r   r    r"   )r   r   r   )r)   r*   n_zr!   )r)   r*   r+   r!   r   )r   r#   r$   reshaper   Zndarrayr   Zravelr%   r&   r   r   ZonesZint16r   intZfloat64)sizeZroi_sizer!   Agraphr'   r   r   r   test_grid_to_graph/   s0   r1   c                 C   s\   | }|d d dd d df }dD ]}||k}t ||d}t|d t|d ks+J qd S )Nr
   )2      r    r   r   )r   r   labelr   )raccoon_face_fxtfaceZthrr!   r0   r   r   r   test_connect_regionsS   s    r7   c                 C   s   | }|d d dd d df }|dk}t |jd|i}t|d t|d ks)J |dk}t |j|d d}t|d t|d ksEJ d S )Nr
   r2   r!   r   r   r3   )r!   r   )r   shaper   r4   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_facel   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_facev   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s(J d S )N   rC   r   r8   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s-J 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s2J 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J td|| d  || d  }t|||fdd}|j |||fksAJ tt t|||fdd W d    n1 sZw   Y  tt t|||fdd W d    d S 1 syw   Y  d S )NrB   d   max_patches      ?r   g       @g      )r8   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J d S )Nr   rS   r   r   )r   r8   )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s3J d S )Nr   r
   r   i  rS   rD   rE   r   r   r   *test_extract_patches_less_than_max_patches   s   
r[   c                 C   8   | }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   
   r`   c                 C   r\   r]   r^   )r>   r6   rH   rI   rK   r_   r   r   r   &test_reconstruct_patches_perfect_color   ra   rb   c                 C   s(   | }t dd|d}|||ksJ d S )N   rd   rR   
patch_sizerT   random_state)r   fit)rA   global_random_seedfacesextrr   r   r   test_patch_extractor_fit   s
   rl   c                 C   s   | }|j dd \}}d\}}d}t|| }t||f||d}	|	|}
|
j |||fks/J d}t|t|| d || d  |  }t||f||d}	|	|}
|
j |||fks]J d S )Nr   r   rc   rR   re   rU   )r8   lenr   	transformr-   )rA   ri   rj   rF   rG   rH   rI   rT   rJ   rk   rK   r   r   r    test_patch_extractor_max_patches   s&   



ro   c                 C   s:   | }t d|d}||}|jt|d ddfksJ d S )NrR   )rT   rg         )r   rn   r8   rm   )rA   ri   rj   rk   rK   r   r   r   (test_patch_extractor_max_patches_default  s   
 rr   c           
      C   sp   | }|j dd \}}d\}}t||| d  || d  }t||f|d}||}	|	j |||fks6J d S Nr   r   rc   )rf   rg   )r8   rm   r   rn   )
rA   ri   rj   rF   rG   rH   rI   rJ   rk   rK   r   r   r    test_patch_extractor_all_patches  s    
rt   c           
      C   sv   t | }|jdd \}}d\}}t||| d  || d  }t||f|d}||}	|	j|||dfks9J d S rs   )r?   r8   rm   r   rn   )
r>   ri   rj   rF   rG   rH   rI   rJ   rk   rK   r   r   r   test_patch_extractor_color  s    
ru   c                  C   sR  g d} g d}g d}g d}g d}g d}g d}g d}g d	}g d
}	g d}
g d}g d}g d}g d}| | |
 }|| | }|| | }|| | }||	 | }t |||||D ]D\}}}}}tt||}t|||d}t|}|jd | |ksJ tdd t ||D }|d|  || 	 k
 sJ qbd S )N)r   rv   )   rv   )r   r   r;   rd   )rx   rx   )r
   ry   )rv   )	   r;   ry   )rv   rz   rz   ry   )r      r|   r|   )rw   r}   ))r   r   )r   r   )r   rw   )   r~   ))   r   )r   r   )r   r
   )r
   r   ))r   r
   r   )r   r   )r   rd   ))r      )r   r   )r   rd   )r
      ))r   r
   r   )r   r   r      rd   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   r   r   )r
   r   r   )r   r   r   ))r   r   r   r   )r~   r   r~   )r~   r   r
   )patch_shapeZextraction_stepc                 s   s$    | ]\}}t ||| d V  qd S r@   )slice).0ijr   r   r   	<genexpr>F  s    
z/test_extract_patches_strided.<locals>.<genexpr>)r   NN)zipr   Zarangeprodr,   r   rm   r8   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_shaperf   Z
patch_stepZexpected_viewZ
last_patchimagerK   ndimZlast_patch_slicesr   r   r   test_extract_patches_strided  sH   
r   c                 C   sX   | }|j \}}d}|| d || d f}t||d}|j |d |d ||fks*J d S )Nrd   r   )r   r   )r8   r   )r:   r6   rF   rG   prJ   rK   r   r   r   test_extract_patches_squareN  s   
"r   c                  C   s   t g dg dg dg} tt t| d W d    n1 s#w   Y  tt t| d W d    d S 1 s>w   Y  d S )N)r   r   r   )r
   r   r~   r   )r
   r   )r   r
   )r   r&   rV   rW   rX   r   )r   r   r   r   test_width_patchX  s   "r   c                 C   sT   t | }d}tdd}tjt|d || W d   dS 1 s#w   Y  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)rd   rd   rd   )rf   )matchN)r?   r   rV   rW   rX   rn   )r>   rj   err_msgZ	extractorr   r   r    test_patch_extractor_wrong_inputa  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`   rb   rl   ro   rr   rt   ru   r   r   r   r   r   r   r   r   <module>   sD    
$

	
		
					

/
	