
    sOiH                     z   d dl m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mZmZmZmZ  G d d      Z G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d      Zy)     )AnyN)Image)
NumpyArray)
center_cropconvert_to_rgbcrop_ndarray	normalizepil2ndarrayrescaleresizeresize_longest_edgeresize_ndarray
pad2squarec                   H    e Zd Zdee   deej
                     ee   z  fdZy)	Transformimagesreturnc                     t        d      )Nz%Subclasses must implement this method)NotImplementedError)selfr   s     j/volume1/homes/robertsu/coba/app/.venv/lib/python3.12/site-packages/fastembed/image/transform/operators.py__call__zTransform.__call__   s    !"IJJ    N)__name__
__module____qualname__listr   r   r   r    r   r   r   r      s/    KtCy KT%++->jAQ-Q Kr   r   c                   P    e Zd Zdeej                     deej                     fdZy)ConvertToRGBr   r   c                 @    |D cg c]  }t        |       c}S c c}w )N)image)r   r   r   r"   s      r   r   zConvertToRGB.__call__   s    9?@U+@@@s   N)r   r   r   r   r   r   r   r   r   r    r       s*    AtEKK0 AT%++5F Ar   r    c                   R    e Zd Zdeeef   fdZdeej                     dee   fdZ	y)
CenterCropsizec                     || _         y Nr&   )r   r&   s     r   __init__zCenterCrop.__init__    s	    	r   r   r   c                 V    |D cg c]  }t        || j                         c}S c c}w )N)r"   r&   )r   r&   r#   s      r   r   zCenterCrop.__call__#   s%    FLMfU%dii8fMMMs   &N)
r   r   r   tupleintr*   r   r   r   r   r   r   r   r%   r%      s:    U38_ NtEKK0 NT*5E Nr   r%   c                   t    e Zd Zdeee   z  deee   z  fdZdee   eee      z  dee   eee      z  fdZy)	Normalizemeanstdc                      || _         || _        y r(   r0   r1   )r   r0   r1   s      r   r*   zNormalize.__init__(   s    	r   r   r   c                 ,   |rSt        |d   t              r@|D cg c]2  }|D cg c]$  }t        || j                  | j                        & c}4 c}}S |D cg c]$  }t        || j                  | j                        & c}S c c}w c c}}w c c}w )Nr   r3   )
isinstancer   r	   r0   r1   r   r   img_patchesr"   s       r   r   zNormalize.__call__,   s     jD1 $*#)K NYY[E5tyydhh?[Y#)  QWWPVuIe$))BPVWW Z Xs   	B)BB)BBN)r   r   r   floatr   r*   r   r   r   r   r   r/   r/   '   sg    UT%[0 utE{7J X:&d:.>)??X	j	Dj!12	2Xr   r/   c                       e Zd Zej                  j
                  fdeeeef   z  dej                  fdZde	ej                     de	ej                     fdZ
y)Resizer&   resamplec                      || _         || _        y r(   r&   r;   r   r&   r;   s      r   r*   zResize.__init__;       
 	 r   r   r   c                 l    |D cg c]$  }t        || j                  | j                        & c}S c c}w )Nr=   )r   r&   r;   r#   s      r   r   zResize.__call__C   s-    SYZSY%u499t}}ESYZZZ   )1N)r   r   r   r   
ResamplingBICUBICr-   r,   r*   r   r   r   r   r   r:   r:   :   se     &+%5%5%=%=!E#s(O#! ""![tEKK0 [T%++5F [r   r:   c                   Z    e Zd ZddefdZdee   eee      z  dee   eee      z  fdZy)Rescalescalec                     || _         y r(   rF   )r   rF   s     r   r*   zRescale.__init__H   s	    
r   r   r   c                     |rHt        |d   t              r5|D cg c]'  }|D cg c]  }t        || j                         c}) c}}S |D cg c]  }t        || j                         c}S c c}w c c}}w c c}w )Nr   rH   )r5   r   r   rF   r6   s       r   r   zRescale.__call__K   s     jD1 $*#)K @KK{edjj1{K#)  CII&GE4&II L Js   	A5A0A5A;0A5N)p?)r   r   r   r8   r*   r   r   r   r   r   r   rE   rE   G   sN    e J:&d:.>)??J	j	Dj!12	2Jr   rE   c                   B    e Zd Zdeej                  ez     dee   fdZy)PILtoNDarrayr   r   c                 >    |D cg c]  }t        |       c}S c c}w r(   )r
   r#   s      r   r   zPILtoNDarray.__call__Z   s    067uE"777s   N)r   r   r   r   r   r   r   r   r   r   rL   rL   Y   s(    8tEKK*$<= 8$zBR 8r   rL   c                   v    e Zd Zdedeez  eedf   z  fdZdeej                     deej                     fdZ	y)	PadtoSquarer&   
fill_color.c                      || _         || _        y r(   r&   rP   )r   r&   rP   s      r   r*   zPadtoSquare.__init___   s    
 	$r   r   r   c                 l    |D cg c]$  }t        || j                  | j                        & c}S c c}w )N)r"   r&   rP   )r   r&   rP   r#   s      r   r   zPadtoSquare.__call__g   s6    ]c
]cTYJUtO]c
 	
 
rA   N)
r   r   r   r-   strr,   r*   r   r   r   r   r   r   rO   rO   ^   sO    %% #Ic3h/%
tEKK0 
T%++5F 
r   rO   c                       e Zd ZdZej
                  j                  fdedej
                  fdZde	ej                     de	ej                     fdZ
y)	ResizeLongestEdgezNResize images so the longest edge equals target size, preserving aspect ratio.r&   r;   c                      || _         || _        y r(   r=   r>   s      r   r*   zResizeLongestEdge.__init__p   r?   r   r   r   c                 j    |D cg c]#  }t        || j                  | j                        % c}S c c}w r(   )r   r&   r;   r#   s      r   r   zResizeLongestEdge.__call__x   s.    RXYRX#E499dmmDRXYYYs   (0N)r   r   r   __doc__r   rB   LANCZOSr-   r*   r   r   r   r   r   rV   rV   m   s[    X
 &+%5%5%=%=!! ""!ZtEKK0 ZT%++5F Zr   rV   c                   |    e Zd ZdZej
                  j                  fdedej
                  fdZde	e
   de	e
   fdZy)	ResizeForVisionEncoderz
    Resize both dimensions to be multiples of vision_encoder_max_size.
    Preserves aspect ratio approximately.
    Works on numpy arrays in (C, H, W) format.
    max_sizer;   c                      || _         || _        y r(   r]   r;   r   r]   r;   s      r   r*   zResizeForVisionEncoder.__init__       
 ! r   r   r   c                 Z   g }|D ]"  }|j                   \  }}}||z  }||k\  rmt        j                  || j                  z        | j                  z  }t	        ||z        }	t        j                  |	| j                  z        | j                  z  }	nlt        j                  || j                  z        | j                  z  }	t	        |	|z        }t        j                  || j                  z        | j                  z  }t        |||	f| j                  d      }
|j                  |
       % |S NTr&   r;   channel_first)shapemathceilr]   r-   r   r;   append)r   r   resultr"   _heightwidthaspect_ratio	new_width
new_heightresizeds              r   r   zResizeForVisionEncoder.__call__   s   E${{Avu 6>L IIedmm&;<t}}L	 \!9:
!YYzDMM'ABT]]R
 "YYv'=>N

\ 9:	 IIi$--&?@4==P	 %,"	G MM'"1 4 r   Nr   r   r   rY   r   rB   rZ   r-   r*   r   r   r   r   r   r   r\   r\   |   sR     &+%5%5%=%=!! ""!tJ/ D4D r   r\   c                       e Zd ZdZej
                  j                  fdedej
                  fdZde	e
   de	e	e
      fdZy)	ImageSplittera  
    Split images into grid of patches plus a global view.

    If image dimensions exceed max_size:
    - Divide into ceil(H/max_size) x ceil(W/max_size) patches
    - Each patch is cropped from the image
    - Add a global view (original resized to max_size x max_size)

    If image is smaller than max_size:
    - Return single image unchanged

    Works on numpy arrays in (C, H, W) format.
    r]   r;   c                      || _         || _        y r(   r_   r`   s      r   r*   zImageSplitter.__init__   ra   r   r   r   c                    g }|D ]F  }|j                   \  }}}| j                  x}}g }	||kD  s||kD  rt        j                  ||z        }
t        j                  ||z        }t        j                  ||
z        }t        j                  ||z        }t	        |
      D ]\  }t	        |      D ]L  }||z  }||z  }t        ||z   |      }t        ||z   |      }t        |||||d      }|	j                  |       N ^ t        |||f| j                  d      }|	j                  |       n|	j                  |       |j                  |	       I |S )NT)x1y1x2y2re   rd   )
rf   r]   rg   rh   rangeminr   ri   r   r;   )r   r   rj   r"   rk   rl   rm   
max_height	max_widthframesnum_splits_hnum_splits_woptimal_heightoptimal_widthrcstart_xstart_yend_xend_ycroppedglobal_views                         r   r   zImageSplitter.__call__   sc   E${{Avu%)]]2JF
"ei&7#yy*)<=#yy):; "&6L+@!A $		%,*> ? |,A"<0"#m"3"#n"4 #Gm$;U C #Gn$<f E #/!g'e]a# g. 1 - -#Z0!]]"&	 k* e$ MM&!Y \ r   Nrr   r   r   r   rt   rt      sW    " &+%5%5%=%=!! ""!1tJ/ 1Dj9I4J 1r   rt   c                       e Zd ZdZej
                  j                  fdedej
                  fdZde	e
   de	e	e
      fdZy)	SquareResizezr
    Resize images to square dimensions (max_size x max_size).
    Works on numpy arrays in (C, H, W) format.
    r&   r;   c                      || _         || _        y r(   r=   r>   s      r   r*   zSquareResize.__init__   r?   r   r   r   c           	          |D cg c]2  }t        || j                  | j                  f| j                  d      g4 c}S c c}w rc   )r   r&   r;   r#   s      r   r   zSquareResize.__call__  sR      
  	 DII 6^b
  
 	
 
s   7?Nrr   r   r   r   r   r      sW     &+%5%5%=%=!! ""!
tJ/ 
Dj9I4J 
r   r   c                   D   e Zd Zdee   fdZdeej                     ee   z  dee   eej                     z  fdZe	de
eef   dd fd       Zedee   de
eef   ddfd	       Ze	dee   de
eef   ddfd
       Zedee   de
eef   ddfd       Zedee   de
eef   ddfd       Ze	dee   de
eef   ddfd       Zedee   de
eef   ddfd       Zedee   de
eef   ddfd       Zedee   de
eef   ddfd       Zeddedz  dej.                  fd       Zy)Compose
transformsc                     || _         y r(   r   )r   r   s     r   r*   zCompose.__init__  s	    $r   r   r   c                 8    | j                   D ]
  } ||      } |S r(   r   )r   r   	transforms      r   r   zCompose.__call__  s!     Iv&F )r   configc                 8   g }| j                  ||       | j                  ||       | j                  ||       | j                  ||       | j	                  ||       | j                  ||       | j                  ||       | j                  ||        | |      S )aX  Creates processor from a config dict.
        Args:
            config (dict[str, Any]): Configuration dictionary.

                Valid keys:
                    - do_resize
                    - resize_mode
                    - size
                    - fill_color
                    - do_center_crop
                    - crop_size
                    - do_rescale
                    - rescale_factor
                    - do_normalize
                    - image_mean
                    - mean
                    - image_std
                    - std
                    - resample
                    - interpolation
                Valid size keys (nested):
                    - {"height", "width"}
                    - {"shortest_edge"}
                    - {"longest_edge"}

        Returns:
            Compose: Image processor.
        r   )_get_convert_to_rgb_get_resize_get_pad2square_get_center_crop_get_pil2ndarray_get_image_splitting_get_rescale_get_normalize)clsr   r   s      r   from_configzCompose.from_config  s    < ')

F3
F+J/Z0Z0  V4V,:v.j))r   Nc                 6    | j                  t                      y r(   )ri   r    r   r   s     r   r   zCompose._get_convert_to_rgbB      ,.)r   c           	         |j                  dd      }|dv r|j                  dd      rr|d   }d|v r|d   }nd|v rd	|v r|d   |d	   f}nt        d
      |j                  t        ||j                  dt        j
                  j                                     y y |dk(  r d|v r&d|d   vrt        d|d   j                                |d   d   }|j                  dd      }|dk  rpt        ||z        }|j                  t        ||j                  dt        j
                  j                                     |j                  t        ||f             y |j                  t        ||f|j                  dt        j
                  j                                     y |dk(  r|j                  d      }t        |t              r| j                  |      }	n|xs t        j
                  j                  }	d|v r8|j                  dd      }
|
dk(  r |j                  t        |d   |	             y y y |dk(  r|j                  dd      r|j                  di       }d|vrt        d      |j                  dt        j
                  j                        }	t        |	t              rt	        j
                  |	      }	|j                  t        |d   |	             y y t        d| d      )Nimage_processor_typeCLIPImageProcessorr   SiglipImageProcessor	do_resizeFr&   shortest_edgerl   rm   zASize must contain either 'shortest_edge' or 'height' and 'width'.r;   r=   ConvNextFeatureExtractorz6Size dictionary must contain 'shortest_edge' key. Got crop_pctg      ?i  r)   JinaCLIPImageProcessorinterpolationresize_modeshortestIdefics3ImageProcessorlongest_edgezJSize dictionary must contain 'longest_edge' key for Idefics3ImageProcessorPreprocessor  is not supported)get
ValueErrorri   r:   r   rB   rC   keysr-   r%   r5   rT   _interpolation_resolverrZ   rV   )r   r   r   moder&   r   r   resize_shortest_edger   r;   r   s              r   r   zCompose._get_resizeF  s   zz02FGAAzz+u-f~"d*0D%'T/ NDM:D$[  !!!!'J8H8H8P8P!Q .  //O6&>$I LVTZ^M`M`MbLcd  #6N?;Mzz*e4Hs"'*=8+C'D$!!1!'J8H8H8P8P!Q !!*=-2P"QR!!+];!'J8H8H8P8P!Q --"JJ7M--66}E(DE,<,<,D,D$jj
C*,%%!'%- -   --zz+u-zz&"-!-$d 
 "::j%2B2B2J2JKh,$//9H!!%!.1!) .& }TF2CDEEr   c                 T   |j                  dd      }|dv rr|j                  dd      r_|d   }t        |t              r||f}n)t        |t              r|d   |d   f}nt	        d	|       | j                  t        |
             y y |dk(  ry |dk(  ry |dk(  ry t	        d| d      )Nr   r   r   do_center_cropF	crop_sizerl   rm   zInvalid crop size: r)   r   r   r   r   r   )r   r5   r-   dictr   ri   r%   )r   r   r   crop_size_rawr   s        r   r   zCompose._get_center_crop  s    zz02FGAAzz*E2 &{ 3mS1!. >It4!.x!8-:P QI$':=/%JKK!!*)"<= 3 //----}TF2CDEEr   c                 6    | j                  t                      y r(   )ri   rL   r   s     r   r   zCompose._get_pil2ndarray  r   r   c                    |j                  dd      }|dk(  r|j                  dd      }|j                  di       j                  dd      }|j                  d	t        j                  j                        }t	        |t
              rt        j                  |      }|r7|j                  t        ||             |j                  t        ||             y
|j                  t        ||             y
y
)z
        Add image splitting transforms for Idefics3.
        Handles conditional logic: splitting vs square resize.
        Must be called AFTER PILtoNDarray.
        r   r   r   do_image_splittingFmax_image_sizer   i   r;   N)
r   r   rB   rZ   r5   r-   ri   r\   rt   r   )r   r   r   r   do_splittingr]   r;   s          r   r   zCompose._get_image_splitting  s     zz02FG++!::&:EBLzz"2B7;;NCPHzz*e.>.>.F.FGH(C( ++H5!!"88"LM!!-("CD!!,x"BC ,r   c                     |j                  dd      r.|j                  dd      }| j                  t        |             y y )N
do_rescaleTrescale_factorrJ   rH   )r   ri   rE   )r   r   r   s      r   r   zCompose._get_rescale  s9    ::lD)#ZZ(8'BNgN;< *r   c                     |j                  dd      r#| j                  t        |d   |d                y d|v r(d|v r#| j                  t        |d   |d                y y y )Ndo_normalizeF
image_mean	image_stdr3   r0   r1   )r   ri   r/   r   s     r   r   zCompose._get_normalize  sb    ::ne,iVL-AvkGZ[\v%6/iVF^OP #2r   c           	          |j                  dd      }|dk(  ry |dk(  ry |dk(  r0| j                  t        |d   |j                  dd                   y y )	Nr   r   r   r   r&   rP   r   rR   )r   ri   rO   )r   r   r   s      r   r   zCompose._get_pad2square  se    zz02FG''//--%zz,: .r   r;   c                    t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  t         j                  j                  t         j                  j                  d}| r#|j                  | j                               x}r|S t        d|        )N)nearestlanczosbilinearbicubicboxhammingzUnknown interpolation method: )r   rB   NEARESTrZ   BILINEARrC   BOXHAMMINGr   lowerr   )r;   interpolation_mapmethods      r   r   zCompose._interpolation_resolver  s     ''//''//((11''//##''''//
 #4#8#89I#JJJM9(DEEr   r(   )r   r   r   r   r   r*   r   r   r   classmethodr   rT   r   r   staticmethodr   r   r   r   r   r   r   r   rB   r   r   r   r   r   r     sq   %4	? %5;;'$z*::	j	D-	- &*c3h &*I &* &*P *Y *c3h *TX * * OFT)_ OFd38n OFQU OF OFb FT)_ Fd38n FQU F F, *T)_ *d38n *QU * * Dd9o DtCQTH~ DZ^ D D* =i =$sCx. =T = =
 Q4	? QDcN Qt Q Q DO T#s(^ PT   F#* F@P@P F Fr   r   )typingr   rg   PILr   fastembed.common.typesr   $fastembed.image.transform.functionalr   r   r   r	   r
   r   r   r   r   r   r   r    r%   r/   r:   rE   rL   rO   rV   r\   rt   r   r   r   r   r   <module>r      s       -  K K
A9 A
N NX	 X&
[Y 
[Ji J$89 8

) 
Z	 Z+Y +\HI HV
9 
2eF eFr   