o
    i9                     @  s   d dl mZ d dlmZ G dd dZd.d/ddZd.d0ddZd.d1ddZd.d2ddZG dd dZ	d.d3ddZ
d.d4ddZd.d5ddZd.d6dd ZG d!d" d"ZG d#d$ d$Zd7d&d'Zd8d9d+d,Zd-S ):    )annotations)Callablec                   @  sB   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZedddZdS )CallbacksMPon_cloneon_load_afteron_detach_after
on_cleanup
on_pre_runon_prepare_stateon_apply_hookson_register_all_hook_patcheson_inject_modelon_eject_modelreturn$dict[str, dict[str, list[Callable]]]c                 C     i S N clsr   r   5/mnt/c/Users/fbmor/ComfyUI/comfy/patcher_extension.pyinit_callbacks      zCallbacksMP.init_callbacksNr   r   )__name__
__module____qualname__ON_CLONEON_LOAD	ON_DETACH
ON_CLEANUP
ON_PRE_RUNON_PREPARE_STATEON_APPLY_HOOKSON_REGISTER_ALL_HOOK_PATCHESON_INJECT_MODELON_EJECT_MODELclassmethodr   r   r   r   r   r      s    r   F	call_typestrcallbackr   transformer_optionsdictc                 C     t | d ||| d S r   )add_callback_with_key)r(   r*   r+   is_model_optionsr   r   r   add_callback      r0   keyc                 C  >   |r| di }| di }| | i  |g }|| d S Nr+   	callbacks
setdefaultappend)r(   r2   r*   r+   r/   r5   cr   r   r   r.      
   r.   c                 C  >   |r| di }g }| di }|| | i  |g  |S r4   getextend)r(   r2   r+   r/   c_listr5   r   r   r   get_callbacks_with_key       r@   c                 C  D   |r| di }g }| di }| | i  D ]}|| q|S r4   r=   valuesr>   )r(   r+   r/   r?   r5   r9   r   r   r   get_all_callbacks(      rE   c                   @  s6   e Zd ZdZdZdZdZdZdZdZ	e
dd
dZdS )
WrappersMPouter_sampleprepare_samplingsampler_samplepredict_noisecalc_cond_batchapply_modeldiffusion_modelr   r   c                 C  r   r   r   r   r   r   r   init_wrappers<   r   zWrappersMP.init_wrappersNr   )r   r   r   OUTER_SAMPLEPREPARE_SAMPLINGSAMPLER_SAMPLEPREDICT_NOISECALC_COND_BATCHAPPLY_MODELDIFFUSION_MODELr'   rO   r   r   r   r   rG   1   s    rG   wrapper_typewrapperc                 C  r-   r   )add_wrapper_with_key)rW   rX   r+   r/   r   r   r   add_wrapper@   r1   rZ   c                 C  r3   Nr+   wrappersr6   )rW   r2   rX   r+   r/   r\   wr   r   r   rY   C   r:   rY   c                 C  r;   r[   r<   )rW   r2   r+   r/   w_listr\   r   r   r   get_wrappers_with_keyJ   rA   r_   c                 C  rB   r[   rC   )rW   r+   r/   r^   r\   r]   r   r   r   get_all_wrappersR   rF   r`   c                   @  sT   e Zd ZdZdd
dZdd Zdd ZdddZeddddZ	eddddZ
dS )WrapperExecutorzFHandles call stack of wrappers around a function in an ordered manner.originalr   	class_objobjectr\   list[Callable]idxintc                 C  s.   || _ || _| | _|| _|t|k| _d S r   )rb   rc   copyr\   rf   lenis_last)selfrb   rc   r\   rf   r   r   r   __init__]   s
   
zWrapperExecutor.__init__c                 O  s   |   }|j|i |S )zFCalls the next wrapper or original function, whichever is appropriate.)_create_next_executorexecute)rk   argskwargsnew_executorr   r   r   __call__f   s   zWrapperExecutor.__call__c                 O  sD   t |}t|}| jr| j|i |S | j| j | g|R i |S )z[Used to initiate executor internally - DO NOT use this if you received executor in wrapper.)listr,   rj   rb   r\   rf   )rk   ro   rp   r   r   r   rn   k   s
   zWrapperExecutor.executer   'WrapperExecutor'c                 C  sR   | j d }|t| jkrtd| jd u rt| j| j|S t| j| j| j|S )N   zCWrapper idx exceeded available wrappers; something went very wrong.)	rf   ri   r\   	Exceptionrc   ra   rq   rb   new_class_executor)rk   new_idxr   r   r   rm   s   s   

z%WrapperExecutor._create_next_executorr   c                 C  s   | |d ||dS )N)rc   r\   rf   r   )r   rb   r\   rf   r   r   r   rq   {      zWrapperExecutor.new_executorc                 C  s   | ||||dS )N)rf   r   )r   rb   rc   r\   rf   r   r   r   rw      ry   z"WrapperExecutor.new_class_executorN)rb   r   rc   rd   r\   re   rf   rg   )r   rt   )r   )rb   r   r\   re   )rb   r   rc   rd   r\   re   )r   r   r   __doc__rl   rr   rn   rm   r'   rq   rw   r   r   r   r   ra   [   s    
	
ra   c                   @  s   e Zd ZdddZdS )PatcherInjectioninjectr   ejectc                 C  s   || _ || _d S r   )r|   r}   )rk   r|   r}   r   r   r   rl      s   
zPatcherInjection.__init__N)r|   r   r}   r   )r   r   r   rl   r   r   r   r   r{      s    r{   
input_dictc                 C  sL   |   }|  D ]\}}t|trt|||< qt|tr#|  ||< q|S r   )rh   items
isinstancer,   copy_nested_dictsrs   )r~   new_dictr2   valuer   r   r   r      s   

r   Tdict1dict2c                 C  st   |rt | }n| }| D ]*\}}t|tr$||i }t||||< qt|tr3||g | q|||< q|S r   )r   r   r   r,   r7   merge_nested_dictsrs   r>   )r   r   
copy_dict1merged_dictr2   r   
curr_valuer   r   r   r      s   



r   N)F)r(   r)   r*   r   r+   r,   )r(   r)   r2   r)   r*   r   r+   r,   )r(   r)   r2   r)   r+   r,   )r(   r)   r+   r,   )rW   r)   rX   r   r+   r,   )rW   r)   r2   r)   rX   r   r+   r,   )rW   r)   r2   r)   r+   r,   )rW   r)   r+   r,   )r~   r,   )T)r   r,   r   r,   )
__future__r   typingr   r   r0   r.   r@   rE   rG   rZ   rY   r_   r`   ra   r{   r   r   r   r   r   r   <module>   s     		(
	