
     Ti                    x   S SK Jr  S SKrS SKrS SKJrJrJrJrJ	r	  S SK
rS SKrS SKJr  S SKJrJrJrJrJrJrJr  S SKJr  S SKJr  \R4                  " S5      rS	 r " S
 S\5      rS rS%S jr S r!S r"0 \RF                  S_\RH                  S_\RJ                  S_\RL                  S_\RN                  S_\RP                  S_\RR                  S_\RT                  S_\RV                  S_\RX                  S_\RZ                  S_\R\                  S_\R^                  S_\R`                  S_\Rb                  S_\Rd                  S_\Rf                  S_\Rh                  S\Rj                  S 0Er6\(       a(  \	\Rn                  \Rp                  4   r9\r:\	\9\:4   r;\<r=\<r>S&S! jr?        S'S" jr@ " S# S$5      rAg)(    )annotationsN)TYPE_CHECKINGAnyNoReturnSequenceUnion)
onnx_types)analysis	ast_utilsautocast	irbuilderparam_manipulation
sourceinfovalues)type_annotation)_schemas
onnxscriptc                    U  S3$ )Nznot supported. )	constructs    ]/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxscript/_internal/converter.pynot_allowedr   '   s    [''    c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )TranslationError+   c                    > [         TU ]  " U6   g N)super__init__)selfargs	__class__s     r   r    TranslationError.__init__,   s    $r   r   )r"   objectreturnNone)__name__
__module____qualname____firstlineno__r    __static_attributes____classcell__)r#   s   @r   r   r   +   s       r   r   c                .    [         R                  U 5        g r   )loggerwarningmsgs    r   warnr3   0   s    
NN3r   c                    [        U 5      er   r   r1   s    r   failr6   4   s    
3
r   c                (    U (       a  [        U5      eg r   r5   condr2   s     r   fail_ifr:   8   s    s## r   c                *    U (       a  [        U5        g g r   )r3   r8   s     r   ignorer<   =   s    S	 r   AddAndOrDivEqualGreaterGreaterOrEqualLessLessOrEqualMatMulModMulNotNotEqualPowSubNegc                     [         R                  " UR                  5       5      nUR                  U l        UR                  U l        XR                  S'   g! [
         a     Nf = f)z)Sets the type information on an IR value.typeinfoN)ir
from_prototo_type_prototypeshapeAttributeErrormeta)valuerO   type_and_shapes      r   set_type_inforY   z   sZ    x'='='?@#((
$** &JJz  s   AA 
A$#A$c                    [         R                  " U S9nUR                  R                  SU5        Ub  [	        X15        U$ )Nnamer   )rP   ValuerV   
setdefaultrY   )varnamerO   source_inforW   s       r   
make_valuera      s9     HH'"E	JJ,4e&Lr   c                     \ rS rSrSr    S8       S9S jjrS:S jr\S;S j5       r\S<S j5       r	S=S jr
S>S	 jrS?S
 jrS@S jrSAS jrSBS jrSCS jrSDS jrSES jrSFS jrSGS jr SH       SIS jjrSJSKS jjr      SLS jr  SM       SNS jjrSOS jr SP         SQS jjrSRS jr        SSS jrSTS jrSUS jrSVS jrSWS jr  SP       SXS jjr!SYS  jr"SPSZS! jjr#S[S" jr$      S\S# jr%    S]S$ jr&S^S% jr'S_S& jr(S' r)S( r*S`S) jr+SaS* jr,SbS+ jr-SPScS, jjr.SdS- jr/SeS. jr0SfS/ jr1SgS0 jr2        ShS1 jr3SiS2 jr4    SjS3 jr5SjS4 jr6SkS5 jr7SjS6 jr8S7r9g)l	Converter   aD  Main class to translate python code into ONNX operators.

Args:
    ir_builder: convert AST node into ONNX structures, if None,
        class :class:`onnxscript.irbuilder.IRBuilder` is used

The class uses logger `onnxscript`. Logging can be enabled with the following code:

::

    import logging
    logging.basicConfig(level=logging.DEBUG)

Or if you need to enable only the logger used by this module:

::

    import logging
    logger = logging.getLogger('onnxscript')
    logger.setLevel(logging.DEBUG)
    console = logging.StreamHandler()
    logger.addHandler(console)
Nc                    X0l         Ub  UR                  5       U l        Xl        X@l        / U l        S U l        SU l        [        5       U l	        0 /U l
        S U l        [        5       U l        g )Nr   )sourcecopyglobalsthis_moduledefault_opset__outer_current_fn_nextvarset
_used_vars_locals	_analyzer	_castable)r!   opsetglobal_namesrf   default_opsets        r   r    Converter.__init__   se     #',,.DL + 3515$'E8:t6:#&5r   c                    XR                   ;   $ )zSReturns True if the variable with the given name represents a polymorphic constant.)rr   )r!   var_names     r   is_castableConverter.is_castable   s    >>))r   c                J    U R                   c  [        S5      eU R                   $ )NzAnalyzer not initialized.)rq   RuntimeErrorr!   s    r   analyzerConverter.analyzer   s"    >>!:;;~~r   c                J    U R                   c  [        S5      eU R                   $ )Nzedefault_opset must be specified in script for functions that do not contain any use of an ONNX opset.)rj   r|   r}   s    r   ru   Converter.default_opset   s/    &@  """r   c                &   UR                   S:w  a  g U R                  bm  UR                   U R                  R                   :w  d$  UR                  U R                  R                  :w  a$  U R                  USU SU R                   S35        g g Xl        g )N zTwo distincts opset were used (z != z).)domainrj   versionr6   )r!   rs   nodes      r   _set_default_opsetConverter._set_default_opset   s    <<2* 3 3 : ::==D$7$7$?$??		;E7$tGZGZF[[]^ @ #(r   c                0   [        U[        R                  5      (       a  [        UR                  [        R                  5      (       a  UR                  R
                  n[        U[        R                  5      (       ad  UR                  U R                  ;   aJ  U R                  UR                     n[        U[        R                  5      (       a  UR                  S:X  a  U$ [        R                  " U5       H  nU R                  U5      nUc  M  Us  $    g)z9Find the (first) ONNX opset used in the function, if any.r   N)
isinstanceastCallfunc	AttributerW   Nameidrh   r   Opsetr   iter_child_nodes_find_onnx_opset)r!   r   
opset_exprrs   childress         r   r   Converter._find_onnx_opset   s     dCHH%%$))S]]33!YY__
j#((33!}}4 $Z]] ;%eV\\::u||r?Q#(L))$/E''.C
 0 r   c                \    / U l         SU l        SU l        [        5       U l        0 /U l        g)z;Initialize self for translating a new (top-level) function.Nr   )rk   rl   rm   rn   ro   rp   r}   s    r   _init_function_translation$Converter._init_function_translation   s*    8<%8:tr   c                h    [         R                  " XR                  U R                  R                  S9$ )N)codefunction_name)r   
SourceInforf   rl   r\   r!   r   s     r   
_source_ofConverter._source_of   s*    $${{$2B2B2G2G
 	
r   c                B    U R                  U5      R                  U5      $ )zMConstructs an error _message containing source information about an ast node.)r   r2   r!   r   	error_msgs      r   _messageConverter._message   s    t$((33r   c                8    [        U R                  X5      5        g r   )r3   r   r   s      r   r3   Converter.warn      T]]4+,r   c                8    [        U R                  X5      5        g r   )r6   r   r   s      r   r6   Converter.fail  r   r   c                    U R                   R                  U R                  5        [        R                  " U5      U l        U R
                  R                  0 5        [        R                  S[        U R
                  5      [        U5      5        g)zvEnter a control-flow block (a loop body or if-then-else branch).
The block is translated into a nested-scope in ONNX.
z!Converter:_enter_scope:%d:node:%sN)
rk   appendrl   r   
IRFunctionrp   r/   debuglenrS   )r!   r\   parent_nodes      r   _enter_scopeConverter._enter_scope  sa     	4++,$//5B8#dll:KTR]M^_r   c                    [         R                  S[        U R                  5      5        U R                  nU R
                  R                  5       U l        U R                  R                  5         U$ )zDExit from a control-flow block (a loop body or if-then-else branch).zConverter:_exit_scope:%d)r/   r   r   rp   rl   rk   pop)r!   graphs     r   _exit_scopeConverter._exit_scope  sM    /T\\1BC  ;;??,r   c                     U R                   S   $ )N)rp   r}   s    r   _current_scopeConverter._current_scope!  s    ||Br   c                R    [         R                  SU5        X R                  S   U'   g )NzConverter:_bind:%sr   )r/   r   rp   )r!   r\   vals      r   _bindConverter._bind$  s"    )40!$Rr   c                    [        U R                  5       H  nX;   d  M
  XA   s  $    XR                  ;   a  U R                  U   $ U(       a  [        UR	                  SU S35      5      eg)zMaps a python variable name to the corresponding value used during translation.

Typically, a python variable X will correspond to an ONNX value Y. But other special
cases include: constant values or functions (mapped to Graph attributes), etc.
zUnbound name: .N)reversedrp   rh   
ValueErrorr2   )r!   r\   inforaise_exceptionscopes        r   _lookupConverter._lookup(  sb     dll+E}{" , <<<<%%TXXtfA&>?@@r   c                    UnX R                   ;   a6  U SU R                   3nU R                  S-   U l        X R                   ;   a  M6  U R                   R                  U5        U$ )N_   )ro   rm   add)r!   	candidaters      r   generate_unique_nameConverter.generate_unique_name:  sZ    ??"+Qt}}o.A MMA-DM ??" 	Ar   c                   UR                   R                  nS nU[        R                  R                  L a  SnOU[        R                  R
                  L a  SnOjU[        R                  R                  L a  SnOJU[        R                  R                  L a  SnO*SU< S3n[        U(       a  UR                  U5      OU5        [        R                  " XCS UR                   R                  S9$ )Nvalue_float	value_intvalue_string
value_intszUnsupported attribute type r   rW   ref_attr_name)rW   rS   rP   AttributeTypeFLOATINTSTRINGINTSr6   r2   Attrr\   )r!   r   r   attrtypeattrnamer2   s         r   _to_onnx_attr_refConverter._to_onnx_attr_refC  s     99>>r''---$H))---"H))000%H))...#H/|1=C$#C0wwxSYY^^TTr   c                d   [        U[        R                  5      (       Ga"  U R                  U=(       d    S5      nU R	                  X5      nU R                  U/[        R                  " U R                  S5      / U/5      nUR                  (       a  U R                  US-   5      n[        R                  " S[        R                  R                  5      nU R                  R                  U5        U R!                  U/[        R                  " U R                  S5      U/U/5      $ U R                  R                  U5        U$ [        U[        R"                  5      (       a5  [        UR$                  [        R&                  5      (       a  UR$                  $ U R)                  X=(       d    SU5      $ )NtmpConstant_as_booltoCast)r   r   AttrRefr   r   emitOpru   as_boolrP   	AttrInt64r	   BOOLdtyperr   r   emit1SymbolValuerW   r]   _emit_const)	r!   r   targetr   result_nameattrresultresult_as_bool	cast_attrs	            r   _to_onnx_varConverter._to_onnx_varU  sJ    c6>>**33FOeDK))#4DYYvyy););ZH"tfF {{ "&!:!:;;S!TLLz/D/DE	"">2zz#$IId00&9HK	  NN{+Mc6--..#))RXX..yy  _ud;;r   c                @    U R                  U R                  X5      XS9$ )N)r   r   )r   r   )r!   py_varr   s      r   _py_var_to_onnx_varConverter._py_var_to_onnx_vary  s!      f!;F VVr   c           	        [        U[        R                  5      (       d!  [        R                  " U R                  U5      nUc  / nU Vs/ s H  n[        R
                  " US9PM     nn[        R                  " UR                  R                  UR                  R                  UR                  UUUS9n[        U[        R                  5      (       d  [        S[        U5       S35      eUR                  R                  SU5        U R                  c   eU R                  R!                  U5        [#        U5      S:  a  U$ US   $ s  snf )Nr[   )r   r   op_typeinputsoutputs
attributeszUnexpected type z for callee.calleer   r   )r   r   r   ru   rP   r]   Noders   r   r   r\   	TypeErrorrS   rV   r^   rl   append_noder   )r!   r  r  r  attrsooutput_valuesr   s           r   r   Converter.emit|  s    &&)),,YYt116:F=E3:;7aq)7;ww<<&&LL((KK!
 &&)),,.tF|nLIJJ		Xv.+++$$T* #M 2Q 6}LM!<LL <s   
Ec                    U R                   " U0 UD6n[        U[        R                  5      (       d  [	        S[        U5      < S35      eU$ )Nz#Expected single ONNX IR Value, got r   )r   r   rP   r]   r  rS   )r!   r"   kwargsr   s       r   r   Converter.emit1  sD    IIt&v&!RXX&&A$q'ANOOr   c                   Uc  [        U[        5      (       a  US:  a  SU 3nOsS[        U5       3nOd[        U[        5      (       aM  [	        U5      S:X  a>  [        US   [        5      (       a&  US   S:  a
  SUS    S3nOS[        US   5       S3nOSnU R                  U5      n [        R                  " XS9n[        R                  " S
W5      nU R                  R                  U5        U R                  U/[        R                   " U R"                  S5      / U/5      $ ! [         a-  nU R                  UR                  SU< S	U 35         S nANS nAff = f)Nr   int64_int64_mr   _1dconstr[   z!Failed to convert constant value z to ONNX tensor: rW   r   )r   intabslistr   r   rP   tensor	Exceptionr6   ast_node
AttrTensorrr   r   r   r   r   ru   )r!   pyvaluesuggested_namer   ovarr  excr   s           r   r   Converter._emit_const  sL    !'3''a<'-gY%7N'.s7|n%=N7D))c'la.?JwWXz[^D_D_1:?'-gaj\%=N'.s71:.?s%CN!(((8	YYw2F }}Wf-4 zz4&&))D,>,>
"KRRVQWXX  	II3G;>OPSuU 	s   *D% %
E/#EEc                N    U R                  U5      nU R                  U/SU/5      $ )z9Emits a copy statement, using the ONNX Identity operator.Identity)r   r   )r!   original_varr  new_vars       r   
_emit_copyConverter._emit_copy  s)    ++N;yy'J??r   c                  ^  [        U[        R                  5      (       a  T R                  UR                  5      $ [        U[        R
                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  45      (       a)  [        U 4S j[        R                  " U5       5       5      $ g)Nc              3  F   >#    U  H  nTR                  U5      v   M     g 7fr   )_is_constant_expr).0cr!   s     r   	<genexpr>.Converter._is_constant_expr.<locals>.<genexpr>  s!     U:TQt--a00:Ts   !F)r   r   UnaryOpr(  operandr   BinOpComparer   ListLoadr   allr   r   s   ` r   r(  Converter._is_constant_expr  s    dCKK(())$,,77			
 
 U#:N:Nt:TUUUr   c                   0 n[        [        R                  " U5      SSS9n [        X0R                  U5      $ ! [
         aF  n[        U R                  US[        U R                  5      < S[        U5      < S35      5      UeSnAff = f)a  Evaluates a sub-expression that is assumed to represent a constant value.
The expression can refer only to global names (inherited from the scope
where the script is evaluated) and cannot refer to local names defined
within the script.) Further, these expressions are assumed to be constants.
Thus, any subsequent mutation of any state/variables (used in computing
this constant value) will potentially lead to unexpected behavior (such
as divergence between eager-mode execution and evaluation of the ONNX
function.)
z<ast>eval)filenamemodez Missing names, globals contains z	, locals r   N)compiler   
Expressionr6  rh   	NameErrorr   r  )r!   exprlocalscples        r   _eval_constant_exprConverter._eval_constant_expr  s     "$cnnT*W6J		\\622 	6tDLL7I6L M"6l-Q0 	s   9 
B	ABB	c                    U R                  U5      n[        R                  " U5      (       d  U R                  US5        S nU$ )NzUnsupported type annotation.)r@  tais_valid_typer3   )r!   
annotationrO   s      r   _get_type_annotationConverter._get_type_annotation  sA    ++J7))II. Hr   c           	     B   [        U[        R                  5      (       Ga  U R                  UR                  U R                  U5      5      n[        U[        R                  5      (       Ga  UR                  n[        U[        R                  5      (       ax  Un[        R                  " XR                  SUR                  S9nUbG  UR                  UR                  :w  a-  U R                  USUR                   SUR                   S35        U$ [        U[        R                  5      (       a  UnUR                    He  u  pU R                  XR                  U5      5      n
U
R                  U	R                  :w  d  MA  U R                  USU SUR                  < S35        Mg     UR"                  n[        U[        R$                  5      (       a!  U R                  US	UR                   S
35        OOOU R'                  U5      nUc/  U(       a'  UR(                  (       a  U R                  USU S35        gU(       a  UR                  OSnU[        R*                  R,                  :X  a  [        R.                  " U5      n[        R0                  R3                  XU5      nU$ )a  Translate an attribute-value specification of the form `attr_name=<expr>`
in a call to an op. expr is an AST. The following cases are supported:
* Expr evaluates to a script-time constant (a python-value) that can be mapped
into an ONNX attribute value, or
* Expr evaluates to None, in which case None is returned, or
* Expr must be an attribute-reference, that is a name representing an
attribute-parameter of a containing function.
Nr   zAttribute type 'z ' does not match expected type ''zOuter scope variable 'z' referenced by function 'z' modified.zCannot use ir.Value 'z' as an attribute.zAttribute 'z' is required.)r   r   r   r   r   r   r   r   rW   rP   r   rS   r\   r6   r   r   outer_scope_variablesr   r]   r@  requiredr   TENSORr  convenienceconvert_attribute)r!   	attr_namer<  	attr_metar   r   attr_ref
irfunctionpyvarpreviouscurrent	attr_types               r   _translate_attrConverter._translate_attr  s    dCHH%%,,tww(=>C#v1122iic277++D!ww!99D		 H !,$))y~~2M		 .x}}o=]^g^l^l]mmno $Oc9#7#788!$J ,6+K+K"&,,uood6K"L"==HNN: II $"8 @$$(GG;k!; ,L %**Cc288,,IId&;DGG9DV$WX  **40C ;Y//		$+i[ GH&/INNT	((///))C.C~~//		Jr   c                    [        UR                  [        R                  5      (       d  U R	                  US5        UR                  R                  U R
                  l        g )Nz(Docstring expression must be a constant.)r   rW   r   r   r6   rl   
doc_stringr   s     r   _translate_docstringConverter._translate_docstringC  s>    $**cll33IIdFG&*jj&6&6#r   c           	     D   [        U[        R                  5      (       a  U R                  U5      nGO[        U[        R                  [        R
                  [        R                  45      (       a  U R                  U5      nGO5[        U[        R                  5      (       a  U R                  U5      nGO[        U[        R                  5      (       a  U R                  U5      nO[        U[        R                  5      (       a  U R                  U5      nO[        U[        R                  5      (       a  U R                  X5      nOpU R!                  U5      (       a1  U R#                  U R%                  U5      X R'                  U5      5      nO)[)        U R+                  US[-        U5      < S35      5      e[        U[.        R0                  5      (       a  U$ Uu  pEnUc  SOUn[        U[2        5      (       d   eU R5                  U5      nU R7                  U/XEU5      $ )zExpression-translation generates "IR statements/nodes" that compute the value of
the expression into a target-variable, and returns the variable that is
assigned this value.
zUnsupported expression type r   r   )r   r   r   _translate_call_exprr/  BitAndBitOr_translate_binary_op_exprr-  _translate_unary_op_exprr0  _translate_compare_exprr   _translate_name_expr	Subscript_translate_subscript_exprr(  r   r@  r   r   r   rS   rP   r]   strr   r   )r!   r   r   r   r  r"   r  r   s           r   _translate_exprConverter._translate_exprH  s   
 dCHH%%))$/Asyy#**cii@AA..t4Ackk**--d3Ackk**,,T2Achh''))$/Acmm,,..t<A##D))  !9!9$!?Y]I^_Ad&B4:.PQ$RS  a""He .f&#&&&&**62zz6(F%88r   c                ~    [        U[        R                  5      (       a  UR                  c  gU R	                  U5      $ )zTranslation of an expression where "None" is permitted (eg., for an optional argument).
None is represented as a Constant in Python 3.9+.
N)r   r   r   rW   rh  r   s     r   _translate_opt_exprConverter._translate_opt_exprg  s2     dCLL))tzz/A##D))r   c           
     f
  ^ ^+^,^-^.^/^0^1 T R                  UR                  5      nUR                  nUc  U S3nT R                  U5      n[        R
                  " U5      nT R                  UR                  5      m-0 m+SSU+U-U 4S jjjm,S U,4S jjm0Sm.Sm/ S   S!U,U0U 4S jjjm1S"U.U/U14S jjn/ n/ n/ n	[        U5       H  u  p[        U[        R                  5      (       a=  UR                  c  UR                  c  UR                  b  UR                  X45        M_  Ma  T R!                  U5      (       a8  [        T R#                  U5      [$        5      (       a  UR                  X45        M  U	R                  X45        M     U(       d#  U(       d  U	(       d  T R'                  U/S	U/5      $ U(       d  [)        U5      S
:  Ga  / n/ n/ n/ n/ nU H  u  n
nT R#                  U5      nUR                  U
5        [+        [-        USUR.                  5      [-        USUR0                  5      S9n[        R                  " [        R2                  " U40 UD6[        R2                  " US
-   40 UD6[        R2                  " S#0 UD65      nUR                  U
U45        M     / nU Hc  u  n
nT," U
5      nU" U5      nUR                  US   5        UR                  US
   5        UR                  U5        UR                  US   5        Me     [)        U5      S
:  a  [4        R6                  " SS5      nT R                  U S35      nT R9                  U/SUU/5      nT R                  U S35      nT R9                  U/SUU/5      nT R                  U S35      nT R9                  U/SUU/5      nT R                  U S35      nT R9                  U/SUU/5      nOUS   nUS   nUS   nUS   nU(       au  T R                  U S35      n T R9                  U /SUUUUU/5      n!T R;                  UST-5      nU	(       a  T R                  U S35      n"OUn"T R9                  U"/SU!U/5      n#O<U	(       a  T R                  U S35      n"OUn"UUUUU/n$T R'                  U"/SU$5      n#OUn#U	R=                  U5        U	(       a	  U	S   u  n%n&OSn%U	 He  u  n
n'T R                  U'5      n([4        R6                  " SU
5      n)U
U%:w  a  T R                  U SU
 35      n*OUn*T R'                  U*/SU#U(/U)/5      n#Mg     U#$ )$a~  List of supported syntaxes is below.
`A` is a tensor or an expression equivalent to a tensor.

::

    A[:, 1]
    A[:2, 0]
    A[:2, :1]
    A[2:0:-1]
    A[1:]
    A[:2]
    A[1:-1]
    A[1:2]
    A[-1]
    A[0]
    A[:0:-1]

*i* is a tensor holding one integer.

::

    A[i]
    A[i+1:i+2]

Fully supported for python 3.9+.

::

    A[i:i+j, k]

Not supported:

::

    A[::-1]
N_subscriptedc                H   > U T;  a  TR                  U /UT5      TU '   TU    $ r   )r   )rW   r\   cached_int_constsr   r!   s     r   const_1d5Converter._translate_subscript_expr.<locals>.const_1d  s3    --+/+;+;UGT4+P!%($U++r   c                    > T " S5      $ )Nr   r   )rq  s   r   one_1d3Converter._translate_subscript_expr.<locals>.one_1d  s    A;r   l    l         c                  > U c  Uc  [        S5      eT" U5      U4$ TR                  U 5      (       aG  TR                  U 5      n[        U[        5      (       a
  T" U5      U4$ [        S[        U5       35      eTR                  U 5      nTR                  UR                   S35      nTR                  U/[        R                  " TR                  S5      UT" 5       // 5      nUS4$ )zCTranslate optional start/stop/step component of a Slice expression.Nz@Default start/stop not supported when step direction is unknown.z&Slice component type must be int, not 	_reshapedReshape)r|   r(  r@  r   r  rS   rh  r   r\   r   r   r   ru   )	node_argdefault_valuecstrW   reshapedreshaped_valuerq  rt  r!   s	         r   translate_slice_componentFConverter._translate_subscript_expr.<locals>.translate_slice_component  s      (&Z   .==%%h//..x8c3''#C=#--&)OPTUXPY{'[\\,,X644

|95MN!%JIId00)<FH%	" &t++r   c                H  > T" U R                   S5      u  pUc+  T" U R                  S5      u  p4T" U R                  S5      u  pTO[US:  a+  T" U R                  S5      u  p4T" U R                  T5      u  pTO*T" U R                  T5      u  p4T" U R                  T5      u  pTX5U4$ )z4Translate slice-expression of the form from:to:step.r   Nr   )steplowerupper)	
slice_expr	step_namer  
lower_namer   
upper_namemaxintminintr~  s	         r   translate_slice<Converter._translate_subscript_expr.<locals>.translate_slice  s    7
KOI| !:*:J:JD Q
 9*:J:JD Q
A 9*:J:JA N
 9*:J:JF S
A 9*:J:JF S
 9*:J:JF S
I66r   r!  r   lineno
col_offsetr  r  r      axis_startConcat_end_axis_step_slicedSlicesqueezed_axes	_squeezedSqueezer   _axis_Gatherr   )r\   
str | Noner&   ir.Valuer&   r  )rz  z
int | Noner&   ztuple[ir.Value, int | None])r  z	ast.Slicer&   z#tuple[ir.Value, ir.Value, ir.Value])r   )rh  rW   r\   r   r   normalize_subscript_exprr   slice	enumerater   r   r  r  r  r  r   r(  r@  r  r   r   dictgetattrr  r  r   rP   r   r   r   extend)2r!   r   r   varrx   indicesr  sliced_indicesscalar_indicesnon_scalar_indicesr  eltstartsendsaxesstepsr  r<  indexr  elementaxis_varr  axis_0_attr
start_namestart_valueend_name	end_value	axes_name
axes_value
steps_namesteps_valuesliced_namesliced_valuer   r   slice_inputs	last_axisr   
index_exprindex_value	axis_attrgatheredrp  rq  r   r  r  rt  r~  s2   `                                          @@@@@@@r   rf  #Converter._translate_subscript_expro  s=   N ""4::.88> z.F**6244T:tzz* 24	, 	,	  37	,%/	,(	, 	,:	7 	76 68579;"7+ID#syy))		)cii.?CHHDT"))4+6 EU'',,((-s2 2 %%tk2"))4+6 , .4F::vh
XJ??S014 FDDEM,
d 006$$T*"44;;?&t\4??K ))LL1&1LL5f5LL-f-
 %%tWo6 -  N!/g#D>(1fQi(F1I&H%VAY' "0 6{Q ll615!66(67JK
"iihV44z5FG IIxj(D;-P	 55
%6HI	!YY	{Hd[MR
!66(57IJ
"iih}U$Qi G	!!W
#Ah"778*G8LM#yy M+y*kJ 
 !% 0 0QU V%"&";";xj	<R"SK"(KK=)lM=Z[%"&";";xj<P"QK"(K #[)ZU[M7LIF!!.1-b1LIq I 2D*..z:KVT2I y 44zv5NO!ZZ
Hv{6Ki[YF !3 r   c                <   U R                  UR                  5      nUR                  nU(       a  UR                   Vs0 s H  oDR                  UR
                  _M     nn[        R                  " X1R                  USS9u  pgU Vs/ s H  o@R                  U5      PM     nnUR                  5        VVs/ s H&  u  pHU R                  XHUR                  U5      5      PM(     nnnOiUR                   Vs/ s H  o@R                  U5      PM     nnUR                   Vs/ s H(  o@R                  UR                  UR
                  5      PM*     nn[        R                  " XU5      nU V	s/ s H	  oc  M  U	PM     nn	X&U4$ s  snf s  snf s  snnf s  snf s  snf s  sn	f )zTranslates a call-expression.F)fill_defaults)_translate_callee_exprr   op_signaturekeywordsargrW   r   (separate_input_attributes_from_argumentsr"   rk  itemsrW  getr   static_cast_inputs)
r!   r   r  r  xr  r"   r  yr   s
             r   r^  Converter._translate_call_exprW  sX    ,,TYY7** .2mm<meeQWWnmF<,UUiiuKD :>>A,,Q/D>QVQ\Q\Q^_Q^T))!0@0@0CDQ^E_E9=CA,,Q/DCCG==Q=a))!%%9=EQ**4tD
 #(<%$%<U"" = ?_CQ =s)    E?F4-F	3F/F)F3Fc                J    UR                   n[        R                  " XX#45      $ r   )r  r   r  )r!   opleftrightr  s        r   _cast_like_binary_expression&Converter._cast_like_binary_expressionq  s     **4}MMr   c                   [        UR                  5      nU[        ;  a   [        U R	                  USU< S35      5      e/ n[        UR                  [        R                  5      (       ah  U R                  UR                  5      (       aH  U R                  UR                  5      n[        U[        5      (       a  [        R                  " SS5      /n[        R                  " U R                   [        U   5      nU R#                  X R%                  UR&                  5      U R%                  UR                  5      5      u  pVX%U/U4$ )NUnsupported operator r   fmodr   )rS   r  
primop_mapr   r   r   r   rG   r(  r  r@  floatrP   r   r   r   ru   r  rh  r  )r!   r   r  r  r{  r  r  s          r   ra  #Converter._translate_binary_op_expru  s    $'']ZT]]43Ha1PQRRdggsww''D,B,B4::,N,N **4::6C#u%%fa01YYt)):b>:77$$TYY/1E1Edjj1Q
 %=%''r   c                   [        UR                  5      nU[        ;  a.  [        U R	                  X5      R                  SU< S35      5      eU R                  UR                  5      (       a  UR                  R                  nU[        R                  :X  a<  [        R                  " U* UR                  UR                  S9nU R                  U5      $ U[        R                  :X  a  U R                  UR                  5      $ [        U   nU R                  UR                  5      n[         R"                  " U R$                  U5      U// 4$ )Nr  r   r  )rS   r  r  r   r   r2   r(  r.  rW   r   USubr   r  r  rh  UAddr   r   ru   )r!   r   r  r   r{  opnamer.  s          r   rb  "Converter._translate_unary_op_expr  s    $'']ZT]]46::=RSURXXY;Z[\\!!$,,// ,,$$CSXX~llC4X++C00SXX~++DLL99B&&t||4yy++V4wiCCr   c                   [        UR                  5      S:X  d   e[        UR                  5      S:X  d   e[        UR                  S   5      nU[        ;  a   [        U R                  USU< S35      5      e[        U   nU R                  UR                  5      nU R                  UR                  S   5      n[        R                  " U R                  US:w  a  UOS5      nU R                  X$U5      u  pEUS:X  aK  U R                  5       nU R                  U/X$U/5      n[        R                  " U R                  S5      nX// 4$ X$U// 4$ )Nr   r   r  r   rJ   rA   rI   )r   opscomparatorsrS   r  r   r   rh  r  r   r   ru   r  r   r   )	r!   r   r  r  r  r  r   	tmp_valuenot_ops	            r   rc  !Converter._translate_compare_expr  s6   488}!!!4##$)))$((1+ZT]]43Ha1PQRRB##DII.$$T%5%5a%89 YYt))Vz5I6wW77%HZ++-C

C5"Um<IYYt1159F;**%="$$r   c                X    U R                  UR                  U R                  U5      5      $ r   )r   r   r   r   s     r   rd  Converter._translate_name_expr  s"    ''1FGGr   c           	        [        U[        R                  5      (       ax  U R                  UR                  U R                  U5      SS9n[        U[        R                  5      (       a  U$ U R                  USUR                   S[        U5       S35        g[        U[        R                  5      (       a  U R                  US5        gU R                  US5        g)	zReturn an OpsetFr   rI  z'' is not an instance of type Opset but r   zNested module unimplemented.zInvalid opset expression.N)r   r   r   r   r   r   r   r   r6   rS   r   )r!   r   r   s      r   _translate_opset_exprConverter._translate_opset_expr  s    dCHH%%,,tww(=u,UC#v||,,
IIday(OPTUXPY{Z[\]cmm,,IId:;IId78r   c                   [        U[        R                  5      (       a}  U R                  UR                  5      nU R                  X!5        UR                  nX2;   a   [        R                  " X!R                  5      $ [        R                  " X!R                  5      $ [        U[        R                  5      (       a  UR                  nU R                  X@R                  U5      SS9n[        U[        R                  [        R                  45      (       a  U$ U(       d@  X@R                  ;  a  [!        SU< S35        [        R                  " U R                  U5      $ U R#                  US5        g)zReturn an OpFr  zUnknown function name z. The ONNX graph may not work.zInvalid calleeN)r   r   r   r  rW   r   r   r   r   r   r   r   r   r   OnnxFunctionru   r3   r6   )r!   r   moduler  r   founds         r   r   Converter._translate_callee_expr  s   dCMM**//

;F##F1YYFyy3399VYY//dCHH%% GGMLL0EW\L]E%&))Z-D-D!EFF (:(::00A B7 8 yy!3!3]CC		$()r   c           	        [        U[        R                  5      (       a  U R                  U5      $ [        U[        R                  5      (       a  U R                  U5      $ [        U[        R
                  5      (       a/  Ub  U R                  U5      $ [        U R                  US5      5      e[        U[        R                  5      (       a  U R                  U5      $ [        U[        R                  [        R                  45      (       a  U R                  U5      $ [        R                  " U5      (       a  US:X  a  U R!                  U5      $ g[        U[        R"                  5      (       a  U R%                  U5      $ [        R&                  " U5      (       a  g[        U R                  US[)        U5      < S35      5      e)z]Statement translation: A single Python statement is mapped into a
sequence of IR statements.
NzCReturn statements are not permitted inside control-flow statements.r   zUnsupported statement type ''.)r   r   Assign_translate_assign_stmt	AnnAssignReturn_translate_return_stmtr   r   If_translate_if_stmtForWhile_translate_loop_stmtr   is_doc_stringr[  FunctionDef_translate_nested_function_defis_print_callrS   )r!   r   index_of_stmts      r   _translate_stmtConverter._translate_stmt  sg    dCJJ''..t44dCMM**..t44dCJJ''(22488_ 
 dCFF##**400dSWWcii011,,T22""4((!0066dCOO,,66t<<""4((t/KDQUJ>Y[-\]^^r   c                  ^ ^ SU U4S jjn[        T[        R                  5      (       a  TR                  nOTR                  /n[        U5      S:w  a  T R                  TS5        US   nTR                  n[        U[        R                  5      (       a  [        U[        R                  5      (       d   T R                  US[        U5      < S35        [        UR                  5      [        UR                  5      :w  a  T R                  TS5        [        UR                  UR                  5       H  u  pgU" Xg5        M     g U" XE5        g )	Nc           
     0  > [        U [        R                  5      (       a  TR                  U 5      nU R                  n TR                  X5      n[        T[        R                  5      (       a  TR                  TR                  5      nOS nUb  [        X45        [        R                  " X25      nTR                  X5        g [        U [        R                  5      (       Ga  [        U[        R                  5      (       d   TR                  US[!        U5      < S35        TR#                  U5      u  pgnSU4S jjn	U R$                   V
s/ s H
  o" U
5      PM     nn
TR'                  XXx5      n[        U[(        R*                  5      (       a  U/n[-        U R$                  U5       HE  u  pTR                  U
R                  [        R                  " UTR                  U
5      5      5        MG     g TR                  U S[!        U 5      < S35        g s  sn
f )Nz5RHS must be a Call expression for unpacking, found: 'rI  c                   > [        U [        R                  5      (       d   TR                  U S[	        U 5      < S35        TR                  U R                  5      $ )Nz*LHS must be a Name for unpacking, found: 'rI  )r   r   r   r6   rS   r   r   r  r!   s    r   generate_onnx_nameLConverter._translate_assign_stmt.<locals>.assign.<locals>.generate_onnx_name  sJ    %a22		!'QRVWXRYQ\\]%^_44QTT::r   z-Unsupported construct in LHS of assignment: ')r  ast.AST)r   r   r   r   r   rh  r  rF  rE  rY   r   r   r   Tupler   r6   rS   r^  eltsr   rP   r]   zip)lhsrhsr   trO   r  r  r  r  r  r  output_namesr  outputr!   stmts                 r   assign0Converter._translate_assign_stmt.<locals>.assign  s   #sxx((s+ff((2dCMM22#88IH#H'!!.((1

3$C++!#sxx00IIOPTUXPY}\]^ )-(A(A#(F%;
 @CxxHx! 21 5xH))L&Hgrxx00&iG!$SXXw!7IAJJ**64??13EF "8 		#!NtTWym[\]^  Is   Hr   zMulti-assignment not supported.r   zLeft term must be a tuple not 'r  z?Expected same number of elements on lhs and rhs of assignments.)r  r  r  r  r&   r'   )r   r   r  targetsr   r   r6   rW   r  rS   r  r  )r!   r  r  r  r  r  pr   s   ``      r   r   Converter._translate_assign_stmt  s    &	_ &	_P dCJJ''llG{{mGw<1IId=>ajjjc399%%c399-- 		#!@cRPQ388}CHH-		[ CHHchh/q 0 3r   c                d  ^ ^ U U4S jnU 4S jnTR                   nUc   S5       e[        U[        R                  5      (       aU  U" [	        UR
                  5      5        [        UR
                  5       VVs/ s H  u  pVU" Xe[        U5      5      PM     snn$ U" S5        U" USS5      $ s  snnf )Nc           
        > TR                   bH  U [        TR                   5      :w  a.  [        TR                  TSTR                   < SU < S35      5      eg g )NzzMismatch in number of return values and types. Keyword 'return' cannot be used in a subgraph (test, loop).  returntype is z, num_outputs=r   )
returntyper   SyntaxErrorr   )nr!   r  s    r   check_num_outputs;Converter._translate_return_stmt.<locals>.check_num_outputs<  sb    *DOO,,% --1__,?~aURSU  - +r   c                  > SU 3nTR                  X5      nTR                  UR                  TR                  U 5      SS9n[	        U[
        R                  5      (       aY  [	        UR                  [        R                  5      (       a0  UR                  R                  5       (       a  TR                  XC5      nTR                  R                   H3  nUR                  UR                  :X  d  M  TR                  XD S35      n  O   TR                  b  [        UTR                  U   5        TR                  R                  R!                  U5        U$ )N
return_valFr  _copy)rh  r   r\   r   r   r   r   rW   rP   r]   is_graph_inputr$  rl   r  r  rY   r   )expisuffixpreferred_name
return_varr   prev_outputr!   s          r   ret-Converter._translate_return_stmt.<locals>.retH  s
   )&2N--cBJ,,z0DV[,\C#v1122z#))RXX7V7V99++-- "&!LJ#//77##z6!%|5=Q!RJ	  8
 *j$//!*<=$$++J7r   z4Return statement without return-value not supported.r   r   r   )rW   r   r   r  r   r  r  rg  )r!   r  r!  r-  r   r(  r'  s   ``     r   r   Converter._translate_return_stmt;  s    
		& jjV VVc399%%c#((m,6?6IJ6IFACA'6IJJ!32 Ks   8B,c           
       ^  T R                   R                  U5      nUSL a%  UR                   H  nT R                  U5        M     g USL a%  UR                   H  nT R                  U5        M     g T R                   R                  U5      nT R                   R                  U5      nUb  UR                  U5      n[        U5      nT R                  UR                  S5      nT R                  U5      R                  nT R                  UR                  SU 3U5      n	[        R                  " SU	5      n
T R                  UR                  SU 3U5      n[        R                  " SU5      nU 4S jnU Vs/ s H
  o" U5      PM     nnU(       d  T R!                  US	5        XR"                  /:X  a  T R!                  US
U< S35        T R%                  U[&        R(                  " T R*                  S5      U/X/5      n[-        U[        R.                  5      (       a  U/n[1        UU5       H<  u  nnT R3                  U[&        R4                  " UT R                  U5      5      5        M>     g s  snf )NTFr9   
thenGraph_then_branch
elseGraph_else_branchc                &   > TR                  U 5      $ r   r   r
  s    r   rename,Converter._translate_if_stmt.<locals>.rename}  s    ,,Q//r   z6A subgraph for a test do not have any output variable.z$Input and output cannot be the same r   r  )r~   constant_if_conditionbodyr  orelseassigned_varslive_outintersectionr  rh  testr   r  _translate_blockrP   	AttrGraphr6   r\   r   r   r   ru   r   r]   r  r   r   )r!   r  constant_condslive_def_setr=  	live_defsr?  r  	thenGraphthenAttr	elseGraphelseAttrr7  r  renamed
if_outputsr  s   `                 r   r  Converter._translate_if_stmtc  s   ;;DAD YY$$Q' E![[$$Q' !}}2248==))$/ $00>L&	##DIIv6&--))$))z&5JIV	<<y9))$++F87LiX	<<y9	0 '00i6!9i0IIdTUyyk!IIdB7+QOPYYIId(($/F 	

 j"((++$J	:.DAqJJ""1dood&;< / 1s   5I,c           
       ^  [        U[        R                  5      (       Ga  [        UR                  [        R                  5      (       d  T R                  US5        UR                  R                  nUR                  n[        U[        R                  5      (       d   S5       e[        UR                  [        R                  5      (       d!  T R                  USUR                  < S35        UR                  R                  S:w  a  T R                  US5        UR                  (       a  [        UR                  5      S:w  a  T R                  US5        UR                  (       a   S	5       eT R                  UR                  S
   S5      n[        T R                  S5      [         R"                  T R%                  U5      5      nUnS nS nO[        U[        R&                  5      (       a  UR(                  n	[        U	[        R                  5      (       d  T R                  US5        SnS n[        T R                  U	R                  5      [         R"                  T R%                  U5      5      nU	R                  nS nT R+                  U	5      nO T R                  US[-        U5      < S35        T R.                  R1                  UR2                  5      n
T R.                  R5                  UR2                  5      nT R.                  R7                  U5      nUc   S5       eUR9                  X-  5      n[;        5       n[=        X-  5      nT R?                  SU5        T R                  W5      n[        U[         R@                  T R%                  U5      5      nT RB                  RE                  U5        T RG                  U[H        RJ                  " UT R%                  U5      5      5        T RB                  RE                  W5        U H  nT R                  U5      n[        US T R%                  U5      5      nT RB                  RE                  U5        T RG                  U[H        RJ                  " UT R%                  U5      5      5        M     S nSn[M        UR2                  5       GH  u  nn[        U[        RN                  5      (       GaR  [        UR2                  5      S:X  Ga8  [        UR2                  S
   [        RP                  5      (       Ga  [        UR(                  [        R                  5      (       d*  T R                  US[-        UR(                  5      < S35        U[        UR2                  5      S-
  :w  a  T R                  US5        T RS                  5       nUR(                  R                  U;  a8  T R                  USUR(                  R                  < S[=        U5      < S35        UUR(                  R                     RT                  nSnGMy  T RW                  U5        GM     WbH  T RS                  5       nUU;  a#  T R                  USU S[=        U5      < S35        UU   RT                  nT RY                  T R                  S5      /[H        RZ                  " T R\                  U5      U=(       d    W// 5      nT RB                  R^                  Ra                  U5        U H  nT Rc                  UT R%                  U5      5      nURd                  T RB                  Rf                  ;  a  T Ri                  UU5      nT RB                  R^                  Ra                  U5        M     T Rk                  5       nWW/U Vs/ s H$  nT Rc                  UT R%                  U5      5      PM&     sn-   n[l        Rn                  " SURp                  5      /nT R%                  U5      nU 4S jn U V!s/ s H  n!U " U!5      PM     n"n!T Rs                  U"SUU5      n#[        U#[l        Rt                  5      (       a  U#/n#[w        UU#5       H-  u  n!n$T RG                  U![H        RJ                  " U$U5      5        M/     g s  snf s  sn!f )Nz*For loop target must be a single variable.zLoop bound not a call.zUnsupported loop bound r   rangez9Unsupported loop bound, only function 'range' is allowed.r   z0Unsupported loop bound, it should be 'range(?)'.zUnsupported loop bound.r   
loop_boundcond_inzgUnexpected condition type {type(loop_stmt)!r} for a while loop, it should be 'while <condition_name>:'.infinite_loopzUnexpected loop type zlive_out cannot be None here.	loop_bodyr!  zqInstruction break can be introduced with test but it must be if <condition>: break. However condition is of type z3Instruction break must be the last one of the loop.z"Unable to find condition variable z in known variables rI   cond_outr:  c                *   > TR                  U 5      nU$ r   r6  )r  r   r!   s     r   r7  .Converter._translate_loop_stmt.<locals>.rename/  s    ))!,AHr   Loop)<r   r   r  r   r   r6   r   iterr   r   r"   r   r  rh  ra   r   r	   r   r   r  r?  rd  rS   r~   exposed_usesr:  r<  r=  r>  rn   r  r   INT64rl   append_parameterr   r   r   r  r  Breakr   rW   r  r   r   ru   r  r   r   r\   assigned_namesr$  r   rP   rA  r   r   r]   r  )%r!   	loop_stmtpython_loop_var_namerW  o_loop_boundonnx_cond_var
i_cond_var
cond_whileo_loop_conditionr?  rX  vars_def_in_loopr=  loop_state_varsscan_outputsr  onnx_loop_var_nameonnx_loop_varpvonnx_var_name	parametercondition_nameoperator_namer(  rC  current_scoperS  onnx_varr:  r  r  r   r7  r  onnx_output_namesloop_outputsloop_outputs%   `                                    r   r  Converter._translate_loop_stmt  s   i))i..99		)%QR#,#3#3#6#6 >>DdCHH--G/GG-dii22		)'>tyym1%MNyy||w&		Z 99DII! 3		)%WX}}?&??$//		!lKL&)))4	*M
 'JJ#	399-->>DdCHH--		>
 $3 L#))$''2	*J
 J M#88> IIi#8i8K1!MN}}11)..A==66y~~F==)))4#D%DD#*778OPu56 	+y1!667KL"OOI&

 	))-8

 }dooi.HI	

 	))*5!B 55b9M"=$	8RSI--i8JJ""OOI.	 " +/"inn-DAq !SVV$$QVV)9jPQTWT]T]>^>^!!&&#((33IIO<*!- INN+a//IIa!VW $ 3 3 56699M1II!<QVVYYM J%%)-%8$;1>
 "/qvvyy!9!?!? %  #3 .6 ! //1M.		8 E!!%m!4 7q:
 **5;;M::&&z23IId((-8,}-	
 	  ''1!B//DOOI4NOH}}D$4$4$C$CC  ??8R8$$++H5 " ! 01O^5
O^D$$R)CD5
 
 fdjj12y)	 1881VAY8yy	
 lBHH--(>L!'<8NA{JJq&,,[$?@ 9'5
 9s   +b 8bc           
        U R                  US5        U H  nU R                  U5        M     U GH8  nXPR                  5       ;   a  U R                  5       U   nU R                  Xe5      nUR                  U R
                  R                  ;  a  U R                  Xu5      nU R
                  R                  R                  U5        M  Sn[        U R                  5       H  nXX;   d  M
  X   n  O   Uc/  U R                  US   SU S[        U R                  5       S35        U R                  U R                  Xe5      U5      nU R
                  R                  R                  U5        GM;     U R                  5       n	U	R                  $ )z:Translation of a then/else statement-block to an ir.Graph.Nr   z	ir.Value zF is not assigned a value along a conditional branch, known variables: r   )r   r  r   r   r\   rl   r\  r$  r  r   r   rp   r6   r  r   r   )
r!   stmtsr\   rE  rC  
python_varpython_var_valuer  r   function_irs
             r   r@  Converter._translate_block?  sn    	$%A  # #J0022#'#6#6#8#D **+;H;;d&6&6&E&EE "__V@F  ((//7#' %dll3E!*+0+<( 4 $+IIa#J< 04484F3GqJ %%&6CZ
   ((//7= $> &&(   r   c           
        U R                  UR                  U5        U R                  U5        U R                  5       nU R                  R                  U5      nU Vs/ s H$  oDU R                  X@R                  U5      5      4PM&     snUl        U R                  UR                  [        R                  " X R                  U5      5      5        U R                  R                  U5        gs  snf )z'Translate a nested function definition.N)r   r\   _translate_function_def_commonr   r~   rJ  r   r   r   r   r   rl   add_nested_function)r!   fnrx  outer_scope_varsr  s        r   r  (Converter._translate_nested_function_defk  s    "''2&++B/&&(==>>rBEU-
EUc$,,sOOB$789EU-
) 	

277F..{OOB<OPQ,,[9-
s   +C+c                   UR                   nUR                  (       d3  UR                  (       d"  UR                  (       d  UR                  (       a  [        UR                   S35        [        UR                   5       GH  u  p4[        UR                   5      [        UR                  5      -
  nUR                  (       a&  X5:  a!  U R                  UR                  X5-
     5      nOSnUR                  (       a  U R                  UR                  5      nOSnU(       a  [        R                  " U5      (       a  [        R                   " U5      n["        R$                  " UR&                  XS5      n	U R(                  R+                  U	5        [        R,                  " U5      n
U R/                  UR&                  [0        R2                  " XU R5                  U5      5      5        GMg  [7        UR&                  XpR5                  U5      5      nU R(                  R+                  U5        U R8                  R;                  UR&                  5        U R/                  UR&                  [0        R<                  " XR5                  U5      5      5        GM     UR>                  (       a  U R                  UR>                  5      n[        R@                  " U5      U l!        SnU RB                   HB  n[        RD                  " U5      (       a  M   U R                  UR>                  SU S35        SnMD     U(       a  SU l!        U R(                  $ SU l!        U R(                  $ )z5Translate a function signature (top-level or nested).z,: Unsupported feature in function signature.NFz-Unsupported type annotation for return value r   T)#r"   vararg
kwonlyargskw_defaultskwargr3   r\   r  r   defaultsr@  rE  rF  rC  is_attr_typer   get_attr_typerP   r   r  rl   rZ  base_type_is_boolr   r   r   r   ra   ro   r   r   returnsget_return_typesr  rD  )r!   r}  r"   r(  r  arg_with_default_start_indexrz  rO   attribute_typer   r   onnx_parameterr   invalidr  s                  r   $_translate_function_signature_common.Converter._translate_function_signature_commonx  sX    ww;;$//T-=-=BGG9HIJdii(DA+.tyy>C<N+N(}}!B $ 8 8MM!"BC! !%||44Q\\B  BOOH55!)!7!7!AwwquunTJ  11$7..x8

155&..PQ@R"ST!+AEE8__Q=O!P  11.A##AEE*

EE&&~q7IJ/ )6 ::"66rzzBO 11/BDOG__''**II

Gs!L #G % "&  #DOr   c                    [         R                  SUR                  5        U R                  U5      n[	        UR
                  5       H  u  p4U R                  XCS9  M     U R                  $ )zFTranslate a function definition, including the signature and its body.z+Converter:_translate_function_def_common:%s)r  )r/   r   r\   r  r  r:  r  rl   )r!   r}  r   r(  rC  s        r   r{  (Converter._translate_function_def_common  sW    BBGGL55b9bgg&DA   4 'r   c                @   [        U[        R                  5      (       a  U R                  5         U R                  c)  U R                  U5      nU(       a  U R                  X!5        U R                  R                  n[        R                  " UR                  U5      U l        [        R                  " XR                  U R                   5      U l        U R%                  U5      nU R                  R'                  U5        S U l        U$ [)        S[+        U5      < S35      e)Nz%Unsupported top-level statement type r   )r   r   r  r   rj   r   r   ri   r   r   r   r\   rl   r
   AstAnalyzerr   rh   rq   r{  add_function_defr   rS   )r!   r  rs   r   fn_irs        r   translate_function_def Converter.translate_function_def  s    dCOO,,++-""*--d3++E8%%,,F(33DIIvFD%11$t||TDN77=E--e4!DNL@daPQQr   c                    U R                   R                  n[        R                  " UR                  U5      U l        U R                  U5      $ )z+Translate a (top-level) function signature.)ri   r   r   r   r\   rl   r  )r!   r}  r   s      r   translate_function_signature&Converter.translate_function_signature  s=    !!(($//@88<<r   )rq   rr   rl   rp   rm   rk   ro   rj   rh   r  rf   ri   )NNNN)rs   values.Opset | Nonert   zdict[str, Any] | Nonerf   r  ru   r  )rx   rg  r&   bool)r&   zanalysis.AstAnalyzer)r&   values.Opset)rs   r  r   r  r&   r'   )r   r  r&   r  )r&   r'   )r   r  r&   sourceinfo.SourceInfo)r   r  r   rg  r&   rg  )r   r  r   rg  r&   r'   )r   r  r   rg  r&   r   )r\   rg  r   r  )r&   irbuilder.IRFunction)r&   zdict[str, LocalSymValue])r\   rg  r   LocalSymValuer&   r'   )T)r\   rg  r   r  r   r  r&   SymValue)r   )r   rg  r&   rg  )r   zvalues.AttrRefr   sourceinfo.SourceInfo | Noner&   zir.Attr)NN)r   zvalues.SymbolValue | PyValuer   PreferredName | Noner   r  r&   r  )r   rg  r   r  r&   r  r   )
r  Sequence[str]r  zvalues.Op | strr  zSequence[ir.Value | None]r  zSequence[ir.Attr] | Noner&   zSequence[ir.Value] | ir.Valuer  )r  PyValuer  r  r   r  r&   r  )r"  r  r  rg  r&   r  )r   r  r&   r'   )r<  ast.exprr&   r  )rE  r  r&   zta.TypeAnnotationValue | None)rO  rg  r<  r  rP  z"_schemas.AttributeParameter | Noner&   zir.Attr | None)r   zast.Exprr&   r'   )r   r  r   r  r&   r  )r   r  r&   zir.Value | None)r   zast.Subscriptr   r  r&   r  )r   zast.Callr&   z6tuple[values.Op, list[ir.Value | None], list[ir.Attr]])r&   ztuple[ir.Value, ir.Value])r   z	ast.BinOp)r   zast.Namer&   r  )r   zast.Attributer&   r  )r   r  r&   z	values.Op)r   zast.stmtr&   r'   )r  zast.Assign | ast.AnnAssignr&   r'   )r  z
ast.Returnr&   r'   )r  zast.Ifr&   r'   )r]  zast.For | ast.Whiler&   r'   )ru  zSequence[ast.stmt]r\   rg  rE  r  r&   zir.Graph)r}  ast.FunctionDefr&   r'   )r}  r  r&   r  )r  r  r&   r  ):r(   r)   r*   r+   __doc__r    ry   propertyr~   ru   r   r   r   r   r   r3   r6   r   r   r   r   r   r   r   r   r   r   r   r   r$  r(  r@  rF  rW  r[  rh  rk  rf  r^  r  ra  rb  rc  rd  r  r  r  r  r  r  r  r@  r  r  r{  r  r  r,   r   r   r   rc   rc      s   4 &*.2!-1)") ,) 	)
 +).*  
 # #("<

4--` %
 OS4GK	$U!U)EU	U* (,-1	"<)"< %"< +	"<
 
"<HW +/MM  M *	M
 (M 
'M8 Y Y - Y $	 Y
 
 YD@
&0 9=	GG G 6	G
 
GR7
9>*f!f+?f	fP##	?#4N(&D(%.H
9*._<@D&P0dhAT*!!*! *! !	*!
 
*!X:2 !2 	2 h R =r   rc   )r&   r   )rW   r  rO   ta.TypeAnnotationValuer&   r'   )r_   rg  rO   r  r`   r  r&   r  )B
__future__r   r   loggingtypingr   r   r   r   r   onnx_irrP   r   r	   onnxscript._internalr
   r   r   r   r   r   r   r   rC  onnxscript.irr   	getLoggerr/   r   r  r   r3   r6   r:   r<   r=   r>   r_  r`  r@   EqGtGtELtLtEMatMultrG   MultrI   NotEqr?   rK   rL   r  r  r   r   r  r  r  rg  PreferredNameOnnxVarNamerY   ra   rc   r   r   r   <module>r     s   # 
     !   #			<	(( y  
 $
GGUGGU JJ IIt	
 GGU FFG FFI GG FFF GG] KK GGU HHe GGU IIz  FFD!" GGU#$ GGUHHe'
. 
 &,,i.B.BBCM G ]G+,H M K	&2AVx= x=r   