ó
    ÷“,jô  ã                   ó  • S SK Jr  S SKJr  S SKJrJrJrJrJ	r	  S SK
r
S SKJs  Jr  S r   SS\\   S\\	\\4      S\\   S	\	\\
R$                  4   S
\4
S jjr  SS\\   S\\	\\4      S	\	\\
R$                  4   S
\4S jjrg)é    )Úpartial)Úislice)ÚCallableÚListÚOptionalÚSequenceÚUnionNc              #   óf   #   • [        U 5      n [        [        X!5      5      nU(       d  gUv •  M"  7f)zœBatch data into lists of length *n*. The last batch may be shorter.
NOTE based on more-itertools impl, to be replaced by python 3.12 itertools.batched impl
N)ÚiterÚlistr   )ÚiterableÚnÚitÚbatchs       Ú¬C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\open_clip/zero_shot_classifier.pyÚbatchedr   	   s1   é € ô 
ˆh‹€BØ
Ü”V˜B“]Ó#ˆÞØØŠñ	 ùs   ‚/1Ú
classnamesÚ	templatesÚnum_classes_per_batchÚdeviceÚuse_tqdmc                 ó~  ^ ^^^^^• [        T[        5      (       a  [        T5      S:”  d   e[        U[        5      (       a  [        U5      S:”  d   e[        TS   [        5      m[        T5      m[        U5      nU(       a)  SSKnUc  SO
US-
  U-  S-   n	[        UR                  X”S9n
O[        n
UU UUUU4S jn[        R                  " 5          U(       a<  U
" [        X$5      5       Vs/ s H
  oË" U5      PM     nn[        R                  " USS9nOU" U5      nSSS5        U$ s  snf ! , (       d  f       W$ = f)aÕ  Build zero-shot classifier weights by iterating over class names in batches
Args:
    model: CLIP model instance
    tokenizer: CLIP tokenizer instance
    classnames: A sequence of class (label) names
    templates: A sequence of callables or format() friendly strings to produce templates per class name
    num_classes_per_batch: The number of classes to batch together in each forward, all if None
    device: Device to use.
    use_tqdm: Enable TQDM progress bar.
r   Né   )ÚtotalÚ
unit_scalec                 ól  >• [        U 5      nU  VVs/ s H-  nT	  H#  nT(       a  UR                  U5      OU" U5      PM%     M/     nnnT
" U5      R                  T5      nTR                  USS9nUR	                  UTS5      R                  SS9nXUR                  SSS9-  nUR                  nU$ s  snnf )NT)Ú	normalizeéÿÿÿÿr   ©Údim)r    Úkeepdim)ÚlenÚformatÚtoÚencode_textÚreshapeÚmeanÚnormÚT)Úbatch_classnamesÚnum_batch_classesÚcÚtemplateÚtextsÚclass_embeddingsr   ÚmodelÚnum_templatesr   Ú	tokenizerÚ
use_formats         €€€€€€r   Ú_process_batchÚ2build_zero_shot_classifier.<locals>._process_batch4   sÈ   ø€ ÜÐ 0Ó1ÐÙL\ÔwÒL\ÀqÔmvÐai¦z�—‘ Ô#±xÀ³{ÒBÑmvÑBÑL\ˆÑwÙ˜%Ó ×#Ñ# FÓ+ˆØ ×,Ñ,¨U¸dÐ,ÐCÐØ+×3Ñ3Ð4EÀ}ÐVXÓY×^Ñ^ÐcdÐ^ÐeÐØ+×.CÑ.CÈÐSWÐ.CÐ.XÑXÐØ+×-Ñ-ÐØÐùó xs   ’4B0r   )Ú
isinstancer   r"   ÚstrÚtqdmr   r   ÚtorchÚno_gradr   Úcat)r0   r2   r   r   r   r   r   Únum_classesr8   Únum_iterÚ	iter_wrapr4   r   Úbatched_embedsÚzeroshot_weightsr1   r3   s   `` ` `         @@r   Úbuild_zero_shot_classifierrA      s  ý€ ô& �i¤×*Ñ*¬s°9«~ÀÓ/AÐAÐAÜ�j¤(×+Ñ+´°J³À!Ó0CÐCÐCÜ˜I a™L¬#Ó.€JÜ˜	“N€MÜ�j“/€KÞÛØ-Ñ5‘1¸[È1¹_ÐQfÑ<fÐijÑ<jˆÜ˜DŸI™I¨XÑX‰	äˆ	÷ ò  ô 
�Š�Þ ÙAJÌ7ÐS]ÓKuÔAvÓwÒAv¸˜n¨UÖ3ÑAvˆNÐwÜ$Ÿyšy¨¸QÑ?Ñá-¨jÓ9Ð÷ 
ð Ðùò	 x÷ 
Œð Ðús   ÃD-Ã-D(Ã> D-Ä(D-Ä-
D<c                 ó  • [        U[        5      (       a  [        U5      S:”  d   e[        U[        5      (       a  [        U5      S:”  d   eU(       a  SSKnUR                  nO[        n[        US   [
        5      n[        R                  " 5          / n	U" U5       HŸ  n
U Vs/ s H"  o¸(       a  UR                  U
5      OU" U
5      PM$     nnU" U5      R                  U5      nU R                  U5      n[        R                  " USS9R                  SS9nXîR                  5       -  nU	R                  U5        M¡     [        R                   " U	SS9R                  U5      n	SSS5        U	$ s  snf ! , (       d  f       W	$ = f)aq  Build zero-shot classifier weights by iterating over class names 1 by 1
Args:
    model: CLIP model instance
    tokenizer: CLIP tokenizer instance
    classnames: A sequence of class (label) names
    templates: A sequence of callables or format() friendly strings to produce templates per class name
    device: Device to use.
    use_tqdm: Enable TQDM progress bar.
r   Nr   r   r   )r6   r   r"   r8   r   r7   r9   r:   r#   r$   r%   ÚFr   r'   r(   ÚappendÚstack)r0   r2   r   r   r   r   r8   r>   r3   r@   Ú	classnamer-   r.   r/   Úclass_embeddings                  r   Ú!build_zero_shot_classifier_legacyrH   G   sT  € ô" �i¤×*Ñ*¬s°9«~ÀÓ/AÐAÐAÜ�j¤(×+Ñ+´°J³À!Ó0CÐCÐCÞÛØ—I‘I‰	äˆ	ä˜I a™L¬#Ó.€Jä	�Š�ØÐÙ" :Ö.ˆIÙgpÓqÒgpÐ[cµ:�X—_‘_ YÔ/Á8ÈIÓCVÒVÑgpˆEÐqÙ˜eÓ$×'Ñ'¨Ó/ˆEØ$×0Ñ0°Ó7ÐÜŸkškÐ*:ÀÑC×HÑHÈQÐHÐOˆOØ×3Ñ3Ó5Ñ5ˆOØ×#Ñ# OÖ4ñ /ô !Ÿ;š;Ð'7¸QÑ?×BÑBÀ6ÓJÐ÷ 
ð Ðùò r÷ 
Œð Ðús   ÂE4Â%)E/ÃBE4Å/E4Å4
F)é
   ÚcpuF)rJ   F)Ú	functoolsr   Ú	itertoolsr   Útypingr   r   r   r   r	   r9   Útorch.nn.functionalÚnnÚ
functionalrC   r   r7   Úintr   ÚboolrA   rH   © ó    r   Ú<module>rU      sÛ   ðÝ Ý ß <Õ <ã ß Ð ò	ð" 02Ø+0Øñ/ð ˜S‘Mð/ð ˜E (¨C -Ñ0Ñ1ð	/ð
  (¨™}ð/ð �c˜5Ÿ<™<Ð'Ñ(ð/ð õ/ðn ,1Øñ&ð ˜S‘Mð&ð ˜E (¨C -Ñ0Ñ1ð	&ð
 �c˜5Ÿ<™<Ð'Ñ(ð&ð ö&rT   