§
    �Øj_{  ã                  ó¨   — d Z ddlmZ ddlmZ ddlZddlZddl	m
Z
 ddlmZmZ ddlmZ d/d„Z	 d0d1d„Zd2d„Zd3d#„Zd4d'„Zd5d,„Z G d-„ d.¦  «        ZdS )6a‡  
TableGridExtractorV2B.py

Hybrid table grid extractor combining:
  - Rule-based candidate grid lines from bbox geometry (same as V2A).
  - V2B-style region gate: GridModelV2 on_prob arrays are resized to pixel
    space and passed through 1D CCL to define active intervals. A candidate
    line survives if its position falls inside any active interval (score =
    1.0); otherwise it is rejected (score = 0.0).

Design philosophy
-----------------
V2  : anchor decode (on_logit + offset + NMS) determines position directly.
V2A : bbox geometry determines position; nearest anchor on_prob acts as a
      soft confidence filter.
V2B : bbox geometry determines position (precise); on_prob is resized to
      pixel space and treated as a continuous 1D signal, from which CCL
      extracts active regions. A candidate inside an active region is kept
      unconditionally (score = 1.0).

This is the V2 counterpart of V1B. The gate implementation (on_prob ->
resize -> CCL -> intervals) is identical to V1B; only the source of the
1D probability signal differs (heatmap in V1B, resized on_prob in V2B).
offset is intentionally unused: position accuracy comes from bbox geometry,
so the offset's role in V2 is superseded.

V2B inherits from V2A all V2-specific features:
  - ConnClassifier support.
  - GlobalConfig threshold override.
  - snap_to_bbox_gaps.
  - filter_empty_lines (tuple-based, score-aware merge).
é    )Úannotations)ÚPathNé   )Ú
get_config)ÚGridPredictionÚCellInfo)Úmake_sessionÚcandidate_boundariesÚsetÚall_cell_bboxesÚlistÚis_horizontal_coordÚboolÚmin_empty_gap_sizeÚfloatÚreturnc           	     óT  — | sg S t          t          | ¦  «        ¦  «        }t          ¦   «         }t          t	          |¦  «        dz
  ¦  «        D �]>}||         }||dz            }||z
  dk     rŒ d}	|D ]â}
|
\  }}}}|rlt          ||z
  ¦  «        |k    pAt          ||z
  ¦  «        |k    p+t          ||z
  ¦  «        |k    pt          ||z
  ¦  «        |k    }|sŒf||k    r
||k     rd}	 nmŒwt          ||z
  ¦  «        |k    pAt          ||z
  ¦  «        |k    p+t          ||z
  ¦  «        |k    pt          ||z
  ¦  «        |k    }|sŒÒ||k    r
||k     rd}	 nŒã|	r5|                     t          t          ||z   dz  ¦  «        ¦  «        ¦  «         �Œ@t          t          |¦  «        ¦  «        S )z‡
    Derive grid lines from candidate boundary coordinates by detecting
    empty strips between cell bboxes (unchanged from V2A).
    r   r   TFé   )	Úsortedr   r   ÚrangeÚlenÚabsÚaddÚintÚround)r
   r   r   r   Úsorted_boundariesÚfinal_linesÚiÚcoord1Úcoord2Úis_empty_stripÚbboxÚbx1Úby1Úbx2Úby2Úsame_rowÚsame_cols                    úž/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf/layout/onnx/TableGridExtractorV2B.pyÚ_find_grid_lines_by_empty_spacer*   2   s  € ð  ð Øˆ	å�tÐ$8Ñ9Ô9Ñ:Ô:ÐÝ‘u”u€Kå•3Ð(Ñ)Ô)¨AÑ-Ñ.Ô.ð #?ñ #?ˆØ" 1Ô%ˆØ" 1 q¡5Ô)ˆØ�F‰?˜QÒÐØàˆØ#ð 	ð 	ˆDØ!%ÑˆC��c˜3Ø"ð å˜˜f™Ñ%Ô%Ð);Ò;ð <Ý˜˜f™Ñ%Ô%Ð);Ò;ð<å˜˜f™Ñ%Ô%Ð);Ò;ð<õ ˜˜f™Ñ%Ô%Ð);Ò;ð	 ð  ð ØØ˜’<�< C¨&¢L LØ%*�NØ�Eøõ ˜˜f™Ñ%Ô%Ð);Ò;ð <Ý˜˜f™Ñ%Ô%Ð);Ò;ð<å˜˜f™Ñ%Ô%Ð);Ò;ð<õ ˜˜f™Ñ%Ô%Ð);Ò;ð	 ð  ð ØØ˜’<�< C¨&¢L LØ%*�NØ�Eøàð 	?Ø�OŠO�C¥ v°¡¸!Ñ&;Ñ <Ô <Ñ=Ô=Ñ>Ô>Ð>ùå•$�{Ñ#Ô#Ñ$Ô$Ð$ó    ç      @ÚbboxesÚorig_hr   Úorig_wÚgrid_margin_pxÚtuplec                óh  — t          ¦   «         }t          ¦   «         }g }| D �]f}|\  }}	}
}t          t          |¦  «        ¦  «        t          t          |	¦  «        ¦  «        }}t          t          |
¦  «        ¦  «        t          t          |¦  «        ¦  «        }}t          d|¦  «        t          d|¦  «        }}t	          ||¦  «        t	          ||¦  «        }}||k    s||k    rŒÇ||z
  }||z
  }|dk    rdnd}|dk    rdnd}||z   }||z   }||z
  }||z
  }|                     ||||g¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         �Œht          ||d|¬¦  «        }t          ||d|¬¦  «        }|||fS )z§
    Derive candidate h/v grid lines from cell bboxes (unchanged from V2A).

    Returns
    -------
    (candidate_h_lines, candidate_v_lines, cells_bbox_shrunk)
    r   é   r   T)r   r   F)r   r   r   ÚmaxÚminÚappendr   r*   )r-   r.   r/   r0   Úall_h_boundariesÚall_v_boundariesÚcells_bbox_shrunkr"   Úx1_fÚy1_fÚx2_fÚy2_fÚx1Úy1Úx2Úy2ÚwÚhÚx_shrinkÚy_shrinkÚsx1Úsy1Úsx2Úsy2Úh_linesÚv_liness                             r)   Ú_extract_candidate_gridrL   j   så  € õ  ™EœEÐÝ™EœEÐØ Ðàð "ñ "ˆØ!%Ñˆˆd�D˜$å•U˜4‘[”[Ñ!Ô!¥3¥u¨T¡{¤{Ñ#3Ô#3ˆBˆÝ•U˜4‘[”[Ñ!Ô!¥3¥u¨T¡{¤{Ñ#3Ô#3ˆBˆÝ�Q˜‘”�S  B™ZœZˆBˆÝ�V˜R‘”¥# f¨b¡/¤/ˆBˆà�Š8ˆ8�r˜R’x�xØà�‰GˆØ�‰GˆØ˜Qš˜�1�1 AˆØ˜Qš˜�1�1 AˆØ�8‰mˆØ�8‰mˆØ�8‰mˆØ�8‰mˆØ× Ò  # s¨C°Ð!5Ñ6Ô6Ð6à×Ò˜SÑ!Ô!Ð!Ø×Ò˜SÑ!Ô!Ð!Ø×Ò˜SÑ!Ô!Ð!Ø×Ò˜SÑ!Ô!Ð!Ñ!å-ØÐ+Ø Ø)ðñ ô €Gõ
 .ØÐ+Ø!Ø)ðñ ô €Gð �GÐ.Ð.Ð.r+   Úfeature_mapú
np.ndarrayÚh_lines_normÚv_lines_normc                óÔ  — | j         \  }}}t          |¦  «        }t          |¦  «        }|dk     s|dk     rEt          j        t	          |dz
  d¦  «        t	          |dz
  d¦  «        |ft          j        ¬¦  «        S t          j        ||z                       t          j        ¦  «        d|¦  «        }t          j        ||z                       t          j        ¦  «        d|¦  «        }	t          j        |dz
  |dz
  |ft          j        ¬¦  «        }
t          |dz
  ¦  «        D ]Å}||         }t	          |dz   ||dz            ¦  «        }t          ||¦  «        }||k    rŒ=t          |dz
  ¦  «        D ]u}|	|         }t	          |dz   |	|dz            ¦  «        }t          ||¦  «        }||k    rŒ=| dd…||…||…f         }|j        dk    rŒZ|                     d¬¦  «        |
||f<   ŒvŒÆ|
S )z<Pool feature_map regions defined by detected line positions.r   r   ©Údtyper   N)r   r   )Úaxis)Úshaper   ÚnpÚzerosr4   Úfloat32ÚclipÚastypeÚint32r   r5   ÚsizeÚmean)rM   rO   rP   ÚCÚHÚWÚNÚMÚysÚxsÚ	cell_featr   r?   rA   Újr>   r@   Úregions                     r)   Ú_extract_cell_featuresrh   §   sê  € ð Ô�G€A€qˆ!ÝˆLÑÔ€AÝˆLÑÔ€Aàˆ1‚u€u��A’�ÝŒx�˜Q ™U A™œ­¨A°©E°1©¬°qÐ9ÅÄÐLÑLÔLÐLå	Œ�, Ñ"×*Ò*­2¬8Ñ4Ô4°a¸Ñ	;Ô	;€BÝ	Œ�, Ñ"×*Ò*­2¬8Ñ4Ô4°a¸Ñ	;Ô	;€Bå”˜!˜a™%  Q¡¨Ð*µ"´*Ð=Ñ=Ô=€IÝ�1�q‘5‰\Œ\ð 7ð 7ˆØ�ŒUˆÝ��a‘˜˜A ™EœÑ#Ô#ˆÝ��Q‰ZŒZˆØ�Š7ˆ7ØÝ�q˜1‘u‘”ð 		7ð 		7ˆAØ�A”ˆBÝ�R˜!‘V˜R  A¡œYÑ'Ô'ˆBÝ�R˜‘”ˆBØ�QŠwˆwØØ     B r E¨2¨b¨5 Ô1ˆFØŒ{˜aÒÐØØ$Ÿkšk¨v˜kÑ6Ô6ˆI�a˜�d‰OˆOð		7ð Ðr+   Ú	signal_1dÚ	thresholdúlist[tuple[int, int]]c                óì   — | |k    }g }d}d}t          |¦  «        D ].\  }}|r|sd}|}Œ|s|r|                     ||dz
  f¦  «         d}Œ/|r'|                     |t          | ¦  «        dz
  f¦  «         |S )am  
    Apply threshold to a 1D float array and return (start, end) pixel
    intervals of every connected active component.

    Parameters
    ----------
    signal_1d : 1D float32 array in pixel space (length = image dimension)
    threshold : minimum activation value

    Returns
    -------
    List of (start_px, end_px) tuples, inclusive, sorted by start.
    Fr   Tr   )Ú	enumerater6   r   )ri   rj   ÚactiveÚ	intervalsÚin_groupÚgroup_startr   Ú	is_actives           r)   Ú_ccl_1d_active_intervalsrs   Ñ   s·   € ð" ˜)Ò#€FØ')€IØ€HØ€Kå! &Ñ)Ô)ð ð ‰ˆˆ9Øð 	˜Xð 	ØˆHØˆKˆKØð 	˜xð 	Ø×Ò˜k¨1¨q©5Ð1Ñ2Ô2Ð2ØˆHøàð <Ø×Ò˜+¥s¨9¡~¤~¸Ñ'9Ð:Ñ;Ô;Ð;àÐr+   Úpositions_pxro   útuple[np.ndarray, np.ndarray]c                ó–  — t          j        t          | ¦  «        t           j        ¬¦  «        }t          j        t          | ¦  «        t           j        ¬¦  «        }t          |¦  «        }t	          | ¦  «        D ]M\  }}|t          t          |¦  «        |dz
  ¦  «                 ||<   |D ]\  }}	||cxk    r|	k    r
n Œd||<    nŒŒN||fS )am  
    Assign score 1.0 to each candidate position that falls inside at least
    one CCL active interval; assign 0.0 otherwise.
    Also return the signal value at each candidate position for top_k ranking.

    Parameters
    ----------
    positions_px : list of integer candidate positions in pixel space
    intervals    : list of (start, end) active intervals
    signal_1d    : 1D float32 array in pixel space (on_prob or heatmap)

    Returns
    -------
    gate_scores  : np.ndarray of float32, 1.0 if inside interval else 0.0
    prob_scores  : np.ndarray of float32, signal value at each candidate position
    rR   r   ç      ð?)rV   rW   r   rX   rm   r5   r   )
rt   ro   ri   Úgate_scoresÚprob_scoresÚnr   ÚposÚstartÚends
             r)   Ú"_score_candidates_by_ccl_intervalsr~   õ   sÞ   € õ* ”(�3˜|Ñ,Ô,µB´JÐ?Ñ?Ô?€KÝ”(�3˜|Ñ,Ô,µB´JÐ?Ñ?Ô?€KÝˆI‰Œ€AÝ˜LÑ)Ô)ð ð ‰ˆˆ3Ø"¥3¥s¨3¡x¤x°°Q±Ñ#7Ô#7Ô8ˆ�A‰Ø#ð 	ð 	‰JˆE�3Ø˜Ð"Ð"Ò"Ð"˜sÒ"Ð"Ð"Ð"Ð"Ø!$�˜A‘Ø�ð #øð ˜Ð#Ð#r+   ÚlinesÚprob_mapÚdictÚtop_kc                óä   ‡‡‡	— t          ¦   «         }|D ]N\  Š	Šˆˆ	fd„| D ¦   «         }|sŒt          |ˆfd„d¬¦  «        }|d|…         D ]}|                     |¦  «         ŒŒOt          |¦  «        S )a‘  
    Within each CCL active interval, retain at most top_k candidates ranked
    by their on_prob value (highest first). Candidates not covered by any
    interval are passed through unchanged (they have already been gate-filtered
    before this call, so in practice none should remain).

    Parameters
    ----------
    lines     : list of candidate positions that passed the CCL gate
    intervals : list of (start, end) active intervals
    prob_map  : dict mapping position -> on_prob value for each line
    top_k     : maximum number of candidates to keep per interval

    Returns
    -------
    Sorted list of surviving candidate positions.
    c                ó4   •— g | ]}‰|cxk    r‰k    ¯n n|‘ŒS © r…   )Ú.0Úyr}   r|   s     €€r)   ú
<listcomp>z-_apply_top_k_per_interval.<locals>.<listcomp>/  s:   ø€ Ð9Ð9Ð9˜ u°Ð'8Ð'8Ò'8Ð'8°SÒ'8Ð'8Ð'8Ð'8Ð'8�1Ð'8Ð'8Ð'8r+   c                ó0   •— ‰                      | d¦  «        S )Nç        )Úget)r‡   r€   s    €r)   ú<lambda>z+_apply_top_k_per_interval.<locals>.<lambda>2  s   ø€ °x·|²|ÀAÀsÑ7KÔ7K€ r+   T)ÚkeyÚreverseN)r   r   r   )
r   ro   r€   r‚   ÚkeptÚmembersÚmembers_sortedr‡   r}   r|   s
     `     @@r)   Ú_apply_top_k_per_intervalr’     s£   øøø€ õ. ‘”€DØð ð ‰
ˆˆsØ9Ð9Ð9Ð9Ð9˜eÐ9Ñ9Ô9ˆØð 	ØÝ Ð-KÐ-KÐ-KÐ-KÐUYÐZÑZÔZˆØ   Ô'ð 	ð 	ˆAØ�HŠH�Q‰KŒKˆKˆKð	å�$‰<Œ<Ðr+   c                  ó’   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 d1d2d„Zd3d„Ze	 d4d5d!„¦   «         Zed6d%„¦   «         Z	 d7d8d)„Z		 	 	 d9d:d-„Z
d;d0„ZdS )<ÚTableGridExtractorV2BaP  
    Hybrid table grid extractor (V2B).

    Candidate grid lines are derived from cell bbox geometry (V3 rule-based
    algorithm, same as V2A). Active regions are determined by resizing the
    GridModelV2 on_prob arrays to pixel space and applying 1D CCL (same gate
    logic as V1B). A candidate line is kept (score = 1.0) if and only if it
    falls inside a CCL active interval.

    V2-specific features preserved from V2A:
      - ConnClassifier support.
      - GlobalConfig threshold override.
      - snap_to_bbox_gaps.
      - filter_empty_lines with score-aware tuple merge.
    Nç      Ð?çš™™™™™É?r,   r   TFú1-RowÚBBoxÚh_on_thresholdr   Úv_on_thresholdÚconn_thresholdr0   r‚   r   Úfilter_empty_linesr   Úsnap_to_bbox_gapsr   ÚNonec                óX  — |€dg}t          |¦  «        | _        |rt          |¦  «        nd| _        || _        || _        || _        || _        || _        || _        |	| _	        |
| _
        || _        t          ¦   «         }|                     d¦  «        �4|                     d¦  «        | _        |                     d¦  «        | _        t          t          | j        ¦  «        |¦  «        | _        | j        r;| j                             ¦   «         r"t          t          | j        ¦  «        |¦  «        nd| _        | j                             ¦   «         d         }t)          |j        d         ¦  «        | _        t)          |j        d         ¦  «        | _        t1          j        d	d| j        | j        ft0          j        ¬
¦  «        }| j                             dd|i¦  «        }t)          |d         j        d	         ¦  «        | _        t)          |d         j        d	         ¦  «        | _        dS )a)  
        Parameters
        ----------
        grid_onnx_path    : path to exported GridModelV2 .onnx file
        conn_onnx_path    : path to ConnClassifier .onnx file (optional)
        h_on_threshold    : on_prob threshold for h CCL active intervals
        v_on_threshold    : on_prob threshold for v CCL active intervals
        conn_threshold    : connectivity classifier probability threshold
        grid_margin_px    : alignment tolerance for candidate grid extraction
        top_k             : max candidates kept per CCL interval ranked by on_prob
                            value; candidates beyond top_k are dropped. Use 0 or
                            a negative value to disable (keep all).
        filter_empty_lines: whether to run empty-line filtering in predict()
        snap_to_bbox_gaps : whether to snap h lines to inter-row bbox gaps
        header_type       : passed through to downstream consumers
        merge_type        : passed through to downstream consumers
        providers         : ONNX Runtime execution providers
        NÚCPUExecutionProviderr”   z$TableGridExtractorV2B.v_on_thresholdz$TableGridExtractorV2B.h_on_thresholdr   r   r3   r   rR   Úimage)r   Úgrid_onnx_pathÚconn_onnx_pathr™   rš   r›   r0   r‚   rœ   r�   Úheader_typeÚ
merge_typer   r‹   r	   ÚstrÚ
_grid_sessÚexistsÚ
_conn_sessÚ
get_inputsr   rU   Ú_input_hÚ_input_wrV   rW   rX   ÚrunÚ_max_hÚ_max_v)Úselfr¢   r£   r™   rš   r›   r0   r‚   rœ   r�   r¤   r¥   Ú	providersÚglobal_configÚinpÚdummyÚoutputss                    r)   Ú__init__zTableGridExtractorV2B.__init__M  sò  € ðB ÐØ/Ð0ˆIå"& ~Ñ"6Ô"6ˆÔØ:HÐ"R¥$ ~Ñ"6Ô"6Ð"6ÈdˆÔØ"0ˆÔØ"0ˆÔØ"0ˆÔØ"0ˆÔØ"'ˆŒ
Ø"4ˆÔØ"3ˆÔØ"-ˆÔØ",ˆŒå"™œˆØ×ÒÐ4Ñ5Ô5ÐAØ"/×"3Ò"3Ð4ZÑ"[Ô"[ˆDÔØ"/×"3Ò"3Ð4ZÑ"[Ô"[ˆDÔå&¥s¨4Ô+>Ñ'?Ô'?ÀÑKÔKˆŒð Ô"ðNØ'+Ô':×'AÒ'AÑ'CÔ'CðN�L�˜TÔ0Ñ1Ô1°9Ñ=Ô=Ð=ØIMð 	Œð
 Œo×(Ò(Ñ*Ô*¨1Ô-ˆÝ˜CœI aœLÑ)Ô)ˆŒÝ˜CœI aœLÑ)Ô)ˆŒå”(˜A˜q $¤-°´Ð?ÅrÄzÐRÑRÔRˆØ”/×%Ò% d¨W°eÐ,<Ñ=Ô=ˆÝ˜' !œ*Ô*¨1Ô-Ñ.Ô.ˆŒÝ˜' !œ*Ô*¨1Ô-Ñ.Ô.ˆŒˆˆr+   Ú	image_bgrrN   r1   c           	     ó¬  — ddl }|j        dd…         \  }}|                     || j        | j        f¦  «        }|dd…dd…ddd…f                              t          j        ¦  «        dz  }|                     ddd¦  «        t          j	                 }| j
                             dd|i¦  «        }|d         d         }	|d         d         }
|d         d         }|d         d         }|d	         d         }d
d
t          j        |	                     t          j        ¦  «         ¦  «        z   z                       t          j        ¦  «        }d
d
t          j        |                     t          j        ¦  «         ¦  «        z   z                       t          j        ¦  «        }|                     |t          j	        dd…f                              t          j        ¦  «        |df|j        ¬¦  «        d         }|                     |t          j	        dd…f                              t          j        ¦  «        |df|j        ¬¦  «        d         }|	|
|||||||f	S )a`  
        Run GridModelV2 inference and return raw outputs.

        Returns
        -------
        (h_on_logit, h_offset, v_on_logit, v_offset, feature_map,
         h_on_prob_px, v_on_prob_px)

        h_on_prob_px : (orig_h,) float32 - on_prob resized to pixel space
        v_on_prob_px : (orig_w,) float32 - on_prob resized to pixel space
        r   Nr   éÿÿÿÿg     ào@r   r¡   r3   é   rw   )Úinterpolation)Úcv2rU   Úresizer¬   r«   rZ   rV   rX   Ú	transposeÚnewaxisr§   r­   ÚexpÚfloat64ÚINTER_LINEAR)r°   r·   r¼   r.   r/   Úimg_resizedÚimg_rgbr³   rµ   Ú
h_on_logitÚh_offsetÚ
v_on_logitÚv_offsetrM   Ú	h_on_probÚ	v_on_probÚh_on_prob_pxÚv_on_prob_pxs                     r)   Ú_run_inferencez$TableGridExtractorV2B._run_inference•  s-  € ð 	ˆ
ˆ
ˆ
à"œ¨¨!¨Ô,‰ˆ�à—j’j ¨T¬]¸D¼MÐ,JÑKÔKˆØ! ! ! ! Q Q Q¨¨¨"¨ *Ô-×4Ò4µR´ZÑ@Ô@À5ÑHˆØ×'Ò'¨¨1¨aÑ0Ô0µ´Ô<ˆà”o×)Ò)¨$°¸#°Ñ?Ô?ˆØ˜a”j ”mˆ
Ø˜a”j ”mˆØ˜a”j ”mˆ
Ø˜a”j ”mˆØ˜a”j ”mˆà˜C¥"¤&¨*×*;Ò*;½B¼JÑ*GÔ*GÐ)GÑ"HÔ"HÑHÑI×QÒQÕRTÔR\Ñ]Ô]ˆ	Ø˜C¥"¤&¨*×*;Ò*;½B¼JÑ*GÔ*GÐ)GÑ"HÔ"HÑHÑI×QÒQÕRTÔR\Ñ]Ô]ˆ	ð
 —z’zØ•b”j ! ! !�mÔ$×+Ò+­B¬JÑ7Ô7Ø�QˆKØÔ*ð "ñ 
ô 
ð ô	ˆð
 —z’zØ•b”j ! ! !�mÔ$×+Ò+­B¬JÑ7Ô7Ø�QˆKØÔ*ð "ñ 
ô 
ð ô	ˆð ˜ *¨h¸Ø�yØ˜,ð
ð 	
r+   rŠ   rJ   r   Úbboxes_cropÚsnap_thresholdc                ó.  — t          |¦  «        dk    st          | ¦  «        dk    r| S t          j        |dd…df         ¦  «        }t          j        |dd…df         ¦  «        }g }|D ]O}|||k             }t          |¦  «        dk    r.|                     |t	          |d         ¦  «        z   dz  ¦  «         ŒP|s| S t          j        t          t          d„ |D ¦   «         ¦  «        ¦  «        t          j        ¬¦  «        }t          ¦   «         }	g }
| D �] }t          j	        |dd…df         |k     ||dd…df         k     z  ¦  «        }|r³t          j
        ||z
  ¦  «        }t          j        |¦  «        }d}|D ]k}t	          ||         ¦  «        }t	          ||         ¦  «        }||	v rŒ1|d	k    s||k    r.|
                     |¦  «         |	                     |¦  «         d
} nŒl|s|
                     |¦  «         Œë|
                     |¦  «         �Œ|
S )z=Snap h_lines crossing a bbox to nearest inter-row gap center.r   Nr3   r   ç       @c              3  ó6   K  — | ]}t          |d ¦  «        V — ŒdS )rº   N)r   )r†   Úgs     r)   ú	<genexpr>zATableGridExtractorV2B._snap_lines_to_bbox_gaps.<locals>.<genexpr>à  s*   è è € Ð'GÐ'G¸­¨a°©¬Ð'GÐ'GÐ'GÐ'GÐ'GÐ'Gr+   rR   FrŠ   T)r   rV   Úsortr6   r   Úarrayr   r   rX   Úanyr   Úargsortr   )rJ   rÎ   rÏ   ÚbottomsÚtopsÚ	gap_linesÚbotÚ
candidatesÚgap_arrÚ	used_gapsÚresultr‡   ÚcrossesÚdistsÚorderÚsnappedÚidxÚnearestÚdists                      r)   Ú_snap_lines_to_bbox_gapsz.TableGridExtractorV2B._snap_lines_to_bbox_gapsË  sK  € õ ˆ{ÑÔ˜qÒ Ð ¥C¨¡L¤L°AÒ$5Ð$5ØˆNå”G˜K¨¨¨¨1¨Ô-Ñ.Ô.ˆÝ”G˜K¨¨¨¨1¨Ô-Ñ.Ô.ˆØˆ	Øð 	Eð 	EˆCØ˜d SšjÔ)ˆJÝ�:‰Œ Ò"Ð"Ø× Ò  #­¨j¸¬mÑ(<Ô(<Ñ"<ÀÑ!CÑDÔDÐDøàð 	ØˆNå”H�V¥CÐ'GÐ'G¸YÐ'GÑ'GÔ'GÑ$GÔ$GÑHÔHÕPRÔPZÐ[Ñ[Ô[ˆÝ™œˆ	ØˆØð 	!ñ 	!ˆAÝ”f˜k¨!¨!¨!¨Q¨$Ô/°!Ò3¸¸KÈÈÈÈ1ÈÔ<MÒ8MÑNÑOÔOˆGØð !Ýœ˜w¨™{Ñ+Ô+�Ýœ
 5Ñ)Ô)�Ø�Ø ð 	ð 	�CÝ# G¨C¤LÑ1Ô1�GÝ# E¨#¤JÑ/Ô/�DØ )Ð+Ð+Ø Ø%¨Ò,Ð,°¸Ò0FÐ0FØŸš gÑ.Ô.Ð.Ø!Ÿš gÑ.Ô.Ð.Ø"&˜Ø˜ð	 1Gð
 ð %Ø—M’M !Ñ$Ô$Ð$øà—’˜aÑ Ô Ð Ñ Øˆr+   r   ÚcentersÚ
image_sizec                ó‚  ‡‡— | s| S t          | ¦  «        }d}|r¥d}t          |¦  «        dk     rn�|d         g}t          dt          |¦  «        ¦  «        D ]d}|d         \  Š}}||         \  Š}	}
t          ˆˆfd„|D ¦   «         ¦  «        }|s|	|k    r‰|	|
f|d<   d}ŒI|                     ||         ¦  «         Œe|}|°¥|S )zÎ
        Merge adjacent (y, score, cls) line tuples that have no bbox center
        between them. When merging, the tuple with the higher score is kept.
        Convergence loop runs until stable.
        TFr   r   r   r¹   c              3  ó8   •K  — | ]}‰|cxk    o‰k    nc V — Œd S ©Nr…   )r†   ÚcÚhi_yÚlo_ys     €€r)   rÔ   z<TableGridExtractorV2B._filter_empty_lines.<locals>.<genexpr>  s?   øè è € Ð DÐ D°q ¨Ð!2Ð!2Ò!2Ð!2¨dÒ!2Ð!2Ð!2Ð!2Ð DÐ DÐ DÐ DÐ DÐ Dr+   )r   r   r   r×   r6   )r   ré   rê   ÚcurrentÚchangedrà   r   Úlo_scoreÚlo_clsÚhi_scoreÚhi_clsÚ
has_centerrï   rð   s               @@r)   Ú_filter_empty_linesz)TableGridExtractorV2B._filter_empty_linesý  s  øø€ ð ð 	ØˆLå˜‘-”-ˆØˆàð 	ØˆGÝ�7‰|Œ|˜aÒÐØØ˜a”j�\ˆFÝ˜1�c '™lœlÑ+Ô+ð 	.ð 	.�Ø)/°¬Ñ&��h Ø)0°¬Ñ&��h Ý Ð DÐ DÐ DÐ DÐ D¸GÐ DÑ DÔ DÑDÔD�
Ø!ð .Ø 8Ò+Ð+Ø&*¨H°fÐ%=˜˜r™
Ø"�G�Gà—M’M '¨!¤*Ñ-Ô-Ð-Ð-ØˆGð ð 	ð" ˆr+   r-   úlist | Noner   c                ó”  ‡‡‡ ‡!‡"‡#— |j         dd…         \  Š Š!|                      |¦  «        \	  }}}}}}}	}
}|�t          |¦  «        dk    rqt          g g ||	t	          j        g t          j        ¬¦  «        t	          j        g t          j        ¬¦  «        t	          j        g t          j        ¬¦  «        d¬¦  «        S t          |‰ ‰!| j	        ¦  «        \  }}}t          |
| j        ¦  «        }t          || j        ¦  «        }t          |||
¦  «        \  ŠŠt          |||¦  «        \  Š#Š"d„ t          |‰¦  «        D ¦   «         }d„ t          |‰#¦  «        D ¦   «         }| j        dk    rfˆˆfd„t!          |¦  «        D ¦   «         }ˆ"ˆ#fd	„t!          |¦  «        D ¦   «         }t#          |||| j        ¦  «        }t#          |||| j        ¦  «        }t	          j        ˆ fd
„|D ¦   «         t          j        ¬¦  «        }t	          j        ˆ!fd„|D ¦   «         t          j        ¬¦  «        }t	          j        t          |¦  «        t          j        ¬¦  «        }d}| j        ��:t          |¦  «        dk    �r&t          |¦  «        dk    �rt)          |||¦  «        }t	          j        |¦  «                             ¦   «         rÛ|                     ddd¦  «        t          j                                      t          j        ¦  «        }| j                             dd|i¦  «        }|d         d         }ddt	          j        |                     t          j        ¦  «         ¦  «        z   z  }|                     ddd¦  «                             t          j        ¦  «        }t          t;          |¦  «        t;          |¦  «        ||	||||¬¦  «        S )aá  
        Derive candidate grid lines from bboxes and gate them by CCL active
        intervals extracted from the pixel-space on_prob signal.

        Scoring rule
        ------------
        - Resize on_prob (anchor space) to pixel space.
        - Run 1D CCL with threshold to obtain active intervals.
        - Candidate inside any interval -> score = 1.0 (kept).
        - Candidate outside all intervals -> score = 0.0 (dropped).

        Parameters
        ----------
        image_bgr : cropped table BGR image (any size)
        bboxes    : list of [x1, y1, x2, y2] cell bbox pixel coordinates.
                    When None or empty, returns an empty GridPrediction with
                    h_on_prob / v_on_prob populated for downstream use.

        Returns
        -------
        GridPrediction with filtered h/v lines and binary confidence scores
        stored in h_confidences / v_confidences.
        h_on_prob / v_on_prob carry the full anchor-space sigmoid arrays.
        Nr   r   rR   ©rJ   rK   rÉ   rÊ   rO   rP   Úh_clsÚconnectivityc                ó$   — g | ]\  }}|d k    ¯|‘ŒS ©rŠ   r…   )r†   r‡   Úss      r)   rˆ   z6TableGridExtractorV2B.predict_grid.<locals>.<listcomp>b  ó!   € ÐBÐBÐB™˜˜A¸!¸cº'¸'�1¸'¸'¸'r+   c                ó$   — g | ]\  }}|d k    ¯|‘ŒS rÿ   r…   )r†   Úxr   s      r)   rˆ   z6TableGridExtractorV2B.predict_grid.<locals>.<listcomp>c  r  r+   c                óZ   •— i | ]'\  }}‰|         d k    ¯|t          ‰|         ¦  «        “Œ(S rÿ   ©r   )r†   r   r‡   Úh_probsÚh_scoress      €€r)   ú
<dictcomp>z6TableGridExtractorV2B.predict_grid.<locals>.<dictcomp>h  óF   ø€ ð Nð Nð NÙ"˜a ¸8ÀA¼;ÈÒ;LÐ;Lð �U 7¨1¤:Ñ.Ô.Ø;LÐ;LÐ;Lr+   c                óZ   •— i | ]'\  }}‰|         d k    ¯|t          ‰|         ¦  «        “Œ(S rÿ   r  )r†   r   r  Úv_probsÚv_scoress      €€r)   r  z6TableGridExtractorV2B.predict_grid.<locals>.<dictcomp>j  r	  r+   c                ó4   •— g | ]}|t          ‰¦  «        z  ‘ŒS r…   r  ©r†   r‡   r.   s     €r)   rˆ   z6TableGridExtractorV2B.predict_grid.<locals>.<listcomp>p  ó$   ø€ Ð DÐ DÐ D°q ¥U¨6¡]¤]Ñ!2Ð DÐ DÐ Dr+   c                ó4   •— g | ]}|t          ‰¦  «        z  ‘ŒS r…   r  ©r†   r  r/   s     €r)   rˆ   z6TableGridExtractorV2B.predict_grid.<locals>.<listcomp>q  r  r+   r   Úcell_featuresrw   )rU   rÍ   r   r   rV   rÖ   rX   r[   rL   r0   rs   r™   rš   r~   Úzipr‚   rm   r’   Úonesr©   rh   ÚisfiniteÚallr¾   r¿   rZ   r­   rÀ   rÁ   r   )$r°   r·   r-   rÅ   rÆ   rÇ   rÈ   rM   rÉ   rÊ   rË   rÌ   Úcand_hÚcand_vÚ_Úh_intervalsÚv_intervalsrJ   rK   Ú
h_prob_mapÚ
v_prob_maprO   rP   rü   rý   re   Úcell_inpÚconn_outÚconn_logitsÚ	conn_probr  r  r.   r/   r  r  s$                                 @@@@@@r)   Úpredict_gridz"TableGridExtractorV2B.predict_grid%  së  øøøøøø€ ð: #œ¨¨!¨Ô,‰ˆ�ð (,×':Ò':¸9Ñ'EÔ'Eñ	%ˆ�X˜z¨8°[Ø	�IØ	�|àˆ>�S ™[œ[¨AÒ-Ð-Ý!ØØØ#Ø#ÝœX bµ´
Ð;Ñ;Ô;ÝœX bµ´
Ð;Ñ;Ô;Ý”h˜r­¬Ð2Ñ2Ô2Ø!ð	ñ 	ô 	ð 	õ 4Ø�F˜F DÔ$7ñ
ô 
Ñˆ�˜õ
 /¨|¸TÔ=PÑQÔQˆÝ.¨|¸TÔ=PÑQÔQˆõ ?¸vÀ{ÐT`ÑaÔaÑˆ�'Ý>¸vÀ{ÐT`ÑaÔaÑˆ�'ð CÐB¥ V¨XÑ!6Ô!6ÐBÑBÔBˆØBÐB¥ V¨XÑ!6Ô!6ÐBÑBÔBˆð Œ:˜Š>ˆ>ðNð Nð Nð Nð NÝ&/°Ñ&7Ô&7ðNñ Nô NˆJðNð Nð Nð Nð NÝ&/°Ñ&7Ô&7ðNñ Nô NˆJõ 0°¸ÀjÐRVÔR\Ñ]Ô]ˆGÝ/°¸ÀjÐRVÔR\Ñ]Ô]ˆGå”xÐ DÐ DÐ DÐ D¸GÐ DÑ DÔ DÍBÌJÐWÑWÔWˆÝ”xÐ DÐ DÐ DÐ D¸GÐ DÑ DÔ DÍBÌJÐWÑWÔWˆÝ”w�s 7™|œ|µ2´8Ð<Ñ<Ô<ˆð ˆØŒOÑ'Ý˜Ñ%Ô%¨Ò*Ñ*Ý˜Ñ%Ô%¨Ò*Ñ*Ý.¨{¸LÈ,ÑWÔWˆIÝŒ{˜9Ñ%Ô%×)Ò)Ñ+Ô+ð OØ'×1Ò1°!°Q¸Ñ:Ô:½2¼:ÔF×MÒMÍbÌjÑYÔY�Ø"œo×1Ò1°$¸È(Ð8SÑTÔT�Ø& qœk¨!œn�Ø! S­2¬6°;×3EÒ3EÅbÄjÑ3QÔ3QÐ2QÑ+RÔ+RÑ%RÑS�	Ø(×2Ò2°1°a¸Ñ;Ô;×BÒBÅ2Ä:ÑNÔN�åÝ˜7‘O”OÝ˜7‘O”OØØØ%Ø%ØØ%ð	
ñ 	
ô 	
ð 		
r+   çš™™™™™¹?ÚtextsÚspan_thresholdc           
     óˆ
  ‡‡‡‡‡ ‡!— |�t          |¦  «        dk    r|                      ||¦  «        g fS |                      ||¦  «        }t          |j        d         ¦  «        Št          |j        d         ¦  «        Š‰Š‰Š t	          j        |t          j        ¬¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          |j        ¦  «        }	t	          j	        dd|	t          j        ¬¦  «        }
g Št          |j        t          |j        ¦  «        r|j                             ¦   «         ndgt          |j        ¦  «        z  ¦  «        D ]r\  }}|‰z  }t          t	          j        t	          j        |
|z
  ¦  «        ¦  «        ¦  «        }t          |j        |         ¦  «        }‰                     |||f¦  «         Œst          |j        ¦  «        }t	          j	        dd|t          j        ¬¦  «        }g Š!|j        D ]o}|‰ z  }t          t	          j        t	          j        ||z
  ¦  «        ¦  «        ¦  «        }t          |j        |         ¦  «        }‰!                     ||df¦  «         Œp| j        �rB|                      ‰|‰¦  «        Š|                      ‰!|‰¦  «        Š!‰rBt-          ˆfd	„|D ¦   «         ¦  «        s'‰dd…         Š‰rt-          ˆfd	„|D ¦   «         ¦  «        ¯'‰!rBt-          ˆ!fd
„|D ¦   «         ¦  «        s'‰!dd…         Š!‰!rt-          ˆ!fd
„|D ¦   «         ¦  «        ¯'‰rDt-          ˆˆfd„|D ¦   «         ¦  «        s(‰dd…         Š‰rt-          ˆˆfd„|D ¦   «         ¦  «        ¯(‰!rDt-          ˆˆ!fd„|D ¦   «         ¦  «        s(‰!dd…         Š!‰!rt-          ˆˆ!fd„|D ¦   «         ¦  «        ¯(d„ ‰D ¦   «         }d„ ‰!D ¦   «         }t	          j        d„ ‰D ¦   «         t          j        ¬¦  «        }| j        r<|                      ||¦  «        }d„ t          |‰¦  «        D ¦   «         Šd„ ‰D ¦   «         }t	          j        ˆfd„|D ¦   «         t          j        ¬¦  «        }t	          j        ˆ fd„|D ¦   «         t          j        ¬¦  «        }t7          t          |¦  «        t          |¦  «        |j        |j        ||||j        ¬¦  «        }|                      |||¬¦  «        }|�9|D ]6}d|j        cxk    rt          |¦  «        k     rn Œ$||j                 |_        Œ7||fS )a  
        Predict grid boundaries and optionally assign bboxes to grid cells.

        Parameters
        ----------
        image_bgr      : cropped table BGR image (any size)
        bboxes         : list of [x1, y1, x2, y2] in crop space.
                         If None or empty, only grid prediction is returned.
        texts          : list of text strings aligned with bboxes.
        span_threshold : fractional overlap to trigger span expansion

        Returns
        -------
        (GridPrediction, list[CellInfo])
        Nr   r   rR   c              3  ór   K  — | ]2}t          |d          ¦  «        t          |d         ¦  «        z   dz  V — Œ3dS )r   r   rÑ   Nr  ©r†   Úbs     r)   rÔ   z0TableGridExtractorV2B.predict.<locals>.<genexpr>±  ó@   è è € ÐOÐO¸q�%  !¤™+œ+­¨a°¬d©¬Ñ3°sÑ:ÐOÐOÐOÐOÐOÐOr+   c              3  ór   K  — | ]2}t          |d          ¦  «        t          |d         ¦  «        z   dz  V — Œ3dS )r   r3   rÑ   Nr  r(  s     r)   rÔ   z0TableGridExtractorV2B.predict.<locals>.<genexpr>²  r*  r+   rŠ   rw   c              3  óP   •K  — | ] }d |cxk    o‰d         d         k    nc V — Œ!dS ©rŠ   r   Nr…   )r†   rî   Úh_tupless     €r)   rÔ   z0TableGridExtractorV2B.predict.<locals>.<genexpr>Ñ  óG   øè è € Ð&SÐ&SÀa s¨aÐ'AÐ'AÒ'AÐ'A°8¸A´;¸q´>Ò'AÐ'AÐ'AÐ'AÐ&SÐ&SÐ&SÐ&SÐ&SÐ&Sr+   c              3  óP   •K  — | ] }d |cxk    o‰d         d         k    nc V — Œ!dS r-  r…   )r†   rî   Úv_tupless     €r)   rÔ   z0TableGridExtractorV2B.predict.<locals>.<genexpr>Ó  r/  r+   c              3  óP   •K  — | ] }‰d          d         |cxk    o‰k    nc V — Œ!dS ©r¹   r   Nr…   )r†   rî   Úcrop_hr.  s     €€r)   rÔ   z0TableGridExtractorV2B.predict.<locals>.<genexpr>Õ  óG   øè è € Ð&WÐ&WÈ! x°¤|°A¤¸!Ð'EÐ'EÒ'EÐ'E¸vÒ'EÐ'EÐ'EÐ'EÐ&WÐ&WÐ&WÐ&WÐ&WÐ&Wr+   r¹   c              3  óP   •K  — | ] }‰d          d         |cxk    o‰k    nc V — Œ!dS r3  r…   )r†   rî   Úcrop_wr1  s     €€r)   rÔ   z0TableGridExtractorV2B.predict.<locals>.<genexpr>×  r5  r+   c                ó   — g | ]\  }}}|‘Œ	S r…   r…   ©r†   r‡   r  s      r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>Ú  ó   € Ð4Ð4Ð4¡  1 a˜!Ð4Ð4Ð4r+   c                ó   — g | ]\  }}}|‘Œ	S r…   r…   )r†   r  r  s      r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>Û  r:  r+   c                ó   — g | ]\  }}}|‘Œ	S r…   r…   )r†   r  rî   s      r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>Ü  s   € Ð"=Ð"=Ð"=©¨¨A¨q 1Ð"=Ð"=Ð"=r+   c                ó&   — g | ]\  }\  }}}|||f‘ŒS r…   r…   )r†   Úsyr  Úscrî   s        r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>à  s(   € ÐSÐSÐS©.¨"©j¨q°"°a˜2˜r 1˜+ÐSÐSÐSr+   c                ó   — g | ]\  }}}|‘Œ	S r…   r…   r9  s      r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>á  r:  r+   c                ó   •— g | ]}|‰z  ‘ŒS r…   r…   r  s     €r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>ã  ó   ø€ Ð#CÐ#CÐ#C°1 A¨¡JÐ#CÐ#CÐ#Cr+   c                ó   •— g | ]}|‰z  ‘ŒS r…   r…   r  s     €r)   rˆ   z1TableGridExtractorV2B.predict.<locals>.<listcomp>ä  rB  r+   rû   )Úbboxes_pageÚgridr%  ) r   r"  r   rU   rV   ÚasarrayrX   r   rÉ   Úlinspacer  rJ   rü   Útolistr   Úargminr   r6   rÊ   rK   rœ   rø   r×   rÖ   r[   r�   rè   r   rý   Ú_post_process_gridÚbbox_idxÚtext)"r°   r·   r-   r$  r%  rE  Ú
bboxes_arrÚcx_listÚcy_listÚmax_hÚanchorsr‡   rî   Úy_normrå   ÚscoreÚmax_vÚ	anchors_vr  Úx_normÚ
filtered_hÚ
filtered_vÚfiltered_h_clsrä   Úfiltered_h_normÚfiltered_v_normÚcellsÚcellr4  r7  r.  r.   r/   r1  s"                               @@@@@@r)   ÚpredictzTableGridExtractorV2B.predict�  sè  øøøøøø€ ð, ˆ>�S ™[œ[¨AÒ-Ð-Ø×$Ò$ Y°Ñ7Ô7¸Ð;Ð;à× Ò  ¨FÑ3Ô3ˆå˜9œ?¨1Ô-Ñ.Ô.ˆÝ˜9œ?¨1Ô-Ñ.Ô.ˆØˆØˆÝ”Z ­b¬jÐ9Ñ9Ô9ˆ
åÐOÐOÀJÐOÑOÔOÑOÔOˆÝÐOÐOÀJÐOÑOÔOÑOÔOˆõ
 �t”~Ñ&Ô&ˆÝ”;˜s C¨µb´jÐAÑAÔAˆàˆÝØŒLÝ#& t¤z¡?¤?ÐOˆDŒJ×ÒÑÔÐ¸¸½cÀ$Ä,Ñ>OÔ>OÑ8Oñ
ô 
ð 	+ð 	+‰DˆAˆqð ˜‘ZˆFÝ�œ¥2¤6¨'°FÑ*:Ñ#;Ô#;Ñ<Ô<Ñ=Ô=ˆCÝ˜4œ>¨#Ô.Ñ/Ô/ˆEØ�OŠO˜Q  q˜MÑ*Ô*Ð*Ð*å˜œÑ'Ô'ˆÝ”K  S¨%µr´zÐBÑBÔBˆ	àˆØ”ð 	+ð 	+ˆAØ˜‘ZˆFÝ�œ¥2¤6¨)°fÑ*<Ñ#=Ô#=Ñ>Ô>Ñ?Ô?ˆCÝ˜4œ>¨#Ô.Ñ/Ô/ˆEØ�OŠO˜Q  q˜MÑ*Ô*Ð*Ð*àÔ"ñ 
	)Ø×/Ò/°¸'À6ÑJÔJˆHØ×/Ò/°¸'À6ÑJÔJˆHØð (¥3Ð&SÐ&SÐ&SÐ&SÈ7Ð&SÑ&SÔ&SÑ#SÔ#Sð (Ø# A B Bœ<�ð ð (¥3Ð&SÐ&SÐ&SÐ&SÈ7Ð&SÑ&SÔ&SÑ#SÔ#Sð (àð (¥3Ð&SÐ&SÐ&SÐ&SÈ7Ð&SÑ&SÔ&SÑ#SÔ#Sð (Ø# A B Bœ<�ð ð (¥3Ð&SÐ&SÐ&SÐ&SÈ7Ð&SÑ&SÔ&SÑ#SÔ#Sð (àð )¥3Ð&WÐ&WÐ&WÐ&WÐ&WÈwÐ&WÑ&WÔ&WÑ#WÔ#Wð )Ø# C R Cœ=�ð ð )¥3Ð&WÐ&WÐ&WÐ&WÐ&WÈwÐ&WÑ&WÔ&WÑ#WÔ#Wð )àð )¥3Ð&WÐ&WÐ&WÐ&WÐ&WÈwÐ&WÑ&WÔ&WÑ#WÔ#Wð )Ø# C R Cœ=�ð ð )¥3Ð&WÐ&WÐ&WÐ&WÐ&WÈwÐ&WÑ&WÔ&WÑ#WÔ#Wð )ð 5Ð4¨8Ð4Ñ4Ô4ˆ
Ø4Ð4¨8Ð4Ñ4Ô4ˆ
ÝœÐ"=Ð"=°HÐ"=Ñ"=Ô"=ÅRÄXÐNÑNÔNˆàÔ!ð 	5Ø×6Ò6°zÀ:ÑNÔNˆGØSÐS½CÀÈÑ<RÔ<RÐSÑSÔSˆHØ4Ð4¨8Ð4Ñ4Ô4ˆJåœ(Ð#CÐ#CÐ#CÐ#C¸
Ð#CÑ#CÔ#CÍ2Ì:ÐVÑVÔVˆÝœ(Ð#CÐ#CÐ#CÐ#C¸
Ð#CÑ#CÔ#CÍ2Ì:ÐVÑVÔVˆåÝ˜:Ñ&Ô&Ý˜:Ñ&Ô&Ø”nØ”nØ(Ø(Ø ØÔ*ð	
ñ 	
ô 	
ˆð ×'Ò'Ø"ØØ)ð (ñ 
ô 
ˆð ÐØð 5ð 5�Ø˜œÐ2Ð2Ò2Ð2­¨E©
¬
Ò2Ð2Ð2Ð2Ð2Ø % d¤mÔ 4�D”Iøà�Uˆ{Ðr+   rD  rE  c                óº  — |j         rKt          |j         ¦  «        d         }dgt          |j         ¦  «        z   t          |dz  |dz   ¦  «        gz   }nddg}|j        rKt          |j        ¦  «        d         }dgt          |j        ¦  «        z   t          |dz  |dz   ¦  «        gz   }nddg}dd„}g }	t	          |¦  «        D �]\  }
}t          |d         ¦  «        }t          |d         ¦  «        }t          |d         ¦  «        }t          |d         ¦  «        }||z   dz  }||z   dz  } |||¦  «        } |||¦  «        }|}|dz   }|}|dz   }|}|dk    r>||         ||dz
           z
  }|dk    r||         |z
  |z  |k    r|dz
  }|dz  }nn|dk    °>|}|t          |¦  «        dz
  k     rQ||dz            ||         z
  }|dk    r |||dz            z
  |z  |k    r|dz   }|dz  }nn|t          |¦  «        dz
  k     °Q|}|dk    r>||         ||dz
           z
  }|dk    r||         |z
  |z  |k    r|dz
  }|dz  }nn|dk    °>|}|t          |¦  «        dz
  k     rQ||dz            ||         z
  }|dk    r |||dz            z
  |z  |k    r|dz   }|dz  }nn|t          |¦  «        dz
  k     °Q|	                     t          |
||||||¬¦  «        ¦  «         �Œ|	S )Nr¹   rŠ   r   r   rw   r{   r   Úedgesr   r   r   c                óÌ   — t          t          |¦  «        dz
  ¦  «        D ]%}||         | cxk    r||dz            k     rn Œ!|c S Œ&t          dt          |¦  «        dz
  ¦  «        S )Nr   r   r   )r   r   r4   )r{   r`  r   s      r)   Úfind_cell_idxz?TableGridExtractorV2B._post_process_grid.<locals>.find_cell_idx  sy   € Ý�3˜u™:œ:¨™>Ñ*Ô*ð ð �Ø˜”8˜sÐ1Ð1Ò1Ð1 U¨1¨q©5¤\Ò1Ð1Ð1Ð1Ð1Ø�H�H�Hð 2å�q�#˜e™*œ* q™.Ñ)Ô)Ð)r+   r   r3   rÑ   )rK  Ú	row_startÚrow_endÚ	col_startÚcol_endÚrowÚcol)r{   r   r`  r   r   r   )	rJ   r   r4   rK   rm   r   r   r6   r   )r°   rD  rE  r%  Úlast_hÚ	row_edgesÚlast_vÚ	col_edgesrb  Úresultsr   r"   Úx0Úy0r>   r?   ÚcxÚcyÚbase_rowÚbase_colrc  rd  re  rf  ÚrrC   rî   rB   s                               r)   rJ  z(TableGridExtractorV2B._post_process_grid  s¬  € ð Œ<ð 	#Ý˜tœ|Ñ,Ô,¨RÔ0ˆFØ˜¥ t¤|Ñ 4Ô 4Ñ4½¸FÀQ¹JÈÐQRÉ
Ñ8SÔ8SÐ7TÑTˆIˆIà˜c˜
ˆIàŒ<ð 	#Ý˜tœ|Ñ,Ô,¨RÔ0ˆFØ˜¥ t¤|Ñ 4Ô 4Ñ4½¸FÀQ¹JÈÐQRÉ
Ñ8SÔ8SÐ7TÑTˆIˆIà˜c˜
ˆIð	*ð 	*ð 	*ð 	*ð #%ˆÝ  Ñ-Ô-ð 4	ñ 4	‰GˆAˆtÝ�t˜A”w‘”ˆBÝ�t˜A”w‘”ˆBÝ�t˜A”w‘”ˆBÝ�t˜A”w‘”ˆBØ�r‘'˜S‘ˆBØ�r‘'˜S‘ˆBà%˜ b¨)Ñ4Ô4ˆHØ%˜ b¨)Ñ4Ô4ˆHØ ˆIØ  1™ˆGØ ˆIØ  1™ˆGàˆAØ�a’%�%Ø˜a”L 9¨Q°©UÔ#3Ñ3�Ø�q’5�5˜i¨œl¨RÑ/°1Ñ4°~ÒEÐEØ ! A¡�IØ˜‘F�A�Aàð �a’%�%ð ˆAØ•c˜)‘n”n qÑ(Ò(Ð(Ø˜a !™eÔ$ y°¤|Ñ3�Ø�q’5�5˜b 9¨Q°©UÔ#3Ñ3°qÑ8¸>ÒIÐIØ !™e�GØ˜‘F�A�Aàð •c˜)‘n”n qÑ(Ò(Ð(ð ˆAØ�a’%�%Ø˜a”L 9¨Q°©UÔ#3Ñ3�Ø�q’5�5˜i¨œl¨RÑ/°1Ñ4°~ÒEÐEØ ! A¡�IØ˜‘F�A�Aàð �a’%�%ð ˆAØ•c˜)‘n”n qÑ(Ò(Ð(Ø˜a !™eÔ$ y°¤|Ñ3�Ø�q’5�5˜b 9¨Q°©UÔ#3Ñ3°qÑ8¸>ÒIÐIØ !™e�GØ˜‘F�A�Aàð •c˜)‘n”n qÑ(Ò(Ð(ð �NŠN�8Ø i¸Ø#¨WØ (ðñ ô ñ ô ð ñ ð ˆr+   )Nr•   r–   r–   r,   r   TFr—   r˜   N)r™   r   rš   r   r›   r   r0   r   r‚   r   rœ   r   r�   r   r   rž   )r·   rN   r   r1   rÿ   )rJ   r   rÎ   rN   rÏ   r   r   r   )r   r   ré   r   rê   r   r   r   rí   )r·   rN   r-   rù   r   r   )NNr#  )
r·   rN   r-   rù   r$  rù   r%  r   r   r1   )rD  rN   rE  r   r%  r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¶   rÍ   Ústaticmethodrè   rø   r"  r^  rJ  r…   r+   r)   r”   r”   <  s)  € € € € € ðð ð& Ø $Ø #Ø #Ø #ØØ#'Ø"'ØØØðB/ð B/ð B/ð B/ð B/ðP0
ð 0
ð 0
ð 0
ðl ð !$ð+ð +ð +ð +ñ „\ð+ðb ð!ð !ð !ñ „\ð!ðT #ðe
ð e
ð e
ð e
ð e
ð\ #Ø!Ø #ðlð lð lð lð lðdOð Oð Oð Oð Oð Or+   r”   )
r
   r   r   r   r   r   r   r   r   r   )r,   )
r-   r   r.   r   r/   r   r0   r   r   r1   )rM   rN   rO   rN   rP   rN   r   rN   )ri   rN   rj   r   r   rk   )rt   r   ro   rk   ri   rN   r   ru   )
r   r   ro   rk   r€   r�   r‚   r   r   r   )rx  Ú
__future__r   Úpathlibr   ÚnumpyrV   ÚonnxruntimeÚortÚGlobalConfigr   Útable_grid_typesr   r   Úcommon_utilr	   r*   rL   rh   rs   r~   r’   r”   r…   r+   r)   ú<module>r‚     sN  ððð ðB #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à Ð Ð Ð Ø Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø %Ð %Ð %Ð %Ð %Ð %ð5%ð 5%ð 5%ð 5%ðx  ð	6/ð 6/ð 6/ð 6/ð 6/ðz"ð "ð "ð "ðT!ð !ð !ð !ðH$ð $ð $ð $ðBð ð ð ðLUð Uð Uð Uð Uñ Uô Uð Uð Uð Ur+   