
    HhB                     h   d dl Z d dl mZmZmZmZ d dlmc mZ d dlZ	d dlm
Z
 d dlmZmZ d dlmZmZ d dlZd dlZd dl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j                  Z G d dej                  Z G d dej                  Z  G d dej                  Z! G d de          Z"dS )    N)nnFloatTensor
LongTensorTensor)pad)DictList)AutoModelForCausalLM
AutoConfig)MHA   )	ModelSpec
ModelInput)MAP_MESH_ENCODERget_mesh_encoder   )linear_blend_skinningc                   r     e Zd ZdZ	 	 	 	 	 ddedededed	ed
df fdZd Zdej	        d
ej	        fdZ
 xZS )FrequencyPositionalEmbeddinga  The sin/cosine positional embedding. Given an input tensor `x` of shape [n_batch, ..., c_dim], it converts
    each feature dimension of `x[..., i]` into:
        [
            sin(x[..., i]),
            sin(f_1*x[..., i]),
            sin(f_2*x[..., i]),
            ...
            sin(f_N * x[..., i]),
            cos(x[..., i]),
            cos(f_1*x[..., i]),
            cos(f_2*x[..., i]),
            ...
            cos(f_N * x[..., i]),
            x[..., i]     # only present if include_input is True.
        ], here f_i is the frequency.

    Denote the space is [0 / num_freqs, 1 / num_freqs, 2 / num_freqs, 3 / num_freqs, ..., (num_freqs - 1) / num_freqs].
    If logspace is True, then the frequency f_i is [2^(0 / num_freqs), ..., 2^(i / num_freqs), ...];
    Otherwise, the frequencies are linearly spaced between [1.0, 2^(num_freqs - 1)].

    Args:
        num_freqs (int): the number of frequencies, default is 6;
        logspace (bool): If logspace is True, then the frequency f_i is [..., 2^(i / num_freqs), ...],
            otherwise, the frequencies are linearly spaced between [1.0, 2^(num_freqs - 1)];
        input_dim (int): the input dimension, default is 3;
        include_input (bool): include the input tensor or not, default is True.

    Attributes:
        frequencies (torch.Tensor): If logspace is True, then the frequency f_i is [..., 2^(i / num_freqs), ...],
                otherwise, the frequencies are linearly spaced between [1.0, 2^(num_freqs - 1);

        out_dim (int): the embedding size, if include_input is True, it is input_dim * (num_freqs * 2 + 1),
            otherwise, it is input_dim * num_freqs * 2.

       T   	num_freqslogspace	input_diminclude_input
include_pireturnNc                    t                                                       |r$dt          j        |t          j                  z  }n(t          j        dd|dz
  z  |t          j                  }|r|t          j        z  }|                     d|d           || _        || _	        | 
                    |          | _        dS )	zThe initializationg       @)dtypeg      ?r   frequenciesF)
persistentN)super__init__torcharangefloat32linspacepiregister_bufferr   r   	_get_dimsout_dim)selfr   r   r   r   r   r    	__class__s          F/data/cameron/tmprepos/clean_dreammesh/UniRig/src/model/unirig_skin.pyr#   z%FrequencyPositionalEmbedding.__init__6   s     	 	iu}!M!M!MMKK.SY]+Yem  K  	$58#K]KEJJJ*"~~i00    c                 R    | j         s| j        dk    rdnd}|| j        dz  |z   z  }|S )Nr   r   r   )r   r   )r,   r   tempr+   s       r.   r*   z&FrequencyPositionalEmbedding._get_dimsR   s:    &D$.A*=*=qq1t~1D89r/   xc                    | j         dk    r |d                                         | j                            |j                  z  j        g |j        dd         dR  }| j        r=t          j	        ||
                                |                                fd          S t          j	        |
                                |                                fd          S |S )a  Forward process.

        Args:
            x: tensor of shape [..., dim]

        Returns:
            embedding: an embedding of `x` of shape [..., dim * (num_freqs * 2 + temp)]
                where temp is 1 if include_input is True and 0 otherwise.
        r   ).N)deviceNdim)r   
contiguousr    tor4   viewshaper   r$   catsincos)r,   r2   embeds      r.   forwardz$FrequencyPositionalEmbedding.forwardX   s     >A[Qy\,,..1A1D1DAH1D1U1UU[ "!  E ! Ey!UYY[[%))++!>BGGGGy%))++uyy{{!;DDDDHr/   )r   Tr   TT)__name__
__module____qualname____doc__intboolr#   r*   r$   r   r@   __classcell__r-   s   @r.   r   r      s        " "L "1 11 1 	1
 1 1 
1 1 1 1 1 18   %,        r/   r   c                   .     e Zd Zdedef fdZd Z xZS )ResidualCrossAttnfeat_dim	num_headsc                    t                                                       ||z  dk    s
J d            t          j        |          | _        t          j        |          | _        t          ||d          | _        t          j        t          j	        ||dz            t          j
                    t          j	        |dz  |                    | _        d S )Nr   z'feat_dim must be divisible by num_headsT)	embed_dimrL   
cross_attn   )r"   r#   r   	LayerNormnorm1norm2r   	attention
SequentialLinearGELUffn)r,   rK   rL   r-   s      r.   r#   zResidualCrossAttn.__init__o   s    )#q(((*S(((\(++
\(++
x9QUVVV=Ih1--GIIIhlH--
 
r/   c                     |}|                      ||          }|                     ||z             }|                     ||                     |          z             }|S )N)x_kv)rT   rR   rS   rX   )r,   qkvresidualattn_outputr2   s         r.   r@   zResidualCrossAttn.forward}   sV    nnQRn00JJx+-..JJq488A;;''r/   )rA   rB   rC   rE   r#   r@   rG   rH   s   @r.   rJ   rJ   n   sZ        
 
 
 
 
 
 
 
      r/   rJ   c            
       P     e Zd Zdededededef
 fdZdeded	ed
edef
dZ xZS )BoneEncoderfeat_bone_dimrK   rN   rL   num_attnc                 $   t                                                       || _        || _        || _        || _        t          | j                  | _        t          j	        | j        t          j
        | j        j        |          t          j        |          t          j                    t          j
        ||dz            t          j        |dz            t          j                    t          j
        |dz  |          t          j        |          t          j                    
  
        | _        t          j                    | _        t#          | j                  D ]/}| j                            t'          || j                             0d S )N)r   rP   )r"   r#   ra   rK   rL   rb   r   position_embedr   rU   rV   r+   rQ   rW   bone_encoder
ModuleListattnrangeappendrJ   )r,   ra   rK   rN   rL   rb   _r-   s          r.   r#   zBoneEncoder.__init__   sE    	* " :TEWXXXMId)19==L##GIIIiQ//LQ''GIIIi!mX..L""GII
 
 MOO	t}%% 	J 	JAI.xHHIIII	J 	Jr/   	base_bone	num_bonesparents	min_coordglobal_latentsc                 h   |j         d         }|j         d         }|                     ||d d d d d f         z
                      d|j         d                                                 ||d          }t          j        ||gd          }	t          | j                  D ]\  }
} |||	          }|S )Nr   r   r5   r6   )r;   re   reshaper$   r<   	enumeraterg   )r,   rk   rl   rm   rn   ro   BJr2   latentsirg   s               r.   r@   zBoneEncoder.forward   s     OAOAy111dAAA:)>>GGIO\^L_``aaiijkmnprss)Q/Q777"49-- 	! 	!IQQ  AAr/   )	rA   rB   rC   rE   r#   r   r   r@   rG   rH   s   @r.   r`   r`      s        JJ J 	J
 J J J J J J J@  	
  $       r/   r`   c                   $     e Zd Z fdZd Z xZS )SkinweightPredc                 h   t                                                       t          j        t          j        ||          t          j        |          t          j                    t          j        ||          t          j        |          t          j                    t          j        ||          t          j        |          t          j                    t          j        ||          t          j        |          t          j                    t          j        |d                    | _        d S )Nr   )r"   r#   r   rU   rV   rQ   rW   net)r,   in_dimmlp_dimr-   s      r.   r#   zSkinweightPred.__init__   s    =Ifg&&L!!GIIIgw''L!!GIIIgw''L!!GIIIgw''L!!GIIIgq!!
 
r/   c                 ,    |                      |          S )N)rz   )r,   r2   s     r.   r@   zSkinweightPred.forward   s    xx{{r/   )rA   rB   rC   r#   r@   rG   rH   s   @r.   rx   rx      sG        
 
 
 
 
$      r/   rx   c                   v     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fdZ
defd	Z xZS )

UniRigSkinbatchr   c                 .   d}|D ]}t          ||j        j                  }g }d}|D ]l}|j        j        }||j        j        d         z  }|d         }t          j        |dd||j        j        z
  ffdd          }|                    ||d           m|S )Nr   
voxel_skin)r   r   constantg        )constant_values)r   offset)	maxassetrt   sampled_vertex_groupsverticesr;   npr   ri   )r,   r   	max_bonesbrescurrent_offsetvertex_groupsr   s           r.   
process_fnzUniRigSkin.process_fn   s    	 	2 	2AIqwy11II 	 	AG9Maj.q11N&|4J
Va1799L5M,NPZlopppJ JJ((      
r/   c                 H    t                                                       |d          _        |d          _        |d          _        |d          _        |d          _        |d          _        |d          _        |d          _	        |
                    d	d
           _        t          di | _        t          di | _        t           j        t           j                  rht%          j        t%          j        |d         d          j                  t%          j         j                  t%          j                               _        nt1                      t           j        t           j                  rft%          j        t%          j         j        j         j                  t%          j         j                  t%          j                               _        nt1                      t9          d j         j	         j         j                   _        t%          j        t%          j        d
 j        z   j                  t%          j         j                  t%          j                               _        t?           j         j                   _         t%          j!                     _"         j"        #                     fdtI           j                  D                        t%          j         j         j         j        z             _%        t%          j         j         j         j        z             _&        t%          j        d j                   _'        t%          j         j                   _(        t%          j         j                   _)        d S )Nnum_train_vertexrK   rL   	grid_sizer|   num_bone_attnnum_mesh_bone_attnbone_embed_dim
voxel_maskr   enc_channelsr5   r   )ra   rK   rN   rL   rb   c                 D    g | ]}t          j        j                  S  )rJ   rK   rL   ).0rj   r,   s     r.   
<listcomp>z'UniRigSkin.__init__.<locals>.<listcomp>  s5     $
 $
 $
ABdmT^<<$
 $
 $
r/   r   r   )*r"   r#   r   rK   rL   r   r|   r   r   r   getr   r   mesh_encoderglobal_encoder
isinstancer   ptv3objr   rU   rV   rQ   rW   feat_mapNotImplementedErrormichelangelo_encoderwidthout_projr`   re   	downscalerx   skinweight_predrf   mesh_bone_attnextendrh   qmeshkmeshvoxel_skin_embedvoxel_skin_normattn_skin_norm)r,   r   r   kwargsr-   s   `   r.   r#   zUniRigSkin.__init__   s   &,-?&@&,Z&8&,[&9&,[&9&,Y&7&,_&=&,-A&B&,-=&>&,jjq&A&A,<<|<<.@@@@d')9)ABB 	(M	,~6r:DMJJT]++		 DMM &'''d)+;+PQQ 	(M	$-3T]CCT]++		 DMM &''''])n'
 
 
 Ia$.($.99L((GII
 

  .NL 
  

 !moo"" $
 $
 $
 $
FKDLcFdFd$
 $
 $
 	 	 	 Yt}dmdn.LMM
Yt}dmdn.LMM
 "	!T^ < <!|DN;; l4>::r/   r   normalsc                 ,   t          j        |                                          rJ t          j        |                                          rJ t          | j        t
          j                  rt          |j                  dk    r"| j        	                    ||          \  }}}}nG| j        	                    |
                    d          |
                    d                    \  }}}}|                     |          }|S t                      )Nr   )pcfeatsr   )r$   isnananyr   r   r   r   lenr;   encode_latents	unsqueezer   r   )r,   r   r   shape_embedru   	token_numpre_pcs          r.   encode_mesh_condzUniRigSkin.encode_mesh_cond#  s    ;x((,,.....;w''++-----d)+;+PQQ 	(HN##q((:>:M:\:\`hpw:\:x:x7Wi:>:M:\:\`h`r`rst`u`u  ~E  ~O  ~O  PQ  ~R  ~R:\  ;S  ;S7WimmG,,GN%'''r/   c                   ' |d         }|d         }|d         }|d         }|d         }|d         }|d         }t          |                                           j        }	|                    |	          }|                    |	          }|                    |	          }|                    |	          }|                    |	          }|j        d         }
|j        d	         '|j        d	         }|                                d
k    sJ |                                d
k    sJ t          j        'fdt          |
          D             t          j	        |j
                  }t          j        j                            |dd          }t          j        |                    dd
          |d          }g }| j        r7t          j        '          d| j                 }|                    |           nnt          '| j        z   d	z
  | j        z            D ]K}|                    t          j        || j        z  t-          |d	z   | j        z  '                               L|                     ||          }|                     |||||          }t3          | j        t6          j                  r_t          j        ||t          j        |          gd          }|                    dd
          |                    dd          t          j        |d                   | j        d}| j        st          j         dt          j!                  5  |                     |          j"        }| #                    |          $                    |
'| j%                  }ddd           n# 1 swxY w Y   nI|                     |          j"        }| #                    |          $                    |
'| j%                  }|                    |	          }ntM                      t          j        ||gd	          }| j'        D ]} |||          }| (                    |          $                    |
|| j)        | j%                  *                    d	d          }g }| j        sq|+                                }t          |
          D ]M}||         }t          |          D ]3}|||f         }|dk     r||dd|fxx         ||dd|f         z  cc<   4N|D ]}tY          |          }| -                    |dd|f                   $                    |
|| j)        | j%                  *                    d	d          } t]          j/        t          j0        |                     |
| j)        z  |d          |*                    dd                              |
| j)        z  d|                    tc          j2        | j%                  z  d|	          }!|!                    |
| j)        ||          3                    ddd
d	          }!| 4                    |!          }!| 5                    |dd|f                             |
||d	                    }"| 6                    |"          }"t          j        |!|"gd          }!| 7                    |!          }!t          j8        |
||          9                    |!j
        |	          }#t          |
          D ]}|!|ddd||         ddf                             d|!j        d                   }$| :                    |$                              |||                   }%t]          j/        |%          |#|ddd||         f<   |                    |#           t          j        |d	          }t          |
          D ]}||         }&||ddd|&f         t          j;        ||ddd|&f         | j<                  z  ||ddd|&f<   ||ddd|&f         ||ddd|&f         =                    dd          z  ||ddd|&f<   |t          j        |d          fS ) z(
        Return predicted skin.
        rl   r   r   jointstailsr   rm   r   r   r   c                      g | ]
}|d z   z  S )r   r   )r   rv   Ns     r.   r   z+UniRigSkin._get_predict.<locals>.<listcomp>L  s!    #>#>#>QqS!G#>#>#>r/   )r   r4   )r   r   )valuer5   min)reduceN)rk   rl   rm   rn   ro   r6   	   r   )coordfeatr   r   cuda)device_typer   )r[   r\   r   )r7   r   T)r7   keepdim)>next
parametersr   typer;   r7   r$   tensorrh   int64r4   r   
functionalr   torch_scattersegment_csrrq   trainingrandpermr   ri   r%   r   r   re   r   r   r   r   r<   
zeros_liker   autocastr&   r   r   r:   rK   r   r   r   rL   	transposecloner   r   Fsoftmaxbmmmathsqrtpermuter   r   r   r   zerosr9   r   powr   sum)(r,   r   rl   r   r   r   r   r   rm   r   rs   rt   part_offsetidx_ptrrn   packtrain_indicesrv   ro   	bone_featr   
ptv3_input	mesh_featru   blockskin_pred_list	skin_maskr   numpindicescur_Ncur_mesh_featattn_weightembed_voxel_skin	skin_predinput_featuresprednr   s(                                          @r.   _get_predictzUniRigSkin._get_predict0  s   
 "+.	 %j 1$Y/#Ho"7^"'"5
#I. T__&&''-=='',,u%%U##

5!!__U++
N1N1LO||~~""""{{}}!!!!l#>#>#>#>U1XX#>#>#>ekZbZijjj(%))+vQ)GG!-h.>.>r1.E.EwW\]]]	= 	h!N1--.Dt/D.DEMKK&&&&A 559d>SSTT h hEL4+@)@#qsDLaFacdBeBeffgggg ..xAA%%) & 
 
	 d')9)ABB 	(9h1A(1K1KLRTUUUD!))"a00R++,uX77!^	 J = O^emLLL S S $ 1 1* = = BI $i 8 8 = =aDM R RIS S S S S S S S S S S S S S S !--j99>	 MM)4499!QNN	!u--II%''' )Y7Q???( 	 	E  II JJy))..q!T^T]SS]]^_abcc	} 	="((**I1XX = =ls = =A1A1uu aAg&&&)Aqqq!G*<<&&&&	=
  	- 	-GLLE JJyG'<==BB1eT^]a]jkkuuvwyz{{M )EI%%a$.&8%DD##B++33A4FANN% % 	$-((%) /1? ? ?K
 &--aJJRRSTVWYZ\]^^K--k::K#44Z7
5K5S5STUW\^_ab5c5cdd#334DEE)[2B$CLLLK..55K Aua0033K4FNNI1XX A A!,Q=IaL=!!!-C!D!L!LRQ\QbceQf!g!g++N;;CCE9UV<XX124	!QQQ1-..!!),,,,>q999q 	u 	uA!A'5aBQBh'?%)IVWYZYZYZ\^]^\^V^L_aeapBqBq'qN1aaa!8$'5aBQBh'?.QRTUTUTUWYXYWYQYBZB^B^ceosB^BtBt'tN1aaa!8$$uy155555s   A
N''N+.N+c           
      0   t          j                    5  |d         }|                     |          \  }}g }t          |j        d                   D ]*}|                    ||d d d ||         f                    +|cd d d            S # 1 swxY w Y   d S )Nrl   )r   r   )r$   no_gradr   rh   r;   ri   )r,   r   rl   r   rj   outputsrv   s          r.   predict_stepzUniRigSkin.predict_step  s    ]__ 	 	 %k 2I,,5,99LIqG9?1-.. ? ?yAAA}	!})<=>>>>	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A*BBB)rA   rB   rC   r	   r   r   r   r#   r   r   r   r   rG   rH   s   @r.   r   r      s        Z 0 T$Z    *<; <; <; <; <;|( ({ ({ ( ( ( (~6$ ~6; ~6 ~6 ~6 ~6@$        r/   r   )#r$   r   r   r   r   torch.nn.functionalr   r   numpyr   r   typingr   r	   transformersr
   r   r   r   flash_attn.modules.mhar   specr   r   parse_encoderr   r   
data.utilsr   Moduler   rJ   r`   rx   r   r   r/   r.   <module>r     s    5 5 5 5 5 5 5 5 5 5 5 5              # # # # # #         9 9 9 9 9 9 9 9      & & & & & & ' ' ' ' ' ' ' ' = = = = = = = = . . . . . .[ [ [ [ [29 [ [ [z    	   ,2 2 2 2 2") 2 2 2h    RY   ,j j j j j j j j j jr/   