o
    9i                     @   s   d dl Z d dlmZmZ d dlmZmZmZmZm	Z	m
Z
 d dlZd dlmZmZ ddlmZmZ e eZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    N)ABCabstractmethod)DictListLiteralOptionalTupleUnion)	rearrangerepeat   )append_dimsdefaultc                   @   sV   e Zd ZedejdedejfddZdejdededede	ejeef f
d	d
Z
dS )Guiderxsigmareturnc                 C      d S N selfr   r   r   r   N/data/cameron/vidgen/generative-models/sgm/modules/diffusionmodules/guiders.py__call__   s   zGuider.__call__scucc                 C   r   r   r   )r   r   r   r   r   r   r   r   prepare_inputs   s   zGuider.prepare_inputsN)__name__
__module____qualname__r   torchTensorfloatr   r   r   r   r   r   r   r   r      s    r   c                   @   s>   e Zd ZdefddZdejdejdejfddZd	d
 ZdS )
VanillaCFGscalec                 C   s
   || _ d S r   )r%   )r   r%   r   r   r   __init__   s   
zVanillaCFG.__init__r   r   r   c                 C   s$   | d\}}|| j||   }|S )N   )chunkr%   )r   r   r   x_ux_cx_predr   r   r   r      s   zVanillaCFG.__call__c                 C   sx   t  }|D ]%}|dv rt|| || fd||< q|| || ks$J || ||< qt|gd t|gd |fS N)vector	crossattnconcatr   r'   )dictr!   catr   r   r   r   r   c_outkr   r   r   r   !   s   "zVanillaCFG.prepare_inputsN)	r   r   r    r#   r&   r!   r"   r   r   r   r   r   r   r$      s    r$   c                   @   sR   e Zd ZdejdedejfddZdejdedededeejeef f
d	d
Z	dS )IdentityGuiderr   r   r   c                 C   s   |S r   r   r   r   r   r   r   .   s   zIdentityGuider.__call__r   r   r   c                 C   s&   t  }|D ]}|| ||< q|||fS r   )r0   r2   r   r   r   r   1   s   
zIdentityGuider.prepare_inputsN)
r   r   r    r!   r"   r#   r   r   r   r   r   r   r   r   r5   -   s    r5   c                   @   s   e Zd Z		ddedededeeee ef  fddZ	d	e
jd
e
jde
jfddZd	e
jde
jdededee
je
jef f
ddZdS )LinearPredictionGuider      ?N	max_scale
num_frames	min_scaleadditional_cond_keysc                 C   sL   || _ || _|| _t|||d| _t|g }t|t	r!|g}|| _
d S )Nr   )r:   r8   r9   r!   linspace	unsqueezer%   r   
isinstancestrr;   )r   r8   r9   r:   r;   r   r   r   r&   =   s   


zLinearPredictionGuider.__init__r   r   r   c                 C   sn   | d\}}t|d| jd}t|d| jd}t| jd|jd d}t||j|j	}t||||   dS )Nr'   z(b t) ... -> b t ...)tz
1 t -> b tr   )bzb t ... -> (b t) ...)
r(   r
   r9   r   r%   shaper   ndimtodevice)r   r   r   r)   r*   r%   r   r   r   r   N   s   zLinearPredictionGuider.__call__r   r   r   c                 C   sn   t  }|D ] }|g d| j v rt|| || fd||< q|| ||< qt|gd t|gd |fS r,   )r0   r;   r!   r1   r2   r   r   r   r   X   s   "z%LinearPredictionGuider.prepare_inputs)r7   N)r   r   r    r#   intr   r	   r   r?   r&   r!   r"   r   r0   r   r   r   r   r   r   r6   <   s0    

r6   c                       sv   e Zd Z				ddedededeeee f ded	 d
eeee	 e	f  f fddZ
dejdejfddZ  ZS )TrianglePredictionGuiderr7   maxNr8   r9   r:   periodperiod_fusing)meanmultiplyrH   r;   c                    s   t  |||| tdd|}t|tr|g}g }|D ]}	|| ||	 q|dkr5t|t	| }
n|dkrDtj
t|dd}
n|dkrStjt|ddj}
|
||  | d| _d S )Nr      rK   rL   )dimrH   )superr&   r!   r<   r>   r#   appendtriangle_wavesumlenprodstackrH   valuesr=   r%   )r   r8   r9   r:   rI   rJ   r;   rV   scalespr%   	__class__r   r   r&   g   s   	
z!TrianglePredictionGuider.__init__rV   r   c                 C   "   d|| t || d    S Nr'         ?r!   floorabsr   rV   rI   r   r   r   rQ         "z&TrianglePredictionGuider.triangle_wave)r7   r7   rH   N)r   r   r    r#   rF   r	   r   r   r   r?   r&   r!   r"   rQ   __classcell__r   r   rY   r   rG   f   s&    rG   c                       sJ   e Zd Z			ddededededeeee ef  f
 fd	d
Z	  Z
S )TrapezoidPredictionGuiderr7   皙?Nr8   r9   r:   	edge_percr;   c              
      sh   t  |||| t||t|| }t|dg}t|t|dt||   |gd| _	d S )Nr   r'   )
rO   r&   r!   r<   rF   flipr1   onesr=   r%   )r   r8   r9   r:   rf   r;   
rise_steps
fall_stepsrY   r   r   r&      s   z"TrapezoidPredictionGuider.__init__)r7   re   N)r   r   r    r#   rF   r   r	   r   r?   r&   rc   r   r   rY   r   rd      s    rd   c                       sb   e Zd Z			ddededededeeee ef  f
 fd	d
Z	dde
jde
jfddZ  ZS )SpatiotemporalPredictionGuiderrM   r7   Nr8   r9   	num_viewsr:   r;   c           	         s   t  |||| |}|| }t|||}|tdd|d d d f d 7 }|| tdd|d d d f d 7 }| }|||  | d| _	d S )Nr   rM   r]   )
rO   r&   r!   zerosviewr<   rQ   flattenr=   r%   )	r   r8   r9   rl   r:   r;   VTr%   rY   r   r   r&      s   "(z'SpatiotemporalPredictionGuider.__init__rV   r   c                 C   r[   r\   r^   ra   r   r   r   rQ      rb   z,SpatiotemporalPredictionGuider.triangle_wave)rM   r7   N)rM   )r   r   r    r#   rF   r   r	   r   r?   r&   r!   r"   rQ   rc   r   r   rY   r   rk      s      rk   )loggingabcr   r   typingr   r   r   r   r   r	   r!   einopsr
   r   utilr   r   	getLoggerr   logpyr   r$   r5   r6   rG   rd   rk   r   r   r   r   <module>   s     
* 