
    VhEq              
          U 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m	Z	m
Z
 d dlZd dlmZ d dlmZ d dlmZmZ d dlmZmZ d d	lmZmZ d d
lmZmZ 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& d dl'm(Z) d dl*m+Z+  ejX                  e-      Z.ej^                  j`                  Z0 ed       G d d             Z1ej^                  j`                  jd                  jf                  ej^                  j`                  jh                  jf                  ej^                  j`                  jj                  jf                  ej^                  j`                  jl                  jn                  ej^                  j`                  jp                  jf                  ej^                  j`                  jr                  jt                  ej^                  j`                  jv                  jf                  ej^                  j`                  jx                  jf                  iZ=e=j}                         D  ci c]  \  } }|| 
 c}} Z?dej                  j                  fdZBe G d d             ZCdejt                  dejt                  deDeC   dejt                  fdZEdejt                  dejt                  deDeC   dejt                  fdZFdej                  j                  dejt                  dejt                  deDeC   dej                  j                  f
d ZHdej                  j                  d!ej                  j                  dej                  j                  fd"ZIdej                  j                  d!ej                  j                  dej                  j                  fd#ZJ e+e0jx                  jf                  e0jh                  jf                  g      ZKd!ej                  j                  deLfd$ZMd!ej                  j                  deLfd%ZNdej                  j                  ddfd&ZOdej                  j                  ddfd'ZPe0j                  jf                   e1e0j                  jf                  d       e0j                  jf                   e1ej                  d       eF e1eEd eN(      iZU	 ej^                  j                  ZWeWj                  jf                   e1eWj                  jf                  d       eWj                  jf                   e1eWj                  jf                  d       iZ\eUj                  e\       i Ze_ej                  j                  e1f   ebd)<    ej|                         D ]  \  ZcZd e1edd       eec<     e+eg      Ze e+e0j                  jn                  e0j                  jn                  e0j                  jf                  e0j                  jf                  g      Zjdej                  j                  ddfd*Zkdej                  j                  ddfd+Zlyc c}} w # e^$ r Y w xY w),    N)defaultdict)	dataclass)AnyCallableUnion)compute_overlapping_tensors)enable_python_dispatcher)ReinplaceCountersReInplaceTrigger)kernel_side_table triton_kernel_wrapper_functional)configinductor_prims)get_node_storageis_node_realized)inplaceable_foreach_ops)V)GuardOnDataDependentSymNode)immutable_dict)_is_view_op)_pytree)
OrderedSetT)frozenc                   p    e Zd ZU edef   ed<   eed<   d Zeej                  j                  gef   ed<   y)InplaceableOp.
inplace_opmutated_argc                      y)NT nodes    S/home/dcms/DCMS/lib/python3.12/site-packages/torch/_inductor/fx_passes/reinplace.py<lambda>zInplaceableOp.<lambda>&   s        extra_checkN)__name__
__module____qualname__r   r   __annotations__intr%   torchfxNodeboolr   r$   r"   r   r   "   s5    c""3DK588==/4/0Dr$   r   graphc                     t        j                  d ||f      \  }}t        j                  5   ||i |}d d d        | j	                  |||      }|j
                  d<   |S # 1 sw Y   -xY w)Nc                 l    t        | t        j                  j                        r| j                  d   S | S Nval
isinstancer+   r,   r-   metar    s    r"   r#   z%graph_call_function.<locals>.<lambda>4   s$    D%((--)HTYYu% d r$   r3   )pytreetree_mapr   	fake_modecall_functionr6   )r/   fnargskwargs	fake_argsfake_kwargsfake_resultr!   s           r"   graph_call_functionrA   2   su    #__R	vI{ 
 4)3{34 r40D"DIIeK4 4s   	A""A+c                   h    e Zd ZU ej                  j
                  ed<   eedf   ed<   e	e
ef   ed<   y)ViewOptarget.r<   r=   N)r&   r'   r(   r+   _ops
OpOverloadr)   tupler   dictstrr   r$   r"   rC   rC   ?   s.    JJ!!!
S/cNr$   rC   inpsrcview_opsreturnc                 6   | }|D ]H  }t        j                  d |j                  |j                  f      \  }} |j                  |g|i |}J 	 |j                  |       | S # t        $ r+}t        d|j                   d|j                         |d }~ww xY w)Nc                 l    t        | t        j                  j                        r| j                  d   S | S r2   r4   r    s    r"   r#   z._inplace_generalized_scatter.<locals>.<lambda>L   s%    Zehhmm-L5) RV r$   z-shape error in scatter op, can not broadcast z to )r7   r8   r<   r=   rD   copy_RuntimeErrorshape)rJ   rK   rL   tmpviewr>   r?   es           r"   _inplace_generalized_scatterrV   F   s     C :!'VYY$"
	; dkk#9	9[9:		#
 J	  ;CII;d399+V
	s   A$ $	B-&BBc                 <    | j                         }t        |||      S N)clonerV   )rJ   rK   rL   outs       r"   _generalized_scatterr[   Y   s     ))+C'S(;;r$   c                    |d   |dd  }}|r@t        | |j                  |g|j                  i |j                  }t	        | |||dd        }t        | t
        |j                     ||g|j                  i |j                  S )Nr      )rA   rD   r<   r=   $_decompose_scatter_functional_helper_VIEW_OP_TO_SCATTER)r/   rJ   rK   rL   view_opview_ops_tailrT   s          r"   r^   r^   `   s     &a[(12,]G"7>>3
)0
9@
 35$Xab\RGNN+	
 
 .. r$   r!   c                 V    |j                   t        u sJ t        | g|j                   S )a_  Decompose _generalized_scatter to a sequence of view_scatter operations

    e.g. _generalized_scatter(inp, src, [(aten.slice, 0, 0, 10), (aten.slice, 1, 10, -10)])

    will become

    view = aten.slice(inp, 0, 0, 10)
    view_updated = aten.slice_scatter(view, src, 1, 10, -10)
    inp_updated = aten.slice_scatter(inp, view_updated, 0, 0, 10)
    )rD   r[   r^   r<   )r/   r!   s     r"   _decompose_scatter_functionalrc   x   s+     ;;..../B		BBr$   c                    |j                   t        t        fv sJ |j                  \  }}}|j                  rJ |j                   t        u rt        | t        j                  |      }|}|D ]1  }t        | |j                   |g|j                  i |j                  }3 t        | t        j                  j                  ||       |S )a6  Decompose _generalized_scatter using mutations

    e.g. _generalized_scatter(inp, src, [(aten.slice, 0, 0, 10), (aten.slice, 1, 10, -10)])

    will become

    inp_updated = aten.clone(inp)
    slice1 = aten.slice(inp_updated, 0, 0, 10)
    slice2 = aten.slice(slice1, 1, 10, -10)
    slice2.copy_(src)

    )
rD   r[   rV   r<   r=   rA   atenrY   rP   default)r/   r!   rJ   rK   rL   rS   rT   s          r"   _decompose_scatter_mutatingrg      s     ;;/1MNNNNCh{{?{{**!%S9
C V!%cUDIIUUV tzz113<Jr$   c                 F    | j                   \  }}}t        d |D              S )Nc              3   @   K   | ]  }|j                   t        v   y wrX   )rD   _ALWAYS_MUTATING_SCATTER_OPS.0rT   s     r"   	<genexpr>z/scatter_always_uses_mutation.<locals>.<genexpr>   s     Ptt{{::Ps   )r<   any)r!   _rL   s      r"   scatter_always_uses_mutationrp      s"    YYNAq(PxPPPr$   c                     | j                   \  }}t        |       ryt              rt        |       ryj                  dv rt	        fd| j
                  D              ryy)a  Choose between mutating and functional scatter decompositions

    Reinplacing view scatter ops can be pessimising as it blocks fusion with the
    input or output tensor computations. However, it is still profitable if the
    input and output would have been realized anyway.

    Tplaceholderget_attrc              3      K   | ]=  }|j                   t        j                  j                  u xr |j                  d    u  ? yw)r   N)rD   re   rP   rf   r<   )rl   userrJ   s     r"   rm   z+should_reinplace_scatter.<locals>.<genexpr>   s>      5FJtzz)))Adiilc.AA5s   AAF)r<   rp   r   oprn   users)r!   _src	_view_opsrJ   s      @r"   should_reinplace_scatterr{      sf      99Cy $D)!1$!7 vv,, 5NRjj5 2  r$   c                    t        j                  | j                  dt              | j                  dt                    D ]x  }|j
                  t        u xs t        |      }| j                  |      5  |rt        | |      }nt        | |      }ddd       |j                         | j                  |       z y# 1 sw Y   .xY w)z1Replace _generalized_scatter with normal aten opsr:   )rw   rD   N)	itertoolschain
find_nodesr[   rV   rD   rp   inserting_beforerg   rc   replace_all_uses_with
erase_node)r/   r!   use_mutationnew_nodes       r"   decompose_generalized_scatterr      s    O4HIO4PQ 
 KK77 2+D1 	
 ##D) 	F6udC8E		F 	""8,!	F 	Fs   4B==C	c                 J    i t        t              dt        j                  j                  ffddt        j                  j                  f fd} j
                  D ];  }t        |j                        r	 |       !|j                  t        v s4 ||       = y)aV  
    This canonicalizes view scatter ops into a generalized form, defined as:
      def scatter(inp, src, views):
        tmp = inp.clone()
        for view in views:
          tmp = view(tmp)
        tmp.copy_(src)

    We also fuse consecutive view scatter ops of the form
        a = scatter(view2(self), src, [view1])
        b = scatter(self, a, [view2])
    which can be rewritten as
        b = scatter(self, src, [view2, view1])
        a = view2(b)

    This is both more efficient as we only do a single scatter, and also
    easier to reinplace since there is only one use of `self`
    r!   c                     | j                   d   }j                  ||      | <   g |   t        | j                  | j                   dd  | j                        | <   y )Nr   r]   r<   r=   )r<   getrC   rD   r=   )r!   rJ   node_to_view_basenode_to_view_ops     r"   handle_viewsz3canonicalize_view_scatter_ops.<locals>.handle_views   si    iil"3"7"7S"A$!
S!!
YYqr]{{!
r$   c           	      d  	 t        | j                        dk\  sJ | j                  d d \  	t        t        | j                     | j                  dd  | j
                        	fd} |       sQ
j                  |       5  t        
t        	g      }d d d        | j                         
j                  |        y 	j                  \  }}}
j                  	      5  t        
t        |g|      }| j                  |       
j                  |        	j                  rRt        
t        | j                     |g| j                  dd  i | j
                  } |       	j                  |       
j                  	       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N   r   c                      	j                   t        ury	j                  \  } }}j                        }j                  | |       }||u xr |    g    k(  S )NF)rD   r[   r<   r   )
src_inp_src_src_src_scatter_view_opinp_basesrc_baserJ   r   r   scatter_view_oprK   s
        r"   can_fusezLcanonicalize_view_scatter_ops.<locals>.handle_view_scatter.<locals>.can_fuse  s    zz!5569hh3GX3(,,S#6H(,,Wg>Hx' OG,D I %II - r$   )lenr<   rC   _SCATTER_OP_TO_VIEWrD   r=   r   rA   r[   r   r   rx   )r!   r   r   _src_inpsrc_srcsrc_scatter_view_opnew_srcrJ   r   rK   r/   r   r   r   s          @@@r"   handle_view_scatterz:canonicalize_view_scatter_ops.<locals>.handle_view_scatter
  s   499~"""99Ra=S ,12;;

	 
	 z''- .($% &&x0T"14.'.##C( 	"*$ 7#67H &&x0T"yy-'4 YYqr]	
 kk W%))'2S!/	" 	" 	" 	"s   F)B(F&F#&F/N)	r   listr+   r,   r-   nodesr   rD   r   )r/   r   r!   r   r   r   s   `  @@@r"   canonicalize_view_scatter_opsr      s    ( =?9DT9JO

588== 

;"%((-- ;" ;"z  &t{{#[[//%	&r$   )r%   r   c                    !"# i i t        t                  }t        t              #i !t	        t        | j                              D ]  \  } t        | j                        |z
  dz
  ! <   #t                  j                           j                  t        j                  j                  k(  sj j                  d   j                  dv s j                  d   } j                  d   }|j                  t         j"                  k(  r|j                  d   j                  t$        k(  r<|j                  d   j&                  d   |j                  d       j                  d   k(  s]|j                  d   j                  t(        v s>|j                  d   j                  t*        j,                  j.                  j0                  k(  r|j                  d   } ||f<    |<   |j3                   j                  d           !fd#fdd i " "fd}| j                  D ]   t4        j7                   j                  d	      x}n j                  |j8                     }  |      sI|j;                         s[j7                  | f      }||j                  d   "|<   |j<                   _
         j                  t*        j,                  j.                  j>                  k(  r| j                  d   }	 j&                  }
|
d
   }tA        t        |            }tC        t	        |            } ||| j                  tD        jF                        }| jH                  d<   A j                  t*        j,                  j.                  j0                  k(  r} j                  d   }	ddl%m&}  ||	      \  }}|D cg c]  } j&                  |   | }} || j&                  |	jN                  tD        jP                        }| jH                  d<    j                  tR        v r< j&                  d   }tU        jV                  |      }ddl,m-} ddl.m/} ta        ||      r|jb                  jd                  }nta        ||      rstg        jh                         rHt*        jj                  jl                  |jn                  jd                  }n9|jb                  jd                  }n"|jn                  jd                  }ntq        d       | j&                  d    j&                  d   |tD        jr                        }tC         j&                        }
||
d<   tu        |
       _        >t(        j7                   j                  d	      x}	 c j                  |j8                     }tw         fd|D              s  |      s|D ]  }| f   }|j                  d   "|<    |j<                   _
         "jy                         D ]:  \   }|"v r
"|   }|"v r
|" <    j{                  |       | j}                          < y	c c}w )a  
    Reinplaces in-placeable operations.
    If there are no uses of a view of the mutated arg after the current node,
    it is possible to inplace the op.
    This above algorithm could be justified by observing side effects. While
    we traverse the graph in forwards direction, only latter nodes could view
    side effects of the current node. If the current node is not used later as
    well as no view of this node is used later in the graph, then it is safe to
    inplace as there would be no way to observe the side effects.
    This condition is slightly different for graph inputs where they can only
    be inplaced if the above condition is true and there's a copy_ in the
    epilogue that signals that the caller wants to observe the mutation.

    Unlike JIT Inductor, AOTInductor currently unlifts weights and buffers from
    input args, so instead of checking mutation on placeholder, AOTInductor
    checks mutation on get_attr. This is subject to change in future.
    r]   r   rr   r=   c                2  	 
|    }|
|   nd }	fd	|D ]}  }|j                   D ]l  }
|   }||k  r|||k  r 	|      r|j                  t        j                  j                  j
                  j                  u r||j                  d   u rk  y  y)Nc                     t        | j                        rt        fd| j                  D              S | j                  t        v S )Nc              3   .   K   | ]  } |        y wrX   r   )rl   uis_meta_only_users     r"   rm   zqreinplace_inplaceable_ops_core.<locals>.any_use_of_views_after_node.<locals>.is_meta_only_user.<locals>.<genexpr>  s     DA,Q/Ds   )r   rD   allrx   META_ONLY_OPS)r!   r   s    r"   r   z^reinplace_inplaceable_ops_core.<locals>.any_use_of_views_after_node.<locals>.is_meta_only_user  s3    4;;'DDDD;;-//r$   r   TF)rx   rD   r+   opsre   rP   rf   r<   )r!   shared_view_nodes	copy_noder   node_loccopy_node_locrT   rv   user_locr   
node_orders            @r"   any_use_of_views_after_nodezCreinplace_inplaceable_ops_core.<locals>.any_use_of_views_after_node  s    d#1:1F
9-D	0
 & 	D

 %d+x' !,(1J$T* KK599>>#7#7#?#??#tyy|3-	0 r$   c                 
    dt         fd}t        |t        t        f      r?t	        d |D              }t        |      t        |      k7  ryt         fd|D              S t        |      y
t        |         }|D cg c](  } ||j                  d   |j                  d   g      r|* }}|j                  dv r#	j                  |d       }|y  |||      ryy	t        d
 |D              ry  |d |       S c c}w )NrM   c                 P    	 t        t        |             dk7  S # t        $ r Y yw xY w)Nr   T)r   r   r   )lss    r"   _overlapzEreinplace_inplaceable_ops_core.<locals>.can_inplace.<locals>._overlap  s/    6r:;q@@. s    	%%c              3   2   K   | ]  }t        |        y wrX   r   )rl   args     r"   rm   zFreinplace_inplaceable_ops_core.<locals>.can_inplace.<locals>.<genexpr>  s     (V3)9#)>(Vs   Fc              3   0   K   | ]  } |        y wrX   r   )rl   r   can_inplacer!   s     r"   rm   zFreinplace_inplaceable_ops_core.<locals>.can_inplace.<locals>.<genexpr>  s     E#{4-Es   r3   rr   )r   r   Tc              3   8   K   | ]  }|j                   d v   yw)rr   N)rw   rk   s     r"   rm   zFreinplace_inplaceable_ops_core.<locals>.can_inplace.<locals>.<genexpr>  s     VD77Vs   )r.   r5   r   rG   r   r   r   r   r6   rw   r   rn   )r!   r   r   unique_storagesr   vr   r   r   
copy_nodesstorage_to_nodess   `      r"   r   z3reinplace_inplaceable_ops_core.<locals>.can_inplace  s/   	D 	 kD%=1((V+(VVO?#s;'77 EEEEK(0,-=k-JK
 '
))%0!&&-@A 
 
 >>88"{D9I  *'9+ VDUVV 2'4[  ;
s    -D c                 "   d}d }|D ]6  }t        |t        t        f      r|D ]  }	| ||	      z  } ,| ||      z  }8 t        j	                  d| ||||       t        j                  |t        |             t        j                  ||       y )Nr   c                     | j                   j                  dd       }|]t        |j                         t              r?t        |j                         t              r!|j                         |j                         z  S y)Nr3   r   )r6   r   r5   element_sizer*   numel)r!   ts     r"   byteszJreinplace_inplaceable_ops_core.<locals>.log_inplace_results.<locals>.bytes  sW    		eT*Aq~~/5qwwy#.~~'!'')33r$   zFor node %s, attempted to reinplace %s. We were unable to reinplace %s; %s (if non-empty) are possible missed reinplacing opportunities that may be bad for memory usage and performance. Total size of missed opportunities with static shapes is : %s bytes.)	r5   r   rG   loginfor
   add_missed_opportunitiesr   add_missed_bytes)
	node_nameold_tensors_to_clonetensors_to_clonemissed_argsmissed_nodestriggermissed_bytesr   r!   ns
             r"   log_inplace_resultsz;reinplace_inplaceable_ops_core.<locals>.log_inplace_results  s     		 ! 	,D$u. -A E!H,L- d+	, 	  
	
 	227C<LM**7LAr$   c                    g }t        t        t        d f             g }g }fd}| D ]+  }||v sJ ||    |       }	|	r       rԉj                  f      }
|
|
j                  d   |
<   |t
        j                  k(  sGj                  D ]8  }|j                  t        j                  k(  s!|j                  d   |k(  s4|<   : t        t        t        f      r"D ]  }j                  t        |              ܉j                  t                     |	r"|j!                  |       |j!                         |j!                  |       .  || ||||       |S )Nc                 r    t        | t        t        f      rt        fd| D              S t	              v S )Nc              3   8   K   | ]  }t        |      v   y wrX   r   )rl   astorage_of_reinplaced_argss     r"   rm   zreinplace_inplaceable_ops_core.<locals>.reinplace_and_refine_tensors_to_clone.<locals>.tensor_with_same_storage_already_reinplaced.<locals>.<genexpr>F  s"      JK$Q'+EEs   )r5   r   rG   rn   r   )r   r   r   s    r"   +tensor_with_same_storage_already_reinplacedzreinplace_inplaceable_ops_core.<locals>.reinplace_and_refine_tensors_to_clone.<locals>.tensor_with_same_storage_already_reinplacedD  s>    #e}- OR   $K04NNNr$   r   r]   )r   r   r*   r   r<   r   AUTO_FUNC_V2rx   rD   operatorgetitemr5   r   rG   addr   append)r   r=   r   r   r   r   r   r   r   should_attempt_reinplacer   rv   r   r   r   r   copy_args_to_copy_nodesr   r!   replace_dicts                @@r"   %reinplace_and_refine_tensors_to_clonezMreinplace_inplaceable_ops_core.<locals>.reinplace_and_refine_tensors_to_clone9  s    ')%/c4i0@%A%C" 	O ( *	-C&= = +K ,W, ($ (Kk,J377d8KL	(.7nnQ.?L+"2"?"?? $

 =
  ;;(*:*::tyy|s?R1<L.= kD%=9( L2667G7JKL /223CK3PQ+&&s+ ''4 '',U*	-X 	 	
  r$   N
_all_basesonly_clone_these_tensors)get_mutable_args
kernel_idx)	Autotuner)JITFunctionzUnknown triton kernel typer   c              3   *   K   | ]
  }|fv   y wrX   r   )rl   r   r   r!   s     r"   rm   z1reinplace_inplaceable_ops_core.<locals>.<genexpr>  s     V#T{&==Vs   )?r   r   r   r   	enumeratereversedr   r   r   r   rD   re   rP   rf   r<   rw   r   r   r   r=   r   r+   r   higher_orderauto_functionalizedr   inplaceable_opsr   r   r%   r   auto_functionalized_v2rangerH   r   r   r6   *torch._higher_order_ops.auto_functionalizer   _nameAUTO_FUNC_V1inplaceable_triton_opsr   
get_kerneltriton.runtime.autotunerr   triton.runtime.jitr   r5   r;   r&   r   	is_fbcodeversionhipbase_fnAssertionError
TRITON_OPSr   r   itemsr   r   )$r/   mutated_inputsidstrK   r   inplaceable_opr   r   _mutable_opr=   	all_basesbases_to_clonebase_tensors_dctnew_bases_to_cloner   r   ro   r   r   kernelr   r   kernel_namemutated_argsr   replacementr   r   r   r   r   r!   r   r   r   s$                              @@@@@@@@@r"   reinplace_inplaceable_ops_corer
  {  s   & !J_&N"4(!#JXekk23 -4u{{+a/!3
4)$/077=;;$**,,,1 E
 2
 ))A,C))A,C zzX---HHQK&&*JJ**84SXXa[ATYYq\QHHQK&&*AAHHQK&&%))*@*@*T*TThhqk26#S#J/"JsOtyy|,1-4!F8t*BX 8:LF  F P  _8-11$++tDDNQ))N$>$>?K4-.2L2LT2R 477d8KL	(.7nnQ.?L+,77[[EII22III))A,K[[F|,I"3y>2N#Ii$89,Q  --	- 5GDII01[[EII22FFF))A,KS"2;"?a , t{{1~/I     E !! --	  5EDII01[[22\2J&11*=F:6&+.$ii00FI.##%}}((0&,nn&=&=&,ii&8&8"(.."9"9K$%ABB  E./H% ++	  $++&F)9F%&(0DK599$++tLLN  99^%?%?@LVVV4.' @C 7d DI.7nnQ.?L+@ -77_8@ *//1 k\)&{3K \)(T"";/} s   YYc                     t               5  t        |        t        |        t        |        d d d        y # 1 sw Y   y xY wrX   )r	   r   r
  r   )r/   s    r"   reinplace_inplaceable_opsr    s5    	!	# -%e,&u-%e,- - -s   "6?)mr}   loggingr   collectionsr   dataclassesr   typingr   r   r   r+   torch._C._dynamo.guardsr   torch._dispatch.pythonr	   torch._dynamo.utilsr
   r   *torch._higher_order_ops.triton_kernel_wrapr   r   torch._inductorr   r   torch._inductor.fx_utilsr   r   torch._inductor.loweringr   !inplaceable_foreach_ops_loweringstorch._inductor.virtualizedr   %torch.fx.experimental.symbolic_shapesr   torch.fx.immutable_collectionsr   torch.fx.passes.reinplacer   torch.utilsr   r7   torch.utils._ordered_setr   	getLoggerr&   r   r   re   r   diagonal_scatterrf   diagonalselect_scatterselectr*   slice_scattersliceTensoras_strided_scatter
as_stridedr   r   r_   r,   GraphrA   rC   r   rV   r[   r-   r^   rc   rg   rj   r.   rp   r{   r   r   	index_put
index_put__unsafe_index_put_unsafe_index_put_r   _c10d_functionalc10d_functional
all_reduceall_reduce_all_reduce_coalescedall_reduce_coalesced_inplaceable_collective_opsupdateAttributeErrorrH   rE   rF   r)   outplace_opr   r   sym_size
sym_stride	sym_numelsym_storage_offsetr   r
  r  )kr   s   00r"   <module>r=     sC      # ! ' '  ? ; C 3 G * M 9 1 ) / g!yy~~ $E E E 
IINN##++UYY^^-D-D-L-L	IINN!!))599>>+@+@+D+D	IINN  ((%))..*>*>*E*E	IINN%%--uyy~~/H/H/P/P	  )<(A(A(CD1q!tD 
uxx~~ 
   	!LL48L
\\&<	<!LL<48L<
\\<88>>	 
 6l	
 XX]]0C88>>C!&C
XX]]C"88>>!&
XX]]@  *  Quxx}} Q Q
588== T 8 D *d& d&D d&P 	NNM$//*A*A1E""M.2S2SUV$W-$	,	ii00O""**M''//-
 	,,44m119917
	" 56 GI ejj33]BC HF@FFH HK+8Q+GK(H $%E$FG  ''	l%((.. lT l^-UXX^^ - -w Eh	  	 		s   W<BX X
	X
