
    iY	                    T    d Z ddlmZ ddlmZ ddlZddlmZm	Z	m
Z
 dd
ZdefddZdS )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_DEEMPHASISpreset_namestrreturnc                D    d| v r|                      d          d         S | S )uB   Extract emotion family from preset name (e.g. 'joy_L3' → 'joy')._r   )split)r	   s    R/dataset/kemix-engine/package/face/animasync-face-v3/scripts/compiler/archetype.py_extract_familyr      s,    
k  %%a((    vad
np.ndarraypresetsdictemotion_hintOptional[str]sigmafloatc                    |s t          j        dt           j                  S t          j         t           j                   g }g }|                                D ]\  }}t          j        |d         t           j                  }t          t           j                             |z
                      }	t          t          j        |	dz   d|z  |z  z                      }
|6t          |          }||k    r|
t          z  }
n|dk    r|dk    r
|
t          z  }
|                    |
           |                    t          j        |d         t           j                             t          j        |t           j                  }|                                d	k     r[ fd
|                                D             }t          t          j        |                    }||                                         S ||                                z  }t          j        |d          }t          j        d||                              t           j                  S )a  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   dtyper      g       @Nneutralbsgư>c                    g | ]U}t          t          j                            t          j        |d          t          j                  z
                      VS )r   r   )r   nplinalgnormasarrayfloat32).0dr   s     r   
<listcomp>z#archetype_blend.<locals>.<listcomp>E   sY     
 
 
 ")..rz!E("*'M'M'M!MNNOO
 
 
r   r   )axiszi,ij->j)r"   zerosr&   r%   itemsr   r#   r$   expr   r   r   appendsumvaluesintargmincopystackeinsumastype)r   r   r   r   weightsbs_listnamedata
anchor_vaddistwfamily	distancesidxbs_stacks   `              r   archetype_blendrB      s%   "  .x"*----
*S

+
+
+CGGmmoo A A
dZU2:>>>
RY^^C*$45566"&419uu)<=>>?? #$T**F%%--9$$)B)B++qrz$t*BJ???@@@@j
333G {{}}t
 
 
 
^^%%
 
 
	 ")I&&''s|  """w{{}}Gxa(((H9Y2299"*EEEr   )r	   r
   r   r
   )
r   r   r   r   r   r   r   r   r   r   )__doc__
__future__r   typingr   numpyr"   	constantsr   r   r   r   rB    r   r   <module>rI      s     # " " " " "                       #'	5F 5F 5F 5F 5F 5F 5Fr   