o
    i                     @   s   d dl mZ d dlZd dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZ d dlmZ d d	lmZ G d
d dejZdS )    )OptionalN)einsum	rearrangerepeat)nn) cam_quat_xyzw_to_world_quat_wxyz)	Gaussians)affine_inverseget_world_rayssample_image_grid)batch_align_poses_umeyama)	rotate_shc                       s   e Zd Z						d$dededed	ed
edef fddZ		d%dejdejdejdejdejde	eef dede
ej defddZ	d&dejdejdedejfddZedefd d!Zedefd"d#Z  ZS )'GaussianAdapterr   FTh㈵>      >@	sh_degree
pred_colorpred_offset_depthpred_offset_xygaussian_scale_mingaussian_scale_maxc                    s   t    || _|| _|| _|| _|| _|| _|sD| jdt	j
| jft	jddd td|d D ]}dd|  | j|d |d d < q0d S d S )	Nsh_mask)dtypeF)
persistent   皙?g      ?   )super__init__r   r   r   r   r   r   register_buffertorchonesd_shfloat32ranger   )selfr   r   r   r   r   r   degree	__class__ ?/data/cameron/da3_repo/src/depth_anything_3/model/gs_adapter.pyr      s"   
	$zGaussianAdapter.__init__:0yE>N
extrinsics
intrinsicsdepths	opacitiesraw_gaussiansimage_shapeepsgt_extrinsicsreturnc	           (      K   sZ  |j }
|j}|\}}|jd d \}}t|}|  }|ddd d f  |  < |ddd d f  |  < | jrI||d  }|dd df }n|}|d urt||szt	| 
 | 
 \}}}W n ty}   t|d d dddf }Y nw tj|ddd	}|d d d d d d
d
f t|d |d d d d d d
d
f< |t|d }t||f|
\}}|d ||ddd}| jrdtj||f|j|
d }|dd df }|||  }|ddd f }t|t|d||dt|d||d\}}|||d   }t|d}|jd
dd
| j fdd\}}}| j}| j}||| |   }dtj||f||
d }| ||} ||d  | d  }!t|!d}!||jddd|  }t|d}"t|d||d}#t|"|#}$|$}%t|dd
d}| jsw|| j }| js| jdkr|}&nt ||d d d d d d d d d
d d
f }&t|&d}&t|d}'t!||&|'|!|%dS )Nr   .r   r   ).r5   gUUUUUU?g      @)minmax   zb -> b () ()zb -> b () () ())NN.)r   devicezb v i j -> b v h w i j)hw).Nzb v h w d -> b (v h w) d   dim).NNNT)r>   keepdimzb v h w c -> b (v h w) czb v i j -> b (v h w) i jz... (xyz d_sh) -> ... xyz d_sh)xyzz&b v h w xyz d_sh -> b (v h w) xyz d_shzb v h w ... -> b (v h w) ...)means	harmonicsr/   scales	rotations)"r9   r   shaper	   clonedetachr   r    equalr   float	Exception	ones_likeclampr   r   expandr   tensorr
   r   splitr"   r   r   sigmoidget_scale_multipliernormr   r   r   r   r   r   )(r%   r,   r-   r.   r/   r0   r1   r2   r3   kwargsr9   r   HWbvZ
cam2worldsZintr_normedZ	gs_depths_Zpose_scalesZxy_ray
pixel_sizeZ	offset_xyorigins
directionsZgs_means_worldrC   rD   shZ	scale_minZ	scale_max
multiplierZ	gs_scalescam_quat_xyzwZc2w_matworld_quat_wxyzZgs_rotations_worldZgs_sh_worldZgs_opacitiesr)   r)   r*   forward:   s   


 



,

zGaussianAdapter.forwardr   rY   r]   c                 C   s<   |t |dd dd df   ||d }|jddS )N.r   z... i j, j -> ... ir5   r=   )r   rI   inversetosum)r%   r-   rY   r]   Zxy_multipliersr)   r)   r*   rQ      s   "z$GaussianAdapter.get_scale_multiplierc                 C   s   | j rdS | jd d S )Nr   r   )r   r   )r%   r)   r)   r*   r"      s   zGaussianAdapter.d_shc                 C   sB   d}| j r	|d7 }|d7 }|d7 }|d| j 7 }| jr|d7 }|S )Nr   r   r8   r<   r   )r   r"   r   )r%   Z
raw_gs_dimr)   r)   r*   d_in   s   zGaussianAdapter.d_in)r   FFTr   r   )r+   N)r   )__name__
__module____qualname__intboolrI   r   r    Tensortupler   r   r`   rQ   propertyr"   rd   __classcell__r)   r)   r'   r*   r      sn    %
	
u
r   )typingr   r    einopsr   r   r   r   &depth_anything_3.model.utils.transformr   depth_anything_3.specsr   depth_anything_3.utils.geometryr	   r
   r   !depth_anything_3.utils.pose_alignr   Z!depth_anything_3.utils.sh_helpersr   Moduler   r)   r)   r)   r*   <module>   s   