
    Q3j3                        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lmZ d Zd Zd Zd	 Zd
 Zej*                  d        Zej*                  d        Zd Zej*                  d        Zd Zd Zd Zd Zd Zd Zd Z d Z!ejD                  jG                  dg d      d        Z$d Z%d Z&d Z'd Z(d Z)d Z*d  Z+d! Z,d" Z-y)#    N)ndimage)connected_components)PatchExtractor_extract_patchesextract_patches_2dgrid_to_graphimg_to_graphreconstruct_from_patches_2d)assert_allclosec                  L   t         j                  d dd df   dz
  \  } }t        |       }t        |      }|j                  |j                  k(  sJ t         j                  j                  |j                  |j                  dkD     |j                  |j                  dkD            y )N   
   r   )npmgridr	   nnztestingassert_array_equaldata)xygrad_xgrad_ys       X/DATA/.local/lib/python3.12/site-packages/sklearn/feature_extraction/tests/test_image.pytest_img_to_graphr      s    88BQBFb DAq!_F!_F::### JJ!!FKK!O$fkk&++/&B    c                  P   t        j                  dt              } d| d<   d| d d df<   t        j                  d      }d|d<   d|d<   d|d	<   t        || 
      j	                         }t        j
                  g dg dg dg      }t         j                  j                  ||       y )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   desireds       r   test_img_to_graph_sparser/   !   s     88F$'DDJDAJ
AAdGAdGAdG!$'//1Fhh	:z:;GJJ!!&'2r   c                      d} d}t        j                  | | ft              }d|d|d|f<   d|| d | d f<   |j                  | dz        }t	        | | |t         j
                        }t        |      d   dk(  sJ t        j                  dt              }d|d<   d|d d df<   t	        dd	d|j                         
      j                         }t        j                  g dg dg dg      }t         j                  j                  ||       t        j                  | | ft         j                        }t	        | | | |      }t        |      d   dk(  sJ t        j                  | | f      }t	        | | | |t              }|j                  t        k(  sJ t	        | | | |t              }|j                  t        k(  sJ t	        | | | |t         j                         }|j                  t         j                   k(  sJ y )Nr   r"   r    Tr   )n_xn_yr(   	return_asr   r#   r   r'   r)   )r   r"   r"   )r1   r2   n_zr(   )r1   r2   r4   r(   r!   )r   r*   r+   reshaper   ndarrayr   ravelr,   r-   r   r   onesint16r!   intfloat64)sizeroi_sizer(   Agraphr.   s         r   test_grid_to_graphr@   0   s   DH 88T4L-D#'D8QxZ	 #'D(hYZ	 <<a D$DtrzzJA"1%*** 88F$'DDJDAJ!Q

5==?Ehh	9i89GJJ!!%1 77D$<rxx0D$Dd>A"1%*** 77D$< D$DdTJA77d??$DdSIA77c>>$DdRZZPA77bjj   r   c                     | }|d d dd d df   }dD ]=  }||kD  }t        ||      }t        j                  |      d   t        |      d   k(  r=J  y )Nr   )2      r'   r"   r   )r	   r   labelr   )raccoon_face_fxtfacethrr(   r?   s        r   test_connect_regionsrH   T   sb    D!SqS>DczT-}}T"1%)=e)DQ)GGGG r   c                 0   | }|d d dd d df   }|dkD  }t        |j                  d|i}t        j                  |      d   t	        |      d   k(  sJ |dkD  }t        |j                  |d d}t        j                  |      d   t	        |      d   k(  sJ y )Nr   rB   r(   r"   r   rC   )r(   r!   )r   shaper   rD   r   )rE   rF   r(   r?   s       r   test_connect_regions_with_gridrK   ^   s    D !SqS>D"9D4::1D1E==q!%9%%@%CCCC#:D4::D=E==q!%9%%@%CCCCr   c                 .   | }|d d dd d df   |dd dd d df   z   |d d ddd df   z   |dd ddd df   z   }|d d dd d df   |dd dd d df   z   |d d ddd df   z   |dd ddd df   z   }|j                  t        j                        }|dz  }|S )Nr   r"   g      0@)astyper   float32)rE   rF   s     r   downsampled_facerO   m   s    D!SqS>DAssO+d3Q319o=QTT14a4Z@PPD!SqS>DAssO+d3Q319o=QTT14a4Z@PPD;;rzz"DDLDKr   c                     | }t        j                  |j                  dz         }d|z
  |d d d d df<   d|dz  z
  |d d d d df<   d|dz  z
  |d d d d df<   |S )Nr      r   r   r"   r   r   r*   rJ   )rO   rF   
face_colors      r   orange_facerU   w   sh    D$**t+,J*Jq!Qwq.Jq!Qwq.Jq!Qwr   c                 t    t        j                  d| j                  z         }| |d<   | dz   |d<   | dz   |d<   |S )NrQ   r   r"   r   rS   )rF   imagess     r   _make_imagesrX      sA    XXdTZZ'(FF1IqF1IqF1IMr   c                     t        |       S N)rX   )rO   s    r   downsampled_face_collectionr[      s    ())r   c                     | }|j                   \  }}d\  }}||z
  dz   ||z
  dz   z  }t        |||f      }|j                   |||fk(  sJ y )N   r^   r"   rJ   r   rO   rF   i_hi_wp_hp_wexpected_n_patchespatchess           r   test_extract_patches_allrg      sb    DzzHCHC)a-C#IM: Sz2G==/c::::r   c                     | }|j                   d d \  }}d\  }}||z
  dz   ||z
  dz   z  }t        |||f      }|j                   |||dfk(  sJ y )Nr   r]   r"   r   r_   )rU   rF   ra   rb   rc   rd   re   rf   s           r   test_extract_patches_all_colorri      sj    Dzz"1~HCHC)a-C#IM: Sz2G==/c1====r   c                     | }|d d ddf   }|j                   \  }}d\  }}||z
  dz   ||z
  dz   z  }t        |||f      }|j                   |||fk(  sJ y )N    a   )r^      r"   r_   r`   s           r   test_extract_patches_all_rectrn      ss    D2b5>DzzHCHC)a-C#IM: Sz2G==/c::::r   c                    | }|j                   \  }}d\  }}t        |||fd      }|j                   d||fk(  sJ t        d||z
  dz   z  ||z
  dz   z        }t        |||fd      }|j                   |||fk(  sJ t        j                  t
              5  t        |||fd       d d d        t        j                  t
              5  t        |||fd       d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)Nr]   d   max_patches      ?r"   g       @g      )rJ   r   r:   pytestraises
ValueError)rO   rF   ra   rb   rc   rd   rf   re   s           r    test_extract_patches_max_patchesrw      s    DzzHCHC SzsCG==S#sO+++SC#IM2cCi!mDE SzsCG==/c::::	z	"4#s= 
#	z	"4#s> 
#	" 
#	"	"	"s   C!C-!C*-C6c                 `    | }t        ||j                  d      }|j                  d   dk(  sJ y )Nr   rq   r   r"   )r   rJ   )rO   rF   rf   s      r   "test_extract_patch_same_size_imagery      s2    D !tzzqAG==q   r   c                     | }|j                   \  }}d|z  dz  d|z  dz  }}||z
  dz   ||z
  dz   z  }t        |||fd      }|j                   |||fk(  sJ y )Nr   r   r"   i  rq   r_   r`   s           r   *test_extract_patches_less_than_max_patchesr{      st    DzzHC3w!|QW\C)a-C#IM: SztDG==/c::::r   c                     | }d\  }}t        |||f      }t        ||j                        }t        j                  j                  ||       y Nr]   r   r
   rJ   r   r   assert_array_almost_equal)rO   rF   rc   rd   rf   face_reconstructeds         r    test_reconstruct_patches_perfectr      sF    DHC Sz2G4WdjjIJJ((/ABr   c                     | }d\  }}t        |||f      }t        ||j                        }t        j                  j                  ||       y r}   r~   )rU   rF   rc   rd   rf   r   s         r   &test_reconstruct_patches_perfect_colorr      sF    DHC Sz2G4WdjjIJJ((/ABr   zimage_size, patch_size)))   rR   r   r   ))rR   r   r   )r   r   ))r   rR   r   r   c                     t         j                  j                  d      } |j                  |  }t	        ||      }t        ||       }t        ||       y)zCheck that reconstruct_from_patches_2d works when a patch dimension
    equals the corresponding image dimension.

    Non-regression test for https://github.com/scikit-learn/scikit-learn/issues/10910
    r   N)r   randomRandomStaterandr   r
   r   )
image_size
patch_sizerngimagerf   reconstructeds         r   (test_reconstruct_patches_edge_patch_sizer      sJ     ))


"CCHHj!E 
3G/DME=)r   c                 P    | }t        dd|      }||j                  |      k(  sJ y )N   r   rp   r   rr   random_state)r   fit)r[   global_random_seedfacesextrs       r   test_patch_extractor_fitr      s1    'Es9KD 488E?"""r   c                    | }|j                   dd \  }}d\  }}d}t        |      |z  }t        ||f||      }	|	j                  |      }
|
j                   |||fk(  sJ d}t        |      t	        ||z
  dz   ||z
  dz   z  |z        z  }t        ||f||      }	|	j                  |      }
|
j                   |||fk(  sJ y )Nr"   r   r   rp   r   rs   )rJ   lenr   	transformr:   )r[   r   r   ra   rb   rc   rd   rr   re   r   rf   s              r    test_patch_extractor_max_patchesr     s    'E{{1QHCHCKUk1:;EWD nnU#G==/c::::KUc	sQ39q=)K7'  :;EWD nnU#G==/c::::r   c                     | }t        d|      }|j                  |      }|j                  t        |      dz  ddfk(  sJ y )Nrp   )rr   r         )r   r   rJ   r   )r[   r   r   r   rf   s        r   (test_patch_extractor_max_patches_defaultr     sF     (Ec8JKDnnU#G==SZ#-r26666r   c                     | }|j                   dd \  }}d\  }}t        |      ||z
  dz   z  ||z
  dz   z  }t        ||f|      }|j                  |      }	|	j                   |||fk(  sJ y Nr"   r   r   )r   r   )rJ   r   r   r   )
r[   r   r   ra   rb   rc   rd   re   r   rf   s
             r    test_patch_extractor_all_patchesr   "  s    'E{{1QHCHCUsSy1}5sQGc3Z>PQDnnU#G==/c::::r   c                     t        |       }|j                  dd \  }}d\  }}t        |      ||z
  dz   z  ||z
  dz   z  }t        ||f|      }|j	                  |      }	|	j                  |||dfk(  sJ y r   )rX   rJ   r   r   r   )
rU   r   r   ra   rb   rc   rd   re   r   rf   s
             r   test_patch_extractor_colorr   ,  s    %E{{1QHCHCUsSy1}5sQGc3Z>PQDnnU#G==/c1====r   c                  X   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}| |z   |
z   }||z   |z   }||z   |z   }||z   |z   }||	z   |z   }t        |||||      D ]  \  }}}}}t        j                  t        j                  |            j	                  |      }t        |||      }t        |      }|j                  d | |k(  sJ t        d t        ||      D              }|d|z     ||   j                         k(  j                         rJ  y )N)r   r   )   r   )r"   r   rQ   r   )r   r   )r   r   )r   )	   rQ   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   ))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_shapeextraction_stepc              3   B   K   | ]  \  }}t        |||z   d         y wrZ   )slice).0ijs      r   	<genexpr>z/test_extract_patches_strided.<locals>.<genexpr>]  s&      "
.IdaE!QUD!.Is   )r$   NN)zipr   arangeprodr5   r   r   rJ   tuplesqueezeall)image_shapes_1Dpatch_sizes_1Dpatch_steps_1Dexpected_views_1Dlast_patch_1Dimage_shapes_2Dpatch_sizes_2Dpatch_steps_2Dexpected_views_2Dlast_patch_2Dimage_shapes_3Dpatch_sizes_3Dpatch_steps_3Dexpected_views_3Dlast_patch_3Dimage_shapespatch_sizespatch_stepsexpected_viewslast_patchesimage_shaper   
patch_stepexpected_view
last_patchr   rf   ndimlast_patch_slicess                                r   test_extract_patches_stridedr   6  sw   2O-N-N1-M>O9N6N87MBOANBND@M"_4FL >1NBK >1NBK&)::=NNN =0=@LJMk;KFZ]J 		"''+./77D"z:
 ;}}Ud#}444! "
.1*j.I"
 
 $t+,6G0H0P0P0RR
#% 	 Kr   c                     | }|j                   \  }}d}||z
  dz   ||z
  dz   f}t        ||      }|j                   |d   |d   ||fk(  sJ y )Nr   r"   )r   r   )rJ   r   )rO   rF   ra   rb   pre   rf   s          r   test_extract_patches_squarer   e  sg    DzzHC	A7Q;#'A+7t3G==/24Fq4I1aPPPPr   c                  (   t        j                  g dg dg dg      } t        j                  t              5  t        | d       d d d        t        j                  t              5  t        | d       d d d        y # 1 sw Y   8xY w# 1 sw Y   y xY w)N)r"   r   r   )r   r   r   r   )r   r"   )r"   r   )r   r-   rt   ru   rv   r   )r   s    r   test_width_patchr   o  s`    
)Y	23A	z	"1f% 
#	z	"1f% 
#	" 
#	"	"	"s   A<&B<BBc                     t        |       }d}t        d      }t        j                  t        |      5  |j                  |       ddd       y# 1 sw Y   yxY w)zICheck that an informative error is raised if the patch_size is not valid.z*patch_size must be a tuple of two integers)r   r   r   )r   )matchN)rX   r   rt   ru   rv   r   )rU   r   err_msg	extractors       r    test_patch_extractor_wrong_inputr   x  sC    %E:G)4I	z	1E" 
2	1	1s   AA).numpyr   rt   scipyr   scipy.sparse.csgraphr    sklearn.feature_extraction.imager   r   r   r   r	   r
   sklearn.utils._testingr   r   r/   r@   rH   rK   fixturerO   rU   rX   r[   rg   ri   rn   rw   ry   r{   r   r   markparametrizer   r   r   r   r   r   r   r   r   r    r   r   <module>r      s      5  3
3!!HHD     * *;>;?$!;CC 
*
*#;07;>,^Q&#r   