
    _hQ                     6   d dl Z d dlmZ d dlmZmZ d dlmZ d dlZd dl	m
Z
 d dlZd dlZd dlZddlmZ ddl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          Z G d de          Z G d de          ZdS )    N)OptionalUnion)repeat)fps   )
checkpoint)FourierEmbedder)ResidualCrossAttentionBlockTransformer   )ShapeAsLatentModulec            #            e Zd Zdddddddddd	deej                 deej                 ded	ed
edededede	de
de
de
de
de
de
dede
f" fdZd Zddej        deej                 fdZ xZS )CrossAttentionEncoder      ?TF   )	
init_scaleqkv_biasflashuse_ln_postuse_checkpointquery_methoduse_full_input	token_numno_querydevicedtypenum_latentsfourier_embedderpoint_featswidthheadslayersr   r   r   r   r   r   r   r   r   c                *   t                                                       || _        || _        || _        || _        || _        |rd | _        n3t          j	        t          j        ||f||          dz            | _        || _        t          j        | j        j        |z   |||          | _        t!          |||||	|
|          | _        t%          |||||||	|
|d
  
        | _        |rt          j        |||          | _        d S d | _        d S )Nr   r   g{Gz?)r   r   r    r!   r   r   r   F
r   r   n_ctxr    r"   r!   r   r   r   r   )r   r   )super__init__r   r   r   r   r   querynn	Parametertorchrandnr   Linearout_dim
input_projr
   
cross_attnr   	self_attn	LayerNormln_post)selfr   r   r   r   r   r    r!   r"   r   r   r   r   r   r   r   r   r   	__class__s                     G/tmp/cameron/UniRig/src/model/michelangelo/models/tsal/sal_perceiver.pyr(   zCrossAttentionEncoder.__init__-   sD   & 	(",,& 	lDJJek;2Fv]b&c&c&cfj&jkkDJ 0)D$9$AK$OQV_emrsss5!
 
 
 %! 
 
 
  	 <U6JJJDLLLDLLL    c                    | j         r| j        }|j        d         }|                     |          }|t	          j        ||gd          }|                     |          }t          | j        d|          }| 	                    ||          }| 
                    |          }| j        |                     |          }d}nt          | j        t                    r| j        }nt          j        | j                  }| j        rt$          j                                        }	n t$          j                            d          }	|	                    |j        d         |d	z  |d	z  |j        d         k    
          }
|dd|
ddf         }|dd|
ddf         }|j        \  }}}|j        d         }|                    ||z  |          }|                    ||z  |          }t	          j        |                              |j                  }t	          j        ||          }t3          ||d| j                  }||         }|                    |dd          }||         }|                    |d|          }| j        r|                     |          }n|                     |          }|!| j        s|}t	          j        ||gd          }|                     |          }|                     |          }|t	          j        ||gd          }|                     |          }| 	                    ||          }| 
                    |          }| j        |                     |          }t	          j        ||gd          }||||fS )z

        Args:
            pc (torch.FloatTensor): [B, N, 3]
            feats (torch.FloatTensor or None): [B, N, C]

        Returns:

        r   N)dimzm c -> b m c)b)seedr      )replacer   )ratiorandom_start   )r   r   shaper   r,   catr0   r   r)   r1   r2   r4   
isinstancer   intrandomchoicetrainingnpdefault_rngviewarangetor   repeat_interleaver   r   )r5   pcfeatsr   bsdatar)   latentspre_pcrngind	pre_featsBNDCpos	pos_featsbatchidx
sampled_pcsampled_featssampled_datas                          r7   _forwardzCrossAttentionEncoder._forwardl   sr     I	<(I!B((,,D y$B777??4((D4:~<<<EooeT22GnnW--G|',,w//FF $.#.. : N		"M$.99	} 4i++--i+++33**RXa[)a-QQSQYZ[Q\A\*]]C#aaa[FaaaAAAgI lGAq!#A++ac1%%C!qsA..ILOO&&ry11E+E155Ec5T]KKKCSJ#B22J%cNM)..q"a88M " 5,,R00,,V44 * &%Ey$B777??4((D00<<L $y,)FBOOO??<88LoolD99GnnW--G|',,w//Y	2;;;FIv--r8   NrP   rQ   c                 b    t          | j        ||f|                                 | j                  S )z

        Args:
            pc (torch.FloatTensor): [B, N, 3]
            feats (torch.FloatTensor or None): [B, N, C]

        Returns:
            dict
        r   rd   
parametersr   )r5   rP   rQ   s      r7   forwardzCrossAttentionEncoder.forward   s+     $-"edoo6G6GI\]]]r8   N)__name__
__module____qualname__r   r,   r   r   rF   r	   floatboolr(   rd   FloatTensorrh   __classcell__r6   s   @r7   r   r   +   si        &*"&$%*(-&+(,"% %#=  =  = !%,/=  -=  "=  $3	= 
 "=  =  =  =  #=   =  =  #=  "&=   $=  "&=    != "  #=  =  =  =  =  = ~U. U. U.n^ ^%+ ^HU=N4O ^ ^ ^ ^ ^ ^ ^ ^r8   r   c                        e Zd Zddddddddeej                 deej                 d	ed
edededede	de
de
de
dedef fdZdej        dej        fdZdej        dej        fdZ xZS )CrossAttentionDecoderr   TFr>   	occupancy)r   r   r   r   mlp_width_scalesupervision_typer   r   r   out_channelsr   r    r!   r   r   r   r   ru   rv   c                   t                                                       || _        || _        || _        t          j        | j        j        |||          | _        t          |||||||	|
|	  	        | _
        t          j        |||          | _        t          j        ||||          | _        | j        dk    rt          j        ||||          | _        d S d S )Nr$   )	r   r   n_datar    r!   r   r   r   ru   occupancy-sdf)r'   r(   r   r   rv   r*   r.   r/   
query_projr
   cross_attn_decoderr3   r4   output_projoutput_proj_sdf)r5   r   r   r   rw   r   r    r!   r   r   r   r   ru   rv   r6   s                 r7   r(   zCrossAttentionDecoder.__init__   s     	, 0 0)D$9$A5QW_deee"=!+
#
 
#
 
#
 |E&FFF9ULuUUU O33#%9ULW\#]#]#]D    43r8   queriesrT   c                    t          | j                                                  j        t          j        k    r(|                                }|                                }|                     |                     |                    }|                     ||          }| 	                    |          }| 
                    |          }| j        dk    r|                     |          }||fS |S )Nrz   )nextr{   rg   r   r,   float16halfr   r|   r4   r}   rv   r~   )r5   r   rT   xx_1x_2s         r7   rd   zCrossAttentionDecoder._forward   s    **,,--3u}DDllnnGllnnG //$"7"7"@"@AA##GW55LLOOq!! O33&&q))C8OJr8   c                 b    t          | j        ||f|                                 | j                  S ri   rf   )r5   r   rT   s      r7   rh   zCrossAttentionDecoder.forward  s+    $-'7);T__=N=NPTPcdddr8   )rj   rk   rl   r   r,   r   r   rF   r	   rm   rn   strr(   ro   rd   rh   rp   rq   s   @r7   rs   rs      sW        &*"&$(-())4&^ &^ &^!%,/&^ -&^ "&^  #	&^
 $3&^ &^ &^ #&^  &^ &^ "&&^ #&&^ $'&^ &^ &^ &^ &^ &^T 1 E<M     eu0 e5;L e e e e e e e er8   rs   c            5       $    e Zd Zdddddddddddddd	d
ddddddeej                 deej                 dedededededededededee         de	dedededede
ded ed!e
d"e	d#ed$ed%ed&ef4 fd'Z	 d-d(ej        d)ej        d*ej        d+efd,Z xZS ).ShapeAsLatentPerceiverr      TNr   Frt   r   	numerical{Gzt?r>   )r   	embed_dim	num_freqs
include_pidecoder_widthr   r   r   r   r   rv   r   r   	grad_typegrad_intervalr   freeze_encoderdecoder_mlp_width_scaleresidual_klr   r   r   r   r   r   r   r    r!   num_encoder_layersnum_decoder_layersr   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   c                   t                                                       || _        || _        |dv sJ || _        || _        || _        t          ||          | _        |t          j
        d|z            z  }t          di d|d|d| j        d|d|d	|d
|	d|
d|d|d|d|d|d|d|d|| _        || _        || _        ||}|dk    rt          j        ||dz  ||          | _        t          j        ||||          | _        ||f| _        | j        r>| j        j        | j        j        z  dk    sJ | j        j        | j        j        z  dk    sJ n	||f| _        t-          ||||||	||||
  
        | _        t1          ||| j        d|||	||||||          | _        |rW| j                                        D ]	}d|_        
| j                                        D ]	}d|_        
t9          d           d S d S )Nr   
analyticalr   r         ?r   r   r   r   r   r    r!   r"   r   r   r   r   r   r   r   r   r   r   r$   r%   r   )r   r   r   rw   r   r    r!   r   r   r   r   rv   ru   Fzfreeze encoder and pre kl )r'   r(   r   r   r   r   rv   r	   r   mathsqrtr   encoderr   r   r*   r.   pre_klpost_kllatent_shapeout_featuresin_featuresr   transformerrs   geo_decoderrg   requires_gradprint)r5   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   pr6   s                               r7   r(   zShapeAsLatentPerceiver.__init__  s   : 	,&77777"* 0 /)PZ [ [ [$)C%K"8"88
, 
 
 
6
%
 "22
 $	

 $
 %
 %
 &%
 "z
 X
 %
 $
 *>
 &
 *>
   i!
& #& !Mq==)E9q=uUUUDK9YfTYZZZDL!,i 8D O|04<3KKqPPPP{.1IIQNNNN!,e 4D&%!)
 
 
 1!2#!)-3
 
 
   	/\,,.. ( ("'[++-- ( ("'-.....	/ 	/r8   rP   rQ   volume_queriessample_posteriorc                     |                      |||          \  }}}|                     |          }|                     ||          }|||fS )a  

        Args:
            pc (torch.FloatTensor): [B, N, 3]
            feats (torch.FloatTensor or None): [B, N, C]
            volume_queries (torch.FloatTensor): [B, P, 3]
            sample_posterior (bool):

        Returns:
            logits (torch.FloatTensor): [B, P]
            center_pos (torch.FloatTensor): [B, M, 3]
            posterior (DiagonalGaussianDistribution or None).

        )r   )encodedecodequery_geometry)	r5   rP   rQ   r   r   rT   
center_pos	posteriorlogitss	            r7   rh   zShapeAsLatentPerceiver.forward  sV    ( *.RQa)b)b&Y++g&&$$^W==z9,,r8   T)rj   rk   rl   r   r,   r   r   rF   rn   rm   r   r(   ro   rh   rp   rq   s   @r7   r   r     s       
 %&"#"#$(
 15%)"&$%*(-)4&+"%"-(-(,(-01%*5n/ n/ n/!%,/n/ -n/ "n/ "	n/
  n/  n/ "n/ n/ n/ &)n/ &)n/ !)n/ #n/  n/ n/  #!n/" "&#n/$ $'%n/&  $'n/(  )n/*  +n/, !&-n/. "&/n/0 "&1n/2 +.3n/4 #5n/ n/ n/ n/ n/ n/h *.	- -%-(- !& 1- #'	- - - - - - - -r8   r   c            5           e Zd Zddddddddddddd	ddd
dddddeej                 dee         dedededededededededee         de	dedededededed e	d!ed"ed#ed$ed%ed&ef4 fd'Z
	 	 	 d0d(ej        d)eej                 d*ed+efd,Z	 d1d(ej        d)eej                 fd-Z	 d2d(ej        d)ej        d.ej        d*efd/Z xZS )3AlignedShapeLatentPerceiverr   r   TNr   Frt   r   r   r   r>   )r   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   c                    t           j        t           j        t           j        d}|||         }t	                                          ||d|z   |||||||	|
|||||||||||||||           || _        d S )Nfloat32r   bfloat16r   )r   r   r   r   r   r   r   r    r   r!   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   )r,   r   r   r   r'   r(   r    )r5   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   	MAP_DTYPEr6   s                               r7   r(   z$AlignedShapeLatentPerceiver.__init__  s    < }}
 
	
 e$EK#!'11!#)-'%))$;#5 	 	
 	
 	
: 


r8   rP   rQ   r   
only_shapec                     |                      ||          \  }}}}|r|S |                     ||          \  }	}
||	|
||fS )aJ  

        Args:
            pc (torch.FloatTensor): [B, N, 3]
            feats (torch.FloatTensor or None): [B, N, c]
            sample_posterior (bool):

        Returns:
            shape_embed (torch.FloatTensor)
            kl_embed (torch.FloatTensor):
            posterior (DiagonalGaussianDistribution or None):
        )encode_latentsencode_kl_embed)r5   rP   rQ   r   r   shape_embedrT   r   rU   kl_embedr   s              r7   r   z"AlignedShapeLatentPerceiver.encode  s\    $ 372E2Eb%2P2P/Wi 	"227<LMM)HiFBBr8   c                 `    |                      ||          \  }}}}|d d df         }|}||||fS Nr   r   	r5   rP   rQ   r   _r   rU   r   rT   s	            r7   r   z*AlignedShapeLatentPerceiver.encode_latents  sG     #',,r5"9"91i1g GY66r8   r   c                     t                      ri   NotImplementedError)r5   rP   rQ   r   r   s        r7   rh   z#AlignedShapeLatentPerceiver.forward	  s    
 "###r8   )NTFri   r   )rj   rk   rl   r   r,   r   r   rF   rn   rm   r(   ro   r   r   rh   rp   rq   s   @r7   r   r     s        %&"#"#$(
 15%)"&$%*(-)4"-(-&+(,"%(-01%*5A A A!%,/A A "A "	A
  A  A "A A A &)A &)A !)A #A  A A  #!A" "&#A$ $'%A&  'A( !&)A*  $+A, "&-A.  /A0 "&1A2 +.3A4 #5A A A A A AJ 59(, %	C C$Cu01C "&C  	C C C C6 =A7 7 ,7&u'897 7 7 7" *.	$ $%$($ !& 1$ #'	$ $ $ $ $ $ $ $r8   r   c            /           e Zd Zdddddddddddddd	dddd
deej                 deeej        ef                  de	de	de	de	de
de	de	de	dede
de
de
de
dede
de	dedede
d e
d!e
f. fd"Z	 d(d$ej        d%eej                 fd&Zd' Z xZS ))ShapeAsLatentPerceiverEncoderr   r   Tr   Frt   r   r   r   )r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   c                   t                                                       t          j        t          j        t          j        d}|t          |t                    r||         }|| _        || _	        |dv sJ || _
        || _        || _        t          ||          | _        |t          j        d|z            z  }t#          di d|d|d| j        d|d	|d
|d|	d|
d|d|d|d|d|d|d|d|dd| _        || _        || _        |r2| j                                        D ]	}d|_        
t/          d           || _        d S )Nr   r   r   r   r   r   r   r   r   r    r!   r"   r   r   r   r   r   r   r   r   r   TFzfreeze encoderr   )r'   r(   r,   r   r   r   rE   r   r   r   r   r   rv   r	   r   r   r   r   r   r   r   rg   r   r   r    )r5   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r6   s                             r7   r(   z&ShapeAsLatentPerceiverEncoder.__init__  s   4 	 }}
 
	 E3!7!7e$E,&77777"* 0 /)PZ [ [ [$)C%K"8"88
, 
 
 
6
%
 "22
 $	

 $
 %
 %
 &%
 "z
 X
 %
 $
 *>
 &
 *>
   i!
" T#
( #& 	$\,,.. ( ("'"###


r8   NrP   rQ   c                 `    |                      ||          \  }}}}|d d df         }|}||||fS r   r   r   s	            r7   r   z,ShapeAsLatentPerceiverEncoder.encode_latentsa  sE     #',,r5"9"91i1gGY66r8   c                     t                      ri   r   )r5   s    r7   rh   z%ShapeAsLatentPerceiverEncoder.forwardl  s    !###r8   ri   )rj   rk   rl   r   r,   r   r   r   r   rF   rn   rm   r(   ro   r   rh   rp   rq   s   @r7   r   r     s       
 %&"#"#$( &*"&$%*(-)4&+"%"-(-(,(-%*/J J J!%,/J u{C'7!89J "J "	J
  J  J "J J J &)J #J  J J #J "&J  $'!J"  $#J$  %J&  'J( !&)J* "&+J, "&-J. #/J J J J J J\ =A	7 	7 ,	7&u'89	7 	7 	7 	7$ $ $ $ $ $ $r8   r   )r,   torch.nnr*   typingr   r   einopsr   r   torch_clusterr   rG   timenumpyrJ   modulesr   modules.embedderr	   modules.transformer_blocksr
   r   	tsal_baser   Moduler   rs   r   r   r   r   r8   r7   <module>r      s  .        " " " " " " " "                                . . . . . .       
 + * * * * *c^ c^ c^ c^ c^BI c^ c^ c^L=e =e =e =e =eBI =e =e =e@J- J- J- J- J-0 J- J- J-Zp$ p$ p$ p$ p$"8 p$ p$ p$lY$ Y$ Y$ Y$ Y$$7 Y$ Y$ Y$ Y$ Y$r8   