
    i.                         S r SSKrSSKrSSKrSSKrSSKJr  SSKr " S S5      r	SS jr
S rS rS	 rS
 rS rS rS rS r " S S\5      rg)z
This code is refer from:
https://github.com/open-mmlab/mmocr/blob/main/mmocr/models/textdet/postprocess/drrg_postprocessor.py
    N)normc                   @    \ rS rSrS r\S 5       r\S 5       rS rSr	g)Node   c                 .    Xl         [        5       U l        g N)
_Node__indset_Node__links)selfinds     l/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddleocr/ppocr/postprocess/drrg_postprocess.py__init__Node.__init__   s    
u    c                     U R                   $ r   )r	   r   s    r   r   Node.ind!   s    zzr   c                 ,    [        U R                  5      $ r   )r
   r   r   s    r   links
Node.links%   s    4<<  r   c                 p    U R                   R                  U5        UR                   R                  U 5        g r   )r   add)r   	link_nodes     r   add_linkNode.add_link)   s(    #d#r   )__ind__linksN)
__name__
__module____qualname____firstlineno__r   propertyr   r   r   __static_attributes__ r   r   r   r      s4       ! !$r   r   c                 v   U R                   S:X  d   eU R                  S   S:X  d   eU R                  S   UR                  S   :X  d   eUR                   S:X  d   e[        U[        5      (       d   e[        R
                  " U SS9n 0 n[        U 5       H  u  pVUbv  X&S   S S24   R                  SS5      nX&S   S S24   R                  SS5      n[        R                  " USS9n	[        R                  " USS9n
[        X-
  5      nX:  a  SX'   US   US   4U;   a   SXFS   US   4   X   -   -  XFS   US   4'   M  X   XFS   US   4'   M     [        R
                  " [        R                  " U R                  5       5      5      nS[        R                  " [        R                  " U5      S-   [        R                  S	9-  n[        R                  " UR                  S   5      X'   X   nU Vs/ s H  n[!        U5      PM     nnU H   nUUS      R#                  UUS      5        M"     UU4$ s  snf )
N      r   axis            ?)dtype)ndimshape
isinstancefloatnpsort	enumeratereshapemeanr   uniqueflattenonesmaxint32aranger   r   )edgesscores
text_compsedge_len_thr
score_dictiedgebox1box2center1center2distancenodesmapping
order_indsnodeverticesr   s                     r   graph_propagationrP   .   s-   ::??;;q>Q;;q>V\\!_,,,??alE****GGE"EJU#!1grrk*221a8D1grrk*221a8Dggd+Gggd+GG-.H&	GT!W++.7DG+,vy8,JAwQ'( ,29JAwQ'( $  GGBIIemmo./E277BFF5MA-bhh??GYYu{{1~.GNJ',-utT
uH-Q!!(3q6"23  Z	 .s   5H6c                    [        U [        5      (       d   e[        U  Vs/ s H  n[        U[        5      PM     sn5      (       d   e[        U[        5      (       d   e[        U[
        5      (       d   e/ n[        U 5      n U (       a  U R                  5       nU1nU/nU(       a  UR                  S5      n[        UR                   Vs/ s H8  nU[        [        UR                  UR                  /5      5         U:  d  M6  UPM:     sn5      nUR                  U5        U R                  U5        UR                  U5        UR                  U5        U(       a  M  UR                  [        U5      5        U (       a  M  U$ s  snf s  snf )Nr   )r2   listallr   dictr3   r
   popr   tuplesortedr   difference_updateupdateextendappend)	rK   rC   link_thrrN   clusterscluster
node_queueneighbor	neighborss	            r   connected_componentsrb   R   sU   eT""""5954
4&59::::j$''''h&&&&HJE
yy{&V
>>!$D %)JJ$.!%(,,/G(H"IJhV $.I ''0##I.NN9%i( j 	W&# %$ O1 :s   F5F	F	c                    [        U [        5      (       d   e[        U  Vs/ s H  n[        U[        5      PM     sn5      (       d   e[        U  VVs/ s H  o"  H  n[        U[        5      PM     M     snn5      (       d   e[        U[        5      (       d   e[
        R                  " U5      n[        U 5       H  u  pRU H  nXTUR                  '   M     M     U$ s  snf s  snnf r   )	r2   rR   rS   r   intr4   zerosr6   r   )r]   	num_nodesr^   rN   node_labelscluster_inds         r   clusters2labelsri   o   s    h%%%%Bg
7D)BCCCChSh774
4&7&hSTTTTi%%%%((9%K )( 3D$/!  !4  CSs   C#C$
c                    U R                   S:X  d   eU R                  S   UR                  S   :X  d   e[        R                  " U5      n[        R                  " U5      nU HB  nX:H  n[        R
                  " U5      S:X  d  M#  SU[        R                  " U5      S   S   '   MD     [        [        U5      5       Vs/ s H  obU   (       a  M  UPM     nnXS S 24   nX   n	X4$ s  snf )Nr'   r   r(   )	r0   r1   r4   
zeros_liker9   sumwhererangelen)
rA   comp_pred_labelssingle_flagspred_labelslabelcurrent_label_flagrD   keep_indfiltered_text_compsfiltered_labelss
             r   remove_singlerx   |   s    ??aA"2"8"8";;;;==!12L)),-K-666$%*?@L"45a8;<  !%5!67O7aA7HO$q[1&0O//	 Ps   ?C'C'c                 B    U S   US   -
  S-  U S   US   -
  S-  -   S-  $ )Nr   r'   r(   r-   r%   )point1point2s     r   norm2r|      s6    AY"q(F1Iq	,Aa+GGCOOr   c                    [        U [        5      (       d   e[        U  Vs/ s H  n[        U[        5      PM     sn5      (       d   e[        U  VVs/ s H  o  H  n[        U[        5      PM     M     snn5      (       d   eU R	                  5       n/ n/ / /n0 n0 nUS   US'   US   US'   UR                  US   5        U(       Ga&  U H1  n[        XS   5      nXS   /Xh'   [        US   U5      n	US   U/Xy'   M3     [        UR                  5       5      n
[        UR                  5       5      nX::  aV  Xj   S   nXj   S   nUR                  SU R                  U5      U R                  U5      /5        UR                  U5        XS'   OTX{   S   nX{   S   nUR                  U R                  U5      U R                  U5      /5        UR                  U5        XS'   0 n0 nU(       a  GM&  [        R                  " [        R                  U5      n[!        [#        U5      UR                  S9nU$ s  snf s  snnf )Nr   r(   )key)r2   rR   rS   rd   copyremover|   minkeysinsertindexr[   	functoolsreduceoperatorconcatrW   r
   )pointspointcoordpoints_queueshortest_pathcurrent_edge
edge_dict0
edge_dict1length0length1key0key1startends                 r   min_connect_pathr      s(   fd####V<VE
5$'V<====FNF5u
5#&&FNOOOO;;=LM8LJJ"1oLO"1oLOQ(
!EE?3G#(q/":JLOU3G#/?E":J	 "
 :??$%:??$%<$Q'E"1%C  V\\%%8&,,s:K$LM&#O$Q'E"1%C  &,,u"5v||C7H!IJ$!O

/ ,2 $$X__mDM3}-=3F3FGMQ =Ns   H5#H:
c                 l    Uu  p#[         R                  " U [        U5      [        U5      4S5      S:  nU$ )NFr-   )cv2pointPolygonTestrd   )contr   xyis_inners        r   
in_contourr      s4    DA##D3q63q6*:EBSHHOr   c                 p   [        U [        5      (       d   e[        S U  5       5      (       d   e[        U[        5      (       d   e[        S U 5       5      (       d   eUR                  UR                  s=:X  a  S:X  d   e   e[        R
                  " XS S S2   -   5      nUS   US   -   S-  nUS   US   -   S-  nUS   US   -   S-  nUS   US   -   S-  n[        XE5      (       dG  U R                  SUS   R                  5       5        UR                  SUS   R                  5       5        OV[        XF5      (       dF  U R                  SUS   R                  5       5        UR                  SUS   R                  5       5        [        XG5      (       dG  U R                  US   R                  5       5        UR                  US   R                  5       5        X4$ [        XH5      (       dD  U R                  US   R                  5       5        UR                  US   R                  5       5        X4$ )	Nc              3   B   #    U  H  n[        U[        5      v   M     g 7fr   r2   rR   .0r   s     r   	<genexpr>fix_corner.<locals>.<genexpr>        =H5z%&&H   c              3   B   #    U  H  n[        U[        5      v   M     g 7fr   r   r   s     r   r   r      r   r   )r,   r'   r.   r      r'   r(   )
r2   rR   rS   r1   r4   arrayr   r   tolistr[   )	top_linebot_line	start_boxend_boxcontourstart_left_midstart_right_midend_left_midend_right_mids	            r   
fix_cornerr      s   h%%%%=H=====h%%%%=H=====??gmm5v55555hhx4R4.01GlYq\1Q6N |il2a7OAJ+q0LQZ'!*,1Mg..9Q<..019Q<..01119Q<..019Q<..01g,,
))+,
))+,  //
))+,
))+,r   c                 p   U R                   S:X  d   e[        U 5      [        U5      :X  d   e/ n[        U 5      S:  a  U$ [        S[        [        R
                  " U5      5      S-   5       GH?  n[        R                  " X:H  5      nXS S24   R                  S5      R                  [        R                  5      n[        R                  " XS4   5      nUR                  S   S:  a  M  UR                  S   S:  Ga  [        R                  " USS9R                  [        R                  5      R                  5       n[        U5      nXX   n[        R                  " US S 2SS2S S 24   SS9R                  [        R                  5      R                  5       n	[        R                  " US S 2SS2S S 24   SS9R                  [        R                  5      R                  5       n
[        XUS   US   5      u  pXS S S2   -   nOsUSSS2S S 24   R                  [        R                  5      R                  5       n	USSSS2S S 24   R                  [        R                  5      R                  5       n
X-   nU VVs/ s H  o  H  oPM     M     snnU/-   nUR                  U5        GMB     U$ s  snnf )	Nr'   r(   r   r+   )r.   r,   r'   r.   r)   r,   )r0   ro   rn   rd   r4   r<   rm   r7   astyper=   r8   r1   r   r   r   r[   )rA   rp   
boundariesrh   cluster_comp_indstext_comp_boxesscorecentersr   r   r   boundary_pointsr   pboundarys                  r   comps2boundariesr      sq   ??az?c"23333J
:QBFF+;$< = ABHH%5%DE"1",-55jAHHR 	 
b#89:  #a'""1%)ggoA6==bhhGNNPG,W5M-<O1Q3	2;BB288LSSU  1Q3	2;BB288LSSU  ",OA$68K"H '$B$7O 'q!A#qy188BIIKH&q!Ab&!|4;;BHHELLNH&1O#2B?%EqAEA?BeWL(#? CB  Cs   >J2c                   *    \ rS rSrSrS rS rS rSrg)DRRGPostprocessi	  zyMerge text components and construct boundaries of text instances.

Args:
    link_thr (float): The edge score threshold.
c                 >    [        U[        5      (       d   eXl        g r   )r2   r3   r\   )r   r\   kwargss      r   r   DRRGPostprocess.__init__  s    (E**** r   c                    Uu  p4nUGb#  [        U[        R                  5      (       a  UR                  5       n[        U[        R                  5      (       a  UR                  5       n[        U[        R                  5      (       a  UR                  5       n[	        U5      [	        U5      :X  d   eUR
                  S:X  d   eUR                  S   S:X  d   e[        X4U5      u  pg[        XgU R                  5      n[        XR                  S   5      n	[        XY5      u  pY[        XY5      n
O/ n
U R                  U
SUSSS24   -  R                  5       SSS2   5      u  p[        XS9/nU$ )a7  
Args:
    edges (ndarray): The edge array of shape N * 2, each row is a node
        index pair that makes up an edge in graph.
    scores (ndarray): The edge score array of shape (N,).
    text_comps (ndarray): The text components.

Returns:
    List[list[float]]: The predicted boundaries of text instances.
Nr'   r(   	   r   r.   )r   r@   )r2   paddleTensornumpyro   r0   r1   rP   rb   r\   ri   rx   r   resize_boundaryr   rT   )r   preds
shape_listr?   r@   rA   rO   rC   r]   rr   r   boxes_batchs               r   __call__DRRGPostprocess.__call__  sK    %*!z%//&&--00*fmm44'--/
u:V,,,??a'''##A&!+++#4UJ#O H+H$--PH)(4D4DQ4GHK&3J&L#J)*BJJ!11Z12..6682>

 :=>r   c           	         / n/ nU H  n[        U5      nUR                  US   5        [        R                  " USUS-
   5      [        R                  " USS [        US-
  S-  5      5      R                  SUS-
  5      -  R                  5       R                  5       nUR                  [        R                  " U5      R                  SS/5      5        M     X44$ )a  Rescale boundaries via scale_factor.

Args:
    boundaries (list[list[float]]): The boundary list. Each boundary
    with size 2k+1 with k>=4.
    scale_factor(ndarray): The scale factor of size (4,).

Returns:
    boundaries (list[list[float]]): The scaled boundaries.
r.   Nr(   r'   )	ro   r[   r4   r   tilerd   r7   r:   r   )r   r   scale_factorboxesr@   bszs          r   r   DRRGPostprocess.resize_boundary9  s     AQBMM!B%  HHQxa[)ww|BQ/b1f\1BCKKArTUvVX   LL!,,b!W56  }r   )r\   N)	r   r    r!   r"   __doc__r   r   r   r$   r%   r   r   r   r   	  s    !#Jr   r   )g      I@)r   r   r   r   r4   r   numpy.linalgr   r   r   rP   rb   ri   rx   r|   r   r   r   r   objectr   r%   r   r   <module>r      sg   
      
$ $$! H:
0"P*Z6'TIf Ir   