
    HhlZ                     
   d dl mZ d dlmZ d dlZd dl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 d dlmZ 	 d dlZn# e$ r dZY nw xY wddlmZ dd	lmZ dd
lmZmZ  G d dej        j                  Z G d dej                  Z G d de          Z G d dej                  Z G d de          Z  G d de          Z! G d de          Z" G d de          Z# G d de          Z$d"dee%df         de&d e$fd!Z'dS )#    )partial)DictN)DropPath)Union)	rearrange   )offset2bincount)Point)PointModulePointSequentialc                   $     e Zd Z fdZd Z xZS )RPEc                    t                                                       || _        || _        t	          d|z  dz  dz            | _        d| j        z  dz   | _        t          j        	                    t          j
        d| j        z  |                    | _        t          j        j                            | j        d           d S )N   gUUUUUU?   r      g{Gz?)std)super__init__
patch_size	num_headsintpos_bndrpe_numtorchnn	Parameterzeros	rpe_tableinittrunc_normal_)selfr   r   	__class__s      V/data/cameron/tmprepos/clean_dreammesh/UniRig/src/model/pointcept/models/PTv3Object.pyr   zRPE.__init__   s    $"A
N6:;;4<'!+++EKDL8H),T,TUU##DN#=====    c                    |                     | j         | j                  | j        z   t          j        d|j                  | j        z  z   }| j                            d|                    d                    }|	                    |j
        dz                                 d          }|                    dddd          }|S )Nr   devicer   )r)   r   r   )clampr   r   aranger(   r   r   index_selectreshapeviewshapesumpermute)r"   coordidxouts       r$   forwardzRPE.forward    s    KKt|44ll1U\222T\AB 	
 n))!S[[__==hhsy5())--a00kk!Q1%%
r%   __name__
__module____qualname__r   r5   __classcell__r#   s   @r$   r   r      sG        > > > > >	 	 	 	 	 	 	r%   r   c                   $     e Zd Z fdZd Z xZS )QueryKeyNormc                     t          t          |                                            || _        t	          j        ||z  d          | _        d S )NF)elementwise_affine)r   r=   r   r   r   	LayerNormnorm)r"   channelsr   r#   s      r$   r   zQueryKeyNorm.__init__,   sE    lD!!**,,,"LY!65QQQ			r%   c                    | j         }t          |d|d          }|                    d          \  }}}|                     |          }|                     |          }t	          j        |||g          }t          |d          }|S )NzN (S H Ch) -> S N H Chr   )HSr   dimzS N H Ch -> N (S H Ch))r   r   unbindrA   r   stack)	r"   qkvrD   qkvq_normk_normqkv_norms	            r$   r5   zQueryKeyNorm.forward1   s    N5a@@@***##1a11 ;233X'?@@r%   r6   r;   s   @r$   r=   r=   +   sL        R R R R R
      r%   r=   c                        e Zd Z	 	 	 	 	 	 	 	 	 	 d
 fd	Z ej                    d             Z ej                    d             Zd	 Z xZ	S )SerializedAttentionTN        r   Fc                    t                                                       ||z  dk    sJ d| d|             || _        || _        |p||z  dz  | _        || _        || _        || _        |	| _        |
| _	        || _
        |rt          ||          | _        nt          d           |
rJ|	du s
J d            |du s
J d            |du s
J d	            t          
J d
            || _        || _        n2|| _        d| _        t$          j                            |          | _        t$          j                            ||dz  |          | _        t$          j                            ||          | _        t$          j                            |          | _        t$          j                            d          | _        | j        rt7          ||          nd | _        d S )Nr   z	channels z  must be divisible by num_heads g      zIWARNING: enable_qknorm is False in PTv3Object and training may be fragileFz3Set enable_rpe to False when enable Flash Attentionz9Set upcast_attention to False when enable Flash Attentionz7Set upcast_softmax to False when enable Flash Attentionz"Make sure flash_attn is installed.r   )biasr)   rF   )r   r   rB   r   scaleorder_indexupcast_attentionupcast_softmax
enable_rpeenable_flashenable_qknormr=   qknormprint
flash_attnr   	attn_droppatch_size_maxr   r   DropoutLinearrJ   proj	proj_dropSoftmaxsoftmaxr   rpe)r"   rB   r   r   qkv_biasqk_scaler`   re   rW   rZ   r[   rX   rY   r\   r#   s                 r$   r   zSerializedAttention.__init__@   s     	)#q(((*kh*k*k`i*k*k((( "@(i"7D!@
& 0,$(* 	_&x;;DKK]^^^ 	9e###D $## !E)))J *)) %'''H (''))+O)))(DO&DNN
 #-DDO"X--i88DN8??8X\?IIHOOHh77	)))44x''B'//15J3z9---dr%   c                    | j         }d| j         }||                                vrR|j        |         }|                    d|d          }|                    d          |                    d          z
  ||<   ||         S )Nrel_pos_r)   r   r   r   )r   rW   keys
grid_coordr-   	unsqueeze)r"   pointorderKrel_pos_keyrn   s         r$   get_rel_poszSerializedAttention.get_rel_posz   s    O3!133ejjll**)%0J#++B155J!+!5!5a!8!8:;O;OPQ;R;R!RE+[!!r%   c           
         d}d}d}||                                 vs-||                                 vs||                                 vr|j        }t          |          }t          j        || j        z   dz
  | j        d          | j        z  }|| j        k    }| |z  ||z  z   }t          j                            |d          }	t          j                            t          j	        |d	          d          }
t          j
        |
d
         |j                  }t          j
        |	d
         |j                  }g }t          t          |                    D ]4}||	|         |	|dz            xx         |
|         |	|         z
  z  cc<   ||         ||         k    rp||
|dz            d| j        z  z
  ||         | j        z  z   |
|dz            | j        z
           ||
|dz            | j        z
  ||         | j        z  z   |
|dz            <   ||
|         |
|dz            xx         |
|         |	|         z
  z  cc<   |                    t          j
        |
|         |
|dz            | j        t          j        |j                             6|||<   |||<   t          j                            t          j        |          d|
d
                   ||<   ||         ||         ||         fS )Npadunpadcu_seqlens_keyr   trunc)rounding_mode)r   r   r   rF   r)   r'   r   )stepdtyper(   )r   r   )value)rm   offsetr	   r   divr   r   
functionalrv   cumsumr+   r(   rangelenappendint32concat)r"   rp   pad_key	unpad_keyrx   r~   bincountbincount_padmask_pad_offset_offset_padrv   rw   
cu_seqlensis                  r$   get_padding_and_inversez+SerializedAttention.get_padding_and_inverse   s/   	)5::<<''

,,UZZ\\11\F&v..H	t.2O")  
 /"   $/1H$9x/(\2IILm''77G-++EL1,M,M,MvVVK,{2v}EEECLV]CCCEJ3v;;''  gaj71q5>1222k!nwqz6QQ222A;,q/11
 #AE*do-.#A;8:<GA<N/=**	 #AE*/*#A;8:<GA<NO KN[Q%77888KNWUVZ<WW888!!L#A#AE*!_#k%}      !E'N$E)$&M$5$5Z((&B %6 % %E.! W~uY/~1FFFr%   c           	      0   | j         sPt          t          |j                                                                                  | j                  | _        | j        }| j        }| j        }| 	                    |          \  }}}|j
        | j                 |         }||j        | j                          }	|                     |j                  |         }
| j        r|                     |
          }
| j         sY|
                    d|d|||z                                ddddd                              d          \  }}}| j        r(|                                }|                                }|| j        z  |                    dd          z  }| j        r,||                     |                     ||                    z   }| j        r|                                }|                     |          }|                     |                              |
j                  }||z                      dd                              d|          }ntA          j!        |
"                                                    dd|||z            || j        | j#        r| j        nd| j        	                              d|          }|                    |
j                  }||	         }| $                    |          }| %                    |          }||_        |S )
Nr)   r   r   r   r   r   rF   )
max_seqlen	dropout_psoftmax_scale)&r[   minr	   r~   tolistra   r   r   rB   r   serialized_orderrW   serialized_inverserJ   featr\   r]   r-   r1   rH   rX   floatrV   	transposerZ   rh   rt   rY   rg   r`   tor|   r_    flash_attn_varlen_qkvpacked_funchalftrainingrd   re   )r"   rp   rD   rr   Crv   rw   r   rq   inverserJ   rK   rL   rM   attnr   s                   r$   r5   zSerializedAttention.forward   s     	!--1133::<<d>Q DO NOM!%!=!=e!D!DUJ&t'78=01ABC hhuz""5) 	#++c""C  	& B1aa0088Aq!QGGNNSTNUU Aq! $ GGIIGGII
Nakk"b&9&99D Gdhht'7'7u'E'EFFF" $zz||<<%%D>>$''**3955D1H''1--55b!<<DD>

""2q!Q!V44?,0M@$..q"j   gb!nn  7739%%DG} yy~~d##
r%   )
TNrS   rS   r   FTTTF)
r7   r8   r9   r   r   no_gradrt   r   r5   r:   r;   s   @r$   rR   rR   ?   s         8K 8K 8K 8K 8K 8Kt U]__" " _" U]__7G 7G _7Gr4 4 4 4 4 4 4r%   rR   c                   8     e Zd Zddej        df fd	Zd Z xZS )MLPNrS   c                    t                                                       |p|}|p|}t          j        ||          | _         |            | _        t          j        ||          | _        t          j        |          | _        d S N)	r   r   r   rc   fc1actfc2rb   drop)r"   in_channelshidden_channelsout_channels	act_layerr   r#   s         r$   r   zMLP.__init__   sw     	#2{)8[9[/::9;;9_l;;Jt$$			r%   c                     |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|S r   )r   r   r   r   )r"   xs     r$   r5   zMLP.forward  sR    HHQKKHHQKKIIaLLHHQKKIIaLLr%   )r7   r8   r9   r   GELUr   r5   r:   r;   s   @r$   r   r      s\         '% % % % % %       r%   r   c                   b     e Zd Zdddddddej        ej        ddddddddf fd	Zd	efd
Z xZ	S )Block0   g      @TNrS   r   Fc                    t                                                       || _        || _        t	          t          j        ||dd|          t          j        ||           |
|                    | _	        t	           |
|                    | _
        t          |||||||||||||          | _        t	           |
|                    | _        t	          t          |t          ||z            |||                    | _        t	          |	dk    rt#          |	          nt          j                              | _        d S )Nr   T)kernel_sizerU   
indice_key)rB   r   r   ri   rj   r`   re   rW   rZ   r[   rX   rY   r\   )r   r   r   r   r   rS   )r   r   rB   pre_normr   spconv
SubMConv3dr   rc   cpenorm1rR   r   norm2r   r   mlpr   Identity	drop_path)r"   rB   r   r   	mlp_ratiori   rj   r`   re   r   
norm_layerr   r   rW   cpe_indice_keyrZ   r[   rX   rY   r\   r#   s                       r$   r   zBlock.__init__  sc   , 	  ")   Ih))Jx  

 

 %ZZ%9%9::
'!#!%-)'
 
 
	 %ZZ%9%9::
"$ #Hy$8 9 9%#  
 
 )#,s??HY
 
r%   rp   c                 |   |j         }|                     |          }||j         z   |_         |j         }| j        r|                     |          }|                     |                     |                    }||j         z   |_         | j        s|                     |          }|j         }| j        r|                     |          }|                     |                     |                    }||j         z   |_         | j        s|                     |          }|j        	                    |j                   |_        |S r   )
r   r   r   r   r   r   r   r   sparse_conv_featreplace_feature)r"   rp   shortcuts      r$   r5   zBlock.forwardT  s   :
*
:= 	&JJu%%Etyy//00
*
} 	&JJu%%E:= 	&JJu%%Etxx//
*
} 	&JJu%%E!&!7!G!G
!S!Sr%   )
r7   r8   r9   r   r@   r   r   r
   r5   r:   r;   s   @r$   r   r     s        
 <')B
 B
 B
 B
 B
 B
HU        r%   r   c                   8     e Zd Z	 	 	 	 	 	 d fd	ZdefdZ xZS )	SerializedPoolingr   NmaxTc	                    t                                                       || _        || _        |dt	          j        |          dz
                                  z  k    sJ || _        |dv sJ || _        || _	        || _
        t          j        ||          | _        |t           ||                    | _        |t           |                      | _        d S d S )Nr   r   )r0   meanr   r   )r   r   r   r   mathceil
bit_lengthstridereduceshuffle_orders	traceabler   rc   rd   r   rA   r   )
r"   r   r   r   r   r   r   r   r   r#   s
            r$   r   zSerializedPooling.__init__m  s     	&(ty0014@@BBBBBBB66666,"Ik<88	!'

<(@(@AADI &yy{{33DHHH ! r%   rp   c                    t          j        | j                  dz
                                  }||j        k    rd}h d                    |                                          s
J d            |j        |dz  z	  }t          j	        |d         ddd          \  }}}t          j
        |          \  }}t          j        |                    d          t          j        |d          g          }	||	d d	                  }
|d d |
f         }t          j        |          }t          j        |                              d|t          j        d|j        d         |j        
                              |j        d         d                    }| j        r7t          j        |j        d                   }||         }||         }||         }t/          t1          j        |                     |j                  |         |	| j                  t1          j        |j        |         |	d          |j        |
         |z	  ||||j        |z
  |j        |
                   }d|                                v r
|j         |d<   d|                                v r
|j!        |d<   | j"        r
||d<   ||d<   tG          |          }| j$        | $                    |          }| j%        | %                    |          }|&                                 |S )Nr   r   >   serialized_codeserialized_depthr   r   z>Run point.serialization() point cloud before SerializedPoolingr   T)sortedreturn_inversereturn_countsrF   r)   r'   )rG   indexsrc)r   r   )r   r2   rn   r   r   r   r   batch	conditioncontextpooling_inversepooling_parent)'r   r   r   r   r   issubsetrm   r   r   uniquesortcat	new_zerosr   argsort
zeros_likescatter_r+   r/   r(   repeatr   randpermr   torch_scattersegment_csrrd   r   r   r2   rn   r   r   r   r   r
   rA   r   sparsify)r"   rp   pooling_depthcodecode_clustercounts_indicesidx_ptrhead_indicesrq   r   perm
point_dicts                  r$   r5   zSerializedPooling.forward  s,   4;//!3??AA5111M
 
 

 (JJLL
 
	L 	L L	L 	L 
 $(99!&G	"
 "
 "
w Z((
7)V--a00%,v12M2M2MNOOwss|,AAA|O$d##"5))22Q
1elCCCJJ
1q  3 
 
  	$>$*Q-00D:D$KEdmG *		%*%%g.    +G$gf   '5F "&"3mC+l+
 
 

 %**,,&&&+oJ{#

$$$)MJy!> 	1,3J()+0J'(j!!9 IIe$$E8HHUOOEr%   )r   NNr   TTr7   r8   r9   r   r
   r5   r:   r;   s   @r$   r   r   l  su        
 4 4 4 4 4 4:IU I I I I I I I Ir%   r   c                   ,     e Zd Z	 	 	 d fd	Zd Z xZS )SerializedUnpoolingNFc                    t                                                       t          t          j        ||                    | _        t          t          j        ||                    | _        |F| j                             ||                     | j                             ||                     |D| j                             |                       | j                             |                       || _        d S r   )	r   r   r   r   rc   rd   	proj_skipaddr   )r"   r   skip_channelsr   r   r   r   r#   s          r$   r   zSerializedUnpooling.__init__  s     	#BIk<$H$HII	(=,)O)OPP!IMM**\22333Nzz,77888 IMM))++&&&Nyy{{+++"r%   c                 Z   d|                                 v sJ d|                                 v sJ |                    d          }|                    d          }|                     |          }|                     |          }|j        |j        |         z   |_        | j        r||d<   |S )Nr   r   unpooling_parent)rm   poprd   r   r   r   )r"   rp   parentr   s       r$   r5   zSerializedUnpooling.forward  s    5::<<//// EJJLL0000+,,))-..		%  ''kEJw$77> 	/).F%&r%   NNFr6   r;   s   @r$   r   r     sW         # # # # # #.      r%   r   c                   2     e Zd Z	 	 	 d fd	ZdefdZ xZS )	EmbeddingNFc           
         t                                                       || _        || _        t	          t          j        ||dddd                    | _        |%| j                             ||          d           |$| j                             |            d	           |rt          j
        ||          | _        d S d | _        d S )
N   r   Fstem)r   paddingrU   r   )convrA   namer   )r   r   r   embed_channelsr   r   r   r  r   r   rc   
res_linear)r"   r   r  r   r   r  r#   s         r$   r   zEmbedding.__init__  s     	&, $"!  	
 	
 	
	 !IMM**^446MBBB IMM))++EM222 	# i^DDDOOO"DOOOr%   rp   c                     | j         r|                      |j                  }|                     |          }| j         r|j        |z   |_        |j                            |j                  |_        |S r   )r  r   r  r   r   )r"   rp   res_features      r$   r5   zEmbedding.forward  sh    ? 	6//%*55K		%  ? 	2k1EJ!&!7!G!G
!S!Sr%   r  r   r;   s   @r$   r  r    sd        
 # # # # # #BU        r%   r  c                   V     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	ZddZ xZS )PointTransformerV3Object	   zzz-transhilbertzhilbert-trans r   r   r             @         i  r   r      r        r'  r'  r'  r'  r   TNrS   Fc                 &   t                                                       t          |          | _        t	          |t
                    r|gn|| _        || _        || _        |rt          t          j                  }n+t          d           t          t          j        dd          }t          j        }t          j        }t          ||d         |||          | _        d t#          j        d|t'          |                    D             }t)                      | _        t-          | j                  D ]Z}|t'          |d |                   t'          |d |dz                               }t)                      }|dk    r7|                    t          j        ||dz
           ||                              t-          ||                   D ]}|                    t3          d!i d	||         d
||         d||         d|d|	d|
d|d|d||         d|d|d|d|t          | j                  z  dd| d|d|d|d|d|d|            t          |          dk    r| j                            |d|             \d S )"Nz%WARNING: use BatchNorm in ptv3obj !!!gMbP?g{Gz?)epsmomentumr   )r   r  r   r   r  c                 6    g | ]}|                                 S r  )item).0r   s     r$   
<listcomp>z5PointTransformerV3Object.__init__.<locals>.<listcomp>\  s-     
 
 
AFFHH
 
 
r%   r   rB   r   r   r   ri   rj   r`   re   r   r   r   r   rW   r   stagerZ   r[   rX   rY   r\   blockr  enc)moduler  r  )r   r   r   
num_stages
isinstancestrrq   cls_moder   r   r   r@   r^   BatchNorm1dr   r  	embeddingr   linspacer0   r   r1  r   r   rc   r   )!r"   r   rq   r   
enc_depthsenc_channelsenc_num_headenc_patch_sizer   ri   rj   r`   re   r   r   r   rZ   r[   rX   rY   r6  r\   
layer_normr  bn_layerln_layerr   enc_drop_pathsenc_drop_path_r1  r   r#   s!                                   r$   r   z!PointTransformerV3Object.__init__)  s9   4 	j// *5# 6 6AeWWE
 ,  	Hr|,,HH9:::r~4$GGGH<G	"#'?!
 
 

 
#nQ	3z??KK
 
 
 #$$t'' "	9 "	9A*JrrN##c*Wq1uW*=&>&>>N "##C1uu	,q1u"5|AGGHHH:a=))     !-a".q// $2!#4#4 #,)	
 "* "* #,) #,) #1"3"3 $,8 #,) "* %&DJ$7$7 (3q{{{ $.:  &2\!" *:)9#$ (6~%& '4m'* %-     0 3xx1}}CiAii888E"	9 "	9r%   c                     t          |          }|                    | j        | j        |           |                                 |                     |          }|                     |          }|S )N)rq   r   	min_coord)r
   serializationrq   r   r   r8  r1  )r"   	data_dictrE  rp   s       r$   r5   z PointTransformerV3Object.forward  se    i  $*T=P\efffu%%r%   )r  r  r  r  r  r#  r&  r   TNrS   rS   rS   TTFTFFFFFTr   r6   r;   s   @r$   r  r  (  s         :#,&51Y9 Y9 Y9 Y9 Y9 Y9x       r%   r  Fpretrained_pathfreeze_encoderreturnc                    t          di |}| Qt          j        |           }|d         }d |                                D             }|                    |d           |du r)|                                D ]\  }}d|vrd|vrd|_        |S )	N
state_dictc                 B    i | ]\  }}|                     d d          |S )zmodule. )replace)r-  rL   rM   s      r$   
<dictcomp>zget_encoder.<locals>.<dictcomp>  s,    QQQdaaii	2..QQQr%   F)strictTr  r]   r  )r  r   loaditemsload_state_dictnamed_parametersrequires_grad)rH  rI  kwargspoint_encoder
checkpointrL  r  params           r$   get_encoderr[    s    ,66v66M"Z00
-
QQj>N>N>P>PQQQ
%%j%???(99;; 	, 	,KD%4''HD,@,@&+#r%   )NF)(	functoolsr   addictr   r   r   torch.nnr   spconv.pytorchpytorchr   r   timm.models.layersr   typingr   einopsr   r_   ImportError
utils.miscr	   utils.structurer
   modulesr   r   Moduler   r=   rR   r   r   r   r   r  r  r5  boolr[  r  r%   r$   <module>rj     s                                 ' ' ' ' ' '               JJJ ( ' ' ' ' ' " " " " " " 1 1 1 1 1 1 1 1    %(/   *    29   (s s s s s+ s s sl    ")   4Z Z Z Z ZK Z Z Zzg g g g g g g gT# # # # #+ # # #L) ) ) ) ) ) ) )Xc c c c c{ c c cJ sDy!1  ay      s   = AA