
    8jY	                    j    S r SSKJr  SSKJr  SSKrSSKJrJ	r	J
r
  S	S jrS\4         S
S jjrg)u   Archetype layer: RBF interpolation over authored preset blendshapes.

Per docs/research/vad-to-arkit-blendshape-mapping.md §6.1.
    )annotations)OptionalN   )	RBF_SIGMARBF_EMOTION_FAMILY_BOOSTRBF_NEUTRAL_DEEMPHASISc                :    SU ;   a  U R                  S5      S   $ U $ )uB   Extract emotion family from preset name (e.g. 'joy_L3' → 'joy')._r   )split)preset_names    ^/home/ubuntu/service/kemix-engine/package/face/animasync-face-v3/scripts/compiler/archetype.py_extract_familyr      s&    
k  %a((    c                (   U(       d#  [         R                  " S[         R                  S9$ [         R                  " U [         R                  S9n / n/ nUR	                  5        H  u  pg[         R                  " US   [         R                  S9n[        [         R                  R                  X-
  5      5      n	[        [         R                  " U	S-  * SU-  U-  -  5      5      n
Ub/  [        U5      nX:X  a
  U
[        -  n
OUS:X  a  US:w  a	  U
[        -  n
UR                  U
5        UR                  [         R                  " US   [         R                  S95        M     [         R                  " U[         R                  S9nUR                  5       S:  a  UR                  5        Vs/ s HR  n[        [         R                  R                  U [         R                  " US   [         R                  S9-
  5      5      PMT     nn[        [         R                   " U5      5      nX^   R#                  5       $ XDR                  5       -  n[         R$                  " US	S
9n[         R&                  " SXO5      R)                  [         R                  5      $ s  snf )ad  Weight-blend preset blendshapes by RBF distance in VAD space.

Args:
    vad: (3,) float, query VAD in [-1, 1]
    presets: dict {name: {"vad": [V,A,D], "bs": np.ndarray(52,)}}
    emotion_hint: optional family name (e.g. 'joy'); boosts same-family presets
    sigma: RBF Gaussian bandwidth

Returns:
    (52,) float32 weighted blend of preset blendshapes
4   )dtypevad   g       @neutralbsgư>r   )axiszi,ij->j)npzerosfloat32asarrayitemsfloatlinalgnormexpr   r   r   appendsumvaluesintargmincopystackeinsumastype)r   presetsemotion_hintsigmaweightsbs_listnamedata
anchor_vaddistwfamilyd	distancesidxbs_stacks                   r   archetype_blendr9      s   " xx"**--
**S


+CGGmmo
ZZU2::>
RYY^^C$456"&&419uu)<=>? #$T*F%--9$)B++qrzz$t*BJJ?@ &  jj

3G {{}t ^^%
% "))..rzz!E("**'M!MNO% 	 
 "))I&'|  ""{{}Gxxa(H99Y299"**EE
s   (AJ)r   strreturnr:   )
r   
np.ndarrayr*   dictr+   zOptional[str]r,   r   r;   r<   )__doc__
__future__r   typingr   numpyr   	constantsr   r   r   r   r9    r   r   <module>rD      se    #    #'	5F	5F5F  5F 	5F
 5Fr   