a
    d                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 g dZ
e	ddG d	d
 d
eZe	dddeeeedddZe	ddeeedddZdS )    )Module)GraphModule)Graph)SubgraphMatcher)compatibility)HolderModulelift_subgraph_as_modulecompare_graphsF)Zis_backward_compatiblec                       s    e Zd ZdZ fddZ  ZS )r   zy
    HolderModule is used to copy all the attributes from original module to submodules
    that uses the attributes
    c                    s,   t    | D ]\}}| || qd S )N)super__init__items
add_module)selfdkv	__class__ e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/fx/passes/utils/common.pyr      s    
zHolderModule.__init__)__name__
__module____qualname____doc__r   __classcell__r   r   r   r   r      s   r   r   )gmsubgraph
class_namereturnc                 C   s   t i }|jD ]}|jdvrq|j}t|ts2J |d}|}| }|dd D ]2}	t||	sn||	t i  t	||	}t	||	}qP|d }
t	||
}t
||
| qt|||S )aB  
    Create a GraphModule for subgraph, which copies the necessory attributes from the original parent graph_module.

    Args:
        gm (GraphModule): parent graph module

        subgraph (Graph): a valid subgraph that contains copied nodes from the parent graph

        class_name (str): name for the submodule

    )Zcall_moduleZget_attr.N)r   nodesoptarget
isinstancestrsplithasattrr   getattrsetattrr   )r   r   r   	submodulenr#   Ztarget_name_partscurrZorig_gmnameZleaf_node_nameZ	leaf_noder   r   r   r      s$    





r   )leftrightr   c                 C   s$   t | ddd}||}t|dkS )z
    Return True if two graphs are identical, i.e they
        - have the same number of outputs in the same order
        - have the same number of inputs in the same order
        - have the same set of nodes, and identical connectivity
    T)Zmatch_outputZmatch_placeholderr   )r   matchlen)r.   r/   Zmatchermatchesr   r   r   r	   G   s    	
r	   N)r   )Ztorch.nnr   Ztorch.fx.graph_moduler   Ztorch.fx.graphr   Z#torch.fx.passes.utils.matcher_utilsr   Ztorch.fx._compatibilityr   __all__r   r%   r   boolr	   r   r   r   r   <module>   s   .