o
    i                     @   s   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 G dd deZ	dd Z
G dd	 d	eZdd
dZdd Zdd ZdZdad add Zdd ZdS )    N)
NamedTuple)QuantizedTensorc                   @   s.   e Zd ZU eed< eed< eed< eed< dS )TensorFileSlicefile_ref	thread_idoffsetsizeN)__name__
__module____qualname__object__annotations__int r   r   5/mnt/c/Users/fbmor/ComfyUI/comfy/memory_management.pyr      s
   
 r   c           	      C   s  t | tr5t |tsdS | j|jkrdS t| j|jsdS |jj}|jj| jdd tj	|j|d|_dS t
|  dd }|d u rCdS |j}|jjdksw|d u swt |jksw| |  |jk sw|  |   |jksw|  dksw|  sydS |jdkrdS tj|j }t|| }zC||j d}||jk rz|||d  }W n ty   Y W |   dS w |dkrW |   dS ||7 }||jk sW |   dS |   w )NF)non_blocking)
orig_dtypeT_comfy_tensor_file_slicecpur   )!
isinstancer   _layout_clsread_tensor_file_slice_into_qdata_paramsr   	copy_fromdataclassesreplacegetattruntyped_storager   devicetype	threading	get_identr   numelelement_sizer   storage_offsetis_contiguousctypesc_ubyte
memoryviewfrom_addressdata_ptrseekr   readintoOSErrorrelease)	tensordestinationdst_orig_dtypeinfofile_objbuf_typeviewdonenr   r   r   r      sZ   




r   c                   @   s0   e Zd ZU eed< ejed< dd Zdd ZdS )TensorGeometryshapedtypec                 C   s*   | j jr
t| j nt| j }|jd S )N   )r;   is_floating_pointtorchfinfoiinfobits)selfr3   r   r   r   r$   I   s    
zTensorGeometry.element_sizec                 C   s   t | jS N)mathprodr:   )rB   r   r   r   r#   M   s   zTensorGeometry.numelN)	r	   r
   r   anyr   r>   r;   r$   r#   r   r   r   r   r9   E   s
   
 
r9   c                 C   sf   g }| D ],}|d u st |tr|| q|j}t|dr |j}|d ur&|}|t|j|d q|S )N_model_dtype)r:   r;   )r   r   appendr;   hasattrrG   r9   r:   )tensorsr;   
geometriesttdtyper   r   r   tensors_to_geometriesP   s   

rN   c                    s|   t  trtdd  D S t  tr$  \}}t fdd|D S  d u r*dS      }d}|| d | | S )Nc                 S   s   g | ]}t |qS r   )vram_aligned_size).0rL   r   r   r   
<listcomp>`   s    z%vram_aligned_size.<locals>.<listcomp>c                    s   g | ]}t  |qS r   r   rP   attrr0   r   r   rQ   d   s    r   i      )r   listsumr   __tensor_flatten__rO   r#   r$   )r0   inner_tensors_r   aligment_reqr   rU   r   rO   ^   s   

rO   c              	      sF  d}g }|  dks| dkrtd|   d|j d| D ]  d u r,|d  q t trA  \}} fdd|D }nd i}i }| D ]<\}}	|		 |	  }
||
 |	 krntd	||
  d
|	  d||||
  j
|	jd
|	j||< |t|	7 }qKt tr|t||dd q ||d  q |S )Nr   rV   z'Buffer must be 1D and single-byte (got zD )c                    s   i | ]}|t  |qS r   rR   rS   rU   r   r   
<dictcomp>|   s    z+interpret_gathered_like.<locals>.<dictcomp>datazBuffer too small: needs z bytes, but only has z. )r;   )dimr$   
ValueErrorr;   rH   r   r   rY   itemsr#   r6   r:   rO   __tensor_unflatten__)rJ   gatheredr   
dest_viewsrZ   qt_ctx	templatesactualsrT   templater   r   rU   r   interpret_gathered_likem   s.   

&
rj   Fc                 C   s   | a tdt|ad S Nr   )extra_ram_release_callbackmaxr   RAM_CACHE_HEADROOM)callbackheadroomr   r   r   set_ram_cache_release_state   s   rq   c                 C   s   t d u rdS t | S rk   )rl   )targetr   r   r   extra_ram_release   s   rs   rC   )rD   r'   r!   r   r>   typingr   comfy.quant_opsr   r   r   r9   rN   rO   rj   aimdo_enabledrl   rn   rq   rs   r   r   r   r   <module>   s$    3
"