§
    �Wêj¢Ž  ã                  ó\	  — U d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
ZddlZddlmZmZ dd	lmZ dbd„Z	 dcddd„Zded „Z G d!„ d"¦  «        Zed#k    �rTddlZddlZddlZ ej        d$¬%¦  «        Ze                     d&d'¬(¦  «         e                     d)d*¬(¦  «         e                     d+ed,d-¬.¦  «         e                     d/ed0d1¬.¦  «         e                     d2ed3d4¬.¦  «         e                     d5edd6¬.¦  «         e                     d7ed8d9¬.¦  «         e                     d:ed;d<¬.¦  «         e                     d=d>g d?¢d@¬A¦  «         e                     dBedCdD¬.¦  «         e                     dEddF¬G¦  «         e                      ¦   «         Z! ee!j"        e!j#        e!j$        e!j%        e!j&        e!j'        e!j(        ¬H¦  «        Z) ee!j*        ¦  «        Z*e!j+        r ee!j+        ¦  «        ndZ+e+�e+ ,                    dIdI¬J¦  «         g Z-dKe.dL<   e!j/        D ]|Z0e- 1                     e2e* 3                    dMe0› �¦  «        ¦  «        ¦  «         e- 1                     e2e* 3                    dMe0 4                    ¦   «         › �¦  «        ¦  «        ¦  «         Œ} e2 e5e-¦  «        ¦  «        Z-e-s e6dNe*› �¦  «         n!e+rdOndPZ7 e6dQ e8e-¦  «        › dRe7› dS�¦  «         e-D �]ÉZ9 ej:         e;e9¦  «        ¦  «        Z<e<€ e6dTe9j=        › �¦  «         Œ2e9 >                    dU¦  «        Z?e? @                    ¦   «         rD eAe?dV¦  «        5 ZB ejC        eB¦  «        ZDddd¦  «         n# 1 swxY w Y   dW e8eD¦  «        › dX�ZEndZDdYZEe) F                    e<eD¦  «        ZGeD€*eGjH        �# e8e) I                    eGjH        ¦  «        ¦  «        neD� e8eD¦  «        ndZJ e6e9j=        › dZeE› d[eJ› d\ e8eGjK        ¦  «        › d] e8eGjL        ¦  «        › �	¦  «         e) M                    e<eGeDe!jN        ¬^¦  «        ZOe+�>e+e9jP        › d_e9jQ        › �z  ZR ejS         e;eR¦  «        eO¦  «          e6d`eR› �¦  «         �ŒŒdae9j=        › �ZT ejU        eTeO¦  «          ejV        d¦  «          ejW        eT¦  «         �ŒÉdS dS )fa   
TableGridExtractorV1A.py

Combines bbox-based candidate grid extraction (V3 algorithm) with
GridModelV1 heatmap confidence scoring.

Post-processing pipeline
------------------------
1. Accept cell bboxes (optional) -> if not provided, extract automatically
   from the GridModelV1 DB head output (db_prob map).
2. Resize input image to model input size.
3. Run GridModelV1 ONNX inference -> h_heatmap (H_out,), v_heatmap (W_out,),
   db_prob (input_h, input_w).
4. Resize heatmaps to input image size.
5. For each candidate grid line, sample mean heatmap value within a
   neighborhood band -> confidence score.
6. Remove candidate lines whose confidence is below threshold.
7. Optionally run _post_process_grid -> CellInfo with span.

bbox source priority
--------------------
- Caller-supplied bboxes  : used as-is (same behaviour as before).
- bboxes=None             : cell bboxes are extracted from the db_prob map
                            produced by the same ONNX inference pass,
                            so no extra network call is needed.
é    )Úannotations)Ú	dataclassÚfield)ÚPath)ÚOptionalNé   )ÚGridPredictionÚCellInfo)Úmake_sessionÚcandidate_boundariesÚsetÚall_cell_bboxesÚlistÚis_horizontal_coordÚboolÚmin_empty_gap_sizeÚfloatÚreturnc           	     óX  — | 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  ¦  «        ¦  «        ¦  «         �ŒBt          t          |¦  «        ¦  «        S )a;  
    Derive grid lines from candidate boundary coordinates by detecting
    empty strips between cell bboxes.

    Strips where no same-row/column cell strictly enters the interior are
    treated as grid line candidates. The midpoint of each such strip is
    registered as a grid line regardless of gap size.
    r   r   TFé   )	Úsortedr   r   ÚrangeÚlenÚabsÚaddÚintÚround)r   r   r   r   Úsorted_boundariesÚfinal_linesÚiÚcoord1Úcoord2Úgap_sizeÚis_empty_stripÚbboxÚbx1Úby1Úbx2Úby2Úsame_rowÚsame_cols                     ú›/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/pymupdf/layout/onnx/TableGridExtractorV1A.pyÚ_find_grid_lines_by_empty_spacer-   ,   s  € ð  ð Øˆ	å�tÐ$8Ñ9Ô9Ñ:Ô:ÐÝ‘%”%€Kå•3Ð(Ñ)Ô)¨AÑ-Ñ.Ô.ð %?ñ %?ˆØ" 1Ô%ˆØ" 1 q¡5Ô)ˆØ˜F‘?ˆà�aŠ<ˆ<ØàˆØ#ð 	ð 	ˆ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.

    Returns
    -------
    (candidate_h_lines, candidate_v_lines, cells_bbox_shrunk)
    All coordinates are in input image pixel space.
    r   é   r   T)r   r   F)r   r   r   ÚmaxÚminÚappendr   r-   )r0   r1   r2   r3   Ú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_gridrO   j   så  € õ ‘u”uÐÝ‘u”uÐØÐàð "ñ "ˆØ!%Ñˆˆ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.   Ú
heatmap_1dú
np.ndarrayÚpositions_pxÚband_radius_pxc           	     óÆ  — t          | ¦  «        }t          j        t          |¦  «        t          j        ¬¦  «        }t	          |¦  «        D ]”\  }}t          dt          t          |¦  «        ¦  «        |z
  ¦  «        }t          |t          t          |¦  «        ¦  «        |z   dz   ¦  «        }||k    r,t          | ||…          
                    ¦   «         ¦  «        ||<   Œ•|S )aØ  
    For each candidate line position, compute the mean heatmap value
    within [pos - band_radius, pos + band_radius].

    Parameters
    ----------
    heatmap_1d    : 1D float32 array of length N (already resized to image size)
    positions_px  : list of candidate line positions in pixel coords
    band_radius_px: half-width of the sampling band in pixels

    Returns
    -------
    np.ndarray of shape (len(positions_px),) with confidence scores in [0, 1].
    ©Údtyper   r   )r   ÚnpÚzerosÚfloat32Ú	enumerater7   r   r   r8   r   Úmean)	rP   rR   rS   ÚnÚconfidencesr    ÚposÚloÚhis	            r,   Ú_sample_heatmap_confidencera   ¨   sÃ   € õ& 	ˆJ‰Œ€AÝ”(�3˜|Ñ,Ô,µB´JÐ?Ñ?Ô?€KÝ˜LÑ)Ô)ð =ð =‰ˆˆ3Ý�•C�˜c™
œ
‘O”O nÑ4Ñ5Ô5ˆÝ�•C�˜c™
œ
‘O”O nÑ4°qÑ8Ñ9Ô9ˆØ�Š7ˆ7Ý" :¨b°¨eÔ#4×#9Ò#9Ñ#;Ô#;Ñ<Ô<ˆK˜‰NøØÐr.   c                  ó„   — e Zd ZdZ	 	 	 	 	 	 	 d2d3d„Zd4d„Zd5d„Zed6d#„¦   «         Z	 d7d8d&„Z		 	 	 d9d:d*„Z
d;d-„Z	 	 d<d=d1„ZdS )>ÚTableGridExtractorV1AaU  
    Hybrid table grid extractor:
    - Candidate grid lines derived from cell bboxes (rule-based, V3 algorithm).
    - GridModelV1 heatmap used as confidence to filter spurious candidates.
    - When bboxes are not supplied, cell bboxes are extracted automatically
      from the DB probability map produced by the same inference pass.
    ç333333Ã?ç      à?ç{®Gáz”?r/   ç333333Ó?é
   NÚ	onnx_pathú
str | PathÚh_on_thresholdr   Úv_on_thresholdÚband_radius_ratior3   Údb_prob_thresholdÚdb_min_arear   Ú	providersúlist | Noner   ÚNonec	                óÀ  — |€dg}t          |¦  «        | _        || _        || _        || _        || _        || _        || _        t          t          | j        ¦  «        |¦  «        | _
        | j
                             ¦   «         d         }	t          |	j        d         ¦  «        | _        t          |	j        d         ¦  «        | _        d„ | j
                             ¦   «         D ¦   «         }
|
                     d¦  «        | _        |
                     d¦  «        | _        d	|
v r|
                     d	¦  «        nd| _        t+          j        d
d| j        | j        ft*          j        ¬¦  «        }| j
                             dd|i¦  «        }t          || j                 j        d
         ¦  «        | _        t          || j                 j        d
         ¦  «        | _        dS )a¾  
        Parameters
        ----------
        onnx_path          : path to exported GridModelV1 .onnx file
        h_on_threshold     : minimum heatmap confidence to keep a candidate h line
        v_on_threshold     : minimum heatmap confidence to keep a candidate v line
        band_radius_ratio  : sampling band half-width as a fraction of image size
                             (e.g. 0.02 = 2% of image height/width)
        grid_margin_px     : alignment tolerance for candidate grid extraction
        db_prob_threshold  : binarization threshold applied to db_prob map when
                             extracting cell bboxes automatically (used only when
                             bboxes=None is passed to predict_grid / predict)
        db_min_area        : minimum contour area in pixels to accept as a cell bbox
                             during automatic DB extraction
        providers          : ONNX Runtime execution providers
        NÚCPUExecutionProviderr   r   r6   c                ó   — g | ]	}|j         ‘Œ
S © )Úname)Ú.0Úos     r,   ú
<listcomp>z2TableGridExtractorV1A.__init__.<locals>.<listcomp>   s   € ÐAÐAÐA 1˜œÐAÐAÐAr.   Ú	h_heatmapÚ	v_heatmapÚdb_probr   rU   Úimage)r   ri   rk   rl   rm   r3   rn   ro   r   ÚstrÚ_sessÚ
get_inputsr   ÚshapeÚ_input_hÚ_input_wÚget_outputsÚindexÚ_idx_h_heatmapÚ_idx_v_heatmapÚ_idx_db_probrW   rX   rY   ÚrunÚ_out_hÚ_out_w)Úselfri   rk   rl   rm   r3   rn   ro   rp   ÚinpÚoutput_namesÚdummyÚoutputss                r,   Ú__init__zTableGridExtractorV1A.__init__Ò   s¡  € ð6 ÐØ/Ð0ˆIå!% i¡¤ˆŒØ!/ˆÔØ!/ˆÔØ!2ˆÔØ!/ˆÔØ!2ˆÔØ!,ˆÔå!¥# d¤nÑ"5Ô"5°yÑAÔAˆŒ
àŒj×#Ò#Ñ%Ô% aÔ(ˆÝ˜CœI aœLÑ)Ô)ˆŒÝ˜CœI aœLÑ)Ô)ˆŒð BÐA¨¬
×(>Ò(>Ñ(@Ô(@ÐAÑAÔAˆØ*×0Ò0°Ñ=Ô=ˆÔØ*×0Ò0°Ñ=Ô=ˆÔØ?HÈLÐ?XÐ?X˜l×0Ò0°Ñ;Ô;Ð;Ð^bˆÔå”(˜A˜q $¤-°´Ð?ÅrÄzÐRÑRÔRˆØ”*—.’. ¨°Ð'7Ñ8Ô8ˆÝ˜' $Ô"5Ô6Ô<¸QÔ?Ñ@Ô@ˆŒÝ˜' $Ô"5Ô6Ô<¸QÔ?Ñ@Ô@ˆŒˆˆr.   Ú	image_bgrrQ   r4   c                ó*  — ddl }|j        dd…         \  }} |j        || j        | j        f¦  «        }|dd…dd…ddd…f                              t          j        ¦  «        }|                     ¦   «         | 	                    ¦   «         }}||k    r||z
  ||z
  z  }nt          j
        |¦  «        }|                     ddd¦  «        t          j                 }	| j                             dd|	i¦  «        }
|
| j                 d         }|
| j                 d         } |j        |t          j        dd…f                              t          j        ¦  «        |df|j        ¬¦  «        d         } |j        |t          j        dd…f                              t          j        ¦  «        |df|j        ¬¦  «        d         }d}| j        �J|
| j                 d         } |j        |                     t          j        ¦  «        ||f|j        ¬¦  «        }|||fS )	aº  
        Run GridModelV1 inference and return heatmaps and db_prob map,
        all resized to the original image dimensions.

        Returns
        -------
        (h_heatmap, v_heatmap, db_prob_map)
        h_heatmap   : (orig_h,)          float32
        v_heatmap   : (orig_w,)          float32
        db_prob_map : (orig_h, orig_w)   float32, or None if the ONNX model
                      does not export the db_prob output
        r   Nr   éÿÿÿÿr   r~   ©Úinterpolation)r   r   )Úcv2r‚   Úresizer„   rƒ   ÚastyperW   rY   r8   r7   Ú
zeros_likeÚ	transposeÚnewaxisr€   rŠ   r‡   rˆ   ÚINTER_LINEARr‰   )r�   r“   r˜   r1   r2   Úimg_resizedÚimg_rgbÚmnÚmxrŽ   r‘   Úh_rawÚv_rawr{   r|   Údb_prob_mapÚdb_raws                    r,   Ú_run_inferencez$TableGridExtractorV1A._run_inference  s  € ð 	ˆ
ˆ
ˆ
à"œ¨¨!¨Ô,‰ˆ�à �c”j ¨T¬]¸D¼MÐ,JÑKÔKˆØ˜a˜a˜a    D D b D˜jÔ)×0Ò0µ´Ñ<Ô<ˆØ—’‘” §¢¡¤ˆBˆØ�Š7ˆ7Ø ‘|¨¨R©Ñ0ˆGˆGå”m GÑ,Ô,ˆGØ×Ò  1 aÑ(Ô(­¬Ô4ˆà”*—.’. ¨° ~Ñ6Ô6ˆà˜Ô+Ô,¨QÔ/ˆØ˜Ô+Ô,¨QÔ/ˆð �C”JØ•"”*˜a˜a˜a�-Ô ×'Ò'­¬
Ñ3Ô3Ø�QˆKØÔ*ð
ñ 
ô 
ð ô	ˆ	ð
 �C”JØ•"”*˜a˜a˜a�-Ô ×'Ò'­¬
Ñ3Ô3Ø�QˆKØÔ*ð
ñ 
ô 
ð ô	ˆ	ð *.ˆØÔÐ(Ø˜TÔ.Ô/°Ô5ˆFØ$˜#œ*Ø—’�bœjÑ)Ô)Ø˜Ð Ø!Ô.ðñ ô ˆKð ˜) [Ð0Ð0r.   r¥   r   c                óP  — ddl }|| j        k                         t          j        ¦  «        dz  } |j        ||j        |j        ¦  «        \  }}g }|D ]R} |j        |¦  «        }|| j	        k     rŒ |j
        |¦  «        \  }	}
}}|                     |	|
|	|z   |
|z   g¦  «         ŒS|S )a  
        Extract cell bounding boxes from a DB probability map.

        Steps
        -----
        1. Binarize the map with db_prob_threshold.
        2. Find external contours in the binary mask.
        3. Convert each contour whose area >= db_min_area to an
           axis-aligned bounding box [x1, y1, x2, y2].

        Parameters
        ----------
        db_prob_map : (H, W) float32 array with values in [0, 1]

        Returns
        -------
        List of [x1, y1, x2, y2] bounding boxes in pixel coordinates.
        r   Néÿ   )r˜   rn   rš   rW   Úuint8ÚfindContoursÚRETR_EXTERNALÚCHAIN_APPROX_SIMPLEÚcontourArearo   ÚboundingRectr9   )r�   r¥   r˜   ÚbinaryÚcontoursÚ_r0   ÚcontourÚareaÚxÚyrE   rF   s                r,   Ú_extract_bboxes_from_dbz-TableGridExtractorV1A._extract_bboxes_from_dbI  sÑ   € ð, 	ˆ
ˆ
ˆ
à Ô!7Ò7×?Ò?ÅÄÑIÔIÈCÑOˆØ&�cÔ&Ø�CÔ% sÔ'>ñ
ô 
‰ˆ�!ð ˆØð 	0ð 	0ˆGØ"�3”? 7Ñ+Ô+ˆDØ�dÔ&Ò&Ð&ØØ)˜Ô)¨'Ñ2Ô2‰JˆAˆq�!�QØ�MŠM˜1˜a  Q¡¨¨A©Ð.Ñ/Ô/Ð/Ð/Øˆr.   Úlinesúlist[float]ÚcentersÚ
image_sizec                ó˜  ‡‡— | s| S t          | ¦  «        }d}|�r/d}|s�n)dg|z   t          |¦  «        gz   Št          ‰¦  «        dz
  }ˆˆfd„t          |¦  «        D ¦   «         }|d         r|d         dk    rd|d<   d}Œj|d         r|r|                     ¦   «          d}Œ‹g }d}t          t          |¦  «        ¦  «        D ]t}	|rd}Œ||	dz            }
|
rE|	dz   t          |¦  «        k     r/|                     ||	         ||	dz            z   dz  ¦  «         d}d}ŒY|                     ||	         ¦  «         Œut          |¦  «        }|�°/|S )	a†  
        Remove adjacent line pairs that have no bbox center between them,
        and handle empty outer gaps:

        - If the gap between 0 and the first line contains no bbox center,
          the first line is moved to 0.0 (collapsed to the image edge).
        - If the gap between the last line and image_size contains no bbox
          center, the last line is removed entirely.
        - For inner lines: when two adjacent lines share an empty gap between
          them, they are replaced by their midpoint.

        The process repeats until stable.

        Parameters
        ----------
        lines      : sorted list of boundary coordinates
        centers    : list of bbox center coordinates (along same axis)
        image_size : image dimension along this axis (H or W)

        Returns
        -------
        Filtered and possibly merged list of boundary lines (sorted).
        TFç        r   c                óL   •‡— g | ]Št          ˆˆfd „‰D ¦   «         ¦  «         ‘Œ S )c              3  óV   •K  — | ]#}‰‰         |cxk     o‰‰d z            k     nc V — Œ$dS )r   Nrv   )rx   ÚcÚedgesr    s     €€r,   ú	<genexpr>zGTableGridExtractorV1A._filter_empty_lines.<locals>.<listcomp>.<genexpr>�  sK   øè è € ÐEÐE¸˜˜aœ 1Ð3Ð3Ò3Ð3 u¨Q°©U¤|Ò3Ð3Ð3Ð3ÐEÐEÐEÐEÐEÐEr.   )Úany)rx   r    rº   rÁ   s    @€€r,   rz   z=TableGridExtractorV1A._filter_empty_lines.<locals>.<listcomp>œ  sM   øø€ ð ð ð àõ ÐEÐEÐEÐEÐE¸WÐEÑEÔEÑEÔEÐEðð ð r.   r   r•   ç       @)r   r   r   r   Úpopr9   )r¸   rº   r»   ÚcurrentÚchangedÚn_gapsÚ	gap_emptyÚmergedÚ	skip_nextr    Úgap_right_emptyrÁ   s    `         @r,   Ú_filter_empty_linesz)TableGridExtractorV1A._filter_empty_linesr  s½  øø€ ð: ð 	ØˆLå˜‘-”-ˆØˆàñ &	%ØˆGØð ÙØ�U˜W‘_­¨jÑ(9Ô(9Ð':Ñ:ˆEÝ˜‘Z”Z !‘^ˆFðð ð ð ð å˜v™œðñ ô ˆIð ˜Œ|ð  ¨¤
¨cÒ 1Ð 1Ø �˜‘
Ø�Øð ˜Œ}ð  ð Ø—’‘”�Ø�Øð #%ˆFØˆIÝ�3˜w™<œ<Ñ(Ô(ð 
.ð 
.�Øð Ø %�IØØ"+¨A°©EÔ"2�Ø"ð . q¨1¡u­s°7©|¬|Ò';Ð';Ø—M’M 7¨1¤:°¸¸A¹´Ñ#>À#Ñ"EÑFÔFÐFØ $�IØ $�G�Gà—M’M '¨!¤*Ñ-Ô-Ð-Ð-Ý˜V‘n”nˆGðM ñ &	%ðP ˆr.   r0   r	   c           	     ó¼  ‡ — |j         dd…         \  }}‰                      |¦  «        \  }}}|€&|€t          d¦  «        ‚‰                      |¦  «        }t	          |||‰ j        ¦  «        \  }}	}
t          dt          t          |‰ j	        z  ¦  «        ¦  «        ¦  «        }t          dt          t          |‰ j	        z  ¦  «        ¦  «        ¦  «        }t          |||¦  «        }t          ||	|¦  «        }ˆ fd„t          ||¦  «        D ¦   «         }ˆ fd„t          |	|¦  «        D ¦   «         }t          t          |¦  «        t          |¦  «        |||||¬¦  «        S )aŒ  
        Derive candidate grid lines from bboxes and filter by heatmap confidence.

        Parameters
        ----------
        image_bgr : cropped table BGR image (any size)
        bboxes    : list of [x1, y1, x2, y2] cell bbox pixel coordinates.
                    When None, bboxes are extracted automatically from the
                    db_prob map produced by the same inference pass.

        Returns
        -------
        GridPrediction with filtered h/v lines and per-line confidence scores.
        GridPrediction.db_prob_map is populated when DB auto-extraction is used
        or when the ONNX model exports a db_prob output.
        Nr   zcbboxes=None requires the ONNX model to export 'db_prob', but it was not found in the model outputs.r   c                ó0   •— g | ]\  }}|‰j         k    ¯|‘ŒS rv   )rk   )rx   r¶   rÀ   r�   s      €r,   rz   z6TableGridExtractorV1A.predict_grid.<locals>.<listcomp>ï  ó*   ø€ ÐQÐQÐQ™˜˜A¸¸TÔ=PÒ8PÐ8P�1Ð8PÐ8PÐ8Pr.   c                ó0   •— g | ]\  }}|‰j         k    ¯|‘ŒS rv   )rl   )rx   rµ   rÀ   r�   s      €r,   rz   z6TableGridExtractorV1A.predict_grid.<locals>.<listcomp>ð  rÐ   r.   ©rM   rN   r{   r|   Úh_confidencesÚv_confidencesr¥   )r‚   r§   ÚRuntimeErrorr·   rO   r3   r7   r   r   rm   ra   Úzipr	   r   )r�   r“   r0   r1   r2   r{   r|   r¥   Úcand_hÚcand_vr²   Úh_bandÚv_bandÚh_confÚv_confrM   rN   s   `                r,   Úpredict_gridz"TableGridExtractorV1A.predict_grid¿  s†  ø€ ð* #œ¨¨!¨Ô,‰ˆ�ð -1×,?Ò,?À	Ñ,JÔ,JÑ)ˆ	�9˜kð ˆ>ØÐ"Ý"ðAñô ð ð ×1Ò1°+Ñ>Ô>ˆFõ 3Ø�F˜F DÔ$7ñ
ô 
Ñˆ�˜õ
 �Q��E &¨4Ô+AÑ"AÑBÔBÑCÔCÑDÔDˆÝ�Q��E &¨4Ô+AÑ"AÑBÔBÑCÔCÑDÔDˆå+¨I°v¸vÑFÔFˆÝ+¨I°v¸vÑFÔFˆð RÐQÐQÐQ¥ V¨VÑ!4Ô!4ÐQÑQÔQˆØQÐQÐQÐQ¥ V¨VÑ!4Ô!4ÐQÑQÔQˆåÝ˜7‘O”OÝ˜7‘O”OØØØ Ø Ø#ð
ñ 
ô 
ð 	
r.   çš™™™™™¹?ÚtextsÚspan_thresholdc                ó
  — t          |t          t          j        f¦  «        rÎt	          |¦  «        dk    r»|j        dd…         \  }}|                      |¦  «        \  }}}t          g g t          j        |t          j	        ¬¦  «        t          j        |t          j	        ¬¦  «        t          j
        g t          j	        ¬¦  «        t          j
        g t          j	        ¬¦  «        |¬¦  «        g fS |                      ||¦  «        }	|€$|	j        �|                      |	j        ¦  «        ng }
nt          |¦  «        }
|
s|	g fS t          |j        d         ¦  «        }t          |j        d         ¦  «        }t          d„ |
D ¦   «         ¦  «        }t          d„ |
D ¦   «         ¦  «        }|                      |	j        ||¦  «        }|                      |	j        ||¦  «        }t          |||	j        |	j        |	j        |	j        |	j        ¬¦  «        }	t          j        |
t          j	        ¬¦  «        }|                      ||	|¬	¦  «        }|�9|D ]6}d|j        cxk    rt	          |¦  «        k     rn Œ$||j                 |_        Œ7|	|fS )
a†  
        Predict grid and assign bboxes to grid cells.

        Parameters
        ----------
        image_bgr      : cropped table BGR image
        bboxes         : list of [x1, y1, x2, y2] in crop space, or None to
                         extract bboxes automatically from the DB output.
                         An empty list bypasses both DB extraction and
                         post-processing (returns empty CellInfo list).
        texts          : text strings aligned with bboxes
        span_threshold : fractional overlap to trigger span expansion

        Returns
        -------
        (GridPrediction, list[CellInfo])
        r   Nr   rU   rÒ   r   c              3  ór   K  — | ]2}t          |d          ¦  «        t          |d         ¦  «        z   dz  V — Œ3dS )r   r   rÄ   N©r   ©rx   Úbs     r,   rÂ   z0TableGridExtractorV1A.predict.<locals>.<genexpr>4  ó@   è è € ÐUÐU¸q�%  !¤™+œ+­¨a°¬d©¬Ñ3°sÑ:ÐUÐUÐUÐUÐUÐUr.   c              3  ór   K  — | ]2}t          |d          ¦  «        t          |d         ¦  «        z   dz  V — Œ3dS )r   r6   rÄ   Nrã   rä   s     r,   rÂ   z0TableGridExtractorV1A.predict.<locals>.<genexpr>5  ræ   r.   )Úbboxes_pageÚgridrà   )Ú
isinstancer   rW   Úndarrayr   r‚   r§   r	   rX   rY   ÚarrayrÝ   r¥   r·   r   r   rÍ   rM   rN   r{   r|   rÓ   rÔ   ÚasarrayÚ_post_process_gridÚbbox_idxÚtext)r�   r“   r0   rß   rà   r1   r2   r²   r¥   ré   Úeffective_bboxesÚcrop_hÚcrop_wÚcx_listÚcy_listÚ
filtered_hÚ
filtered_vÚ
bboxes_arrÚcellsÚcells                       r,   ÚpredictzTableGridExtractorV1A.predictü  s¡  € õ2 �f�t¥R¤ZÐ0Ñ1Ô1ð 	µc¸&±k´kÀQÒ6FÐ6FØ&œ_¨R¨a¨RÔ0‰NˆF�FØ $× 3Ò 3°IÑ >Ô >ÑˆAˆq�+Ý!ØØÝœ( 6µ´Ð<Ñ<Ô<Ýœ( 6µ´Ð<Ñ<Ô<Ý œh rµ´Ð<Ñ<Ô<Ý œh rµ´Ð<Ñ<Ô<Ø'ðñ ô ð ðð ð × Ò  ¨FÑ3Ô3ˆð
 ˆ>àÔ#Ð/ð  $×;Ò;¸DÔ<LÑMÔMÐMØ57ð Ðõ  $ F™|œ|Ðàð 	Ø˜�8ˆOõ �y” qÔ)Ñ*Ô*ˆÝ�y” qÔ)Ñ*Ô*ˆÝÐUÐUÐDTÐUÑUÔUÑUÔUˆÝÐUÐUÐDTÐUÑUÔUÑUÔUˆà×-Ò-¨d¬l¸GÀVÑLÔLˆ
Ø×-Ò-¨d¬l¸GÀVÑLÔLˆ
åØØØ”nØ”nØÔ,ØÔ,ØÔ(ð
ñ 
ô 
ˆõ ”ZÐ 0½¼
ÐCÑCÔCˆ
Ø×'Ò'Ø"ØØ)ð (ñ 
ô 
ˆð ÐØð 5ð 5�Ø˜œÐ2Ð2Ò2Ð2­¨E©
¬
Ò2Ð2Ð2Ð2Ð2Ø % d¤mÔ 4�D”Iøà�Uˆ{Ðr.   rè   ré   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„ }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   g      ð?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   r7   )r^   rÁ   r    s      r,   Úfind_cell_idxz?TableGridExtractorV1A._post_process_grid.<locals>.find_cell_idxh  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   r6   rÄ   )rï   Ú	row_startÚrow_endÚ	col_startÚcol_endÚrowÚcol)	rM   r   r7   rN   rZ   r   r   r9   r
   )r�   rè   ré   rà   Úlast_hÚ	row_edgesÚlast_vÚ	col_edgesrþ   Úresultsr    r%   Úx0Úy0rA   rB   ÚcxÚcyÚbase_rowÚbase_colrÿ   r   r  r  ÚrrF   rÀ   rE   s                               r,   rî   z(TableGridExtractorV1A._post_process_gridV  s¡  € ð Œ<ð 	#Ý˜DœLÑ)Ô)¨"Ô-ˆFØ˜¥ t¤|Ñ 4Ô 4Ñ4½¸FÀQ¹JÈÐQRÉ
Ñ8SÔ8SÐ7TÑTˆIˆIà˜c˜
ˆIàŒ<ð 	#Ý˜DœLÑ)Ô)¨"Ô-ˆFØ˜¥ t¤|Ñ 4Ô 4Ñ4½¸FÀQ¹JÈÐQRÉ
Ñ8SÔ8SÐ7TÑTˆIˆIà˜c˜
ˆIð	*ð 	*ð 	*ð ˆÝ  Ñ-Ô-ð .	ñ .	‰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à$�} R¨Ñ3Ô3ˆHØ$�} R¨Ñ3Ô3ˆHØ!)¨8°a©<�wˆIØ!)¨8°a©<�wˆIàˆAØ�a’%�%Ø˜a”L 9¨Q°©UÔ#3Ñ3�Ø�q’5�5˜i¨œl¨RÑ/°1Ñ4°~ÒEÐEØ ! A¡�I q¨A¡v q qàð �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 Q¨!¡V Q Qàð •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 q¨A¡v q qàð �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 Q¨!¡V Q Qàð •c˜)‘n”n qÑ(Ò(Ð(ð �NŠN�8Ø i¸Ø#¨WØ (ðñ ô ñ ô ð ñ ð ˆr.   éè  ÚpredÚmax_dimc                óþ  — ddl }|j        dd…         \  }}|�t          |¦  «        }n$|j        �|                      |j        ¦  «        }ng }t          |||| j        ¦  «        \  }	}
}t          dt          t          || j
        z  ¦  «        ¦  «        ¦  «        }t          dt          t          || j
        z  ¦  «        ¦  «        ¦  «        }t          |j        |	|¦  «        }t          |j        |
|¦  «        }t          |j        ¦  «        }t          |j        ¦  «        }|                     ¦   «         }|D ]+}d„ |D ¦   «         \  }}}} |j        |||f||fdd¦  «         Œ,t'          |	|¦  «        D ]¶\  }}t          t          |¦  «        ¦  «        }||v rI |j        |d|f||fdd¦  «          |j        ||d›dt          |dz
  d	¦  «        f|j        d
dd¦  «         Œn |j        |d|f||fdd¦  «          |j        ||d›dt          |dz
  d	¦  «        f|j        d
dd¦  «         Œ·t'          |
|¦  «        D ]V\  }}t          t          |¦  «        ¦  «        }||v r |j        ||df||fdd¦  «         Œ> |j        ||df||fdd¦  «         ŒWt/          j        |j        dd…t.          j        f         d|f¦  «        } |j        |dz                       dd¦  «                             t.          j        ¦  «        |j        ¦  «        }|	D ]>}t          t          |¦  «        ¦  «        }||v rdnd} |j        |d|f||f|d¦  «         Œ? |j        |d| j        d›�d|j        ddd¦  «         t/          j        |j        t.          j        dd…f         |df¦  «        }  |j        | dz                       dd¦  «                             t.          j        ¦  «        |j        ¦  «        }!|
D ]>}t          t          |¦  «        ¦  «        }||v rdnd} |j        |!|df||f|d¦  «         Œ? |j        |!d| j         d›�d|j        ddd¦  «         |j        �Ï |j        |j        dz                       dd¦  «                             t.          j        ¦  «        |j        ¦  «        }" |j!        |"||f|j"        ¬¦  «        }"|D ]+}d„ |D ¦   «         \  }}}} |j        |"||f||fdd¦  «         Œ, |j        |"d| j#        d›dtI          |¦  «        › �d|j        ddd¦  «         |"}#�n�t/          j%        ||dft.          j        ¬¦  «        }$d„ t'          |	|¦  «        D ¦   «         d„ t'          |
|¦  «        D ¦   «         z   }%tI          |%¦  «        }&|&dk    r÷t          d||&z  ¦  «        }'tM          |%¦  «        D ]d\  }(\  })}*}+|(|'z  },|,|'z   dz
  }-t          |*|dz
  z  ¦  «        }.|+rdnd}|+r| j        n| j         }/|*|/k     rd} |j        |$|,||.z
  f|-|f|d¦  «         Œe|t          | j        |dz
  z  ¦  «        z
  }0|t          | j         |dz
  z  ¦  «        z
  }1 |j        |$d|0f|dz  |0fdd¦  «          |j        |$|dz  |1f||1fdd¦  «          |j        |$d d|j        d!d"d¦  «         |$}#t/          j'        ||gd¬#¦  «        }2t/          j'        |!|#gd¬#¦  «        }3t/          j'        |2|3gd¬#¦  «        }4|4j        dd…         \  }5}6|5|k    s	|6|dz  k    rotQ          ||5z  |dz  |6z  ¦  «        }7 |j!        |4t          dt          |6|7z  ¦  «        ¦  «        t          dt          |5|7z  ¦  «        ¦  «        f|j)        ¬¦  «        }4|4S )$a·  
        Visualize candidate lines (all) vs filtered lines, and heatmaps.

        Layout (2x2)
        ------------
        (1,1) image + filtered grid lines (green h, orange v)
              + rejected candidates (red) + bbox rectangles (cyan)
        (1,2) h_heatmap tiled to 2D with candidate h line positions marked
        (2,1) v_heatmap tiled to 2D with candidate v line positions marked
        (2,2) db_prob_map as a heatmap when available; otherwise a
              confidence bar chart per candidate line

        Parameters
        ----------
        image_bgr : original BGR image
        pred      : GridPrediction from predict_grid() or predict()
        bboxes    : bbox list used for candidate extraction (for overlay).
                    When None, bboxes stored in pred.db_prob_map are used
                    to recompute candidates for the overlay.
        max_dim   : maximum single-panel dimension before downscaling
        r   Nr   r   c                óF   — g | ]}t          t          |¦  «        ¦  «        ‘ŒS rv   ©r   r   ©rx   Úvs     r,   rz   z3TableGridExtractorV1A.visualize.<locals>.<listcomp>Ý  s$   € Ð:Ð:Ð:°�c¥%¨¡(¤(™mœmÐ:Ð:Ð:r.   )r©   r©   r   )r   r©   r   z.2fé   gìQ¸…ëÑ?)r   r   r©   )r©   é€   r   r©   zh_thr=)é   é   gffffffÖ?)r©   r©   r©   zv_thr=r–   c                óF   — g | ]}t          t          |¦  «        ¦  «        ‘ŒS rv   r  r  s     r,   rz   z3TableGridExtractorV1A.visualize.<locals>.<listcomp>  s$   € Ð!>Ð!>Ð!>°A¥#¥e¨A¡h¤h¡-¤-Ð!>Ð!>Ð!>r.   zdb_thr=z  n=r6   rU   c                ó   — g | ]
\  }}||d f‘ŒS )Trv   )rx   r¶   rÀ   s      r,   rz   z3TableGridExtractorV1A.visualize.<locals>.<listcomp>  s"   € Ð?Ð?Ð?¡4 1 a�!�Q˜�Ð?Ð?Ð?r.   c                ó   — g | ]
\  }}||d f‘ŒS )Frv   )rx   rµ   rÀ   s      r,   rz   z3TableGridExtractorV1A.visualize.<locals>.<listcomp>  s"   € Ð?Ð?Ð?¡4 1 a�!�Q˜�Ð?Ð?Ð?r.   é   )r   éÈ   r   )r!  éd   r   )r   r   é´   r•   z%Conf: green=h  orange=v  red=rejectedrg   )r!  r!  r!  )Úaxis)*r˜   r‚   r   r¥   r·   rO   r3   r7   r   r   rm   ra   r{   r|   r   rM   rN   ÚcopyÚ	rectanglerÖ   ÚlineÚputTextÚFONT_HERSHEY_SIMPLEXrW   Útiler�   ÚapplyColorMapÚcliprš   rª   ÚCOLORMAP_JETrk   rl   r™   rž   rn   r   rX   rZ   Úconcatenater8   Ú
INTER_AREA)8r�   r“   r  r0   r  r˜   r1   r2   Ú
vis_bboxesr×   rØ   r²   rÙ   rÚ   rÛ   rÜ   Úkept_hÚkept_vÚoverlayr%   rA   rB   rC   rD   r¶   rÀ   Úyprµ   ÚxpÚh_2dÚh_panelÚcolorÚv_2dÚv_panelÚdb_panelÚbottom_rightÚ	bar_panelÚ	all_linesr\   Úbar_wÚidxr^   ÚconfÚis_hr&   r(   Úbar_h_pxÚthrÚthr_h_yÚthr_v_yÚtop_rowÚbot_rowÚcomposedÚchÚcwÚscales8                                                           r,   Ú	visualizezTableGridExtractorV1A.visualize¥  sô  € ð8 	ˆ
ˆ
ˆ
à"œ¨¨!¨Ô,‰ˆ�ð ÐÝ˜f™œˆJˆJØÔÐ)Ø×5Ò5°dÔ6FÑGÔGˆJˆJàˆJõ 3Ø˜ ¨Ô(;ñ
ô 
Ñˆ�˜õ �Q��E &¨4Ô+AÑ"AÑBÔBÑCÔCÑDÔDˆÝ�Q��E &¨4Ô+AÑ"AÑBÔBÑCÔCÑDÔDˆÝ+¨D¬N¸FÀFÑKÔKˆÝ+¨D¬N¸FÀFÑKÔKˆå�T”\Ñ"Ô"ˆÝ�T”\Ñ"Ô"ˆð —.’.Ñ"Ô"ˆØð 	Ið 	IˆDØ:Ð:°TÐ:Ñ:Ô:‰NˆB��B˜ØˆCŒM˜' B¨ 8¨b°"¨X°}ÀaÑHÔHÐHÐHÝ˜ Ñ'Ô'ð 		Lð 		L‰DˆAˆqÝ•U˜1‘X”X‘”ˆBØ�Fˆ{ˆ{Ø�”˜ 1 b '¨F°B¨<¸ÀaÑHÔHÐHØ�”˜G¨ Z Z°!µS¸¸a¹À±^´^Ð1DØÔ4°d¸KÈñLô Lð Lð Lð �”˜ 1 b '¨F°B¨<¸ÀaÑHÔHÐHØ�”˜G¨ Z Z°!µS¸¸a¹À±^´^Ð1DØÔ4°d¸KÈñLô Lð Lð Lå˜ Ñ'Ô'ð 	Ið 	I‰DˆAˆqÝ•U˜1‘X”X‘”ˆBØ�Fˆ{ˆ{Ø�”˜ 2 q '¨B°¨<¸ÈÑJÔJÐJÐJà�”˜ 2 q '¨B°¨<¸ÀaÑHÔHÐHÐHõ Œw�t”~ a a a­¬ mÔ4°q¸&°kÑBÔBˆØ#�#Ô#Ø�C‰Z×Ò˜a Ñ%Ô%×,Ò,­R¬XÑ6Ô6¸Ô8Hñ
ô 
ˆð ð 	?ð 	?ˆAÝ•U˜1‘X”X‘”ˆBØ#$¨ ; ;�K�K°KˆEØˆCŒH�W˜q "˜g¨° |°U¸AÑ>Ô>Ð>Ð>ØˆŒ�GÐ? dÔ&9Ð?Ð?Ð?Ø˜SÔ5°t¸_Èañ	Qô 	Qð 	Qõ Œw�t”~¥b¤j°!°!°! mÔ4°v¸q°kÑBÔBˆØ#�#Ô#Ø�C‰Z×Ò˜a Ñ%Ô%×,Ò,­R¬XÑ6Ô6¸Ô8Hñ
ô 
ˆð ð 	?ð 	?ˆAÝ•U˜1‘X”X‘”ˆBØ#$¨ ; ;�K�K°KˆEØˆCŒH�W˜r 1˜g¨¨F |°U¸AÑ>Ô>Ð>Ð>ØˆŒ�GÐ? dÔ&9Ð?Ð?Ð?Ø˜SÔ5°t¸_Èañ	Qô 	Qð 	Qð ÔÐ'Ø(�sÔ(ØÔ! CÑ'×-Ò-¨a°Ñ5Ô5×<Ò<½R¼XÑFÔFØÔ ñô ˆHð "�s”z (¨V°VÐ,<ÈCÔL\Ð]Ñ]Ô]ˆHà"ð Pð P�Ø!>Ð!>¸Ð!>Ñ!>Ô!>‘��B˜˜BØ�”˜h¨¨R¨°2°r°(¸OÈQÑOÔOÐOÐOØˆCŒK˜Ð"]¨DÔ,BÐ"]Ð"]Ð"]ÍCÐPZÉOÌOÐ"]Ð"]Ø Ô!9¸4ÀÐRSñUô Uð Uà#ˆL‰Låœ &¨&°!Ð!4½B¼HÐEÑEÔEˆIà?Ð?­3¨v°vÑ+>Ô+>Ð?Ñ?Ô?Ø?Ð?­3¨v°vÑ+>Ô+>Ð?Ñ?Ô?ñ@ð õ �I‘”ˆAØ�1ŠuˆuÝ˜A˜v¨™{Ñ+Ô+�Ý.7¸	Ñ.BÔ.Bð 
.ð 
.Ñ*�CÑ*˜#˜t TØ ™+�CØ ™+¨™/�CÝ" 4¨6°B©;Ñ#7Ñ8Ô8�HØ+/ÐB˜K˜K°]�EØ15ÐN˜$Ô-Ð-¸4Ô;N�CØ˜c’z�zØ +˜Ø!�C”M )Ø$'¨°(Ñ):Ð#;¸cÀ6¸]Ø#(¨"ñ.ô .ð .ð .ð !¥3 tÔ':¸fÀr¹kÑ'JÑ#KÔ#KÑK�Ø ¥3 tÔ':¸fÀr¹kÑ'JÑ#KÔ#KÑK�Ø�”˜ Q¨ L°6¸Q±;ÀÐ2HÈ+ÐWXÑYÔYÐYØ�”˜ V¨q¡[°'Ð$:¸VÀWÐ<MÈ}Ð^_Ñ`Ô`Ð`ØˆCŒK˜	Ð#JØ Ô!9¸3ÀÐQRñTô Tð Tà$ˆLõ ”. '¨GÐ!4¸qÐAÑAÔAˆÝ”. '¨LÐ!9ÀÐBÑBÔBˆÝ”> 7¨GÐ"4ÀÐBÑBÔBˆà”   Ô#‰ˆˆBØ�Š<ˆ<˜2 ¨!¡Ò+Ð+Ý˜7 R™<¨°1©°rÑ)9Ñ:Ô:ˆEØ!�s”zØÝ�Q�˜B ™J™œÑ(Ô(­#¨aµ°R¸%±Z±´Ñ*AÔ*AÐBØ!œnðñ ô ˆHð ˆr.   )rd   re   rf   r/   rg   rh   N)ri   rj   rk   r   rl   r   rm   r   r3   r   rn   r   ro   r   rp   rq   r   rr   )r“   rQ   r   r4   )r¥   rQ   r   r   )r¸   r¹   rº   r¹   r»   r   r   r¹   )N)r“   rQ   r0   rq   r   r	   )NNrÞ   )
r“   rQ   r0   rq   rß   rq   rà   r   r   r4   )rè   rQ   ré   r	   rà   r   r   r   )Nr  )
r“   rQ   r  r	   r0   rq   r  r   r   rQ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r’   r§   r·   ÚstaticmethodrÍ   rÝ   rû   rî   rM  rv   r.   r,   rc   rc   É   s-  € € € € € ðð ð !%Ø #Ø#'Ø #Ø#&ØØ!%ð6Að 6Að 6Að 6Að 6Aðx51ð 51ð 51ð 51ðv#ð #ð #ð #ðR ðJð Jð Jñ „\ðJð^ #ð;
ð ;
ð ;
ð ;
ð ;
ð@ #Ø!Ø #ðTð Tð Tð Tð TðtIð Ið Ið Iðf #Øð[ð [ð [ð [ð [ð [ð [r.   rc   Ú__main__a!  Run TableGridExtractorV1A on all images in a directory. When a JSON sidecar (<image_stem>.json) exists next to the image, the bboxes stored in it are used directly. When no sidecar is found, bboxes are extracted automatically from the DB probability map output of the model (DB auto mode).)Údescriptionri   z-Path to the exported GridModelV1 .onnx model.)ÚhelpÚ	image_dirz"Directory containing input images.z--h_on_thresholdg      Ð?z9Heatmap confidence threshold for h lines (default: 0.25).)ÚtypeÚdefaultrU  z--v_on_thresholdgš™™™™™É?z8Heatmap confidence threshold for v lines (default: 0.2).z--band_radius_ratiorf   zESampling band half-width as a fraction of image size (default: 0.02).z--grid_margin_pxzGAlignment tolerance for candidate grid extraction in px (default: 5.0).z--db_prob_thresholdrg   zBDB binarization threshold for auto bbox extraction (default: 0.3).z--db_min_arearh   z@Minimum contour area in px for DB bbox extraction (default: 10).z--extensionsÚ*)ÚpngÚjpgÚjpegÚbmpÚtifÚtiffzImage file extensions to scan.)ÚnargsrX  rU  z	--max_dimix  z=Maximum dimension of the visualization panel (default: 1400).z
--save_dirzJIf set, save visualization images to this directory instead of displaying.)rX  rU  )ri   rk   rl   rm   r3   rn   ro   T)ÚparentsÚexist_okz
list[Path]Ú	img_pathsz*.zNo images found in: Úsavingz%displaying (press any key to advance)zFound z image(s). Mode: ú.zCannot read: z.jsonr  z	sidecar (z boxes)zDB autoz	  source=z	  bboxes=z
  h_lines=z
  v_lines=)r0   r  Ú_v1a_visz  Saved -> zTableGridExtractorV1A - )
r   r   r   r   r   r   r   r   r   r   )r/   )
r0   r   r1   r   r2   r   r3   r   r   r4   )rP   rQ   rR   r   rS   r   r   rQ   )XrQ  Ú
__future__r   Údataclassesr   r   Úpathlibr   Útypingr   ÚnumpyrW   ÚonnxruntimeÚortÚtable_grid_typesr	   r
   Úcommon_utilr   r-   rO   ra   rc   rN  ÚargparseÚjsonr˜   ÚArgumentParserÚparserÚadd_argumentr   r   Ú
parse_argsÚargsri   rk   rl   rm   r3   rn   ro   Ú	extractorrV  Úsave_dirÚmkdirrc  Ú__annotations__Ú
extensionsÚextÚextendr   ÚglobÚupperr   ÚprintÚmoder   Úimg_pathÚimreadr   Úimg_bgrrw   Úwith_suffixÚ	json_pathÚexistsÚopenÚfÚloadr0   Úbbox_sourcerÝ   r  r¥   r·   Ún_dbrM   rN   rM  r  rI  ÚstemÚsuffixÚout_pathÚimwriteÚwindow_titleÚimshowÚwaitKeyÚdestroyWindowrv   r.   r,   ú<module>r•     sr  ððð ð ð6 #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø Ð Ð Ð à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø %Ð %Ð %Ð %Ð %Ð %ð;%ð ;%ð ;%ð ;%ðD  ð	7/ð 7/ð 7/ð 7/ð 7/ð|ð ð ð ðBw	ð w	ð w	ð w	ð w	ñ w	ô w	ð w	ð| ˆzÒÑØ€O€O€OØ€K€K€KØ€J€J€Jà$ˆXÔ$ðIðñ ô €Fð ×Ò˜Ð*YÐÑZÔZÐZØ
×Ò˜Ð*NÐÑOÔOÐOØ
×ÒØ °ØHð ñ ô ð ð ×ÒØ °ØGð ñ ô ð ð ×ÒØ E°4ØTð ñ ô ð ð ×ÒØ °ØVð ñ ô ð ð ×ÒØ E°3ØQð ñ ô ð ð ×ÒØ˜c¨2ØOð ñ ô ð ð ×ÒØ˜cØ<Ð<Ð<Ø-ð ñ ô ð ð
 ×ÒØ˜# tØLð ñ ô ð ð ×ÒØ˜dØYð ñ ô ð ð ×ÒÑÔ€Dà%Ð%Ø”.ØÔ*ØÔ*ØÔ0ØÔ*ØÔ0ØÔ$ðñ ô €Ið ��T”^Ñ$Ô$€IØ'+¤}Ð>���T”]Ñ#Ô#Ð#¸$€HØÐØ�Š˜t¨dˆÑ3Ô3Ð3à€IÐÐÐÑØŒð Eð EˆØ×Ò˜˜ 	§¢¨z°C¨z¨zÑ :Ô :Ñ;Ô;Ñ<Ô<Ð<Ø×Ò˜˜ 	§¢Ð/A°C·I²I±K´KÐ/AÐ/AÑ BÔ BÑCÔCÑDÔDÐDÐDØ��s�s˜9‘~”~Ñ&Ô&€Iàð AØˆÐ0 YÐ0Ð0Ñ1Ô1Ð1Ð1à#ÐPˆxˆxÐ)PˆØˆÐ?�s�s˜9‘~”~Ð?Ð?¸Ð?Ð?Ð?Ñ@Ô@Ð@àð $,ñ $,ˆØ�#”*˜S˜S ™]œ]Ñ+Ô+ˆØˆ?ØˆEÐ1 (¤-Ð1Ð1Ñ2Ô2Ð2Øð ×(Ò(¨Ñ1Ô1ˆ	Ø×ÒÑÔð 	$Ø��i Ñ%Ô%ð &¨Ø"˜œ 1™œ�ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &à: c c¨&¡k¤kÐ:Ð:Ð:ˆKˆKàˆFØ#ˆKà×%Ò% g¨vÑ6Ô6ˆà�. TÔ%5Ð%Að ˆs�9×4Ò4°TÔ5EÑFÔFÑGÔGÐGà%Ð1���F‘”�°qð 	ð 	ˆØŒ}ð Hð H {ð Hð HØðHð Hà�s˜4œ<Ñ(Ô(ðHð Hà47°C¸¼Ñ4EÔ4EðHð Hñ	
ô 	
ð 	
ð ×&Ò& w°¸VÈTÌ\Ð&ÑZÔZˆàÐØ X¤]Ð"MÐ"M¸H¼OÐ"MÐ"MÑMˆHØˆCŒK˜˜˜H™œ xÑ0Ô0Ð0ØˆEÐ* Ð*Ð*Ñ+Ô+Ð+Ñ+àE°h´mÐEÐEˆLØˆCŒJ�| XÑ.Ô.Ð.ØˆCŒK˜‰NŒNˆNØˆCÔ˜lÑ+Ô+Ð+Ñ+ðm Ððd$,ð $,s   ÍM%Í%M)	Í,M)	