
    AVh?#                         d Z ddlZddl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 d Zd Zd	 Zdd
ZddZd Zd Zd Zd Zd Zd Zd Z G d de      Zd Zy)z3Exposes the Python wrapper conversion to trt_graph.    N)version)_pywrap_py_utils)rewriter_config_pb2)dtypesc                 x   t         j                  j                  }|| _        || _        d| j
                  _        || _        || _        || _	        d| _
        d| _        || _        || _        || _        || _        t         j                  j                   | _        d| _        || _        || _        || _        || _        y)z>Modifies rewriter_config to disable all non-TRT optimizations.FTN)r   RewriterConfigOFFarithmetic_optimizationauto_mixed_precisionauto_parallelenableconstant_foldingdebug_stripperdependency_optimizationdisable_meta_optimizerdisable_model_pruningfunction_optimizationimplementation_selectorlayout_optimizerloop_optimization
NO_MEM_OPTmemory_optimizationmin_graph_nodespin_to_host_optimization	remappingscoped_allocator_optimizationshape_optimization)rewriter_configoffs     Y/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/compiler/tensorrt/utils.py-disable_non_trt_optimizers_in_rewriter_configr"      s    **..#,//)),/&)./&%(/"#&/ ,//)+0/(*./'*-/',//)%(/"&)/#((33 %$&/!-0/*!/25//'*/$    c                     t        | t              sJ t        |       dk(  sJ | D cg c]  }t        |       } }dj	                  |       S c c}w )N   .)
isinstancetuplelenstrjoin)	ver_tuplexs     r!   version_tuple_to_stringr.   6   sO    	Iu	%%	%	Y1		()!s1v)))	)	 *s   Ac                     t        j                  t        |             } t        j                  t        |            }| |k\  S N)r   Versionr.   )trt_ver
target_vers     r!   "_is_tensorrt_version_greater_equalr4   >   s5    OO3G<='6zBC*	J	r#   c                 H    t        j                         }t        || ||f      S r0   )r   get_linked_tensorrt_versionr4   majorminorpatchvers       r!   (is_linked_tensorrt_version_greater_equalr<   E   $    446#	+C%1F	GGr#   c                 H    t        j                         }t        || ||f      S r0   )r   get_loaded_tensorrt_versionr4   r7   s       r!   (is_loaded_tensorrt_version_greater_equalr@   J   r=   r#   c                 f    | t         j                  j                  dd      j                  d      v S )a!  Determines if a TF-TRT experimental feature is enabled.

  This helper function checks if an experimental feature was enabled using
  the environment variable `TF_TRT_EXPERIMENTAL_FEATURES=feature_1,feature_2`.

  Args:
    feature_name: Name of the feature being tested for activation.
  TF_TRT_EXPERIMENTAL_FEATURES )default,)osenvirongetsplit)feature_names    r!   !is_experimental_feature_activatedrK   O   s5     ZZ^^:$&  ((-c
3 4r#   c                     t        | t              rt        j                  |    S | D cg c]  }t        j                  |    c}S c c}w )zEHelper function to convert a dtype id to a corresponding string name.)r'   intr   _TYPE_TO_STRING)dtypeds     r!   _convert_dtype_id_to_strrQ   ^   s<    s!!%((/45!F""1%555s   Ac                    dD ]e  }	 | j                   |   }|dk(  r8|j                  j                  d      }|dk(  r9|dk(  r y|dk(  r y|d	k(  r y
 yt        |j                        c S  y# t
        $ r
}Y d}~wd}~ww xY w)z-Returns the compute DType of a GraphDef Node.)precision_modeDstTrO   TrS   zutf-8rC   FP32float32FP16float16INT8int8unknownN)attrsdecoderQ   type	Exception)nodetype_keyprecision_vales       r!   get_node_compute_dtyperf   f   s     hii)m	%	%%..w7B
F"f$f$'(:(:;;+,  s(   4A,A,A,
A,A,,	A?:A?c                     g }| j                   |   j                  j                  D ]5  }|j                  |j                  D cg c]  }|j
                   c}       7 |S c c}w )z3Returns the input/output shapes of a GraphDef Node.)r]   listshapeappenddimsize)rb   key	out_shaperi   rk   s        r!   get_node_io_shapesro      sV    )yy~""(( 6e%))43chh456	 5s   A 
c                 Z    t        | j                  |   j                  j                        S )z1Returns the input/output dtypes of a TRTEngineOp.)rQ   r]   rh   r`   rb   rm   s     r!   get_trtengineop_io_dtypesrr      s!    	!$))C."5"5":":	;;r#   c                 Z    t        | j                  |   j                  j                        S )z:Returns the number of input/output nodes of a TRTEngineOp.)r)   r]   rh   r`   rq   s     r!   get_trtengineop_io_nodes_countrt      s!    	TYYs^  %%	&&r#   c                 .   t        j                  t              }| j                  j                  D ]`  }| d|j
                  j                  k(  s t        |j                        }|j                  D ]  }||j                  xx   dz  cc<     ||fS  |fS )z?Counts the number of nodes and OP types of a given TRTEngineOp._native_segment   )
collectionsdefaultdictrM   libraryfunction	signaturenamer)   node_defop)graphdef	node_nameops_in_enginefunc
node_countrb   s         r!   get_trtengineop_node_op_countr      s    ))#.-'' d
O$(;(;;t}}%j-- $$dgg!#$	]	"" 
]	""r#   c                       e Zd ZdZd Zy)
DTypeIndexzBHelper class to create an index of dtypes with incremental values.c                 6    || vrt        |       dz   | |<   | |   S )Nrw   )r)   )selfrO   s     r!   get_dtype_indexzDTypeIndex.get_dtype_index   s%    DIMd5k;r#   N)__name__
__module____qualname____doc__r    r#   r!   r   r      s
    Jr#   r   c                 b   t               }t        |d      5 }t        d|       t        d|       t        d|       t        d|       t        d|       g }| j                  D ]  }|j                  }t        |      }|j                  |      }|j                  j                  d      d	   }	|	sd
}	|j                  dk(  rt        | |      \  }
}| d|
 d}n|j                   }d| d|	 d}t        d| d| d| d|       t        |j                        rR|j                  D ]A  }|j                  d      }t        j                  dd|d         }t        d| d| d|       C 	|j                  |        t        d|       t        d|       t        d|       t        d|       t        d |       |j!                         D ]  \  }}t        d!| d"| d#| d$|        t        d|       t        d%|       |j#                         D ]  }|D ]  }t        d| d| d&|         t        d'|       d(d(d(       t        d)       t        d*| d+       t        d,       t        d-       t        d.       t        d/       t        d0       y(# 1 sw Y   [xY w)1a9  Exports a GraphDef to GraphViz format.

  - Step 1: Drawing Each Node of the compute GraphDef.
  - Step 2: Create nodes for each collected dtype in the graph.
  - Step 3: Creating invisible links to align properly the legend.

  Each node consequently mentions:
  - Op Type
  - Compute Dtype
  - Compute Device
  wzdigraph tftrt_converted_graph {)filez)  graph [fontsize=10 fontname="Verdana"];z?  node [style=filled height=0.55 colorscheme=set312 shape=box];z
  subgraph tensorflow_graph {z    node [width=1.35];/r   zdevice:UnspecifiedTRTEngineOpz []z<b>z</b>  <br/><i>z</i>z    "z
" [label=<z> fillcolor=z];:z^\^rC   r   z  "z" -> "z";z  }z
  subgraph cluster_legend {z!    label="Compute Dtype Legend";z    margin="30";z    node [width=2];z    z [fillcolor=z label=<<b>z</b>>];z'
  edge[style="invisible", dir="none"];"}NzD
===================================================================z"Graph Visualization Exported to: `z`.zBWe recommend using https://edotor.net/ to visualize the .dot file.zBYou can also use `graphviz` utility to convert them to PNG format:z"  - `sudo apt install -y graphviz`z=  - `dot -Tpng <input_filename>.dot -o <output_filename>.png`zD===================================================================
)r   openprintrb   r}   rf   r   devicerI   r   r   r)   inputresubrj   itemskeys)r   dot_output_filenamedtype_indexfnodes_with_no_inputsrb   output_namenode_precision	color_idx
device_keyr   _
node_labelinput_full_nameparts
input_namerO   r   s                     r!   draw_graphdef_as_graphvizr      s    +% A	
+!4	
7a@	I
 

+!4	
"+ 1IIk-d3n--n=i;;$$S)"-j)
	M	!5hL
A#}Bzl!4
y
 N:,dCj;-{:, 7 k%
 
TZZ#zz 	EO!'',%vvfb%(3*
$zl(;-s;!
D	E
 	##K0=1> 
%a 

)2	
/a8	
Q'	
a('--/ y|I;k%
H
 
%a 

8qA!!# ;+ ;)UG8I;b1:;; 
#ACAF OP
,-@,ADELMLM,-GHOPSA As   H4J%%J.)r   r   )r   rx   rF   r   	packagingr   tensorflow.compiler.tf2tensorrtr   tensorflow.core.protobufr   tensorflow.python.frameworkr   r"   r.   r4   r<   r@   rK   rQ   rf   ro   rr   rt   r   dictr   r   r   r#   r!   <module>r      sp    :  	 	  < 8 .+4H
H
46<<
'
	# XQr#   