
    uki                        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m	Z	 d dl
mZmZ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 eecZZeecZZd Zed        Z ej@                  d      Z!de!_"        e!jF                  d        Z$ ejJ                  e!       d Z& ejN                  e!e&d       d Z(e(ejR                  e!<   d Z*e*ejV                  e!<   d Z,e,ejZ                  e!<   d Z.ed        Z/e.ej`                  e!<   y)    )core)linear_util)dispatch)typeof)tree_flattentree_unflatten)safe_mapsafe_zipweakref_lru_cacheunzip2)
debug_infoflatten_fun_nokwargs)ad)batching)mlir)partial_eval)irc                       fd}|S )Nc                       fd}|S )Nc                  >   t        d	| i       }t        |       \  }}|D cg c]5  }t        |      j                  t        j
                  j                        7 }}t        	|t        |      |      \  }}t        j                  ||
d}t        ||      S c c}w )Nfusedmemory_spacejaxpr
out_spaces)r   r   r   updater   MemorySpaceAny_trace_to_jaxprtuplefused_pbindr   )argsdbg	args_flatin_treexin_avalsr   out_tree	outs_flatfr   s            Q/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/experimental/fused.pywrappedz$fused.<locals>.wrap.<locals>.wrapped!   s    w4,c'-i$& )""0@0@0D0D"E &h &'7E(OSIoeX,,	:NiHi00	&s   :B )r,   r.   r   s   ` r-   wrapzfused.<locals>.wrap    s    1 N    r/   )r   r0   s   ` r-   r   r      s    	 
+r1   c                     t        j                  | |      }t        ||      \  }}t        j                  ||      \  }}}t        j                  ||       |       fS )Nr   )lu	wrap_initr   petrace_to_jaxpr_dynamicr   ClosedJaxpr)	funr'   r)   r%   r,   r*   r   _constss	            r-   r    r    ,   sU    ll33'!$Q0+!X..q(;%F			%	((*	44r1   
fused_callTc                     t        |j                  |       D cg c]  \  }}|j                  |       c}}S c c}}w )Nr   )zip	out_avalsr   )r   r   r)   ass        r-   _fused_abstract_evalrB   6   s>     %//:6
8a (((
" 
8 8 
8s   :c                   t        j                  |j                        }t        |      \  }}|D cg c]'  \  }}t	        j
                  || j                  |      ) }	}}g || j                  }
t	        j                  d|| j                  t        |      |
| j                  | j                        \  }}}|D cg c]*  }t        j                  j                  t!        |            , }}t	        j"                  d|j$                  j&                  t	        j(                  g |	|      |j*                  j,                  gt/        t        j0                  j                  |      t        j2                  j                  d      t        j2                  j                  d                  }|j&                  S c c}}w c c}w )N)const_loweringavalr   FT)r   
inlineable	MUST_FUSE)result_typesoperandscalled_computationsbackend_config)r   jaxpr_const_argsr   r   r   ir_constantrD   avals_inlower_called_computationmodule_contextlen	avals_out	tokens_inr   
StringAttrgetstrcustom_calltyperesultsflatten_ir_valuesnamevaluedict	ArrayAttrBoolAttr)ctxr   r   r$   const_args_and_avals
const_argsconst_arg_avalscrE   const_arg_valuesr)   func_opr:   rA   out_spaces_r   s                   r-   _fused_loweringrh   =   so   ..u{{; &'; <*o *+
!T q););$G+ + /..(//uc((#j/8	mmS]]$-'1a 5??q""3q6*?+?


<<''%%&@(8&@4&@A"<<--.R\\%5%5k%B%'[[__U%;$&KKOOD$9;% 
#+ @s   ,F6</F<cuda)platformc                j    t        j                  || |      \  }}t        j                  |||d}||fS Nr   )r   batch_jaxpr2r"   r#   )	axis_datavals_indims_inr   r   batched_jaxprdims_outoutss           r-   _fused_batcherrt   T   s7    $11%GL-	wm
	K$	xr1   c                   |D cg c]  }t        |t        j                          }}t        j                  ||d      \  }}|D cg c]  }t        |t        j                        r|! }}g |t	        ||      D 	
cg c]
  \  }	}
|
s	|	 c}
}	}t        j                  g | |||d}|d t        |       |t        |      d  }}t        |      }t	        |j                  |      D 
cg c]5  \  }}
|
rt        |      n"t        j                  |j                               7 }}}
t        |d       J ||fS c c}w c c}w c c}
}	w c c}
}w )NFr   )
isinstancer   Zero	jvp_jaxprr>   r"   r#   rQ   iterr?   nextto_tangent_aval)primalstangentsr   r   tnzs	jaxpr_jvpout_nzsnz_tangentsrA   nz
spaces_jvprs   primals_outnz_tangents_outnz_outsrE   tangents_outs                     r-   
_fused_jvpr   Z   sK   -56Z277#	#6#6||E36)W$CqJq"'',BC+CNNc*g.FMUQ"qMN*	 
-w 
- 
-I!+
-$!%ms7|!4d3w<=6I+!'"%eoow"?AdB $&$w-27743G3G3I+JJ A, A	gt		$$	$	l	"" 	7CM
As#   "D>E'E?
E
E/:Ec                  
 t        j                  || d      \  }dgt              z  dgt              z  z   }t	        j
                  |j                  |d      \  }t	        j                  |      
t        d t        |      D              t        j                  |||d}|j                  D cg c]  }|j                          c}
fd}	|||	fS c c}w )NFTc              3   ,   K   | ]  \  }}|s	|  y wNr/   ).0rA   r   s      r-   	<genexpr>z_fused_lin.<locals>.<genexpr>n   s     C51bQC   
r   c                    |D cg c]  }t        |t        j                        r|! }}t        g | |      D cg c]
  \  }}|s	| }}}t	        j
                  |d}t        |      }t              D 	
cg c]'  \  }	}
|	rt        |      nt        j                  |
      ) }}	}
t        |d       J |S c c}w c c}}w c c}
}	w rl   )rv   r   rw   r>   r"   r#   ry   rz   )r|   r}   r~   r   r(   uinputsr   nz_outs_r   r@   rs   	jaxpr_linr   
spaces_lintangent_avals_outused_inputss               r-   	fused_linz_fused_lin.<locals>.fused_linr   s    &EjBGG.D1EKE 8' 8K 8+FLDAq!aLFLllF)
KGG}HW&78:A !DNbggaj0 :D :$'''K FL:s   C C 
C
C,C)r   rx   rQ   sumr6   	dce_jaxprr   close_jaxprr!   r>   r"   r#   r?   r{   )r   r   r   r|   r   lin_outs
jaxpr_lin_r   r@   r   r   r   r   r   r   s             @@@@@r-   
_fused_linr   i   s    ||E36)WWs7|#tfs7|&;;(LL(EJ*knnZ()CC
G$<CC*gUzJ+49OODqq((*D  
gw		11 Es   8C!c                (   t        || f      \  }}|D cg c]5  }t        |      j                  t        j                  j
                        7 }}t        ||g |      \  }}	|D cg c]G  }t        |t        j                        r|j                  j                  nt        |      j                  I }
}t        |	|j                        }t        d t        ||
      D              }t!        j"                  |||d}t        |	|      S c c}w c c}w )Nr   c              3   ,   K   | ]  \  }}|s	|  y wr   r/   )r   r(   rA   s      r-   r   z#_fused_transpose.<locals>.<genexpr>   s     CTQqCr   r   )r   r   r   r   r   r   _transpose_jaxprrv   r   UndefinedPrimalrE   r   r   r?   r!   r>   r"   r#   )cts_inr   r   
primals_inin_flatr'   r(   r)   trans_jaxprr*   	in_spacescts_out_trans_spacescts_outs                 r-   _fused_transposer      s   !:v"67'7  QiD,<,<,@,@A  (  *5'<X<H+x4>@/0 '1B4F4F&Gqvv""1I**+ @) @Hk&;&;<(CS9%=CC,LL'N'	'	** @s   :D
(ADc                     d  fd} j                   j                  j                         }t        j                  t        j                  ||      |      \  }}}t        j                  ||      j                  fS )Nc                       y r   r/   r/   r1   r-   <lambda>z"_transpose_jaxpr.<locals>.<lambda>   s    r1   c                     t        |       \  }}t        j                  j                  dj                  ||      }|D cg c]   }t        |t        j                        s|nd " }}t        |      \  }_        |S c c}w )NF)	r   r   backward_passr   r;   rv   rw   r   r*   )	r   r   r   outctr   cellr'   r   s	         r-   
transposedz$_transpose_jaxpr.<locals>.transposed   su    '9J


5;;u||Z
PCAD
E2ZBGG,2$6
EC
E)#.GT]N Fs   %A>r3   )
r   r   with_unknown_namesr6   r7   r4   r5   r   r8   r*   )	r   r'   r)   r   r%   r   r:   r;   r   s	   ``      @r-   r   r      sj    	$ 	113#44ll:#.:+q&			+v	.	==r1   N)1jax._srcr   r   r4   r   jax._src.corer   jax._src.tree_utilr   r   jax._src.utilr	   r
   r   r   jax._src.api_utilr   r   jax._src.interpretersr   r   r   r   r6   jax._src.lib.mlirr   map
unsafe_mapr>   
unsafe_zipr   r    	Primitiver"   multiple_resultsdef_abstract_evalrB   simple_implrh   register_loweringrt   fancy_primitive_batchersr   primitive_jvpsr   primitive_linearizationsr   r   primitive_transposesr/   r1   r-   <module>r      s,    &    ; G G > $ * & 4  CZCZ 5 5 $..
& 8 8   W *   w& A .< ! !' *# (  ' 2( (2  G $
+ > > $4    r1   