§
    �Wêjº]  ã                  óº   — d dl mZ d dlZd dlmZmZmZ 	 d dlm	Z	 n# e
$ r dZ	Y nw xY wd,d„Z	 	 	 	 d-d.d„Zd/d0d„Zd1d„Z	 	 	 d2d3d„Zd4d„Zd4d „Z	 	 	 	 	 	 d5d6d+„ZdS )7é    )ÚannotationsN)ÚListÚOptionalÚTuple)ÚcKDTreeÚnode_bboxesú
np.ndarrayÚmax_gap_distanceÚfloatÚreturnúTuple[np.ndarray, np.ndarray]c           
     óŽ  — | j         d         }g }g }| d d …df         | d d …df         | d d …df         | d d …df         f\  }}}}||z   dz  }	||z   dz  }
t          |¦  «        D �]C}|||         k    }t          j        |¦  «        �r/t          j        |¦  «        d         }t          j        dt          j        ||         ||         ¦  «        t          j        ||         ||         ¦  «        z
  ¦  «        }||dk             }t          |¦  «        dk    r ||         ||         z
  }t          j        |	|         |	|         z
  ¦  «        }|dz  |z   }|t          j	        |¦  «                 }|t          j	        |¦  «                 |k    r,| 
                    ||g¦  «         | 
                    d¦  «         |||         k     }t          j        |¦  «        �r/t          j        |¦  «        d         }t          j        dt          j        ||         ||         ¦  «        t          j        ||         ||         ¦  «        z
  ¦  «        }||dk             }t          |¦  «        dk    r ||         ||         z
  }t          j        |	|         |	|         z
  ¦  «        }|dz  |z   }|t          j	        |¦  «                 }|t          j	        |¦  «                 |k    r,| 
                    ||g¦  «         | 
                    d¦  «         |||         k     }t          j        |¦  «        �r/t          j        |¦  «        d         }t          j        dt          j        ||         ||         ¦  «        t          j        ||         ||         ¦  «        z
  ¦  «        }||dk             }t          |¦  «        dk    r ||         ||         z
  }t          j        |
|         |
|         z
  ¦  «        }|dz  |z   }|t          j	        |¦  «                 }|t          j	        |¦  «                 |k    r,| 
                    ||g¦  «         | 
                    d¦  «         |||         k    }t          j        |¦  «        �r/t          j        |¦  «        d         }t          j        dt          j        ||         ||         ¦  «        t          j        ||         ||         ¦  «        z
  ¦  «        }||dk             }t          |¦  «        dk    r ||         ||         z
  }t          j        |
|         |
|         z
  ¦  «        }|dz  |z   }|t          j	        |¦  «                 }|t          j	        |¦  «                 |k    r,| 
                    ||g¦  «         | 
                    d¦  «         �ŒEt          |¦  «        dk    rBt          j        g g gt          j        ¬¦  «        t          j        g t          j        ¬¦  «        fS t          j        |t          j        ¬¦  «        j        } t          j        |t          j        ¬¦  «        }!| |!fS )Nr   é   é   é   ç       @©Údtype)ÚshapeÚrangeÚnpÚanyÚwhereÚmaximumÚminimumÚlenÚabsÚargminÚappendÚarrayÚint64ÚT)"r   r
   ÚNÚedgesÚ
directionsÚx0Úy0Úx1Úy1ÚcxÚcyÚiÚ
above_maskÚabove_indicesÚhorizontal_overlapsÚvalid_aboveÚy_gapsÚx_distancesÚ	distancesÚclosest_idxÚ
below_maskÚbelow_indicesÚvalid_belowÚ	left_maskÚleft_indicesÚvertical_overlapsÚ
valid_leftÚx_gapsÚy_distancesÚ
right_maskÚright_indicesÚvalid_rightÚ
edge_indexÚedge_directionss"                                     ú�/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/pymupdf/layout/presidio/graph.pyÚfind_directional_neighborsrD      sì  € ØÔ˜!Ô€AØ€EØ€Jà     A Ô&¨°A°A°A°q°DÔ(9¸;ÀqÀqÀqÈ!ÀtÔ;LÈkÐZ[ÐZ[ÐZ[Ð]^ÐZ^ÔN_Ð_�N€BˆˆB�Ø
ˆr‰'�S‰€BØ
ˆr‰'�S‰€Bå�1‰XŒXð ?)ñ ?)ˆØ˜2˜aœ5’jˆ
ÝŒ6�*ÑÔñ 	)ÝœH ZÑ0Ô0°Ô3ˆMÝ"$¤*Ø•2”:˜b Ô/°°A´Ñ7Ô7½"¼*ÀRÈÔEVÐXZÐ[\ÔX]Ñ:^Ô:^Ñ^ñ#ô #Ðð (Ð(;¸aÒ(?Ô@ˆKÝ�;ÑÔ !Ò#Ð#Ø˜Kœ¨2¨a¬5Ñ0�Ý œf R¨¤_°r¸!´uÑ%<Ñ=Ô=�Ø" S™L¨;Ñ6�	Ø)­"¬)°IÑ*>Ô*>Ô?�Ø�RœY yÑ1Ô1Ô2Ð6FÒFÐFØ—L’L ! [Ð!1Ñ2Ô2Ð2Ø×%Ò% aÑ(Ô(Ð(à˜2˜aœ5’jˆ
ÝŒ6�*ÑÔñ 	)ÝœH ZÑ0Ô0°Ô3ˆMÝ"$¤*Ø•2”:˜b Ô/°°A´Ñ7Ô7½"¼*ÀRÈÔEVÐXZÐ[\ÔX]Ñ:^Ô:^Ñ^ñ#ô #Ðð (Ð(;¸aÒ(?Ô@ˆKÝ�;ÑÔ !Ò#Ð#Ø˜Aœ  K¤Ñ0�Ý œf R¨¤_°r¸!´uÑ%<Ñ=Ô=�Ø" S™L¨;Ñ6�	Ø)­"¬)°IÑ*>Ô*>Ô?�Ø�RœY yÑ1Ô1Ô2Ð6FÒFÐFØ—L’L ! [Ð!1Ñ2Ô2Ð2Ø×%Ò% aÑ(Ô(Ð(à˜"˜Qœ%’Zˆ	ÝŒ6�)ÑÔñ 	)Ýœ8 IÑ.Ô.¨qÔ1ˆLÝ "¤
Ø•2”:˜b Ô.°°1´Ñ6Ô6½¼ÀBÀ|ÔDTÐVXÐYZÔV[Ñ9\Ô9\Ñ\ñ!ô !Ðð &Ð&7¸!Ò&;Ô<ˆJÝ�:‰Œ Ò"Ð"Ø˜Aœ  J¤Ñ/�Ý œf R¨
¤^°b¸´eÑ%;Ñ<Ô<�Ø" S™L¨;Ñ6�	Ø(­¬°9Ñ)=Ô)=Ô>�Ø�RœY yÑ1Ô1Ô2Ð6FÒFÐFØ—L’L ! [Ð!1Ñ2Ô2Ð2Ø×%Ò% aÑ(Ô(Ð(à˜2˜aœ5’jˆ
ÝŒ6�*ÑÔñ 	)ÝœH ZÑ0Ô0°Ô3ˆMÝ "¤
Ø•2”:˜b Ô/°°A´Ñ7Ô7½"¼*ÀRÈÔEVÐXZÐ[\ÔX]Ñ:^Ô:^Ñ^ñ!ô !Ðð (Ð(9¸AÒ(=Ô>ˆKÝ�;ÑÔ !Ò#Ð#Ø˜Kœ¨2¨a¬5Ñ0�Ý œf R¨¤_°r¸!´uÑ%<Ñ=Ô=�Ø" S™L¨;Ñ6�	Ø)­"¬)°IÑ*>Ô*>Ô?�Ø�RœY yÑ1Ô1Ô2Ð6FÒFÐFØ—L’L ! [Ð!1Ñ2Ô2Ð2Ø×%Ò% aÑ(Ô(Ð(ùå
ˆ5�z„z�Q‚€ÝŒx˜˜R˜­¬Ð1Ñ1Ô1µ2´8¸BÅbÄhÐ3OÑ3OÔ3OÐOÐOå”˜%¥r¤xÐ0Ñ0Ô0Ô2€JÝ”h˜zµ´Ð:Ñ:Ô:€OØ�Ð&Ð&ó    ç      @Ú	toleranceÚmax_distanceúOptional[float]Ú
page_widthÚpage_heightc                óh  — | j         d         }|dk    r"t          j        g g gt          j        ¬¦  «        S | d d …df         | d d …df         | d d …df         | d d …df         f\  }}}}	||z   dz  }
||	z   dz  }g }t	          |¦  «        D �]_}t	          |dz   |¦  «        D �]G}|�D|
|         |
|         z
  }||         ||         z
  }t          j        ||z  ||z  z   ¦  «        |k    rŒIt          ||         ||         z
  ¦  «        |k    pCt          ||         ||         z
  ¦  «        |k    p!t          |
|         |
|         z
  ¦  «        |k    }t          ||         ||         z
  ¦  «        |k    pCt          |	|         |	|         z
  ¦  «        |k    p!t          ||         ||         z
  ¦  «        |k    }|s|r.|                     ||g¦  «         |                     ||g¦  «         �ŒI�Œa|s"t          j        g g gt          j        ¬¦  «        S t          j        |t          j        ¬¦  «        j        S )Nr   r   r   r   r   r   )	r   r   r    r!   r   Úsqrtr   r   r"   )r   rG   rH   rJ   rK   r#   r&   r'   r(   r)   r*   r+   r$   r,   ÚjÚdxÚdyÚ	aligned_xÚ	aligned_ys                      rC   Úfind_alignment_edgesrS   ^   sl  € ð 	Ô˜!Ô€AØˆA‚v€vÝŒx˜˜R˜­¬Ð1Ñ1Ô1Ð1à     A Ô&¨°A°A°A°q°DÔ(9¸;ÀqÀqÀqÈ!ÀtÔ;LÈkÐZ[ÐZ[ÐZ[Ð]^ÐZ^ÔN_Ð_�N€BˆˆB�Ø
ˆr‰'�S‰€BØ
ˆr‰'�S‰€Bà€EÝ�1‰XŒXð %ñ %ˆÝ�q˜1‘u˜a‘”ð 	%ñ 	%ˆAØÐ'Ø˜”U˜R œU‘]�Ø˜”U˜R œU‘]�Ý”7˜2 ™7 R¨"¡WÑ,Ñ-Ô-°Ò<Ð<Øõ ˜˜1œ  1¤™Ñ&Ô&¨)Ò3ð 7Ý˜2˜aœ5 2 a¤5™=Ñ)Ô)¨YÒ6ð7å˜2˜aœ5 2 a¤5™=Ñ)Ô)¨YÒ6ð õ ˜˜1œ  1¤™Ñ&Ô&¨)Ò3ð 7Ý˜2˜aœ5 2 a¤5™=Ñ)Ô)¨YÒ6ð7å˜2˜aœ5 2 a¤5™=Ñ)Ô)¨YÒ6ð ð ð %˜Ið %Ø—’˜a ˜VÑ$Ô$Ð$Ø—’˜a ˜VÑ$Ô$Ð$ùñ)	%ð, ð 2ÝŒx˜˜R˜­¬Ð1Ñ1Ô1Ð1ÝŒ8�E¥¤Ð*Ñ*Ô*Ô,Ð,rE   é   ÚkÚintc                ó  — | j         d         }|dk    s|dk    r"t          j        g g gt          j        ¬¦  «        S | d d …df         | d d …df         z   dz  }| d d …df         | d d …df         z   dz  }t          j        ||gd¬¦  «        }t
          �ôt          |¦  «        }t          |dz   |¦  «        }|                     ||¬¦  «        \  }}	|	j        dk    r"t          j        g g gt          j        ¬¦  «        S |	d d …dd …f         }
|
j         d         }t          j	        t          j
        |¦  «        |¦  «        }|
                     ¦   «         }t          j        ||gd¬¦  «                             t          j        ¦  «        S g }t          j
        |¦  «        }	t          |¦  «        D ]•}|||         z
  }|d d …df         dz  |d d …df         dz  z   }t          j        ||<   t          j        |	|f¦  «        }|d t          ||dz
  ¦  «        …         }|D ]&}|                     |t#          |¦  «        g¦  «         Œ'Œ–|s"t          j        g g gt          j        ¬¦  «        S t          j        |t          j        ¬¦  «        j        S )	Nr   r   r   r   r   r   ©Úaxis)rU   )r   r   r    r!   Ústackr   ÚminÚqueryÚndimÚrepeatÚarangeÚflattenÚastyper   ÚinfÚlexsortr   rV   r"   )r   rU   r#   r*   r+   ÚcentersÚtreeÚk_queryÚ_ÚindicesÚneighbor_indicesÚk_actualÚsrcÚdstr$   r,   ÚdiffsÚd2ÚorderÚnn_idxrN   s                        rC   Úfind_knn_edgesrq   Š   s‰  € ØÔ˜!Ô€AØˆA‚v€v��a’�ÝŒx˜˜R˜­¬Ð1Ñ1Ô1Ð1à
�a�a�a˜�dÔ
˜k¨!¨!¨!¨Q¨$Ô/Ñ
/°3Ñ	6€BØ
�a�a�a˜�dÔ
˜k¨!¨!¨!¨Q¨$Ô/Ñ
/°3Ñ	6€BÝŒh˜˜B�x aÐ(Ñ(Ô(€GåÐÝ�wÑÔˆÝ�a˜!‘e˜Q‘-”-ˆØ—Z’Z ¨7�ZÑ3Ô3‰
ˆˆ7ØŒ<˜1ÒÐÝ”8˜R ˜H­B¬HÐ5Ñ5Ô5Ð5Ø" 1 1 1 a b b 5œ>ÐØ#Ô)¨!Ô,ˆÝŒi�œ	 !™œ hÑ/Ô/ˆØ×&Ò&Ñ(Ô(ˆÝŒx˜˜c˜
¨Ð+Ñ+Ô+×2Ò2µ2´8Ñ<Ô<Ð<à€EÝŒi˜‰lŒl€GÝ�1‰XŒXð &ð &ˆØ˜' !œ*Ñ$ˆØ�1�1�1�a�4Œ[˜AÑ  a a a¨ d¤¨qÑ 0Ñ0ˆÝ”ˆˆ1‰Ý”
˜G R˜=Ñ)Ô)ˆØ��˜Q  A¡™œ�Ô'ˆØð 	&ð 	&ˆAØ�LŠL˜!�S ™VœV˜Ñ%Ô%Ð%Ð%ð	&àð 2ÝŒx˜˜R˜­¬Ð1Ñ1Ô1Ð1ÝŒ8�E¥¤Ð*Ñ*Ô*Ô,Ð,rE   rA   c                ó²	  ‡— |j         d         }|dk    r t          j        dt          j        ¬¦  «        S dŠ| |d                  }| |d                  }|dd…df         |dd…df         z
  }|dd…df         |dd…df         z
  }|dd…df         |dd…df         z
  }|dd…df         |dd…df         z
  }t          j        |dd…df         |dd…df         ¦  «        }	t          j        |dd…df         |dd…df         ¦  «        }
t          j        |dd…df         |dd…df         ¦  «        }t          j        |dd…df         |dd…df         ¦  «        }||	z
  }||
z
  }ˆfd	„} ||¦  «        } ||¦  «        } ||¦  «        } ||¦  «        } ||¦  «        } ||¦  «        }g }|                     |dd…df         |dd…df         z
  |z  ¦  «         |                     |dd…df         |dd…df         z
  |z  ¦  «         |                     |dd…df         |dd…df         z
  |z  ¦  «         |                     |dd…df         |dd…df         z
  |z  ¦  «         |                     t          j        ||z  ¦  «        ¦  «         |                     t          j        ||z  ¦  «        ¦  «         |                     |dd…df         |	z
  |z  ¦  «         |                     |dd…df         |
z
  |z  ¦  «         |                     |	|dd…df         z
  |z  ¦  «         |                     |
|dd…df         z
  |z  ¦  «         |                     t          j        ||z  ¦  «        ¦  «         |                     t          j        ||z  ¦  «        ¦  «         |                     |dd…df         |	z
  |z  ¦  «         |                     |dd…df         |
z
  |z  ¦  «         |                     |	|dd…df         z
  |z  ¦  «         |                     |
|dd…df         z
  |z  ¦  «         |                     t          j        ||z  ¦  «        ¦  «         |                     t          j        ||z  ¦  «        ¦  «         t          j        |d¬
¦  «         	                    t          j        ¦  «        }t          j
        |ddd¬¦  «        S )am  
    Compute SCE-style 18-d edge features (relative positions, scale, enclosing box).
    See external/sce train/infer/common_util get_edge_transform_bbox and docs/EDGE_FEATURES.md.

    S = source (edge_index[0]), O = target (edge_index[1]). R = enclosing bbox of S and O.
    Bboxes [x0, y0, x1, y1] (same as Presidio).

    Returns:
        [E, 18] float32.
    r   r   )r   é   r   ç�íµ ÷Æ°>Nr   r   c                ó8   •— t          j        | dk    ‰| ¦  «        S )Nr   )r   r   )ÚxÚepss    €rC   ú<lambda>z.compute_sce_edge_features_18.<locals>.<lambda>Ð   s   ø€ •R”X˜a 1šf c¨1Ñ-Ô-€ rE   rX   g        g     jø@g     jøÀ)ÚnanÚposinfÚneginf)r   r   ÚzerosÚfloat32r   r   r   ÚlogrZ   ra   Ú
nan_to_num)r   rA   ÚEÚSÚOÚswÚshÚowÚohÚR_x1ÚR_y1ÚR_x2ÚR_y2ÚrwÚrhÚsafeÚsw_Úsh_Úow_Úoh_Úrw_Úrh_ÚfÚoutrw   s                           @rC   Úcompute_sce_edge_features_18r–   ®   s÷  ø€ ð 	Ô˜Ô€AØˆA‚v€vÝŒx˜¥r¤zÐ2Ñ2Ô2Ð2à
€CØ�J˜q”MÔ"€AØ�J˜q”MÔ"€Aà	
ˆ1ˆ1ˆ1ˆaˆ4Œ�1�Q�Q�Q˜�T”7Ñ	€BØ	
ˆ1ˆ1ˆ1ˆaˆ4Œ�1�Q�Q�Q˜�T”7Ñ	€BØ	
ˆ1ˆ1ˆ1ˆaˆ4Œ�1�Q�Q�Q˜�T”7Ñ	€BØ	
ˆ1ˆ1ˆ1ˆaˆ4Œ�1�Q�Q�Q˜�T”7Ñ	€BåŒ:�a˜˜˜˜1˜”g˜q    A œwÑ'Ô'€DÝŒ:�a˜˜˜˜1˜”g˜q    A œwÑ'Ô'€DÝŒ:�a˜˜˜˜1˜”g˜q    A œwÑ'Ô'€DÝŒ:�a˜˜˜˜1˜”g˜q    A œwÑ'Ô'€DØ	�‰€BØ	�‰€Bà-Ð-Ð-Ð-€DØ
ˆ$ˆr‰(Œ(€CØ
ˆ$ˆr‰(Œ(€CØ
ˆ$ˆr‰(Œ(€CØ
ˆ$ˆr‰(Œ(€CØ
ˆ$ˆr‰(Œ(€CØ
ˆ$ˆr‰(Œ(€Cà
€AØ‡H‚Hˆa����1�Œg˜˜!˜!˜!˜Q˜$œÑ 3Ñ&Ñ'Ô'Ð'Ø‡H‚Hˆa����1�Œg˜˜!˜!˜!˜Q˜$œÑ 3Ñ&Ñ'Ô'Ð'Ø‡H‚Hˆa����1�Œg˜˜!˜!˜!˜Q˜$œÑ 3Ñ&Ñ'Ô'Ð'Ø‡H‚Hˆa����1�Œg˜˜!˜!˜!˜Q˜$œÑ 3Ñ&Ñ'Ô'Ð'Ø‡H‚H�RŒV�C˜#‘IÑÔÑÔÐØ‡H‚H�RŒV�C˜#‘IÑÔÑÔÐØ‡H‚Hˆa����1�Œg˜‰n Ñ#Ñ$Ô$Ð$Ø‡H‚Hˆa����1�Œg˜‰n Ñ#Ñ$Ô$Ð$Ø‡H‚Hˆd�Q�q�q�q˜!�t”W‰n Ñ#Ñ$Ô$Ð$Ø‡H‚Hˆd�Q�q�q�q˜!�t”W‰n Ñ#Ñ$Ô$Ð$Ø‡H‚H�RŒV�C˜#‘IÑÔÑÔÐØ‡H‚H�RŒV�C˜#‘IÑÔÑÔÐØ‡H‚Hˆa����1�Œg˜‰n Ñ#Ñ$Ô$Ð$Ø‡H‚Hˆa����1�Œg˜‰n Ñ#Ñ$Ô$Ð$Ø‡H‚Hˆd�Q�q�q�q˜!�t”W‰n Ñ#Ñ$Ô$Ð$Ø‡H‚Hˆd�Q�q�q�q˜!�t”W‰n Ñ#Ñ$Ô$Ð$Ø‡H‚H�RŒV�C˜#‘IÑÔÑÔÐØ‡H‚H�RŒV�C˜#‘IÑÔÑÔÐå
Œ(�1˜1Ð
Ñ
Ô
×
$Ò
$¥R¤ZÑ
0Ô
0€CÝŒ=˜ #¨c¸$Ð?Ñ?Ô?Ð?rE   rB   úOptional[np.ndarray]Únode_font_sizesÚnode_draw_ordersc                ó  — |j         d         }|dk    r t          j        dt          j        ¬¦  «        S | dd…df         | dd…df         | dd…df         | dd…df         f\  }}	}
}||
z   dz  }|	|z   dz  }|
|z
  }||	z
  }|d         }|d         }||         |	|         |
|         ||         f\  }}}}||         |	|         |
|         ||         f\  }}}}||         ||         }}||         ||         }}||         ||         }}||         ||         }!} ||z
  |z  }"||z
  |z  }#t          j        |t          j        ¬¦  «        }$||k     }%||k     }&||%         ||%         z
  |$|%<   ||&         ||&         z
   |$|&<   t          j        |t          j        ¬¦  «        }'||k     }(||k     })||(         ||(         z
  |'|(<   ||)         ||)         z
   |'|)<   t          j        dt          j        ||¦  «        t          j        ||¦  «        z
  ¦  «        }*t          j        dt          j        ||¦  «        t          j        ||¦  «        z
  ¦  «        }+|*t          j        t          j        || ¦  «        d	¦  «        z  },|+t          j        t          j        ||!¦  «        d	¦  «        z  }-|*|+z  }.||z  }/| |!z  }0|/|0z   |.z
  }1|.t          j        |1d	¦  «        z  }2|.t          j        |/d	¦  «        z  }3|.t          j        |0d	¦  «        z  }4t          j        t          j        | t          j        |d	¦  «        z  d	¦  «        ¦  «        }5t          j        t          j        |!t          j        |d	¦  «        z  d	¦  «        ¦  «        }6t          j        |d
ft          j        ¬¦  «        }7|�6t          |¦  «        |k    r#|dk    |dk    z  }8d|7|8||8         f<   d|7|8 df<   n‚t          j        |"¦  «        }9t          j        |#¦  «        }:|9|:k     };|9|:k    }<|; |< z  }=|;|#dk    z  }>|;|#dk    z  }?|<|"dk    z  }@|<|"dk    z  }Ad|7|?df<   d|7|>df<   d|7|Adf<   d|7|@df<   d|7|=df<   ||z
  |z  }B||z
  |z  }C||z
  |z  }D||z
  |z  }E||z
  |z  }F||z
  |z  }Gt          j	        |"|#|$|z  |'|z  |,|-|5|6|B|C|D|E|F|G|2|3|4gd¬¦  «         
                    t          j        ¦  «        }Ht          j        |H|7gd¬¦  «        }I|��(t          |¦  «        dk    �r||         }J||         }Kd	}Ld}Mt          j        |J|M¦  «        }Nt          j        |K|M¦  «        }O|Nt          j        |O|L¦  «        z  }Pd}Qd}Rt          j        |P|R|Q¦  «        }Pt          j        |P¦  «        }St          j        |S¦  «        }T|J|Mk    |Jdk     z  }U|K|Mk    |Kdk     z  }V|U|Vz   
                    t          j        ¦  «        }W|S|Wz  }S|T|Wz  }Tt          j	        |S|Tgd¬¦  «         
                    t          j        ¦  «        }Xn"t          j        |dft          j        ¬¦  «        }Xt          j        |I|Xgd¬¦  «        }I|�Bt          |¦  «        dk    r/||         }Y||         }Z|Z|Yz
  }[t          j        |[dd¦  «        dz  }[n t          j        |t          j        ¬¦  «        }[|[                     dd¦  «        }\t          j        |I|\gd¬¦  «        }It          | |¦  «        }]t          j        |I|]gd¬¦  «        }I|IS )uò  
    Compute edge features for each edge (vectorized).
    Appends SCE 18-d features (see compute_sce_edge_features_18) Â¡Ã¦ [E, 43].

    Edge features (25-d base):
    - normalized_dx = (cx_j - cx_i) / page_width
    - normalized_dy = (cy_j - cy_i) / page_height
    - signed_gap_x (horizontal gap)
    - signed_gap_y (vertical gap)
    - x_overlap_ratio
    - y_overlap_ratio
    - log(w_j / w_i) (relative width ratio)
    - log(h_j / h_i) (relative height ratio)
    - delta_left = (x0_j - x0_i) / page_width (left-to-left delta)
    - delta_right = (x1_j - x1_i) / page_width (right-to-right delta)
    - delta_center_horizontal = (cx_j - cx_i) / page_width (horizontal center delta)
    - delta_top = (y0_j - y0_i) / page_height (top edge delta)
    - delta_bottom = (y1_j - y1_i) / page_height (bottom edge delta)
    - delta_middle = (cy_j - cy_i) / page_height (vertical center/middle delta)
    - iou = intersection_area / union_area (Intersection over Union - 2D overlap)
    - ioa_i = intersection_area / area_i (Intersection over Area of node i)
    - ioa_j = intersection_area / area_j (Intersection over Area of node j)
    - direction one-hot: {up, down, left, right, other} (5 dims)
    - font_log_ratio = log(font_size_u / font_size_v) (font size contrast)
    - font_abs_log_ratio = |log(font_size_u / font_size_v)| (absolute font size contrast)
    - delta_draw_order = draw_order_j - draw_order_i (difference of normalized draw orders)

    Args:
        node_bboxes: Array of shape [N, 4] - [x0, y0, x1, y1]
        edge_index: Array of shape [2, E] - edge indices
        page_width: Page width in points
        page_height: Page height in points
        edge_directions: Optional array of shape [E] - direction labels (0=up, 1=down, 2=left, 3=right)
        node_font_sizes: Optional array of shape [N] - font sizes per node (font_size_median or font_size)
        node_draw_orders: Optional array of shape [N] - draw order indices (0-indexed) per node

    Returns:
        Edge feature matrix [E, 43].
    r   r   ©r   é+   r   Nr   r   r   rt   é   g      ð?é   rX   g      $@gš™™™™™¹?g     @�@iöÿÿÿé
   éÿÿÿÿ)r   r   r|   r}   r   r   r~   r   r   rZ   ra   ÚconcatenateÚclipÚreshaper–   )^r   rA   rJ   rK   rB   r˜   r™   r€   r&   r'   r(   r)   r*   r+   ÚwÚhrk   rl   Úx0_iÚy0_iÚx1_iÚy1_iÚx0_jÚy0_jÚx1_jÚy1_jÚcx_iÚcy_iÚcx_jÚcy_jÚw_iÚh_iÚw_jÚh_jrO   rP   Úgap_xÚleft_ofÚright_ofÚgap_yÚaboveÚbelowÚ	x_overlapÚ	y_overlapÚx_overlap_ratioÚy_overlap_ratioÚintersection_areaÚarea_iÚarea_jÚ
union_areaÚiouÚioa_iÚioa_jÚlog_w_ratioÚlog_h_ratioÚdirection_onehotÚ
valid_dirsÚabs_dxÚabs_dyÚverticalÚ
horizontalÚdiagonalÚdownÚupÚrightÚleftÚ
delta_leftÚdelta_rightÚdelta_center_horizontalÚ	delta_topÚdelta_bottomÚdelta_middleÚfeaturesÚedge_featuresÚfont_size_iÚfont_size_jÚEPSÚMIN_FONT_SIZEÚfont_size_i_safeÚfont_size_j_safeÚ
font_ratioÚ	MAX_RATIOÚ	MIN_RATIOÚfont_log_ratioÚfont_abs_log_ratioÚvalid_iÚvalid_jÚ
font_validÚfont_featuresÚdraw_order_iÚdraw_order_jÚdelta_draw_orderÚdraw_order_featureÚsces^                                                                                                 rC   Úcompute_edge_featuresrð   ð   s  € ð` 	Ô˜Ô€AØˆA‚v€vÝŒx˜¥r¤zÐ2Ñ2Ô2Ð2ð !    A Ô&¨°A°A°A°q°DÔ(9¸;ÀqÀqÀqÈ!ÀtÔ;LÈkÐZ[ÐZ[ÐZ[Ð]^ÐZ^ÔN_Ð_�N€BˆˆB�Ø
ˆr‰'�S‰€BØ
ˆr‰'�S‰€BØ
ˆR‰€AØ
ˆR‰€Að �QŒ-€CØ
�QŒ-€Cð   œW b¨¤g¨r°#¬w¸¸3¼Ð?Ñ€Dˆ$��dØ œW b¨¤g¨r°#¬w¸¸3¼Ð?Ñ€Dˆ$��dØ�C”˜"˜Sœ'ˆ$€DØ�C”˜"˜Sœ'ˆ$€DØ�Œv�q˜”vˆ€CØ�Œv�q˜”vˆ€Cð �‰+˜Ñ	#€BØ
�‰+˜Ñ	$€Bõ ŒH�Q�bœjÐ)Ñ)Ô)€EØ�TŠk€GØ�dŠ{€HØ˜'”] T¨'¤]Ñ2€Eˆ'�NØ˜Xœ¨¨h¬Ñ7Ð8€Eˆ(�Oõ ŒH�Q�bœjÐ)Ñ)Ô)€EØ�4ŠK€EØ�4ŠK€EØ˜”;  e¤Ñ,€Eˆ%�LØ˜%”[ 4¨¤;Ñ.Ð/€Eˆ%�Lõ ”
˜1�bœj¨¨tÑ4Ô4µr´zÀ$ÈÑ7MÔ7MÑMÑNÔN€IÝ”
˜1�bœj¨¨tÑ4Ô4µr´zÀ$ÈÑ7MÔ7MÑMÑNÔN€IØ¥"¤*­R¬Z¸¸SÑ-AÔ-AÀ4Ñ"HÔ"HÑH€OØ¥"¤*­R¬Z¸¸SÑ-AÔ-AÀ4Ñ"HÔ"HÑH€Oð " IÑ-ÐØ�3‰Y€FØ�3‰Y€FØ˜&‘Ð#4Ñ4€Jð �bœj¨°TÑ:Ô:Ñ
:€Cð ¥¤
¨6°4Ñ 8Ô 8Ñ8€Eð ¥¤
¨6°4Ñ 8Ô 8Ñ8€Eõ ”&�œ C­"¬*°S¸$Ñ*?Ô*?Ñ$?ÀÑFÔFÑGÔG€KÝ”&�œ C­"¬*°S¸$Ñ*?Ô*?Ñ$?ÀÑFÔFÑGÔG€Kõ ”x  A ­b¬jÐ9Ñ9Ô9ÐàÐ"¥s¨?Ñ';Ô';¸qÒ'@Ð'@à%¨Ò*¨À!Ò/CÑDˆ
ØDGÐ˜ _°ZÔ%@Ð@ÑAØ+.Ð˜*˜ a˜Ñ(Ð(õ ”˜‘”ˆÝ”˜‘”ˆà˜F’?ˆØ˜f’_ˆ
Ø�9 
˜{Ñ*ˆà˜2 š6Ñ"ˆØ˜˜qšÑ!ˆØ˜b 1šfÑ%ˆØ˜R 1šWÑ%ˆà"%Ð˜˜Q˜ÑØ$'Ð˜˜q˜Ñ!Ø$'Ð˜˜q˜Ñ!Ø%(Ð˜ ˜Ñ"Ø(+Ð˜ 1˜Ñ%ð ˜‘+ Ñ+€JØ˜$‘; *Ñ,€Kð  $ d™{¨jÑ8ÐØ˜‘ Ñ+€IØ˜4‘K ;Ñ.€LØ˜4‘K ;Ñ.€Lõ ŒxØ
ˆBØ�
ÑØ�ÑØØØØØØØØØØØØØð!ð" ð#ñ ô ÷" Šv•b”jÑ!Ô!ð# õ( ”N HÐ.>Ð#?ÀaÐHÑHÔH€Mð Ñ"¥s¨?Ñ';Ô';¸aÒ'?Ñ'?à% cÔ*ˆØ% cÔ*ˆð ˆØˆõ œ: k°=ÑAÔAÐÝœ: k°=ÑAÔAÐð &­¬
Ð3CÀSÑ(IÔ(IÑIˆ
ð ˆ	Øˆ	Ý”W˜Z¨°IÑ>Ô>ˆ
õ œ 
Ñ+Ô+ˆõ  œV NÑ3Ô3Ðð  -Ò/°KÀ&Ò4HÑIˆØ -Ò/°KÀ&Ò4HÑIˆØ Ñ'×/Ò/µ´
Ñ;Ô;ˆ
ð (¨*Ñ4ˆØ/°*Ñ<Ðõ œØØð"
ð ðñ ô ÷ ’6�"œ*Ñ%Ô%ð 	ˆõ œ ! Q ­r¬zÐ:Ñ:Ô:ˆõ ”N M°=Ð#AÈÐJÑJÔJ€MàÐ#­Ð,<Ñ(=Ô(=ÀÒ(AÐ(AØ'¨Ô,ˆØ'¨Ô,ˆØ'¨,Ñ6Ðåœ7Ð#3°S¸"Ñ=Ô=ÀÑDÐÐåœ8 A­R¬ZÐ8Ñ8Ô8Ðà)×1Ò1°"°aÑ8Ô8ÐÝ”N MÐ3EÐ#FÈQÐOÑOÔO€MÝ
& {°JÑ
?Ô
?€CÝ”N M°3Ð#7¸aÐ@Ñ@Ô@€MØÐrE   ú	List[str]c                 ó
   — g d¢S )z[Names for SCE 18-d edge features (see compute_sce_edge_features_18, docs/EDGE_FEATURES.md).)Úsce_src_tgt_dx_w1Úsce_src_tgt_dy_h1Úsce_tgt_src_dx_w2Úsce_tgt_src_dy_h2Úsce_log_w1_w2Úsce_log_h1_h2Úsce_src_left_rÚsce_src_top_rÚsce_r_left_srcÚsce_r_top_srcÚsce_log_w1_rwÚsce_log_h1_rhÚsce_tgt_left_rÚsce_tgt_top_rÚsce_r_left_tgtÚsce_r_top_tgtÚsce_log_w2_rwÚsce_log_h2_rh© r  rE   rC   Úget_sce_edge_feature_namesr  ã  s   € ðð ð ð rE   c                 ó(   — g d¢t          ¦   «         z   S )zUNames of edge features in compute_edge_features output order (43-d, includes SCE 18).)rO   rP   Ú
gap_x_normÚ
gap_y_normr¾   r¿   rÇ   rÈ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÄ   rÅ   rÆ   Údirection_upÚdirection_downÚdirection_leftÚdirection_rightÚdirection_diagonalrå   ræ   rí   )r  r  rE   rC   Úget_edge_feature_namesr  ï  s&   € ðð ð õ 	#Ñ$Ô$ñ%ð %rE   ç     @@FúList[List[float]]Ú	k_nearestÚalignment_toleranceÚuse_alignment_edgesÚboolúOptional[List[float]]úOptional[List[int]]ú)Tuple[np.ndarray, np.ndarray, np.ndarray]c	           	     ób	  ‡— t          j        | t           j        ¬¦  «        }	|	j        d         }
|
dk    rat          j        g g gt           j        ¬¦  «        t          j        dt           j        ¬¦  «        t          j        g t           j        ¬¦  «        fS |
dk    rdt          j        dgdggt           j        ¬¦  «        t          j        dt           j        ¬¦  «        t          j        dgt           j        ¬¦  «        fS i Šg }t          |	|¦  «        \  }}|j        d         dk    r‚t          |j        d         ¦  «        D ]g}t          |d|f         ¦  «        t          |d|f         ¦  «        }}||f}|‰vr/t          ||         ¦  «        ‰|<   | 	                    ||g¦  «         Œht          |	|¦  «        }|j        d         dk    rot          |j        d         ¦  «        D ]T}t          |d|f         ¦  «        t          |d|f         ¦  «        }}||f}|‰vrd‰|<   | 	                    ||g¦  «         ŒU|r´t          j        |dz  |dz  z   ¦  «        dz  }t          |	||||¬	¦  «        }|j        d         dk    rot          |j        d         ¦  «        D ]T}t          |d|f         ¦  «        t          |d|f         ¦  «        }}||f}|‰vrd‰|<   | 	                    ||g¦  «         ŒUt          |¦  «        dk    rö|
d
k    rOt          |
¦  «        D ]>}t          |
¦  «        D ],}||k    r$||f}|‰vrd‰|<   | 	                    ||g¦  «         Œ-Œ?n¡t          |	t          ||
dz
  ¦  «        ¦  «        }|j        d         dk    rot          |j        d         ¦  «        D ]T}t          |d|f         ¦  «        t          |d|f         ¦  «        }}||f}|‰vrd‰|<   | 	                    ||g¦  «         ŒU|}ˆfd„|D ¦   «         }t          j        |t           j        ¬¦  «        j        }t          j        |t           j        ¬¦  «        }|� t          j        |t           j        ¬¦  «        nd }|� t          j        |t           j        ¬¦  «        nd }t!          |	||||||¬¦  «        }|||fS )Nr   r   r›   r   )r   rœ   rž   r   g      à?)rH   rJ   rK   rŸ   c                ó*   •— g | ]\  }}‰||f         ‘ŒS r  r  )Ú.0r,   rN   Úall_edges_dicts      €rC   ú
<listcomp>zbuild_graph.<locals>.<listcomp>R  s&   ø€ ÐCÐCÐC±°°A�n a¨ VÔ,ÐCÐCÐCrE   )rB   r˜   r™   )r   r    r}   r   r!   r|   rD   r   rV   r   rq   rM   rS   r   r[   r"   rð   )r   rJ   rK   r  r  r
   r  r˜   r™   Únode_bboxes_arrr#   Úall_edges_listÚnn_edgesÚnn_directionsÚer,   rN   Úedge_keyÚ	knn_edgesÚmax_alignment_distanceÚalign_edgesÚ	all_edgesÚall_directionsrA   rB   Únode_font_sizes_arrÚnode_draw_orders_arrrÛ   r  s                               @rC   Úbuild_graphr+  ü  s   ø€ õ ”h˜{µ"´*Ð=Ñ=Ô=€OØÔ˜aÔ €AàˆA‚v€våŒH�b˜"�X¥R¤XÐ.Ñ.Ô.ÝŒH�W¥B¤JÐ/Ñ/Ô/ÝŒH�R�rœxÐ(Ñ(Ô(ð
ð 	
ð 	ˆA‚v€våŒH�q�c˜A˜3�Z¥r¤xÐ0Ñ0Ô0ÝŒH�W¥B¤JÐ/Ñ/Ô/ÝŒH�a�S¥¤Ð)Ñ)Ô)ð
ð 	
ð €NØ€Nå8¸ÐJZÑ[Ô[Ñ€HˆmØ„~�aÔ˜1ÒÐÝ�x”~ aÔ(Ñ)Ô)ð 	.ð 	.ˆAÝ�x  1 ”~Ñ&Ô&­¨H°Q¸°T¬NÑ(;Ô(;ˆqˆAØ˜1�vˆHØ˜~Ð-Ð-Ý+.¨}¸QÔ/?Ñ+@Ô+@�˜xÑ(Ø×%Ò% q¨! fÑ-Ô-Ð-øå˜°	Ñ:Ô:€IØ„�qÔ˜AÒÐÝ�y” qÔ)Ñ*Ô*ð 	.ð 	.ˆAÝ�y  A ”Ñ'Ô'­¨Y°q¸!°t¬_Ñ)=Ô)=ˆqˆAØ˜1�vˆHØ˜~Ð-Ð-Ø+,�˜xÑ(Ø×%Ò% q¨! fÑ-Ô-Ð-øàð 2Ý!#¤¨°q©¸;È!Ñ;KÑ)KÑ!LÔ!LÈsÑ!RÐÝ*ØØØ/Ø!Ø#ð
ñ 
ô 
ˆð Ô˜QÔ !Ò#Ð#Ý˜;Ô,¨QÔ/Ñ0Ô0ð 2ð 2�Ý˜; q¨! tÔ,Ñ-Ô-­s°;¸qÀ!¸tÔ3DÑ/EÔ/E�1�Ø˜q˜6�Ø >Ð1Ð1Ø/0�N 8Ñ,Ø"×)Ò)¨1¨a¨&Ñ1Ô1Ð1øå
ˆ>ÑÔ˜aÒÐØ�Š7ˆ7Ý˜1‘X”Xð :ð :�Ý˜q™œð :ð :�AØ˜A’v�vØ$% q 6˜Ø#¨>Ð9Ð9Ø78˜N¨8Ñ4Ø*×1Ò1°1°a°&Ñ9Ô9Ð9øð:ð:õ ' ½¸IÀqÈ1ÁuÑ8MÔ8MÑNÔNˆIØŒ˜qÔ! AÒ%Ð%Ý˜yœ¨qÔ1Ñ2Ô2ð 6ð 6�AÝ˜y¨¨A¨œÑ/Ô/µ°Y¸qÀ!¸t´_Ñ1EÔ1E�q�AØ ! 1˜v�HØ ~Ð5Ð5Ø34˜ xÑ0Ø&×-Ò-¨q°!¨fÑ5Ô5Ð5øà€IØCÐCÐCÐC¸ÐCÑCÔC€Nå”˜)­2¬8Ð4Ñ4Ô4Ô6€JÝ”h˜~µR´XÐ>Ñ>Ô>€OàIXÐId�"œ( ?½"¼*ÐEÑEÔEÐEÐjnÐØK[ÐKg�2œ8Ð$4½B¼JÐGÑGÔGÐGÐmqÐå)ØØØØØ'Ø+Ø-ðñ ô €Mð �} oÐ5Ð5rE   )r   r	   r
   r   r   r   )rF   NNN)r   r	   rG   r   rH   rI   rJ   rI   rK   rI   r   r	   )rT   )r   r	   rU   rV   r   r	   )r   r	   rA   r	   r   r	   )NNN)r   r	   rA   r	   rJ   r   rK   r   rB   r—   r˜   r—   r™   r—   r   r	   )r   rñ   )rT   rF   r  FNN)r   r  rJ   r   rK   r   r  rV   r  r   r
   r   r  r  r˜   r  r™   r  r   r  )Ú
__future__r   Únumpyr   Útypingr   r   r   Úscipy.spatialr   Ú	ExceptionrD   rS   rq   r–   rð   r  r  r+  r  rE   rC   ú<module>r1     sƒ  ðØ "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ðØ%Ð%Ð%Ð%Ð%Ð%Ð%øØð ð ð Ø€G€G€GðøøøðO'ð O'ð O'ð O'ðh Ø(,Ø&*Ø'+ð)-ð )-ð )-ð )-ð )-ðX!-ð !-ð !-ð !-ð !-ðH?@ð ?@ð ?@ð ?@ðN 15Ø04Ø15ðpð pð pð pð pðf	ð 	ð 	ð 	ð
%ð 
%ð 
%ð 
%ð" Ø%(Ø"'Ø$)Ø15Ø04ðh6ð h6ð h6ð h6ð h6ð h6ð h6s   – �'¦'