
     h%<                        d dl Z d dlZd dl mZ d dlZd dlZd dlmZmZ d dlm	Z
 d dlZd dl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Zd dlmZ d dlmZmZmZmZmZmZ d d	lmZ d d
l m!Z!m"Z" d dl#Z#d dl$Z$d Z%ddZ&d Z'd Z(d Z)ddZ*d Z+d Z,d Z- G d dej\                        Z/ G d dej\                        Z0 G d dej\                        Z1 G d dej\                        Z2y)    N)nn)	rearrangerepeat)
functional)deepcopy)cm)tqdm)CallableListOptionalTuple	GeneratorDict)defaultdict)natural_cubic_spline_coeffsNaturalCubicSplinec                     t        | d      S )Nz... c x y -> ... (x y) c)r   xs    -/home/cameronsmith/repos/controll3r/models.py<lambda>r      s    9Q :;     c           	      f    t        | d|"t        | j                  d      dz              S |      S )Nz... (x y) c -> ... c x yg      ?r   )r   intsize)srcr   s     r   r   r      s2    Y-Gijir3sxxXZ|`cOdKez xyz r   c                 d    t        j                  | t        j                  | ddgf         fd      S )N.r   )torchcat	ones_liker   s    r   r   r      s)    		1eooaaSk:;R@ r   c                 .    | dd df   d| ddd f   z   z  S )N.r   gh㈵> r   s    r   r   r      s&    !C"H+#rs(!34 r   c                 @    t        j                  | |dz  dz
  ||      S )N      )modepadding_mode)Fgrid_sampler   ypadr(   s       r   r   r      s    AMM1a!eaidY\$] r   c                     t        | j                        dk(  rt        | |||      S t        | j                  dd      |j                  dd      ||      j	                  d| j                  d d       S )N   r   r'   r&   )lenshape
grid_samp_flatten	unflattenr,   s       r   r   r      s    WZ[\[b[bWcghWhAq#d9S nxyz  zC  zC  DE  GH  zI  KL  KT  KT  UV  XY  KZ  [^  _c  od  on  on  op  rs  ry  ry  z|  {|  r}  o~ r   c                 B    t        t        j                  d||             S )Nb...cij,b...ckj->b...cki)unhomr    einsum)crdsKs     r   r   r      s    %-GD QR r   c           	      d    t        t        j                  d|t        |             dd df   |      S )Nr7   .   )projectr    r9   hom)r:   posesr;   s      r   r   r      s6    gu||4NPUWZ[_W`'abegihigibi'jlmn r   c                 b    | t        j                  t        |             j                  |          S N)r    randpermr1   tor   s    r   r   r      s#    AennSV,//23 r   c                   8     e Zd Zd fd	Zdi fdZdi fdZ xZS )!CanonRobotTrajPredTransfEuclideanNc           	         t         |           || _        ddlm} d}|j                  |      j                         | _        t        dd      | _	        d}d}t        j                  t        |      D cg c]  }t        j                  ||       c}      | _        t        j                   d	|z  d	|z  ||dg      | _        y c c}w )
Nr   )AsymmetricCroCo3DStereoz)naver/DUSt3R_ViTLarge_BaseDecoder_512_dptr=   Tin_chuse_first_pool@      r&   )super__init__argsdust3r.modelrH   from_pretrainedcudadust3r	ResnetFPNimg_encr   
ModuleListrangemlp_helpers
CrossAttn_cross_attnsmake_netpointmap_decode)selfrP   rH   
model_name
latent_dimn_layer_transf_	__class__s          r   rO   z*CanonRobotTrajPredTransfEuclidean.__init__!   s    	 	9@
-==jINNP !q>
==afguav)w\]+*@*@J*W)wx*33Qz\!J,zZdef4gh *xs   5Cc           	      v   ddl m}  |        | j                  t        j                  |d   |d   fd            }t        t        j                  |j                  dd      dd      j                  d|j                  d d	             j                  d      \  }}| j                  D ]  } |||      } t        j                  |d d df   t        j                  t        |d
      |j                  dd  d      fd      }	t        | j                  t        |	            |	j                  d            }
|d|
iz  S )Nr   )	set_tracetarg_img	canon_imgr'      ri   bilinearr(   r&   ri   r   pointmap)pdbre   rV   r    r!   ch_secr*   interpolater4   r5   r2   unbindr[   ch_fstr]   r   )r^   model_input
track_idxsoutpdb_	img_featstokens_targtokens_canonattn
comb_featsrl   s              r   forwardz)CanonRobotTrajPredTransfEuclidean.forward3   sQ   )$& LL%))[-D[Q\E],^_`"ac	"(y7H7H17MeYc)d)n)nopqz  rA  rA  BD  CD  rE  *F  #G  #N  #N  OP  #Q L $$SDT+l5SlS YY	!A#f\RS>TU^UdUdegehUioy0z{|}~
$..vj/AB:??SUCVWH
 
 	
r   c           	      \   | j                  t        j                  |d   |d   fd            }t        t	        j
                  |j                  dd      dd      j                  d|j                  d d             j                  d      \  }}| j                  D ]  } |||      } t        j                  |d d df   t	        j
                  t        |d	      |j                  d
d  d      fd      }t        | j                  t        |            |j                  d
            }	|d|	iz  S )Nrf   rg   r'   r   rh   rj   rk   r&   ri   r   rl   )rV   r    r!   rn   r*   ro   r4   r5   r2   rp   r[   rq   r]   r   )
r^   rr   rs   rt   rv   rw   rx   ry   rz   rl   s
             r   forward_z*CanonRobotTrajPredTransfEuclidean.forward_D   sJ    LL%))[-D[Q\E],^_`"ac	"(y7H7H17MeYc)d)n)nopqz  rA  rA  BD  CD  rE  *F  #G  #N  #N  OP  #Q L $$SDT+l5SlS YY	!A#f\RS>TU^UdUdegehUioy0z{|}~
$..vj/AB:??SUCVWH
 
 	
r   rB   __name__
__module____qualname__rO   r{   r}   __classcell__rc   s   @r   rF   rF       s!    i$ 04 
" 15" 
r   rF   c                   8     e Zd Zd fd	Zdi fdZdi fdZ xZS )%CanonRobotTrajPredTransfBaselineNaiveNc           	      h   t         |           || _        t        dd      | _        d}d}t        j                  ||      | _        d}t        j                  t        |      D cg c]  }t        j                  ||       c}      | _        t        j                  ||||dg      | _        y c c}w )Nr=   TrI      r'   rM   	   )rN   rO   rP   rU   rV   r   	Embeddingglobal_emb_latentrW   rX   rY   rZ   r[   r\   traj_decode)r^   rP   r`   n_timestepsra   rb   rc   s         r   rO   z.CanonRobotTrajPredTransfBaselineNaive.__init__V   s    	 !q>
!#k:!F==afguav)w\]+*@*@J*W)wx&//JzR\]^0_` *xs   &B/c                    t        | j                  |d   d d df               }| j                  j                  d    j	                  t        |      dd      }| j                  D ]  } |||      } | j                  |      j                  d      }|dd df   |ddd f   }	}t        j                  |	|      d   }
|d|
iz  S )N	start_imgr   r   r'   .r=   	pred_tris)rn   rV   r   weightexpandr1   r[   r   squeezegeometryrot_trans_to_trisr    stackkorniaconversionseuler_from_quaternionrotation_matrix_to_quaternionrotation_6d_to_matrixmodel_outputrp   )r^   rr   rs   rt   
img_tokensmotion_tokensry   	pred_trajtransrottransf_tris	rot_eulers               r   r{   z-CanonRobotTrajPredTransfBaselineNaive.forwardf   s     DLL[)A!A#)FGH
..55d;BB3z?SUVXY $$TDd:m6TmT $$]3;;A>	CF#Ys12v%6c..s59!<[
 
 	
r   c                 2   t        | j                  |d   d d df               }| j                  j                  d    j	                  t        |      dd      }| j                  D ]  } |||      } | j                  |      }||dd df   |ddd f   dz  S )Nr   r   r   .r=   )
pred_transpred_rot)rn   rV   r   r   r   r1   r[   r   )r^   rr   rs   rt   r   r   ry   r   s           r   r}   z.CanonRobotTrajPredTransfBaselineNaive.forward_}   s     DLL[)A!A#)FGH
..55d;BB3z?SUVXY $$TDd:m6TmT $$]3	'BQB/%c!"f-
 
 	
r   rB   r~   r   s   @r   r   r   U   s"    a  04 |. 15" 
r   r   c                   ,     e Zd Zd fd	Zdi fdZ xZS ) CanonRobotTrajPredResnetBaselineNc                     t         |           || _        dd lm} |j                  d      }t        j                  t        |j                               d d  | _
        t        g d      | _        y )Nr   T)
pretrainedr   )   r      <   )rN   rO   rP   torchvision.modelsmodelsresnet18r   
Sequentiallistchildrenresnetr\   	traj_pred)r^   rP   r   r   rc   s       r   rO   z)CanonRobotTrajPredResnetBaseline.__init__   sZ    	 	,D1mmT&//*;%<Sb%AB!"45r   c                     | j                  || j                  j                  sdnd   d d df         j                  d      j                  d      }| j	                  |      j                  dd      }|d|iz  S )Ncanon_pc_filtered_imgstart_img_imgr   r   )   r=   r   )r   rP   noncanonr   r   r5   )r^   rr   rs   rt   latentpreds         r   r{   z(CanonRobotTrajPredResnetBaseline.forward   s    [		HZHZ)@`opqrstqtuv~~  @B  C  K  K  LN  O~~f%//6: 
 
 	
r   rB   )r   r   r   rO   r{   r   r   s   @r   r   r      s    	6 04 
r   r   c                   D     e Zd Z	 	 	 	 	 	 	 	 	 	 d fd	ZddZddZ xZS )rU   c                 t   t         |           dd}|| _        || _         ||	      }t	        d|d        t        t        j                  |      ||      | _        |
dk7  rt        j                  |
| j                  j                  j                  j                  d   | j                  j                  j                  | j                  j                  j                  | j                  j                  j                   | j                  j                  j"                        | j                  _        t        j$                         | j                  _        t        j$                         | j                  _        g d|   | _        || _        || _        || _        || _        | j5                  d	t7        j8                  d
d
d
d
      d       | j5                  dt7        j8                  dt6        j:                        d       t        j$                  t        j                  | j*                  dd
            | _        d| _        t        j@                  ddddd| j>                  ffD cg c]  \  }}t        j                  ||d
       c}}      jC                         | _"        t        j@                  dddd| j>                  fD cg c]  }t        j                  ||d
       c}      jC                         | _#        t        j                  |
| j>                  d
      jC                         | _$        y c c}}w c c}w )Nc                 :   | dk(  r(t        j                  t        j                  dd      }|S | dk(  r(t        j                  t        j                  dd      }|S | dk(  r&t        j                  t        j
                  |      }|S | dk(  rd}|S t        d	| z        )
ax  Return a normalization layer
            Parameters:
                norm_type (str) -- the name of the normalization layer: batch | instance | none
            For BatchNorm, we use learnable affine parameters and track running statistics (mean/stddev).
            For InstanceNorm, we do not use learnable affine parameters. We do not track running statistics.
            batchT)affinetrack_running_statsinstanceFgroupnoneNz%normalization layer [%s] is not found)	functoolspartialr   BatchNorm2dInstanceNorm2d	GroupNormNotImplementedError)	norm_typegroup_norm_groups
norm_layers      r   get_norm_layerz*ResnetFPN.__init__.<locals>.get_norm_layer   s     G#&..NN4T
  j(&..%%e
  g%&..r||=NO
  f$!

  *;iG r   zUsing torchvisionencoder)r   r   r=   r   )r)   )r   rL   r   r   r   i   r   r'   F)
persistentlatent_scalingr&   )dtyper   rL   )r   r   )r   rL   )rL   rL   r   )r       )%rN   rO   feature_scalerK   printgetattrtorchvisionr   modelr   Conv2dconv1r   r2   kernel_sizestridepaddingr)   r   fcavgpoollatent_size
num_layersindex_interpindex_paddingupsample_interpregister_bufferr    emptyfloat32rt   out_dimrW   rS   combs_1combs_2last_conv_up)r^   backboner   r   r   r   r   r   rK   r   rJ   r   r   d1d2drc   s                   r   rO   zResnetFPN.__init__   s    		2 +,#I.
!8Y7:W[//:j]gh
A:!yy

  ''--a0

  ,,

  ''

  ((!ZZ--:: DJJ 

]]_

7
C$(*.Xu{{1aA'>5Qekk!5==Ae 	 	
 ==IId&&Q/
 }})T\]delnpquq}q}m~I  &A2ryyR';  &A  B  G  G  I}}C2bQUQ]Q]C^%_aryyAq'9%_`eeg))E4<<;@@B &A%_s   $!L/
L5c           
         t        |j                        dkD  r6 | |j                  dd      |      j                  d|j                  d d       S | j                  dk7  rFt        j                  || j                  | j                  dkD  rdnd| j                  dkD  rdnd d	      }|g}| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }|j                  |       | j                  dkD  rS| j                  r| j                  j                  |      }| j                  j                  |      }|j                  |       | j                  dkD  r,| j                  j!                  |      }|j                  |       | j                  d
kD  r,| j                  j#                  |      }|j                  |       | j                  dkD  r,| j                  j%                  |      }|j                  |       | j&                  dk(  rd nd}|d   j                  dd  } | j(                  d    | j*                  d   t        j                  |d   |d   j                  dd  d            |d   z   j                               } | j(                  d    | j*                  d   t        j                  ||d   j                  dd  d            |d   z   j                               } | j(                  d
    | j*                  d
   t        j                  ||d   j                  dd  d            |d   z   j                               } | j(                  d    | j*                  d   t        j                  ||d   j                  dd  d            | j-                  |d         z   j                               }|S )Nr0   r   r'   r&         ?rj   areaTscale_factorr(   align_cornersrecompute_scale_factorr=   nearest r   r   rk   )r1   r2   r4   r5   r   r*   ro   r   r   maxpoolbn1reluappendr   rK   layer1layer2layer3layer4r   r   r   r   rX   r   r    r!   r   r   rt   )r^   r   custom_sizelatentsr   	latent_sz	up_latentis           r   r{   zResnetFPN.forward   s   qww<!D1a+$F$P$PQRTUT[T[\^]^T_$``$qt/A/A#'#5#5#;Z_c_q_qtw_wW[  ~B  [_aA#JJQJJq!JJNN1JJOOAq??Q""JJ&&q)

!!!$ANN1??Q

!!!$ANN1??Q

!!!$ANN1??Q

!!!$ANN1
 !% 1 1Z ?TAJ$$RS)	#DLLOodll1oammGBKPWXZP[PaPabdbePflv6w&x  zA  BD  zE  'E  &K  &K  &M  O	#DLLOodll1oammIgVXkN_N_`b`cNdjt6u&vw~  @B  xC  'C  &I  &I  &K  M	#DLLOodll1oammIgVXkN_N_`b`cNdjt6u&vw~  @B  xC  'C  &I  &I  &K  M	#DLLOodll1oammIgVXkN_N_`b`cNdjt6u&vw{  xI  xI  JQ  RT  JU  xV  'V  &\  &\  &^  `	r   c                 :   t        |j                        dkD  r6 | |j                  dd      |      j                  d|j                  d d       S | j                  dk7  rFt        j                  || j                  | j                  dkD  rdnd| j                  dkD  rdnd d	      }| j                  j                  |      }| j                  j                  |      }| j                  j                  |      }|g}| j                  dkD  rS| j                  r| j                  j                  |      }| j                  j                  |      }|j                  |       | j                  dkD  r,| j                  j!                  |      }|j                  |       | j                  d
kD  r,| j                  j#                  |      }|j                  |       | j                  dkD  r,| j                  j%                  |      }|j                  |       | j&                  dk(  rd nd}|d   j                  dd  }t)        t        |            D ]/  }t        j                  ||   ||n|| j*                  |      ||<   1 t-        j.                  |d      | _        | j0                  j                  d   | j2                  d<   | j0                  j                  d   | j2                  d<   | j2                  | j2                  dz
  z  dz  | _        | j5                  | j0                        S )Nr0   r   r'   r&   r   rj   r   Tr   r=   r   r   )r(   r   )dimr   g       @)r1   r2   r4   r5   r   r*   ro   r   r   r   r   r   rK   r   r   r   r   r  r  r   rX   r   r    r!   r   r   rt   )r^   r   r  r  r   r  r  s          r   r}   zResnetFPN.forward_-  s   qww<!		!Q5??1772A;OO$!//#'#5#5#;Z&*&8&83&>dD'+A JJQJJNN1JJOOA #??Q""JJ&&q)

!!!$ANN1??Q

!!!$ANN1??Q

!!!$ANN1??Q

!!!$ANN1 $ 1 1Z ?TAJ$$RS)	s7|$ 	A
(0	k))+	GAJ	 iiQ/!%!2!22!6A!%!2!22!6A"11T5H5H15LMPSSxx$$r   )
resnet34Tr0   rj   borderrj   r   Tr   r=   rB   r~   r   s   @r   rU   rU      s6     "OCb5%n1%r   rU   rB   )r  rj   )3r    r   r   r   r   einopsr   r   torch.nnr   r*   numpynpsysrandomtimeoscopyr   
matplotlibr   wandbr	   typingr
   r   r   r   r   r   collectionsr   torchcubicspliner   r   r   rY   rn   rq   r?   r8   r3   	grid_sampr>   warpshuffleModulerF   r   r   rU   r$   r   r   <module>r     s        $ $        C C # M  
<	z@4]
 	
Rn
33
		 3
j8
BII 8
r
ryy 
,z%		 z%r   