
    Hh"                         d dl Zd dl mZ d dlmZmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ  G d	 d
e	          Zdedeeef         dedefdZdedeeef         dedefdZdS )    N)ndarray)DictTupleUnionList   )TokenizerSpecTokenizeInputDetokenzeOutputTokenizerConfig)make_skeleton   )	get_orderc                       e Zd Zdef fdZdedefdZdedefdZde	de
fd	Zd
e
defdZdee         fdZed             Zed             Zed             Zed             Zed             Zedeeef         fd            Z xZS )TokenizerPartconfigc                 |   t                                                       |j        | _        |j        | _        |j                                        | _        |j                                        | _        t          |j
                  | _        |j        }|dz   | _        |dz   | _        |dz   | _        |dz   | _        |dz  }|dz   | _        |dz  }d | j        vsJ | j        D ]}| j        |xx         |z  cc<   |t#          | j                  z  }|dz   | _        |dz  }| j        D ]}| j        |xx         |z  cc<   |t#          | j                  z  }|| _        d | j        D             | _        d | j                                        D             | _        t#          | j                  t#          | j                  k    s
J d            d | j        | j        <   d	 | j                                        D             | _        t#          | j                  t#          | j                  k    s
J d
            d S )Nr   r   r         c                     g | ]}|S  r   ).0xs     M/data/cameron/tmprepos/clean_dreammesh/UniRig/src/tokenizer/tokenizer_part.py
<listcomp>z*TokenizerPart.__init__.<locals>.<listcomp>/   s    #C#C#C!A#C#C#C    c                     i | ]\  }}||	S r   r   r   kvs      r   
<dictcomp>z*TokenizerPart.__init__.<locals>.<dictcomp>1   s    "P"P"PDAq1a"P"P"Pr   z-names with same token found in parts_token_idc                     i | ]\  }}||	S r   r   r   s      r   r!   z*TokenizerPart.__init__.<locals>.<dictcomp>5   s    !M!M!M41a!Q!M!M!Mr   z+names with same token found in cls_token_id)super__init__num_discrete_num_discretecontinuous_range_continuous_rangecls_token_idcopyparts_token_idr   order_configordertoken_id_branchtoken_id_bostoken_id_eostoken_id_padtoken_id_springlentoken_id_cls_none_vocab_sizeparts_token_id_nameitemspart_token_to_namecls_token_to_name)selfr   _offseti	__class__s       r   r$   zTokenizerPart.__init__   sc    	"("5"("9"("5":":"<"<"("7"<"<">">"+F,?"@"@
"("5&{&{&{&{1!(114.....$ 	. 	.A"""g-""""3t*+++!(11" 	, 	,Aa   G+    3t()))"#C#Ct/B#C#C#C "P"PD4G4M4M4O4O"P"P"P4*++s43F/G/GGGGIxGGG8< 45!M!M43D3J3J3L3L!M!M!M4)**c$2C.D.DDDDFsDDDDDr   clsreturnc                 <    || j         vr| j        S | j         |         S N)r)   r4   )r:   r>   s     r   cls_name_to_tokenzTokenizerPart.cls_name_to_token8   s'    d''')) %%r   partc                 J    || j         v sJ d| d            | j         |         S )Nzdo not find part name    `z` in tokenizer)r+   )r:   rC   s     r   part_name_to_tokenz TokenizerPart.part_name_to_token=   s8    t****,],],],]***"4((r   inputc                 >   |j         }t          |j        | j        | j                  }t          |j        | j        | j                  }|j        }|j        }| j        g}|j	        |j	        | j
        vr|                    | j                   n%|                    | j
        |j	                            d}t          |          D ]}	|	|j        v rh|j        |	         }
|
|                    | j                   n>|
| j        v sJ d|
 d| j                     |                    | j        |
                    ||	         r|                    | j                   |                    ||	df                    |                    ||	df                    |                    ||	df                    |                    ||	df                    |                    ||	d	f                    |                    ||	d
f                    F|                    ||	df                    |                    ||	d	f                    |                    ||	d
f                    |                    | j                   t)          j        |t(          j                  S )Ntr'   r%   Fzdo not find part name z in tokenizer r   r   r   r   r      )dtype)	num_bones
discretizebonesr'   r%   tailsbranchis_leafr/   r>   r)   appendr4   range
parts_biasr2   r+   r=   r.   r0   nparrayint64)r:   rF   rL   rN   rO   rP   rQ   tokensuse_leafr<   rC   s              r   tokenizezTokenizerPart.tokenizeA   s   O	U[4;P_c_pqqqU[4;P_c_pqqq-#$9	1B B BMM$01111MM$+EI6777y!! 	+ 	+AE$$$'*<MM$"677774#66668uQU8u8ueies8u8u666MM$"5d";<<<ay +d2333eAqDk***eAqDk***eAqDk***eAqDk***eAqDk***eAqDk****eAqDk***eAqDk***eAqDk****d'(((xbh////r   idsc                    t          |t                    s
J d            |d         | j        k    rt          d          d}||j        d         k     r@|| dz
           | j        k    r+|dz  }||j        d         k     r|| dz
           | j        k    +|d|z
           | j        k    rt          d          |dd|z
           }g }g }i }g }d}d}	d }
d}|t          |          k     r||         | j        k     r|	rt          |||dz            | j
        | j        	          }t          ||dz   |d
z            | j
        | j        	          }|                    |           |                    |           |d
z  }nt          |||dz            | j
        | j        	          }|                    |           t          |          dk    r|                    |           |}n|
J |                    |
           |
}|dz  }|
|||dz
  <   |}
|dz  }d}	n||         | j        k    r
d}	d }
|dz  }n||         | j        k    s!||         | j                                        v r,|                    | j        ||                             |dz  }n`||         | j                                        v r||         }|dz  }n1||         | j        k    rd }|dz  }nt          d||                    |t          |          k     t'          j        |          }t'          j        |          }t+          |||ddd          \  }}}}||         }||         }|| j        v r| j        |         }nd }| j        | j                            |||          }nd t3          |          D             }t5          ||||d |||| j
        	  	        S )Nzexpect ids to be ndarrayr   zfirst token is not bosr   zlast token is not eosFr   rH      Tzunexpected token found: )jointsp_joints
tails_dictconvert_leaf_bones_to_tailsextrude_tail_for_leafextrude_tail_for_branch)r>   partsrL   c                     g | ]}d | S )bone_r   )r   r<   s     r   r   z,TokenizerPart.detokenize.<locals>.<listcomp>   s    ;;;Q[Q[[;;;r   )	rX   parentsrN   rO   no_skinr>   re   namesr'   )
isinstancer   r/   
ValueErrorshaper1   r0   r3   r%   undiscretizer'   rR   r.   r2   r+   valuesr8   r)   r4   rU   stackr   r9   r-   
make_namesrS   r   )r:   r[   kwargstrailing_padr_   r`   ra   re   r<   	is_branch
last_jointrL   p_jointcurrent_jointr>   rN   rO   available_bones_idrh   rj   s                       r   
detokenizezTokenizerPart.detokenizeh   s   #w''CC)CCC'q6T&&&6777SYq\))c<-/.BdFW.W.WAL SYq\))c<-/.BdFW.W.Wr,4#4445666!B|O#$
	
	#c((ll1v))) *S1Q3Z$J_nrn  A  A  AG$03qs1Q3w<RVRgvz  wH  %I  %I  %IMMM-000OOG,,,FAA$03q1u:PTPetx  uF  %G  %G  %GMMM-0008}})) 666"/)555 
333",FA).;Jy{+*
Q	!		Q--- 	!
QQ---Q4;N;U;U;W;W1W1WT4SV<===QQ4,335555!fQQ4111Q !DCF!D!DEEEM #c((llN &!!8H%%4A!(-"&$(5
 5
 5
1u(' ()()$((((-CCC:!J))c))TTEE;;%	*:*:;;;E!2

 

 

 
	
r   c                     | j         S rA   )r6   r:   s    r   get_require_partszTokenizerPart.get_require_parts   s    ''r   c                     | j         S rA   )r5   r{   s    r   
vocab_sizezTokenizerPart.vocab_size   s    r   c                     | j         S rA   )r1   r{   s    r   padzTokenizerPart.pad         r   c                     | j         S rA   )r/   r{   s    r   boszTokenizerPart.bos   r   r   c                     | j         S rA   )r0   r{   s    r   eoszTokenizerPart.eos   r   r   c                     | j         S rA   )r&   r{   s    r   r%   zTokenizerPart.num_discrete   s    !!r   c                     | j         S rA   )r(   r{   s    r   r'   zTokenizerPart.continuous_range   s    %%r   )__name__
__module____qualname__r   r$   strintrB   rE   r
   r   rZ   r   ry   r   r|   propertyr~   r   r   r   r%   r   floatr'   __classcell__)r=   s   @r   r   r   
   s       +t+t +t +t +t +t +tZ&S &S & & & &
)s )s ) ) ) )$0m $0 $0 $0 $0 $0NX
g X
O X
 X
 X
 X
t(49 ( ( ( (     X  ! ! X! ! ! X! ! ! X! " " X" &%u"5 & & & X& & & & &r   r   rI   r'   r%   r?   c                     |\  }}||k    sJ | |z
  ||z
  z  } | |z  } t          j        |                                 d|dz
                                t           j                  S )Nr   r   )rU   cliproundastyperW   rI   r'   r%   lohis        r   rM   rM      sg    
 FB8888	
RBGAA717799a!12299"(CCCr   c                     |\  }}||k    sJ |                      t          j                  dz   } | |z  } | ||z
  z  |z   S )Ng      ?)r   rU   float32r   s        r   rn   rn      sO    
 FB8888	s"AAR=2r   )numpyrU   r   typingr   r   r   r   specr	   r
   r   r   r   
data.orderr   r   r   r   rM   rn   r   r   r   <module>r      sV             + + + + + + + + + + + + P P P P P P P P P P P P       " " " " " "Q& Q& Q& Q& Q&M Q& Q& Q&f	D	DE5L)	D 	D 		D 	D 	D 	D		E5L)	 	 		 	 	 	 	 	r   