
    Hha%                        d dl mZmZ d dlmZ d dlmZ d dlZd dlm	Z	 d dlm
Z
mZmZ d dlmZ dd	lmZ dd
lmZmZmZ  ed           G d d                      Z ed           G d d                      Z ed           G d de                      Z G d de          Z	 	 d!de	de	deee	f         dedededededee	e	ee         ee
def                  f         fd ZdS )"    )ABCabstractmethod)defaultdict)DictN)ndarray)UnionListTuple)	dataclass   )Exporter)OrderConfigOrder	get_orderT)frozenc                       e Zd ZU eed<   eed<   eeef         ed<   eeef         ed<   eeef         ed<   e	e
df         ed<   ed
d	            ZdS )TokenizerConfigmethodnum_discretecontinuous_rangecls_token_idparts_token_idNorder_configreturnc           
          |                      dd           }t          | j        | j        | j        | j        |                      di           |t          j        |          nd           S )Nr   r   )r   r   r   r   r   r   )getr   r   r   r   r   r   parse)configr   s     C/data/cameron/tmprepos/clean_dreammesh/UniRig/src/tokenizer/spec.pyr   zTokenizerConfig.parse!   sm    zz.$77=,#4&BU!::&6;;<H<T*<888Z^
 
 
 	
    )r   r   )__name__
__module____qualname__str__annotations__intr
   floatr   r   r   staticmethodr    r    r   r   r      s          KKK  E5L)))) sCx.    cN"""T)****	
 	
 	
 \	
 	
 	
r    r   c                       e Zd ZU eed<   eedf         ed<   eed<   eed<   eedf         ed<   eedf         ed<   eeeedf         f         ed<   e	d	             Z
dS )
TokenizeInputbonesNtailsbranchis_leafno_skincls
parts_biasc                 &    | j         j        d         S Nr   r,   shapeselfs    r   	num_boneszTokenizeInput.num_bonesD       z""r    )r!   r"   r#   r   r%   r   r$   r   r&   propertyr9   r)   r    r   r+   r+   -   s          NNN $ OOO  7D=!!!! 
sDy	 S%T	**++++# # X# # #r    r+   c                   |   e Zd ZU eed<   eed<   eeedf                  ed<   eedf         ed<   eedf         ed<   eedf         ed<   ee         ed<   edee         f         ed	<   e	e
e
f         ed
<   ed             Zed             Zed             Zdeeedf                  fdZdefdZdefdZdefdZdS )DetokenzeOutputtokensr,   Nparentsr-   r0   r1   partsnamesr   c                 (    | j         d d dd f         S N   r,   r7   s    r   jointszDetokenzeOutput.jointse   s    z!!!QRR%  r    c                 (    | j         d d d df         S rC   rE   r7   s    r   p_jointszDetokenzeOutput.p_jointsi   s    z!!!RaR%  r    c                 &    | j         j        d         S r4   r5   r7   s    r   r9   zDetokenzeOutput.num_bonesm   r:   r    r   c                 0   g }t          | j                  D ]~\  }}|d d         }d}d }t          t          |                    D ]9}| j        |         dd          |z
  dz                                  }||k     r|}|}:|                    |           |S )NrD   ?B r   )	enumerater,   reversedrangesumappend)	r8   r?   ibonep_jointdispidjn_diss	            r   _get_parentszDetokenzeOutput._get_parentsq   s    "4:.. 		  		 IQ2A2hGCCeAhh''    *Q-+g59>>@@3;;CCNN3r    pathc                     |                                  }|                     | j        d d dd f         ||           d S NrD   )rF   r?   rY   )rX   _export_skeletonr,   r8   rY   r?   s      r   export_skeletonzDetokenzeOutput.export_skeleton   sG    ##%%TZ122%6dSSSSSr    c                     | j         
J d            |                     t          j        | j        d d dd f         | j         gd          |           d S )Nz#tails is None, cannot exporrt bonesrD   )axis)r,   rY   )r-   _export_bonesnpconcatenater,   )r8   rY   s     r   export_boneszDetokenzeOutput.export_bones   sc    z%%'L%%%AAAqrrE1BDJ0OVX!Y!Y!Y`deeeeer    c                     |                                  }|                     | j        d d dd f         ||           d S r[   )rX   _export_skeleton_sequencer,   r]   s      r   export_skeleton_sequencez(DetokenzeOutput.export_skeleton_sequence   sH    ##%%&&djABB.?W[&\\\\\r    )r!   r"   r#   r   r%   r	   r   r&   r$   r
   r'   r;   rF   rH   r9   rX   r^   re   rh   r)   r    r   r=   r=   H   s         OOO NNN %T	"#### $ 7D=!!!! 
sDy	 9 tCy!!!! E5L))))! ! X! ! ! X! # # X#d5d#34    TC T T T Tf f f f f]S ] ] ] ] ] ]r    r=   c                   t    e Zd ZdZ fdZededefd            Zdede	fdZ
edee         fd            Zed	edefd
            Zededefd            Zeed                         Zed             Zed             Zed             Zed             Zeedeeef         fd                        Z xZS )TokenizerSpecz&
    Abstract class for tokenizer
    c                 H    t                                                       d S N)super__init__)r8   kwargs	__class__s     r   rn   zTokenizerSpec.__init__   s    r    inputr   c                     d S rl   r)   )r8   rq   s     r   tokenizezTokenizerSpec.tokenize   s    r    idsc                 j    t          d                    t          |           j                            )Nz{} has no method 'detokenize'NotImplementedErrorformattyper!   )r8   rt   ro   s      r   
detokenizezTokenizerSpec.detokenize   s(    !"A"H"HdI\"]"]^^^r    c                     dS )zAll parts token namesNr)   r7   s    r   get_require_partszTokenizerSpec.get_require_parts   	     	r    r1   c                     dS )zCls name to tokenNr)   )r8   r1   s     r   cls_name_to_tokenzTokenizerSpec.cls_name_to_token   r}   r    partc                     dS )zPart name to tokenNr)   )r8   r   s     r   part_name_to_tokenz TokenizerSpec.part_name_to_token   r}   r    c                     dS )zThe vocabulary sizeNr)   r7   s    r   
vocab_sizezTokenizerSpec.vocab_size   s	     	r    c                 j    t          d                    t          |           j                            )Nz{} has no attribute 'pad'rv   r7   s    r   padzTokenizerSpec.pad   (    !"="D"DT$ZZEX"Y"YZZZr    c                 j    t          d                    t          |           j                            )Nz{} has no attribute 'bos'rv   r7   s    r   boszTokenizerSpec.bos   r   r    c                 j    t          d                    t          |           j                            )Nz{} has no attribute 'eos'rv   r7   s    r   eoszTokenizerSpec.eos   r   r    c                 j    t          d                    t          |           j                            )Nz"{} has no attribute 'num_discrete'rv   r7   s    r   r   zTokenizerSpec.num_discrete   s)    !"F"M"MdSWjjNa"b"bcccr    c                     d S rl   r)   r7   s    r   r   zTokenizerSpec.continuous_range   r}   r    )r!   r"   r#   __doc__rn   r   r+   r   rs   r=   rz   r	   r$   r|   r&   r   r   r;   r   r   r   r   r   r
   r'   r   __classcell__)rp   s   @r   rj   rj      s             m     ^_g _O _ _ _ _ 49    ^ S S    ^ s s    ^   ^ X [ [ X[ [ [ X[ [ [ X[ d d Xd %u"5    ^ X    r    rj         ?FrF   rH   
tails_dictconvert_leaf_bones_to_tailsextrude_tail_for_leafextrude_tail_for_branchextrude_scalestrictr   c           
      v	   ||z  dk    s
J d            | j         d         |j         d         k    sJ g }g }	t          |           D ]\  }
}t          |          dk    r?|                    t	          j        ||g                     |	                    d           W||
         }d}d}t          t          |
                    D ]4}||         dd         |z
  dz                                  }||k     r|}|}5|                    t	          j        | |         |g                     |	                    |           t	          j	        |          }t          t                    }t          |	          D ]#\  }
}|||                             |
           $g }|rTt          |	          D ]C\  }
}t          ||
                   dk    r|                    |
           4||
ddf         ||<   Dn$d t          |j         d                   D             }t          |	          D ]\  }
}t          ||
                   dk    r|r}||
ddf         ||ddf         z
  }t          j                            |          }|r|d	k    s
J d
            n|d	k    rt	          j        g d          }||
ddf         ||z  z   ||
<   ||
ddf         ||
<   t          |	          D ]8\  }
}t          ||
                   dk    r |r|d}||
         D ];}|t          j                            ||
ddf         ||ddf         z
            z  }<|t          ||
                   z  }||
ddf         t	          j        dd||z  g          z   }ng||
ddf         ||ddf         z
  }t          j                            |          }|r|d	k    s
J d
            n|d	k    rt	          j        g d          }||
ddf         ||z  z   ||
<   )||
ddf         ||
<   :t          |	          D ]<\  }
}t          ||
                   dk    r||
         d         }||ddf         ||
<   =g }t          |j         d                   D ]}
|                    ||
                    t	          j	        |          }||||	fS )ay  
    Args:
        joints: heads of bones
        
        p_joints: parent position of joints
        
        tails_dict: tail position of the i-th joint
        
        convert_leaf_bones_to_tails: remove leaf bones and make them tails of their parents
        
        extrude_tail_for_leaf: add a tail for leaf bone
        
        extrude_tail_for_branch: add a tail for joint with multiple children
        
        extrude_scale: length scale of tail offset
        
        strict: if true, raise error when there are joints in the same location
        
    Returns:
        bones, tails, available_bones_id, parents
    FzEcannot extrude tail for leaf when convert_leaf_bones_to_tails is Truer   NrK   rD   r   c                     g | ]}|S r)   r)   ).0rQ   s     r   
<listcomp>z!make_skeleton.<locals>.<listcomp>  s    ???Aa???r    g&.>z"two joints in the same point found)        r   g      ?   r   )r6   rL   lenrP   rc   rd   rM   rN   rO   stackr   listlinalgnormarray)rF   rH   r   r   r   r   r   r   r,   r?   rQ   jointrS   rT   rU   rV   rW   childrenavailable_bones_iddlengthav_lenchildr-   s                           r   make_skeletonr      s`   > (*??%GGG  JQGGG<?hnQ/////EG''  
Eu::??LL77888NN4   1+%((## 	 	AAhqrrlW,q05577Es{{R^VC[%$899:::sHUOOE4  Hg&&    C;Q" @!'** 	+ 	+HQ8A;1$$"))!,,,#AqrrElJsOO		+ @?u{1~)>)>??? g&& ) )Cx{q    		)aeuS!""W~-AY^^A&&F +}}}&J}}}}4H\\\**!!QRR%L1}+<<JqMM!!QRR%LJqMM g&& ) )Cx{q  " 	){%a[ N NEbinnU1abb5\E%)<L-LMMMFF#hqk***!QRR%L28R]V5K,L#M#MM!QRR%L5abb>1** /!D===*N====t^^..A!!QRR%L1}+<<JqMM!!QRR%LJqMM g&& ) )Cx{q  AeQRRi(
1E5;q>"" $ $Z]####HUOOE%+W44r    )r   F)abcr   r   collectionsr   typingr   numpyrc   r   r   r	   r
   dataclassesr   data.exporterr   
data.orderr   r   r   r   r+   r=   rj   r&   boolr'   r   r)   r    r   <module>r      s{   # # # # # # # # # # # # # #                 % % % % % % % % % % ! ! ! ! ! ! $ $ $ $ $ $ 6 6 6 6 6 6 6 6 6 6
$
 
 
 
 
 
 
 
< $# # # # # # # #4 $@] @] @] @] @]h @] @] @]D8 8 8 8 8C 8 8 8B u5 u5u5u5 S'\"u5 "&	u5
  u5 "u5 u5 u5 7GT#YU49-=(>>?u5 u5 u5 u5 u5 u5r    