
    _hR                     \   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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   )	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       @)dtype      ?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          ,/tmp/cameron/UniRig/src/model/unirig_skin.pyr#   z%FrequencyPositionalEmbedding.__init__5   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_dimsQ   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    tor5   viewshaper   r$   catsincos)r,   r2   embeds      r.   forwardz$FrequencyPositionalEmbedding.forwardW   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   rA   __classcell__r-   s   @r.   r   r      s        " "L "1 11 1 	1
 1 1 
1 1 1 1 1 18   %,        r/   r   c                   0     e Zd Zdedef fdZddZ xZS )ResidualCrossAttnfeat_dim	num_headsc                    t                                                       ||z  dk    s
J d            t          j        |          | _        t          j        |          | _        t          j        ||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_dimrM   batch_firstr   )r"   r#   r   	LayerNormnorm1norm2MultiheadAttention	attention
SequentialLinearSiLUffn)r,   rL   rM   r-   s      r.   r#   zResidualCrossAttn.__init__n   s    )#q(((*S(((\(++
\(++
.Ydhiii=Ih1--GIIIhlH--
 
r/   Nc                     |                      |          }|                     |||||          \  }}||z   }||                     |                     |                    z   }|S )N)key_padding_mask	attn_mask)rR   rU   rY   rS   )	r,   qkvkey_maskr\   r2   attn_output_s	            r.   rA   zResidualCrossAttn.forward{   s_    JJqMM1a(V_``QOA'''r/   )NN)rB   rC   rD   rF   r#   rA   rH   rI   s   @r.   rK   rK   m   s_        
 
 
 
 
 
 
 
       r/   rK   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_dimrL   rO   rM   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   r   )r"   r#   re   rL   rM   rf   r   position_embedr   rV   rW   r+   rQ   rX   bone_encoder
ModuleListattnrangeappendrK   )r,   re   rL   rO   rM   rf   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                    |j         d         }|j         d         }|                     ||d d d d d f         z
                      d|j         d                                                 ||d          }|j         d         }	t          j        ||||	z   |j                  }
t          d           |
d d d |d |f<   t          |          D ]<}||         }t          |          D ]"}|||f         }|dk    rd|
|||f<   d|
|||f<   #=|
                    | j	        d          }
t          j
        ||gd          }t          | j                  D ]+\  }}|dz  dk    r |||||
	          } ||||          },|S )
Nr   r   r6   r4   inf        r7   r   )r\   )r<   ri   reshaper$   zerosr5   floatrl   repeat_interleaverM   r=   	enumeraterk   )r,   rn   ro   rp   rq   rr   BJr2   seq_lenr\   ibone_lenjparentlatentsrk   s                    r.   rA   zBoneEncoder.forward   s    OAOAy111dAAA:)>>GGIO\^L_``aaiijkmnprss &q)K1a'k!(CCC	 %e}	!!!RaR!)q 	) 	)A |H8__ ) ) AR<<.1Ial+%(	!Q'""	) //A/FF	)Q/Q777"49-- 	. 	.IQ1uzzDGW	BBBDGW--r/   )	rB   rC   rD   rF   r#   r   r   rA   rH   rI   s   @r.   rd   rd      s        JJ J 	J
 J J J J J J J@!! ! 	!
 ! $! ! ! ! ! ! ! !r/   rd   c                   $     e Zd Z fdZd Z xZS )SkinweightPredc                    t                                                       t          j        t          j        ||          t          j        |          t          j                    t          j        ||          t          j        |          t          j                    t          j        |d                    | _        d S )Nr   )r"   r#   r   rV   rW   rQ   rX   net)r,   in_dimmlp_dimr-   s      r.   r#   zSkinweightPred.__init__   s    =Ifg&&L!!GIIIgw''L!!GIIIgq!!
 
r/   c                 ,    |                      |          S )N)r   )r,   r2   s     r.   rA   zSkinweightPred.forward   s    xx{{r/   )rB   rC   rD   r#   rA   rH   rI   s   @r.   r   r      sG        

 

 

 

 

      r/   r   c                        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deeef         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 ]}|j        j        }||j        j        d         z  }|d         }|d         }|d         }	d|v r	|d         }
nt          j        |          }
t          j        |dd||j        j        z
  ffdd	          }t          j        |dd||j        j        z
  ffdd
	          }t          j        |	dd||j        j        z
  ffdd
	          }	t          j        |
dd||j        j        z
  ffdd
	          }
|	                    |||	|
|d           |S )Nr   geodesic_distancegeodesic_mask
voxel_skinskin)r   r   constantr   )constant_valuesru   )r   r   r   r   offset)
maxassetr|   sampled_vertex_groupsverticesr<   np
zeros_liker   rm   )r,   r   	max_bonesbrescurrent_offsetvertex_groupsr   r   r   r   s              r.   
process_fnzUniRigSkin.process_fn   s   	 	2 	2AIqwy11II 	 	AG9Maj.q11N -.A B)/:M&|4J&&$V,}%677 "'86AyQRQXQZGZC[:\^hz} ~ ~ ~F=6Ay?R;S2TV`ruvvvM
Va1799L5M,NPZlopppJ6$!Yqwy-@)A BJ`cdddD JJ%6!.((      
r/   c                     t                                                       |d          _        |d          _        |d          _        |d          _        |d          _        |d          _        |d          _        |d          _	        t          di | _        t          di | _        t           j        t          j                  rIt!          j        t!          j         j         j                  t!          j                               _        nt+                      t           j        t          j                  rNt!          j        t!          j         j        j         j                  t!          j                               _        nt+                      t3          d	 j         j	         j         j        
           _        t7          d j        z   j                   _        t!          j                     _         j                             fdtA           j                  D                        t!          j         j         j         j        z             _!        t!          j         j         j         j        z             _"        t!          j        d j                   _#        t!          j        d j                   _$        t!          j        d j                   _%        d S )Nnum_train_vertexrL   rM   	grid_sizer   num_bone_attnnum_mesh_bone_attnbone_embed_dimr   )re   rL   rO   rM   rf      c                 D    g | ]}t          j        j                  S  )rK   rL   rM   ).0rb   r,   s     r.   
<listcomp>z'UniRigSkin.__init__.<locals>.<listcomp>$  s5     $
 $
 $
ABdmT^<<$
 $
 $
r/   r   r   )&r"   r#   r   rL   rM   r   r   r   r   r   r   mesh_encoderglobal_encoder
isinstancer   ptv3objr   rV   rW   rX   feat_mapNotImplementedErrormichelangelo_encoderwidthout_projrd   ri   r   skinweight_predrj   mesh_bone_attnextendrl   qmeshkmeshgeo_dis_embedgeo_mask_embedvoxel_skin_embed)r,   r   r   kwargsr-   s   `   r.   r#   zUniRigSkin.__init__   s   &,-?&@&,Z&8&,[&9&,[&9&,Y&7&,_&=&,-A&B&,-=&>,<<|<<.@@@@d')9)ABB 	(M	$-77		 DMM
 &'''d)+;+PQQ 	(M	$-3T]CC		 DMM
 &''''])n'
 
 
  .L 
  

 !moo"" $
 $
 $
 $
FKDLcFdFd$
 $
 $
 	 	 	 Yt}dmdn.LMM
Yt}dmdn.LMM
Yq$.99 i4>:: "	!T^ < <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_embedr   	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                 j  & |d         }|d         }|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                  rLt          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tK                      t          j        ||gd          }| j&        D ]} ||||          }| '                    |          #                    ||| j(        | j$                  )                    dd          }g }|D ]}tU          |          }| +                    |dd|f                   #                    ||| j(        | j$                  )                    dd          }tY          j-        t          j.        |                    || j(        z  |d          |)                    dd                              || j(        z  d|                    t_          j0        | j$                  z  d|          }|                    || j(        ||          1                    d
ddd          }| 2                    |dd|f                             |||d                    } | 3                    |	dd|f                             |||d                    }!| 4                    |dd|f                             |||d                    }"t          j        ||"| |!gd          }t          j5        |||          6                    |j
        |          }#t          |          D ]}||ddd||         ddf                             d|j        d                   }$| 7                    |$                              |||                   }%tY          j-        |%          |#|ddd||         f<   |                    |#           t          j        |d          t          j        |d
          fS ) z(
        Return predicted skin.
        ro   r   r   jointstailsr   r   r   rp   r   r   r   c                      g | ]
}|d z   z  S )r   r   )r   r~   Ns     r.   r   z+UniRigSkin._get_predict.<locals>.<listcomp>\  s!    #>#>#>QqS!G#>#>#>r/   )r   r5   )r   r   )valuer6   minreduceN)rn   ro   rp   rq   rr   r7   r   r   )coordfeatr   r   cuda)device_typer   )r]   r^   r_   r   )r8   r   )8next
parametersr   typer<   r8   r$   tensorrl   int64r5   r   
functionalr   torch_scattersegment_csrrv   trainingrandpermr   rm   r%   r   r   ri   r   r   r   r   r=   r   autocastr&   r   r   r;   rL   r   r   r   rM   	transposer   r   Fsoftmaxbmmmathsqrtpermuter   r   r   rw   r:   r   )'r,   r   ro   r   r   r   r   r   r   r   rp   r   r{   r|   part_offsetidx_ptrrq   packtrain_indicesr~   rr   	bone_featr   
ptv3_input	mesh_featr   blockskin_pred_listindicescur_Ncur_mesh_featattn_weightembed_geo_disembed_geo_maskembed_voxel_skin	skin_predinput_featurespredr   s'                                         @r.   _get_predictzUniRigSkin._get_predict<  s   
 "+.	 %j 1$Y/#Ho"7^"'"5
)./B)C%*?%;#I. T__&&''-=='',,u%%U##

5!!-22599%**511__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0a888D!))"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	 	- 	-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 ../@G/L/T/TUVX]_`bc/d/deeM!00qqq'z1J1R1RSTV[]^`a1b1bccN#44Z7
5K5S5STUW\^_ab5c5cdd)[2BMSa$bhjkkkK 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-..!!),,,,yQ///4Q1G1G1GGGs   8A
OOOc           
         |d         }|d         }|d         }t          |                                           j        }|                    |          }|                    |          }|j        d         }|j        d         }|                    d          }||                    |          }|                    d          }	|	|	                    |          }	|                     |          \  }
}|d d |f         }|d d |f         }i }|	t          |||	|dd	
          }t          |||	|
dd	
          }||d<   ||d<   t          j	        ||          |d<   d}d}t          |          D ]}||                                         }t          |          D ]}t          j        ||d d |f         |k                                  d          }|                    d          dk    rRt          j	        |||f         |||f                   }|||z  z  }||z  }||d<   d}d}d}t          |          D ]-}||                                         }|t          j        j                            |
|d d d |f         ||d d d |f         d          z  }t          |          D ]}||d d |f         dk     }|                                 rA|t          j        j                            |
|| |f         ||| |f         d          |z  z  }|                                r?|t          j        j                            |
|||f         ||||f         d          |z  z  }/||z  }||z  }||z  }||d<   ||d<   ||d<   | t          j        |
|z             z  d|z
  t          j        d|
z
  |z             z  z
                                  |d<   |S )Nro   r   r   r   r   matrix_localpose_matrixr   r   )vertexr   matrixr   r   r   vertices_gtvertices_predvertex_lossgư>ru   r6   normalization_lossmeanr   skin_l1_lossskin_zero_l1_lossskin_non_zero_l1_lossbce_loss)r   r   r   r   r<   getr   r   r   mse_lossrl   itemr$   nonzerosqueezesizer   r   l1_lossr   logr	  )r,   r   ro   r   skin_gtr   r{   r   r   r  r   r   r   r  r  epsr  r~   r|   r   mask_lr
  r  r  s                            r.   training_stepzUniRigSkin.training_step  s   !+.	 %j 1$V} T__&&''-=='',,u%%N1N1yy00#',,U33Lii.."%**511K!..U.;;	7AAAwJ'!!!W*%"/)"  K 2)"  M "-C#0C !"K!G!GCC!#1XX 1 1aL%%''q 1 1A =AAAq)9C)?@@HHLLDyy||q(( K4$8-4:PQQB&"q&0&&1 !#(:C$% "q 	D 	DA!!!##AEH/77	!QQQ(8KWUVXYXYXY[]\][]U]M^gm7nnnL1XX D Dq!!!Qw'$.E;;== J)UX-@-H-HSTW[V[]^S^I_ahijmqlqstitau  E-H  .F  .F  IJ  .J  J)88:: D%)<)D)DYqRVXYzEZ\cdegkmndn\ox~)D))  CD  *D  D%D 	Q"*N#4 '<#$#8ei	C&@&@@AKSXS\]^aj]jmp]pSqSqCqqwwyyJ
r/   datac                 .    |                      |          S )N)r  )r  )r,   r  s     r.   rA   zUniRigSkin.forward  s    !!t!,,,r/   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 )Nro   r  r   )r$   no_gradr   rl   r<   rm   )r,   r   ro   r   rb   outputsr~   s          r.   predict_stepzUniRigSkin.predict_step  s    ]__ 	 	 %k 2I,,5,99LIqG9?1-.. ? ?yAAA}	!})<=>>>>	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A*BBB)rB   rC   rD   r	   r   r   r   r#   r   r   r   strr  rA   r   rH   rI   s   @r.   r   r      s-       Z 0 T$Z    B4= 4= 4= 4= 4=l( ({ ({ ( ( ( (wH$ wH; wH wH wH wHrT4 TDk1A,B T T T Tl-D -T - - - -$        r/   r   )!r$   r   r   r   r   torch.nn.functionalr   r   numpyr   r   typingr   r	   transformersr
   r   r   r   specr   r   parse_encoderr   r   
data.utilsr   Moduler   rK   rd   r   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    	   *B B B B B") B B BH    RY    @ @ @ @ @ @ @ @ @ @r/   