ó
    ÃÅ.j‰  ã                  ó  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
JrJr  SSKrSSKJr  SSKJrJr  SSKJrJrJr  \	" S	5      r\	" S
5      rS rSS jrS r\S:X  a  \R:                  " \" 5       5        gg)uÒ  Repeatability + accuracy harness for the QUE-245 spike.

Runs each (approach, grid, model) config K times over every page of a
document and aggregates the three scored properties:

- independence: structural â€” no config calls Camelot (asserted in report).
- repeatability: across the K runs, the table-count stability (fraction of
  runs that yield the ground-truth count) and the per-table IoU spread
  (mean / std / min). The Cash Conversion Cycle drop shows up here as a
  count-stability < 1.0 on BHE_991 page 2.
- accuracy: mean IoU vs the full-anatomy ground truth, and the worst-case
  title clip in points.

Raw per-run boxes are saved to JSON so the report/overlays can be rebuilt
without re-calling the model.
é    )ÚannotationsN)ÚPath)ÚDictÚList)Úmake_locator)ÚBHE_991_BANDSÚground_truth)ÚiouÚmatchÚtop_clip_ptszdocuments/BHE_991.pdfzexperiments/que245/resultsc           
   ƒ  óN  #   • [        XX#US9n[        R                  " [        [        5      5      n0 n	[
        R                  " SS9n
U HE  n[        U
5      SU S3-  nX‹S-
     R                  SS9R                  [        U5      5        XÉU'   MG     U Vs0 s H  o»/ _M     nn[        U5       Hd  nU H[  nUR                  X›   [        U5      I S h  v•N nXÛ   R                  U Vs/ s H  n[        UR                  5      PM     sn5        M]     Mf     U$ s  snf  NJs  snf 7f)	N)ÚmodelÚtemperatureÚrowsÚcolszque245-rep-)ÚprefixÚpz.pngé   éÈ   )Údpi)r   ÚfitzÚopenÚstrÚPDFÚtempfileÚmkdtempr   Ú
get_pixmapÚsaveÚrangeÚlocateÚappendÚlistÚregion)Úapproachr   Útempr   r   ÚpagesÚkÚlocÚdocÚimgsÚtmpdirr   ÚipÚrunsÚ_ÚlocatedÚts                    Ú7/home/mande/repo/quber/experiments/que245/run_repeat.pyÚ
run_configr2   &   s  é € Ü
�x¸$ÐPTÑ
U€CÜ
�)Š)”Cœ“HÓ
€Cà€DÜ×Ò ]Ñ3€FÛˆÜ�&‹\˜a ˜s $˜KÑ'ˆØ�‰E‰
×Ñ #ÐÐ&×+Ñ+¬C°«GÔ4ØˆQ‹ñ ñ 38Ó"8²%¨Q b¢5±%€DÐ"8Ü�1ŽXˆÛˆAØŸJ™J t¡w´°QÓ7×7ˆGØ‰G�N‰N±GÓ<²G¨qœD §¡žN±GÑ<Ö=ó ñ ð €Kùò #9ñ 8ùÚ<ùs0   ‚BD%ÂDÂ"1D%ÃDÃD%Ã)D ÄD%Ä D%c           
     ót  ^• 0 nU R                  5        GH  u  pEX   nU Vs/ s H  n[        U5      PM     nn[        U5      m[        U4S jU 5       5      [        U5      -  n	/ / pºU HN  n[        Xg5       H<  u  pÍnUc  M  U
R	                  U5        UR	                  [        Xl   X}   U5      5        M>     MP     TUU	U
(       a  [        R                  " U
5      OS[        U
5      S:”  a  [        R                  " U
5      OSU
(       a  [        U
5      OSU(       a  [        U5      OSS.X4'   GM     U$ s  snf )Nc              3  ó6   >#   • U  H  oT:X  d  M
  S v •  M     g7f)r   N© )Ú.0ÚcÚgt_ns     €r1   Ú	<genexpr>Úaggregate.<locals>.<genexpr>>   s   øé € Ð:¢f °T±	Ÿ1™1¢fùs   ƒ	�	ç        r   )ÚgtÚcountsÚcount_stableÚmean_iouÚiou_stdÚmin_iouÚmax_clip_pts)ÚitemsÚlenÚsumr   r!   r   Ú
statisticsÚmeanÚpstdevÚminÚmax)r-   r<   Úpage_hÚrows_outr   Úrun_listÚgÚrr=   r>   ÚiousÚclipsÚgiÚpjÚvr8   s                  @r1   Ú	aggregaterU   8   s  ø€ Ø€HØ—z‘z—|‰ˆØ‰EˆÙ"*Ó+¢(˜Q”#�a–&¡(ˆÐ+Ü�1‹vˆÜÔ:¡fÓ:Ó:¼SÀ»[ÑHˆØ˜"ˆeÛˆAÜ" 1ž[‘	�˜Ø“>Ø—K‘K ”NØ—L‘L¤¨a©e°Q±U¸FÓ!CÖDó )ñ ð ØØ(Þ15œ
Ÿš¨Ô-¸3Ü25°d³)¸a³-”z×(Ò(¨Ô.ÀSÞ$(”s˜4”y¨cÞ*/œC œJ°Sñ
ˆŒñ $ð( €Oùò% ,s   ¢D5c               ƒ  óš  #   • [         R                  " 5       n U R                  S[        SS9  U R                  SSS9  U R	                  5       nUR
                  R                  S5      u  p#[        [        [        U5      [        U5      S-   5      5      n[        [        [        5      n[        R                  S	S	S
9  / SQn0 nU GH>  u  p‰p«pÍ[        SU SUR                   S35        [!        XšX¼XÔUR                  5      I S h  v•N n[#        Xå5      nXþS.Xx'   [        SS SSS SSS SSS SSS SSS SSS SSS 35        U HP  nUU   n[        US SUS   S SUS   S  S[%        US   5      S SUS!   S" SUS#   S$ SUS%   S& SUS'   S( 35        MR     [&        R(                  " S) UR+                  5        5       5      n[&        R(                  " S* UR+                  5        5       5      n[        S+US, S-US, 35        GMA     [        S.-  R-                  [.        R0                  " USS/95        [        S0[        S.-   35        g  GNE7f)1Nz--ké   )ÚtypeÚdefaultz--pagesz1-8)rY   Ú-r   T)ÚparentsÚexist_ok))zC raw-vision   Úrawúclaude-haiku-4-5-20251001r;   é   é   )zA data-grid r24z	data-gridr^   r;   r_   r`   )zB anatomy  r24Úanatomyr^   r;   r_   r`   )zB anatomy  r36ra   r^   r;   é$   r`   z
### z  (k=z) ###)Úaggr-   Úpgz>2Ú r<   z
cnt-stablez>10r=   z>14ÚmeanIoUz>8Ústdz>5ÚminIoUz>7Úclipr>   z>10.2fr?   z>8.2fr@   z>5.2frA   z>7.2frB   z>5.0fc              3  ó*   #   • U  H	  oS    v •  M     g7f)r?   Nr5   ©r6   Úa_s     r1   r9   Úmain.<locals>.<genexpr>l   s   é € ÐFº°2 :¦ºùó   ‚c              3  ó*   #   • U  H	  oS    v •  M     g7f)r>   Nr5   rk   s     r1   r9   rm   m   s   é € ÐIºL°b .Ö1ºLùrn   z   macro mean-IoU=z.3fz  mean count-stability=zbhe_repeat.json)Úindentz
saved )ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr&   Úsplitr"   r   r	   r   r   ÚOUTÚmkdirÚprintr'   r2   rU   r   rF   rG   ÚvaluesÚ
write_textÚjsonÚdumps)ÚapÚargsÚaÚbr&   r<   ÚconfigsÚall_resultsÚlabelr$   r   r%   r   r   r-   rc   r   rl   ÚmacroÚstabs                       r1   Úmainr‡   Q   si  é € Ü	×	 Ò	 Ó	"€BØ‡O�O�E¤¨Q€OÑ/Ø‡O�O�I u€OÑ-Ø�=‰=‹?€DØ�:‰:×Ñ˜CÓ �D€AÜ””s˜1“vœs 1›v¨™zÓ*Ó+€EÜ	”cœ=Ó	)€BÜ‡I�I�d T€IÑ*ò€Gð €KÜ4;Ñ0ˆ˜ dÜ��u�g˜U 4§6¡6 (¨%Ð0Ô1Ü °¸TÈ$Ï&É&ÓQ×QˆÜ˜Ó!ˆØ%(Ñ7ˆÑÜ��b�	˜˜4 ˜) 1 \°#Ð$6°a¸À°~ÀQÀyÐQSÀnÐTUÐV[Ð\^ÐU_Ð_`ÐaiÐjlÐ`mÐmnÐouÐvxÐnyÐzÔ{ÛˆAØ�Q‘ˆBÜ�Q�r�F˜!˜B˜t™H R˜=¨¨"¨^Ñ*<¸VÐ)DÀAÄcÈ"ÈXÉ,ÓFWÐX[ÐE\Ð\]Ø˜
‘^ EÐ*¨!¨B¨y©M¸%Ð+@ÀÀ"ÀYÁ-ÐPUÐAVÐVWÐXZÐ[iÑXjÐkpÐWqðsö tñ ô —’ÑF¸¿¹¼ÓFÓFˆÜ�ŠÑI¸C¿J¹J¼LÓIÓIˆÜÐ" 5¨ +Ð-DÀTÈ#ÀJÐO×Pñ 5<ô 	ÐÑ×(Ñ(¬¯ª°KÈÑ)JÔKÜ	ˆH”SÐ,Ñ,Ð-Ð
.Õ/ò Rùs   ‚DIÄIÄEIÚ__main__)g     Àˆ@)Ú__doc__Ú
__future__r   rq   Úasyncior|   rF   r   Úpathlibr   Útypingr   r   r   Úexperiments.que245.approachesr   Úexperiments.que245.gtr   r	   Úexperiments.que245.scorer
   r   r   r   rw   r2   rU   r‡   Ú__name__Úrunr5   ó    r1   Ú<module>r”      sv   ðñõ" #ã Û Û Û Û Ý ß ã å 6ß =ß =Ñ =á
Ð"Ó#€Ù
Ð'Ó(€òô$ò2 0ðF ˆzÓØ‡K‚K‘“Õð r“   