
    a,j                        d dl mZmZ 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mZ d dlmZ g dZ ed	
          de	dedededef
d            Z ed	
           G d de                      Z ed	
          	 dde	deej                 dz  ddfd            Z ed	
          dedefd            Z ed	
          de	dedefd            ZdS )    )Any
NamedTupleN)compatibility)Graph)GraphModule)map_argNodeTarget)	ShapeProp)replace_target_nodes_with
size_bytesget_size_of_all_nodesget_tensor_metaget_size_of_nodeF)is_backward_compatible	fx_moduleold_op
old_targetnew_op
new_targetc                 ,  	 t                      }i 	| j        j        D ]}|j        |k    r|j        |k    rt          |j        	fd          }t          |j        	fd          }t          |t                    st          dt          |                     t          |t                    st          dt          |                     |                    |||||j                  	|<   |                    |	fd          	|<   || _        dS )z
    Modifies all nodes in fx_module.graph.nodes which match the specified op code
    and target, and updates them to match the new op code and target.
    c                     |          S N nval_maps    b/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/torch/fx/passes/graph_manipulation.py<lambda>z+replace_target_nodes_with.<locals>.<lambda>%   s    
     c                     |          S r   r   r   s    r   r   z+replace_target_nodes_with.<locals>.<lambda>&   s    GAJ r    zExpected tuple, got zExpected dict, got c                     |          S r   r   r   s    r   r   z+replace_target_nodes_with.<locals>.<lambda>/   s    
 r    N)r   graphnodesoptargetr   argskwargs
isinstancetupleAssertionErrortypedictcreate_nodename	node_copy)
r   r   r   r   r   	new_graphnoder'   r(   r   s
            @r   r   r      s2    I "G% L L7f
!:!:49&:&:&:&:;;DT[*>*>*>*>??FdE** J$%HDJJ%H%HIIIfd++ K$%I4<<%I%IJJJ%11
D&$) GDMM &//6J6J6J6JKKGDMMIOOOr    c                   $    e Zd ZU eed<   eed<   dS )r   output_size
total_sizeN)__name__
__module____qualname__int__annotations__r   r    r   r   r   3   s%         OOOOOr    r   r'   returnc                     | t          |           j        |  | j        j        D ]$}|j        dk    r nt          | |          |_        %dS )zGiven a fx graph module, update each node with its total size (weights + bias + output)
    and its output_size(output). For a non-module node, the total size is the output size.
    return total sizeNoutput)r   	propagater#   r$   r%   r   r   )r   r'   r2   s      r   r   r   9   s`     &	)&--% < <7hE*9d;;
Fr    r2   c                 d    | j                             d          }|st          d|  d          |S )Ntensor_metazNode zQ has no tensor metadata associated with it! Check that shape propagation has run.)metagetRuntimeError)r2   r@   s     r   r   r   K   sM    )--..K 
5D 5 5 5
 
 	

 r    c                 0   d}|j         dk    rat          |                                           }||j                 }|                                }|D ]\  }}||                                z  }t          |          }|j                                        }	||	z  }|j        r.t          j
        g |j                                                  }
n-t          j        g |j                                                  }
|
|z  }|
|	z  }t          ||          S )zGiven a node with node.dtype and node.shape, return its total size and its output size.
    total_size = weights + bias + output_size
    r   call_module)dtype)r%   r-   named_modulesr&   named_parametersnumelr   shapeis_quantizedtorch_empty_affine_quantizedrF   element_sizetensorr   )r   r2   total_num_of_elemssubmodule_dict	submodule
parameters_namepr@   output_elemsize_per_elem_bytesr5   r4   s                r   r   r   X   s)    w-i557788"4;/	//11
" 	, 	,HE1!''))+ "$''K#))++K+% W#;k'
 
 

,.. 	 $l2[5FGGGTTVV$'99J%3Kk:...r    r   )typingr   r   rL   torch.fx._compatibilityr   torch.fx.graphr   torch.fx.graph_moduler   torch.fx.noder   r	   r
   torch.fx.passes.shape_propr   __all__strr   r   listTensorr   r   r   r   r    r   <module>rb      s    " " " " " " " "  1 1 1 1 1 1             - - - - - - / / / / / / / / / / 0 0 0 0 0 0   e,,,      	 
       -, : e,,,       -,
 e,,,>B "&u|"4t";	   -," e,,,	$ 	3 	 	 	 -,	 e,,,/ /4 /J / / / -,/ / /r    