
    {Kgz/                     B   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 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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_2dc                  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       o/home/alanp/www/video.onchill/myenv/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!   )r0   r1   n_zr'   )r0   r1   r3   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_regionsrG   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   rA   r'   r!   r   rB   )r'   r    )r   shaper   rC   r   )rD   rE   r'   r>   s       r   test_connect_regions_with_gridrJ   ^   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)rD   rE   s     r   downsampled_facerN   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)   rI   )rN   rE   
face_colors      r   orange_facerT   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 )NrP   r   r!   r   rR   )rE   imagess     r   _make_imagesrW      sA    XXdTZZ'(FF1IqF1IqF1IMr   c                     t        |       S N)rW   )rN   s    r   downsampled_face_collectionrZ      s    ())r   c                     | }|j                   \  }}d\  }}||z
  dz   ||z
  dz   z  }t        |||f      }|j                   |||fk(  sJ y )N   r]   r!   rI   r   rN   rE   i_hi_wp_hp_wexpected_n_patchespatchess           r   test_extract_patches_allrf      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^   )rT   rE   r`   ra   rb   rc   rd   re   s           r   test_extract_patches_all_colorrh      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_rectrm      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      )rI   r   r9   pytestraises
ValueError)rN   rE   r`   ra   rb   rc   re   rd   s           r    test_extract_patches_max_patchesrv      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   rp   r   r!   )r   rI   )rN   rE   re   s      r   "test_extract_patch_same_size_imagerx      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  rp   r^   r_   s           r   *test_extract_patches_less_than_max_patchesrz      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
   rI   r   r   assert_array_almost_equal)rN   rE   rb   rc   re   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}   )rT   rE   rb   rc   re   r   s         r   &test_reconstruct_patches_perfect_colorr      sF    DHC Sz2G4WdjjIJJ((/ABr   c                 P    | }t        ddd      }||j                  |      k(  sJ y )N   r   ro   r   
patch_sizerq   random_state)r   fit)rZ   facesextrs      r   test_patch_extractor_fitr      s+    'EV1MD488E?"""r   c                    | }|j                   dd \  }}d\  }}d}t        |      |z  }t        ||f|d      }|j                  |      }	|	j                   |||fk(  sJ d}t        |      t	        ||z
  dz   ||z
  dz   z  |z        z  }t        ||f|d      }|j                  |      }	|	j                   |||fk(  sJ y )Nr!   r   r   ro   r   r   rr   )rI   lenr   	transformr9   )
rZ   r   r`   ra   rb   rc   rq   rd   r   re   s
             r    test_patch_extractor_max_patchesr      s    'E{{1QHCHCKUk1:;QD nnU#G==/c::::KUc	sQ39q=)K7'  :;QD nnU#G==/c::::r   c                     | }t        dd      }|j                  |      }|j                  t        |      dz  ddfk(  sJ y )Nro   r   )rq   r         )r   r   rI   r   )rZ   r   r   re   s       r   (test_patch_extractor_max_patches_defaultr     sC    'Ec:D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d      }|j                  |      }|j                   |||fk(  sJ y Nr!   r   r   r   )r   r   )rI   r   r   r   )	rZ   r   r`   ra   rb   rc   rd   r   re   s	            r    test_patch_extractor_all_patchesr     s    'E{{1QHCHCUsSy1}5sQGc3Za@DnnU#G==/c::::r   c                     t        |       }|j                  dd \  }}d\  }}t        |      ||z
  dz   z  ||z
  dz   z  }t        ||fd      }|j	                  |      }|j                  |||dfk(  sJ y r   )rW   rI   r   r   r   )	rT   r   r`   ra   rb   rc   rd   r   re   s	            r   test_patch_extractor_colorr     s    %E{{1QHCHCUsSy1}5sQGc3Za@D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   rP   r   )r   r   )r   r   )r   )	   rP   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rY   )slice).0ijs      r   	<genexpr>z/test_extract_patches_strided.<locals>.<genexpr>C  s&      "
.IdaE!QUD!.Is   )r#   NN)zipr   arangeprodr4   r   r   rI   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_patchimagere   ndimlast_patch_slicess                                r   test_extract_patches_stridedr     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   )rI   r   )rN   rE   r`   ra   prd   re   s          r   test_extract_patches_squarer   K  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,   rs   rt   ru   r   )r   s    r   test_width_patchr   U  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)rW   r   rs   rt   ru   r   )rT   r   err_msg	extractors       r    test_patch_extractor_wrong_inputr   ^  sC    %E:G)4I	z	1E" 
2	1	1s   AA))numpyr   rs   scipyr   scipy.sparse.csgraphr    sklearn.feature_extraction.imager   r   r   r   r	   r
   r   r.   r?   rG   rJ   fixturerN   rT   rW   rZ   rf   rh   rm   rv   rx   rz   r   r   r   r   r   r   r   r   r   r   r    r   r   <module>r      s   
    5 
3!!HHD     * *;>;?$!;CC#;07;>,^Q&#r   