+
    UV-j¬6  ã                   ó  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ^ RI
Ht ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt R
 R ltR R ltR R ltRR ltR tRR R lltR tR t] R8X  d
   ]! 4        R# R# )é    N)ÚPath)ÚOptional)Úload_dataset)Útqdm)Úload)Ú	inference)Úbatch_generate)Útop_p_samplingc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚsampleÚreturn)ÚdictÚstr)Úformats   "Úg/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/evals/ocrbench.pyÚ__annotate__r      s   € ÷ ñ œTð ¤cñ ó    c                ó   € V R,          # )zFormat the question.Úquestion© )r   s   &r   Úprocess_questionr      s   € à�*ÕÐr   c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r   ÚresponseÚproblemr   )r   r   r   )r   s   "r   r   r      s%   € ÷ ñ œsð ¬Tð ´h¼sµmñ r   c                ó6   € V '       g   R# V P                  4       # )z5Normalize the model's response to extract the answer.N)Ústrip)r   r   s   &&r   Únormalize_answerr      s   € çÙØ�>‰>ÓÐr   c                óR   € V ^8„  d   QhR\         \        ,          R\        R\        /# )r   Ú
predictionÚground_truthr   )r   r   ÚlistÚbool)r   s   "r   r   r       s*   € ÷ Eñ E¤¬¥ð E¼Tð EÄdñ Er   c                óÀ   a€ V f   R# V P                  4       P                  4       o\        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # )z@Check if any ground truth answer is contained in the prediction.Fc              3   óx   <"  € T F/  p\        V4      P                  4       P                  4       S9   x € K1  	  R # 5i)N)r   r   Úlower)Ú.0ÚaÚpreds   & €r   Ú	<genexpr>Ú"evaluate_answer.<locals>.<genexpr>%   s)   øé € ÐD±|°!Œs�1‹v�|‰|‹~×#Ñ#Ó%¨Ö-³|ùs   ƒ7:T)r   r&   Úany)r    r!   r)   s   &&@r   Úevaluate_answerr-       sL   ø€ àÒÙØ×ÑÓ×#Ñ#Ó%€Dß‹3ÔD±|ÓD�3Œ3ÐDŠ3ÐDˆ3ÔD±|ÓDÓDÐDr   c                 ó¼  € ^ p\        V 4      p/ pV  FÏ  pVR,          p\        V\        4      '       d.   VP                  R4       U	u. uF  q™P	                  4       NK  	  pp	VR,          p
\        W¨4      pW·R&   V'       d
   V^,          pVR,          pWÆ9  d	   R^ R^ /Wl&   Wl,          R;;,          ^,          uu&   V'       g   K´  Wl,          R;;,          ^,          uu&   KÑ  	  V^ 8”  d	   WE,          M^ p\        VP                  4      pVP                  RRR7       Wâ R	V R	VP                   R
2,          p. R+Op\        VRRRR7      ;_uu_ 4       p\        P                  ! VVR7      pVP                  4        V  Fj  pVP                  4       p\        VR,          \        4      '       d*   RP                  \!        \        VR,          4      4      VR&   VP#                  V4       Kl  	  RRR4       RVRVP$                  RVP                  RVRVRVRV/pWâ R	V R	VP                   R2,          p\        VR4      ;_uu_ 4       p\&        P(                  ! VV^R7       RRR4       \+        RR, 24       \+        V R24       \+        R, 4       \+        RVR,           24       \+        RVP                   24       \+        RV 24       \+        RV 24       \+        R V^d,          R! R"24       \        VP-                  4       4      ^8”  d    \+        R.4       \+        R#4       \+        R- 4       VP-                  4        FJ  w  ppVR,          pVR,          pV^ 8”  d
   VV,          M^ p\+        R$V R%V R&V R'V^d,          R! R(2	4       KL  	  \+        R, 4       \+        R)V R*V 24       R# R# u up	i   + '       g   i     ELÒ; i  + '       g   i     ELq; i)/r   r!   Ú;r    ÚcorrectÚtypeÚtotalT)ÚparentsÚexist_okÚ_z.csvÚdatasetÚwÚ úutf-8)ÚnewlineÚencoding)Ú
fieldnamesz; NÚmodelÚsplitÚtotal_samplesÚaccuracyÚcategory_scoresz.json)ÚindentÚ
z Evaluation ResultszModel: zSplit: zTotal Samples: z	Correct: z
Accuracy: z.2fÚ%zSubcategory Scores:z  ú: Ú/z (z%)z
Results saved to z and )Úidr   r6   r1   r!   r   r    r0   zP================================================================================zP--------------------------------------------------------------------------------zQ
--------------------------------------------------------------------------------)ÚlenÚ
isinstancer   r>   r   r-   r   Ú
output_dirÚmkdirÚopenÚcsvÚ
DictWriterÚwriteheaderÚcopyr"   ÚjoinÚmapÚwriterowr6   ÚjsonÚdumpÚprintÚitems)Úresults_listÚargsÚ
model_namer6   r0   r2   rA   Úrowr!   r(   r    Ú
is_correctÚcategoryr@   rJ   Úresults_filer<   ÚfÚwriterÚout_rowÚsummaryÚsummary_fileÚscoresÚ	cat_totalÚcat_correctÚcat_accuracys   &&&&                      r   ÚOCRBench_valrh   (   s�  € Ø€GÜ�Ó€EØ€OÛˆØ˜>Õ*ˆÜ�l¤C×(Ò(à/;×/AÑ/AÀ#Ô/FÓGÑ/F¨!ŸG™GžIÑ/FˆLÐGØ˜Õ&ˆ
ä$ ZÓ>ˆ
Ø#ˆI‰ßØ�q�LˆGØ�v•;ˆØÔ*Ø)2°A°wÀÐ(BˆOÑ%ØÕ! '×*¨aÕ/Ó*ß‰:ØÕ% i×0°AÕ5Õ0ñ! ð$ #(¨!¤)ˆwŽ°€Hä�d—o‘oÓ&€JØ×Ñ˜T¨DÐÔ1à ,¨a°¨y¸¸$¿*¹*¸ÀTÐ JÕJ€Lò	€Jô 
ˆl˜C¨°g×	>Õ	>À!Ü—’ ¨jÔ9ˆØ×ÑÔÛˆCØ—h‘h“jˆGÜ˜' .Õ1´4×8Ò8Ø*.¯)©)´C¼¸WÀ^Õ=TÓ4UÓ*V�˜Ñ'Ø�O‰O˜GÖ$ñ	  ÷ 
?ð 	�Ø�4—<‘<Ø�—‘Ø˜Ø�7Ø�HØ˜?ð€Gð  ,¨a°¨y¸¸$¿*¹*¸ÀUÐ KÕK€LÜ	ˆl˜C×	 Ô	  AÜ�	Š	�'˜1 QÕ'÷ 
!ô 
ˆBˆvˆhˆ-ÔÜ	ˆWˆIÐ(Ð
)Ô*Ü	ˆVˆHÔÜ	ˆG�G˜GÕ$Ð%Ð
&Ô'Ü	ˆG�D—J‘J�<Ð
 Ô!Ü	ˆO˜E˜7Ð
#Ô$Ü	ˆI�g�YÐ
Ô Ü	ˆJ�x •| CÐ(¨Ð
*Ô+ä
ˆ?× Ñ Ó"Ó# aÔ'ÜˆoÔÜÐ#Ô%Ü��ÔØ /× 5Ñ 5Ö 7ÑˆH�fØ˜w�ˆIØ  Õ+ˆKØ6?À!´m˜;¨Ö2ÈˆLÜ�B�x�j  ; -¨q°°¸2¸lÈ3Õ>NÈsÐ=SÐSUÐVÖWñ	 !8ô
 	��ÔÜÐ# L >°°|°nÐEÖFñ (ùòA H÷@ 
?×	>Ð	>ú÷( 
!×	 Ð	 ús   ÁN1ÅBN6ÉO
Î6O	Ï
O	c                  óÈ  € \         P                  ! R R7      p V P                  R\        RRR7       V P                  R\        RR7       V P                  R	\        R
RR7       V P                  R\        RR.RR7       V P                  RRRR7       V P                  R\        RRR7       V P                  R\        RRR7       V P                  R\        RRR7       V P                  R\        RRR7       V P                  R \
        R!R"R7       V P                  R#RR$R7       V P                  R%\        ^*R&R7       V P                  R'\        ^R(R7       V P                  4       # ))z%Evaluate models on OCRBench benchmark)Údescriptionz--modelTzThe path to the MLX VLM model)r1   ÚrequiredÚhelpz--adapter-pathz8Optional path for the trained adapter weights and config)r1   rl   z	--datasetzecho840/OCRBenchzHugging Face dataset name)r1   Údefaultrl   z--splitÚtestzDataset split to evaluate on)r1   rm   Úchoicesrl   z--streamingÚ
store_truezUse streaming dataset loading)Úactionrl   z--max-samplesNz5Maximum number of samples to evaluate (for debugging)z--predictions-filezFile with predictionsz--output-dirzresults/ocrbenchzDirectory to save resultsz--max-tokensi   z$Maximum number of tokens to generatez--temperatureg        zTemperature for generationz	--verbosez#Print detailed output for debuggingz--seedzRandom seedz--batch-sizezABatch size for generation (1 = sequential, >1 = batch generation))ÚargparseÚArgumentParserÚadd_argumentr   ÚintÚfloatÚ
parse_args)Úparsers    r   rw   rw   }   sÅ  € Ü×$Ò$Ø;ô€Fð ×ÑØÜØØ,ð	 ô ð ×ÑØÜØGð ô ð
 ×ÑØÜØ"Ø(ð	 ô ð ×ÑØÜØØ�Ø+ð ô ð ×ÑØØØ,ð ô ð
 ×ÑØÜØØDð	 ô ð ×ÑØÜØØ$ð	 ô ð ×ÑØÜØ"Ø(ð	 ô ð ×ÑØÜØØ3ð	 ô ð ×ÑØÜØØ)ð	 ô ð ×ÑØØØ2ð ô ð
 ×Ñ˜¤s°B¸]ÐÔKØ
×ÑØÜØØPð	 ô ð ×ÑÓÐr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   ÚtemperatureÚtop_p)rv   )r   s   "r   r   r   Ë   s   € ÷ ñ ¤ð ¬eñ r   c                ó   a a€ R V V3R llpV# )zÐCreate a sampler function for batch generation.

For accuracy consistency across batch sizes, we use deterministic sampling
(temperature=0) by default. This ensures the same outputs regardless of batch size.
c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r   Úlogitsr   )ÚmxÚarray)r   s   "r   r   Ú$create_sampler.<locals>.__annotate__Ò   s&   € ÷ Iñ IœŸ™ð I¤R§X¡Xñ Ir   c                 óÒ   <€ S^ 8X  d   \         P                  ! V RR7      # S^ 8”  d   SR8  d   \        V SS4      # \         P                  P	                  V ^S,          ,          4      # )r   )Úaxisç      ð?éÿÿÿÿ)r   Úargmaxr
   ÚrandomÚcategorical)r~   rz   r{   s   &€€r   ÚsamplerÚcreate_sampler.<locals>.samplerÒ   sV   ø€ Ø˜!ÔÜ—9’9˜V¨"Ô-Ð-à�qŒy˜U Sœ[Ü% f¨e°[ÓAÐAä—y‘y×,Ñ,¨V°q¸;µÕ-GÓHÐHr   r   )rz   r{   r‰   s   ff r   Úcreate_samplerr‹   Ë   s   ù€ ÷Iñ Ið €Nr   c                óø  € . p. p. pV EF  pVP                  R\        VP                  R^ 4      4      4      pRV9   d)   VR,          '       d   VR,          P                  R4      p	M\        P                  ! RV R24       Kz  VP                  V	4       \        V4      p
VP                  V
4       TP                  RTRVR,          RVP                  RR	4      R
VP                  R
R	4      R\        VR4      '       d   VP                  R. 4      MVP                  R. 4      /4       EK   	  V'       g   . # \        VP                  4      p\        V VVVVP                  VVP                  R7      p. p\        VP                  V4       Fî  w  rïVP                  4       p\!        VRVR,          /4      p/ VCRVRVRR/CpVP                  V4       VP                  '       g   K[  \        P"                  ! RVR,           R24       \        P"                  ! RVR,           24       \        P"                  ! RV 24       \        P"                  ! RV 24       \        P"                  ! RVR,           24       Kð  	  V# )zžProcess a batch of samples using batch_generate.

batch_generate now handles image size sorting internally to minimize
padding effects and maintain accuracy.
rG   Ú_idxÚimageÚRGBúNo image for sample ú
, skippingr   r6   r8   r1   r!   ÚanswersÚanswer)ÚimagesÚpromptsÚ
max_tokensr‰   Úverboser   r    r0   Fú
Sample Ú:ú
Question: ú
Response: úPrediction: úGround Truth: )Úgetr   ÚconvertÚloggingÚwarningÚappendr   Úhasattrr‹   rz   r	   r–   r—   ÚzipÚtextsr   r   Úinfo)r=   Ú	processorÚbatch_samplesrY   r•   r”   Úsample_metadatar   ÚpidrŽ   Úpromptr‰   Úbatch_responseÚresultsÚtextÚmetadatar   r    Úresults   &&&&               r   Úprocess_batchr±   Þ   sL  € ð €GØ€FØ€OäˆØ�j‰j˜œs 6§:¡:¨f°aÓ#8Ó9Ó:ˆð �fÔ ¨§¤Ø˜7•O×+Ñ+¨EÓ2‰Eä�OŠOÐ2°3°%°zÐBÔCÙà�‰�eÔô " &Ó)ˆØ�‰�vÔð 	×Ñà�cØ˜F :Õ.Ø˜6Ÿ:™: i°Ó4Ø˜Ÿ
™
 6¨2Ó.Øä˜v y×1Ò1ð —J‘J˜y¨"Ô-àŸ™ H¨bÓ1ð
÷	
ñ#  ÷> Øˆ	ô ˜T×-Ñ-Ó.€Gô $ØØØØØ—?‘?ØØ—‘ô€Nð €GÜ˜n×2Ñ2°OÖD‰ˆØ—:‘:“<ˆÜ% h°¸XÀjÕ=QÐ0RÓSˆ
ð
Øð
à˜Ø˜*Ø�uñ	
ˆð 	�‰�vÔà�<�<Š<Ü�LŠL˜9 X¨d¥^Ð$4°AÐ6Ô7Ü�LŠL˜: h¨zÕ&:Ð%;Ð<Ô=Ü�LŠL˜: h ZÐ0Ô1Ü�LŠL˜<¨
 |Ð4Ô5Ü�LŠL˜>¨(°>Õ*BÐ)CÐDÖEñ# Eð& €Nr   c                  óš  € \        4       p \        P                  ! V P                  4       \        P                  ! V P
                  '       d   \        P                  M\        P                  R R7       V P                  '       dÞ   \        P                  ! RV P                   R24       \        V P                  RRR7      ;_uu_ 4       p\        P                  ! V4      p\        V4      pRRR4       \        V P                  4      P                  P!                  R4      ^ ,          pR	V P                  9   d   R	MR
p\#        XWV4       \        P                  ! R4       R# \        P                  ! RV P$                   24       \'        V P$                  V P(                  RR7      w  rg\        P                  ! RV P*                   RV P                    24       \-        V P*                  V P                   V P.                  R7      pV P0                  '       d   VP3                  V P0                  4      pV P.                  '       d   \        V4      p/ pV P4                  p	V	^8”  dê   \        P                  ! RV	 24       . p
\7        VR4      '       d   \        V4      MTp\9        V4       F	  w  rÍWÍR&   K  	  \9        \;        VRV	 R2R7      4       Fw  w  rÍV
P=                  V4       \?        V
4      V	8¼  g   V\?        V4      ^,
          8X  g   K?   \A        WgW 4      pV F  pWøVR,          &   K  	  . p
\J        PL                  ! 4        Ky  	  EMî\9        \;        VRR7      4       EFÓ  w  rÍVPO                  R\Q        V4      4      p RV9   d)   VR,          '       d   VR,          PS                  R4      pM\        PT                  ! RV R24       Km  \W        V4      p\Y        VVVVV PZ                  V P\                  R7      pVP_                  4       p\a        VV4      pRTR VR ,          R!VPO                  R!R"4      R#VPO                  R#R"4      R$\7        VR%4      '       d   VPO                  R%. 4      MVPO                  R&. 4      R'VR(VR)R*/VV&   V P
                  '       d™   \        P                  ! R+V R,24       \        P                  ! R-VR ,           24       \        P                  ! R.V 24       \        P                  ! R/V 24       \        P                  ! R0VPO                  R%. 4       24       EKÓ  EKÖ  	  \        VPc                  4       4      pV P$                  P!                  R34      R4,          pV P*                  P!                  R34      R4,          p\#        VWV4       R#   + '       g   i     ELÅ; i  \B         d:   p\        PD                  ! RT 24       \F        PH                  ! 4         Rp?ELÊRp?ii ; i  \B         d>   p\F        PH                  ! 4        \        PD                  ! R1T R2T 24        Rp?EKâ  Rp?ii ; i)5z)%(asctime)s - %(levelname)s - %(message)s)Úlevelr   z[32mLoading predictions from z for evaluation[0mÚrr9   )r;   NÚ	_OCRBenchzOCRBench-v2ÚOCRBenchz[32mEvaluation complete[0mzLoading model from T)Úadapter_pathÚtrust_remote_codezLoading dataset z, split )r>   Ú	streamingz'Using batch generation with batch_size=Ú__iter__r�   zEvaluating (batch_size=Ú))ÚdescrG   zError processing batch: Ú
EvaluatingrŽ   r�   r�   r‘   )rŽ   r–   rz   r   r6   r8   r1   r!   r’   r“   r   r    r0   Fr˜   r™   rš   r›   rœ   r�   zError processing sample rE   rF   r…   )2rw   r‡   Úseedr    ÚbasicConfigr—   ÚINFOÚWARNINGÚpredictions_filer¦   rL   rM   Ú
DictReaderr"   r   Ústemr>   rh   r=   r   r·   r6   r   r¹   Úmax_samplesÚtakeÚ
batch_sizer£   Ú	enumerater   r¢   rH   r±   Ú	ExceptionÚerrorÚ	tracebackÚ	print_excr   Úclear_cacherž   r   rŸ   r¡   r   r   r–   rz   r   r   Úvalues)rY   r_   ÚreaderÚloaded_resultsrZ   r6   r=   r§   r­   rÇ   ÚbatchÚall_samplesÚidxr   Úbatch_resultsr°   Úerª   rŽ   r«   Úoutputr   r    rX   s                           r   Úmainr×   6  s&  € Ü‹<€Dä
‡K‚K�—	‘	Ôô ×ÒØ"ŸlŸl˜lŒg�lŠl´·±Ø:õð
 ××ÐÜ�ŠØ/°×0EÑ0EÐ/FÐF\Ð]ô	
ô �$×'Ñ'¨°w×?Õ?À1Ü—^’^ AÓ&ˆFÜ! &›\ˆN÷ @ô ˜$×/Ñ/Ó0×5Ñ5×;Ñ;¸KÓHÈÕKˆ
à*¨d×.CÑ.CÔC‰MÈð 	ô 	�^ T°wÔ?Ü�ŠÐ9Ô;Ùä‡L‚LÐ& t§z¡z lÐ3Ô4ÜØ�
‰
 ×!2Ñ!2ÀdôÑ€Eô
 ‡L‚LÐ# D§L¡L >°¸$¿*¹*¸ÐFÔGÜ˜4Ÿ<™<¨t¯z©zÀTÇ^Á^ÔT€Gà××ÐØ—,‘,˜t×/Ñ/Ó0ˆð ‡~‡~€~Ü�w“-ˆà€GØ—‘€Jà�A„~ä�ŠÐ>¸z¸lÐKÔLð ˆÜ'.¨w¸
×'CÒ'C”d˜7”mÈˆô % [Ö1‰KˆCØ �6‹Nñ 2ô %Ü�Ð%<¸Z¸LÈÐ#JÔKö
‰KˆCð �L‰L˜Ô ô �5‹z˜ZÔ'¨3´#°kÓ2BÀQÕ2FÖ+Fð*Ü$1°%ÀEÓ$P�MÛ"/˜Ø06  t¥Ó-ñ #0ð �ô —’Ö ó%
ô, %¤T¨'¸Ô%E×F‰KˆCØ—*‘*˜T¤3 s£8Ó,ˆCð4à˜fÔ$¨°¯¬Ø" 7�O×3Ñ3°EÓ:‘Eä—O’OÐ&:¸3¸%¸zÐ$JÔKÙô *¨&Ó1�ô #ØØØØØ#Ÿ™Ø $× 0Ñ 0ô�ð "Ÿ<™<›>�ô .¨h¸Ó?�
ð ˜#Ø  zÕ 2Ø˜vŸz™z¨)°RÓ8Ø˜FŸJ™J v¨rÓ2Ø"ä" 6¨9×5Ò5ð Ÿ
™
 9¨bÔ1à#ŸZ™Z¨°"Ó5à Ø  *Ø˜uð �˜‘ð —<—<�<Ü—L’L 9¨S¨E°Ð!3Ô4Ü—L’L :¨f°ZÕ.@Ð-AÐ!BÔCÜ—L’L :¨h¨ZÐ!8Ô9Ü—L’L <°
¨|Ð!<Ô=Ü—L’L >°&·*±*¸YÈÓ2KÐ1LÐ!M×Nò  ñ[ Gôr ˜Ÿ™Ó(Ó)€LØ—‘×!Ñ! #Ó& rÕ*€JØ�l‰l× Ñ  Ó% bÕ)€GÜ�˜t°Ö9÷y @×?Ð?ûôj !ô *Ü—M’MÐ$<¸Q¸CÐ"@ÔAÜ×'Ò'×)Ò)ûð*ûô~ ô Ü×#Ò#Ô%Ü—’Ð 8¸¸¸RÀ¸sÐCÔDÞûðúsP   Ã	"V'Ì V;ÎXÎ3XÏCXÒBXÖ'V8	Ö;W?×.W:×:W?ØY
Ø1YÙY
Ú__main__)r¶   )r„   )!rr   rM   rT   r    r‡   rË   Úpathlibr   Útypingr   Úmlx.coreÚcorer   Údatasetsr   r   Úmlx_vlmr   Úmlx_vlm.evals.utilsr   Úmlx_vlm.generater	   Úmlx_vlm.sample_utilsr
   r   r   r-   rh   rw   r‹   r±   r×   Ú__name__r   r   r   Ú<module>rã      sx   ðÛ Û 
Û Û Û Û Ý Ý å Ý !Ý å Ý )Ý +Ý /õõ
õEôRGòjK÷\ò&UòpK:ð\ ˆzÔÙ†Fñ r   