§
    �Wêj{Ç  ã                   ó‚  — d dl Z d dlZd dlZd dlZd dl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 ddlmZmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmZ dd
l m Z  ddl!m!Z! ddl"m"Z" ddl#m#Z# ddl$m$Z$ ddl%m%Z% ddl&m&Z& ddl'm'Z' ddl(m(Z( ddl)m)Z) ddl*m*Z* ddl+m+Z+ ddl
m,Z, g Z-dd„Z.d d„Z/	 	 	 d!d„Z0 G d„ d¦  «        Z1dS )"é    N)ÚPathé   )Úget_boxes_transformÚget_edge_by_knnÚget_edge_transform_bboxÚget_text_patternÚget_edge_matrixÚgroup_node_by_edgeÚresize_imageÚcompute_iou)Ú$extract_bbox_features_by_roi_poolingÚRoiPoolingSessionÚDEFAULT_FEATURE_MAP_POOLING_OPSÚ DEFAULT_CLASS_LOGITS_POOLING_OPS)Úcreate_input_data_from_page)Úget_edge_attrÚget_edge_dimÚbuild_edge_indexÚcompute_edge_gap_bboxesé   )ÚImageFeatureExtractorV1)ÚImageFeatureExtractorV2)ÚTableGridExtractor)ÚTableGridExtractorV1A)ÚTableGridExtractorV1B)ÚTableGridExtractorV2)ÚTableGridExtractorV2A)ÚTableGridExtractorV2B)ÚTableGridExtractorV3)ÚMarkdownGenerator)ÚMarkdownHTMLTableGenerator)ÚHTMLGenerator)ÚDefaultSorter)Úmake_sessioné
   c                 óš   — | \  }}}}|\  }}}	}
||z
  |cxk    r|cxk     r	|	|z   k    r"n n||z
  |cxk    r|cxk     r	|
|z   k    rn ndS dS )z6Check if bbox is within the region expanded by margin.TF© )ÚbboxÚregionÚmarginÚbx1Úby1Úbx2Úby2Úrx1Úry1Úrx2Úry2s              ú�/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/pymupdf/layout/onnx/BoxRFDGNN.pyÚ	is_insider4   #   s›   € àÑ€Cˆˆc�3ØÑ€Cˆˆc�3Øˆf‰˜Ð4Ð4Ò4Ð4˜sÐ4Ð4Ò4Ð4 s¨V¡|Ò4Ð4Ð4Ð4Ð4¸#À¹,È3Ð9fÐ9fÒ9fÐ9fÐQTÐ9fÐ9fÒ9fÐ9fÐY\Ð_eÑYeÒ9fÐ9fÐ9fÐ9fÐ9fØˆtØˆ5ó    Fc           	      óp  — g }|D �]/}|dk    r<d| vs| d         dk    r|                      d¦  «         Œ/|                      d¦  «         ŒE|dk    r<d| v r"| d         dk    r|                      d¦  «         Œq|                      d¦  «         Œ‡|dk    r<d| v r"| d         d	k    r|                      d¦  «         Œ³|                      d¦  «         ŒÉ|d
k    r=d| v r"| d         dk    r|                      d¦  «         Œõ|                      d¦  «         �Œ|dk    r>d| v r#| d         dk    r|                      d¦  «         �Œ9|                      d¦  «         �ŒP|t          v r|                      d¦  «         �Œp|| vrt          d|› d�¦  «        ‚	 t          | |         ¦  «        }|rF|                     d¦  «        s|                     d¦  «        s|dv rnt          j        |dz   ¦  «        }|                      |¦  «         �Œü# t          $ r(}t          |› dt          |¦  «        › �¦  «         |‚d }~ww xY w|S )NÚis_textÚbox_typeÚtextç      ð?ç        Úis_imageÚimageÚ	is_vectorÚvectorÚis_hline_vectorzh-line-vectorÚis_vline_vectorzv-line-vectorú'z%' does not exist in 'custom_features'Úcontext_Úis_)Úfonts_offsetÚ
line_spaceÚlinespaces_offsetg:Œ0âŽyE>z : )	ÚappendÚIGNORE_FEATURE_NAMESÚ	ExceptionÚfloatÚ
startswithÚmathÚlogÚprintÚstr)Úcustom_featureÚrf_namesÚdo_log_normÚfÚf_nameÚvalÚexs          r3   Úget_rf_featuresrX   ,   s”  € Ø
€AØð /ñ /ˆØ�YÒÐØ Ð/Ð/°>À*Ô3MÐQWÒ3WÐ3WØ—’˜‘”��à—’˜‘”��Ø�zÒ!Ð!Ø˜^Ð+Ð+°¸zÔ0JÈgÒ0UÐ0UØ—’˜‘”��à—’˜‘”��à�{Ò"Ð"Ø˜^Ð+Ð+°¸zÔ0JÈhÒ0VÐ0VØ—’˜‘”��à—’˜‘”��àÐ(Ò(Ð(Ø˜^Ð+Ð+°¸zÔ0JÈoÒ0]Ð0]Ø—’˜‘”��à—’˜‘”�‘àÐ(Ò(Ð(Ø˜^Ð+Ð+°¸zÔ0JÈoÒ0]Ð0]Ø—’˜‘”�‘à—’˜‘”�‘àÕ-Ð-Ð-Ø—’˜‘”�‘à Ð/Ð/Ý#Ð$U¨Ð$UÐ$UÐ$UÑVÔVÐVðÝ ¨vÔ 6Ñ7Ô7�CØ"ð 7Ø!×,Ò,¨ZÑ8Ô8ð 7¸F×<MÒ<MÈeÑ<TÔ<Tð 7ÐX^ð cxð Yxð Yxà å"&¤(¨3°©:Ñ"6Ô"6˜CØ—H’H˜S‘M”M�M‘MøÝ ð ð ð Ý˜VÐ1Ð1­¨B©¬Ð1Ð1Ñ2Ô2Ð2Ø�Høøøøðøøøð €Hs   ÆA2HÈ
H3È#H.È.H3Ú4Dc           	      óà  — | d         }t          |¦  «        }t          |t          j        ¦  «        r4|j        t          j        k    r|                     t          j        ¦  «        }t          j        |t          j        ¬¦  «        }|d         }	|d         }
|rO|
d         }t          ||¬¦  «        }t          ||¦  «        }t          j        |t          j
        ¬¦  «        j        }nd }d }d}d|
d	         v r|
d	         d         }|                      d
¦  «        }t          |¦  «        dk    r™t          ||¦  «        }t          j        ddgt          j
        ¬¦  «        }t          j        d|gt          j        ¬¦  «        }t          j        ddgt          j
        ¬¦  «        }t          j        d|gt          j        ¬¦  «        }nHt!          ||¦  «        }t#          |||| |¦  «        }t          j        |t          j
        ¬¦  «        j        }|	d         d d …         }|	                     dg ¦  «        }|                     |¦  «         |	                     dg ¦  «        }|                     |¦  «         g }t'          | d         ¦  «        D ]*\  }}t)          ||¦  «        }|                     |¦  «         Œ+t          j        |t          j        ¬¦  «        }g }| d         D ]&}|                     t-          |d¬¦  «        ¦  «         Œ't          j        |t          j        ¬¦  «        }d }|�rŠ| d         }| d         }|j        d d…         \  }} | |z  }!||z  }"t1          t          j        t          j        |d d …df         ¦  «        ¦  «        |!z  ¦  «        }#t1          t          j        t          j        |d d …df         ¦  «        ¦  «        |"z  ¦  «        }$t1          t          j        t          j        |d d …df         ¦  «        ¦  «        |!z  ¦  «        }%t1          t          j        t          j        |d d …df         ¦  «        ¦  «        |"z  ¦  «        }&t9          d|#¦  «        }#t9          d|$¦  «        }$t5          | |%¦  «        }%t5          ||&¦  «        }&||$|&…|#|%…f         }t;          |d¦  «        }|                      d¦  «        }'|                      d¦  «        }(|'��>|(��;|j        \  }}})|rât=          |'t>          ¬¦  «        }*t=          |(t@          d¬¦  «        }+|* !                    |||¦  «        },|+ !                    |||¦  «        }-t          j"        |,|-gd¬¦  «        }.tG          ||¦  «        }/|* !                    |/||¦  «        }0|+ !                    |/||¦  «        }1t          j"        |0|1gd¬¦  «        }2t          j"        ||2gd¬¦  «        }nNtI          |'|||t>          ¬¦  «        },tI          |(|||t@          d¬¦  «        }-t          j"        |,|-gd¬¦  «        }.nd }.dtJ          v rd|d d …<   d tJ          v rd|d d …<   d!tJ          v rd|d d …<   d"tJ          v r	|.�d|.d d …<   ||||||||.|f	S )#NÚbboxes©ÚdtypeÚdataÚmodelÚsample_k)ÚkÚ Ú	edge_typeÚoptionr=   r   r   )Úshaper]   rR   Úyf_namesÚjf_namesÚcustom_featuresr9   T)Úreturn_vectorÚpage_width_intÚpage_height_intr   é   )éô  rm   Úfeature_mapÚclass_logits)Úpooling_ops)rp   Úapply_softmax©ÚaxisÚbbox_featureÚtext_patternÚpdf_featureÚimage_feature)&r   Ú
isinstanceÚnpÚndarrayr]   Úfloat32ÚastypeÚarrayr   r   Úint64ÚTÚgetÚlenr   Úzerosr   r   ÚextendÚ	enumeraterX   rH   r   re   ÚintÚfloorÚminÚceilÚmaxr   r   r   r   ÚqueryÚconcatenater   r   rI   )3Ú	data_dictÚcfgÚreturn_nn_indexÚedge_samplingÚsave_crop_pageÚuse_image_edgeÚoriginal_bboxesÚxr[   Údata_optionÚmodel_optionÚnn_kÚnn_indexÚnn_attrrc   Úpage_imgÚedge_dimÚ
edge_indexÚ	edge_attrrR   rf   rg   Ú
rf_featureÚrow_idxrQ   rT   Útext_featurer9   Úcrop_imgÚpage_wÚpage_hÚimg_hÚimg_wÚscale_xÚscale_yÚx1_minÚy1_minÚx2_maxÚy2_maxrn   ro   Ú_Úfeat_sessionÚlogit_sessionÚfeat_pooledÚlogit_pooledÚimage_featuresÚedge_bboxesÚedge_feat_pooledÚedge_logit_pooledÚedge_image_featuress3                                                      r3   Úget_nn_input_from_datadictrµ   a   s|  € ð   Ô)€OÝ˜OÑ,Ô,€AÝ�!•R”ZÑ Ô ð ! Q¤Wµ´
Ò%:Ð%:Ø�HŠH•R”ZÑ Ô ˆåŒX�o­R¬ZÐ8Ñ8Ô8€Fà�f”+€KØ�w”<€Làð Ø˜JÔ'ˆÝ" 6¨TÐ2Ñ2Ô2ˆÝ)¨&°(Ñ;Ô;ˆÝ”8˜H­B¬HÐ5Ñ5Ô5Ô7ˆˆàˆØˆà€IØ�l 8Ô,Ð,Ð,Ø  Ô*¨;Ô7ˆ	à�}Š}˜WÑ%Ô%€Hõ ˆ6�{„{�aÒÐÝ 	¨8Ñ4Ô4ˆÝ”X Q¨ Fµ"´(Ð;Ñ;Ô;ˆ
Ý”H A x =½¼
ÐCÑCÔCˆ	Ý”8 1 a &µ´Ð9Ñ9Ô9ˆÝ”( ! X µb´jÐAÑAÔAˆˆå% f¨mÑ<Ô<ˆ
Ý! &¨*°iÀÈHÑUÔUˆ	Ý”X˜jµ´Ð9Ñ9Ô9Ô;ˆ
à˜:Ô& q q qÔ)€HØ�Š˜z¨2Ñ.Ô.€HØ‡O‚O�HÑÔÐØ�Š˜z¨2Ñ.Ô.€HØ‡O‚O�HÑÔÐà€JÝ#,¨YÐ7HÔ-IÑ#JÔ#Jð ð Ñˆ�Ý˜N¨HÑ5Ô5ˆØ×Ò˜!ÑÔÐÐÝ”˜*­B¬JÐ7Ñ7Ô7€Jà€LØ˜&Ô!ð Hð HˆØ×ÒÕ,¨TÀÐFÑFÔFÑGÔGÐGÐGÝ”8˜Lµ´
Ð;Ñ;Ô;€Lð €HØñ 6ØÐ+Ô,ˆØÐ,Ô-ˆØ”~ b q bÔ)‰ˆˆuØ˜&‘.ˆØ˜&‘.ˆå•R”X�bœf V¨A¨A¨A¨q¨D¤\Ñ2Ô2Ñ3Ô3°gÑ=Ñ>Ô>ˆÝ•R”X�bœf V¨A¨A¨A¨q¨D¤\Ñ2Ô2Ñ3Ô3°gÑ=Ñ>Ô>ˆÝ•R”W�RœV F¨1¨1¨1¨a¨4¤LÑ1Ô1Ñ2Ô2°WÑ<Ñ=Ô=ˆÝ•R”W�RœV F¨1¨1¨1¨a¨4¤LÑ1Ô1Ñ2Ô2°WÑ<Ñ=Ô=ˆå�Q˜‘”ˆÝ�Q˜‘”ˆÝ�U˜FÑ#Ô#ˆÝ�U˜FÑ#Ô#ˆà˜F 6˜M¨6°&¨=Ð8Ô9ˆÝ ¨*Ñ5Ô5ˆà—-’- Ñ.Ô.€KØ—=’= Ñ0Ô0€Lð$ Ñ <Ñ#;Ø$œNÑˆ�˜àð 	QÝ,¨[ÕFeÐfÑfÔfˆLÝ-¨lÕHhØ<@ðBñ Bô BˆMð '×,Ò,¨_¸fÀfÑMÔMˆKØ(×.Ò.¨ÀÈÑOÔOˆLÝœ^¨[¸,Ð,GÈaÐPÑPÔPˆNå1°*¸oÑNÔNˆKØ+×1Ò1°+¸vÀvÑNÔNÐØ -× 3Ò 3°KÀÈÑ PÔ PÐÝ"$¤.Ð2BÐDUÐ1VÐ]^Ð"_Ñ"_Ô"_ÐÝœ¨	Ð3FÐ'GÈaÐPÑPÔPˆIˆIå>Ø˜_¨f°fÝ;ðñ ô ˆKõ @Ø˜o¨v°vÝ<Ø"ðñ ô ˆLõ
  œ^¨[¸,Ð,GÈaÐPÑPÔPˆNˆNàˆàÕ-Ð-Ð-Øˆˆ!ˆ!ˆ!‰àÕ-Ð-Ð-Øˆ�Q�Q�Q‰àÕ,Ð,Ð,Øˆ
�1�1�1‰àÕ.Ð.Ð.ØÐ%Ø !ˆN˜1˜1˜1Ñàˆj˜) X¨w¸
ÀLÐR`ÐbjÐjÐjr5   c                   óB  — e Zd Z	 	 	 dd„Zed„ ¦   «         Zd„ Zd	„ Zd
„ Zd„ Z	d„ Z
d„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Zdd„Zd dededefd„Zd dededefd„Zd!dedefd„ZdS )"Ú	BoxRFDGNNNúimf+rfTFÚV4c                 ód  — t          t          ¦  «                             ¦   «         j        j        }|| _        g d¢}| j        |vrt          dt          |¦  «        › �¦  «        ‚|�|€A| j        dk    r|› d�}|› d�}n+| j        dk    r|› d�}|› d�}n| j        d	k    r
|› d
�}|› d�}|€|› d�}|| _        || _        t          | j        d¦  «        5 }t          j        |¦  «        | _        d d d ¦  «         n# 1 swxY w Y   |€!| j        d                              dd ¦  «        }|€d}|| _        | j        d         d         | _        i | _        t#          t%          | j        ¦  «        ¦  «        D ]}|| j        | j        |         <   Œ| j        d         d         | _        |                      |¦  «        | _        || _        d | _        |                      | j        ¦  «         t2          j                             |¦  «        rat9          || j        ¦  «        }d„ |                     ¦   «         D ¦   «         }d|v rt=          |¦  «        | _        ntA          |¦  «        | _        nd | _        d | _!        tD          ddddd ftF          ddddd ftH          ddddd ftD          ddddd ftF          ddddd ftH          dddd d ftJ          d!d ddd ftL          d!d dd"d ftN          d!d dd"d ftJ          d#d dd d ftP          d$dddd ftJ          d%d d"dd&ftJ          d'd ddd&fd(œ}|
d)k    rd*}
d | _!        |
|v ra||
         \  }}}}}}|�|n|› d+|› �}||d,œ}|�||d-<   |d.u r|› d/�} |||fi |¤Ž| _!        n^|€ ||fd0d i|¤Ž| _!        nK ||fi |¤Ž| _!        n<d1 )                    | *                    ¦   «         ¦  «        d2z   }t          d3|› �¦  «        ‚tW          | ¦  «        | _,        t[          | ¦  «        | _.        t_          | ¦  «        | _0        |	| _1        te          ¦   «         | _3        |  4                    ¦   «         | _5        d S )4N)ÚrfÚimfr¸   z	imf+rf+yfzrf+jfz feature_set_name must be one in r¼   z /resources/onnx/layout_imf1.yamlz /resources/onnx/layout_imf1.onnxr¸   z(/resources/onnx/layout_rf2.4.1+imf1.yamlz(/resources/onnx/layout_rf2.4.1+imf1.onnxr»   z#/resources/onnx/layout_rf2.4.1.yamlz#/resources/onnx/layout_rf2.4.1.onnxz!/resources/onnx/feature_imf1.onnxÚrbr^   Ú
input_type©r9   Ú
class_listÚclass_priorityc                 ó   — h | ]	}|j         ’Œ
S r'   )Úname)Ú.0Úos     r3   ú	<setcomp>z%BoxRFDGNN.__init__.<locals>.<setcomp>'  s   € ÐJÐJÐJ¨1 ¤ÐJÐJÐJr5   Ú
reg_coarseztable_grid_model_v1.onnxFg333333Ó?gffffffÖ?ztable_grid_model_v1a.onnxç333333Ã?çš™™™™™É?ztable_grid_model_v1t.onnxç      à?r;   g      Ð?çš™™™™™©?ztable_grid_model_v2_grid.onnxgš™™™™™¹?ztable_grid_model_v2c.onnxztable_grid_model_v3.onnxztable_grid_model_v4_do.onnxg{®Gáz„?ztable_grid_model_v4_ep.onnx)ÚV1ÚV1AÚV1BÚV1TzV1T-AzV1T-BÚV2ÚV2AÚV2BÚV2CÚV3zV4-DOúV4-EPr¹   rÕ   z/resources/onnx/)Úh_on_thresholdÚv_on_thresholdÚnms_min_distTz-/resources/onnx/table_grid_model_v2_conn.onnxÚconn_onnx_pathz, z, V4z6Invalid table_grid_model_ver. Supported versions are: )6r   Ú__file__ÚresolveÚparentÚfeature_set_nameÚ
ValueErrorrP   Úimf_model_pathÚconfig_pathÚopenÚyamlÚ	safe_loadr�   r€   r¾   Údata_class_namesÚdata_class_mapÚranger�   Úclass_priority_listÚ_resolve_providersÚ
_providersÚ
model_pathÚsessionÚload_onnx_modelÚosÚpathÚexistsr$   Úget_outputsr   Úfeature_extractorr   Útable_grid_extractorr   r   r   r   r   r   r   ÚjoinÚkeysr    Úmarkdown_generatorr!   Úmarkdown_html_table_generatorr"   Úhtml_generatorÚuse_sortr#   ÚsorterÚ_build_onnx_input_namesÚ_onnx_input_names)Úselfrà   rê   rß   Útable_grid_pathrÝ   r¾   Úenable_inference_cacheÚuse_gpurø   Útable_grid_model_verÚ
script_dirÚft_set_namesrT   ÚiÚort_sessionÚimf_output_namesÚGRID_MODEL_CONFIGSÚextractor_clsÚdefault_filenameÚconnection_modeÚh_threshÚv_threshrØ   Útable_grid_model_pathÚkwargsÚtable_conn_model_pathÚsupported_verss                               r3   Ú__init__zBoxRFDGNN.__init__ó   sÐ  € õ �(‘^”^×+Ò+Ñ-Ô-Ô4Ô;ˆ
à 0ˆÔØDÐDÐDˆØÔ ¨Ð4Ð4ÝÐSÅÀLÑ@QÔ@QÐSÐSÑTÔTÐTàÐ *Ð"4ØÔ$¨Ò-Ð-Ø!+ÐMÐMÐM�Ø *ÐLÐLÐL�
�
ØÔ&¨(Ò2Ð2Ø!+ÐUÐUÐU�Ø *ÐTÐTÐT�
�
ØÔ&¨$Ò.Ð.Ø!+ÐPÐPÐP�Ø *ÐOÐOÐO�
àÐ!Ø *ÐMÐMÐMˆNà,ˆÔØ&ˆÔÝ�$Ô" DÑ)Ô)ð 	)¨QÝ”~ aÑ(Ô(ˆDŒHð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð ÐØœ &Ô)×-Ò-¨l¸DÑAÔAˆJàÐØ"ˆJØ$ˆŒà $¤¨Ô 0°Ô >ˆÔØ ˆÔÝ•s˜4Ô0Ñ1Ô1Ñ2Ô2ð 	>ð 	>ˆAØ<=ˆDÔ Ô 5°aÔ 8Ñ9Ð9Ø#'¤8¨FÔ#3Ð4DÔ#EˆÔ ð ×1Ò1°'Ñ:Ô:ˆŒà$ˆŒØˆŒØ×Ò˜Tœ_Ñ-Ô-Ð-åŒ7�>Š>˜.Ñ)Ô)ð 	*Ý& ~°t´ÑGÔGˆKØJÐJ°×0GÒ0GÑ0IÔ0IÐJÑJÔJÐØÐ/Ð/Ð/Ý)@ÀÑ)MÔ)M�Ô&Ð&å)@ÀÑ)MÔ)M�Ô&Ð&à%)ˆDÔ"à$(ˆÔ!õ &Ð'AÀ5È#ÈtÐUYÐZÝ)Ð+FÈÈtÐUXÐZ^Ð_Ý)Ð+FÈÈtÐUXÐZ^Ð_Ý&Ð(CÀUÈCÐQUÐW[Ð\Ý+Ð-HÈ%ÐQTÐVYÐ[_Ð`Ý+Ð-HÈ%ÐQUÐW[Ð]aÐbå'Ð)HÈ$ÐPSÐUXÐZ^Ð_Ý)Ð+JÈDÐRUÐWZÐ\`ÐaÝ)Ð+JÈDÐRUÐWZÐ\`ÐaÝ(Ð*EÀtÈSÐRVÐX\Ð]å'Ð)CÀUÈDÐRUÐW[Ð\å*Ð,IÈ4ÐQTÐVYÐ[_Ð`Ý*Ð,IÈ4ÐQTÐVZÐ\`Ðað!
ð 
Ðð(   4Ò'Ð'Ø#*Ð à$(ˆÔ!àÐ#5Ð5Ð5ØasØ$ôb&Ñ^ˆMÐ+¨_¸hÈÐR^ð 8GÐ7R O OÐ[eð  YJð  YJð  xHð  YJð  YJÐ!ð #+Ø"*ðð ˆFð Ð'Ø)5��~Ñ&ð  $Ð&Ð&Ø+5Ð(dÐ(dÐ(dÐ%Ø,9¨MØ)Ð+@ð-ð -àð-ð -�Ô)Ð)ð !Ð(Ø,9¨MØ)ð-ð -Ø:>ð-àð-ð -�Ô)Ð)ð
 -:¨MÐ:OÐ,ZÐ,ZÐSYÐ,ZÐ,Z�Ô)Ð)à!ŸYšYÐ'9×'>Ò'>Ñ'@Ô'@ÑAÔAÀFÑJˆNÝÐfÐVdÐfÐfÑgÔgÐgõ #4°DÑ"9Ô"9ˆÔÝ-GÈÑ-MÔ-MˆÔ*Ý+¨DÑ1Ô1ˆÔØ ˆŒÝ#‘o”oˆŒØ!%×!=Ò!=Ñ!?Ô!?ˆÔÐÐs   ÃC9Ã9C=Ä C=c                 ón   — | sdgS t          j        ¦   «         }d|v rddgS t          d|› d�¦  «         dgS )a�  
        Return the ONNX Runtime execution provider list.

        When use_gpu is True, checks available providers and selects
        CUDAExecutionProvider if present, otherwise falls back to
        CPUExecutionProvider with a warning.

        Args:
            use_gpu (bool): Whether to request GPU execution.

        Returns:
            list[str]: Ordered provider list for ort.InferenceSession.
        ÚCPUExecutionProviderÚCUDAExecutionProviderz<Warning: CUDAExecutionProvider is not available (available: z(). Falling back to CPUExecutionProvider.)ÚortÚget_available_providersrO   )rÿ   Ú	availables     r3   rè   zBoxRFDGNN._resolve_providersx  sr   € ð ð 	,Ø*Ð+Ð+åÔ/Ñ1Ô1ˆ	Ø" iÐ/Ð/Ø+Ð-CÐDÐDåðOØ$ðOð Oð Oñ	
ô 	
ð 	
ð 'Ð'Ð'r5   c                 ób   — t          j        d¦  «         t          || j        ¦  «        | _        d S )Nrl   )r  Úset_default_logger_severityr$   ré   rë   )rü   rê   s     r3   rì   zBoxRFDGNN.load_onnx_model”  s*   € ÝÔ'¨Ñ*Ô*Ð*Ý# J°´Ñ@Ô@ˆŒˆˆr5   c                 ó~  — | j         d         d         }|d         }t          |t          ¦  «        r|d         }|dv rg d¢S |dv rgg d¢}|                     d	g ¦  «        }d
|v r|                     d¦  «         d|v r|                     d¦  «         d|v r|                     d¦  «         |S t          d|› d�¦  «        ‚)aL  
        Determine the ONNX session input name list from the model config.

        Called once in __init__ and stored as self._onnx_input_names so that
        predict() does not repeat the config dict lookups on every call.

        Returns:
            list[str]: Ordered list of input tensor names for the ONNX session.
        r_   rd   Ú	conv_typer   )ÚGATÚNNConv)r“   r›   rœ   Úrf_featuresÚtext_patterns)Ú	CustomDGCzCustomDGC-PMP)r“   r›   rœ   ra   ÚbatchÚfeature_typesr»   r  ru   r  r=   r°   zNot supported model_type = ú!)r�   rx   Úlistr€   rH   rÞ   )rü   r•   Ú
model_typeÚnamesr!  s        r3   rú   z!BoxRFDGNN._build_onnx_input_names˜  sõ   € ð ”x Ô(¨Ô2ˆØ! +Ô.ˆ
Ý�j¥$Ñ'Ô'ð 	'Ø# AœˆJàÐ*Ð*Ð*ØSÐSÐSÐSØÐ9Ð9Ð9ØBÐBÐBˆEØ(×,Ò,¨_¸bÑAÔAˆMØ�}Ð$Ð$Ø—’˜]Ñ+Ô+Ð+Ø Ð.Ð.Ø—’˜_Ñ-Ô-Ð-Ø˜-Ð'Ð'Ø—’Ð-Ñ.Ô.Ð.ØˆLåÐH¸:ÐHÐHÐHÑIÔIÐIr5   c                 óH   — | j         €dS | j                              |¦  «        S )a`  
        Determine whether the page contains significant non-picture content
        detected by the image model (e.g. text, tables printed as images).

        Runs ONNX inference once and caches the result so that the immediately
        following predict() call reuses it without re-running inference.
        The cache is single-use: it is consumed and cleared inside
        image_feature_extraction_task() when predict() is called next.

        Typical usage::

            if model.is_image_page(page):
                page = run_ocr(page)   # user-side OCR + page modification
            result = model.predict(page)

        Args:
            page: PyMuPDF page object

        Returns:
            bool  - True if the model detects non-picture layout elements.
            False - if feature_extractor is unavailable or no such elements found.
        NF)rñ   Úis_image_page)rü   Úpages     r3   r'  zBoxRFDGNN.is_image_page·  s)   € ð. Ô!Ð)Ø�5àÔ%×3Ò3°DÑ9Ô9Ð9r5   c           	      ób   — t          |¦  «        | j                             |¦  «        |g dddddœS )z=Build a synthetic group dict for a given bbox and class name.r:   NT)Ú
group_bboxÚgroup_classÚ
class_nameÚindiciesÚscoreÚ
table_gridÚtable_cellsÚ	synthetic)r#  rä   Úindex)rü   r(   r,  s      r3   Ú_make_synthetic_groupzBoxRFDGNN._make_synthetic_group×  sB   € õ ˜t™*œ*ØÔ0×6Ò6°zÑBÔBØ$ØØØØØð	
ð 	
ð 		
r5   c                 ó  ‡‡— | j         €||fS | j                              ¦   «         }|s||fS |D �]YŠd}|D ]É}|d         dk    rŒ|dd…         }t          |‰¦  «        dk    rd} n™‰d         |d         k    r:|d         ‰d         k    r(‰d	         |d	         k    r|d
         ‰d
         k    rd} nM|d         ‰d         k    r:‰d         |d         k    r(|d	         ‰d	         k    r‰d
         |d
         k    rd} nŒÊ|rŒÔˆfd„|D ¦   «         Šˆfd„|D ¦   «         }ˆfd„|D ¦   «         }|                     |                      ‰d¦  «        ¦  «         |                     ‰d         ‰d	         ‰d         ‰d
         dg¦  «         �Œ[||fS )aw  
        Replace GNN picture detections that overlap with segmentation-based
        picture detections produced by the image feature extractor.

        Skips any segmentation detection that overlaps a non-picture GNN result.
        For each accepted segmentation detection, removes overlapping GNN picture
        entries and inserts a synthetic picture group in their place.

        Args:
            det_result (list[list]): Current detection list, mutated in place.
            groups (list[dict]): Current group list, mutated in place.

        Returns:
            tuple[list, list]: Updated (det_result, groups).
        NFé   ÚpicturerÊ   Tr   r   r   rl   c                 ó  •— h | ]‰}|d          dk    r{t          |dd …         ‰¦  «        dk    sH‰d         |d         k    rM|d         ‰d         k    r;‰d         |d         k    ¯`|d         ‰d         k    ¯rt          |dd …         ¦  «        ’ŒŠS )r5  r6  NrÊ   r   r   r   rl   )r   Útuple)rÄ   ÚdÚp_boxs     €r3   rÆ   z2BoxRFDGNN._apply_post_seg_image.<locals>.<setcomp>  s©   ø€ ð ð ð Ø!"Ø�Q”4˜9Ò$Ð$Ý# A b q b¤E¨5Ñ1Ô1°SÒ8Ð8Ø˜qœ Q q¤TÒ)Ð)¨a°¬d°e¸A´hÒ.>Ð.>Ø˜qœ Q q¤TÒ)Ð)¨a°¬d°e¸A´hÒ.>Ð.>õ	 �a˜˜˜”e‘”ð /?Ð.>Ð.>r5   c                 óF   •— g | ]}t          |d d…         ¦  «        ‰v¯|‘ŒS ©Nr5  ©r8  )rÄ   r9  Úremoved_bboxess     €r3   ú
<listcomp>z3BoxRFDGNN._apply_post_seg_image.<locals>.<listcomp>  s1   ø€ ÐVÐVÐV µ5¸¸2¸A¸2¼±<´<À~Ð3UÐ3U˜!Ð3UÐ3UÐ3Ur5   c                 óR   •— g | ]#}t          |d          dd…         ¦  «        ‰v¯!|‘Œ$S ©r*  Nr5  r=  )rÄ   Úgr>  s     €r3   r?  z3BoxRFDGNN._apply_post_seg_image.<locals>.<listcomp>  s8   ø€ Ð\Ð\Ð\˜A­5°°<´ÀÀ!ÀÔ1DÑ+EÔ+EÈ^Ð+[Ð+[�aÐ+[Ð+[Ð+[r5   )rñ   Úget_picture_detectionsr   rH   r3  )	rü   Ú
det_resultÚgroupsÚpicture_detectionsÚhas_non_picture_overlapr9  Úd_boxr:  r>  s	          @@r3   Ú_apply_post_seg_imagezBoxRFDGNN._apply_post_seg_imageä  s  øø€ ð  Ô!Ð)Ø˜vÐ%Ð%à!Ô3×JÒJÑLÔLÐØ!ð 	&Ø˜vÐ%Ð%à'ð !	Sñ !	SˆEØ&+Ð#Øð ð �Ø�Q”4˜9Ò$Ð$ØØ˜"˜1˜"œ�Ý˜u eÑ,Ô,°Ò3Ð3Ø.2Ð+Ø�EØ˜!”H  a¤Ò(Ð(¨U°1¬X¸¸q¼Ò-AÐ-AØ˜aœ E¨!¤HÒ,Ð,°°q´¸UÀ1¼XÒ1EÐ1EØ.2Ð+Ø�EØ˜!”H  a¤Ò(Ð(¨U°1¬X¸¸q¼Ò-AÐ-AØ˜aœ E¨!¤HÒ,Ð,°°q´¸UÀ1¼XÒ1EÐ1EØ.2Ð+Ø�EøØ&ð Øðð ð ð Ø&0ðñ ô ˆNð WÐVÐVÐV ZÐVÑVÔVˆJØ\Ð\Ð\Ð\ Ð\Ñ\Ô\ˆFà�MŠM˜$×4Ò4°U¸IÑFÔFÑGÔGÐGØ×Ò˜u Qœx¨¨q¬°5¸´8¸UÀ1¼XÀyÐQÑRÔRÐRÑRà˜6Ð!Ð!r5   c                 ó   ‡‡‡‡‡‡— d}d„ Šˆfd„Šd„ Šd„ |D ¦   «         }d„ |D ¦   «         }|D �]\}|d         |d         |d	         |d
         f\  }}	}
}||	|
|gŠt          ˆˆfd„|D ¦   «         ¦  «        rŒI||z
  |	|z
  |
|z   ||z   gŠˆˆfd„|D ¦   «         }|rzd„ |D ¦   «         Šˆfd„|D ¦   «         }ˆfd„|D ¦   «         }||	|
|dg}|                     |                      ‰d¦  «        ¦  «         |                     |¦  «         d„ |D ¦   «         }Œæt          ˆˆfd„|D ¦   «         ¦  «        sZ||	|
|dg}|                     |                      ‰d¦  «        ¦  «         |                     |¦  «         |                     |¦  «         �Œ^||fS )a  
        Add embedded image regions as synthetic picture detections when valid.

        Validity is evaluated in this order (condition 2 takes priority when
        both 2 and 3 apply simultaneously):

          Condition 0 (pre-filter): skip background images.
            A background image contains non-picture detections inside it.

          Condition 2: the image bbox expanded by 20 px on each side contains
            at least one picture detection whose center lies in that region.
            Action: remove those picture detections and replace with img_bbox.

          Condition 3: not a background image and no detections of any class
            lie inside the img_bbox.
            Action: add img_bbox as a synthetic picture entry as-is.

        picture_dets and non_picture_dets are split once before the loop and
        kept in sync incrementally: non_picture_dets never changes (condition 0
        only removes pictures), and picture_dets is rebuilt only when a
        condition-2 removal occurs.

        Args:
            det_result (list[list]): Current detection list.
            groups (list[dict]): Current group list.
            img_bboxes (list): Bboxes from page.get_image_info().

        Returns:
            tuple[list, list]: Updated (det_result, groups).
        é   c                 óR   — | d         | d         z   dz  | d         | d         z   dz  fS )Nr   r   ç       @r   rl   r'   ©r(   s    r3   Ú_centerz-BoxRFDGNN._filter_img_bboxes.<locals>._centerA  s1   € Ø˜”G˜d 1œgÑ%¨Ñ,¨t°A¬w¸¸a¼Ñ/@ÀCÑ.GÐGÐGr5   c                 ó�   •—  ‰|¦  «        \  }}| d         |cxk    o| d         k    nc o| d         |cxk    o| d         k    nc S ©Nr   r   r   rl   r'   )Úexpandedr(   ÚcxÚcyrO  s       €r3   Ú_contains_centerz6BoxRFDGNN._filter_img_bboxes.<locals>._contains_centerD  sh   ø€ Ø�W˜T‘]”]‰FˆB�Ø˜A”; "Ð3Ð3Ò3Ð3¨°¬Ò3Ð3Ð3Ð3ÐX¸À¼ÀrÐ8XÐ8XÒ8XÐ8XÈXÐVWÌ[Ò8XÐ8XÐ8XÐ8XÐXr5   c                 ó’   — | d         |d         k    o5|d         | d         k    o#| d         |d         k    o|d         | d         k    S rQ  r'   )ÚouterÚinners     r3   Ú_bbox_insidez2BoxRFDGNN._filter_img_bboxes.<locals>._bbox_insideH  sY   € Ø˜!”H  a¤Ò(ð B¨U°1¬X¸¸q¼Ò-Að BØ˜!”H  a¤Ò(ðBØ-2°1¬X¸¸q¼Ò-AðCr5   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS ©r5  r6  r'   ©rÄ   r9  s     r3   r?  z0BoxRFDGNN._filter_img_bboxes.<locals>.<listcomp>M  ó&   € ÐGÐGÐG !°Q°q´T¸YÒ5FÐ5F˜AÐ5FÐ5FÐ5Fr5   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r[  r'   r\  s     r3   r?  z0BoxRFDGNN._filter_img_bboxes.<locals>.<listcomp>N  r]  r5   r   r   r   rl   c              3   ó@   •K  — | ]} ‰‰|d d…         ¦  «        V — Œd S r<  r'   ©rÄ   r9  rY  Úimg_boxs     €€r3   ú	<genexpr>z/BoxRFDGNN._filter_img_bboxes.<locals>.<genexpr>U  s7   øè è € ÐJÐJ°A�<�< ¨¨2¨A¨2¬Ñ/Ô/ÐJÐJÐJÐJÐJÐJr5   c                 ó<   •— g | ]} ‰‰|d d…         ¦  «        ¯|‘ŒS r<  r'   )rÄ   r9  rU  Úexpanded_boxs     €€r3   r?  z0BoxRFDGNN._filter_img_bboxes.<locals>.<listcomp>[  sD   ø€ ð #ð #ð #ØØ#Ð# L°!°B°Q°B´%Ñ8Ô8ð#Øð#ð #ð #r5   c                 ó<   — h | ]}t          |d d…         ¦  «        ’ŒS r<  r=  r\  s     r3   rÆ   z/BoxRFDGNN._filter_img_bboxes.<locals>.<setcomp>b  s&   € ÐJÐJÐJ°¥ a¨¨¨¤e¡¤ÐJÐJÐJr5   c                 óF   •— g | ]}t          |d d…         ¦  «        ‰v¯|‘ŒS r<  r=  )rÄ   r9  Úremoved_keyss     €r3   r?  z0BoxRFDGNN._filter_img_bboxes.<locals>.<listcomp>c  s1   ø€ ÐZÐZÐZ a½¸qÀÀ!À¼u¹¼È\Ð9YÐ9Y Ð9YÐ9YÐ9Yr5   c                 óR   •— g | ]#}t          |d          dd…         ¦  «        ‰v¯!|‘Œ$S rA  r=  )rÄ   rB  rg  s     €r3   r?  z0BoxRFDGNN._filter_img_bboxes.<locals>.<listcomp>d  s9   ø€ ÐdÐdÐd aµU¸1¸\¼?È2ÈAÈ2Ô;NÑ5OÔ5OÐWcÐ5cÐ5c Ð5cÐ5cÐ5cr5   r6  c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r[  r'   r\  s     r3   r?  z0BoxRFDGNN._filter_img_bboxes.<locals>.<listcomp>k  s&   € ÐKÐKÐK a¸¸1¼ÀÒ9JÐ9J Ð9JÐ9JÐ9Jr5   c              3   ó@   •K  — | ]} ‰‰|d d…         ¦  «        V — Œd S r<  r'   r`  s     €€r3   rb  z/BoxRFDGNN._filter_img_bboxes.<locals>.<genexpr>n  s7   øè è € ÐNÐN¸A˜<˜<¨°°2°A°2´Ñ7Ô7ÐNÐNÐNÐNÐNÐNr5   )ÚanyrH   r3  )rü   rD  rE  Ú
img_bboxesÚ
_EXPAND_PXÚpicture_detsÚnon_picture_detsÚimg_bÚix0Úiy0Úix1Úiy1Úpicture_in_expandedÚnew_detrY  rO  rU  rd  ra  rg  s                 @@@@@@r3   Ú_filter_img_bboxeszBoxRFDGNN._filter_img_bboxes   s  øøøøøø€ ð> ˆ
ð	Hð 	Hð 	Hð	Yð 	Yð 	Yð 	Yð 	Yð	Cð 	Cð 	Cð
 HÐG zÐGÑGÔGˆØGÐG zÐGÑGÔGÐàð "	1ñ "	1ˆEØ!& q¤¨5°¬8°U¸1´X¸uÀQ¼xÐ!GÑˆC��c˜3Ø˜C  cÐ*ˆGõ ÐJÐJÐJÐJÐJÐ9IÐJÑJÔJÑJÔJð Øà *Ñ,¨c°JÑ.>Ø *Ñ,¨c°JÑ.>ð@ˆLð#ð #ð #ð #ð #Ø'ð#ñ #ô #Ðð
 #ð 1àJÐJÐ6IÐJÑJÔJ�ØZÐZÐZÐZ¨:ÐZÑZÔZ�
ØdÐdÐdÐd¨6ÐdÑdÔd�à  S¨#¨yÐ9�Ø—’˜d×8Ò8¸À)ÑLÔLÑMÔMÐMØ×!Ò! 'Ñ*Ô*Ð*ð  LÐK¨:ÐKÑKÔK��õ ÐNÐNÐNÐNÐNÀÐNÑNÔNÑNÔNð 1Ø" C¨¨c°9Ð=�GØ—M’M $×"<Ò"<¸WÀiÑ"PÔ"PÑQÔQÐQØ×%Ò% gÑ.Ô.Ð.Ø ×'Ò'¨Ñ0Ô0Ð0ùà˜6Ð!Ð!r5   c                 óJ   — | j         | j        z   dz  | j        | j        z   dz  fS )zReturn (cx, cy) of a fitz.Rect.rM  )Úx0Úx1Úy0Úy1)Úrs    r3   Ú_vec_centerzBoxRFDGNN._vec_centerz  s)   € ð ”�q”t‘˜sÑ" Q¤T¨A¬D¡[°CÑ$7Ð7Ð7r5   c                 ór   — |d         | cxk    o|d         k    nc o|d         |cxk    o|d         k    nc S )z1Return True when point (cx, cy) lies inside bbox.r   r   r   rl   r'   )rS  rT  r(   s      r3   Ú_center_insidezBoxRFDGNN._center_inside  sW   € ð �AŒw˜"Ð'Ð'Ò'Ð'  Q¤Ò'Ð'Ð'Ð'ÐD¨D°¬G°rÐ,DÐ,DÒ,DÐ,D¸TÀ!¼WÒ,DÐ,DÐ,DÐ,DÐDr5   c                 ó~   — t          | |¦  «        t          ||¦  «        t          ||¦  «        t          ||¦  «        fS )z)Clip bbox coordinates to page boundaries.©r‰   r‡   )ry  r{  rz  r|  Úpage_x0Úpage_y0Úpage_x1Úpage_y1s           r3   Ú_clip_to_pagezBoxRFDGNN._clip_to_page„  s@   € õ �B˜Ñ Ô ¥# b¨'Ñ"2Ô"2Ý�B˜Ñ Ô ¥# b¨'Ñ"2Ô"2ð4ð 	4r5   c                 óF   — || z
  |z  }||z
  |z  }| |z
  ||z
  ||z   ||z   fS )z2Return bbox expanded by pct fraction on each side.r'   )ry  r{  rz  r|  ÚpctÚdwÚdhs          r3   Ú_expand_pctzBoxRFDGNN._expand_pctŠ  s=   € ð �2‰g˜‰_ˆØ�2‰g˜‰_ˆØ�B‰w˜˜R™  b¡¨"¨r©'Ð1Ð1r5   c                 óÀ   — |D ]V}t          | |j        ¦  «        } t          ||j        ¦  «        }t          ||j        ¦  «        }t          ||j        ¦  «        }ŒW| |||fS )z6Extend bbox to contain all fitz.Rect objects in rects.)r‡   ry  r{  r‰   rz  r|  )ry  r{  rz  r|  Úrectsr}  s         r3   Ú_union_with_rectszBoxRFDGNN._union_with_rects‘  s_   € ð ð 	ð 	ˆAÝ�R˜œ‘”ˆBÝ�R˜œ‘”ˆBÝ�R˜œ‘”ˆBÝ�R˜œ‘”ˆBˆBØ�2�r˜2ˆ~Ðr5   c	                 óŽ  — |D ]½}	|	d         |	d         |	d         |	d         f\  }
}}}| |k     r | |cxk     r|k    rn nt          | |¦  «        } ||k    r ||
cxk    r|k     rn nt          ||
¦  «        }||k     r ||cxk     r|k    rn nt          ||¦  «        }||k    r ||cxk    r|k     rn Œ­t          ||¦  «        }Œ¾| |||fS )zœ
        Roll back expanded sides that would collide with blocker bboxes.
        Only sides that were actually expanded are eligible for rollback.
        r   r   r   rl   r‚  )Úex0Úey0Úex1Úey1Úox0Úoy0Úox1Úoy1Úblockersr9  Údx0Údy0Údx1Údy1s                 r3   Ú_push_back_expansionzBoxRFDGNN._push_back_expansion›  s&  € ð ð 		$ð 		$ˆAØ!" 1¤ q¨¤t¨Q¨q¬T°1°Q´4Ð!7ÑˆC��c˜3Ø�SŠyˆy˜S 3Ð-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-Ý˜#˜s‘m”m�Ø�SŠyˆy˜S CÐ-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-Ý˜#˜s‘m”m�Ø�SŠyˆy˜S 3Ð-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-Ý˜#˜s‘m”m�Ø�SŠyˆy˜S CÐ-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-Ý˜#˜s‘m”m�øØ�C˜˜cÐ!Ð!r5   c                 ó˜   — | D ]F}|d         }|d         |d         |d         |d         f|k    r||||f\  |d<   |d<   |d<   |d<    dS ŒGdS )z4Update the matching group's bbox to new coordinates.r*  r   r   r   rl   Nr'   )rE  Úorig_keyÚnx0Úny0Únx1Úny1rB  Úgbs           r3   Ú_sync_group_bboxzBoxRFDGNN._sync_group_bbox­  s}   € ð ð 	ð 	ˆAØ�<”ˆBØ�1”�r˜!”u˜b œe R¨¤UÐ+¨xÒ7Ð7Ø-0°#°s¸CÐ-?Ñ*��1‘�r˜!‘u˜b ™e R¨¡UØ��ð 8ð	ð 	r5   c                 óú  ‡ ‡'‡(‡)‡*‡+‡,‡-‡.‡/— |j         Š*‰*j        ‰*j        }}‰*j        ‰*j        }}‰*j        ‰*j        z  }ˆ*fd„|                     ¦   «         D ¦   «         }	d}
g }|	D ]6}|j        rŒ
|j        |j        z  |z  |
k    rŒ!| 	                    |¦  «         Œ7|}	dŠ)ˆ)fd„|	D ¦   «         }dŠ'dŠ(ˆ'ˆ(fd„|	D ¦   «         }d„ |D ¦   «         Š+ˆ+ˆ fd	„|D ¦   «         }ˆ+ˆ fd
„|D ¦   «         }d„ |D ¦   «         }|D ]û}|d         dk    rŒ|d         |d         |d         |d         f\  }}}}‰  
                    ||||d¦  «        \  Š,Š.Š-Š/ˆ ˆ,ˆ-ˆ.ˆ/fd„|D ¦   «         }|sŒe‰                      |||||¦  «        \  }}}}‰                      |||||||||¦	  «	        \  }}}}‰                      ||||||||¦  «        \  }}}}||||f\  |d<   |d<   |d<   |d<   ‰                      |||||f||||¦  «         Œü||z   }d}|D �]{}|d         dk    rŒ|d         |d         |d         |d         f\  }}}}||z
  }||z
  }||z  }||z  }‰  
                    ||||d¦  «        \  Š,Š.Š-Š/ˆ ˆ,ˆ-ˆ.ˆ/fd„|D ¦   «         }|sŒzg } |D ]‚}t          ||j        ¦  «        }!t          ||j        ¦  «        }"t!          ||j        ¦  «        }#t!          ||j        ¦  «        }$|#|!z
  }%|$|"z
  }&|%|k    s|&|k    rŒm|  	                    |¦  «         Œƒ| }|s�Œ‰                      |||||¦  «        \  }}}}‰                      ||||||||¦  «        \  }}}}||||f\  |d<   |d<   |d<   |d<   ‰                      |||||f||||¦  «         �Œ}||fS )a–  
        Expand picture and table bboxes to absorb nearby vector graphics.

        Picture bboxes are expanded by 15% on each side; vectors whose center
        falls in that zone are absorbed, but the expansion is rolled back on any
        side that would overlap a non-picture detection.

        Table bboxes are expanded by 5% on each side; both general vectors and
        thin ruling lines (short side <= 3 px, aspect ratio >= 1:5) are
        considered. No collision guard is applied for tables.

        All resulting bboxes are clipped to the page boundary. Both det_result
        and groups are updated in place.

        Args:
            det_result (list[list]): Current detection list, mutated in place.
            groups (list[dict]): Current group list, mutated in place.
            page: PyMuPDF page object.

        Returns:
            tuple[list, list]: Updated (det_result, groups).
        c                 ó&   •— g | ]}‰|d          z  ‘ŒS )Úrectr'   )rÄ   ÚpÚ	page_rects     €r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>Ò  s"   ø€ ÐKÐKÐK°!˜	 A f¤IÑ-ÐKÐKÐKr5   rÊ   r   c                 ó@   •— g | ]}|j         ‰k    ¯|j        ‰k    ¯|‘ŒS r'   )ÚwidthÚheight)rÄ   ÚvÚ_VEC_MIN_DIMs     €r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>ã  s>   ø€ ð Jð Jð J˜Ø”g Ò,Ð,°´¸LÒ1HÐ1Hð Ø1HÐ1HÐ1Hr5   rl   é   c                 óÞ   •— g | ]i}|j         d k    r\|j        d k    rQ|j         ‰k    s|j        ‰k    r;t          |j         |j        ¦  «        t          |j         |j        ¦  «        z  ‰k    ¯g|‘ŒjS )r   )r­  r®  r‰   r‡   )rÄ   r¯  Ú_LINE_MAX_THINÚ_LINE_MIN_RATIOs     €€r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>ê  s€   ø€ ð 
ð 
ð 
ØØ”˜!’� ¤¨1¢ Ø”W Ò.Ð.°!´(¸nÒ2LÐ2LÝ˜œ ¤Ñ*Ô*­S°´¸!¼(Ñ-CÔ-CÑCÀÒVÐVð ð WÐVÐVr5   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r[  r'   r\  s     r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>ò  s&   € ÐCÐCÐC˜a°°1´¸Ò1BÐ1B˜Ð1BÐ1BÐ1Br5   c                 óN   •‡— g | ] Št          ˆˆfd „‰D ¦   «         ¦  «        °‰‘Œ!S )c              3   ól   •K  — | ].} ‰j         g ‰                     ‰¦  «        ¢|d d…         ‘R Ž V — Œ/d S r<  ©r€  r~  ©rÄ   r9  rü   r¯  s     €€r3   rb  z:BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>.<genexpr>ô  se   øè è € ð 6ð 6Ø#$ð 2˜dÔ1ÐN°4×3CÒ3CÀAÑ3FÔ3FÐNÈÈ"È1È"ÌÐNÐNÐNð 6ð 6ð 6ð 6ð 6ð 6r5   ©rk  ©rÄ   r¯  rn  rü   s    @€€r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>ó  sc   øø€ ð 7ð 7ð 7˜Ýð 6ð 6ð 6ð 6ð 6Ø(4ð6ñ 6ô 6ñ 6ô 6ð7�1ð 7ð 7ð 7r5   c                 óN   •‡— g | ] Št          ˆˆfd „‰D ¦   «         ¦  «        °‰‘Œ!S )c              3   ól   •K  — | ].} ‰j         g ‰                     ‰¦  «        ¢|d d…         ‘R Ž V — Œ/d S r<  r¸  r¹  s     €€r3   rb  z:BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>.<genexpr>÷  sr   øè è € ð )@ð )@Ø-.ð *=¨Ô)<Ð)Y¸d×>NÒ>NÈqÑ>QÔ>QÐ)YÐSTÐUWÐVWÐUWÔSXÐ)YÐ)YÐ)Yð )@ð )@ð )@ð )@ð )@ð )@r5   rº  r»  s    @€€r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>ö  st   øø€ ð Að Að A AÝ%(ð )@ð )@ð )@ð )@ð )@Ø2>ð)@ñ )@ô )@ñ &@ô &@ðA˜að Að Að Ar5   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r[  r'   r\  s     r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>ú  r]  r5   r5  r6  r   r   rÈ   c           	      ó`   •— g | ]*} ‰j         g ‰                     |¦  «        ¢‰‰‰‰g‘R Ž ¯(|‘Œ+S r'   r¸  ©rÄ   r¯  rü   Úsx0Úsx1Úsy0Úsy1s     €€€€€r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>  ód   ø€ ð Zð Zð Z˜AØ,˜Ô,ÐX¨d×.>Ò.>¸qÑ.AÔ.AÐXÀCÈÈcÐSVÐCWÐXÐXÐXðZ�að Zð Zð Zr5   g      ø?ÚtablerË   c           	      ó`   •— g | ]*} ‰j         g ‰                     |¦  «        ¢‰‰‰‰g‘R Ž ¯(|‘Œ+S r'   r¸  rÀ  s     €€€€€r3   r?  z0BoxRFDGNN._expand_by_vectors.<locals>.<listcomp>&  rÅ  r5   )r©  ry  r{  rz  r|  r­  r®  Úget_drawingsÚis_emptyrH   rŒ  r�  rž  r‡  r¦  r‡   r‰   )0rü   rD  rE  r(  rƒ  r„  r…  r†  Ú	page_areaÚraw_drawingsÚ_MAX_VECTOR_PAGE_AREA_RATIOÚfiltered_drawingsr¯  ÚvectorsÚtable_line_vectorsro  Údetr•  r–  r—  r˜  Únearbyr¡  r¢  r£  r¤  Úvectors_for_tableÚ_MAX_TABLE_DIM_EXPANSION_FACTORÚoriginal_widthÚoriginal_heightÚmax_allowed_widthÚmax_allowed_heightÚfiltered_nearby_for_expansionÚunion_x0Úunion_y0Úunion_x1Úunion_y1Úunion_widthÚunion_heightr³  r´  r°  r«  rn  rÁ  rÂ  rÃ  rÄ  s0   `                                      @@@@@@@@@r3   Ú_expand_by_vectorszBoxRFDGNN._expand_by_vectors¶  s¾  øøøøøøøøøø€ ð. ”Iˆ	Ø$œ<¨¬�ˆØ$œ<¨¬�ˆØ”O iÔ&6Ñ6ˆ	àKÐKÐKÐK°t×7HÒ7HÑ7JÔ7JÐKÑKÔKˆð '*Ð#ØÐØð 	(ð 	(ˆAØŒzð ØØ”˜!œ(Ñ" iÑ/Ð2MÒMÐMØØ×$Ò$ QÑ'Ô'Ð'Ð'Ø(ˆð ˆðJð Jð Jð J˜lð Jñ Jô Jˆð
 ˆØˆð
ð 
ð 
ð 
ð 
Ø#ð
ñ 
ô 
Ðð DÐC :ÐCÑCÔCˆð7ð 7ð 7ð 7ð 7˜gð 7ñ 7ô 7ˆðAð Að Að Að AÐ);ð Añ Aô AÐð HÐG zÐGÑGÔGÐð ð 	Tð 	TˆCØ�1Œv˜Ò"Ð"Øà!$ Q¤¨¨Q¬°°Q´¸¸Q¼Ð!?ÑˆC��c˜3Ø!%×!1Ò!1°#°s¸CÀÀdÑ!KÔ!KÑˆC��c˜3ðZð Zð Zð Zð Zð Zð Zð Z ð Zñ Zô ZˆFàð Øà!%×!7Ò!7¸¸SÀ#ÀsÈFÑ!SÔ!SÑˆC��c˜3Ø!%×!:Ò!:Ø�S˜#˜s C¨¨c°3Ð8Hñ"Jô "JÑˆC��c˜3à!%×!3Ò!3Ø�S˜#˜s G¨W°g¸wñ"Hô "HÑˆC��c˜3ð .1°#°s¸CÐ-?Ñ*ˆC�‰F�C˜‘F˜C ™F C¨¡FØ×!Ò! &¨3°°S¸#Ð*>ÀÀSÈ#ÈsÑSÔSÐSÐSà#Ð&8Ñ8ÐØ*-Ð'àð 3	Tñ 3	TˆCØ�1Œv˜Ò Ð Øà!$ Q¤¨¨Q¬°°Q´¸¸Q¼Ð!?ÑˆC��c˜3Ø  3™YˆNØ! C™iˆOð !/Ð1PÑ PÐØ!0Ð3RÑ!RÐà!%×!1Ò!1°#°s¸CÀÀdÑ!KÔ!KÑˆC��c˜3ðZð Zð Zð Zð Zð Zð Zð ZÐ!2ð Zñ Zô ZˆFð ð Øð -/Ð)Øð <ð <�å˜s A¤D™>œ>�Ý˜s A¤D™>œ>�Ý˜s A¤D™>œ>�Ý˜s A¤D™>œ>�à&¨Ñ1�Ø'¨(Ñ2�ð Ð!2Ò2Ð2°lÐEWÒ6WÐ6WØà1×8Ò8¸Ñ;Ô;Ð;Ð;à2ˆFàð Ùà!%×!7Ò!7¸¸SÀ#ÀsÈFÑ!SÔ!SÑˆC��c˜3Ø!%×!3Ò!3Ø�S˜#˜s G¨W°g¸wñ"Hô "HÑˆC��c˜3ð .1°#°s¸CÐ-?Ñ*ˆC�‰F�C˜‘F˜C ™F C¨¡FØ×!Ò! &¨3°°S¸#Ð*>ÀÀSÈ#ÈsÑSÔSÐSÑSØ˜6Ð!Ð!r5   c                 óœ  ‡‡‡‡— d}d„ |D ¦   «         Št          ‰¦  «        }|dk     r||fS t          t          |¦  «        ¦  «        Šdt          dt          fˆfd„Šdt          dt          dd	fˆˆfd
„}t          |¦  «        D ]T}t          |dz   |¦  «        D ]>}t	          ‰|         d	d…         ‰|         d	d…         ¦  «        |k    r |||¦  «         Œ?ŒUi }t          |¦  «        D ]6} ‰|¦  «        }	|                     |	g ¦  «                             |¦  «         Œ7ˆfd„|                     ¦   «         D ¦   «         Š‰s||fS ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }|                     ¦   «         D ]Ô\  }	}
t          |
¦  «        dk     rŒˆfd„|
D ¦   «         }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }||||g}|                     |                      |d¦  «        ¦  «         |                     ||||dg¦  «         ŒÕ||fS )ax  
        Merge picture detections that overlap each other (IoU > 0.2).

        Uses Union-Find to identify connected components of overlapping
        pictures in a single O(k^2) pass, then merges each component into
        one synthetic entry whose bbox is the union of all members.
        Replaces the previous O(k^3) greedy restart loop.

        Applied unconditionally after all other post-processing steps.

        Args:
            det_result (list[list]): Current detection list.
            groups (list[dict]): Current group list.

        Returns:
            tuple[list, list]: Updated (det_result, groups).
        rÉ   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r[  r'   r\  s     r3   r?  z9BoxRFDGNN._merge_overlapping_pictures.<locals>.<listcomp>_  s&   € Ð?Ð?Ð?˜!¨Q¨q¬T°YÒ->Ð->�AÐ->Ð->Ð->r5   r   r“   Úreturnc                 ój   •— ‰|          | k    r%‰‰|                   ‰| <   ‰|          } ‰|          | k    °%| S ©Nr'   )r“   rÜ   s    €r3   Ú_findz4BoxRFDGNN._merge_overlapping_pictures.<locals>._findg  sA   ø€ Ø˜”)˜q’.�.Ø" 6¨!¤9Ô-��q‘	Ø˜1”I�ð ˜”)˜q’.�.ð ˆHr5   ÚaÚbNc                 óN   •—  ‰| ¦  «         ‰|¦  «        }}||k    r|‰|<   d S d S rä  r'   )ræ  rç  ÚpaÚpbrå  rÜ   s       €€r3   Ú_unionz5BoxRFDGNN._merge_overlapping_pictures.<locals>._unionm  s9   ø€ Ø�U˜1‘X”X˜u˜u Q™xœx�ˆBØ�RŠxˆxØ��r‘
�
�
ð ˆxr5   r   r5  c                 óz   •— h | ]7}t          |¦  «        d k    ¯|D ]}t          ‰|         dd…         ¦  «        ’Œ Œ8S )r   Nr5  )r�   r8  )rÄ   Úidxsr  Úpicturess      €r3   rÆ   z8BoxRFDGNN._merge_overlapping_pictures.<locals>.<setcomp>  sM   ø€ ð 7ð 7ð 7°$Ý˜d™)œ) aš-˜-°˜-˜-¨Aõ ˜X aœ[¨¨!¨œ_Ñ-Ô-Ø'˜-˜-˜-r5   c                 óF   •— g | ]}t          |d d…         ¦  «        ‰v¯|‘ŒS r<  r=  )rÄ   r9  Úmerged_keyss     €r3   r?  z9BoxRFDGNN._merge_overlapping_pictures.<locals>.<listcomp>†  s1   ø€ ÐOÐOÐO˜A­u°Q°r¸°r´U©|¬|À;Ð/NÐ/N�aÐ/NÐ/NÐ/Nr5   c                 óR   •— g | ]#}t          |d          dd…         ¦  «        ‰v¯!|‘Œ$S rA  r=  )rÄ   rB  rð  s     €r3   r?  z9BoxRFDGNN._merge_overlapping_pictures.<locals>.<listcomp>‡  s8   ø€ ÐUÐUÐU˜¥u¨Q¨|¬_¸R¸a¸RÔ-@Ñ'AÔ'AÈÐ'TÐ'T�!Ð'TÐ'TÐ'Tr5   c                 ó    •— g | ]
}‰|         ‘ŒS r'   r'   )rÄ   r  rî  s     €r3   r?  z9BoxRFDGNN._merge_overlapping_pictures.<locals>.<listcomp>�  s   ø€ Ð1Ð1Ð1 q�x ”{Ð1Ð1Ð1r5   c              3   ó&   K  — | ]}|d          V — ŒdS )r   Nr'   ©rÄ   Úms     r3   rb  z8BoxRFDGNN._merge_overlapping_pictures.<locals>.<genexpr>Ž  ó&   è è € Ð,Ð,˜q�a˜”dÐ,Ð,Ð,Ð,Ð,Ð,r5   c              3   ó&   K  — | ]}|d          V — ŒdS )r   Nr'   rô  s     r3   rb  z8BoxRFDGNN._merge_overlapping_pictures.<locals>.<genexpr>�  rö  r5   c              3   ó&   K  — | ]}|d          V — ŒdS )r   Nr'   rô  s     r3   rb  z8BoxRFDGNN._merge_overlapping_pictures.<locals>.<genexpr>�  rö  r5   c              3   ó&   K  — | ]}|d          V — ŒdS )rl   Nr'   rô  s     r3   rb  z8BoxRFDGNN._merge_overlapping_pictures.<locals>.<genexpr>‘  rö  r5   r6  )r�   r#  ræ   r…   r   Ú
setdefaultrH   ÚvaluesÚitemsr‡   r‰   r3  )rü   rD  rE  Ú_IOU_MERGE_THRESHOLDÚnrë  r  ÚjÚ
componentsÚrootrí  ÚmembersÚux0Úuy0Úux1Úuy1Ú	union_boxrå  rð  rÜ   rî  s                    @@@@r3   Ú_merge_overlapping_picturesz%BoxRFDGNN._merge_overlapping_picturesK  s  øøøø€ ð$  #Ðà?Ð?˜zÐ?Ñ?Ô?ˆÝ�‰MŒMˆØˆqŠ5ˆ5Ø˜vÐ%Ð%õ •e˜A‘h”h‘”ˆð	•Sð 	�Sð 	ð 	ð 	ð 	ð 	ð 	ð	 •cð 	 �cð 	  dð 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 õ �q‘”ð 	!ð 	!ˆAÝ˜1˜q™5 !‘_”_ð !ð !�Ý˜x¨œ{¨2¨A¨2œ°¸´¸B¸Q¸B´Ñ@Ô@ÐCWÒWÐWØ�F˜1˜a‘L”L�Løð!ð
 ,.ˆ
Ý�q‘”ð 	6ð 	6ˆAØ�5˜‘8”8ˆDØ×!Ò! $¨Ñ+Ô+×2Ò2°1Ñ5Ô5Ð5Ð5ð7ð 7ð 7ð 7¸*×:KÒ:KÑ:MÔ:Mð 7ñ 7ô 7ˆð ð 	&Ø˜vÐ%Ð%ð PÐOÐOÐO ÐOÑOÔOˆ
ØUÐUÐUÐU˜VÐUÑUÔUˆð %×*Ò*Ñ,Ô,ð 
	?ð 
	?‰JˆD�$Ý�4‰yŒy˜1Š}ˆ}ØØ1Ð1Ð1Ð1¨DÐ1Ñ1Ô1ˆGÝÐ,Ð, GÐ,Ñ,Ô,Ñ,Ô,ˆCÝÐ,Ð, GÐ,Ñ,Ô,Ñ,Ô,ˆCÝÐ,Ð, GÐ,Ñ,Ô,Ñ,Ô,ˆCÝÐ,Ð, GÐ,Ñ,Ô,Ñ,Ô,ˆCØ˜c 3¨Ð,ˆIØ�MŠM˜$×4Ò4°YÀ	ÑJÔJÑKÔKÐKØ×Ò˜s C¨¨c°9Ð=Ñ>Ô>Ð>Ð>à˜6Ð!Ð!r5   c                 ó€  ‡>‡?‡@‡A— d ŠA‰A�€qt          || j        | j        | j        dœ¬¦  «        Š?t	          j        ‰?d         t          j        ¬¦  «        }t          |¦  «        dk    rg S | j        d         d         d         }|rt          d	|¦  «         t          |¦  «        t          u r|d         }| j        }t          ‰?| j        d
|v ¬¦  «        \	  }}}	}
}}}}}|||	|t	          j        t          t          |¦  «        d¦  «        t          j        ¬¦  «        ||t	          j        t          |¦  «        t          j        ¬¦  «        dœŠ>ˆ>fd„|D ¦   «         }|r�t          d¦  «         |                     ¦   «         D ]k\  }}t	          j        |¦  «        }	 |j        }n# t(          $ r t          |¦  «        }Y nw xY wt          d|› dt	          j        |¦  «        › d|› �¦  «         Œl|rät-          | d¦  «        rÔ| j        �Í	 t          d¦  «         | j                             ¦   «         D ])}t          d|j        › d|j        › d|j
        › �¦  «         Œ*t          d¦  «         | j                             ¦   «         D ])}t          d|j        › d|j        › d|j
        › �¦  «         Œ*n'# t(          $ r}t          d|¦  «         Y d }~nd }~ww xY w| j                             d |¦  «        }|\  }}t	          j        |t	          j        |dd¬¦  «        z
  ¦  «        }|t	          j        |dd¬¦  «        z  }t	          j        |d¬¦  «        }|t	          j         |j        d         ¦  «        |f         }| !                    dd¦  «        }|j"        dk    rtt	          j        |t	          j        |dd¬¦  «        z
  ¦  «        } | t	          j        | dd¬¦  «        z  }!|!d d …df         |k     #                    t          j        ¦  «        }"n t	          j$        dt          j        ¬¦  «        }"t          |¦  «        }#tK          |#||"¦  «        }$tM          |||$|| j'        ¦  «        ŠA‰AD ]}%| j(        |%d                   |%d!<   Œg Š@‰AD ]B}%|%d"         d d …         }&|& )                    |%d!         ¦  «         ‰@ )                    |&¦  «         ŒC| !                    d#d$¦  «        }'| !                    d%d$¦  «        }(| !                    d&d¦  «        })| j        �#d'| j        v r|  *                    ‰@‰A¦  «        \  Š@ŠAnV|'r8d(„ | +                    ¦   «         D ¦   «         }*|  ,                    ‰@‰A|*¦  «        \  Š@ŠA|(r|  -                    ‰@‰A|¦  «        \  Š@ŠA|  .                    ‰@‰A¦  «        \  Š@ŠA| j/        r:|)r8| j0         1                    |‰A‰@¦  «        }+ˆAfd)„|+D ¦   «         ŠAˆ@fd*„|+D ¦   «         Š@‰A��C‰AD �]?}%|%d!         },ˆ?fd+„|%d,         D ¦   «         |%d<   | j2        ��|,d-k    �rd.|%v r	|%d.         �Œ>d/tg          ¦   «         vrJt          || j        | j        | j        dœ¬¦  «        Š?t	          j        ‰?d         t          j        ¬¦  «        }‰?d0         }-|%d"         d d1…         \  }.}/}0}1t;          dti          |/¦  «        ¦  «        }2t          |-j        d         ti          |1¦  «        ¦  «        }3t;          dti          |.¦  «        ¦  «        }4t          |-j        d         ti          |0¦  «        ¦  «        }5|-|2|3…|4|5…f         }6|%d,         }7t	          j        ˆ?fd2„|7D ¦   «         ¦  «        }8ˆ?fd3„|7D ¦   «         }9|8 5                    ¦   «         }:|:d d …dfxx         |.z  cc<   |:d d …d4fxx         |.z  cc<   |:d d …dfxx         |/z  cc<   |:d d …d5fxx         |/z  cc<   |6j        d         dk    s|6j        d         dk    rd |%d.<   g |%d6<   �Œ| j2         6                    |6|:|9¬7¦  «        \  };}<|;|%d.<   |<|%d6<   �ŒA| !                    d8d$¦  «        }=|=r‰AS ‰@S )9N)r¾   rÝ   rñ   )Úoptionsr[   r\   r   r_   rd   r  z>>> model_type:r—   )rŽ   rK  )r“   r›   rœ   r  ra   r  r°   r   c                 ó"   •— i | ]}|‰|         “ŒS r'   r'   )rÄ   rÃ   Ú_all_inputss     €r3   ú
<dictcomp>z%BoxRFDGNN.predict.<locals>.<dictcomp>Æ  s    ø€ ÐPÐPÐP°t˜4 ¨TÔ!2ÐPÐPÐPr5   z>>> onnx_inputs:z  - z: shape=z, dtype=rë   z)>>> ONNX Runtime session inputs metadata:z	  - name=z, shape=z, type=z*>>> ONNX Runtime session outputs metadata:z$  (Failed to read session metadata):r   T)rs   Úkeepdimsrr   Úedge_thresholdgš™™™™™á?r+  r,  r*  Úfilter_img_bboxesFÚexpand_by_vectorsÚdo_sortzpost-seg-imagec                 ó   — g | ]
}|d          ‘ŒS rN  r'   )rÄ   Úitms     r3   r?  z%BoxRFDGNN.predict.<locals>.<listcomp>  s   € ÐKÐKÐK¨c˜c &œkÐKÐKÐKr5   c                 ó    •— g | ]
}‰|         ‘ŒS r'   r'   )rÄ   r  rE  s     €r3   r?  z%BoxRFDGNN.predict.<locals>.<listcomp>  s   ø€ Ð7Ð7Ð7¨A˜& œ)Ð7Ð7Ð7r5   c                 ó    •— g | ]
}‰|         ‘ŒS r'   r'   )rÄ   r  rD  s     €r3   r?  z%BoxRFDGNN.predict.<locals>.<listcomp>  s   ø€ Ð7Ð7Ð7¨A˜* Qœ-Ð7Ð7Ð7r5   c                 óF   •— g | ]}t          ‰d          |         ¦  «        ‘ŒS ©r[   )r#  ©rÄ   r  rŒ   s     €r3   r?  z%BoxRFDGNN.predict.<locals>.<listcomp>+  s+   ø€ Ð"[Ð"[Ð"[ÀA¥4¨	°(Ô(;¸AÔ(>Ñ#?Ô#?Ð"[Ð"[Ð"[r5   r-  rÆ  r/  rŒ   r=   r5  c                 ó,   •— g | ]}‰d          |         ‘ŒS r  r'   r  s     €r3   r?  z%BoxRFDGNN.predict.<locals>.<listcomp>P  s$   ø€ Ð5dÐ5dÐ5dÐQR°iÀÔ6IÈ!Ô6LÐ5dÐ5dÐ5dr5   c                 ó,   •— g | ]}‰d          |         ‘ŒS r¿   r'   r  s     €r3   r?  z%BoxRFDGNN.predict.<locals>.<listcomp>Q  s#   ø€ Ð"OÐ"OÐ"O¸A 9¨VÔ#4°QÔ#7Ð"OÐ"OÐ"Or5   r   rl   r0  )ÚtextsÚ
return_raw)7r   r¾   rÝ   rñ   ry   r}   r{   r�   r�   rO   Útyper#  rû   rµ   r‡   r~   r‚   rü  Úasarrayr]   rJ   re   Úhasattrrë   Ú
get_inputsrÃ   rð   ÚrunÚexpr‰   ÚsumÚargmaxÚaranger€   Úsizer|   Úemptyr	   r
   rç   rä   rH   rI  Úget_image_inforw  rß  r  rø   rù   Úsortrò   Úlocalsr…   ÚcopyÚpredict)Brü   r(  Úverboser  r[   r$  Úonnx_input_namesr“   r›   rœ   r—   r˜   r�   rŸ   rw   Ú
image_dataÚonnx_inputsrÃ   rV   Úarrr]   ÚinpÚoutÚeÚort_outputsÚonnx_node_logitsÚonnx_edge_logitsÚexp_node_logitsÚ
node_probsÚpredicted_node_labelÚpredicted_node_scorer  Úexp_edge_logitsÚ
edge_probsÚpredicted_edge_labelsÚ	num_nodesÚedge_matrixÚgroupÚg_bboxr  r  r  rl  ÚorderÚcls_nameÚ
page_imageÚcrop_x0Úcrop_y0Úcrop_x1Úcrop_y1Úcrop_y0_intÚcrop_y1_intÚcrop_x0_intÚcrop_x1_intr    Úgroup_indicesÚgroup_original_bboxesÚgroup_textsÚcrop_bboxesÚgridÚcellsr  r  rŒ   rD  rE  sB                                                                 @@@@r3   r-  zBoxRFDGNN.predictœ  sà	  øøøø€ àˆØ‰>Ý3°DØ"œoØ$(Ô$9Ø%)Ô%;ðCð Cð ñ ô ˆIõ
 ”X˜i¨Ô1½¼ÐDÑDÔDˆFõ �6‰{Œ{˜aÒÐØ�	àœ 'Ô*¨8Ô4°[ÔAˆJð ð 5ÝÐ'¨Ñ4Ô4Ð4å�JÑÔ¥4Ð'Ð'Ø'¨œ]�
à#Ô5Ðõ +¨9°d´hÐQ[Ð_oÐQoÐqÑqÔqñ mˆAˆz˜9 h°¸À\ÐS`Ðblð #$Ø",Ø"+Ø",Ý"$¤(­3­s°6©{¬{¸BÑ+?Ô+?ÅrÄxÐ"PÑ"PÔ"PØ".Ø"/Ý"$¤(­3¨v©;¬;½b¼hÐ"GÑ"GÔ"Gð	ð 	ˆKð QÐPÐPÐPÐ?OÐPÑPÔPˆKð ð OÝÐ(Ñ)Ô)Ð)Ø!,×!2Ò!2Ñ!4Ô!4ð Oð O‘I�D˜#Ýœ* S™/œ/�Cð*Ø #¤	˜˜øÝ$ð *ð *ð *Ý $ S¡	¤	˜˜˜ð*øøøåÐM ÐMÐM­r¬x¸©}¬}ÐMÐMÀeÐMÐMÑNÔNÐNÐNð ð 	E�7 4¨Ñ3Ô3ð 	E¸¼Ð8PðEÝÐEÑFÔFÐFØ#œ|×6Ò6Ñ8Ô8ð Zð Z˜ÝÐX¨#¬(ÐXÐX¸C¼IÐXÐXÈcÌhÐXÐXÑYÔYÐYÐYÝÐFÑGÔGÐGØ#œ|×7Ò7Ñ9Ô9ð Zð Z˜ÝÐX¨#¬(ÐXÐX¸C¼IÐXÐXÈcÌhÐXÐXÑYÔYÐYÐYðZøå ð Eð Eð EÝÐ@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøð œ,×*Ò*¨4°Ñ=Ô=ˆKØ1<Ñ.ÐÐ.õ !œfÐ%5½¼Ð?OÐVWÐbfÐ8gÑ8gÔ8gÑ%gÑhÔhˆOØ(­2¬6°/ÈÐTXÐ+YÑ+YÔ+YÑYˆJõ $&¤9¨Z¸aÐ#@Ñ#@Ô#@Ð Ø#-­b¬i¸
Ô8HÈÔ8KÑ.LÔ.LÐNbÐ.bÔ#cÐ ð $ŸZšZÐ(8¸$Ñ?Ô?ˆNØÔ$ qÒ(Ð(Ý"$¤&Ð)9½B¼FÐCSÐZ[ÐfjÐ<kÑ<kÔ<kÑ)kÑ"lÔ"l�Ø,­r¬v°oÈAÐX\Ð/]Ñ/]Ô/]Ñ]�
Ø)3°A°A°A°q°DÔ)9¸NÒ)J×(RÒ(RÕSUÔS[Ñ(\Ô(\Ð%Ð%å(*¬°½"¼(Ð(CÑ(CÔ(CÐ%åÐ0Ñ1Ô1ˆIÝ)¨)°ZÐAVÑWÔWˆKÝ'Ð(<Ð>RÐT_ÐagÐimô  jBñ  Cô  CˆFð  ð Rð R�Ø&*Ô&;¸EÀ-Ô<PÔ&Q��lÑ#Ð#ð ˆ
Øð 	&ð 	&ˆEØ˜<Ô(¨¨¨Ô+ˆFØ�MŠM˜% Ô-Ñ.Ô.Ð.Ø×Ò˜fÑ%Ô%Ð%Ð%ð #ŸJšJÐ':¸EÑBÔBÐØ"ŸJšJÐ':¸EÑBÔBÐØ—*’*˜Y¨Ñ-Ô-ˆàŒ?Ð&Ð+;¸t¼Ð+NÐ+NØ!%×!;Ò!;¸JÈÑ!OÔ!OÑˆJ˜˜à ð ]ØKÐK°T×5HÒ5HÑ5JÔ5JÐKÑKÔK�
Ø%)×%<Ò%<¸ZÈÐQ[Ñ%\Ô%\Ñ"�
˜FØ ð WØ%)×%<Ò%<¸ZÈÐQUÑ%VÔ%VÑ"�
˜Fð "×=Ò=¸jÈ&ÑQÔQÑˆ
�FàŒ=ð 	8˜Wð 	8Øœ×)Ò)¨$°¸
ÑCÔCˆEØ7Ð7Ð7Ð7°Ð7Ñ7Ô7ˆFØ7Ð7Ð7Ð7°Ð7Ñ7Ô7ˆJð ÑØð @5ñ @5�Ø  Ô.�ð #\Ð"[Ð"[Ð"[ÈÈzÔIZÐ"[Ñ"[Ô"[��h‘ð Ô,Ñ8¸XÈÒ=PÑ=Pà# uÐ,Ð,°°|Ô1DÐ1PØ ð #­&©(¬(Ð2Ð2Ý%@ÀØ+/¬?Ø15Ô1FØ26Ô2HðPð Pð &ñ &ô &˜õ
 #%¤(¨9°XÔ+>ÅbÄjÐ"QÑ"QÔ"Q˜à!*¨7Ô!3�Jð :?¸|Ô9LÈRÈaÈRÔ9PÑ6�G˜W g¨wõ #& a­¨W©¬Ñ"6Ô"6�KÝ"% jÔ&6°qÔ&9½3¸w¹<¼<Ñ"HÔ"H�KÝ"% a­¨W©¬Ñ"6Ô"6�KÝ"% jÔ&6°qÔ&9½3¸w¹<¼<Ñ"HÔ"H�Kà)¨+°kÐ*AÀ;È{ÐCZÐ*ZÔ[�Hð
 %*¨*Ô$5�MÝ,.¬HÐ5dÐ5dÐ5dÐ5dÐVcÐ5dÑ5dÔ5dÑ,eÔ,eÐ)Ø"OÐ"OÐ"OÐ"OÀÐ"OÑ"OÔ"O�Kð #8×"<Ò"<Ñ">Ô">�KØ    1 Ð%Ð%Ô%¨Ñ0Ð%Ð%Ñ%Ø    1 Ð%Ð%Ô%¨Ñ0Ð%Ð%Ñ%Ø    1 Ð%Ð%Ô%¨Ñ0Ð%Ð%Ñ%Ø    1 Ð%Ð%Ô%¨Ñ0Ð%Ð%Ñ%ð  ”~ aÔ(¨AÒ-Ð-°´ÀÔ1BÀaÒ1GÐ1GØ.2˜˜lÑ+Ø/1˜˜mÑ,Ñ,à&*Ô&?×&GÒ&GØ$ kØ"-ð 'Hñ 'ô '™˜˜eð /3˜˜lÑ+Ø/4˜˜mÑ,ùà—Z’Z ¨eÑ4Ô4ˆ
Øð 	ØˆMàÐs+   ÆF Æ F<Æ;F<ÈB$J) Ê)
KÊ3KËKró   Úskip_header_footerrâ  c                 ó>   — | j                              ||||¬¦  «        S )z6Convert page layout detection result to Markdown text.©rE  ró   rU  )rõ   Úgenerate©rü   r(  rE  ró   rU  s        r3   Úto_markdownzBoxRFDGNN.to_markdownl  s#   € àÔ&×/Ò/°¸VÈ$ÐcuÐ/ÑvÔvÐvr5   c                 ó>   — | j                              ||||¬¦  «        S )zBConvert page layout detection result to Markdown with HTML tables.rW  )rö   rX  rY  s        r3   Úto_markdown_html_tablez BoxRFDGNN.to_markdown_html_tablep  s1   € àÔ1×:Ò:¸4ÈÐUYð  oAÐ:ñ  Bô  Bð  	Br5   c                 ó:   — | j                              ||¬¦  «        S )zAConvert page layout detection result to a complete HTML document.)rU  )r÷   rX  )rü   r(  rU  s      r3   Úto_htmlzBoxRFDGNN.to_htmlt  s   € àÔ"×+Ò+¨DÐEWÐ+ÑXÔXÐXr5   )
NNNNr¸   NTFFr¹   ©F)NTT)T)Ú__name__Ú
__module__Ú__qualname__r  Ústaticmethodrè   rì   rú   r'  r3  rI  rw  r~  r€  r‡  rŒ  r�  rž  r¦  rß  r  r-  ÚboolrP   rZ  r\  r^  r'   r5   r3   r·   r·   ò   sZ  € € € € € Øv~ØW\Ø&*ðC@ð C@ð C@ð C@ðJ ð(ð (ñ „\ð(ð6Að Að AðJð Jð Jð>:ð :ð :ð@
ð 
ð 
ð:"ð :"ð :"ðxT"ð T"ð T"ðt ð8ð 8ñ „\ð8ð ðEð Eñ „\ðEð ð4ð 4ñ „\ð4ð
 ð2ð 2ñ „\ð2ð ðð ñ „\ðð ð"ð "ñ „\ð"ð" ðð ñ „\ððS"ð S"ð S"ðjK"ð K"ð K"ðbNð Nð Nð Nð`wð w°4ð wÐTXð wÐdgð wð wð wð wðBð B¸dð BÐ_cð BÐorð Bð Bð Bð BðYð Y°ð YÀð Yð Yð Yð Yð Yð Yr5   r·   )r%   r_  )FrY   FF)2rM   Úos.pathrí   râ   Únumpyry   Úonnxruntimer  Úpathlibr   Úcommon_utilr   r   r   r   r	   r
   r   r   Úroi_poolingr   r   r   r   Úpymupdf_utilr   Úpymupdf_util_edger   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   rI   r4   rX   rµ   r·   r'   r5   r3   ú<module>rm     s½  ðØ €€€Ø €€€à €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ð6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð=ð =ð =ð =ð =ð =ð =ð =ð =ð =ð =ð =ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ø fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fÐ fØ <Ð <Ð <Ð <Ð <Ð <Ø <Ð <Ð <Ð <Ð <Ð <Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø BÐ BÐ BÐ BÐ BÐ BØ (Ð (Ð (Ð (Ð (Ð (Ø (Ð (Ð (Ð (Ð (Ð (Ø %Ð %Ð %Ð %Ð %Ð %àÐ ðð ð ð ð2ð 2ð 2ð 2ðj @EØBGØ.3ðNkð Nkð Nkð NkðbDYð DYð DYð DYð DYñ DYô DYð DYð DYð DYr5   