§
    �WêjŒu  ã                  ó˜   — 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d„Z	 	 	 dd d„Zd!d„Z G d„ d¦  «        ZdS )"a‘  
TableGridExtractorV3.py

Loads an exported GridModelV3 ONNX model and predicts table grid structure
(h/v line positions) from a cropped table image.

Key differences from V2
-----------------------
- GridModelV3 outputs candidate logits rather than anchor-based on/offset maps.
  Candidate positions (h_positions, v_positions) must be supplied at inference.
- Candidate generation has two modes depending on whether bboxes are available:
    * bbox mode  : candidates are derived directly from bbox boundaries using
                   the same empty-strip algorithm as TableGridDatasetV3.
                   The DB pass is skipped entirely.
    * DB mode    : when no bboxes are available, a first ONNX pass with empty
                   candidates obtains db_prob, from which candidates are derived
                   via connected-component analysis (mirrors the dataset logic).
- No ConnClassifier: V3 does not produce a feature_map output for connectivity.
- snap_to_bbox_gaps is removed (not supported in V3).

ONNX model I/O (GridModelV3 _ExportWrapper)
--------------------------------------------
Inputs  : image       (1, 3, H, W)  float32
          h_positions (N_h,)         float32  candidate y coords in model input px
          v_positions (N_v,)         float32  candidate x coords in model input px
Outputs : h_logits    (N_h,)         float32
          v_logits    (N_v,)         float32
          db_prob     (1, 1, H, W)   float32  sigmoid probability map
          db_thresh   (1, 1, H, W)   float32  threshold map in [0, 1]

Post-processing pipeline (bbox mode)
--------------------------------------
1. Resize input image to model input size.
2. Scale bboxes to model input px coords.
3. Derive h/v candidates from scaled bbox boundaries (empty-strip detection).
4. Run ONNX model once with derived candidates -> h_logits, v_logits.
5. Sigmoid + threshold + 1D NMS -> active line positions.
6. Scale to original image pixel coords.
7. Optionally filter empty lines using bbox centers.

Post-processing pipeline (DB mode, no bboxes)
----------------------------------------------
1. Resize input image to model input size.
2. Run ONNX model with empty candidates -> db_prob.
3. Derive h/v candidates from db_prob via connected-component analysis.
4. Run ONNX model again with derived candidates -> h_logits, v_logits.
5. Sigmoid + threshold + 1D NMS -> active line positions.
6. Scale to original image pixel coords.

filter_empty_lines behaviour
-----------------------------
Applied in predict() when bboxes are provided. Works on (pos, score) tuples
where score is the per-line sigmoid value retained from the classifier output.

Algorithm (CCL-style, converges in multiple passes):
  For each consecutive pair of kept lines (lo, hi):
    - If no bbox center y falls in [lo_pos, hi_pos]:
        remove the line with the lower score (keep the higher-score one).
        mark changed=True and restart the scan.
  Repeat until no pair is removed.

After convergence:
  - Remove leading lines where no bbox center falls in [0, line_pos].
  - Remove trailing lines where no bbox center falls in [line_pos, image_height].

The same logic applies symmetrically to v_lines using cx (bbox center x).
é    )Úannotations)ÚPathNé   )Ú
get_config)ÚGridPredictionÚCellInfo)Úmake_sessionç      @Úbboxes_scaledú
np.ndarrayÚgrid_margin_pxÚfloatÚreturnútuple[list[float], list[float]]c                óÌ  ‡— t          | ¦  «        dk    rg g fS t          ¦   «         }t          ¦   «         }g }| D �]}t          |d         ¦  «        t          |d         ¦  «        t          |d         ¦  «        t          |d         ¦  «        f\  }}}}	||k    s|	|k    rŒg||z
  }
|	|z
  }|
dk    rdnd}|dk    rdnd}||z   ||z   }}||z
  |	|z
  }}|                     ||||g¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         �Œˆfd„} |||d¬¦  «        } |||d¬¦  «        }||fS )	aB  
    Derive h/v candidate grid line positions from bbox boundaries.

    Mirrors the empty-strip detection logic in TableGridDatasetV3.
    bboxes_scaled must already be in model input pixel coordinates.

    Parameters
    ----------
    bboxes_scaled  : (N, 4) float32 array of [x1, y1, x2, y2] in model input px
    grid_margin_px : proximity margin for strip detection (default 5.0)

    Returns
    -------
    h_candidates : list[float]  candidate y midpoints (model input px, unsorted)
    v_candidates : list[float]  candidate x midpoints (model input px, unsorted)
    r   r   é   é   c                óF  •— | sg S t          | ¦  «        }g }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Œã|	rR||z   dz  }t          t          |¦  «        ¦  «        }||vr*|                     |¦  «         |                     |¦  «         �Œ]|S )Nr   r   TFç       @)	ÚsortedÚsetÚrangeÚlenÚabsÚintÚroundÚaddÚappend)Ú
boundariesÚbboxesÚis_hÚsorted_bÚresultsÚseenÚiÚc1Úc2Úis_emptyÚbboxÚbx1Úby1Úbx2Úby2ÚnearÚmidÚmid_intr   s                     €úš/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/pymupdf/layout/onnx/TableGridExtractorV3.pyÚ_find_candidatesz/_bboxes_to_candidates.<locals>._find_candidates€   s  ø€ Øð 	ØˆIÝ˜*Ñ%Ô%ˆØˆÝ‘5”5ˆÝ•s˜8‘}”} qÑ(Ñ)Ô)ð $	(ñ $	(ˆAØ˜a”[ (¨1¨q©5¤/�ˆBØ�B‰w˜Š{ˆ{ØØˆHØð ð �Ø%)Ñ"��S˜#˜sØð å˜C "™H™œ¨Ò7ð 8Ý˜C "™H™œ¨Ò7ð8å˜C "™H™œ¨Ò7ð8õ ˜C "™H™œ¨Ò7ð	 ð  ð !Ø Ø˜R’x�x C¨"¢H HØ#(˜Ø˜øõ ˜C "™H™œ¨Ò7ð 8Ý˜C "™H™œ¨Ò7ð8å˜C "™H™œ¨Ò7ð8õ ˜C "™H™œ¨Ò7ð	 ð  ð !Ø Ø˜R’x�x C¨"¢H HØ#(˜Ø˜øØð (Ø ™7 c™/�Ý�e C™jœj™/œ/�Ø $Ð&Ð&Ø—H’H˜WÑ%Ô%Ð%Ø—N’N 3Ñ'Ô'Ð'ùØˆó    T)r!   F)r   r   r   r   r   )r   r   Úall_h_boundariesÚall_v_boundariesÚcell_bboxesr)   Úx1_fÚy1_fÚx2_fÚy2_fÚwÚhÚxsÚysÚsx1Úsy1Úsx2Úsy2r2   Úh_candidatesÚv_candidatess    `                   r1   Ú_bboxes_to_candidatesrE   U   s¿  ø€ õ( ˆ=ÑÔ˜QÒÐØ�2ˆvˆå#&¡5¤5ÐÝ#&¡5¤5ÐØ%'€Kàð "ñ "ˆÝ!& t¨A¤w¡¤µ°t¸A´w±´ÅÀtÈAÄwÁÄÕQVÐW[Ð\]ÔW^ÑQ_ÔQ_Ð!_Ñˆˆd�D˜$Ø�4Š<ˆ<˜4 4š<˜<ØØ�D‰[ˆØ�D‰[ˆØ�q’&�&ˆQˆQ˜aˆØ�q’&�&ˆQˆQ˜aˆØ˜"‘9˜d R™iˆSˆØ˜"‘9˜d R™iˆSˆØ×Ò˜C  c¨3Ð/Ñ0Ô0Ð0Ø×Ò˜SÑ!Ô!Ð!Ø×Ò˜SÑ!Ô!Ð!Ø×Ò˜SÑ!Ô!Ð!Ø×Ò˜SÑ!Ô!Ð!Ñ!ð+ð +ð +ð +ð +ðZ $Ð#Ð$4°kÈÐMÑMÔM€LØ#Ð#Ð$4°kÈÐNÑNÔN€LØ˜Ð%Ð%r3   ç      à?çš™™™™™¹?Ú
db_prob_npÚprob_thresholdÚshrink_ratioc                óþ  — ddl }| |k                         t          j        ¦  «        dz  }|                     |d¬¦  «        \  }}}}	dt          d|z
  d¦  «        z  }
| j        \  }}g }t          d|¦  «        D ]Ï}||         \  }}}}}|d	k     rŒ||d
z  z   }||d
z  z   }||
z  }||
z  }t          d||d
z  z
  ¦  «        }t          d||d
z  z
  ¦  «        }t          t          |¦  «        ||d
z  z   ¦  «        }t          t          |¦  «        ||d
z  z   ¦  «        }||z
  dk     s	||z
  dk     rŒ¶| 
                    ||||g¦  «         ŒÐ|sg g fS t          j        |t          j        ¬¦  «        }t          ||¦  «        S )a˜  
    Convert a DBHead probability map to candidate h/v grid line positions.

    Used only when no external bboxes are available.
    Mirrors TableGridModelsV3.db_predictions_to_candidates.

    Parameters
    ----------
    db_prob_np      : (H, W) float32 sigmoid probability map
    prob_threshold  : binarisation threshold
    shrink_ratio    : shrink ratio assumed during training, for bbox expansion
    grid_margin_px  : empty-strip margin for candidate detection

    Returns
    -------
    h_positions : list[float]  candidate y-coordinates (model input px, unsorted)
    v_positions : list[float]  candidate x-coordinates (model input px, unsorted)
    r   Néÿ   é   )Úconnectivityç      ð?g�íµ ÷Æ°>r   é   r   ç        ©Údtype)Úcv2ÚastypeÚnpÚuint8ÚconnectedComponentsWithStatsÚmaxÚshaper   Úminr   r   ÚarrayÚfloat32rE   )rH   rI   rJ   r   rT   ÚbinaryÚ
num_labelsÚlabelsÚstatsÚ_ÚexpandÚHÚWÚreconstructed_bboxesÚlblÚxÚyr;   r<   ÚareaÚcxÚcyÚewÚehÚx1Úy1Úx2Úy2Ú	bboxes_nps                                r1   Ú_db_predictions_to_candidatesrt   ¶   sÃ  € ð0 €J€J€JØ Ò.×6Ò6µr´xÑ@Ô@À3ÑF€FØ#&×#CÒ#CØ˜Qð $Dñ $ô $Ñ €J�˜˜qð •3�s˜\Ñ)¨4Ñ0Ô0Ñ0€FØÔ�D€A€qà.0Ðå�Q˜
Ñ#Ô#ð 6ð 6ˆØ  œ:Ñˆˆ1ˆa��DØ�!Š8ˆ8ØØ��S‘‰[ˆØ��S‘‰[ˆØ�‰ZˆØ�‰ZˆÝ�˜˜b 3™h™Ñ'Ô'ˆÝ�˜˜b 3™h™Ñ'Ô'ˆÝ•�q‘”˜2  S¡™=Ñ)Ô)ˆÝ•�q‘”˜2  S¡™=Ñ)Ô)ˆØ�‰7�QŠ;ˆ;˜"˜r™' Aš+˜+ØØ×#Ò# R¨¨R°Ð$4Ñ5Ô5Ð5Ð5àð Ø�2ˆvˆå”Ð-µR´ZÐ@Ñ@Ô@€IÝ  ¨NÑ;Ô;Ð;r3   Ú	positionsÚscoresÚnms_min_distc           	     ób  ‡ — |dk    st          ‰ ¦  «        dk    rt          j        ‰ ¦  «        S t          j        | ¦  «        }t          j        t          ‰ ¦  «        t          ¬¦  «        }g }|D ]Ž}||         rŒ|                     |¦  «         t          t          ‰ ¦  «        ¦  «        D ]Q}||         sG||k    rAt          t          ‰ |         ¦  «        t          ‰ |         ¦  «        z
  ¦  «        |k     rd||<   ŒRŒ�t          j	        t          |ˆ fd„¬¦  «        t          j        ¬¦  «        S )aF  
    Greedy score-descending 1D NMS.

    Parameters
    ----------
    positions    : (N,) float32 line positions
    scores       : (N,) float32 corresponding sigmoid scores
    nms_min_dist : minimum distance between kept lines (same coord space)

    Returns
    -------
    Indices of kept lines, sorted by position.
    rQ   r   rR   Tc                ó   •— ‰|          S ©N© )Úkru   s    €r1   ú<lambda>z_nms_1d.<locals>.<lambda>  s   ø€ ¨y¸¬|€ r3   ©Úkey)r   rV   ÚargsortÚzerosÚboolr   r   r   r   r\   r   Úint32)ru   rv   rw   ÚorderÚ
suppressedÚkeepr%   Újs   `       r1   Ú_nms_1drˆ   ô   s-  ø€ ð$ �sÒÐ�c )™nœn°Ò1Ð1ÝŒz˜)Ñ$Ô$Ð$å”˜V˜GÑ$Ô$€EÝ”�#˜i™.œ.µÐ5Ñ5Ô5€JØ€Dàð )ð )ˆØ�aŒ=ð 	ØØ�Š�A‰ŒˆÝ•s˜9‘~”~Ñ&Ô&ð 	)ð 	)ˆAØ˜a”=ð ) Q¨!¢V VÝ•u˜Y qœ\Ñ*Ô*­U°9¸Q´<Ñ-@Ô-@Ñ@ÑAÔAÀLÒPÐPØ$(�J˜q‘Møð	)õ
 Œ8•F˜4Ð%;Ð%;Ð%;Ð%;Ð<Ñ<Ô<ÅBÄHÐMÑMÔMÐMr3   c                  óœ   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 d5d6d„Zd7d„Zd8d„Zed9d„¦   «         Zd:d'„Z	ed;d,„¦   «         Z
	 d<d=d0„Z	 	 	 d>d?d3„Zd4„ ZdS )@ÚTableGridExtractorV3a7  
    ONNX-based table grid extractor using the V3 candidate classifier model.

    Candidate generation mode is selected automatically in predict_grid:
      - bboxes provided -> bbox boundary-based candidates (1 ONNX pass)
      - bboxes absent   -> DBHead probability map-based candidates (2 ONNX passes)
    rF   r
   TrG   ú1-RowÚBBoxNÚh_on_thresholdr   Úv_on_thresholdrw   Úfilter_empty_linesr‚   Údb_prob_thresholdÚdb_shrink_ratioÚdb_grid_margin_pxÚbbox_grid_margin_pxr   ÚNonec                ó®  — |€dg}t          |¦  «        | _        || _        || _        || _        || _        || _        || _        || _        |	| _	        |
| _
        || _        t          ¦   «         }|                     d¦  «        �N|                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        t          t          | j        ¦  «        |¦  «        | _        | j                             ¦   «         d         }t%          |j        d         ¦  «        | _        t%          |j        d	         ¦  «        | _        dS )
a8  
        Parameters
        ----------
        grid_onnx_path      : path to GridModelV3 .onnx file
        h_on_threshold      : sigmoid threshold for h-line activation (default 0.5)
        v_on_threshold      : sigmoid threshold for v-line activation (default 0.5)
        nms_min_dist        : minimum distance (model input px) between kept lines
                              after thresholding (default 5.0)
        filter_empty_lines  : merge adjacent lines with no bbox center between them
                              when bboxes are supplied (default True)
        db_prob_threshold   : binarisation threshold for DB probability map,
                              used only in DB fallback mode (default 0.5)
        db_shrink_ratio     : shrink ratio assumed during model training, used for
                              bbox expansion in DB candidate generation (default 0.1)
        db_grid_margin_px   : empty-strip margin for DB candidate generation (default 5.0)
        bbox_grid_margin_px : empty-strip margin for bbox candidate generation (default 5.0)
        NÚCPUExecutionProviderrŠ   z#TableGridExtractorV3.h_on_thresholdz#TableGridExtractorV3.v_on_thresholdz!TableGridExtractorV3.nms_min_distr   r   r   )r   Úgrid_onnx_pathr�   rŽ   rw   r�   r�   r‘   r’   r“   Úheader_typeÚ
merge_typer   Úgetr	   ÚstrÚ_sessÚ
get_inputsr   rZ   Ú_input_hÚ_input_w)Úselfr—   r�   rŽ   rw   r�   r�   r‘   r’   r“   r˜   r™   Ú	providersÚglobal_configÚinps                  r1   Ú__init__zTableGridExtractorV3.__init__&  s7  € ð@ ÐØ/Ð0ˆIå#'¨Ñ#7Ô#7ˆÔØ#1ˆÔØ#1ˆÔØ#/ˆÔØ#5ˆÔØ#4ˆÔØ#2ˆÔØ#4ˆÔØ#6ˆÔ Ø#.ˆÔØ#-ˆŒå"™œˆØ×ÒÐ3Ñ4Ô4Ð@Ø#0×#4Ò#4Ð5ZÑ#[Ô#[ˆDÔØ#0×#4Ò#4Ð5ZÑ#[Ô#[ˆDÔØ#0×#4Ò#4Ð5XÑ#YÔ#YˆDÔå!¥# dÔ&9Ñ":Ô":¸IÑFÔFˆŒ
àŒj×#Ò#Ñ%Ô% aÔ(ˆÝ˜CœI aœLÑ)Ô)ˆŒÝ˜CœI aœLÑ)Ô)ˆŒˆˆr3   Ú	image_bgrr   c                ó   — ddl }|                     || j        | j        f¦  «        }|dd…dd…ddd…f                              t
          j        ¦  «        dz  }|                     ddd¦  «        t
          j                 S )z+Resize + normalize -> (1, 3, H, W) float32.r   Néÿÿÿÿg     ào@r   r   )	rT   ÚresizerŸ   rž   rU   rV   r]   Ú	transposeÚnewaxis)r    r¥   rT   Úimg_resizedÚimg_rgbs        r1   Ú_preprocessz TableGridExtractorV3._preprocesse  sy   € àˆ
ˆ
ˆ
Ø—j’j ¨T¬]¸D¼MÐ,JÑKÔKˆØ! ! ! ! Q Q Q¨¨¨"¨ *Ô-×4Ò4µR´ZÑ@Ô@À5ÑHˆØ× Ò   A qÑ)Ô)­"¬*Ô5Ð5r3   r£   Úh_positionsÚv_positionsú5tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]c                ó  — | j                              d||                     t          j        ¦  «        |                     t          j        ¦  «        dœ¦  «        }|d         |d         |d         d         |d         d         fS )zß
        Single ONNX session run.

        Returns
        -------
        h_logits  : (N_h,)
        v_logits  : (N_v,)
        db_prob   : (H, W)  sigmoid probability map
        db_thresh : (H, W)  threshold map
        N)Úimager®   r¯   r   r   r   )r   r   r   )rœ   ÚrunrU   rV   r]   )r    r£   r®   r¯   Úoutputss        r1   Ú	_run_onnxzTableGridExtractorV3._run_onnxl  sy   € ð  ”*—.’. ØØ&×-Ò-­b¬jÑ9Ô9Ø&×-Ò-­b¬jÑ9Ô9ð(
ð (
ñ ô ˆð
 �qŒz˜7 1œ: w¨q¤z°$Ô'7¸À¼ÀDÔ9IÐIÐIr3   rh   c                ó¬   — ddt          j        |                      t           j        ¦  «         ¦  «        z   z                       t           j        ¦  «        S )NrO   )rV   ÚexprU   Úfloat64r]   )rh   s    r1   Ú_sigmoidzTableGridExtractorV3._sigmoidƒ  s=   € à�s�RœV Q§X¢X­b¬jÑ%9Ô%9Ð$9Ñ:Ô:Ñ:Ñ;×CÒCÅBÄJÑOÔOÐOr3   Úh_candsúlist[float]Úv_candsÚorig_hr   Úorig_wú9tuple[list[float], list[float], list[float], list[float]]c                ó>  ‡‡‡‡‡‡— t          j        dt           j        ¬¦  «        }|r-t          j        t	          |¦  «        t           j        ¬¦  «        n|}|r-t          j        t	          |¦  «        t           j        ¬¦  «        n|}|                      |||¦  «        \  }	}
}}|                      |	¦  «        }|                      |
¦  «        }|| j        k    }|| j        k    }||         Š||         Š||         Š||         Št          ‰‰| j
        ¦  «        }t          ‰‰| j
        ¦  «        }|t          | j        ¦  «        z  Š|t          | j        ¦  «        z  Šˆˆfd„|D ¦   «         }ˆˆfd„|D ¦   «         }ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }||||fS )a  
        Run ONNX classifier on given candidates and return kept lines with scores.

        Candidates must be in model input pixel coordinates.
        Returned lines are in original image pixel coordinates.

        Returns
        -------
        h_lines  : list[float]  kept h-line positions (orig px, sorted)
        v_lines  : list[float]  kept v-line positions (orig px, sorted)
        h_scores : list[float]  per-kept-line sigmoid scores
        v_scores : list[float]  per-kept-line sigmoid scores
        r   rR   c                ó@   •— g | ]}t          ‰|         ¦  «        ‰z  ‘ŒS r{   ©r   )Ú.0r|   Úh_pos_activeÚscale_hs     €€r1   ú
<listcomp>z=TableGridExtractorV3._classify_candidates.<locals>.<listcomp>±  ó*   ø€ ÐEÐEÐE¸•E˜, qœ/Ñ*Ô*¨WÑ4ÐEÐEÐEr3   c                ó@   •— g | ]}t          ‰|         ¦  «        ‰z  ‘ŒS r{   rÂ   )rÃ   r|   Úscale_wÚv_pos_actives     €€r1   rÆ   z=TableGridExtractorV3._classify_candidates.<locals>.<listcomp>²  rÇ   r3   c                ó:   •— g | ]}t          ‰|         ¦  «        ‘ŒS r{   rÂ   )rÃ   r|   Úh_scr_actives     €r1   rÆ   z=TableGridExtractorV3._classify_candidates.<locals>.<listcomp>³  ó%   ø€ Ð;Ð;Ð;¨q•E˜, qœ/Ñ*Ô*Ð;Ð;Ð;r3   c                ó:   •— g | ]}t          ‰|         ¦  «        ‘ŒS r{   rÂ   )rÃ   r|   Úv_scr_actives     €r1   rÆ   z=TableGridExtractorV3._classify_candidates.<locals>.<listcomp>´  rÍ   r3   )rV   r�   r]   r\   r   rµ   r¹   r�   rŽ   rˆ   rw   r   rž   rŸ   )r    r£   rº   r¼   r½   r¾   ÚemptyÚ	h_pos_arrÚ	v_pos_arrÚh_logitsÚv_logitsrb   Úh_sigÚv_sigÚh_maskÚv_maskÚh_keepÚv_keepÚh_linesÚv_linesÚh_scoresÚv_scoresrÄ   rÌ   rÅ   rÉ   rÊ   rÏ   s                         @@@@@@r1   Ú_classify_candidatesz)TableGridExtractorV3._classify_candidates‡  s·  øøøøøø€ õ* ”H˜Q¥b¤jÐ1Ñ1Ô1ˆØCJÐU•B”H�V G™_œ_µB´JÐ?Ñ?Ô?Ð?ÐPUˆ	ØCJÐU•B”H�V G™_œ_µB´JÐ?Ñ?Ô?Ð?ÐPUˆ	à#'§>¢>°#°yÀ)Ñ#LÔ#LÑ ˆ�(˜A˜qà—’˜hÑ'Ô'ˆØ—’˜hÑ'Ô'ˆà Ô 3Ò3ˆØ Ô 3Ò3ˆØ  Ô(ˆØ˜V”}ˆØ  Ô(ˆØ˜V”}ˆå˜ |°TÔ5FÑGÔGˆÝ˜ |°TÔ5FÑGÔGˆà�E $¤-Ñ0Ô0Ñ0ˆØ�E $¤-Ñ0Ô0Ñ0ˆØEÐEÐEÐEÐE¸fÐEÑEÔEˆØEÐEÐEÐEÐE¸fÐEÑEÔEˆØ;Ð;Ð;Ð;°FÐ;Ñ;Ô;ˆØ;Ð;Ð;Ð;°FÐ;Ñ;Ô;ˆà˜ ¨8Ð3Ð3r3   Úlinesúlist[tuple[float, float]]ÚcentersÚ
image_sizec                óš  ‡‡	‡
‡— | s| S t          | d„ ¬¦  «        Š	d}|r¢d}t          ‰	¦  «        dk     rnŒ‰	d         g}t          dt          ‰	¦  «        ¦  «        D ]a}|d         \  Š}‰	|         \  Š
}t          ˆ
ˆfd	„|D ¦   «         ¦  «        }|s||k    r‰
|f|d<   d}ŒF|                     ‰	|         ¦  «         Œb|Š	|°¢‰	rBt          ˆ	fd
„|D ¦   «         ¦  «        s'‰	dd…         Š	‰	rt          ˆ	fd
„|D ¦   «         ¦  «        ¯'‰	rDt          ˆ	ˆfd„|D ¦   «         ¦  «        s(‰	dd…         Š	‰	rt          ˆ	ˆfd„|D ¦   «         ¦  «        ¯(‰	S )aH  
        Remove lines that have no bbox center in the gap they bound.

        Input/output: list of (pos, score) tuples, sorted by pos.

        Algorithm
        ---------
        Scan consecutive pairs (lo, hi). If no bbox center falls in
        [lo_pos, hi_pos], discard the line with the lower score and
        restart the scan. Repeat until no pair is removed (CCL convergence).

        After convergence, additionally remove:
          - leading lines where no center falls in [0, line_pos]
          - trailing lines where no center falls in [line_pos, image_size]
        c                ó   — | d         S )Nr   r{   )Úts    r1   r}   z:TableGridExtractorV3._filter_empty_lines.<locals>.<lambda>Ð  s
   € ¨a°¬d€ r3   r~   TFr   r   r   r§   c              3  ó8   •K  — | ]}‰|cxk    o‰k    nc V — Œd S rz   r{   )rÃ   ÚcÚhi_posÚlo_poss     €€r1   ú	<genexpr>z;TableGridExtractorV3._filter_empty_lines.<locals>.<genexpr>Û  s?   øè è € Ð HÐ H¸1 ¨1Ð!6Ð!6Ò!6Ð!6°Ò!6Ð!6Ð!6Ð!6Ð HÐ HÐ HÐ HÐ HÐ Hr3   c              3  óP   •K  — | ] }d |cxk    o‰d         d         k    nc V — Œ!dS )rQ   r   Nr{   )rÃ   rè   Úcurrents     €r1   rë   z;TableGridExtractorV3._filter_empty_lines.<locals>.<genexpr>ä  sG   øè è € Ð!MÐ!MÀ #¨Ð";Ð";Ò";Ð";¨g°a¬j¸¬mÒ";Ð";Ð";Ð";Ð!MÐ!MÐ!MÐ!MÐ!MÐ!Mr3   Nc              3  óP   •K  — | ] }‰d          d         |cxk    o‰k    nc V — Œ!dS )r§   r   Nr{   )rÃ   rè   rí   rã   s     €€r1   rë   z;TableGridExtractorV3._filter_empty_lines.<locals>.<genexpr>æ  sG   øè è € Ð!UÐ!UÈ '¨"¤+¨a¤.°AÐ"CÐ"CÒ"CÐ"C¸Ò"CÐ"CÐ"CÐ"CÐ!UÐ!UÐ!UÐ!UÐ!UÐ!Ur3   )r   r   r   Úanyr   )rà   râ   rã   ÚchangedÚresultr%   Úlo_scoreÚhi_scoreÚ
has_centerrí   ré   rê   s     `      @@@r1   Ú_filter_empty_linesz(TableGridExtractorV3._filter_empty_lines¸  sç  øøøø€ ð* ð 	ØˆLå˜ N NÐ3Ñ3Ô3ˆØˆàð 	ØˆGÝ�7‰|Œ|˜aÒÐØØ˜a”j�\ˆFÝ˜1�c '™lœlÑ+Ô+ð 	.ð 	.�Ø#)¨"¤:Ñ �˜Ø#*¨1¤:Ñ �˜Ý Ð HÐ HÐ HÐ HÐ HÀÐ HÑ HÔ HÑHÔH�
Ø!ð .Ø 8Ò+Ð+Ø&,¨hÐ%7˜˜r™
Ø"�G�Gà—M’M '¨!¤*Ñ-Ô-Ð-Ð-ØˆGð ð 	ð" ð 	"�cÐ!MÐ!MÐ!MÐ!MÀWÐ!MÑ!MÔ!MÑMÔMð 	"Ø˜a˜b˜b”kˆGð ð 	"�cÐ!MÐ!MÐ!MÐ!MÀWÐ!MÑ!MÔ!MÑMÔMð 	"àð 	#�cÐ!UÐ!UÐ!UÐ!UÐ!UÈWÐ!UÑ!UÔ!UÑUÔUð 	#Ø˜c˜r˜c”lˆGð ð 	#�cÐ!UÐ!UÐ!UÐ!UÐ!UÈWÐ!UÑ!UÔ!UÑUÔUð 	#ð ˆr3   r    únp.ndarray | Noner   c                óŒ	  ‡"‡#— |j         dd…         \  Š"Š#|                      |¦  «        }|duot          |¦  «        dk    }|r�t          j        |t          j        ¬¦  «        }| j        t          ‰#¦  «        z  }| j        t          ‰"¦  «        z  }|t          j	        ||||gt          j        ¬¦  «        z  }t          || j        ¬¦  «        \  }	}
nat          j        dt          j        ¬¦  «        }|                      |||¦  «        \  }}}}t          || j        | j        | j        ¬¦  «        \  }	}
|	s¯|
s­t%          g g t          j        dt          j        ¬¦  «        t          j        dt          j        ¬¦  «        t          j        dt          j        ¬¦  «        t          j        dt          j        ¬¦  «        t          j        dt          j        ¬¦  «        d¬¦  «        S |                      ||	|
‰"‰#¦  «        \  }}}}t          j	        ˆ"fd„|D ¦   «         t          j        ¬¦  «        }t          j	        ˆ#fd	„|D ¦   «         t          j        ¬¦  «        }d
dk    �rÍ‰"t          | j        ¦  «        z  }‰#t          | j        ¦  «        z  }|                     ¦   «         }ddl}|	D ]1}t/          ||z  ¦  «        }|                     |d|f‰#|fdd¦  «         Œ2|
D ]1}t/          ||z  ¦  «        }|                     ||df|‰"fdd¦  «         Œ2t3          |¦  «        D ]`\  }}t/          |¦  «        }||         }|                     |d|f‰#|fdd¦  «         |                     ||d›d|dz
  f|j        ddd¦  «         Œat3          |¦  «        D ]`\  }} t/          | ¦  «        }!||         }|                     ||!df|!‰"fdd¦  «         |                     ||d›|!dz   df|j        ddd¦  «         Œa|                     d|¦  «         |                     d¦  «         |                     ¦   «          t%          t?          |¦  «        t?          |¦  «        t          j	        |t          j        ¬¦  «        t          j	        |t          j        ¬¦  «        ||t          j         t          |¦  «        t          j        ¬¦  «        d¬¦  «        S )aÖ  
        Run grid line prediction.

        Parameters
        ----------
        image_bgr : cropped table BGR image (any size)
        bboxes    : (N, 4) float32 array of [x1, y1, x2, y2] in crop pixel coords.
                    When provided, candidates are derived from bbox boundaries
                    (1 ONNX pass, DB skipped). When None or empty, candidates
                    are derived from the DBHead probability map (2 ONNX passes).

        Returns
        -------
        GridPrediction with h_lines / v_lines in original image pixel coords.
        h_on_prob / v_on_prob hold per-kept-line sigmoid scores (not the full
        candidate array) so that filter_empty_lines can use meaningful scores.
        Nr   r   rR   )r   )rI   rJ   r   ©rÛ   rÜ   Ú	h_on_probÚ	v_on_probÚh_lines_normÚv_lines_normÚh_clsrN   c                ó   •— g | ]}|‰z  ‘ŒS r{   r{   ©rÃ   ri   r½   s     €r1   rÆ   z5TableGridExtractorV3.predict_grid.<locals>.<listcomp>1  ó   ø€ Ð =Ð =Ð =°  V¡Ð =Ð =Ð =r3   c                ó   •— g | ]}|‰z  ‘ŒS r{   r{   ©rÃ   rh   r¾   s     €r1   rÆ   z5TableGridExtractorV3.predict_grid.<locals>.<listcomp>2  r   r3   Ú ÚD)r   rL   r   r   )r   r   rL   z.2fé   gš™™™™™Ù?)rL   r   r   é
   zFGrid Candidate Visualization (Green: Candidates, Red/Blue: Kept Lines))!rZ   r­   r   rV   Úasarrayr]   rŸ   r   rž   r\   rE   r“   r�   rµ   rt   r�   r‘   r’   r   rƒ   rß   ÚcopyrT   r   ÚlineÚ	enumerateÚputTextÚFONT_HERSHEY_SIMPLEXÚimshowÚwaitKeyÚdestroyAllWindowsr   Úones)$r    r¥   r    r£   Ú
has_bboxesÚ
bboxes_arrÚscale_xÚscale_yr   rº   r¼   rÐ   rb   Údb_probrÛ   rÜ   rÝ   rÞ   rû   rü   Úscale_h_candÚscale_w_candÚimg_vizrT   Úy_candÚy_scaledÚx_candÚx_scaledr%   Úy_lineÚy_intÚscoreÚx_lineÚx_intr½   r¾   s$                                     @@r1   Úpredict_gridz!TableGridExtractorV3.predict_gridï  s	  øø€ ð, #œ¨¨!¨Ô,‰ˆ�Ø×Ò˜yÑ)Ô)ˆà 4Ð'Ð;­C°©K¬K¸!ªOˆ
àð 	åœJ vµR´ZÐ@Ñ@Ô@ˆJØ œM­E°&©M¬MÑ9ˆGØ œM­E°&©M¬MÑ9ˆGØ&­¬Ø˜' 7¨GÐ4½B¼Jð*ñ *ô *ñ ˆMõ  5ØØ#Ô7ð ñ  ô  ÑˆG�W�Wõ ”H˜Q¥b¤jÐ1Ñ1Ô1ˆEØ#Ÿ~š~¨c°5¸%Ñ@Ô@ÑˆAˆq�'˜1Ý<ØØ!%Ô!7Ø!%Ô!5Ø!%Ô!7ð	 ñ  ô  ÑˆG�Wð ð 
	˜wð 
	Ý!Ø!Ø!Ý!œx¨µ´Ð<Ñ<Ô<Ý!œx¨µ´Ð<Ñ<Ô<Ý!œx¨µ´Ð<Ñ<Ô<Ý!œx¨µ´Ð<Ñ<Ô<Ý!œx¨µ´Ð:Ñ:Ô:Ø#ð	ñ 	ô 	ð 	ð 04×/HÒ/HØ�˜' 6¨6ñ0
ô 0
Ñ,ˆ�˜( Hõ ”xÐ =Ð =Ð =Ð =°WÐ =Ñ =Ô =ÅRÄZÐPÑPÔPˆÝ”xÐ =Ð =Ð =Ð =°WÐ =Ñ =Ô =ÅRÄZÐPÑPÔPˆð �Š9‰9à!¥E¨$¬-Ñ$8Ô$8Ñ8ˆLØ!¥E¨$¬-Ñ$8Ô$8Ñ8ˆLà—n’nÑ&Ô&ˆGàˆJˆJˆJà!ð Uð U�Ý˜v¨Ñ4Ñ5Ô5�Ø—’˜ 1 h -°&¸(Ð1CÀ[ÐRSÑTÔTÐTÐTà!ð Uð U�Ý˜v¨Ñ4Ñ5Ô5�Ø—’˜ 8¨Q -°(¸FÐ1CÀ[ÐRSÑTÔTÐTÐTõ ' wÑ/Ô/ð Kð K‘	��6Ý˜F™œ�Ø  œ�Ø—’˜ 1 e *¨v°u¨o¸{ÈAÑNÔNÐNØ—’˜G¨ ^ ^°a¸À¹°^ØÔ4°c¸;ÈñKô Kð Kð Kõ ' wÑ/Ô/ð Kð K‘	��6Ý˜F™œ�Ø  œ�Ø—’˜ 5¨! *¨u°f¨o¸{ÈAÑNÔNÐNØ—’˜G¨ ^ ^°e¸a±iÀ°_ØÔ4°c¸;ÈñKô Kð Kð Kð �JŠJÐ_ÐahÑiÔiÐiØ�KŠK˜‰NŒNˆNØ×!Ò!Ñ#Ô#Ð#õ Ý! '™?œ?Ý! '™?œ?Ýœ8 HµB´JÐ?Ñ?Ô?Ýœ8 HµB´JÐ?Ñ?Ô?Ø'Ø'Ýœ7¥3 w¡<¤<µr´xÐ@Ñ@Ô@Øð	
ñ 	
ô 	
ð 		
r3   Úspan_thresholdÚtuplec                óR  ‡‡— |�3t          |¦  «        dk    r t          j        |t          j        ¬¦  «        nd}|                      ||¬¦  «        }|€|g fS t          |j        d         ¦  «        }t          |j        d         ¦  «        }t          d„ |D ¦   «         ¦  «        }	t          d„ |D ¦   «         ¦  «        }
t          t          t          |j
        ¦  «        |j                             ¦   «         ¦  «        ¦  «        }t          t          t          |j        ¦  «        |j                             ¦   «         ¦  «        ¦  «        }| j        r.|                      ||
|¦  «        }|                      ||	|¦  «        }d„ |D ¦   «         }d	„ |D ¦   «         }t          j        d
„ |D ¦   «         t          j        ¬¦  «        }t          j        d„ |D ¦   «         t          j        ¬¦  «        }t          |j        d         ¦  «        Št          |j        d         ¦  «        Št          j        ˆfd„|D ¦   «         t          j        ¬¦  «        }t          j        ˆfd„|D ¦   «         t          j        ¬¦  «        }t%          t          |¦  «        t          |¦  «        ||||t          j        t          |¦  «        t          j        ¬¦  «        d¬¦  «        }|                      |||¬¦  «        }|�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         : (N, 4) array-like of [x1, y1, x1, y2] in crop px.
                         When provided, used for candidate generation and
                         empty-line filtering. When None, DB mode is used
                         and no CellInfo is returned.
        texts          : list of text strings aligned with bboxes.
        span_threshold : fractional overlap to trigger span expansion (default 0.1)

        Returns
        -------
        (GridPrediction, list[CellInfo])
        CellInfo list is empty when bboxes is None or empty.
        Nr   rR   )r    r   c              3  ór   K  — | ]2}t          |d          ¦  «        t          |d         ¦  «        z   dz  V — Œ3dS )r   r   r   NrÂ   ©rÃ   Úbs     r1   rë   z/TableGridExtractorV3.predict.<locals>.<genexpr>Œ  ó@   è è € ÐOÐO¸q�%  !¤™+œ+­¨a°¬d©¬Ñ3°sÑ:ÐOÐOÐOÐOÐOÐOr3   c              3  ór   K  — | ]2}t          |d          ¦  «        t          |d         ¦  «        z   dz  V — Œ3dS )r   r   r   NrÂ   r'  s     r1   rë   z/TableGridExtractorV3.predict.<locals>.<genexpr>�  r)  r3   c                ó   — g | ]\  }}|‘ŒS r{   r{   )rÃ   ri   rb   s      r1   rÆ   z0TableGridExtractorV3.predict.<locals>.<listcomp>—  ó   € Ð1Ð1Ð1¡  1˜!Ð1Ð1Ð1r3   c                ó   — g | ]\  }}|‘ŒS r{   r{   )rÃ   rh   rb   s      r1   rÆ   z0TableGridExtractorV3.predict.<locals>.<listcomp>˜  r,  r3   c                ó   — g | ]\  }}|‘ŒS r{   r{   ©rÃ   rb   Úss      r1   rÆ   z0TableGridExtractorV3.predict.<locals>.<listcomp>™  ó   € Ð":Ð":Ð":©¨¨A 1Ð":Ð":Ð":r3   c                ó   — g | ]\  }}|‘ŒS r{   r{   r/  s      r1   rÆ   z0TableGridExtractorV3.predict.<locals>.<listcomp>š  r1  r3   c                ó   •— g | ]}|‰z  ‘ŒS r{   r{   rÿ   s     €r1   rÆ   z0TableGridExtractorV3.predict.<locals>.<listcomp>ž  ó   ø€ Ð#CÐ#CÐ#C°1 A¨¡JÐ#CÐ#CÐ#Cr3   c                ó   •— g | ]}|‰z  ‘ŒS r{   r{   r  s     €r1   rÆ   z0TableGridExtractorV3.predict.<locals>.<listcomp>Ÿ  r4  r3   rø   )Úbboxes_pageÚgridr#  )r   rV   r  r]   r"  r   rZ   r   ÚlistÚziprÛ   rù   ÚtolistrÜ   rú   r�   rõ   r\   r   r  rƒ   Ú_post_process_gridÚbbox_idxÚtext)r    r¥   r    Útextsr#  r  r7  Úcrop_hÚcrop_wÚcx_listÚcy_listÚh_tuplesÚv_tuplesÚ
filtered_hÚ
filtered_vÚfiltered_h_scrÚfiltered_v_scrÚfiltered_h_normÚfiltered_v_normÚcellsÚcellr½   r¾   s                        @@r1   ÚpredictzTableGridExtractorV3.predictf  s  øø€ ð6 Ð!¥c¨&¡k¤k°A¢o oõ ŒJ�v¥R¤ZÐ0Ñ0Ô0Ð0àð 	ð × Ò  °:Ð Ñ>Ô>ˆàÐØ˜�8ˆOå˜	œ¨Ô*Ñ+Ô+ˆÝ˜	œ¨Ô*Ñ+Ô+ˆÝÐOÐOÀJÐOÑOÔOÑOÔOˆÝÐOÐOÀJÐOÑOÔOÑOÔOˆõ ��F 4¤<Ñ0Ô0°$´.×2GÒ2GÑ2IÔ2IÑJÔJÑKÔKˆÝ��F 4¤<Ñ0Ô0°$´.×2GÒ2GÑ2IÔ2IÑJÔJÑKÔKˆàÔ"ð 	KØ×/Ò/°¸'À6ÑJÔJˆHØ×/Ò/°¸'À6ÑJÔJˆHà1Ð1¨Ð1Ñ1Ô1ˆ
Ø1Ð1¨Ð1Ñ1Ô1ˆ
ÝœÐ":Ð":°Ð":Ñ":Ô":Å"Ä*ÐMÑMÔMˆÝœÐ":Ð":°Ð":Ñ":Ô":Å"Ä*ÐMÑMÔMˆå 	¤°Ô 2Ñ3Ô3ˆÝ 	¤°Ô 2Ñ3Ô3ˆÝœ(Ð#CÐ#CÐ#CÐ#C¸
Ð#CÑ#CÔ#CÍ2Ì:ÐVÑVÔVˆÝœ(Ð#CÐ#CÐ#CÐ#C¸
Ð#CÑ#CÔ#CÍ2Ì:ÐVÑVÔVˆåÝ! *Ñ-Ô-Ý! *Ñ-Ô-Ø)Ø)Ø*Ø*Ýœ7¥3 z¡?¤?½"¼(ÐCÑCÔCØð	
ñ 	
ô 	
ˆð ×'Ò'Ø'Ø!Ø+ð (ñ 
ô 
ˆð ÐØð 5ð 5�Ø˜œÐ2Ð2Ò2Ð2­¨E©
¬
Ò2Ð2Ð2Ð2Ð2Ø % d¤mÔ 4�D”Iøà�Uˆ{Ðr3   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§   rQ   r   r   rO   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   rY   )ÚposÚedgesr%   s      r1   Úfind_cell_idxz>TableGridExtractorV3._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™.Ñ)Ô)Ð)r3   r   r   r   )r<  Ú	row_startÚrow_endÚ	col_startÚcol_endÚrowÚcol)	rÛ   r   rY   rÜ   r
  r   r   r   r   )r    r6  r7  r#  Úlast_hÚ	row_edgesÚlast_vÚ	col_edgesrR  r#   r%   r)   Úx0Úy0ro   rp   rk   rl   Úbase_rowÚbase_colrS  rT  rU  rV  Úrr<   rè   r;   s                               r1   r;  z'TableGridExtractorV3._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 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ØØ%Ø#Ø%Ø#Ø$Ø$ðñ ô ñ ô ð ñ ð ˆr3   )rF   rF   r
   TrF   rG   r
   r
   r‹   rŒ   N)r�   r   rŽ   r   rw   r   r�   r‚   r�   r   r‘   r   r’   r   r“   r   r   r”   )r¥   r   r   r   )r£   r   r®   r   r¯   r   r   r°   )rh   r   r   r   )r£   r   rº   r»   r¼   r»   r½   r   r¾   r   r   r¿   )rà   rá   râ   r»   rã   r   r   rá   rz   )r¥   r   r    rö   r   r   )NNrG   )r¥   r   r#  r   r   r$  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¤   r­   rµ   Ústaticmethodr¹   rß   rõ   r"  rM  r;  r{   r3   r1   rŠ   rŠ     sC  € € € € € ðð ð !$Ø #Ø!Ø#'Ø#&Ø!$Ø#&Ø%(ØØØð9*ð 9*ð 9*ð 9*ð 9*ð~6ð 6ð 6ð 6ðJð Jð Jð Jð. ðPð Pð Pñ „\ðPð/4ð /4ð /4ð /4ðb ð0ð 0ð 0ñ „\ð0ðr %)ðu
ð u
ð u
ð u
ð u
ðt ØØ #ðQð Qð Qð Qð QðnJð Jð Jð Jð Jr3   rŠ   )r
   )r   r   r   r   r   r   )rF   rG   r
   )
rH   r   rI   r   rJ   r   r   r   r   r   )ru   r   rv   r   rw   r   r   r   )re  Ú
__future__r   Úpathlibr   ÚnumpyrV   ÚonnxruntimeÚortÚGlobalConfigr   Útable_grid_typesr   r   Úcommon_utilr	   rE   rt   rˆ   rŠ   r{   r3   r1   ú<module>ro     s*  ððBð BðH #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à Ð Ð Ð Ø Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø %Ð %Ð %Ð %Ð %Ð %ð  ðZ&ð Z&ð Z&ð Z&ð Z&ðF  ØØð	7<ð 7<ð 7<ð 7<ð 7<ð|"Nð "Nð "Nð "NðRjð jð jð jð jñ jô jð jð jð jr3   