
    Hh                         d dl Z d dl mZmZ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mZ ddlmZmZ ddlmZmZ d	d
lmZmZ d dlmZ  G d de          ZdS )    N)nnFloatTensor
LongTensor)pad)DictListUnion)AutoModelForCausalLM
AutoConfig   )	ModelSpec
ModelInput)MAP_MESH_ENCODERget_mesh_encoder   )TokenizerSpecDetokenzeOutput)deepcopyc            
            e Zd Zdee         dee         fdZ fdZdededefdZ	dedee
ef         fdZd	efd
Z ej                    	 ddededee
df         defd            ZddedefdZ xZS )UniRigARbatchreturnc                     |d         j         &d t          t          |                    D             S d|D ]"}t          |j        j        d                   #fd|D             }|S )Nr   c                     g | ]}i S  r   ).0_s     D/data/cameron/tmprepos/clean_dreammesh/UniRig/src/model/unirig_ar.py
<listcomp>z'UniRigAR.process_fn.<locals>.<listcomp>   s    2221B222    c           
         g | ]}t          j        |j        d |j        j        d          z
  fd|j                  t          j        t	          j        |j        j        d                    d |j        j        d          z
  fdd          dS )r   constant)constant_valuesg        )	input_idsattention_mask)npr   tokensshapetorchones)r   b
max_lengths     r   r   z'UniRigAR.process_fn.<locals>.<listcomp>   s         Az!(.:K/K+Lzklkpqqq fUZq0A%B%BaVWV^VdefVgIgEhku  HJ  K  K  K
 
   r    )jointsrangelenmaxr'   r(   )selfr   r+   resr,   s       @r   
process_fnzUniRigAR.process_fn   s    8?"22c%jj 1 12222
 	< 	<AZ):;;JJ       
r    c                    t                                                       |                    d          | _        | j        j        | _        |                                }| j        j        |d<   t          j        di |}t          j	        |_
        d|_        t          j        |          | _        |j        | _        t!          di || _        t%          | j        t&          j                  st%          | j        t&          j                  r+t-          j        | j        j        | j                  | _        d S t5                      )N	tokenizer
vocab_sizeT)configr   )super__init__getr5   r6   copyr   from_pretrainedr)   float32torch_dtypepre_normr
   from_configtransformerhidden_sizer   mesh_encoder
isinstancer   michelangelomichelangelo_encoderr   Linearwidthoutput_projNotImplementedError)r1   llmrC   kwargs_d
llm_config	__class__s         r   r9   zUniRigAR.__init__   s   (.

;(?(?.3XXZZ>4</55"55
!&
"
/;:NNN?,<<|<< t(*:*GHH	(t(*:*OPP	(  "y):)@$BRSSD%'''r    verticesnormalsc                 j   t          j        |                                          rJ t          j        |                                          rJ t          | j        t
          j                  st          | j        t
          j                  rt          |j	                  dk    r"| j        
                    ||          \  }}}}nG| j        
                    |                    d          |                    d                    \  }}}}|                     |          }|S t                      )N   )pcfeatsr   )r)   isnananyrD   rC   r   rE   rF   r/   r(   encode_latents	unsqueezerI   rJ   )r1   rP   rQ   shape_embedlatents	token_numpre_pcs          r   encode_mesh_condzUniRigAR.encode_mesh_cond6   s=   ;x((,,.....;w''++-----t(*:*GHH	(t(*:*OPP	( HN##q((:>:K:Z:Z^fnu:Z:v:v7Wi:>:K:Z:Z^f^p^pqr^s^s  |C  |M  |M  NO  |P  |P:Z  ;Q  ;Q7Wi&&w//GN%'''r    c                    |                      |d         |d                                       | j        j                  }|j        d         }|d         } | j                                        |                              | j        j                  }t          j        ||gd          }|d	         }t          ||j        d         dddfd
          }|                     ||          }|j	        d d |j        d         d f         
                    |d| j                  }|j        }	|d d d df         }| j        j        }
t          j        j                            |d          }|d d dd f                                         }||
k     }t          j        |
|	                              ddd          }||                    d                              dd|
          z
                      t          j                  |
z  }|d d d d d |
f         t          j        |          z  |                                         dz  }d||d d |j        d         dz   d f         dk    <   t          j        |                                          r
J |            t          j                            |                    ddd          |          }||dS )NrP   rQ   rP   rQ   dtyper   r$   r   dimr%   g      ?value)inputs_embedsr%   )devicer   2   i)ce_lossdis_loss)r^   torA   rb   r(   get_input_embeddingsr)   concatr   logitsreshaper6   ri   r5   num_discreter   
functionalsoftmaxclonearangeviewrY   repeattyper=   abssumrV   rW   cross_entropypermute)r1   r   condBr$   rg   r%   outputlogitri   rr   slabelmaskdisrl   rk   s                    r   training_stepzUniRigAR.training_stepF   s   $$eJ.?yIY$ZZ]]dhdtdz]{{JqM %k 2	?(==??	JJMMTXTdTjMkkdM%:BBB/0^djmQ1-ERPPP!!') " 
 
 aaaA/088BPPaaa"f~2H''2'66!!!QRR% &&((|#l<777<<Q2FFU__Q''..q!\BBBHHWWZffaaaM\M)*UYs^^;TBFFHH2M:>nQQQ
1 1 2 223Q67;u%%))++22U22+---emmAq!.D.DeLL 
 
 	
r    datac                 .    |                      |          S )N)r   )r   )r1   r   s     r   forwardzUniRigAR.forwardm   s    !!t!,,,r    Nclsc                 x   |                      ||                              | j        j                  }| j        j        g}|.|                    | j                            |                      | j                                        t          j
        |t          j        |j                                      d                                        | j        j                  }t          j        ||gd          } | j        j        d|| j        j        | j        j        | j        j        d	|}|dddf         }	t%          |          D ]}
t#          |	d
|
          }	|	                                                                                                }	| j                            |	          }|S )z'
        Do not support batch!
        r`   ra   N)r   )rb   ri   r   r   rc   )rg   bos_token_ideos_token_idpad_token_id)r   r   re   )idsr   )r^   rm   rA   rb   r5   bosappendcls_name_to_tokenrn   r)   tensorlongri   rY   catgenerateeosr   reverseddetachcpunumpy
detokenize)r1   rP   rQ   r   rL   r~   start_tokensstart_embedresults
output_idstokenr2   s               r   r   zUniRigAR.generatep   s    $$h$HHKKRVRbRhKii*+? @ @S @ I IJJJ=d&;;==LUZLLLVVWXYY
 

"4#)"
*
* 	 y$,!444+$"+ 
+++	
 

 
 
 QT]
l++ 	> 	>EZu===JJ&&((,,..4466
n''J'77
r    Fno_clsc                 0   |d         }|d         }|d         }|d         }t          |d                   }|                    dd          }|                    dd          }|                    d	d           }	|                    dd            |                    dd            |                    d	d            |                                d
k    r*|                    d          }|                    d          }g }
t          |j        d                   D ]}}|rd }nD|	|	}n?|r5||                             d                              d          d         }n||         } | j	        d||         ||         |d|}|

                    |           ~|
S )NrP   rQ   pathr   generate_kwargsr   Fuse_dir_cls
assign_clsr   r   z.//)rP   rQ   r   r   )r   r:   poprd   rY   r.   r(   removeprefixsplitr   r   )r1   r   r   rP   rQ   pathsr   r   r   r   outputsi_clsr2   s                 r   predict_stepzUniRigAR.predict_step   s   "'
"3"'	"2"'-El"5):#;<< $$Xu55%))-??$((t<<
Hd+++M4000L$///<<>>Q))!,,H((++Gx~a()) 
	  
	 A '! Qx,,T2288==a@1v$-f!gajdffVeffCNN3r    )N)F)__name__
__module____qualname__r   r   r   r3   r9   r   r^   strr   r   r)   no_gradr	   r   r   boolr   __classcell__)rO   s   @r   r   r      s]       
Z 0 
T$Z 
 
 
 
( ( ( ( (4( ({ ({ ( ( ( ( %
4 %
Dk1A,B %
 %
 %
 %
N-D - - - - U]__
 #	" "" " 39	" 
" " " _"H $         r    r   )r)   r   r   r   r   r&   torch.nn.functionalr   typingr   r   r	   transformersr
   r   specr   r   parse_encoderr   r   tokenizer.specr   r   r;   r   r   r   r    r   <module>r      s    - - - - - - - - - -     # # # # # # $ $ $ $ $ $ $ $ $ $ 9 9 9 9 9 9 9 9 ' ' ' ' ' ' ' ' = = = = = = = = ; ; ; ; ; ; ; ;      e e e e ey e e e e er    