
    8j                        S SK Jr  S SKrS SKJr  S SKJrJrJr  S SK	r
S SKrS SKJr  S SKJr  SSKJrJrJrJr  SS	 jr S       SS
 jjr        SS jr " S S\R0                  5      rg)    )annotationsN)Path)DictOptionalTuple)nn)
functional   )ANCHORS_PATHEMOTION_LABELSEMOTION_TO_IDMicroAlbertConfigc                l   [         R                  " [        R                  " SS95      S   n/ n[         HV  nX   nU Vs/ s H  oUS   U :X  d  M  UPM     nn[        U5      S:X  d   SU  SU 35       eUR                  US   S	   5        MX     [        R                  " U[        R                  S
9$ s  snf )Nutf-8encodinganchorslevelr
   zexpected exactly one level-z entry for r   vaddtype)
jsonloadsr   	read_textr   lenappendtorchtensorfloat32)r   datarowsnameentriesematchs          ]/home/ubuntu/service/kemix-engine/package/face/animasync-face-v3/models/microalbert/losses.pybuild_anchor_tabler'      s    ::l,,g>?	JDD*#;GqzU':G;5zQV"=eWKPTv VVE!HUO$	 
 <<EMM22 <s   B1B1c                    [         R                  " US4[         R                  S9n[         R                  " U[         R                  S9n[	        U 5      R                  SS9 nU Hq  n[        R                  " U5      nUS    HO  n[        R                  " US   5      n	U	c  M!  US   n
[        U
5      S:w  a  M7  X9==   U
-  ss'   XI==   S	-  ss'   MQ     Ms     SSS5        X4SS2S4   R                  S	S
9-  nUS:H  R                  5       (       a;  [        U5      R                  5       n[        U5       H  nXM   S:X  d  M  X   X'   M     [         R"                  " U[         R$                  S9$ ! , (       d  f       N= f)u4  Compute per-emotion VAD centroids from training data.

Replaces hand-curated anchors (which were 0.25-0.40 from data means)
with empirical class centroids — snap loss now pulls toward what the
data actually shows for each class. Falls back to JSON level-3 anchors
for any class with zero training samples.
   r   r   r   turnsemotionNr   r
   minr   )npzerosfloat64int64r   openr   r   r   getr   clipanyr'   numpyranger   r   r   )train_jsonlnum_emotionsfallback_levelsumscountsflinerowtemo_idr   	centroidsjson_anchorsis                 r&   build_data_centroid_anchorsrE      sF    88\1%RZZ8DXXl"((3F	k					1QD**T"C\&**1Y<8>hs8q=#!# "  
2 ag+++22I!).9??A|$AyA~+	 % <<	77' 
2	1s   !A8E//
E=c                    SSK Jn  U" S[        R                  " U5      U S9n[        R                  " XBS   US   5      nXDR                  5       -  n[        R                  " U[        R                  S9$ )Nr   )compute_class_weightbalanced)class_weightclassesyr
   r   )	sklearn.utils.class_weightrG   r.   aranger4   meanr   r   r   )emotion_idsnum_classes
clip_rangerG   ws        r&   compute_class_weightsrS   <   s`    
 @		+&
	A
 	a=*Q-0A	FFHA<<//    c                  h   ^  \ rS rSr S     SU 4S jjjrSS jr            S	S jrSrU =r$ )
MultitaskLossM   c                  > [         TU ]  5         Xl        U R                  SUR	                  5       5        Uc  [        UR                  5      nU R                  SU5        U R                  S[        R                  " UR                  [        R                  S95        [	        [        UR                  5      5      U l        g )Nclass_weightsr   vad_dim_weightsr   )super__init__cfgregister_bufferfloatr'   
snap_levelr   r   rZ   r   sum
_dim_w_sum)selfr]   rY   r   	__class__s       r&   r\   MultitaskLoss.__init__N   s     	_m.A.A.CD?(8GY0u||C,?,?u}}U	
  C$7$7 89rT   c                    U R                   n[        SUS-   [        SUR                  5      -  5      nUR                  U-  nXR
                  :  a  UR                  OSnXE4$ )N      ?r
   g        )r]   r-   maxvad_warmup_epochsvad_loss_weight_maxsnap_start_epochsnap_loss_weight)rc   epochr]   rampw_vadw_snaps         r&   current_weightsMultitaskLoss.current_weights`   s]    hh3c!S-B-B&CCD''$.).2F2F)F%%C}rT   c                   U R                   n[        R                  " UUU R                  UR                  S9n[        R
                  " X$SUR                  S9nXR                  -  R                  SS9R                  5       U R                  -  n	[        R                  " UR                  5       UR                  -  SS9n
U
R                  SS9u  pXR                  :  R!                  5       nU R"                  U   n[        R
                  " X.SUR                  S9R                  SS9nX-  R                  5       UR                  5       R%                  SS9-  n[!        UR                  5       R'                  5       5      nUR)                  S5      S	:  aP  UR+                  SS9n[        R,                  " UR.                  U-
  5      R1                  S	5      R                  5       nOUR3                  S
5      nU R5                  U5      u  nnUUU	-  -   UU-  -   UR6                  U-  -   n[!        UR                  5       R'                  5       5      [!        U	R                  5       R'                  5       5      [!        UR                  5       R'                  5       5      [!        UR                  5       R'                  5       5      S.n[!        U5      [!        U5      US.nUUU4$ )N)weightlabel_smoothingnone)	reductionbeta)dimrg   r,   r       )cer   snapr7   )ro   rp   	gate_rate)r]   Fcross_entropyrY   ru   smooth_l1_losssmooth_l1_betarZ   ra   rN   rb   softmaxdetachsnap_softmax_temprh   snap_conf_thresholdr_   r   clampitemsizestdrelurange_target_stdpow	new_zerosrq   range_loss_weight)rc   emotion_logitsvad_predemotion_target
vad_targetrm   r]   l_cediffl_vad
soft_probstop_probtop_idxgateanchor_targetsnap_perl_snapr   	batch_stdl_rangero   rp   total
componentsauxs                            r&   forwardMultitaskLoss.forwardg   s    hh%%//	
 F9K9K
 ,,,11b19>>@4??R YY~4469N9NNTVW
&NNrN2333::<W-##vC<N<N

$2$, 	 /&&(488:+;+;+;+DD$))+**,-	 ==q  +IffS11I=>BB1EJJLG((,G,,U3v emvo ##g-. 	 **,-,,./&--/..017>>+0023	

 efIVj#%%rT   )rb   r]   )N)r]   r   rY   torch.Tensorr   zOptional[torch.Tensor])rm   intreturnTuple[float, float])r   r   r   r   r   r   r   r   rm   r   r   z7Tuple[torch.Tensor, Dict[str, float], Dict[str, float]])	__name__
__module____qualname____firstlineno__r\   rq   r   __static_attributes____classcell__)rd   s   @r&   rV   rV   M   sx    
 +/	:: $: (	: :$9&$9& 9& %	9&
 !9& 9& 
A9& 9&rT   rV   )r   r   r   r   )r)   )r8   r   r9   r   r:   r   r   r   )rO   z
np.ndarrayrP   r   rQ   r   r   r   )
__future__r   r   pathlibr   typingr   r   r   r6   r.   r   r   torch.nnr	   r   configr   r   r   r   r'   rE   rS   ModulerV   r|   rT   r&   <module>r      s    "   ( (    $ R R3 AB88%(8:=88D000 $0 	0"S&BII S&rT   