
    !&h#                         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       G d	 d
e	             Z ed      	 	 ddededededeeeeef   f   f
d       Z ed      dededefd       Zy)    )compatibility)Graph)GraphModule)SubgraphMatcher)Module)HolderModulelift_subgraph_as_modulecompare_graphsF)is_backward_compatiblec                   "     e Zd ZdZ fdZ xZS )r   zy
    HolderModule is used to copy all the attributes from original module to submodules
    that uses the attributes
    c                 v    t         |           |j                         D ]  \  }}| j                  ||        y )N)super__init__items
add_module)selfdkv	__class__s       r/var/www/pru.catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/torch/fx/passes/utils/common.pyr   zHolderModule.__init__   s5    GGI 	"DAqOOAq!	"    )__name__
__module____qualname____doc__r   __classcell__)r   s   @r   r   r      s    
" "r   r   gmsubgraph	comp_name
class_namereturnc                    t        i       }i }|j                  D ]  }|j                  dvr|j                  }t	        |t
              sJ |j                  d      }|}	| }
|dd D ]A  }t        |	|      s|	j                  |t        i              t        |	|      }	t        |
|      }
C |d   }t        |
|      }| d| ||<   t        |	||        t        |||      |fS )aw  
    Create a GraphModule for subgraph, which copies the necessary 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

        comp_name (str): name for the new component

        class_name (str): name for the submodule

    )call_moduleget_attr.N)r   nodesoptarget
isinstancestrsplithasattrr   getattrsetattrr   )r   r   r    r!   	submoduleorig_to_split_fqn_mappingnr*   target_name_partscurrorig_gmnameleaf_node_name	leaf_nodes                 r   r	   r	      s   6 R I02^^ 14422&#&&&"LL-%cr* 	-D4&l2&674&Dgt,G	- +2.G^4	/8k6(,C!&)ni0-10 y(J79RRRr   leftrightc                 \    t        | dd      }|j                  |      }t        |      dkD  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)match_outputmatch_placeholderr   )r   matchlen)r:   r;   matchermatchess       r   r
   r
   R   s/     dNGmmE"Gw<!r   N) r   )torch.fx._compatibilityr   torch.fx.graphr   torch.fx.graph_moduler   #torch.fx.passes.utils.matcher_utilsr   torch.nnr   __all__r   r,   tupledictr	   boolr
    r   r   <module>rN      s    2   - ?  H e,	"6 	" -	" e, #	4S4S4S 4S 	4S
 ;S#X&'4S -4Sn e, u   -r   