
    "f+                       d dl Z d dlmZ d dlmc mZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZ ddZ G d dej"                        Z G d dej"                        Z G d	 d
ej"                        Z G d dej"                        Z G d de j,                  j.                        Z G d de j,                  j.                        Z G d de j,                  j.                        Z G d d      Z G d d      Z G d d      Z G d d      Zy)    N)bbox_ioubbox_alpha_ioubox_ioubox_gioubox_dioubox_ciou	xywh2xyxy)is_parallelc                     dd| z  z
  d| z  fS )N      ?      ? epss    .C:\work2\python\work_new2\yolov7\utils\loss.py
smooth_BCEr      s    s?C#I%%    c                   &     e Zd Zd fd	Zd Z xZS )BCEBlurWithLogitsLossc                 n    t         t        |           t        j                  d      | _        || _        y )Nnone	reduction)superr   __init__nnBCEWithLogitsLossloss_fcnalpha)selfr   	__class__s     r   r   zBCEBlurWithLogitsLoss.__init__   s*    #T35,,v>
r   c                     | j                  ||      }t        j                  |      }||z
  }dt        j                  |dz
  | j                  dz   z        z
  }||z  }|j                         S )N   -C6?)r   torchsigmoidexpr   mean)r    predtruelossdxalpha_factors         r   forwardzBCEBlurWithLogitsLoss.forward   sd    }}T4(}}T"D[599b1fd1B%CDDyy{r   )g?__name__
__module____qualname__r   r.   __classcell__r!   s   @r   r   r      s    
r   r   c                   :     e Zd ZdZdZd fd	Zd Zd Zd Z xZ	S )
SigmoidBinNFc	                    t         t        |           || _        |dz   | _        || _        || _        t        ||z
        | _        | j                  dz  | _	        || _
        || _        || _        || _        || j                  dz  | j                  z  z   }	|| j                  dz  | j                  z  z
  }
| j                  | j                  z  }|| _        t        j                   |	|
dz   |      j                         }| j#                  d|       dd|z  z
  | _        d|z  | _        t)        j*                  t        j,                  |g            | _        t)        j0                         | _        y )Nr#          @r$   binsr   r   
pos_weight)r   r6   r   	bin_countlengthminmaxfloatscaleshiftuse_loss_regressionuse_fw_regression	reg_scale
BCE_weightstepr%   rangeregister_buffercpcnr   r   TensorBCEbinsMSELoss)r    r<   r>   r?   rE   rC   rD   rF   
smooth_epsstartendrG   r9   r!   s                r   r   zSigmoidBin.__init__%   s7   j$(*"!m39%
ZZ#%
#6 !2"$tzz#~77TZZ^t~~55zzDNN*	 {{5#,5;;=VT* j((
"++u||ZL7QRzz|r   c                     | j                   S N)r=   )r    s    r   
get_lengthzSigmoidBin.get_lengthD   s    {{r   c                    |j                   d   | j                  k(  s#J d|j                   d   | j                  fz         |d   | j                  z  | j                  dz  z
  | j                  z  }|ddd| j                  z   f   }t        j                  |d      \  }}| j                  |   }| j                  r||z   }n|}|j                  | j                  | j                        }|S )	N0pred.shape[-1]=%d is not equal to self.length=%d.r   r8   .r#   dimr>   r?   )shaper=   rE   rG   r<   r%   r?   r9   rD   clampr>   )r    r)   pred_regpred_bin_bin_idxbin_biasresults           r   r.   zSigmoidBin.forwardG   s    zz"~,  	A.`dhdndnoqdrtxtt  dA  /A  	A,L4>>1DNN34FF$))SQ$.. 0112YYxR0
799W%!!(FF$((9r   c                    |j                   d   | j                  k(  s#J d|j                   d   | j                  fz         |j                   d   |j                   d   k(  s&J d|j                   d   |j                   d   fz         |j                  }|d   j                         | j                  z  | j                  dz  z
  | j
                  z  }|ddd| j                  z   f   }t        j                  |d	   | j                  z
        }t        j                  |d
      \  }}| j                  |   }	d|	_        ||	z   }
t        j                  || j                  |      }|j                   d   }| j                  |t        |      |f<   | j!                  ||      }| j"                  r| j%                  |
|      }||z   }n|}|
j'                  | j                  | j(                        }||fS )NrV   rW   r   z1pred.shape=%d is not equal to the target.shape=%drX   r8   .r#   ).NrY   Fdevicer[   )r\   r=   rf   r&   rE   rG   r<   r%   absr9   r>   requires_grad	full_likerK   rJ   rH   rM   rC   rN   r]   r?   )r    r)   targetrf   r^   r_   diff_bin_targetr`   ra   rb   rc   target_binsnloss_binloss_regressionr+   
out_results                    r   training_losszSigmoidBin.training_lossY   s   zz"~,  	A.`dhdndnoqdrtxtt  dA  /A  	A,zz!}Q/  	H1dhlhrhrsthuw}  xD  xD  EF  xG  hH  2H  	H/L((*T^^;dnnS>PPTXT]T]]Q$.. 0112))F9$5		$ABYYB7
799W%!&H$oohGJJqM)-E!Hg%&<<+6##"ll66:Oo-DD\\dhhDHH\=
Zr   )
           r   r8   TTr   rs   )
r0   r1   r2   strideexportr   rT   r.   rq   r3   r4   s   @r   r6   r6   !   s!    FF$>$ r   r6   c                   &     e Zd Zd fd	Zd Z xZS )	FocalLossc                     t         t        |           || _        || _        || _        |j                  | _        d| j                  _        y Nr   )r   rw   r   r   gammar   r   r    r   rz   r   r!   s       r   r   zFocalLoss.__init__{   s>    i') 

!++"(r   c                 p   | j                  ||      }t        j                  |      }||z  d|z
  d|z
  z  z   }|| j                  z  d|z
  d| j                  z
  z  z   }d|z
  | j                  z  }|||z  z  }| j
                  dk(  r|j                         S | j
                  dk(  r|j                         S |S )Nr#   r   r(   sum)r   r%   r&   r   rz   r   r(   r}   )r    r)   r*   r+   	pred_probp_tr-   modulating_factors           r   r.   zFocalLoss.forward   s    }}T4(
 MM$'	Y!d(q9}!==djj(AHTZZ+HH 3Y4::5000>>V#99;^^u$88:Kr   g      ?      ?r/   r4   s   @r   rw   rw   y   s    )r   rw   c                   &     e Zd Zd fd	Zd Z xZS )
QFocalLossc                     t         t        |           || _        || _        || _        |j                  | _        d| j                  _        y ry   )r   r   r   r   rz   r   r   r{   s       r   r   zQFocalLoss.__init__   s>    j$(* 

!++"(r   c                 t   | j                  ||      }t        j                  |      }|| j                  z  d|z
  d| j                  z
  z  z   }t        j                  ||z
        | j
                  z  }|||z  z  }| j                  dk(  r|j                         S | j                  dk(  r|j                         S |S )Nr#   r(   r}   )	r   r%   r&   r   rg   rz   r   r(   r}   )r    r)   r*   r+   r~   r-   r   s          r   r.   zQFocalLoss.forward   s    }}T4(MM$'	djj(AHTZZ+HH!IIdY&674::E000>>V#99;^^u$88:Kr   r   r/   r4   s   @r   r   r      s    )r   r   c                   .    e Zd Zedd       Zed        Zy)RankSortc                    t        j                  |j                        j                         }|dkD  }||   }||   }t	        |      }	t        j
                  |      |z
  }
|dk(  ||
k\  z  }||   }t        j                  t	        |            j                         }t        j                  |	      j                         }t        j                  |	      j                         }t        j                  |	      j                         }t        j                  |      }|D ]  }|||   z
  }|||   z
  }|dkD  rCt        j                  |d|z  z  dz   dd      }t        j                  |d|z  z  dz   dd      }n&|dk\  j                         }|dk\  j                         }t        j                  |      }t        j                  |      }||z   }||z  ||<   t        j                  |d|z
  z        |z  }|||   k\  }||z  }t        j                  |      }t        j                  |d|z
  z        |z  }||z
  ||<   ||kD  r||xx   ||   z  cc<   ||||   |z  z  z  }| |z  }t        j                  |      }||kD  sd||xx   ||   z  cc<   ||||   |z  z  z  } ||	z  ||<   ||	z  ||<   | j                  |       |j                         |j                         fS )Nrs   r      r   r#   r[   )r%   zerosr\   cudalenr>   argsortr]   r@   r}   save_for_backwardr(   )ctxlogitstargetsdelta_RSr   classification_grads	fg_labels	fg_logits
fg_targetsfg_numthreshold_logitrelevant_bg_labelsrelevant_bg_logitsrelevant_bg_gradsorting_errorranking_errorfg_gradorderiifg_relationsbg_relationsrank_posFP_numrankcurrent_sorting_erroriou_relationstarget_sorted_orderrank_pos_targettarget_sorting_errormissorted_examplessorting_pmf_denoms                                  r   r.   zRankSort.forward   s    #[[6;;= r\	9%	Y'
Y  ))I.x7$aZFO,CD#$67S);%<=BBDkk&)..0kk&)..0F#((* mmI&B"9R=0L+IbM9L!|"[[qz)B3)F1QRS"[[qz)B3)F1QRS , 188: , 188: YY|,H99\*F &D %TkM" %*IIlAjL.I$J8$S! (:b>9M"/,"> $ii(;<O #()),?:,N"OP_"_  !68L LM" |}R00 \=3DV3K%LM  %2/\!A !&		*< = !3&}R00.b0ABS0STUu z +2&.Y'3CF3J/023!!#]%7%7%999r   c                 0    | j                   \  }||z  d d d fS rS   saved_tensors)r   	out_grad1	out_grad2g1s       r   backwardzRankSort.backward  s"    )|T4--r   N)r   g|=r0   r1   r2   staticmethodr.   r   r   r   r   r   r      s+    Z: Z:x . .r   r   c                   .    e Zd Zedd       Zed        Zy)aLRPLossc                 N   t        j                  |j                        j                         }|dk(  }||   }t	        |      }	t        j
                  |      |z
  }
|dk(  ||
k\  z  }||   }t        j                  t	        |            j                         }t        j                  |	      j                         }t        j                  |	      j                         }t        j                  |	      j                         }d}t        j                  |      }|D ]  }|||   z
  }t        j                  |d|z  z  dz   dd      }d||<   |||   z
  }t        j                  |d|z  z  dz   dd      }dt        j                  |      z   }t        j                  |      }||z   ||<   |||   z  ||<   ||kD  st        j                  ||z        |z    ||   z  ||<   ||||    |z  z  z  } |||<   |||<   ||	z  }d|j                         z
  }| j                  |       |||fS Nr#   r   r   r   r[   r%   r   r\   r   r   r>   r   r]   r}   r(   r   )r   r   r   regression_lossesdeltar   r   r   r   r   r   r   r   r   r   precr   max_precr   r   r   r   r   r   cls_losss                            r   r.   zaLRPLoss.forward  s<   "[[6;;= \	9%	Y  ))I.u4 %aZ&/*AB!"45S);%<=BBD[[ %%'[[ %%'F#((*mmI&B"9R=0L\1U7%;C%?A!LLL ,IbM9L\1U7%;C%?A!LL uyy..H99\*Ff_DH d2h&DH| %		,7H*H I& PQRVWYRZZ \GBK<3F%GH 1 6 *1Y'2B/0(499;23u$$r   c                 2    | j                   \  }||z  d d d d fS rS   r   )r   r   r   	out_grad3r   s        r   r   zaLRPLoss.backwardS  s$    )|T4t33r   N)r   gh㈵>r   r   r   r   r   r     s)    <% <%| 4 4r   r   c                   .    e Zd Zedd       Zed        Zy)APLossc                 >   t        j                  |j                        j                         }|dk(  }||   }t	        |      }t        j
                  |      |z
  }|dk(  ||k\  z  }	||	   }
t        j                  t	        |
            j                         }t        j                  |      j                         }t        j                  |      j                         }t        j                  |      j                         }d}t        j                  |      }|D ]  }|||   z
  }t        j                  |d|z  z  dz   dd      }d||<   |
||   z
  }t        j                  |d|z  z  dz   dd      }dt        j                  |      z   }t        j                  |      }||z   ||<   |||   z  }||k  r|}||||   z  z  }n||||   z  d|z
  d|z
  z  z  z  }d|z
   ||<   |||<    |||<   |||	<   ||z  }d|j                         z
  }| j                  |       |S r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   current_precr   s                           r   r.   zAPLoss.forwardZ  sF   "[[6;;= \	9%	Y  ))I.u4 %aZ&/*AB!"45S);%<=BBD[[ %%'[[ %%'F#((*mmI&B"9R=0L\1U7%;C%?A!LLL ,IbM9L\1U7%;C%?A!LL uyy..H99\*Ff_DH "$r(*L ,&% \$r(%:;  \$r(%:qzAlN>[$]]  H*GBKDH? D *1Y'2B/0&499;23r   c                 .    | j                   \  }||z  d d fS rS   r   )r   r   r   s      r   r   zAPLoss.backward  s     )|T4''r   N)r   r   r   r   r   r   r   Y  s+    C CJ ( (r   r   c                   ,     e Zd Zd fd	Zd Zd Z xZS )ComputeLossc           	         t         t        |           t        |j	                               j
                  }|j                  }t        j                  t        j                  |d   g|            }t        j                  t        j                  |d   g|            }t        |j                  dd            \  | _        | _        |d   }|d	kD  rt        ||      t        ||      }}t!        |      r|j"                  j$                  d
   n|j$                  d
   }dg dij                  |j&                  g d      | _        |r$t+        |j,                        j/                  d      nd	| _        |||j2                  ||f\  | _        | _        | _        | _        | _        dD ]  }	t;        | |	t=        ||	              y )Ncls_pwre   r:   obj_pwlabel_smoothingrs   r   fl_gammar   rV            @r   g?r   r   r   gQ?g{Gz?   )nancnlanchors)r   r   r   next
parametersrf   hypr   r   r%   tensorr   getrJ   rK   rw   r
   modulemodelr   balancelistrt   indexssigrBCEclsBCEobjautobalancesetattrgetattrr    r   r   rf   hr   r   gdetkr!   s             r   r   zComputeLoss.__init__  sr   k4)+e&&()00II %%q{mTZ1[\%%q{mTZ1[\ &!%%0A3*GH jMq5&vq19VQ3GFF(3E(:ell  $B?+//8ST 2=4

#))"-!HNPVX]X`X`bcepHpET[$'48T5E,AD!WS!_- -r   c                    |j                   }t        j                  d|      t        j                  d|      t        j                  d|      }}}| j                  ||      \  }}}	}
t	        |      D ]  \  }}|	|   \  }}}}t        j
                  |d   |      }|j                  d   }|rh|||||f   }|d d d df   j                         dz  dz
  }|d d ddf   j                         dz  dz  |
|   z  }t        j                  ||fd      }t        |j                  ||   d	d
      }|d|z
  j                         z  }d| j                  z
  | j                  |j                         j                  d      j                  |j                         z  z   |||||f<   | j"                  dkD  rft        j$                  |d d dd f   | j&                  |      }| j(                  |t+        |      ||   f<   || j-                  |d d dd f   |      z  }| j/                  |d   |      }||| j0                  |   z  z  }| j2                  s| j0                  |   dz  d|j                         j5                         z  z   | j0                  |<     | j2                  r9| j0                  D cg c]  }|| j0                  | j6                     z    c}| _        || j8                  d   z  }|| j8                  d   z  }|| j8                  d   z  }j                  d   }||z   |z   }||z  t        j                  ||||f      j                         fS c c}w )Nr#   re   rX   r   r   r8   r      FTx1y1x2y2CIoUr      .r   H.?r$   boxobjcls)rf   r%   r   build_targets	enumerate
zeros_liker\   r&   catr   Tr(   r   detachr]   typedtyper   ri   rK   rJ   rH   r   r   r   r   itemr   r   )r    pr   rf   lclslboxlobjtclstboxindicesr   ipibagjgitobjrm   pspxypwhpboxioutobjixbsr+   s                                r   __call__zComputeLoss.__call__  s%    ;;q8%++aPV:WY^YdYdefouYvDd'+'9'9!W'E$dGW q\EAr"1:LAq"b##BvJv>D
A1b"% BQBi'')B.4!QqS&z))+a/A5
Byy#sQ/tvvtAwTJs((** '*DGGmtwwASASTUAVA[A[\`\f\fAg7g%gQ2r\" 77Q;1ab5	4776JA+/77AeAhQ'(DKK1ab5	155D ;;r&z40DD4<<?**D"&,,q/F":VdkkmFXFXFZ=Z"ZQA "D @DM1ATXX 66MDLZZ]d{T!by%))T4t$<=DDFFF Ns   /#Mc                 (   | j                   |j                  d   }}g g g g f\  }}}}t        j                  d|j                        j                         }	t        j                  ||j                        j                         j                  |d      j                  d|      }
t        j                  |j                  |dd      |
d d d d d f   fd      }d}t        j                  ddgddgddgddgddgg|j                        j                         |z  }t        | j                        D ]Z  }| j                  |   }t        j                  ||   j                        g d   |	dd	 ||	z  }|r
|d d d d d
d	f   |d d d f   z  }t        j                  |d|z        j                  d      d   | j                   d   k  }||   }|d d dd
f   }|	ddg   |z
  }|dz  |k  |dkD  z  j"                  \  }}|dz  |k  |dkD  z  j"                  \  }}t        j$                  t        j&                  |      ||||f      }|j                  d      |   }t        j(                  |      d    |d d d f   z   |   }n|d   }d}|d d d df   j                         j"                  \  }}|d d dd
f   }|d d d
d	f   }||z
  j                         }|j"                  \  }}|d d d	f   j                         }|j+                  |||j-                  d|	d   dz
        |j-                  d|	d   dz
        f       |j+                  t        j                  ||z
  |fd             |j+                  ||          |j+                  |       ] ||||fS Nr      re   r#   r   r   rV   r   r   r   r      r   r   anchor_tr   r   r#   r#   r   r\   r%   onesrf   longaranger@   viewrepeatr   r   rH   r   r   r?   r   r   stack	ones_liker   appendclamp_)r    r  r   r   ntr  r  r  anchgainair   offr	  r   r  rjgxygxir   lmoffsetsr  cgwhgijr  r  r  s                                  r   r   zComputeLoss.build_targets  s   '--*B$&BN!dGTzz!GNN388:\\"W^^4::<AA"aHOOPQSUV))W^^B15r!Q*~FJllQFFQFRGaW '.nn6 7<egB
 twwAll1oGQqTZZ0>D1I $AaAaCiL71d7#33IIaa(,,Q/2TXXj5IIaD 1Q3iAq6lS(rA#(3661rA#(3661KK!3Q1a @AHHY'* ++C06QWEqIAJ QU8==?$$DAqAqsF)CAqsF)C=&&(CUUFB !Q$ANNAq"))AtAw{";RYYq$q'TU+=VWXKK		39c"2A67KK
#KKNK  N T7D((r   F)r0   r1   r2   r   r  r   r3   r4   s   @r   r   r     s    .40Gd5)r   r   c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )ComputeLossOTAc           	         t         t        |           t        |j	                               j
                  }|j                  }t        j                  t        j                  |d   g|            }t        j                  t        j                  |d   g|            }t        |j                  dd            \  | _        | _        |d   }|d	kD  rt        ||      t        ||      }}t!        |      r|j"                  j$                  d
   n|j$                  d
   }dg dij                  |j&                  g d      | _        |r$t+        |j,                        j/                  d      nd	| _        |||j2                  ||f\  | _        | _        | _        | _        | _        dD ]  }	t;        | |	t=        ||	              y Nr   re   r:   r   r   rs   r   r   r   rV   r   r   r   r   )r   r   r   r   rt   )r   r<  r   r   r   rf   r   r   r   r%   r   r   r   rJ   rK   rw   r
   r   r   r   r   r   rt   r   r   r   r   r   r   r   r   r   s             r   r   zComputeLossOTA.__init__.  sp   nd,.e&&()00II %%q{mTZ1[\%%q{mTZ1[\ &!%%0A3*GH jMq5&vq19VQ3GFF(3E(:ell  $B?+//8ST1<4

#))"-!HNPVX]X`X`bcepHpET[$'48T5E6AD!WS!_- 7r   c                    |j                   }t        j                  d|      t        j                  d|      t        j                  d|      }}}| j                  |||      \  }}	}
}}}|D cg c](  }t        j                  |j
                  |      g d   * }}t        |      D ]~  \  }}||   |	|   |
|   ||   f\  }}}}t        j                  |d   |      }|j
                  d   }|r|||||f   }t        j                  ||gd      }|d d d df   j                         dz  d	z
  }|d d dd
f   j                         dz  dz  ||   z  }t        j                  ||fd      }||   d d ddf   ||   z  }|d d d dfxx   |z  cc<   t        |j                  |dd      }|d|z
  j                         z  }d| j                  z
  | j                  |j                         j!                  d      j#                  |j$                        z  z   |||||f<   ||   d d df   j'                         }| j(                  dkD  rct        j*                  |d d dd f   | j,                  |      }| j.                  |t1        |      |f<   || j3                  |d d dd f   |      z  }| j5                  |d   |      } || | j6                  |   z  z  }| j8                  s>| j6                  |   dz  d| j                         j;                         z  z   | j6                  |<    | j8                  r9| j6                  D !cg c]  }!|!| j6                  | j<                     z    c}!| _        || j>                  d   z  }|| j>                  d   z  }|| j>                  d   z  }j
                  d   }||z   |z   }"|"|z  t        j                  ||||"f      j                         fS c c}w c c}!w )Nr#   re   r  rX   r   rY   r   r8   r   r   r  FTr   r   r   r   r   r$   r   r   r   ) rf   r%   r   r   r   r\   r   r   r'  r&   r   r   r   r(   r   r   r]   r   r   r#  r   ri   rK   rJ   rH   r   r   r   r   r  r   r   )#r    r  r   imgsrf   r  r  r  r  as_gjsgisr   pppre_gen_gainsr	  r
  r  r  r  r  r  rm   r  gridr  r  r  selected_tboxr  selected_tclsr  r  r  r+   s#                                      r   r  zComputeLossOTA.__call__F  s    ;;q8%++aPV:WY^YdYdefouYvDd.2.@.@GT.R+Cc7GWXYWXQSbhhv>|LWXY q\EAra5#a&#a&#a&8LAq"b##BvJv>D
A1b"% {{B83BQBi'')B.4!QqS&z))+a/A5
Byy#sQ/ '
1ac6 2]15E Ea!e$,$tvv}u4Ps((** '*DGGmtwwASASTUAVA[A[\`\f\fAg7g%gQ2r\" !(
1a4 0 5 5 777Q;1ab5	4776JA15AeAh-.DKK1ab5	155D ;;r&z40DD4<<?**D"&,,q/F":VdkkmFXFXFZ=Z"ZQI "L @DM1ATXX 66MDLZZ]d{T!by%))T4t$<=DDFFFe ZV Ns   0-O*#O/c           	         | j                  ||      \  }}t        j                  |j                        }|D cg c]  }g  }}|D cg c]  }g  }	}|D cg c]  }g  }
}|D cg c]  }g  }}|D cg c]  }g  }}|D cg c]  }g  }}t        |      }t	        |d   j
                  d         D ]  }|d d df   |k(  }||   }|j
                  d   dk(  r(|d d ddf   ||   j
                  d   z  }t        |      }g }g }g }g }g }g }g }g }g }t        |      D ]  \  }}||   \  }} }!}"||k(  }#||#   | |#   |!|#   |"|#   f\  }} }!}"|j                  |       |j                  |        |j                  |!       |j                  |"       |j                  ||   |#          |j                  t        j                  t        |      f      |z  j                  |             ||| |!|"f   }$|j                  |$d d ddf          |j                  |$d d dd f          t        j                  |"|!gd      }%|$d d d df   j                         d	z  d
z
  |%z   | j                  |   z  }&|$d d ddf   j                         dz  dz  ||   |#   z  | j                  |   z  }'t        j                  |&|'gd      }(t        |(      })|j                  |)        t        j                  |d      }|j
                  d   dk(  rZt        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        ||      }*t        j                   |*dz          }+t        j"                  |*t%        d|*j
                  d         d      \  },}-t        j&                  |,j)                  d      j+                         d      }.t-        j.                  |d d df   j                  t        j0                        | j2                        j5                         j7                  d      j9                  d|j
                  d   d      }/|j
                  d   }0|j5                         j7                  d      j9                  |0dd      j;                         |j7                  d      j9                  |0dd      j;                         z  }1|1j=                         }2t-        j>                  t        j                   |2d|2z
  z        |/d      j)                  d      }3~1|3d|+z  z   }4t        j@                  |4|      }5t	        |0      D ]9  }6t        j"                  |4|6   |.|6   jC                         d      \  }-}7d|5|6   |7<   ; ~,~.|5j)                  d      }8|8dkD  j)                         dkD  rBt        j$                  |4d d |8dkD  f   d      \  }-}9|5d d |8dkD  fxx   dz  cc<   d|5|9|8dkD  f<   |5j)                  d      dkD  j                  |      }:|5d d |:f   jE                  d      };||:   }||:   }||:   }||:   }||:   }||:   }||;   }t	        |      D ]  }||k(  }<||   j                  ||<          |	|   j                  ||<          |
|   j                  ||<          ||   j                  ||<          ||   j                  ||<          ||   j                  ||<            t	        |      D ]  }||   g k7  rt        j                  ||   d      ||<   t        j                  |	|   d      |	|<   t        j                  |
|   d      |
|<   t        j                  ||   d      ||<   t        j                  ||   d      ||<   t        j                  ||   d      ||<   t        jF                  g dt        j0                        ||<   t        jF                  g dt        j0                        |	|<   t        jF                  g dt        j0                        |
|<   t        jF                  g dt        j0                        ||<   t        jF                  g dt        j0                        ||<   t        jF                  g dt        j0                        ||<    ||	|
|||fS c c}w c c}w c c}w c c}w c c}w c c}w )Nr   r   r  r#   sizer   r   rY   r8   r   rV   :0yE>rr   r>   r   r         @re   Fr   largestr   rs   cuda:0rf   r   )$find_3_positiver%   rf   r   rH   r\   r	   r   r)  r"  tor'  r&   rt   r   r   logtopkr>   r]   r}   intFone_hotint64r   r@   	unsqueezer&  sigmoid_sqrt_ binary_cross_entropy_with_logitsr   r  argmaxr   )=r    r  r   r@  r  r,  rf   rD  matching_bsmatching_asmatching_gjsmatching_gismatching_targetsmatching_anchsr   	batch_idxb_idxthis_targettxywhtxyxypxyxysp_clsp_objfrom_which_layerall_ball_aall_gjall_giall_anchr	  r
  r  r  r  r  idxfg_predrF  r  r  pxywhpxyxypair_wise_ioupair_wise_iou_losstop_kr`   
dynamic_ksgt_cls_per_imagenum_gt
cls_preds_ypair_wise_cls_losscostmatching_matrixgt_idxpos_idxanchor_matching_gtcost_argminfg_mask_inboxesmatched_gt_inds	layer_idxs=                                                                r   r   zComputeLossOTA.build_targets~  s    ,,Q8 gnn-$%&AbrA&$%&AbrA&%&'QrQ'%&'QrQ')*+2B+'()q"q)Vqtzz!}-IAqDM9,E!%.K  #q(1Q3'$y/*?*?*BBEe$EFEE!EEFFH"12&qz1b"I~ vqvr#w3?1b"QQb!b!Q- ''#a&)Ca)G(K(KF(STQ2r\*WQ!V_-WQU^,{{B83q"1"u~--/"4s:TAT[[QR^Sq!A#v..014:T!WS\IDKKXYNZ		3*"5!%(e$- &0 YYv1-F||A!#IIe+EIIe+E$yy)9qAIIe+EIIe+EYYv1-FYYv1-Fyyq1H#E62M"'))MD,@"A!Azz-R9L9LQ9O1PVWXHE1UYYq\%5%5%7Q?J 		+ad+..u{{;TWWE16<<?A.	  !&&q)F''*11&!Q?HHJ//!$++FAq9BBDE 
   "A!"!C!CyyAaC!$4"c"g   #**+ 
 $..tFCO-"ZZLJv$6$;$;$=u
7 47'0	 ( z!0!4!4Q!7"Q&++-1!&43E3I0I+JPQ!R;#5#9 9:cA:GJ-?!-C CD.2215;??GO-a.@AHHKO/@/*E/*EO,FO,F0H%o6K2Y,1	A%%eI&67A%%eI&67Q&&vi'89Q&&vi'89 #**;y+ABq!(())<= c .t rA"b(!&;q>q!AA!&;q>q!AA"'))LO"CQ"'))LO"CQ&+ii0@0C&K #$)IInQ.?Q$Gq!!&b!UA!&b!UA"',,r(%++"VQ"',,r(%++"VQ&+ll2hekk&Z #$)LLHEKK$Xq!   K|EUWeeeg '&''+)s#   	d8	d=	e&	e5	e	ec                    | j                   |j                  d   }}g g }}t        j                  d|j                        j                         }t        j                  ||j                        j                         j                  |d      j                  d|      }t        j                  |j                  |dd      |d d d d d f   fd      }d}	t        j                  ddgddgddgddgddgg|j                        j                         |	z  }
t        | j                        D ]  }| j                  |   }t        j                  ||   j                        g d   |dd	 ||z  }|r
|d d d d d
d	f   |d d d f   z  }t        j                  |d|z        j                  d      d   | j                   d   k  }||   }|d d dd
f   }|ddg   |z
  }|dz  |	k  |dkD  z  j"                  \  }}|dz  |	k  |dkD  z  j"                  \  }}t        j$                  t        j&                  |      ||||f      }|j                  d      |   }t        j(                  |      d    |
d d d f   z   |   }n|d   }d}|d d d df   j                         j"                  \  }}|d d dd
f   }|d d d
d	f   }||z
  j                         }|j"                  \  }}|d d d	f   j                         }|j+                  |||j-                  d|d   dz
        |j-                  d|d   dz
        f       |j+                  ||          " ||fS r  r!  r    r  r   r   r+  r  r,  r-  r.  r   r/  r	  r   r  r0  r1  r2  r3  r   r4  r5  r6  r  r7  r8  r9  r  r  r  s                                r   rS  zComputeLossOTA.find_3_positive  B   '--*BBzz!GNN388:\\"W^^4::<AA"aHOOPQSUV))W^^B15r!Q*~FJllQFFQFRGaW '.nn6 7<egB
 twwAll1oGQqTZZ0>D1I $AaAaCiL71d7#33IIaa(,,Q/2TXXj5IIaD 1Q3iAq6lS(rA#(3661rA#(3661KK!3Q1a @AHHY'* ++C06QWEqIAJ QU8==?$$DAqAqsF)CAqsF)C=&&(CUUFB !Q$ANNAq"))AtAw{";RYYq$q'TU+=VWXKK
#G  J }r   r:  r0   r1   r2   r   r  r   rS  r3   r4   s   @r   r<  r<  ,  s    .06Gp[fz3r   r<  c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )ComputeLossBinOTAc           	         t         t        |           t        |j	                               j
                  }|j                  }t        j                  t        j                  |d   g|            }t        j                  t        j                  |d   g|            }t        |j                  dd            \  | _        | _        |d   }|d	kD  rt        ||      t        ||      }}t!        |      r|j"                  j$                  d
   n|j$                  d
   }dg dij                  |j&                  g d      | _        |r$t+        |j,                        j/                  d      nd	| _        |||j2                  ||f\  | _        | _        | _        | _        | _        dD ]  }	t;        | |	t=        ||	              t?        | j@                  ddd      jC                  |      }
|
| _"        y )Nr   re   r:   r   r   rs   r   r   r   rV   r   r   r   r   )r   r   r   r   rt   r<   r   F)r<   r>   r?   rC   )#r   r  r   r   r   rf   r   r   r   r%   r   r   r   rJ   rK   rw   r
   r   r   r   r   r   rt   r   r   r   r   r   r   r   r   r6   r<   rT  wh_bin_sigmoid)r    r   r   rf   r   r   r   r   r   r   r  r!   s              r   r   zComputeLossBinOTA.__init__S  s   /1e&&()00II %%q{mTZ1[\%%q{mTZ1[\ &!%%0A3*GH jMq5&vq19VQ3GFF(3E(:ell  $B?+//8ST1<4

#))"-!HNPVX]X`X`bcepHpET[$'48T5ECAD!WS!_- D $dnn#3dijmmntu,r   c           	      	   |j                   }t        j                  d|      t        j                  d|      t        j                  d|      }}}| j                  |||      \  }}	}
}}}|D cg c](  }t        j                  |j
                  |      g d   * }}t        |      D ]  \  }}||   |	|   |
|   ||   f\  }}}}t        j                  |d   |      }| j                  j                         dz  dz   }|j
                  d   }|r|||||f   }t        j                  ||gd      }||   d d ddf   ||   z  }|d d d dfxx   |z  cc<   | j                  j                  |d	dd
| j                  z   f   |d   ||   d   z        \  }}| j                  j                  |d	d
| j                  z   |f   |d   ||   d   z        \  }}|||   d   z  }|||   d   z  }|d d df   j                         dz  dz
  }|d d df   j                         dz  dz
  } |||z   z  }t        j                  |j                  d      | j                  d      |j                  d      |j                  d      fd      j!                  |      }!t#        |!j$                  |dd      }"|d|"z
  j'                         z  }d| j(                  z
  | j(                  |"j+                         j-                  d      j/                  |j0                        z  z   |||||f<   ||   d d df   j3                         }#| j4                  dkD  rit        j6                  |d d d|z   d f   | j8                  |      }$| j:                  |$t=        |      |#f<   || j?                  |d d d|z   d f   |$      z  }| jA                  |d	|f   |      }%||%| jB                  |   z  z  }| jD                  sE| jB                  |   dz  d|%j+                         jG                         z  z   | jB                  |<    | jD                  r9| jB                  D &cg c]  }&|&| jB                  | jH                     z    c}&| _!        || jJ                  d   z  }|| jJ                  d   z  }|| jJ                  d   z  }j
                  d   }||z   |z   }'|'|z  t        j                  ||||'f      j+                         fS c c}w c c}&w )Nr#   re   r  rX   r   r   rY   r  .r   ).r   ).r   ).r#   r8   r   FTr   r   r   r$   r   r   r   )&rf   r%   r   r   r   r\   r   r   r  rT   r'  rq   r<   r&   r   r[  rT  r   r   r(   r   r   r]   r   r   r#  r   ri   rK   rJ   rH   r   r   r   r   r  r   r   )(r    r  r   r@  rf   r  r  r  r  rA  rB  rC  r   rD  rE  r	  r
  r  r  r  r  r  obj_idxrm   r  rF  rG  w_losspwh_lossphpxpyr  r  rH  r  r  r  r+   s(                                           r   r  zComputeLossBinOTA.__call__q  s)    ;;q8%++aPV:WY^YdYdefouYvDd.2.@.@GT.R+Cc7GWXYWXQSbhhv>|LWXY q\EAra5#a&#a&#a&8LAq"b##BvJv>D))446q81<G
A1b"% {{B83 '
1ac6 2]15E Ea!e$,$ "00>>r#q!DNNJZG[B[?\^klr^sv}~  wA  BH  wI  _I  J
!00>>r#$..HXZaGaBa?bdqrxdy  }D  EF  }G  HN  }O  eO  P
gaj((gaj((1X%%'",s21X%%'",s2' yy",,q/2<<?BLLQROUWUaUabcUd!eghillmst
 tvv}u4Ps((** '*DGGmtwwASASTUAVA[A[\`\f\fAg7g%gQ2r\" !(
1a4 0 5 5 777Q;1qyl?(;TWWVTA15AeAh-.DKK1qyl?(;Q??D ;;r#w,/6DD4<<?**D"&,,q/F":VdkkmFXFXFZ=Z"ZQy "| @DM1ATXX 66MDLZZ]d{T!by%))T4t$<=DDFFFU ZF Ns   0-S1#S6c           	         | j                  ||      \  }}|D cg c]  }g  }}|D cg c]  }g  }}|D cg c]  }g  }	}|D cg c]  }g  }
}|D cg c]  }g  }}|D cg c]  }g  }}t        |      }t        |d   j                  d         D ]_  }|d d df   |k(  }||   }|j                  d   dk(  r(|d d ddf   ||   j                  d   z  }t	        |      }g }g }g }g }g }g }g }g }g }t        |      D ]u  \  }}| j                  j                         dz  dz   }||   \  }} }!}"||k(  }#||#   | |#   |!|#   |"|#   f\  }} }!}"|j                  |       |j                  |        |j                  |!       |j                  |"       |j                  ||   |#          |j                  t        j                  t        |      f      |z         ||| |!|"f   }$|j                  |$d d ||dz   f          |j                  |$d d |dz   d f          t        j                  |"|!gd      }%|$d d d df   j                         dz  dz
  |%z   | j                  |   z  }&| j                  j                  |$d	dd
| j                  z   f   j                               ||   |#   d d df   z  | j                  |   z  }'| j                  j                  |$d	d
| j                  z   |f   j                               ||   |#   d d df   z  | j                  |   z  }(t        j                   |&|'j#                  d      |(j#                  d      gd      })t	        |)      }*|j                  |*       x t        j                   |d      }|j                  d   dk(  rt        j                   |d      }t        j                   |d      }t        j                   |d      }t        j                   |d      }t        j                   |d      }t        j                   |d      }t        j                   |d      }t        j                   |d      }t%        ||      }+t        j&                  |+dz          },t        j(                  |+t+        d|+j                  d         d      \  }-}.t        j,                  |-j/                  d      j1                         d      }/t3        j4                  |d d df   j7                  t        j8                        | j:                        j=                         j#                  d      j?                  d|j                  d   d      }0|j                  d   }1|j=                         j#                  d      j?                  |1dd      jA                         |j#                  d      j?                  |1dd      jA                         z  }2|2jC                         }3t3        jD                  t        j&                  |3d|3z
  z        |0d      j/                  d      }4~2|4d|,z  z   }5t        jF                  |5      }6t        |1      D ]9  }7t        j(                  |5|7   |/|7   jI                         d      \  }.}8d|6|7   |8<   ; ~-~/|6j/                  d      }9|9dkD  j/                         dkD  rBt        j*                  |5d d |9dkD  f   d      \  }.}:|6d d |9dkD  fxx   dz  cc<   d|6|:|9dkD  f<   |6j/                  d      dkD  };|6d d |;f   jK                  d      }<||;   }||;   }||;   }||;   }||;   }||;   }||<   }t        |      D ]  }||k(  }=||   j                  ||=          ||   j                  ||=          |	|   j                  ||=          |
|   j                  ||=          ||   j                  ||=          ||   j                  ||=           b t        |      D ]  }||   g k7  rt        j                   ||   d      ||<   t        j                   ||   d      ||<   t        j                   |	|   d      |	|<   t        j                   |
|   d      |
|<   t        j                   ||   d      ||<   t        j                   ||   d      ||<   t        jL                  g dt        j8                        ||<   t        jL                  g dt        j8                        ||<   t        jL                  g dt        j8                        |	|<   t        jL                  g dt        j8                        |
|<   t        jL                  g dt        j8                        ||<   t        jL                  g dt        j8                        ||<    |||	|
||fS c c}w c c}w c c}w c c}w c c}w c c}w )Nr   r   r  r#   rJ  rY   r8   r   .r   rV   rL  rr   rM  r   r   rN  FrO  r   rs   rQ  rR  )'rS  r   rH   r\   r	   r   r  rT   r)  r%   r"  r'  r&   rt   r.   r<   r   r[  r   rU  rV  r>   r]   r}   rW  rX  rY  rT  rZ  r   r@   r&  r\  r]  r^  r   r  r_  r   )>r    r  r   r@  r  r,  rD  r`  ra  rb  rc  rd  re  r   rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  r	  r
  r  r  r  r  r  rt  ru  rF  r  r  r  rv  rw  rx  ry  rz  r`   r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  s>                                                                 r   r   zComputeLossBinOTA.build_targets  s	    ,,Q8
 %&&AbrA&$%&AbrA&%&'QrQ'%&'QrQ')*+2B+'()q"q)Vqtzz!}-IAqDM9,E!%.K  #q(1Q3'$y/*?*?*BBEe$EFEE!EEFFH"12--88:1<q@&qz1b"I~ vqvr#w3?1b"QQb!b!Q- ''

Q	(BQ(FGQ2r\*WQ(;%;<=WQ_56{{B83q"1"u~--/"4s:TAT[[QR^S((00a4>>AQ>R9R1S1[1[1]^aefgahilamnoqrnrassvz  wB  wB  CD  wE  E((00q?OQX>X9X1Y1a1a1cdgklmgnorgstuwxtxgyy  }A  }H  }H  IJ  }K  K		3Qa"IrR!%(e$5 &8 YYv1-F||A!#IIe+EIIe+E$yy)9qAIIe+EIIe+EYYv1-FYYv1-Fyyq1H#E62M"'))MD,@"A!Azz-R9L9LQ9O1PVWXHE1UYYq\%5%5%7Q?J 		+ad+..u{{;TWWE16<<?A.	  !&&q)F''*11&!Q?HHJ//!$++FAq9BBDE 
   "A!"!C!CyyAaC!$4"c"g   #**+ 
 $..t4O-"ZZLJv$6$;$;$=u
7 47'0	 ( z!0!4!4Q!7"Q&++-1!&43E3I0I+JPQ!R;#5#9 9:cA:GJ-?!-C CD-11!4s:O-a.@AHHKO/@/*E/*EO,FO,F0H%o6K2Y,1	A%%eI&67A%%eI&67Q&&vi'89Q&&vi'89 #**;y+ABq!(())<= k .| rA"b(!&;q>q!AA!&;q>q!AA"'))LO"CQ"'))LO"CQ&+ii0@0C&K #$)IInQ.?Q$Gq!!&b!UA!&b!UA"',,r(%++"VQ"',,r(%++"VQ&+ll2hekk&Z #$)LLHEKK$Xq!   K|EUWeeeo '&''+)s!   	g 	g	g
	g	g%	gc                    | j                   |j                  d   }}g g }}t        j                  d|j                        j                         }t        j                  ||j                        j                         j                  |d      j                  d|      }t        j                  |j                  |dd      |d d d d d f   fd      }d}	t        j                  ddgddgddgddgddgg|j                        j                         |	z  }
t        | j                        D ]  }| j                  |   }t        j                  ||   j                        g d   |dd	 ||z  }|r
|d d d d d
d	f   |d d d f   z  }t        j                  |d|z        j                  d      d   | j                   d   k  }||   }|d d dd
f   }|ddg   |z
  }|dz  |	k  |dkD  z  j"                  \  }}|dz  |	k  |dkD  z  j"                  \  }}t        j$                  t        j&                  |      ||||f      }|j                  d      |   }t        j(                  |      d    |
d d d f   z   |   }n|d   }d}|d d d df   j                         j"                  \  }}|d d dd
f   }|d d d
d	f   }||z
  j                         }|j"                  \  }}|d d d	f   j                         }|j+                  |||j-                  d|d   dz
        |j-                  d|d   dz
        f       |j+                  ||          " ||fS r  r!  r  s                                r   rS  z!ComputeLossBinOTA.find_3_positiveb  r  r   r:  r  r4   s   @r   r  r  Q  s    -<NG`_fB3r   r  c                   >     e Zd Zd fd	Zd Zd Zd Zd Zd Z xZ	S )ComputeLossAuxOTAc           	         t         t        |           t        |j	                               j
                  }|j                  }t        j                  t        j                  |d   g|            }t        j                  t        j                  |d   g|            }t        |j                  dd            \  | _        | _        |d   }|d	kD  rt        ||      t        ||      }}t!        |      r|j"                  j$                  d
   n|j$                  d
   }dg dij                  |j&                  g d      | _        |r$t+        |j,                        j/                  d      nd	| _        |||j2                  ||f\  | _        | _        | _        | _        | _        dD ]  }	t;        | |	t=        ||	              y r>  )r   r  r   r   r   rf   r   r   r   r%   r   r   r   rJ   rK   rw   r
   r   r   r   r   r   rt   r   r   r   r   r   r   r   r   r   s             r   r   zComputeLossAuxOTA.__init__  sq   /1e&&()00II %%q{mTZ1[\%%q{mTZ1[\ &!%%0A3*GH jMq5&vq19VQ3GFF(3E(:ell  $B?+//8ST1<4

#))"-!HNPVX]X`X`bcepHpET[$'48T5E6AD!WS!_- 7r   c           	         |j                   }t        j                  d|      t        j                  d|      t        j                  d|      }}}| j                  |d | j                   ||      \  }}	}
}}}| j                  |d | j                   ||      \  }}}}}}|d | j                   D cg c](  }t        j                  |j                  |      g d   * }}|d | j                   D cg c](  }t        j                  |j                  |      g d   * }}t        | j                        D ]  }||   }||| j                  z      }||   ||   ||   ||   f\  }}}}||   |	|   |
|   ||   f\  }}}} t        j                  |d   |      }!t        j                  |d   |      }"|j                  d   }#|#r|||||f   }$t        j                  ||gd      }%|$d d d df   j                         dz  d	z
  }&|$d d dd
f   j                         dz  dz  ||   z  }'t        j                  |&|'fd      }(||   d d ddf   ||   z  })|)d d d dfxx   |%z  cc<   t        |(j                  |)dd      }*|d|*z
  j                         z  }d| j                   z
  | j                   |*j#                         j%                  d      j'                  |!j(                        z  z   |!||||f<   ||   d d df   j+                         }+| j,                  dkD  rct        j.                  |$d d dd f   | j0                  |      },| j2                  |,t        |#      |+f<   || j5                  |$d d dd f   |,      z  }|j                  d   }-|-r||||| f   }.t        j                  | |gd      }/|.d d d df   j                         dz  d	z
  }0|.d d dd
f   j                         dz  dz  ||   z  }1t        j                  |0|1fd      }2||   d d ddf   ||   z  }3|3d d d dfxx   |/z  cc<   t        |2j                  |3dd      }4|dd|4z
  j                         z  z  }d| j                   z
  | j                   |4j#                         j%                  d      j'                  |"j(                        z  z   |"|||| f<   ||   d d df   j+                         }5| j,                  dkD  rft        j.                  |.d d dd f   | j0                  |      }6| j2                  |6t        |-      |5f<   |d| j5                  |.d d dd f   |6      z  z  }| j7                  |d   |!      }7| j7                  |d   |"      }8||7| j8                  |   z  d|8z  | j8                  |   z  z   z  }| j:                  s| j8                  |   dz  d|7j#                         j=                         z  z   | j8                  |<    | j:                  r9| j8                  D 9cg c]  }9|9| j8                  | j>                     z    c}9| _        || j@                  d   z  }|| j@                  d   z  }|| j@                  d   z  }!j                  d   }||z   |z   }:|:|z  t        j                  ||||:f      j#                         fS c c}w c c}w c c}9w )Nr#   re   r  rX   r   rY   r   r8   r   r   r  FTr   r   r   r   r   r   r$   r   r   r   )!rf   r%   r   build_targets2r   r   r   r\   rH   r   r'  r&   r   r   r   r(   r   r   r]   r   r   r#  r   ri   rK   rJ   r   r   r   r   r  r   r   );r    r  r   r@  rf   r  r  r  bs_auxas_aux_gjs_auxgis_auxtargets_auxanchors_auxr  rA  rB  rC  r   rD  pre_gen_gains_auxrE  r	  r
  pi_auxr  r  r  r  b_auxa_auxgj_auxgi_auxr  tobj_auxrm   r  rF  r  r  r  rG  r  rH  r  n_auxps_auxgrid_auxpxy_auxpwh_auxpbox_auxselected_tbox_auxiou_auxselected_tcls_auxt_auxr  obji_auxr  r+   s;                                                              r   r  zComputeLossAuxOTA.__call__  s    ;;q8%++aPV:WY^YdYdefouYvDdFJFYFYZ[\d]a]d]dZegnptFuC';.2.@.@8DGGgW[.\+Cc7G[\]e^b^e^e[fg[fUWU\\"((6B<P[fgWXYaZ^ZaZaWbcWbQSbhhv>|LWbc twwA1Bqy\Fa5#a&#a&#a&8LAq"b+1!9gaj'!*gVWj+X(E5&&##BvJv>D''vvFH
A1b"% {{B83BQBi'')B.4!QqS&z))+a/A5
Byy#sQ/ '
1ac6 2]15E Ea!e$,$tvv}u4Ps((** '*DGGmtwwASASTUAVA[A[\`\f\fAg7g%gQ2r\" !(
1a4 0 5 5 777Q;1ab5	4776JA15AeAh-.DKK1ab5	155D KKNEuff <= ;;'7Q? BQB-//1B6<!!QqS&>113a7A=AN 99gw%7;$/N1ac6$:=Nq=Q$Q!!!RaR%(H4("8::/@5W[\g33555 ;>-477U\UcUcUeUkUklmUnUsUst|  uC  uC  VD  LD  :Dvv56 %0N1a4$8$=$=$?!77Q;!OOF1ab5M4776RE=AWWE%,(99:D4;;vae}e#DDDD;;r&z40D{{6&>8<HD4<<?*TH_t||A-NNND"&,,q/F":VdkkmFXFXFZ=Z"ZQ  B @DM1ATXX 66MDLZZ]d{T!by%))T4t$<=DDFFF] hcL Ns   1-Z91-Z>#[c           	      .   | j                  ||      \  }}|D cg c]  }g  }}|D cg c]  }g  }}|D cg c]  }g  }	}|D cg c]  }g  }
}|D cg c]  }g  }}|D cg c]  }g  }}t        |      }t        |d   j                  d         D ]  }|d d df   |k(  }||   }|j                  d   dk(  r(|d d ddf   ||   j                  d   z  }t	        |      }g }g }g }g }g }g }g }g }g }t        |      D ]  \  }}||   \  }}} }!||k(  }"||"   ||"   | |"   |!|"   f\  }}} }!|j                  |       |j                  |       |j                  |        |j                  |!       |j                  ||   |"          |j                  t        j                  t        |      f      |z         |||| |!f   }#|j                  |#d d ddf          |j                  |#d d dd f          t        j                  |!| gd      }$|#d d d df   j                         d	z  d
z
  |$z   | j                  |   z  }%|#d d ddf   j                         dz  dz  ||   |"   z  | j                  |   z  }&t        j                  |%|&gd      }'t	        |'      }(|j                  |(        t        j                  |d      }|j                  d   dk(  rKt        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        ||      })t        j                  |)dz          }*t        j                  |)t!        d|)j                  d         d      \  }+},t        j"                  |+j%                  d      j'                         d      }-t)        j*                  |d d df   j-                  t        j.                        | j0                        j3                         j5                  d      j7                  d|j                  d   d      }.|j                  d   }/|j3                         j5                  d      j7                  |/dd      j9                         |j5                  d      j7                  |/dd      j9                         z  }0|0j;                         }1t)        j<                  t        j                  |1d|1z
  z        |.d      j%                  d      }2~0|2d|*z  z   }3t        j>                  |3      }4t        |/      D ]9  }5t        j                  |3|5   |-|5   jA                         d      \  },}6d|4|5   |6<   ; ~+~-|4j%                  d      }7|7dkD  j%                         dkD  rBt        j                   |3d d |7dkD  f   d      \  },}8|4d d |7dkD  fxx   dz  cc<   d|4|8|7dkD  f<   |4j%                  d      dkD  }9|4d d |9f   jC                  d      }:||9   }||9   }||9   }||9   }||9   }||9   }||:   }t        |      D ]  }||k(  };||   j                  ||;          ||   j                  ||;          |	|   j                  ||;          |
|   j                  ||;          ||   j                  ||;          ||   j                  ||;            t        |      D ]  }||   g k7  rt        j                  ||   d      ||<   t        j                  ||   d      ||<   t        j                  |	|   d      |	|<   t        j                  |
|   d      |
|<   t        j                  ||   d      ||<   t        j                  ||   d      ||<   t        jD                  g dt        j.                        ||<   t        jD                  g dt        j.                        ||<   t        jD                  g dt        j.                        |	|<   t        jD                  g dt        j.                        |
|<   t        jD                  g dt        j.                        ||<   t        jD                  g dt        j.                        ||<    |||	|
||fS c c}w c c}w c c}w c c}w c c}w c c}w Nr   r   r  r#   rJ  r   r   rY   r8   r   rV   rL     rM  r   r   rN  FrO  r   rs   rQ  rR  )#rS  r   rH   r\   r	   r   r)  r%   r"  r'  r&   rt   r   r   rU  rV  r>   r]   r}   rW  rX  rY  rT  rZ  r   r@   r[  r&  r\  r]  r^  r   r  r_  r   <r    r  r   r@  r  r,  rD  r`  ra  rb  rc  rd  re  r   rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  r	  r
  r  r  r  r  rt  ru  rF  r  r  rv  rw  rx  ry  rz  r`   r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  s<                                                               r   r   zComputeLossAuxOTA.build_targets     ,,Q8$%&AbrA&$%&AbrA&%&'QrQ'%&'QrQ')*+2B+'()q"q)Vqtzz!}-IAqDM9,E!%.K  #q(1Q3'$y/*?*?*BBEe$EFEE!EEFFH"12&qz1b"I~ vqvr#w3?1b"QQb!b!Q- ''

Q	(BQ(FGQ2r\*WQ!V_-WQU^,{{B83q"1"u~--/"4s:TAT[[QR^Sq!A#v..014:T!WS\IDKKXYNZ		3*"5!%(e$- &0 YYv1-F||A!#IIe+EIIe+E$yy)9qAIIe+EIIe+EYYv1-FYYv1-Fyyq1H#E62M"'))MD,@"A!Azz-R9L9LQ9O1PVWXHE1UYYq\%5%5%7Q?J 		+ad+..u{{;TWWE16<<?A.	  !&&q)F''*11&!Q?HHJ//!$++FAq9BBDE 
   "A!"!C!CyyAaC!$4"c"g   #**+ 
 $..t4O-"ZZLJv$6$;$;$=u
7 47'0	 ( z!0!4!4Q!7"Q&++-1!&43E3I0I+JPQ!R;#5#9 9:cA:GJ-?!-C CD-11!4s:O-a.@AHHKO/@/*E/*EO,FO,F0H%o6K2Y,1	A%%eI&67A%%eI&67Q&&vi'89Q&&vi'89 #**;y+ABq!(())<= c .t rA"b(!&;q>q!AA!&;q>q!AA"'))LO"CQ"'))LO"CQ&+ii0@0C&K #$)IInQ.?Q$Gq!!&b!UA!&b!UA"',,r(%++"VQ"',,r(%++"VQ&+ll2hekk&Z #$)LLHEKK$Xq!   K|EUWeeeg '&''+)!   	c9	c>	d	d	d%	dc           	      .   | j                  ||      \  }}|D cg c]  }g  }}|D cg c]  }g  }}|D cg c]  }g  }	}|D cg c]  }g  }
}|D cg c]  }g  }}|D cg c]  }g  }}t        |      }t        |d   j                  d         D ]  }|d d df   |k(  }||   }|j                  d   dk(  r(|d d ddf   ||   j                  d   z  }t	        |      }g }g }g }g }g }g }g }g }g }t        |      D ]  \  }}||   \  }}} }!||k(  }"||"   ||"   | |"   |!|"   f\  }}} }!|j                  |       |j                  |       |j                  |        |j                  |!       |j                  ||   |"          |j                  t        j                  t        |      f      |z         |||| |!f   }#|j                  |#d d ddf          |j                  |#d d dd f          t        j                  |!| gd      }$|#d d d df   j                         d	z  d
z
  |$z   | j                  |   z  }%|#d d ddf   j                         dz  dz  ||   |"   z  | j                  |   z  }&t        j                  |%|&gd      }'t	        |'      }(|j                  |(        t        j                  |d      }|j                  d   dk(  rKt        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        j                  |d      }t        ||      })t        j                  |)dz          }*t        j                  |)t!        d|)j                  d         d      \  }+},t        j"                  |+j%                  d      j'                         d      }-t)        j*                  |d d df   j-                  t        j.                        | j0                        j3                         j5                  d      j7                  d|j                  d   d      }.|j                  d   }/|j3                         j5                  d      j7                  |/dd      j9                         |j5                  d      j7                  |/dd      j9                         z  }0|0j;                         }1t)        j<                  t        j                  |1d|1z
  z        |.d      j%                  d      }2~0|2d|*z  z   }3t        j>                  |3      }4t        |/      D ]9  }5t        j                  |3|5   |-|5   jA                         d      \  },}6d|4|5   |6<   ; ~+~-|4j%                  d      }7|7dkD  j%                         dkD  rBt        j                   |3d d |7dkD  f   d      \  },}8|4d d |7dkD  fxx   dz  cc<   d|4|8|7dkD  f<   |4j%                  d      dkD  }9|4d d |9f   jC                  d      }:||9   }||9   }||9   }||9   }||9   }||9   }||:   }t        |      D ]  }||k(  };||   j                  ||;          ||   j                  ||;          |	|   j                  ||;          |
|   j                  ||;          ||   j                  ||;          ||   j                  ||;            t        |      D ]  }||   g k7  rt        j                  ||   d      ||<   t        j                  ||   d      ||<   t        j                  |	|   d      |	|<   t        j                  |
|   d      |
|<   t        j                  ||   d      ||<   t        j                  ||   d      ||<   t        jD                  g dt        j.                        ||<   t        jD                  g dt        j.                        ||<   t        jD                  g dt        j.                        |	|<   t        jD                  g dt        j.                        |
|<   t        jD                  g dt        j.                        ||<   t        jD                  g dt        j.                        ||<    |||	|
||fS c c}w c c}w c c}w c c}w c c}w c c}w r  )#find_5_positiver   rH   r\   r	   r   r)  r%   r"  r'  r&   rt   r   r   rU  rV  r>   r]   r}   rW  rX  rY  rT  rZ  r   r@   r[  r&  r\  r]  r^  r   r  r_  r   r  s<                                                               r   r  z ComputeLossAuxOTA.build_targets2  r  r  c                    | j                   |j                  d   }}g g }}t        j                  d|j                        j                         }t        j                  ||j                        j                         j                  |d      j                  d|      }t        j                  |j                  |dd      |d d d d d f   fd      }d}	t        j                  ddgddgddgddgddgg|j                        j                         |	z  }
t        | j                        D ]  }| j                  |   }t        j                  ||   j                        g d   |dd	 ||z  }|r
|d d d d d
d	f   |d d d f   z  }t        j                  |d|z        j                  d      d   | j                   d   k  }||   }|d d dd
f   }|ddg   |z
  }|dz  |	k  |dkD  z  j"                  \  }}|dz  |	k  |dkD  z  j"                  \  }}t        j$                  t        j&                  |      ||||f      }|j                  d      |   }t        j(                  |      d    |
d d d f   z   |   }n|d   }d}|d d d df   j                         j"                  \  }}|d d dd
f   }|d d d
d	f   }||z
  j                         }|j"                  \  }}|d d d	f   j                         }|j+                  |||j-                  d|d   dz
        |j-                  d|d   dz
        f       |j+                  ||          " ||fS )Nr   r  re   r#   r   r   rV   r  r  r   r  r   r   r!  r  s                                r   r  z!ComputeLossAuxOTA.find_5_positive9  r  r   c                    | j                   |j                  d   }}g g }}t        j                  d|j                        j                         }t        j                  ||j                        j                         j                  |d      j                  d|      }t        j                  |j                  |dd      |d d d d d f   fd      }d}	t        j                  ddgddgddgddgddgg|j                        j                         |	z  }
t        | j                        D ]  }| j                  |   }t        j                  ||   j                        g d   |dd	 ||z  }|r
|d d d d d
d	f   |d d d f   z  }t        j                  |d|z        j                  d      d   | j                   d   k  }||   }|d d dd
f   }|ddg   |z
  }|dz  |	k  |dkD  z  j"                  \  }}|dz  |	k  |dkD  z  j"                  \  }}t        j$                  t        j&                  |      ||||f      }|j                  d      |   }t        j(                  |      d    |
d d d f   z   |   }n|d   }d}|d d d df   j                         j"                  \  }}|d d dd
f   }|d d d
d	f   }||z
  j                         }|j"                  \  }}|d d d	f   j                         }|j+                  |||j-                  d|d   dz
        |j-                  d|d   dz
        f       |j+                  ||          " ||fS r  r!  r  s                                r   rS  z!ComputeLossAuxOTA.find_3_positiven  r  r   r:  )
r0   r1   r2   r   r  r   r  r  rS  r3   r4   s   @r   r  r    s+    .0SGjWfrWfr3j3r   r  )g?)r%   torch.nnr   torch.nn.functional
functionalrX  utils.generalr   r   r   r   r   r   r	   utils.torch_utilsr
   r   Moduler   r6   rw   r   autogradFunctionr   r   r   r   r<  r  r  r   r   r   <module>r     s        d d d )&
BII "U  U p		 < 2a.u~~&& a.FC4u~~&& C4LJ(U^^$$ J(ZC) C)Lb bJ	D DN
I Ir   