
    uki-                        d Z ddlmZ ddlmZ ddlZddlmZ ddlmZ	 ddl
mZ ddlmZ 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	j0                  d      Zde_        dej6                  dej8                  fdZ eed      ddddefd       Zej>                  d        Z  ejB                  e ejD                  ejF                               ejH                  d        Z d Z%e%ejL                  e<   y)zFusible primitive.    )partial)AnyN)api_util)core)batching)linear_util)api_boundary)	tree_util)util)mlir)partial_eval)fusionfusibleTxreturnc                 d     t        j                   fddi ft        j                               S )Nc                       S N r   s   X/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/pallas/fuser/fusible.py<lambda>z&_make_trivial_fusion.<locals>.<lambda>%   s    1     r   )funcin_typeout_type)
fusion_libFusionjaxtypeofr   s   `r   _make_trivial_fusionr!   #   s+    			2hzz!}
 r   zfuser.fusible)repro_api_name)output_fusion_prefixr#   c                &    fd}|  ||       S |S )Nc                       fd}|S )Nc            
         fd}t        j                  |       \  }}t        j                  d|| i       }t        j                  t        j                  ||      |      \  }}|D cg c]  }t        j                  |       }}t        j                  ||      \  }	}
} |       }t        j                  g |||	t        |      ||d}t        j                  ||      S c c}w )Nc                  L    t        j                  t        |       } g |d  S r   )r
   tree_mapr!   )args
in_fusionsfs     r   wrappedz<fusible.<locals>.decorator.<locals>.wrapper.<locals>.wrapped/   s)    ''(<dC
#*#d##r   r   )
debug_info)jaxpr
num_constsin_treeout_treer   r#   )r
   tree_flattenr   r-   flatten_fun_nokwargslu	wrap_initjax_coreget_avalpetrace_to_jaxpr_dynamic	fusible_pbindlentree_unflatten)r)   r,   	flat_argsr0   r-   flat_funout_tree_thunkr   
flat_avalsr.   _constsr1   outr+   r#   s                 r   wrapperz+fusible.<locals>.decorator.<locals>.wrapper.   s    $ %11$7i&&y'4Dj!)!>!>
,,w:
6"h 3<<QH%%a(<j<228ZHeQ!hNN 			 [3	c %%h44 =s   )C&r   )r+   rE   r#   s   ` r   	decoratorzfusible.<locals>.decorator-   s    52 Nr   r   )r+   r#   rF   s    ` r   r   r   +   s    8 ]Q<	r   c                 d    t        j                  ||g      \  }}t        j                  | |g| S r   )r   
split_listr6   
eval_jaxpr)r.   r/   consts_and_argsrB   rC   r)   s         r   rB   rB   N   s0    :,?,&$			UF	2T	22r   c                 p    ~~| j                   D cg c]  }|j                   c}| j                  fS c c}w r   )outvarsavaleffects)r.   r)   kwargsvs       r   rB   rB   W   s,    
F--	(Q!&&	(%--	77	(s   3c                     | j                   dk7  rt        d      t        d t        ||d      D              }t	        j
                  |i |}t        d |D              }|dt        |      z  fS )N   z-fusible does not support non-trivial batchingc              3   X   K   | ]"  \  }}|t         j                  u s||n||    $ y wr   )r   
not_mapped).0ads      r   	<genexpr>z1_fusible_trivial_batching_rule.<locals>.<genexpr>a   s6      
!Q $$$	a!<s   (*T)strictc              3   &   K   | ]	  }|d      y wr   r   )rU   os     r   rX   z1_fusible_trivial_batching_rule.<locals>.<genexpr>f   s     -!ag-s   )r   )sizeNotImplementedErrortuplezipr:   r;   r<   )	axis_datar)   dimsrO   unbatched_argsout_unbatchedrD   s          r   _fusible_trivial_batching_rulerd   ]   sr    ^^q
M
NN dD. . ...;F;--}--#	dSXo	r   r   )'__doc__	functoolsr   typingr   r   jax._srcr   r   r6   jax._src.interpretersr   r   r4   jax._src.traceback_utilr	   r
   r   r   r   r8   jax._src.pallas.fuserr   r   	Primitiver:   multiple_resultsArrayr   r!   r   def_implrB   register_lowering	lower_funimpldef_effectful_abstract_evalrd   fancy_primitive_batchersr   r   r   <module>ru      s      
  % * & 0   & 4 6Hy)	!	 CII **;*;  	o64 S  7D 3 3
   y.$.."@ A &&8 '8
 0N ! !) ,r   