
    |hѭ              !          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\5      r\" \	R                  5       " S	 S
\5      5       r\" \	R"                  5      \" \	R$                  5       " S S\5      5       5       r " S S\5      r " S S\5      r\" \	R,                  5      \" \	R.                  5       " S S\5      5       5       r\" \	R2                  5      \" \	R4                  5      \" \	R6                  5      \" \	R8                  5      \" \	R:                  5      \" \	R<                  5      \" \	R>                  5      \" \	R@                  5      \" \	RB                  5      \" \	RD                  5      \" \	RF                  5      \" \	RH                  5      \" \	RJ                  5      \" \	RL                  5      \" \	RN                  5      \" \	RP                  5      \" \	RR                  5      \" \	RT                  5      \" \	RV                  5      \" \	RX                  5      \" \	RZ                  5      \" \	R\                  5      \" \	R^                  5      \" \	R`                  5      \" \	Rb                  5      \" \	Rd                  5      \" \	Rf                  5      \" \	Rh                  5       " S S\5      5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       r5\" \	Rl                  5       " S S\55      5       r7\" \	Rp                  5      \" \	Rr                  5       " S S\5      5       5       r:\" \	Rv                  5       " S S\5      5       r<\" \	Rz                  5       " S S\5      5       r>\" \	R~                  5       " S S\>5      5       r@\" \	R                  5       " S S \>5      5       rB\" \	R                  5       " S! S"\5      5       rD\" \	R                  5      \" \	R                  5      \" \	R                  5       " S# S$\5      5       5       5       rH " S% S&\5      rI " S' S(\I5      rJ\" \	R                  5       " S) S*\J5      5       rL\" \	R                  5      \" \	R                  5      \" \	R                  5      \" \	R                  5      \" \	R                  5       " S+ S,\J5      5       5       5       5       5       rR\" \	R                  5       " S- S.\J5      5       rT\" \	R                  5       " S/ S0\J5      5       rV\" \	R                  5       " S1 S2\J5      5       rX\" \	R                  5       " S3 S4\J5      5       rZ\" \	R                  5       " S5 S6\J5      5       r\\" \	R                  5       " S7 S8\J5      5       r^\" \	R                  5       " S9 S:\J5      5       r`\" \	R                  5       " S; S<\J5      5       rb\" \	R                  5       " S= S>\J5      5       rd\" \	R                  5      \" \	R                  5      \" \	R                  5      \" \	R                  5      \" \	R                  5      \" \	R                  5       " S? S@\J5      5       5       5       5       5       5       rk\" \	R                  5       " SA SB\J5      5       rm\" \	R                  5       " SC SD\k5      5       ro\" \	R                  5       " SE SF\J5      5       rq\" \	R                  5       " SG SH\I5      5       rs\" \	R                  5       " SI SJ\5      5       rt\" \	R                  5       " SK SL\5      5       ru " SM SN\J5      rv " SO SP\J5      rw\" \	R                  5       " SQ SR\J5      5       rx\" \	R                  R                  5      \" \	R                  5       " SS ST\J5      5       5       r|\" \	R                  5      \" \	R                  5       " SU SV\5      5       5       r\" \	GR                   5       " SW SX\J5      5       r\" \	GR                  5       " SY SZ\J5      5       r\" \	GR                  5       " S[ S\\J5      5       r\" \	GR                  5       " S] S^\J5      5       r\" \	GR                  5       " S_ S`\I5      5       r\" \	GR                  5       " Sa Sb\J5      5       r\" \	GR                  5       " Sc Sd\J5      5       r\" \	GR                  5       " Se Sf\J5      5       r\" \	GR                  5      Sg 5       r\" \	GR                  5      Sh 5       r\" \	GR                   5      Si 5       r\" \	GR$                  5       " Sj Sk\J5      5       r\" \	GR(                  5       " Sl Sm\I5      5       r\" \	GR,                  5       " Sn So\J5      5       r " Sp Sq\J5      rgr)s    )partial)deque)ir)register_default)typescgutils)numpy_supportc                       \ rS rSrSrS r\S 5       rS rS r	S r
S rS	 rS
 rS rS rS rS rSS jrS rS rS rS rS rS rS rS rS rS rS rSrg)	DataModel   a  
DataModel describe how a FE type is represented in the LLVM IR at
different contexts.

Contexts are:

- value: representation inside function body.  Maybe stored in stack.
The representation here are flexible.

- data: representation used when storing into containers (e.g. arrays).

- argument: representation used for function argument.  All composite
types are unflattened into multiple primitive types.

- return: representation used for return argument.

Throughput the compiler pipeline, a LLVM value is usually passed around
in the "value" representation.  All "as_" prefix function converts from
"value" representation.  All "from_" prefix function converts to the
"value"  representation.

c                     Xl         X l        g N_dmm_fe_type)selfdmmfe_types      U/home/james-whalen/.local/lib/python3.13/site-packages/numba/core/datamodel/models.py__init__DataModel.__init__"   s    	    c                     U R                   $ r   )r   r   s    r   r   DataModel.fe_type&   s    }}r   c                     [        U 5      er   NotImplementedErrorr   s    r   get_value_typeDataModel.get_value_type*       !$''r   c                 "    U R                  5       $ r   r   r   s    r   get_data_typeDataModel.get_data_type-       ""$$r   c                 "    U R                  5       $ )z8Return a LLVM type or nested tuple of LLVM type
        r#   r   s    r   get_argument_typeDataModel.get_argument_type0   s     ""$$r   c                 "    U R                  5       $ r   r#   r   s    r   get_return_typeDataModel.get_return_type5   r&   r   c                     [        U 5      er   r   r   buildervalues      r   as_dataDataModel.as_data8   r!   r   c                     [        U 5      e)zH
Takes one LLVM value
Return a LLVM value or nested tuple of LLVM value
r   r.   s      r   as_argumentDataModel.as_argument;       
 "$''r   c                     [        U 5      er   r   r.   s      r   	as_returnDataModel.as_returnB   r!   r   c                     [        U 5      er   r   r.   s      r   	from_dataDataModel.from_dataE   r!   r   c                     [        U 5      e)zI
Takes a LLVM value or nested tuple of LLVM value
Returns one LLVM value
r   r.   s      r   from_argumentDataModel.from_argumentH   r6   r   c                     [        U 5      er   r   r.   s      r   from_returnDataModel.from_returnO   r!   r   Nc                 >    U R                  XR                  X#S95      $ )zf
Load value from a pointer to data.
This is the default implementation, sufficient for most purposes.
)align)r;   loadr   r/   ptrrD   s       r   load_from_data_pointer DataModel.load_from_data_pointerR   s    
 ~~g||C|'EFFr   c                     / $ )z
Traverse contained members.
Returns a iterable of contained (types, getters).
Each getter is a one-argument function accepting a LLVM value.
 r   r/   s     r   traverseDataModel.traverseY   s	     	r   c                 f    U R                  5        Vs/ s H  oR                  U   PM     sn$ s  snf )z5
Recursively list all models involved in this model.
)traverse_typesr   r   ts     r   traverse_modelsDataModel.traverse_modelsa   s-     '+&9&9&;<&;		!&;<<<s   .c                 D   U R                   /n[        U /5      n[        U5      S:  aw  UR                  5       nUR	                  5        HB  nUR                   U;  d  M  UR                  U5        UR
                  " UR                   5        MD     [        U5      S:  a  Mw  U$ )z=
Recursively list all frontend types involved in this model.
r   )r   r   lenpopleftinner_modelsappend)r   r   queuedmi_dms        r   rP   DataModel.traverse_typesg   s}     tf%j1nB)==-LL&LL/ * %j1n r   c                     / $ )z
List all *inner* models.
rK   r   s    r   rX   DataModel.inner_modelsw   s	     	r   c                     g)zg
Returns the MemInfo object or None if it is not tracked.
It is only defined for types.meminfo_pointer
NrK   r.   s      r   get_nrt_meminfoDataModel.get_nrt_meminfo}   s    
 r   c                     gNFrK   r   s    r   has_nrt_meminfoDataModel.has_nrt_meminfo   s    r   c                 B    [        S U R                  5        5       5      $ )zA
Recursively check all contained types for need for NRT meminfo.
c              3   @   #    U  H  oR                  5       v   M     g 7fr   )re   ).0models     r   	<genexpr>1DataModel.contains_nrt_meminfo.<locals>.<genexpr>   s     O8Nu((**8Ns   )anyrS   r   s    r   contains_nrt_meminfoDataModel.contains_nrt_meminfo   s     O8L8L8NOOOr   c                 0    [        U 5      U R                  4$ r   )typer   r   s    r   _compared_fieldsDataModel._compared_fields   s    T
DMM**r   c                 F    [        [        U R                  5       5      5      $ r   )hashtuplerr   r   s    r   __hash__DataModel.__hash__   s    E$//1233r   c                 t    [        U 5      [        U5      L a!  U R                  5       UR                  5       :H  $ grd   )rq   rr   r   others     r   __eq__DataModel.__eq__   s2    :e$((*e.D.D.FFFr   c                 .    U R                  U5      (       + $ r   )r|   rz   s     r   __ne__DataModel.__ne__   s    ;;u%%%r   r   r   )__name__
__module____qualname____firstlineno____doc__r   propertyr   r   r$   r(   r+   r1   r4   r8   r;   r>   rA   rH   rM   rS   rP   rX   ra   re   rn   rr   rw   r|   r   __static_attributes__rK   r   r   r   r      s    ,   (%%
%((((((G= P+4&r   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	OmittedArgDataModel   z
A data model for omitted arguments.  Only the "argument" representation
is defined, other representations raise a NotImplementedError.
c                 .    [         R                  " / 5      $ r   )r   LiteralStructTyper   s    r   r   "OmittedArgDataModel.get_value_type   s    ##B''r   c                     gNrK   rK   r   s    r   r(   %OmittedArgDataModel.get_argument_type       r   c                     gr   rK   r   r/   vals      r   r4   OmittedArgDataModel.as_argument   r   r   c                     US:X  d   U5       eg r   rK   r   s      r   r>   !OmittedArgDataModel.from_argument   s    by#yr   rK   N)
r   r   r   r   r   r   r(   r4   r>   r   rK   r   r   r   r      s    
(r   r   c                       \ rS rSr\R
                  " S5      r\R
                  " S5      rS rS r	S r
S rS rS	 rS
 rS rS rS rSrg)BooleanModel         c                     U R                   $ r   )	_bit_typer   s    r   r   BooleanModel.get_value_type   s    ~~r   c                     U R                   $ r   )
_byte_typer   s    r   r$   BooleanModel.get_data_type       r   c                 "    U R                  5       $ r   r$   r   s    r   r+   BooleanModel.get_return_type       !!##r   c                 "    U R                  5       $ r   r   r   s    r   r(   BooleanModel.get_argument_type   r   r   c                 @    UR                  X R                  5       5      $ r   )zextr$   r.   s      r   r1   BooleanModel.as_data   s    ||E#5#5#788r   c                 $    U R                  X5      $ r   r1   r.   s      r   r4   BooleanModel.as_argument       ||G++r   c                 $    U R                  X5      $ r   r   r.   s      r   r8   BooleanModel.as_return   r   r   c                    U R                  5       n[        R                  " X5      nUR                  SX"R	                  S5      5      nUR                  U5       u  pgU   UR                  U" S5      U5        S S S 5        U   UR                  U" S5      U5        S S S 5        S S S 5        UR                  U5      $ ! , (       d  f       NJ= f! , (       d  f       N8= f! , (       d  f       NA= f)Nz==r   r   )r   r   alloca_onceicmp_unsignedrq   if_elsestorerE   )r   r/   r0   ty	resallocacondthen	otherwises           r   r;   BooleanModel.from_data   s      "''4	$$T5**Q-@__T"&7tbeY/ beY/  #
 ||I&&	  #"s<   CB;7
CCC;
C		C
C	C
C+c                 $    U R                  X5      $ r   r;   r.   s      r   r>   BooleanModel.from_argument       ~~g--r   c                 $    U R                  X5      $ r   r   r.   s      r   rA   BooleanModel.from_return   r   r   rK   N)r   r   r   r   r   IntTyper   r   r   r$   r+   r(   r1   r4   r8   r;   r>   rA   r   rK   r   r   r   r      sP     

1IAJ$$9,,	'..r   r   c                   V   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rSrU =r$ )PrimitiveModel   zRA primitive type can be represented natively in the target in all
usage contexts.
c                 8   > [         [        U ]  X5        X0l        g r   )superr   r   be_typer   r   r   r   	__class__s       r   r   PrimitiveModel.__init__   s    nd,S:r   c                     U R                   $ r   r   r   s    r   r   PrimitiveModel.get_value_type       ||r   c                     U$ r   rK   r.   s      r   r1   PrimitiveModel.as_data       r   c                     U$ r   rK   r.   s      r   r4   PrimitiveModel.as_argument   r   r   c                     U$ r   rK   r.   s      r   r8   PrimitiveModel.as_return   r   r   c                     U$ r   rK   r.   s      r   r;   PrimitiveModel.from_data   r   r   c                     U$ r   rK   r.   s      r   r>   PrimitiveModel.from_argument   r   r   c                     U$ r   rK   r.   s      r   rA   PrimitiveModel.from_return   r   r   r   )r   r   r   r   r   r   r   r1   r4   r8   r;   r>   rA   r   __classcell__r   s   @r   r   r      s5     r   r   c                   T    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)
ProxyModel   z:
Helper class for models which delegate to another model.
c                 6    U R                   R                  5       $ r   )_proxied_modelr   r   s    r   r   ProxyModel.get_value_type  s    ""1133r   c                 6    U R                   R                  5       $ r   )r   r$   r   s    r   r$   ProxyModel.get_data_type  s    ""0022r   c                 6    U R                   R                  5       $ r   )r   r+   r   s    r   r+   ProxyModel.get_return_type
  s    ""2244r   c                 6    U R                   R                  5       $ r   )r   r(   r   s    r   r(   ProxyModel.get_argument_type  s    ""4466r   c                 8    U R                   R                  X5      $ r   )r   r1   r.   s      r   r1   ProxyModel.as_data  s    ""**7::r   c                 8    U R                   R                  X5      $ r   )r   r4   r.   s      r   r4   ProxyModel.as_argument      ""..w>>r   c                 8    U R                   R                  X5      $ r   )r   r8   r.   s      r   r8   ProxyModel.as_return      "",,W<<r   c                 8    U R                   R                  X5      $ r   )r   r;   r.   s      r   r;   ProxyModel.from_data  r   r   c                 8    U R                   R                  X5      $ r   )r   r>   r.   s      r   r>   ProxyModel.from_argument  s    ""00@@r   c                 8    U R                   R                  X5      $ r   )r   rA   r.   s      r   rA   ProxyModel.from_return  r   r   rK   N)r   r   r   r   r   r   r$   r+   r(   r1   r4   r8   r;   r>   rA   r   rK   r   r   r   r      s:    4357;?==A?r   r   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )	EnumModeli#  z9
Enum members are represented exactly like their values.
c                 l   > [         [        U ]  X5        UR                  UR                  5      U l        g r   )r   r   r   lookupdtyper   r   r   r   r   s      r   r   EnumModel.__init__)  s'    i'5!jj7r   )r   r   r   r   r   r   r   r   r   r   s   @r   r   r   #  s    8 8r   r   c                   l   ^  \ rS rSrSr\R                  " S5      R                  5       rU 4S jr	Sr
U =r$ )OpaqueModeli.  z
Passed as opaque pointers
r   c                 F   > U R                   n[        [        U ]  XU5        g r   )	_ptr_typer   r  r   r   s       r   r   OpaqueModel.__init__P  s    ..k4)#@r   rK   )r   r   r   r   r   r   r   
as_pointerr  r   r   r   r   s   @r   r  r  .  s,    : 

1((*IA Ar   r  c                   &    \ rS rSrS rS rS rSrg)MemInfoModeliU  c                 b    U R                   R                  U R                  R                  5      /$ r   )r   r   r   r   r   s    r   rX   MemInfoModel.inner_modelsX  s$    		  !4!4566r   c                     g)NTrK   r   s    r   re   MemInfoModel.has_nrt_meminfo[  s    r   c                     U$ r   rK   r.   s      r   ra   MemInfoModel.get_nrt_meminfo^  r   r   rK   N)r   r   r   r   rX   re   ra   r   rK   r   r   r
  r
  U  s    7r   r
  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )IntegerModelib  c                 n   > [         R                  " UR                  5      n[        [        U ]  XU5        g r   )r   r   bitwidthr   r  r   r   s       r   r   IntegerModel.__init__e  s(    **W--.lD*3Ar   rK   r   r   r   r   r   r   r   r   s   @r   r  r  b  s    B Br   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
FloatModelij  c                    > U[         R                  :X  a  [        R                  " 5       nO5U[         R                  :X  a  [        R
                  " 5       nO[        U5      e[        [        U ]'  XU5        g r   )
r   float32r   	FloatTypefloat64
DoubleTyper   r   r  r   r   s       r   r   FloatModel.__init__l  sM    emm#llnG%mmoG%g..j$(w?r   rK   r  r   s   @r   r  r  j  s    @ @r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )PointerModeliv  c                    > UR                  UR                  5      U l        U R                  R                  5       U l        U R                  R                  5       n[        [        U ]#  XU5        g r   )	r   r   _pointee_modelr$   _pointee_be_typer  r   r   r   r   s       r   r   PointerModel.__init__x  sT    !jj7 $ 3 3 A A C''224lD*3Ar   )r#  r"  r  r   s   @r   r   r   v  s    B Br   r   c                   0    \ rS rSrS rS rS rSS jrSrg)	EphemeralPointerModeli  c                     U R                   $ r   )r#  r   s    r   r$   #EphemeralPointerModel.get_data_type  s    $$$r   c                 Z    UR                  U5      nU R                  R                  X5      $ r   )rE   r"  r1   r.   s      r   r1   EphemeralPointerModel.as_data  s'    U#""**7::r   c                     [        S5      eNz$use load_from_data_pointer() insteadr   r.   s      r   r;   EphemeralPointerModel.from_data      !"HIIr   Nc                 @    UR                  X R                  5       5      $ r   bitcastr   rF   s       r   rH   ,EphemeralPointerModel.load_from_data_pointer      s$7$7$9::r   rK   r   )	r   r   r   r   r$   r1   r;   rH   r   rK   r   r   r&  r&    s    %;J;r   r&  c                   D   ^  \ rS rSrU 4S jrS rS rS rSS jrSr	U =r
$ )	EphemeralArrayModeli  c                    > [         [        U ]  X5        [        R                  " U R
                  U R                  R                  5      U l        g r   )	r   r5  r   r   	ArrayTyper#  r   count
_data_typer   s      r   r   EphemeralArrayModel.__init__  s8    !41#?,,t'<'<'+}}':':<r   c                     U R                   $ r   r9  r   s    r   r$   !EphemeralArrayModel.get_data_type  r   r   c           
          [        U R                  R                  5       Vs/ s H)  nUR                  [        R
                  " XU5      5      PM+     nn[        R                  " X5      $ s  snf r   )ranger   r8  rE   r   gep_inbounds
pack_array)r   r/   r0   ivaluess        r   r1   EphemeralArrayModel.as_data  s]     !4!4575a ,,w33GAFG5 	 7!!'227s   0A*c                     [        S5      er,  r   r.   s      r   r;   EphemeralArrayModel.from_data  r.  r   c                 @    UR                  X R                  5       5      $ r   r0  rF   s       r   rH   *EphemeralArrayModel.load_from_data_pointer  r3  r   r<  r   )r   r   r   r   r   r$   r1   r;   rH   r   r   r   s   @r   r5  r5    s"    <
3
J; ;r   r5  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ExternalFuncPointerModeli  c                 f  > UR                   nUR                  UR                  5      R                  5       nUR                   Vs/ s H!  oQR                  U5      R                  5       PM#     nn[
        R                  " [
        R                  " XF5      5      n[        [        U ]+  XU5        g s  snf r   )sigr   return_typer   argsr   PointerTypeFunctionTyper   rJ  r   )	r   r   r   rL  rettyrR   rN  r   r   s	           r   r   !ExternalFuncPointerModel.__init__  s    kk 

3??+::<8;A1

1,,.A..!=>&6sWM Bs   (B.rK   r  r   s   @r   rJ  rJ    s    N Nr   rJ  c                   p   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrU =r$ )UniTupleModeli  c                   > [         [        U ]  X5        UR                  UR                  5      U l        [        U5      U l        [        R                  " U R
                  R                  5       U R                  5      U l        [        R                  " U R
                  R                  5       U R                  5      U l        g r   )r   rT  r   r   r   _elem_modelrV   _countr   r7  r   _value_typer$   r9  r   s      r   r   UniTupleModel.__init__  s    mT+C9::gmm4'l<<(8(8(G(G(I(,5,,t'7'7'E'E'G'+{{4r   c                     U R                   $ r   )rX  r   s    r   r   UniTupleModel.get_value_type  s    r   c                     U R                   $ r   r<  r   s    r   r$   UniTupleModel.get_data_type  r   r   c                 "    U R                  5       $ r   r#   r   s    r   r+   UniTupleModel.get_return_type  r&   r   c                 R    U R                   R                  5       4U R                  -  $ r   )rV  r(   rW  r   s    r   r(   UniTupleModel.get_argument_type  s#      2246DDr   c                     / n[        U R                  5       HA  nUR                  X$/5      nU R                  R	                  X5      nUR                  U5        MC     U$ r   )r?  rW  extract_valuerV  r4   rY   r   r/   r0   outrB  vs         r   r4   UniTupleModel.as_argument  sT    t{{#A%%eS1A  ,,W8AJJqM $ 
r   c                     [         R                  " U R                  5       [         R                  5      n[	        U5       H3  u  pEU R
                  R                  X5      nUR                  X5U/5      nM5     U$ r   )r   Constantr   	Undefined	enumeraterV  r>   insert_valuerd  s         r   r>   UniTupleModel.from_argument  sa    kk$--/>e$DA  ..w:A&&ss3C % 
r   c                 $   [         R                  " U R                  5       [         R                  5      n[	        U R
                  5       HC  nUR                  X$/5      nU R                  R                  X5      nUR                  X6U/5      nME     U$ r   )
r   ri  r$   rj  r?  rW  rc  rV  r1   rl  r   r/   r0   re  rB  r   dvals          r   r1   UniTupleModel.as_data  su    kk$,,.=t{{#A''s3C##++G9D&&s1#6C $ 
r   c                 $   [         R                  " U R                  5       [         R                  5      n[	        U R
                  5       HC  nUR                  X$/5      nU R                  R                  X5      nUR                  X6U/5      nME     U$ r   )
r   ri  r   rj  r?  rW  rc  rV  r;   rl  ro  s          r   r;   UniTupleModel.from_data  su    kk$--/>t{{#A''s3C##--g;D&&s1#6C $ 
r   c                     U$ r   rK   r.   s      r   r8   UniTupleModel.as_return  r   r   c                     U$ r   rK   r.   s      r   rA   UniTupleModel.from_return  r   r   c                    ^ U4S jn[        U R                  5       Vs/ s H$  nU R                  R                  [	        X#5      4PM&     sn$ s  snf )Nc                 &   > TR                  X5      $ r   rc  )rB  r0   r/   s     r   getter&UniTupleModel.traverse.<locals>.getter  s    ((22r   )r?  rW  r   r   r   )r   r/   r{  rB  s    `  r   rM   UniTupleModel.traverse  sL    	3 t{{+-+A $$gf&89+- 	- -s   +Ac                     U R                   /$ r   )rV  r   s    r   rX   UniTupleModel.inner_models  s      !!r   )rW  r9  rV  rX  )r   r   r   r   r   r   r$   r+   r(   r4   r>   r1   r;   r8   rA   rM   rX   r   r   r   s   @r   rT  rT    sJ    4 %E-" "r   rT  c                       \ rS rSrSrSrg)CompositeModeli  zOAny model that is composed of multiple other models should subclass from
this.
rK   N)r   r   r   r   r   r   rK   r   r   r  r    s     	r   r  c                      ^  \ rS rSrSrSrU 4S jrS rS rS r	S r
S rS	 rS
 rS rS rSS jrS rS rS rS rS rS rS r\S 5       rS rS rS rS rSrU =r$ )StructModeli  Nc                   > [         [        U ]  X5        U(       a  [        U6 u  U l        U l        OS=U l        U l        [        U R
                   Vs/ s H  o@R                  R                  U5      PM     sn5      U l	        g s  snf r   )
r   r  r   zip_fields_membersrv   r   r   _models)r   r   r   membersrR   r   s        r   r   StructModel.__init__  sd    k4)#7*-w-'DL$-+--DL4=4==I=aii..q1=IJIs   $Bc                 B    U R                  U5      nU R                  U   $ )zE
StructModel-specific: get the Numba type of the field named *name*.
)get_field_positionr  )r   nameposs      r   get_member_fe_typeStructModel.get_member_fe_type  s#     %%d+}}S!!r   c                     U R                   cD  [        R                  " U R                   Vs/ s H  nUR	                  5       PM     sn5      U l         U R                   $ s  snf r   )rX  r   r   r  r   rQ   s     r   r   StructModel.get_value_type  s^    #!33=A\\5K=I 675E5E5G=I5K  LD5K   Ac                     U R                   cD  [        R                  " U R                   Vs/ s H  nUR	                  5       PM     sn5      U l         U R                   $ s  snf r   )r9  r   r   r  r$   rQ   s     r   r$   StructModel.get_data_type  sW    ??" 22=A\\4K=I 56OO4E=I4K LDO4Kr  c                 r    [        U R                   Vs/ s H  oR                  5       PM     sn5      $ s  snf r   )rv   r  r(   rQ   s     r   r(   StructModel.get_argument_type!  s*    T\\B\))+\BCCBs   4c                 "    U R                  5       $ r   r   r   s    r   r+   StructModel.get_return_type$  r   r   c                     / n[        U R                  5       H6  u  pVUR                  [        Xa5      " UU R	                  X#U5      5      5        M8     [        U5      $ r   )rk  r  rY   getattrgetrv   )r   methnamer/   r0   	extractedrB  r[   s          r   _asStructModel._as'  sU    	t||,EAWR273788GA3NP Q - Yr   c                    [         R                  " U R                  5       [         R                  5      n[	        [        U R                  U5      5       H+  u  nu  pg[        Xa5      " X'5      nU R                  X$X5      nM-     U$ r   )	r   ri  r   rj  rk  r  r  r  set)	r   r  r/   r0   structrB  r[   r   rf  s	            r   _fromStructModel._from.  sf    T002BLLA%c$,,&>?LAy%g3AXXgq4F @ r   c                     U R                  SX5      n[        R                  " U R                  5       [        R                  5      n[        U5       H  u  pVUR                  XFU/5      nM     U$ )a  
Converts the LLVM struct in `value` into a representation suited for
storing into arrays.

Note
----
Current implementation rarely changes how types are represented for
"value" and "data".  This is usually a pointless rebuild of the
immutable LLVM struct value.  Luckily, LLVM optimization removes all
redundancy.

Sample usecase: Structures nested with pointers to other structures
that can be serialized into  a flat representation when storing into
array.
r1   r  r   ri  r$   rj  rk  rl  r   r/   r0   elemsr  rB  els          r   r1   StructModel.as_data7  s[      G3T//12<<@u%EA))&qc:F &r   c                     [        [        U R                  5      5       Vs/ s H  nUR                  X#/5      PM     nnU R	                  SX5      $ s  snf )z
Convert from "data" representation back into "value" representation.
Usually invoked when loading from array.

See notes in `as_data()`
r;   r?  rV   r  rc  r  r   r/   r0   rB  valss        r   r;   StructModel.from_dataM  sU     s4==1242A %%eS12 	 4zz+w554   Ac                 n   / n[        U R                  5       H@  u  pV[        R                  " XSU5      nUR	                  XU5      nUR                  U5        MB     [        R                  " U R                  5       [        R                  5      n	[        U5       H  u  pXU R                  XX5      n	M     U	$ Nr   )rk  r  r   r@  rH   rY   r   ri  r   rj  r  )
r   r/   rG   rD   rC  rB  rj   elem_ptrr   r  s
             r   rH   "StructModel.load_from_data_pointerX  s    !$,,/HA++G!Q?H..w%HCMM# 0
 T002BLLA'FAXXgs6F (r   c                 &    U R                  SX5      $ )Nr4   )r  r.   s      r   r4   StructModel.as_argumentd  s    xxw66r   c                 &    U R                  SX5      $ )Nr>   )r  r.   s      r   r>   StructModel.from_argumentg  s    zz/7::r   c                     U R                  SX5      n[        R                  " U R                  5       [        R                  5      n[        U5       H  u  pVUR                  XFU/5      nM     U$ )Nr1   r  r  s          r   r8   StructModel.as_returnj  sY    G3T//12<<@u%EA))&qc:F &r   c                     [        [        U R                  5      5       Vs/ s H  nUR                  X#/5      PM     nnU R	                  SX5      $ s  snf )Nr;   r  r  s        r   rA   StructModel.from_returnq  sS    s4==1242A %%eS12 	 4zz+w554r  c                     [        U[        5      (       a  U R                  U5      nUR                  X#/SU R                  U   -   S9$ )zGet a field at the given position or the fieldname

Args
----
builder:
    LLVM IRBuilder
val:
    value to be inserted
pos: int or str
    field index or field name

Returns
-------
Extracted value
z
extracted.r  )
isinstancestrr  rc  r  )r   r/   r   r  s       r   r  StructModel.getv  sP      c3))#.C$$S%*6c9J*J % L 	Lr   c                     [        U[        5      (       a  U R                  U5      nUR                  X#U/SU R                  U   -   S9$ )zSet a field at the given position or the fieldname

Args
----
builder:
    LLVM IRBuilder
stval:
    LLVM struct value
val:
    value to be inserted
pos: int or str
    field index or field name

Returns
-------
A new LLVM struct with the value inserted
z	inserted.r  )r  r  r  rl  r  )r   r/   stvalr   r  s        r   r  StructModel.set  sR    $ c3))#.C##E)4t||C7H)H $ J 	Jr   c                      U R                   R                  U5      $ ! [         a'    [        U R                  R
                  < SU< 35      ef = f)Nz does not have a field named )r  index
ValueErrorKeyErrorr   r   )r   fields     r   r  StructModel.get_field_position  sL    	?<<%%e,, 	?"nn55u> ? ?	?s	    1Ac                 ,    [        U R                  5      $ r   )rV   r  r   s    r   field_countStructModel.field_count  s    4<<  r   c                 l    [        U[        5      (       a  U R                  U5      nU R                  U   $ )zGet the frontend type (numba type) of a field given the position
 or the fieldname

Args
----
pos: int or str
    field index or field name
)r  r  r  r  r   r  s     r   get_typeStructModel.get_type  s0     c3))#.C}}S!!r   c                      U R                   U   $ )z|
Get the datamodel of a field given the position or the fieldname.

Args
----
pos: int or str
    field index or field name
r  r  s     r   	get_modelStructModel.get_model  s     ||C  r   c                    ^ ^ UU 4S jnT R                    Vs/ s H  nT R                  U5      [        X#5      4PM!     sn$ s  snf )Nc                    > UR                   TR                  5       :w  a4  TR                  5       UR                   4n[        SR                  " U6 5      eTR	                  TX5      $ )Nzexpecting {0} but got {1})rq   r   	TypeErrorformatr  )kr0   rN  r/   r   s      r   r{  $StructModel.traverse.<locals>.getter  sW    zzT0022**,ejj8 ; B BD IJJ88GU..r   )r  r  r   )r   r/   r{  r  s   ``  r   rM   StructModel.traverse  s;    	/ AEM1q!76#56MMMs   &Ac                     U R                   $ r   r  r   s    r   rX   StructModel.inner_models  r   r   )r9  r  r  r  rX  r   ) r   r   r   r   rX  r9  r   r  r   r$   r(   r+   r  r  r1   r;   rH   r4   r>   r8   rA   r  r  r  r   r  r  r  rM   rX   r   r   r   s   @r   r  r    s    KJK" D$ ,	6
7;6
L*J.? ! !"	!N r   r  c                   ,   ^  \ rS rSr\rU 4S jrSrU =r$ )ComplexModeli  c                 f   > SUR                   4SUR                   4/n[        [        U ]  XU5        g )Nrealimag)underlying_floatr   r  r   r   r   r   r  r   s       r   r   ComplexModel.__init__  s9    W--.W--.
 	lD*3Ar   rK   )	r   r   r   r   NotImplemented_element_typer   r   r   r   s   @r   r  r    s    "MB Br   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
TupleModeli  c                    > [        U5       VVs/ s H  u  p4S[        U5      -   U4PM     nnn[        [        U ]  XU5        g s  snnf )Nf)rk  r  r   r  r   )r   r   r   rB  rR   r  r   s         r   r   TupleModel.__init__  sD    1:71CD1CC#a&L!$1CDj$(w? Es   ArK   r  r   s   @r   r  r    s    @ @r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
UnionModeli  c                    > S[         R                  4S[         R                  R                  UR                   5      4/n[        [
        U ]  XU5        g )Ntagpayload)r   uintpTuple
from_typesr   r  r   r  s       r   r   UnionModel.__init__  sD    EKK ..w}}=>

 	j$(w?r   rK   r  r   s   @r   r  r    s    @ @r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )	PairModeli  c                 f   > SUR                   4SUR                  4/n[        [        U ]  XU5        g )Nfirstsecond)
first_typesecond_typer   r  r   r  s       r   r   PairModel.__init__  s7    W//0g1124i'g>r   rK   r  r   s   @r   r  r    s    ? ?r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ListPayloadModeli  c                    > S[         R                  4S[         R                  4S[         R                  4SUR                  R                  4/n[
        [        U ]  XU5        g )Nsize	allocateddirtydata)r   intpboolean	containerr   r   r  r   r  s       r   r   ListPayloadModel.__init__  sX    
 UZZ %**%emm$W&&,,-
 	.sWEr   rK   r  r   s   @r   r  r    s    F Fr   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )	ListModeli  c                    > [         R                  " U5      nS[         R                  " U5      4S[         R                  4/n[        [
        U ]  XU5        g Nmeminfoparent)r   ListPayloadMemInfoPointerpyobjectr   r  r   r   r   r   payload_typer  r   s        r   r   ListModel.__init__  sN    ((1 ,,\:;u~~&	
 	i'g>r   rK   r  r   s   @r   r  r    s    ? ?r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ListIterModeli  c                    > [         R                  " UR                  5      nS[         R                  " U5      4S[         R                  " [         R
                  5      4/n[        [        U ]#  XU5        g Nr  r  )	r   r  r	  r  EphemeralPointerr  r   r  r   r  s        r   r   ListIterModel.__init__  s_    (():):; ,,\:;e,,UZZ89	 	mT+C'Br   rK   r  r   s   @r   r  r    s    C Cr   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )SetEntryModeli(  c                    > UR                   R                  nS[        R                  4SU4/n[        [
        U ]  XU5        g )Nru   key)set_typer   r   r  r   r  r   )r   r   r   r   r  r   s        r   r   SetEntryModel.__init__*  sC      && UZZ EN

 	mT+C'Br   rK   r  r   s   @r   r  r  (  s    C Cr   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )SetPayloadModeli4  c                 "  > [         R                  " UR                  5      nS[         R                  4S[         R                  4S[         R                  4S[         R                  4S[         R                  4SU4/n[
        [        U ]  XU5        g )Nfillusedmaskfingerr  entries)r   SetEntryr	  r  r  r   r$  r   )r   r   r   
entry_typer  r   s        r   r   SetPayloadModel.__init__6  sw    ^^G$5$56
 UZZ UZZ UZZ uzz"emm$
#
 	ot-cGDr   rK   r  r   s   @r   r$  r$  4  s    E Er   r$  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )SetModeliH  c                    > [         R                  " U5      nS[         R                  " U5      4S[         R                  4/n[        [
        U ]  XU5        g r  )r   
SetPayloadr  r  r   r/  r   r  s        r   r   SetModel.__init__J  sN    ''0 ,,\:;u~~&	
 	h&sW=r   rK   r  r   s   @r   r/  r/  H  s    > >r   r/  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )SetIterModeliT  c                    > [         R                  " UR                  5      nS[         R                  " U5      4S[         R                  " [         R
                  5      4/n[        [        U ]#  XU5        g r  )	r   r1  r	  r  r  r  r   r4  r   r  s        r   r   SetIterModel.__init__V  s_    ''(9(9: ,,\:;e,,UZZ89 	lD*3Ar   rK   r  r   s   @r   r4  r4  T  s    	B 	Br   r4  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
ArrayModelib  c                   > UR                   nS[        R                  " UR                  5      4S[        R                  4S[        R
                  4S[        R
                  4S[        R                  " UR                  5      4S[        R                  " [        R
                  U5      4S[        R                  " [        R
                  U5      4/n[        [        U ]+  XU5        g )Nr  r  nitemsitemsizer  shapestrides)ndimr   r  r   r  r  CPointerUniTupler   r8  r   r   r   r   r>  r  r   s        r   r   ArrayModel.__init__i  s    ||,,W]];<u~~&uzz"$U^^GMM23ennUZZ67uzz489	
 	j$(w?r   rK   r  r   s   @r   r8  r8  b  s    @ @r   r8  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ArrayFlagsModelix  c                 L   > SUR                   4/n[        [        U ]  XU5        g )Nr  )
array_typer   rD  r   r  s       r   r   ArrayFlagsModel.__init__z  s+    w))*
 	ot-cGDr   rK   r  r   s   @r   rD  rD  x  s    E Er   rD  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )NestedArrayModeli  c                    > UR                  UR                  5      R                  5       U l        [        [
        U ]  X5        g r   )r   r   r$   _be_typer   rI  r   r   s      r   r   NestedArrayModel.__init__  s0    

7==1??A.s<r   c                 p    [         R                  " U R                  U R                  R                  5      nU$ )zHReturn the LLVM type representation for the storage of
the nestedarray.
)r   r7  rK  r   r:  )r   rets     r   as_storage_type NestedArrayModel.as_storage_type  s'     ll4==$--*>*>?
r   rK  )r   r   r   r   r   rO  r   r   r   s   @r   rI  rI    s    = r   rI  c                   @   ^  \ rS rSrU 4S jrS rS rS rS rSr	U =r
$ )OptionalModeli  c                    > SUR                   4S[        R                  4/nUR                  UR                   5      U l        [
        [        U ]  XU5        g )Nr  valid)rq   r   r  r   _value_modelr   rS  r   r  s       r   r   OptionalModel.__init__  sJ    W\\"emm$
  JJw||4mT+C'Br   c                 6    U R                   R                  5       $ r   )rV  r+   r   s    r   r+   OptionalModel.get_return_type  s      0022r   c                     [         er   r   r.   s      r   r8   OptionalModel.as_return  s    !!r   c                 8    U R                   R                  X5      $ r   )rV  rA   r.   s      r   rA   OptionalModel.from_return  s      ,,W<<r   c                 r   ^ ^^ UUU 4S jnUU 4S jmT R                  S5      U4T R                  S5      T4/$ )Nc                    > T" U 5      nTR                  TU S5      nTR                  X[        R                  " UR                  S 5      5      $ )Nr  )r  selectr   ri  rq   )r0   rU  r  r/   	get_validr   s      r   get_data(OptionalModel.traverse.<locals>.get_data  s?    e$E88GUF3D>>%r{{499d/KLLr   c                 *   > TR                  TU S5      $ )NrU  )r  )r0   r/   r   s    r   ra  )OptionalModel.traverse.<locals>.get_valid  s    88GUG44r   r  rU  )r  )r   r/   rb  ra  s   `` @r   rM   OptionalModel.traverse  s<    	M	5 v&1w'35 	5r   )rV  )r   r   r   r   r   r+   r8   rA   rM   r   r   r   s   @r   rS  rS    s"    C3"=	5 	5r   rS  c                   n   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rS rSS jrSrU =r$ )RecordModeli  c                 h  > [         [        U ]  X5        UR                   VVs/ s H   u  p4U R                  R                  U5      PM"     snnU l        [        R                  " [        R                  " S5      UR                  5      U l        U R                  R                  5       U l        g s  snnf Nr   )r   rh  r   r  r   r   r  r   r7  r   r  rK  r  _be_ptr_type)r   r   r   _rR   r   s        r   r   RecordModel.__init__  sv    k4)#78?H		((+HRZZ]GLLA MM446 Is   'B.c                     U R                   $ )z6Passed around as reference to underlying data
        rk  r   s    r   r   RecordModel.get_value_type  s        r   c                     U R                   $ r   ro  r   s    r   r(   RecordModel.get_argument_type         r   c                     U R                   $ r   ro  r   s    r   r+   RecordModel.get_return_type  rs  r   c                     U R                   $ r   rQ  r   s    r   r$   RecordModel.get_data_type      }}r   c                 $    UR                  U5      $ r   rE   r.   s      r   r1   RecordModel.as_data      ||E""r   c                     [        S5      er,  r   r.   s      r   r;   RecordModel.from_data  r.  r   c                     U$ r   rK   r.   s      r   r4   RecordModel.as_argument  r   r   c                     U$ r   rK   r.   s      r   r>   RecordModel.from_argument  r   r   c                     U$ r   rK   r.   s      r   r8   RecordModel.as_return  r   r   c                     U$ r   rK   r.   s      r   rA   RecordModel.from_return  r   r   c                 @    UR                  X R                  5       5      $ r   r0  rF   s       r   rH   "RecordModel.load_from_data_pointer  r3  r   )rk  rK  r  r   )r   r   r   r   r   r   r(   r+   r$   r1   r;   r4   r>   r8   rA   rH   r   r   r   s   @r   rh  rh    sE    7!
!!#J; ;r   rh  c                   X   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rSrU =r$ )UnicodeCharSeqi  c                    > [         [        U ]  X5        [        R                  " [
        R                  S-  5      n[        R                  " X2R                  5      U l	        g rj  )
r   r  r   r   r   r	   sizeof_unicode_charr7  r8  rK  r   r   r   chartyr   s       r   r   UnicodeCharSeq.__init__  s?    nd,S:M==ABV]];r   c                     U R                   $ r   rQ  r   s    r   r   UnicodeCharSeq.get_value_type  rx  r   c                     U R                   $ r   rQ  r   s    r   r$   UnicodeCharSeq.get_data_type  rx  r   c                     U$ r   rK   r.   s      r   r1   UnicodeCharSeq.as_data  r   r   c                     U$ r   rK   r.   s      r   r;   UnicodeCharSeq.from_data  r   r   c                     U$ r   rK   r.   s      r   r8   UnicodeCharSeq.as_return  r   r   c                     U$ r   rK   r.   s      r   rA   UnicodeCharSeq.from_return  r   r   c                     U$ r   rK   r.   s      r   r4   UnicodeCharSeq.as_argument  r   r   c                     U$ r   rK   r.   s      r   r>   UnicodeCharSeq.from_argument  r   r   rQ  r   r   r   r   r   r   r$   r1   r;   r8   rA   r4   r>   r   r   r   s   @r   r  r    5    <
 r   r  c                   X   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rSrU =r$ )CharSeqi  c                    > [         [        U ]  X5        [        R                  " S5      n[        R
                  " X2R                  5      U l        g rj  )r   r  r   r   r   r7  r8  rK  r  s       r   r   CharSeq.__init__  s3    gt%c3AV]];r   c                     U R                   $ r   rQ  r   s    r   r   CharSeq.get_value_type  rx  r   c                     U R                   $ r   rQ  r   s    r   r$   CharSeq.get_data_type  rx  r   c                     U$ r   rK   r.   s      r   r1   CharSeq.as_data  r   r   c                     U$ r   rK   r.   s      r   r;   CharSeq.from_data
  r   r   c                     U$ r   rK   r.   s      r   r8   CharSeq.as_return  r   r   c                     U$ r   rK   r.   s      r   rA   CharSeq.from_return  r   r   c                     U$ r   rK   r.   s      r   r4   CharSeq.as_argument  r   r   c                     U$ r   rK   r.   s      r   r>   CharSeq.from_argument  r   r   rQ  r  r   s   @r   r  r    r  r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )CContiguousFlatIteri  c                   > UR                   R                  S:X  d   eUR                   nUR                  nUR                  nSU4S[        R
                  4S[        R                  " [        R
                  5      4/nU(       a6  UR                  S[        R                  " [        R
                  U5      45        [        [        U ]/  XU5        g )NCarraystrider  indices)rF  layoutr   r>  r   r  r  rY   EphemeralArrayr   r  r   )	r   r   r   need_indicesrF  r   r>  r  r   s	           r   r   CContiguousFlatIter.__init__  s    !!((C///''
  Z(ejj)U33EJJ?@ NNIu';';EJJ'MNO!41#Hr   rK   r  r   s   @r   r  r    s    I Ir   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )FlatIteri*  c                 n  > UR                   nUR                  nUR                  nSU4S[        R                  " [        R
                  " U5      U5      4S[        R                  " [        R                  U5      4S[        R                  " [        R                  5      4/n[        [        U ]/  XU5        g )Nr  pointersr  	exhausted)rF  r   r>  r   r  r?  r  r  r  r   r  r   )r   r   r   rF  r   r>  r  r   s          r   r   FlatIter.__init__+  s    ''
  Z( 4 4U^^E5JD QRu33EJJEF!7!7!FG

 	h&sW=r   rK   r  r   s   @r   r  r  *  s    	> 	>r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )UniTupleIteri7  c                    > S[         R                  " [         R                  5      4SUR                  4/n[        [
        U ]  XU5        g )Nr  rv   )r   r  r  r	  r   r  r   r  s       r   r   UniTupleIter.__init__9  s@    U33EJJ?@W..02lD*3Ar   rK   r  r   s   @r   r  r  7  s    B Br   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
SliceModeli?  c                    > S[         R                  4S[         R                  4S[         R                  4/n[        [        U ]  XU5        g Nstartstopstep)r   r  r   r  r   r  s       r   r   SliceModel.__init__B  sA    UZZ(EJJ'EJJ' 	j$(w?r   rK   r  r   s   @r   r  r  ?  s    @ @r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )NPDatetimeModeliJ  c                 Z   > [         R                  " S5      n[        [        U ]  XU5        g )N@   )r   r   r   r  r   r   s       r   r   NPDatetimeModel.__init__M  s!    **R.ot-cGDr   rK   r  r   s   @r   r  r  J  s    E Er   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ArrayIteratoriR  c                    > S[         R                  " [         R                  5      4SUR                  4/n[        [
        U ]  XU5        g )Nr  r  )r   r  r  rF  r   r  r   r  s       r   r   ArrayIterator.__init__T  s@    U33EKK@AW//02mT+C'Br   rK   r  r   s   @r   r  r  R      C Cr   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )EnumerateTypei[  c                    > S[         R                  " [         R                  5      4SUR                  4/n[        [
        U ]  XU5        g )Nr8  iter)r   r  r  source_typer   r  r   r  s       r   r   EnumerateType.__init__]  sB    U33EJJ?@G//02 	mT+C'Br   rK   r  r   s   @r   r  r  [  r  r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ZipTypeid  c                    > [        UR                  5       VVs/ s H  u  p4SU-  UR                  4PM     nnn[        [        U ]  XU5        g s  snnf )Nziter%d)rk  source_typesiterator_typer   r  r   )r   r   r   rB  r  r  r   s         r   r   ZipType.__init__f  sX    )273G3G)HJ)H~q qL+";";<)H 	 Jgt%cG<Js   ArK   r  r   s   @r   r  r  d  s    = =r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )RangeIteratorTypeil  c                    > UR                   nS[        R                  " U5      4SU4SU4S[        R                  " U5      4/n[        [        U ]  XU5        g )Nr  r  r  r8  )
yield_typer   r  r   r  r   r   r   r   int_typer  r   s        r   r   RangeIteratorType.__init__n  s`    %%E228<=H%H%U33H=>@ 	/gFr   rK   r  r   s   @r   r  r  l  s    G Gr   r  c                   d   ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rS rSrU =r$ )GeneratorModeliw  c                   > [         [        U ]  X5        UR                   Vs/ s H?  n[	        U[
        R                  5      (       a  M$  U R                  R                  U5      PMA     snU l	        UR                   Vs/ s H  o0R                  R                  U5      PM     snU l        [        R                  " U R                   Vs/ s H  o3R                  5       PM     sn5      U l        [        R                  " U R                   Vs/ s H  o3R                  5       PM     sn5      U l        [        R                  " U R                  R                  [
        R"                  5      R%                  5       U R                  U R                   /5      U l        U R&                  R)                  5       U l        g s  snf s  snf s  snf s  snf r   )r   r  r   	arg_typesr  r   Omittedr   r   _arg_modelsstate_types_state_modelsr   r   r$   _args_be_type_state_be_typeint32r   rK  r  rk  )r   r   r   rR   r   s       r   r   GeneratorModel.__init__y  sZ   nd,S:9@9J9J A9JA#-a#? 0DII,,Q/9J A;B;N;NO;Naii..q1;NO11(,(8(89(81__(89; 22(,(:(:;(:1__(:;= ,,YYekk*99;!4!467 !MM446AO :;s   #F8
F8?$F=	GGc                     U R                   $ )z8
The generator closure is passed around as a reference.
ro  r   s    r   r   GeneratorModel.get_value_type  s        r   c                     U R                   $ r   ro  r   s    r   r(    GeneratorModel.get_argument_type  rs  r   c                     U R                   $ r   rQ  r   s    r   r+   GeneratorModel.get_return_type  rx  r   c                     U R                   $ r   rQ  r   s    r   r$   GeneratorModel.get_data_type  rx  r   c                     U$ r   rK   r.   s      r   r4   GeneratorModel.as_argument  r   r   c                     U$ r   rK   r.   s      r   r>   GeneratorModel.from_argument  r   r   c                 $    U R                  X5      $ r   r   r.   s      r   r8   GeneratorModel.as_return  r   r   c                 $    U R                  X5      $ r   r   r.   s      r   rA   GeneratorModel.from_return  r   r   c                 $    UR                  U5      $ r   rz  r.   s      r   r1   GeneratorModel.as_data  r|  r   c                 h    [         R                  " XR                  5      nUR                  X#5        U$ r   )r   r   rq   r   )r   r/   r0   stacks       r   r;   GeneratorModel.from_data  s'    ##GZZ8e#r   )r  r  rk  rK  r  r  )r   r   r   r   r   r   r(   r+   r$   r4   r>   r8   rA   r1   r;   r   r   r   s   @r   r  r  w  s?    7"!!,.# r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )ArrayCTypesModeli  c                    > S[         R                  " UR                  5      4S[         R                  " UR                  5      4/n[        [
        U ]  XU5        g )Nr  r  )r   r?  r   r  r   r  r   r  s       r   r   ArrayCTypesModel.__init__  sI    ENN7==9:u33GMMBCE.sWEr   rK   r  r   s   @r   r  r    s    F Fr   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
RangeModeli  c                 p   > UR                   R                  nSU4SU4SU4/n[        [        U ]  XU5        g r  )r  r  r   r  r   r  s        r   r   RangeModel.__init__  sF    ((33X&H%H%' 	j$(w?r   rK   r  r   s   @r   r  r    s    @ @r   r  c                   (   ^  \ rS rSrU 4S jrSrU =r$ )NdIndexModeli  c                 ,  > UR                   nS[        R                  " [        R                  U5      4S[        R                  " [        R                  U5      4S[        R
                  " [        R                  5      4/n[        [        U ]'  XU5        g )Nr<  r  r  )
r>  r   r@  r  r  r  r  r   r  r   rA  s        r   r   NdIndexModel.__init__  sm    ||U^^EJJ=>u33EJJEF!7!7!FG 	lD*3Ar   rK   r  r   s   @r   r  r    s    B Br   r  c                 `    UR                   R                  S:X  a
  [        XSS9$ [        X5      $ )Nr  Fr  rF  r  r  r  r   r   s     r   handle_numpy_flat_typer!    s,    	}}s""3??  r   c                 `    UR                   R                  S:X  a
  [        XSS9$ [        X5      $ )Nr  Tr  r  r   s     r   handle_numpy_ndenumerate_typer#    s,    	}}s""3>>  r   c                     XR                      $ r   )thisr   s     r   handle_bound_functionr&    s     ww<r   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )NdIteri  c                 L  > UR                   nUR                  nUR                  (       a  UOSnS[        R                  " [        R
                  5      4S[        R                  " U5      4S[        R                  " [        R                  U5      4S[        R                  " [        R                  U5      4/n[        UR                  5       HT  u  pxUu  ppSU-  nU	S:X  a7  UR                  U[        R                  " [        R                  5      45        ML  U	S;   a  MT   e   [        UR                   5       HR  u  p~[        U[        R                  5      (       a  M&  S	U-  nUR                  U[        R                  " U5      45        MT     [        [         U ]G  XU5        g )
Nr   r  arraysr<  r  zindex%dflat)scalarindexed0dzscalar%d)r*  r>  need_shaped_indexingr   r  r  r  r@  r  r  rk  indexersrY   r  Arrayr   r(  r   )r   r   r   array_typesr>  	shape_lenr  rB  subkind	start_dimend_dimrl  member_namer   r   s                  r   r   NdIter.__init__  sG   nn||#88Da	!7!7!FGekk+67U^^EJJ	BCu33EJJ	JK	   0 01FA*-'DW#a-Kv~U-C-CEJJ-OPQ44q 2 w~~.EAb%++..(1nU-C-CB-GHI /
 	fd$S7;r   rK   r  r   s   @r   r(  r(    s    < <r   r(  c                      ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSS jrS rS rS r\S 5       rS rSrU =r$ )DeferredStructModeli  c                    > [         [        U ]  X5        SR                  [	        U5      5      U l        UR                  5       U l        g )Nzdeferred.{0})r   r;  r   r  idtypenamer  actual_fe_typer   s      r   r   DeferredStructModel.__init__  s7    !41#?&--bk:%kkmr   c                 Z    [         R                  R                  U R                  S-   5      $ )Nz.valuer   global_contextget_identified_typer>  r   s    r   r   "DeferredStructModel.get_value_type  s"      44T]]X5MNNr   c                 Z    [         R                  R                  U R                  S-   5      $ )Nz.datarB  r   s    r   r$   !DeferredStructModel.get_data_type  s"      44T]]W5LMMr   c                 6    U R                   R                  5       $ r   )_actual_modelr(   r   s    r   r(   %DeferredStructModel.get_argument_type  s    !!3355r   c                 Z    U R                  X5      nU R                  R                  X5      $ r   )r  rI  r4   )r   r/   r0   inners       r   r4   DeferredStructModel.as_argument  s'    (!!--g==r   c                 x    U R                   R                  X5      nU R                  XR                  5       U5      $ r   )rI  r>   r  make_uninitialized)r   r/   r0   ress       r   r>   !DeferredStructModel.from_argument  s2      ..w>xx!8!8!:C@@r   c                     U R                  5         U R                  X5      nU R                  R                  X5      nU R	                  5       nU R                  XU5      $ r   )_definer  rI  r;   rO  r  r   r/   r0   elemre  s        r   r;   DeferredStructModel.from_data  sN    xx'"",,W;%%'xxe,,r   c                     U R                  5         U R                  X5      nU R                  R                  X5      nU R	                  SS9nU R                  XU5      $ )Nr  )r5  )rS  r  rI  r1   rO  r  rT  s        r   r1   DeferredStructModel.as_data$  sS    xx'""**79%%6%2xxe,,r   c                     U$ r   rK   r.   s      r   rA   DeferredStructModel.from_return+  r   r   c                     U$ r   rK   r.   s      r   r8   DeferredStructModel.as_return.  r   r   c                 (    UR                  US/5      $ r  rz  r.   s      r   r  DeferredStructModel.get1  s    $$UQC00r   c                 (    UR                  X#S/5      $ r  )rl  )r   r/   r0   contents       r   r  DeferredStructModel.set4  s    ##EQC88r   c                     U R                  5         US:X  a  U R                  5       nOU R                  5       n[        R                  " U[        R
                  5      $ )Nr0   )rS  r   r$   r   ri  rj  )r   r5  r   s      r   rO  &DeferredStructModel.make_uninitialized7  sC    7?$$&B##%B{{2r||,,r   c                     U R                  5       nU R                  U5        U R                  5       nU R                  U5        g r   )r   _define_value_typer$   _define_data_type)r   valtydattys      r   rS  DeferredStructModel._define?  s:    ##%&""$u%r   c                 z    UR                   (       a*  UR                  U R                  R                  5       5        g g r   )	is_opaqueset_bodyrI  r   )r   
value_types     r   re  &DeferredStructModel._define_value_typeE  s-     2 2 A A CD  r   c                 z    UR                   (       a*  UR                  U R                  R                  5       5        g g r   )rk  rl  rI  r$   )r   	data_types     r   rf  %DeferredStructModel._define_data_typeI  s-    t11??AB r   c                 L    U R                   R                  U R                  5      $ r   )r   r   r?  r   s    r   rI  !DeferredStructModel._actual_modelM  s    yy 3 344r   c                 *   ^ U R                   U4S j4/$ )Nc                 *   > TR                  U S/5      $ r  rz  )r0   r/   s    r   <lambda>.DeferredStructModel.traverse.<locals>.<lambda>S  s    w44UQC@r   )r?  rL   s    `r   rM   DeferredStructModel.traverseQ  s!    $$@B C 	Cr   )r?  r>  )r0   )r   r   r   r   r   r   r$   r(   r4   r>   r;   r1   rA   r8   r  r  rO  rS  re  rf  r   rI  rM   r   r   r   s   @r   r;  r;    sx    ,
ON6>A--19-&EC 5 5C Cr   r;  c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )StructPayloadModeliV  z.Model for the payload of a mutable struct
    c                 l   > [        UR                  R                  5       5      n[        TU ]  XU5        g r   )rv   
field_dictitemsr   r   )r   r   fe_typr  r   s       r   r   StructPayloadModel.__init__Z  s+    ))//12g.r   rK   r  r   s   @r   rz  rz  V  s    / /r   rz  c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )StructRefModeli_  z7Model for a mutable struct.
A reference to the payload
c                 x   > UR                  5       nS[        R                  " U5      4/n[        TU ]  XU5        g )Nr  )r$   r   r  r   r   )r   r   r~  r   r  r   s        r   r   StructRefModel.__init__c  s<    $$&,,U34
 	g.r   rK   r  r   s   @r   r  r  _  s    / /r   r  N)	functoolsr   collectionsr   llvmliter   numba.core.datamodel.registryr   
numba.corer   r   numba.npr	   objectr   r  r   BooleanBooleanLiteralr   r   r   
EnumMemberIntEnumMemberr   OpaquePyObject
RawPointerNoneTypeStringLiteralEllipsisTypeFunctionTypeObjectModulePhantomUndefVarContextManager
DispatcherObjModeDispatcherExceptionClassDummyExceptionInstanceExternalFunction	EnumClassIntEnumClassNumberClassTypeRefNamedTupleClassDTypeRecursiveCallMakeFunctionLiteralPoisonr  r  r
  IntegerIntegerLiteralr  Floatr  r?  r   r  r&  r  r5  ExternalFunctionPointerrJ  r@  NamedUniTupleStarArgUniTuplerT  r  r  Complexr  LiteralListLiteralStrKeyDictr  
NamedTupleStarArgTupler  	UnionTyper  Pairr  r  r  Listr  ListIterr  r+  r  r1  r$  Setr/  SetIterr4  r1  Buffer	ByteArrayBytes
MemoryViewPyArrayr8  
ArrayFlagsrD  NestedArrayrI  OptionalrS  Recordrh  r  r  r  r  r  miscSliceLiteral	SliceTyper  
NPDatetimeNPTimedeltar  r  r  r  r  	Generatorr  ArrayCTypesr  	RangeTyper  NumpyNdIndexTyper  NumpyFlatTyper!  NumpyNdEnumerateTyper#  BoundFunctionr&  NumpyNdIterTyper(  DeferredTyper;  StructRefPayloadrz  r  rK   r   r   <module>r     s
      : % "O& O&d %-- )  !* %-- %&&'(.9 (. ( !(.VY >!? !?H %""#%%%&8
 8 ' $8 %,,%..!%""#%..!%%%&%$$%%..!%**%,,%,,%-- %..!%&&'%""#%))*%&&'%++%))*%(()%//"%$$%%##$%-- %''(%++%%%&%++,%,,A. A   - '  ) ! % & # * +  ( + $ ( " !      " & ' " $ "  8A %&&'	; 	 (	 %-- %&&'B> B ( !B %++@ @ @ %..!B> B "B %(();L ; *;  %&&';, ; (;, %//0N~ N 1N %..!%%%&%''(B"I B" ) ' "B"J	Y 	M. M` %-- B; B !B %##$%))*%++%""#%$$%@ @ & $  + %
@ %//"@ @ #@ %**? ? ? %##$F{ F %F  %**	? 	? 	? %..!	CK 	C "	C %..!CK C "C %""#Ek E $E& %))	>{ 	> 	> %-- 
B; 
B !
B %++%,,%//"%++%""#%-- @ @ ! $  #   @  %""#Ek E $E %##$
z 
 %
 %..!5K 5 "5< %,,(;. (;  (;V %&&'Y  (> %-- i  !>I+ I 
>{ 
> %$$%B; B &B %**))*%//"@ @ # +@ %""#%##$En E % $E %%%&CK C 'C %%%&CK C 'C %-- =k = != %))*G G +G %//"3^ 3 #3l %##$F{ F %F %//"@ @ #@ %(()B; B *B %%%&! '! %,,-! .! %%%& '
 %''(<[ < )<D %$$%MC. MC &MC` %(()/ / */	/[ 	/r   