
    khf                     8    d dl Z d dlmZ ddZddZddZddZy)	    N)	OmegaConfc           	      t  	 t        j                         }|xs d}|| z
  dz   }t        |      D ci c]	  }| |z   |g c}		fd}	fd}t        j                  |      }g |_        t        |dz
  | dz
  d      D ]O  }|j
                  j                  | ||       ||dz         g|d       	|   j                  t        |             Q t        | dz   |dz         D ]Q  }|j
                  j                  | ||       ||dz
        gz   |d       	|   j                  t        |             S |S c c}w )zBiFPN config.
    Adapted from https://github.com/google/automl/blob/56815c9986ffd4b508fe1d68508e268d129715c1/efficientdet/keras/fpn_configs.py
    fastattn   c                     |    d   S N levelnode_idss    T/var/www/teggl/fontify/venv/lib/python3.12/site-packages/effdet/config/fpn_config.py<lambda>zbifpn_config.<locals>.<lambda>       (5/""5     c                     |    S Nr
   r   s    r   r   zbifpn_config.<locals>.<lambda>       (5/ r   r	   
feat_levelinputs_offsetsweight_methodr   createrange	itertoolscountnodesappendnext)
	min_level	max_levelr   p
num_levelsilevel_last_idlevel_all_idsid_cntr   s
            @r   bifpn_configr)      sL    	A!/ZMY&*J,1*,=>q	As">H5M1M__Z(FAG9q=)a-4 )	,Q/q1u1EF*
 	
 	4<() 9q=)a-0 )	+A.-A2F1GG*
 	
 	4<() H1 ?s   D5c                   	 t        j                         }|xs d}|| z
  dz   }t        |      D ci c]	  }| |z   |g c}		fd}t        j                  |      }g |_        t        || dz
  d      D ]_  }||k7  r ||       ||dz         gn ||      g}|j
                  j                  |||d       	|   j                  t        |             a t        | |dz         D ]_  }|| k7  r ||       ||dz
        gn ||      g}|j
                  j                  |||d       	|   j                  t        |             a |S c c}w )zPAN FPN config.

    This defines FPN layout from Path Aggregation Networks as an alternate to
    BiFPN, it does not implement the full PAN spec.

    Paper: https://arxiv.org/abs/1803.01534
    r   r   c                     |    d   S r   r
   r   s    r   r   zpanfpn_config.<locals>.<lambda>6   r   r   r	   r   r   )
r!   r"   r   r#   r$   r%   r&   r(   offsetsr   s
            @r   panfpn_configr-   )   sj    	A!/ZMY&*J,1*,=>q	As">H5M__Z(FAG9i!mR0 )>?9n=#]1q5%9:S`abScRd	%*
 	
 	4<() 9i!m, )>?9n=#]1q5%9:S`abScRd	%*
 	
 	4<() H3 ?s   Ec           	         t        j                         }|xs d}d}|| z
  dz   }t        |      D ci c]	  }| |z   |g c}fd}fd}fd}	t        j                  |      }
g |_        t        |dz
  | dz
  d      D ]O  }|j
                  j                  | ||       ||dz         g|d       |   j                  t        |
             Q |   j                  |   d          t        | dz   |      D ]Q  }|j
                  j                  | ||       ||dz
        gz   |d       |   j                  t        |
             S |}|j
                  j                  | |	|      g ||dz
        gz   |d       |   j                  t        |
             |    j                  |    d          t        | dz   |dz   d      D ]b  }|j
                  j                  | |	|      || dz   k7  r ||dz
        n
 |	|dz
        g|d       |   j                  t        |
             d |    j                  |    d          t        |dz
  | d      D ]\  }|j
                  j                  ||   d   g|   d   gz    ||dz         gz   |d       |   j                  t        |
             ^ | }|j
                  j                  ||   d   g ||dz         gz   |d       |   j                  t        |
             |   j                  |   d          t        | |dz         D ]L  }|j
                  j                  ||   d	   |   d
   g|d       |   j                  t        |
             N |S c c}w )a  A dynamic quad fpn config that can adapt to different min/max levels.

    It extends the idea of BiFPN, and has four paths:
        (up_down -> bottom_up) + (bottom_up -> up_down).

    Paper: https://ieeexplore.ieee.org/document/9225379
    Ref code: From contribution to TF EfficientDet
    https://github.com/google/automl/blob/eb74c6739382e9444817d2ad97c4582dbe9a9020/efficientdet/keras/fpn_configs.py
    r   r   c                     |    d   S r   r
   r   s    r   r   zqufpn_config.<locals>.<lambda>`   r   r   c                     |    S r   r
   r   s    r   r   zqufpn_config.<locals>.<lambda>a   r   r   c                     |    d   S )Nr   r
   r   s    r   r   zqufpn_config.<locals>.<lambda>b   s    8E?1#5 r   r	   r   r         r   )r!   r"   r   r#   quad_methodr$   r%   r&   r'   level_first_idr(   r   s              @r   qufpn_configr6   Q   s    	A!/ZMKY&*J,1*,=>q	As">H5M1M5N__Z(FAG9q=)a-4 )	,Q/q1u1EF*
 	
 	4<() Yx	22679q=), )	+A.-A2F1GG*
 	
 	4<() 	AGGNN)!,-q1u1E0FF& 
 QKtF|$Yx	22679q=)a-3 )	q!1	A;M=Q#7SabcfgbgShj*	
 	 	4<() Yx	22679q=)R0 )	'{1~.(1+b/1BBmTUXYTYFZE[[*
 	
 	4<() 	AGGNN#A;q>*mAE.B-CC& 
 QKtF|$Yx	2267 9i!m, )	'{1~x{1~>(
 	
 	4<() HU ?s   N
c                     | sd} t        ||d      t        ||d      t        ||d      t        ||d      t        ||d      t        ||d      t        ||d      d}||    S )Nbifpn_fasum)r!   r"   r   attnr   )	bifpn_sum
bifpn_attnr8   pan_sumpan_fa	qufpn_sumqufpn_fa)r)   r-   r6   )fpn_namer!   r"   name_to_configs       r   get_fpn_configrC      sy    !IZ_`"Y)[ab 9	Ycd 9	Y^_)yXbc!IZ_` 9	YcdN (##r   r   )      )r   	omegaconfr   r)   r-   r6   rC   r
   r   r   <module>rG      s#      F%PXv$r   