
    uki                      (   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 d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ecZZeecZZ i Z! ejD                  d       G d d             Z#dejH                  fdZ% ejD                  d       G d d             Z&dejN                  dejF                  fdZ(dejF                  fdZ)de&de#fdZ*ejV                  ejX                  ejZ                  ej\                  ej^                  ej`                  ejb                  ejd                  ejf                  g	Z4e4D ]  Z5 e%e5e*        de6fdZ7ejp                  ejr                  ejt                  ejv                  ejx                  gZ=e=D ]  Z5 e%e5 e7d !              ej|                  ej~                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  gZKeKD ]  Z5 e%e5 e7d!              de&d"eLde#fd#ZM e%ej                  eM       de&d$ej                  de#fd%ZP e%ej                  eP       dejN                  fd&ZR e%ej                  eR       d'ejN                  fd(ZT e%ej                  eT       dej                  fd)ZW e%ej                  eW       y)*z*Helper tool for automatic cost estimation.    N)Any)Sequence)	tree_util)api_util)core)custom_derivatives)linear_util)pjit)	discharge)partial_eval)safe_map)safe_zip)laxT)frozenc                   4    e Zd ZU eed<   eed<   eed<   ddZy)CostEstimateflopstranscendentalsbytes_accessedc                     t        | j                  |j                  z   | j                  |j                  z   | j                  |j                  z         S Nr   r   r   )r   r   r   r   )selfothers     X/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/pallas/cost_estimate.py__add__zCostEstimate.__add__-   sG    jj5;;&,,u/D/DD**U-A-AA     N)r   r   returnr   )__name__
__module____qualname__int__annotations__r    r   r   r   r   '   s    	*r   r   	primitivec                     |t         | <   y N)_cost_rules)r%   rules     r   register_cost_ruler*   4   s    +ir   c                   .    e Zd ZU ee   ed<   ee   ed<   y)Contextavals_in	avals_outN)r   r    r!   r   r   r#   r$   r   r   r,   r,   7   s    SMc]r   r,   jaxprr   c                    | j                   | j                  }} t        ddd      }| j                  D ]  }t        j                  |j                  d      }|&t        |j                  D cg c]  }|j                   c}|j                  D cg c]  }|j                   c}      } ||fi |j                  }||z   } t        j                  |j                  |j                  |j                        S c c}w c c}w )z.Returns the cost estimate for the given Jaxpr.r   r   N)r-   r.   )r/   constsr   eqnsr(   getr%   r,   invarsavaloutvarsparamspallas_corer   r   r   )r/   _
total_costeqnr)   vcontextop_costs           r   cost_estimate_jaxprr?   <   s     [[%,,%!QqI*ZZ (c??3==$/D#**!=Q!&&!=36;;"?a166"?AgW+

+g'j( 
	!	! 00..
 	 ">"?s   ,C:
C?c                    t        j                  |      \  }}t        j                  | fi |}t	        j
                  t        j                  |t	        j                  d| |i             |      \  }}|D cg c],  }t        j                  |j                  |j                        . }	}t        j                  ||	      \  }
}}t        t        j                   |
|            }t#        d |D              }t#        d |
j$                  D              }t'        j(                  |j*                  |j,                  |j.                  |z   |z         S c c}w )aS  Computes a cost estimate for the given function.

  Args:
    fun: The function to compute the cost estimate for.
    *args: The arguments to the function. Can be jax.ShapeDtypeStruct or
      jax.Array.
    **kwargs: The keyword arguments to the function.

  Returns:
    A pallas_core.CostEstimate object containing the cost estimate.
  cost_estimate)
debug_infoc              3      K   | ]:  }t        j                  |j                        |j                  j                  z   < y wr'   )mathprodshapedtypeitemsize.0as     r   	<genexpr>z estimate_cost.<locals>.<genexpr>f   s3      E01dii177+++Es   A Ac              3      K   | ]N  }t        j                  |j                  j                        |j                  j                  j
                  z   P y wr'   )rD   rE   r5   rF   rG   rH   rI   s     r   rL   z estimate_cost.<locals>.<genexpr>h   s;      N:;dii 5 55Ns   AAr   )r   tree_flatten	functoolspartialr   flatten_fun_nokwargslu	wrap_initrB   jax_coreShapedArrayrF   rG   petrace_to_jaxpr_dynamicr?   ClosedJaxprsumr6   r8   r   r   r   r   )funargskwargsflattened_argstreedefpartial_funwrapped_funr9   rK   avalsr/   r1   estimateinput_bytesoutput_bytess                  r   estimate_costre   P   s;    &2248.'!!#00+00ll;&11/326<= 	.+q
 <J
Ja81
J%
J..{EB%F !5!5eV!DE( E5CE E+ N?D}}N N,		!	!NN..,,{:\I
  Ks   71Ectxc                 x    | j                   \  }t        j                  |j                        }t	        |dd      S Nr   r   )r.   rD   rE   rF   r   )rf   r9   aval_out	out_flopss       r   binary_cost_rulerk   p   s5    mm)(ii')	
 r   transcendentalc                 ,     dt         dt        f fd}|S )Nrf   r   c                     | j                   \  }d}d}r#|t        j                  |j                        z  }n"|t        j                  |j                        z  }t	        ||d      S rh   )r-   rD   rE   rF   r   )rf   r9   x_aval	new_flopsnew_transcendentalsrl   s        r   	cost_rulez"unary_cost_rule.<locals>.cost_rule   sa    llGFITYYv||44499V\\**i+ r   )r,   r   )rl   rr   s   ` r   unary_cost_rulers      s    W l  
r   F)rl   yc                   | j                   \  }t        j                  |j                        }|dk(  s|dk(  rd}n<t        j                  t        j
                  |d            }||j                         z   }t        ||z  dd      S )Nr         r   )r-   rD   rE   rF   floorlog	bit_countr   )rf   rt   ro   num_elementscost_per_elementhighest_bits         r   _integer_pow_cost_ruler~      sy    LL'&6<<(,!VqAv **TXXa^,K"Q[[]2	++
 r   dimension_numbersc                    | j                   \  }}|j                  |j                  }}|\  \  }}\  }	}
t        |      t        |      k(  sJ t        |	      t        |
      k(  sJ d}d}t        t        |            D ]!  }||   ||   }}||   ||   k(  sJ |||   z  }# |d|z  z  }t	        |      D ]  \  }}||v r||z  } t	        |      D ]  \  }}||v r||
v r||z  } t        |dd      S )Nrv   rw   r   r   )r-   rF   lenrange	enumerater   )rf   r   r9   ro   y_avalx_shapey_shapelhs_contracting_dimsrhs_contracting_dimslhs_batch_dimsrhs_batch_dimsr   contracting_flopsilhs_dimrhs_dims                   r   dot_general_cost_ruler      sc    <<.&&\\6<<7'(9&.- 1&n	!	"c*>&?	??	?	^	N 3	33	3
%)*+ *a+A.0DQ0GWG7ww////))* 1   %g& ja  	WE g& ja  N	WE 

 r   c                r    ~ t        |      }t        |j                  |j                  |j                        S r   r?   r   r   r   r   )rf   r/   r9   
inner_costs       r   _pjit_cost_ruler      s7    	"5)*	 00..
 r   
call_jaxprc                r    ~ t        |      }t        |j                  |j                  |j                        S r   r   )rf   r   r9   r   s       r   _custom_vjp_ruler      s7    	":.*	 00..
 r   c                     t        t        j                  |             }t        |j                  |j
                  |j                        S r   )r?   rV   close_jaxprr   r   r   r   )r/   r9   _2r   s       r   _run_state_ruler      s=    "2>>%#89*	 00..
 r   )Y__doc__dataclassesrO   rD   typingr   collections.abcr   jax._srcr   r   r   rT   r   r	   rR   r
   jax._src.stater   jax._src.pallasr8   jax._src.interpretersr   rV   jax._src.utilr   r   jax._src.laxr   map
unsafe_mapzip
unsafe_zipr(   	dataclassr   	Primitiver*   r,   rX   r?   re   rk   add_pmul_psub_pdiv_pmin_pmax_por_pand_pxor_p
BINARY_OPSopboolrs   neg_pfloor_pceil_pround_pnot_pUN_OPScos_psin_ptan_psinh_pcosh_ptanh_pacos_pasin_patan_pexp_plog_p
logistic_psqrt_pTRANSCENDENTAL_OPSr"   r~   integer_pow_pDotDimensionNumbersr   dot_general_pr   jit_pr   custom_vjp_call_pJaxprr   run_state_pr$   r   r   <module>r      s   1     $   % ' &  $ / 4 " " CZCZd#
 
 $
 ("4"4   d#  $(;+C+C @' <  IIIIIIIIIIIIHHIIII

  +BR)*+D " IIKKJJKKII
  @BR>?@ IIIIIIJJJJJJJJJJJJIIIINNJJ   ?BR=>? s |   3$$&< =!w !-0-D-D!".!D 3$$&; <8#7#7  4:: /)=)=  %779I Jx~~  9((/ :r   