o
    i"                     @   sv   d dl mZmZ d dlZd dlm  mZ d dlm	Z	 d dl
mZ ddlmZ G dd deZG d	d
 d
ejjZdS )    )ListTupleN)jvp)	BaseModel   )VoxCPMLocDiTc                   @   s   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< d	Z
eed
< dZeed< dZeeef ed< dZeeef ed< dZeed< dS )	CfmConfiggư>	sigma_mineulersolverlog-normt_schedulerg?training_cfg_rate      ?inference_cfg_ratel1reg_loss_type)g      ?g      ?ratio_r_neq_t_range)        r   noise_cond_prob_ranger   noise_cond_scaleN)__name__
__module____qualname__r	   float__annotations__r   strr   r   r   r   r   r   r   r    r   r   U/home/ubuntu/.local/lib/python3.10/site-packages/voxcpm/modules/locdit/unified_cfm.pyr      s   
 r   c                       s0  e Zd Z	d/dedededef fddZe	 					d0d
ej
dededej
dedededefddZdej
dej
fddZ			d1dej
dej
d
ej
dej
dedefddZd2dej
d ej
dB d!ed"efd#d$Zd3dej
d
ed&ed'efd(d)Z			d4d*ej
d
ej
dej
dB d+ej
dB d,ef
d-d.Z  ZS )5
UnifiedCFMFin_channels
cfm_params	estimator	mean_modec                    sh   t    |j| _|j| _|j| _|j| _|j| _|j| _|j| _|j	| _	|j
| _
|| _|| _|| _d S )N)super__init__r   r	   r   r   r   r   r   r   r   r    r#   r"   )selfr    r!   r"   r#   	__class__r   r   r%      s   

zUnifiedCFM.__init__r   Tmun_timesteps
patch_sizecondtemperature	cfg_valuesway_sampling_coefuse_cfg_zero_starc	                 C   s   |j \}	}
|}tj|	| j|f|j|jd| }tjdd|d |j|jd}||ttjd | d |   }| j	||||||dS )Ndevicedtyper   r      )xt_spanr)   r,   r.   r0   )
shapetorchrandnr    r2   r3   linspacecospisolve_euler)r&   r)   r*   r+   r,   r-   r.   r/   r0   b_tzr6   r   r   r   forward2   s   
 $zUnifiedCFM.forwardpositive_flatnegative_flatc                 C   s8   t j|| ddd}t j|d dddd }|| }|S )Nr   T)dimkeepdimr4   g:0yE>)r8   sum)r&   rC   rD   dot_productsquared_normst_starr   r   r   optimized_scaleN   s   zUnifiedCFM.optimized_scaler5   r6   c                 C   s  |d |d |d |d  }}}	g }
t dtt|d }tdt|D ]"}|r5||kr5t|}n|d}tjd| | j|dg|j	|j
d}tjd| |dg|j	|j
d}tjd| g|j	|j
d}tjd| g|j	|j
d}tjd| | j|dg|j	|j
d}|||d |< ||d < ||d |< |d|d|d |< ||d < |	d|	d|d |< ||d < | jst|}|||d |< ||d < | |||||}tj||d|dgdd\}}|r||d}||d}| ||}|j|gdgt|jd  R  }nd}|| ||||    }||	|  }||	 }|
| |t|d k rI|||d   }	q&|
d S )	Nr   r   g{Gz?r4   r1   rE   r   )maxintlenranger8   
zeros_likesizezerosr    r2   r3   	unsqueezer#   r"   splitviewrK   r7   append)r&   r5   r6   r)   r,   r.   r0   r@   r?   dtsolzero_init_stepsstepdphi_dtr>   x_inmu_int_indt_incond_incfg_dphi_dtrC   rD   rJ   r   r   r   r=   T   sF   $	
&"&&&
$$
zUnifiedCFM.solve_eulerNr   MbP?lossesmaskpepsilonc                 C   s*   d||  | }|d ur|| }| S )Nr   )powdetach)r&   re   rf   rg   rh   weightsr   r   r   adaptive_loss_weighting   s   z"UnifiedCFM.adaptive_loss_weighting皙ٿsigmaratio_r_neq_tc              	   C   s  |j d }| jdkr1tj||j|jd| | }tj||j|jd| | }t|}t|}	n"| jdkrKtj||j|jd}tj||j|jd}	ntd| j tj||j|jd|k }
t	|
tj
t||	t||	gddtj
|	|	gdd\}}	| |	 fS )Nr   r   r1   uniformzUnsupported t_scheduler: rM   )r7   r   r8   r9   r2   r3   sigmoidrand
ValueErrorwherestackminrN   squeeze)r&   r5   r)   rn   ro   
batch_sizes_rs_trr@   rf   r   r   r   
sample_r_t   s"   



 zUnifiedCFM.sample_r_tx1tgt_maskprogressc                    s>  |j \}}}jdkrtj||jdjk}|dd  d u r't| tj||jddjd |jd jd     k}	 |	dddt  j	   j
rgjd |jd jd    nd}
j||
d\}}|  }|  }t|}d|ddd | |ddd|  }|| } fdd	}j
rt|}t|}dd
lm} |ddd t||||f|||f\}}W d    n1 sw   Y  ||| ddd|  }n||||}|}tj|| ddjdd}|d ur||d}||  t| }|S | }|S )Nr   )r2   rL   r   r   r   )ro   c                    s   j | | || dS )N)rY   )r"   )z_sampler_samplet_sampler,   r)   r&   r   r   model_fn   s   z)UnifiedCFM.compute_loss.<locals>.model_fn)
sdp_kernelF)enable_flashenable_mem_efficientnone)	reductionrM   )r7   r   r8   rr   r2   rW   rR   r   
randn_liker   r#   r   r|   rj   clone	ones_liketorch.backends.cudar   r   Fmse_lossmeanrl   rw   rG   )r&   r}   r)   r,   r~   r   r>   r?   cfg_mask
noisy_maskro   r{   r@   r_t_rA   yvr   v_rv_tr   u_preddudtu_tgtre   rk   lossr   r   r   compute_loss   sX   

"

(


zUnifiedCFM.compute_loss)F)r   r   r   T)r   T)Nr   rd   )rm   r   r   )NNr   )r   r   r   rO   r   r   boolr%   r8   inference_modeTensorr   rB   rK   r=   rl   r|   r   __classcell__r   r   r'   r   r      s    	
$9r   )typingr   r   r8   torch.nn.functionalnn
functionalr   
torch.funcr   pydanticr   	local_ditr   r   Moduler   r   r   r   r   <module>   s    