
    h7                       % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJr  SSKJrJ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J r   \(       a7  SSK!J"r"J#r#  SSK!J$r%  SSKJ&r&  SSKJ'r'  \RP                  S:  a  SSKJ)r)  OSSK*J)r)   " S S\5      r+\S   r,S\-S'   \\.\+4   r/S\-S'   \RP                  S:  r0\0=(       a    \RP                  S:  r1\1=(       a    \RP                  S:  r2\" S5      r3S\-S'    " S S 5      r4\5" S!5      r6\5" S"5      r7\5" S#5      r8S$S%S&S'S(S)S*S+S,.r9S-S.S/S0.r:\5" \:5      S11-  r;0 S2S3_S4S5_S6S7_S8S9_S:S;_S<S=_S>S?_S@SA_SBSC_SDSE_SFSG_SHSI_SJSK_SLSM_SNSO_SPSQ_SRSS_STSUSVSWSXSY.Er<SZS[1// \4Rz                  // \7// \8/S\.SZS[1// \4Rz                  // S]1// \6/S\.SZ1// \4Rz                  // S^1// S_1/S\.SZ1/S[1/\4Rz                  // S`1// Sa1/SbSc.SZ1/S[1/Sd1/\4Rz                  /S`Se1/S`1/Sa1/SbSc./r>Sf\-Sg'   \> V Vs/ s H(  n \?" \4R                  5      // 4  H  n0 U EShU0EPM     M*     snn r>SiSjSkSlSmSnSoSp.rA\R                  " Sq5      rC\R                  " Sr5      rD\R                  " Ss5      rESSt jrFSSu jrG " Sv Sw5      rH " Sx Sy5      rI " Sz S{5      rJSS| jrK        SS} jrLSwS~/rMgs  snn f )zNUtilities related to user defined functions (such as those passed to `apply`).    )annotationsN)bisect_left)defaultdict)get_instructions)	signature)countzip_longest)Path)TYPE_CHECKINGAnyCallableClassVarLiteral
NamedTupleUnion)LRUCache)
no_default	re_escape)IteratorMutableMapping)Set)Instruction)	NoDefault)   
   )	TypeAliasc                  L    \ rS rSr% S\S'   S\S'   S\S'   S\S'   SrS	\S
'   Srg)
StackValue+   stroperatorintoperator_arityleft_operandright_operandN
str | Nonefrom_module )__name__
__module____qualname____firstlineno____annotations__r'   __static_attributes__r(       L/home/james-whalen/.local/lib/python3.13/site-packages/polars/_utils/udfs.pyr   r   +   s#    M"K"r/   r   )exprframeseriesr   	MapTarget
StackEntry)r      )r      )r          z@MutableMapping[tuple[Callable[[Any], Any], str], BytecodeParser]_BYTECODE_PARSER_CACHE_c                     \ rS rSr% SSSSSSSS	S
SSSS.rS\S'   \" \(       a  S1OSS15      r\(       a  \	(       d  SS	SS	S.OSS	SS	S.r
S\S'   \" S5      r\" SS15      r\\-  rSSS.rS\S'   SS0rS \S!'   SSS"S#.rS\S$'   \" 1 S%k\" \5      -  \" \
5      -  \" \5      -  \-  5      r\" \5      \-  \" \5      -  \-  \-  r\" \R)                  5       5      rS&rg')(OpNames?   +&z//<<>>%*|z**-/^)
BINARY_ADD
BINARY_ANDBINARY_FLOOR_DIVIDEBINARY_LSHIFTBINARY_RSHIFTBINARY_MODULOBINARY_MULTIPLY	BINARY_ORBINARY_POWERBINARY_SUBTRACTBINARY_TRUE_DIVIDE
BINARY_XORzClassVar[dict[str, str]]BINARYCALLCALL_FUNCTIONCALL_METHOD)POP_JUMP_FORWARD_IF_FALSEPOP_JUMP_FORWARD_IF_TRUEJUMP_IF_FALSE_OR_POPJUMP_IF_TRUE_OR_POP)POP_JUMP_IF_FALSEPOP_JUMP_IF_TRUErZ   r[   CONTROL_FLOW)
LOAD_CONST
LOAD_DEREF	LOAD_FASTLOAD_GLOBALLOAD_METHOD	LOAD_ATTRra   r_   )LOAD_FAST_BORROWLOAD_SMALL_INTSIMPLIFY_SPECIALIZEDPOLARS_EXPRESSION   zClassVar[dict[str, int]]	SYNTHETIC~)UNARY_NEGATIVEUNARY_POSITIVE	UNARY_NOTUNARY>   IS_OP	BINARY_OP
COMPARE_OPCONTAINS_OPBINARY_SUBSCRr(   N)r)   r*   r+   r,   rT   r-   	frozenset
_MIN_PY311rU   
_MIN_PY312r^   LOAD_VALUESrd   LOADrg   rj   ro   setPARSEABLE_OPSMATCHABLE_OPSvaluesUNARY_VALUESr.   r(   r/   r0   r<   r<   ?   sl   #!(F$  fX/=1QRD j *-(+$'#&		
 "% #$'#&	
 *   TUK=+67I"D'&62 
 	Q+I'  'E# 
 L
e*	
l
	 i.	 		M 	 !M1CK?)KdR  U\\^,Lr/   r<   )acosacoshasinasinhatanatanhcbrtceilcoscoshdegreesexpfloorloglog10log1ppowradianssinsinhsqrttantanh)npnumpy)arccosarccosharcsinarcsinharctanarctanhr   r   r   r   r   r   r   r   r   r   r   signr   r   r   r   r   z	dt.date()zdt.day()z	dt.hour()zdt.microsecond()zdt.minute()z
dt.month()zdt.second()z	dt.year())datedayhourmicrosecondminutemonthsecondyearFloat64Int64String)floatr"   r    absendswithstr.ends_withlowerzstr.to_lowercaselstripzstr.strip_chars_startremoveprefixzstr.strip_prefixremovesuffixzstr.strip_suffixreplacestr.replacerstripzstr.strip_chars_end
startswithstr.starts_withstripzstr.strip_charstitlezstr.to_titlecaseupperzstr.to_uppercasezfillz	str.zfillr   zdt.dater   zdt.dayr   zdt.hour
isoweekdayz
dt.weekdayr   zdt.microsecondzdt.monthz	dt.secondzdt.strftimezdt.timezdt.year)r   r   strftimetimer   ra   r_   )argument_1_opnameargument_2_opnamemodule_opnameattribute_opnamemodule_nameattribute_namefunction_namemathjsonloadsdatetimestrptimeF)r   r   r   r   r   r   r   check_load_globalrd   dtz'list[dict[str, list[AbstractSet[str]]]]_MODULE_FUNCTIONSargument_1_unary_opnamer   r   r   r   r   r   str.json_decode)z	math.acosz
math.acoshz	math.asinz
math.asinhz	math.atanz
math.atanhz
json.loadsz,pl\.col\("([^"]*)"\) & pl\.col\("\1"\)\.(.+)z^(s|srs\d?|series)\.z^bool\((.+)\)$c                 z   [        [        5      R                  R                  n [        R                  " 5       nSn U(       aQ  [        R
                  " U5      nUR                  [        U 5      5      (       a  UR                  nUS-  nOO	U(       a  MQ  Uc  0 nO0 UR                  EUR                  EnAU$ ! Af = f)z7Get all local and global variables from caller's frame.r   ri   )r
   __file__parentinspectcurrentframegetfiler   r    f_backf_locals	f_globals)pkg_dirr2   nfname	variabless        r0   _get_all_caller_variablesr   -  s    8n##**G   "E	AOOE*EG--Q e =I=5>>=U__=I  s   AB7  B7 7B:c                   SU  S3nUS:X  a  U$ US:X  a  [         R                  U5      (       a  UR                  SS5      S   $ UR                  US5      nS	 H'  n[        R
                  " S
U S
3U5      (       a  M%  Us  $    [        5       n S[        U5       3n[        R
                  " S
U S
3U5      (       d  U$ M2  SU< 3n[        U5      e)z@The name of the object against which the 'map' is being invoked.pl.col("")r1   r3   .ri   r    )ssrsr3   z\br   zTODO: map_target = )	_RE_SERIES_NAMESmatchsplitr   researchr   nextNotImplementedError)col
expression
map_targetcol_exprsearch_exprnamer   msgs           r0   _get_target_namer   J  s    #b!HV	x	!!*--##C+A.. !((26*D994&^[99 + Ga	?D994&^[99 
  
~
.C
c
""r/   c                  4   \ rS rSr% SrSrS\S'   SrS\S'   SrS\S	'   \	r
S
\S'   SS jrSS jr\SS j5       r      SS jr\SS j5       rS S jrS!S jr\S"S j5       r\S#S j5       r\S$S j5       r\S#S j5       rS%S jrSSS.       S&S jjrSrg)'BytecodeParseric  zMIntrospect UDF bytecode and determine if we can rewrite as native expression.Nr&   _map_target_namezbool | None_can_attempt_rewritedict[str, Any] | None_caller_variablesz"tuple[str, str] | NoDefault | None_col_expressionc                     [        U5      nXl        X l        U R                  U5      U l        [        UU R                  US9U l	        g! [         a    [        / 5      n NTf = f)a	  
Initialize BytecodeParser instance and prepare to introspect UDFs.

Parameters
----------
function : callable
    The function/lambda to disassemble and introspect.
map_target : {'expr','series','frame'}
    The underlying target object type of the map operation.
)instructionscaller_variablesfunctionN)
r   	TypeErroriter	_function_map_target_get_param_name_param_nameRewrittenInstructionsr   _rewritten_instructions)selfr   r   original_instructionss       r0   __init__BytecodeParser.__init__k  sk    	-$4X$>! "%//9'<.!33(
$  	- %)H!	-s   A
 
A"!A"c                    [         R                  U5      (       a0  [         R                  SUS9n[         R                  U5      (       a  M0  U$ )zIDrop extraneous/implied bool (eg: `pl.col("d") & pl.col("d").dt.date()`).zpl.col("\1").\2)replstring)_RE_IMPLICIT_BOOLr   sub)r  r1   s     r0   _omit_implicit_bool"BytecodeParser._omit_implicit_bool  sA    &&t,,$((.@(ND  &&t,,r/   c                     [        U 5      n[        UR                  =n5      S:X  a"  [	        [        UR                  5       5      5      $ S$ ! [         a     gf = f)z&Return single function parameter name.Nri   )r   
ValueErrorlen
parametersr   r   keys)r   sigr  s      r0   r  BytecodeParser._get_param_name  sb    	H%C
 /:0A5 joo'()	
 	
  		s   A 
AAc                   U(       a  [        U Vs1 s H  o3R                  iM     sn5      S:  a  [        UR                  5       5      nSnU Hi  nU[	        XCR
                  5      S-
     nU[	        XCR                  5      S-
     nUS:X  a
  XtS   :X  a  MI  XVU4;  d  MR  SX   -   X'   X==   S-  ss'   UnMk     U H,  n[        R                  UR                     XR
                  '   M.     [        UR                  5       5      $ s  snf )zBInject nesting boundaries into expression blocks (as parentheses).ri   r   ())r  opnamelistr  r   offsetargvalr<   r^   sorteditems)r  expression_blockslogical_instructionsinstblock_offsetsprev_endstartends           r0   _inject_nestingBytecodeParser._inject_nesting  s      ,@A,@DKK,@ABQF+/0A0F0F0H+I0D)+m[[*QTU*UVE'M;;(ORS(STC!QJ32C+C#3<77:=N=U7U-4-2c92'*H 1 -181E1Edkk1R!++. - '--/00 Bs   Dc                    U R                   $ )z8The map target, eg: one of 'expr', 'frame', or 'series'.)r  r  s    r0   r   BytecodeParser.map_target       r/   c                *   U R                   c{  U R                  SL=(       aa    [        U R                  5      S:  =(       aB    [	        S U R                   5       5      =(       a    [        S U R                   5       5      S:H  U l         U R                   $ )a&  
Determine if we may be able to offer a native polars expression instead.

Note that `lambda x: x` is inefficient, but we ignore it because it is not
guaranteed that using the equivalent bare constant value will return the
same output. (Hopefully nobody is writing lambdas like that anyway...)
N   c              3  \   #    U  H"  nUR                   [        R                  ;   v   M$     g 7fN)r  r<   r{   .0r$  s     r0   	<genexpr>5BytecodeParser.can_attempt_rewrite.<locals>.<genexpr>  s&       < KK7#8#88 <s   *,c              3  J   #    U  H  nUR                   S :X  d  M  Sv   M     g7f)RETURN_VALUEri   N)r  r3  s     r0   r5  r6    s%       :{{n4 A :s   #	#ri   )r   r  r  r  allsumr  r,  s    r0   can_attempt_rewrite"BytecodeParser.can_attempt_rewrite  s     $$,  , 445:   $ < <    $ : : 
  %  (((r/   c                D    [         R                   " U R                  5        g)z%Print disassembled function bytecode.N)disr   r,  s    r0   r>  BytecodeParser.dis  s    r/   c                    U R                   $ )zThe function being parsed.)r   r,  s    r0   r   BytecodeParser.function  s     ~~r/   c                @    [        U R                  R                  5      $ )zDThe original bytecode instructions from the function we are parsing.)r  r  _original_instructionsr,  s    r0   r  $BytecodeParser.original_instructions  s     D00GGHHr/   c                    U R                   $ )z0The parameter name of the function being parsed.)r  r,  s    r0   
param_nameBytecodeParser.param_name  r.  r/   c                ,    [        U R                  5      $ )zEThe rewritten bytecode instructions from the function we are parsing.)r  r  r,  s    r0   rewritten_instructions%BytecodeParser.rewritten_instructions  s     D0011r/   c                   U R                   [        La\  U R                   bO  U R                   u  p#X:w  a:  [        R                  " S[	        U5       S3S[	        U5       S3U5      nX4U l         U$ SU l        U R                  c  SU l         g[        [        5      n/ nSn[        U R                  5       He  u  pxUR                  [        R                  ;   a/  U R                  US-      R                  nUR                  U5        MR  XF   R                  U5        Mg      U R!                  UR#                  5        V	V
s0 s H[  u  pU	[%        U
U R&                  U R(                  U R*                  S9R-                  UU R                  [/        [1        U5      5      S	9_M]     sn
n	U5      nS
R5                  S U 5       5      nSU;  a  SU l         gU R7                  U5      nU R(                  S:X  a;  U R
                  =nc  [9        XU R(                  5      nUR;                  SU S3U5      nX4U l         U$ s  sn
n	f ! [2         a
    SU l          gf = f)zDTranslate postfix bytecode instructions to polars expression/string.Nz
pl\.col\("z"\)r   r   r   ri   )r   r   r   r   )r   rF  depth c              3  *   #    U  H	  u  pUv   M     g 7fr2  r(   )r4  _offsetr1   s      r0   r5  /BytecodeParser.to_expression.<locals>.<genexpr>  s     L9Kt9Ks   pl.col(r3   )r   r   r   r  r   r   r  r   r  	enumerater  r  r<   r^   r  appendr)  r!  InstructionTranslatorr   r  r   to_expressionr"   boolr   joinr  r   r   )r  r   col_namer1   control_flow_blocksr#  jump_offsetidxr$  r  opsexpression_stringspolars_exprtarget_names                 r0   rU  BytecodeParser.to_expression  sd   z1d6J6J6V!11NHvv!)H"5!6c:y~.b1
 ),{$K $##'D  *$/!"4#?#?@IC{{g222"::37CJJ$++D1#077= A	!%!5!5 (;'@'@'B (C 1%()-)?)?#'#3#3!%	
 $m#'#3#3!$';"<= $ 	 (C %"( hhL9KLL K'#'D 22;?K8+#'#8#88KA"23TEUEU"VK)11HSE2DkR$'#5D E # 	#'D 	s%   H9 <A"H3
	H9 3H9 9IIsuggestion_overrideudf_overridec          
        SSK JnJn  SSKJn  U=(       d    U R                  U5      nUb  U R                  =nc  [        XU R                  5      nU=(       d    U R                  R                  =(       d    Sn	U	S:X  a  SU R                   S3n	S	U;   a  S
OSn
U R                  S:X  a  SOSu  pU" 5       (       a  SU SU	 S3SU SU
 34OSU SU	 S3SU SU
 34u  p[        R                  " SU SU SU SU 3UU" 5       S9  gg)zFGenerate warning that suggests an equivalent native polars expression.r   )find_stacklevel in_terminal_that_supports_colour)PolarsInefficientMapWarningNz...z<lambda>zlambda z: ...z
pl.col("")zHNote: in list.eval context, pl.col("") should be written as pl.element()r   r1   )expressionsExpr)r3   Seriesz	  [31m- z.map_elements(z)[0m
z	  [32m+ z[0m
z  - z)
z  + 
z6.map_elements is significantly slower than the native zc API.
Only use if you absolutely CANNOT implement your logic otherwise.
Replace this expression...
zwith this one instead:
)
stacklevel)polars._utils.variousre  rf  polars.exceptionsrg  rU  r   r   r  r   r)   r  warningswarn)r  r   rb  rc  re  rf  rg  suggested_expressionr_  	func_nameaddendumapitypeclsnamebeforeafters                  r0   rp  BytecodeParser.warn0  so   	
 	B2Md6H6H6M+#444=.t/?/? %H(?(?H5IJ&%d&6&6%7u=	  #77 [  ##v- () G 455 #;-~i[
S"#7"8	(L ;-~i[D/08*= F MMWIST[S\ ]/ (*' ,*,	= ,r/   )r   r   r   r  r   r  r  )r   Callable[[Any], Any]r   r4   returnNone)r1   r    rz  r    )r   ry  rz  r&   )r"  zdict[int, str]r#  list[Instruction]rz  zlist[tuple[int, str]])rz  r4   )rz  rV  )rz  r{  )rz  ry  )rz  r|  )rz  r&   )r   r    rz  r&   )r   r    rb  r&   rc  r&   rz  r{  )r)   r*   r+   r,   __doc__r   r-   r   r   r   r   r  r  staticmethodr  r)  propertyr   r;  r>  r   r  rF  rI  rU  rp  r.   r(   r/   r0   r   r   c  s    W#'j'(,+,/3,3:DO7D
6 
 
1)1 01 
	14    )6    I I     2 2BP +/#'99 (	9
 !9 
9 9r/   r   c                  t    \ rS rSrSr          S
S jrSS jr\SS j5       rSS jr	      SS jr
Srg	)rT  il  z>Translates Instruction bytecode to a polars expression string.c                H    U R                  X5      U l        X l        X0l        g r2  )_to_intermediate_stack_stackr   r   )r  r   r   r   r   s        r0   r  InstructionTranslator.__init__o  s!     11,K!1!r/   c                <    U R                  U R                  XU5      $ )z7Convert intermediate stack to polars expression string.)_exprr  )r  r   rF  rL  s       r0   rU  #InstructionTranslator.to_expressionz  s    zz$++s>>r/   c                   U R                   =n[        R                  ;   a  [        R                  U   $ U R                  (       a  U R                  $ US:X  a  U R                  (       a  S$ S$ US:X  a  U R                  (       a  S$ S$ U[        R
                  ;   a  [        R
                  U   $ US:X  a  gS	U S
U < 3n[        U5      e)z@Convert bytecode instruction to suitable intermediate op string.rp   is notisrs   not ininrt   replace_strictz$unexpected or unrecognised op name (z)

Please report a bug to https://github.com/pola-rs/polars/issues with the content of function you were passing to the `map` expression and the following instruction object:
)r  r<   r^   argreprr  ro   AssertionError)r$  r  r   s      r0   opInstructionTranslator.op~  s     kk!Fg&:&::''//\\<<w#{{844}$#{{844w}}$==((&# 7vh ?E FJHN  !%%r/   c                (   [        U[        5      (       Gap  [        R                  SUR                  5      nU R                  UR                  X#US-   5      nUR                  S:X  Ga  U[        R                  ;  a  UR                  S5      (       a#  UR                  S5      (       a  SOSnU SU U 3$ US   [        R                  ;   a=  USS	 R                  S5      (       a$  UR                  S5      (       a  SOSnS
U SU U 3$ UR                  [        ;   a  U[        ;   a  SnO6UR                  S:X  a$  [        R!                  SU 3U5      ["        ;   a  SnOSnU U S
U S3$ U U 3$ U R                  UR$                  X#US-   5      n	US;   a"  UR                  S:X  a  US:X  a  SOSn
U SU
 S3$ US;   a%  US:X  a  SOSn
SU;   a  U
 S
U SU	 S3$ U
 U SU	 S3$ US:X  ag  U R&                  (       d  [)        5       U l        [        U R&                  R!                  US	5      [*        5      (       d  Sn[-        U5      eU	 SU S
U S3$ US:X  a	  S
U SU	 S3$ US :X  a	  S
U S!U	 S3$ U SU SU	 3nU(       a  S
U S3$ U$ X:X  a  S"U S#3$ U$ )$z?Take stack entry value and convert to polars expression string.z\1ri   rQ  r  r   ()r   r   Nr  z).znp.r   math.)r  r  r{  r  not_z.is_znull())r  r  r  rk   rM  z.is_in(z))r  zrequire dict mappingr@   z * 2**z).cast(pl.Int64)rA   z / 2**r   r   )
isinstancer   _RE_STRIP_BOOLr  r!   r  r$   r#   r<   r~   r   r   r'   _NUMPY_MODULE_ALIASES_NUMPY_FUNCTIONS_MODULE_FUNC_TO_EXPR_NAMEget_MATH_FUNCTIONSr%   r   r   dictr   )r  valuer   rF  rL  r  e1callpfxe2r  r   r1   s                r0   r  InstructionTranslator._expr  s   eZ((##E5>>:BE..KB##q(W111}}Y//%'[[%5%5r4"$Qrd4&11!u 4 44AB9J9J99U9U%'[[%5%5r4!"2$bTF33
 ))-BB"22#))V3599E",K*+ & !U2$at1--bT{"ZZ 3 3SeaiP))e.@.@F.J!#t2D TdV622++!#t2D "9  &"WRD3 !%vbTA6
 ++111J1L.%d&<&<&@&@T&JDQQ41#66 T2$at1--4Z rd&,<==4Zrd&,<== T2$at,D*/QtfA;9T9 cU"%%r/   c                T   US;   Ga  / nU GH  nUR                  UR                  [        R                  ;   a  UR                  OUR                  [        R
                  ;   d-  [        R                  R                  UR                  5      S:X  a5  [        U R                  U5      SUR                  5       S[        USS5      S9OD[        U R                  U5      SUR                  S5      UR                  S5      [        USS5      S95        GM     US	   $ S
U< S3n[        U5      e)zITake postfix bytecode and convert to an intermediate natural-order stack.)r1   r3   ri   N_from_module)r!   r#   r$   r%   r'   r0  r  r   zTODO: z map target not yet supported.)rS  r  r<   ry   r  ro   rj   r  r   r  popgetattrr   )r  r   r   stackr$  r   s         r0   r  ,InstructionTranslator._to_intermediate_stack  s    ++&(E${{gll2 LL !KK7==8&0044T[[AQF #%)WWT]+,).*.(/nd(K (%)WWT]+,).2*/))B-(/nd(K %2 8O zn$BC!#&&r/   )r   r   r  N)
r   r|  r   r   r   ry  r   r4   rz  r{  )r   r    rF  r    rL  r"   rz  r    )r$  r   rz  r    )
r  r5   r   r    rF  r    rL  r"   rz  r    )r   r|  r   r4   rz  r5   )r)   r*   r+   r,   r}  r  rU  r~  r  r  r  r.   r(   r/   r0   rT  rT  l  sw    H	"'	" 0	" '		"
 	" 
	"? & &.AF#'-#';D#'	#'r/   rT  c                  (   \ rS rSrSr\" / SQ5      r        SS jrSS jrSS jr	SS jr
SS	.         SS
 jjrSS jrSS jr      SS jr      SS jr      SS jr\    SS j5       r\SS j5       r        SS jrSrg)r  i  aE  
Standalone class that applies Instruction rewrite/filtering rules.

This significantly simplifies subsequent parsing by injecting
synthetic POLARS_EXPRESSION ops into the Instruction stream for
easy identification/translation, and separates the parsing logic
from the identification of expression translation opportunities.
)	COPYCOPY_FREE_VARS	NOT_TAKENPOP_TOPPRECALL	PUSH_NULLRESUMEr8  TO_BOOLc                z   X l         X0l        [        U5      U l        / nU R	                  U R                  5       Hh  nUR
                  U R                  ;  d  M  UR
                  [        R                  ;  a	  / U l	          g U R                  U5      nUR                  U5        Mj     U R                  U5      U l	        g r2  )r   r   r  rC  _unpack_superinstructionsr  _ignored_opsr<   r|   r  _update_instructionrS  _rewrite)r  r   r   r   normalised_instructionsr$  upgraded_insts          r0   r  RewrittenInstructions.__init__  s     "!1&*<&8#"$2243N3NOD{{$"3"33;;g&;&;;35D0 $ 8 8 >'..}= P (,}}5L'M$r/   c                ,    [        U R                  5      $ r2  )r  r  r,  s    r0   __len__RewrittenInstructions.__len__-  s    4//00r/   c                ,    [        U R                  5      $ r2  )r   r  r,  s    r0   __iter__RewrittenInstructions.__iter__0  s    D0011r/   c                     U R                   U   $ r2  )r  )r  items     r0   __getitem__!RewrittenInstructions.__getitem__3  s    ++D11r/   F)is_attrc               <   [        U5      U=(       d    / p5X-   nU(       a;  U R                  XfS-    =n(       a#  US   R                  [        R                  ;   a  / $ U R                  X n[        U5      U:X  a#  [        S [        XU5       5       5      (       a  U$ / $ )ay  
Check if a sequence of Instructions matches the specified ops/argvals.

Parameters
----------
idx
    The index of the first instruction to check.
opnames
    The full opname sequence that defines a match.
argvals
    Associated argvals that must also match (in same position as opnames).
is_attr
    Indicate if the match represents pure attribute access (cannot be called).
ri   r   c              3     #    U  H8  u  pnUR                   U;   =(       a    US L =(       d    UR                  U;   v   M:     g 7fr2  )r  r  )r4  r$  match_opnamesmatch_argvals       r0   r5  1RewrittenInstructions._matches.<locals>.<genexpr>V  sK      7
61\ KK=( F%D)DF6s   A A)r  _instructionsr  r<   rU   r9  r	   )	r  r[  opnamesargvalsr  n_required_ops
idx_offsettrailing_instr   s	            r0   _matchesRewrittenInstructions._matches6  s    , #&g,2)
"&"4"4Zq."QQQa ''7<<7I))#9|.3 7
 6Aw67
 4
 4
  	r/   c                  ^^^ Xl         / mSmT[        U R                   5      :  a  U R                   T   SsnmUR                  [        R                  ;  dH  [        UUU4S jU R                  U R                  U R                  U R                  4 5       5      (       d  TR                  U5        TT=(       d    S-  mT[        U R                   5      :  a  M  T$ )z
Apply rewrite rules, potentially injecting synthetic operations.

Rules operate on the instruction stream and can examine/modify
it as needed, pushing updates into "updated_instructions" and
returning True/False to indicate if any changes were made.
r   ri   c              3  :   >#    U  H  nU" TT5      =mv   M     g 7fr2  r(   )r4  map_rewriter[  	incrementupdated_instructionss     r0   r5  1RewrittenInstructions._rewrite.<locals>.<genexpr>m  s,      	:$K *#/CDDD$s   )r  r  r  r<   ry   any_rewrite_functions_rewrite_methods_rewrite_builtins_rewrite_attrsrS  )r  r   r$  r[  r  r  s      @@@r0   r  RewrittenInstructions._rewrite`  s     *24C**++"005qOD){{',,.c 	: ++))**''$	: 	7 	7 %++D19>!C C**++ $#r/   c                    U R                  US1S1/S[        /SS9=n(       a>  US   n[        UR                     nUR                  SXUS9nUR	                  US	   U/5        [        U5      $ )
zDReplace python attribute lookup with synthetic POLARS_EXPRESSION op.ra   rd   NT)r  r  r  ri   rh   r  r  r  r   )r  _PYTHON_ATTRS_MAPr  _replaceextendr  )r  r[  r  matching_instructionsr$  	expr_namepxs          r0   r  $RewrittenInstructions._rewrite_attrs{  s    $(MM!][M2,-	 %2 %
 
  
 )+D)$++6I*9  B !'')>q)A2(FG())r/   c                `   U R                  US1SS1[        R                  /[        /S9=n(       as  USS u  pEUR                  =n[
        ;   a  [
        U   nSU S3nUR                  S	UUUR                  S
9nUR                  UR                  S9n	UR                  X45        [        U5      $ )zEReplace builtin function calls with a synthetic POLARS_EXPRESSION op.rb   ra   r_   r  r  Nr0  cast(pl.r  rh   r  r  r  r  r  )
r  r<   rU   _PYTHON_BUILTINSr  _PYTHON_CASTS_MAPr  r  r  r  )
r  r[  r  r  inst1inst2r  dtyper  operands
             r0   r  'RewrittenInstructions._rewrite_builtins  s     %)MM#_{L&A7<<P%& %2 %
 
  

 1!4LE,,&+<<)&1#E7!,*||	   B nnELLn9G ''6())r/   c           	       ^ S GH  n[          GH  nU(       a  UR                  SS5      (       d      gU(       a$  SS1/US   QUS   QUS	   Q[        R                  PO-SS1/US
   QUS   QUS   QUS   QUS	   Q[        R                  PnUS   nU R	                  UUU(       a  / US   QO/ US   QUS   QUS   QS9=n(       d  M  [        US   5      nUUSU-    u  pnU(       a  U R                  (       d  [        5       U l        U	R                  =oR                  ;  a  GM  U R                  U   R                  m[        U4S jU 5       5      (       d  GMN  [        R                  T SU 3U5      nOU	R                  S:X  a  SnOU	R                  S:X  aV  XxS-      R                  nSU S3nU R                  U	R                  US   R                  U5      (       d  [        U5      s  s  $ OJU	R                  S:X  a.  [        R                  SU
R                   3U
R                  5      nOU
R                  nU(       a  U
OUnU	R                  SUUUR                  S9nU(       a  SOU	R                  =(       d    SUl        UR                  U	R                  S9nUR!                  US   (       a  UUSU-      U4OUU45        [        U5      s  s  $    GM     g)z=Replace function calls with a synthetic POLARS_EXPRESSION op.)FTr   Tr   rb   r`   r   r   r   r   r   r   r   r   r  r   c              3  .   >#    U  H
  nTU;   v   M     g 7fr2  r(   )r4  mr   s     r0   r5  ;RewrittenInstructions._rewrite_functions.<locals>.<genexpr>  s     &R>aq(8>s   r   r   r   r   zstr.to_datetime(format="r   r   r  rh   r  Nr  )r   r  r<   rU   r  r  r   r   r  r*   r  r  _is_stdlib_datetimer  r  r  r  )r  r[  r  check_globalsfunction_kindr  module_aliasesr  attribute_countr  r  inst3r  fmt	swap_instr  r  r   s                    @r0   r  (RewrittenInstructions._rewrite_functions  s{    +M!2!2 ):):;NPT)U)U % '5&':; ''@A '':;	
   '5&7 ''9: '':;	
 ''@A '':;   & "/}!=,0MM# %&7&}5&'78 '7 -: - (  '*-8H*I&JO*?'!o*=+'E% %#555N5PD2).5I>T>TT$*.*@*@*K*V*VK#&&R>&R#R#R ((A(E(E#.-q <i)I /$5	33a4GHOO&>se2$F	#77!LL1!4;;+    $''<#==  /$=$A$A#ELL>2ELL%	 %*LL	 *7EI2( )(//	 ( B /<d%,,BVRVBO'000EG(// ))BC	 $1!o2EF &r] 455y "3 +~ r/   c           	        [         (       a  [        R                  OS1nU R                  UUS1[        R                  /[
        /S9=(       d&    U R                  UU[        R                  /[
        /S9=n(       a  US   n[
        UR                     nUS   R                  S:X  as  US   R                  n[        U[        5      (       aE  US;   a?  SU;   a  SOS	u  pS
R                  S U 5       5      n
SU;   a  SOSnSU U SU
 SU	 U S3	nO
USU< S3-  nUR                  SXfS9nUR                  U5        GO%U R                  UUS1S1S1[        R                  /[
        /S9=(       d*    U R                  UUS1S1[        R                  /[
        /S9=n(       a  US   n[
        UR                     nUS[        U5      S-
    Vs/ s H  nUR                  PM     nnUS:X  a8  [        U5      S:X  a  Uu  nnnUSU< SU< SU S3-  nO0Uu  nnSU< SU< S3nOUSSR                  S U 5       5       S3-  nUR                  SXfS9nUR                  U5        [        U5      $ s  snf )z@Replace python method calls with synthetic POLARS_EXPRESSION op.rc   r_   r  r   ri   )r   r   starts)rG   r   )r   $rD   c              3  8   #    U  H  n[        U5      v   M     g 7fr2  )r   r4  vs     r0   r5  9RewrittenInstructions._rewrite_methods.<locals>.<genexpr>)  s     !D1)A,,   '"zstr.contains(rr  r  rh   r  r   r   ,z,n=z,literal=True)zstr.replace_all(c              3  8   #    U  H  n[        U5      v   M     g 7fr2  )reprr  s     r0   r5  r  V  s     $ClT!WWlr	  )rw   r<   rd   r  rU   _PYTHON_METHODS_MAPr  r  r  tuplerW  r  rS  r  )r  r[  r  rc   r  r$  r1   param_valuer  endsrxqr  iparam_valuesoldnewr   s                     r0   r  &RewrittenInstructions._rewrite_methods  s    ,6:g''M? MM$|ngllC,-    MM$gll3,-  
  
 )+D&t{{3D$Q'..,>3A6==k511d ? 7 19D0@9iLF!D!DDB"k1sA+A3vhat1TF1#QGDaa00D&9$UB ''+ MM!N!N!NLL --  
  MM$|n|ngllS,-  
" 
* )+D&t{{3D /q37L3MPQ3QRRA R   }$|$)&2OCeawawc%GGD+HC-cWAcWNKD!CHH$Cl$CCDAFF&9$UB ''+())#s   I,c              #     #    U  HO  nUR                   S;   a8  S H0  nUR                  SUR                  U   UR                  U   S9v   M2     MK  Uv   MQ     g7f)z<Expand known 'superinstructions' into their component parts.)LOAD_FAST_LOAD_FAST!LOAD_FAST_BORROW_LOAD_FAST_BORROW)r   ri   ra   r  N)r  r  r  )r   r$  r[  s      r0   r  /RewrittenInstructions._unpack_superinstructions]  sf     
 !D{{   "C--*#{{3/ $C 0 (   " 
 !s   AAc                   [         (       dK  U R                  [        R                  ;   a-  U R	                  [        R                  U R                     SS9n U $ [
        (       a  U R                  =n[        R                  ;   aQ  S[        R                  U R                     0nUS:X  a  [        U R                  5      US'   U R                  " S
0 UD6n U $ US:X  a   U R                  S:X  a  U R	                  SSS	9n U $ )zFUpdate/modify specific instructions to simplify multi-version parsing.rq   )r  r  r  rf   r  z[]rt   r   )r  r  r(   )
rv   r  r<   rT   r  
_MIN_PY314rg   r    r  r  )r$  r  updated_paramss      r0   r  )RewrittenInstructions._update_instructionp  s     zdkkW^^;==t{{3" ! D"  Z++%'*F*FF #+G,H,H,U!V--03DKK0@N9-}}6~6 	 ;&4<<4+?}}OR}Hr/   c                   U R                   (       d  [        5       U l         U R                   nUS:H  =(       a!    UR                  U5      [        R                  L =(       d#    US:H  =(       a    UR                  U5      [        L $ )Nr   ri   )r   r   r  r   )r  r   r   r  varss        r0   r  )RewrittenInstructions._is_stdlib_datetime  sk     %%%>%@D"%%q QTXXm%<@Q@Q%QJ"Htxx'<'H	Jr/   )r   r   r  rC  r  N)r   Iterator[Instruction]r   ry  r   r   rz  r{  )rz  r"   )rz  r%  )r  r   rz  r   )
r[  r"   r  zlist[AbstractSet[str]]r  z5list[AbstractSet[Any] | dict[Any, Any] | None] | Noner  rV  rz  r|  )r   r|  rz  r|  )r[  r"   r  r|  rz  r"   )r   r|  rz  r%  )r$  r   rz  r   )r   r    r   r    r  r"   rz  rV  )r)   r*   r+   r,   r}  ru   r  r  r  r  r  r  r  r  r  r  r  r~  r  r  r  r.   r(   r/   r0   r  r    s`    
	
LN+N 'N 0	N
 
N,122 (( (	(
 G( ( 
(T$6*"**.?*	*4cc.?c	cJP*P*.?P*	P*d '	 $  .J J/2JEHJ	Jr/   r  c                    U R                   R                  nU R                  nUS:X  a  U[        ;   a  SU S34$ US:X  ap  U[
        ;   a  SS[
        U    S34$ U[        ;   a4  SS	KnU [        X25      L a   [        R                  S
U 3U5      nSU S34$  gUS:X  a  SS	KnXR                  L a  gg! [         a     gf = f)zIIdentify translatable calls that aren't wrapped inside a lambda/function.)r   r   r   r   r  builtinsr  r  r   Nr  r   r   )r   zstr.json_decode())	__class__r*   r)   AttributeErrorr  r  r  r   r  r  r  r   r   )r   func_modulerr  r   r  r   s         r0   _raw_function_metar+    s    ((33%%	
 g)/?"?	{"%%% 

	"))*;I*F)GqIII/)7433599I;'	 )B///	 4  '!::%23  s   "B2 2
B?>B?c                   US:X  a  Sn[        U5      eU=(       a    US   nU(       d  US:w  a  g[        R                  X4=n5      =nc  [        X5      nU[        U'   UR	                  5       (       a  UR                  U5        g[        U 5      u  pxU(       aJ  U(       aB  [        XHU5      n	Xl        U R                  n
UR                  UU	 SU 3US:X  a  U
OU SU
 3S9  ggg)	a  
Generate `PolarsInefficientMapWarning` on poor usage of a `map` function.

Parameters
----------
function
    The function passed to `map`.
columns
    The column name(s) of the original object; in the case of an `Expr` this
    will be a list of length 1, containing the expression's root name.
map_target
    The target of the `map` call. One of `"expr"`, `"frame"`, or `"series"`.
r2   z"TODO: 'frame' map-function parsingr   r   Nr   r'  ra  )
r   r:   r  r   r;  rp  r+  r   r   r)   )r   columnsr   r   r   keyparsermodule
suggestionr_  fns              r0   warn_on_inefficient_mapr3    s      W2!#&& %71:C3"9 *--h5K.KcLLU5'-$!!##C 09j*3JGK&1#""BKK'2m1ZL$A#)Z#7Rxq=M  	 !6r/   r3  )rz  zdict[str, Any])r   r    r   r    r   r    rz  r    )r   ry  rz  ztuple[str, str])r   ry  r-  z	list[str]r   r4   rz  r{  )Nr}  
__future__r   r   r>  r   r   sysro  bisectr   collectionsr   r   r   	itertoolsr   r	   pathlibr
   typingr   r   r   r   r   r   r   polars._utils.cacher   rm  r   r   collections.abcr   r   r   AbstractSetr   r   version_infor   typing_extensionsr   r4   r-   r    r5   rv   rw   r  r:   r<   ru   r  r  r  r  r  r  r  rd   r   rz   ro   r  compiler  r   r  r   r   r   rT  r  r+  r3  __all__)kindunarys   00r0   <module>rD     s   T "  
  	 
   #    (    ) 782/
7"$/# # 89	9 9c:o.
I .(
7C,,7
7C,,7
 RL   
9- 9-z : "/2  > %	  (I ./5'9   %	
 & & } # #    [ I  
8!" I#$ ,%& #'( 1 >  +L9:!++,-.*+  +L9:!++,z)*  +m_!++,z")  +m_+n-!++,#~%,"	  +m_+n-&-$../#T*+&<.%,"	[7> : 7x "!w}}%&+ /t.&.+ /!  #  JJNO ::56 -.:#2F FRP' P'fQJ QJhB,",-6,DM,	,^ 6
7Us   '/K