o
    i                  	   @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 dde
de
d	e
d
e
fddZG dd de	jZG dd deZd
efddZdS )    N)override	rearrange)randint)ComfyExtensionio   max_optionsvalue	min_valuereturnc                   s~   t | } fddt| d D } fdd|d | D }t|d dkr9tdt|d dd }|| S d}|| S )Nc                    s   g | ]
} | d kr|qS )r    .0ir
   r   :/mnt/c/Users/fbmor/ComfyUI/comfy_extras/nodes_hypertile.py
<listcomp>   s    z"random_divisor.<locals>.<listcomp>r   c                    s   g | ]} | qS r   r   r   r   r   r   r      s    r   r   )lowhighsize)minrangelenr   item)r
   r   r	   divisorsnsidxr   r   r   random_divisor
   s   
r   c                   @   s,   e Zd Zedd ZedejfddZdS )	HyperTilec                 C   sp   t jddt jdt jjdddddd	t jjd
ddddd	t jjdddddd	t jjddddgt j gdS )Nr    zmodel_patches/unetmodel	tile_size   r   i   T)defaultr   maxadvanced	swap_size      	max_depthr   
   scale_depthF)r$   r&   )node_idcategoryinputsoutputs)r   SchemaModelInputIntBooleanOutput)clsr   r   r   define_schema   s   
zHyperTile.define_schemar   c           	         sT   t d|d  d  fdd}fdd}| }|| || |fS )N       c                    s  | j d }|d }g }td D ]}||d d|  |d d|    q||v r|d }|d |d  }	| d}
tt|
|	 tt|
|	 }}rXd|| nd}t| | }t| | }|| dkrt	| d|| || ||d} ||||f| ||fS | ||fS )Noriginal_shaper   r(   z$b (nh h nw w) c -> (b nh nw) (h w) c)hwnhnw)
shaper   appendr   roundmathsqrtindexr   r   )qkvextra_optionsmodel_chans
orig_shapeapply_tor   rB   aspect_ratiohwr>   r?   factorr@   rA   latent_tile_sizer*   r,   r'   tempr   r   hypertile_in0   s$   
(
&

z'HyperTile.execute.<locals>.hypertile_inc                    sD    d ur  \}}}}d  t | d||d} t | d|| || d} | S )Nz(b nh nw) hw c -> b nh nw hw c)r@   rA   z"b nh nw (h w) c -> b (nh h nw w) c)r>   r?   r   )outrK   r@   rA   r>   r?   )rT   r   r   hypertile_outI   s   z(HyperTile.execute.<locals>.hypertile_out)r%   cloneset_model_attn1_patchset_model_attn1_output_patch)	r7   r!   r"   r'   r*   r,   rU   rW   mr   rR   r   execute+   s   


zHyperTile.executeN)__name__
__module____qualname__classmethodr8   r   
NodeOutputr\   r   r   r   r   r       s
    
r    c                   @   s(   e Zd Zedeeej  fddZdS )HyperTileExtensionr   c                    s   t gS N)r    )selfr   r   r   get_node_listZ   s   z HyperTileExtension.get_node_listN)	r]   r^   r_   r   listtyper   	ComfyNodere   r   r   r   r   rb   Y   s    rb   c                      s   t  S rc   )rb   r   r   r   r   comfy_entrypointa   s   ri   r   )rE   typing_extensionsr   einopsr   torchr   comfy_api.latestr   r   intr   rh   r    rb   ri   r   r   r   r   <module>   s   @