
    0;jiѭ              !          d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ  G d de          Z ee	j                   G d	 d
e                      Z ee	j                   ee	j                   G d de                                  Z G d de          Z G d de          Z ee	j                   ee	j                   G d de                                  Z ee	j                   ee	j                   ee	j                   ee	j                   ee	j                   ee	j                   ee	j                   ee	j                    ee	j!                   ee	j"                   ee	j#                   ee	j$                   ee	j%                   ee	j&                   ee	j'                   ee	j(                   ee	j)                   ee	j*                   ee	j+                   ee	j,                   ee	j-                   ee	j.                   ee	j/                   ee	j0                   ee	j1                   ee	j2                   ee	j3                   ee	j4                   G d de                                                                                                                                                                                                                                                                                                                                                          Z5 ee	j6                   G d de5                      Z7 ee	j8                   ee	j9                   G d de                                  Z: ee	j;                   G d de                      Z< ee	j=                   G d de                      Z> ee	j?                   G d de>                      Z@ ee	jA                   G d d e>                      ZB ee	jC                   G d! d"e                      ZD ee	jE                   ee	jF                   ee	jG                   G d# d$e                                              ZH G d% d&e          ZI G d' d(eI          ZJ ee	jK                   G d) d*eJ                      ZL ee	jM                   ee	jN                   ee	jO                   ee	jP                   ee	jQ                   G d+ d,eJ                                                                      ZR ee	jS                   G d- d.eJ                      ZT ee	jU                   G d/ d0eJ                      ZV ee	jW                   G d1 d2eJ                      ZX ee	jY                   G d3 d4eJ                      ZZ ee	j[                   G d5 d6eJ                      Z\ ee	j]                   G d7 d8eJ                      Z^ ee	j_                   G d9 d:eJ                      Z` ee	ja                   G d; d<eJ                      Zb ee	jc                   G d= d>eJ                      Zd ee	je                   ee	jf                   ee	jg                   ee	jh                   ee	ji                   ee	jj                   G d? d@eJ                                                                                  Zk ee	jl                   G dA dBeJ                      Zm ee	jn                   G dC dDek                      Zo ee	jp                   G dE dFeJ                      Zq ee	jr                   G dG dHeI                      Zs ee	jt                   G dI dJe                      Zt ee	ju                   G dK dLe                      Zu G dM dNeJ          Zv G dO dPeJ          Zw ee	jx                   G dQ dReJ                      Zx ee	jy        jz                   ee	j{                   G dS dTeJ                                  Z| ee	j}                   ee	j~                   G dU dVe                                  Z ee	j                   G dW dXeJ                      Z ee	j                   G dY dZeJ                      Z ee	j                   G d[ d\eJ                      Z ee	j                   G d] d^eJ                      Z ee	j                   G d_ d`eI                      Z ee	j                   G da dbeJ                      Z ee	j                   G dc ddeJ                      Z ee	j                   G de dfeJ                      Z ee	j                  dg             Z ee	j                  dh             Z ee	j                  di             Z ee	j                   G dj dkeJ                      Z ee	j                   G dl dmeI                      Z ee	j                   G dn doeJ                      Z G dp dqeJ          ZdrS )s    )partial)deque)ir)register_default)typescgutils)numpy_supportc                       e Zd ZdZd Zed             Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )	DataModela  
    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                 "    || _         || _        d S N)_dmm_fe_type)selfdmmfe_types      U/root/voice-cloning/.venv/lib/python3.11/site-packages/numba/core/datamodel/models.py__init__zDataModel.__init__"   s    	    c                     | j         S r   )r   r   s    r   r   zDataModel.fe_type&   s
    }r   c                      t          |           r   NotImplementedErrorr   s    r   get_value_typezDataModel.get_value_type*       !$'''r   c                 *    |                                  S r   r   r   s    r   get_data_typezDataModel.get_data_type-       ""$$$r   c                 *    |                                  S )z8Return a LLVM type or nested tuple of LLVM type
        r   r   s    r   get_argument_typezDataModel.get_argument_type0   s     ""$$$r   c                 *    |                                  S r   r   r   s    r   get_return_typezDataModel.get_return_type5   r    r   c                      t          |           r   r   r   buildervalues      r   as_datazDataModel.as_data8   r   r   c                      t          |           )z`
        Takes one LLVM value
        Return a LLVM value or nested tuple of LLVM value
        r   r&   s      r   as_argumentzDataModel.as_argument;       
 "$'''r   c                      t          |           r   r   r&   s      r   	as_returnzDataModel.as_returnB   r   r   c                      t          |           r   r   r&   s      r   	from_datazDataModel.from_dataE   r   r   c                      t          |           )za
        Takes a LLVM value or nested tuple of LLVM value
        Returns one LLVM value
        r   r&   s      r   from_argumentzDataModel.from_argumentH   r,   r   c                      t          |           r   r   r&   s      r   from_returnzDataModel.from_returnO   r   r   Nc                 X    |                      ||                    ||                    S )z~
        Load value from a pointer to data.
        This is the default implementation, sufficient for most purposes.
        )align)r0   loadr   r'   ptrr6   s       r   load_from_data_pointerz DataModel.load_from_data_pointerR   s(    
 ~~gw||Cu|'E'EFFFr   c                     g S )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   traversezDataModel.traverseY   s	     	r   c                 D      fd                                  D             S )zE
        Recursively list all models involved in this model.
        c                 *    g | ]}j         |         S r<   )r   .0tr   s     r   
<listcomp>z-DataModel.traverse_models.<locals>.<listcomp>e   s    <<<	!<<<r   )traverse_typesr   s   `r   traverse_modelszDataModel.traverse_modelsa   s+     =<<<d&9&9&;&;<<<<r   c                 >   | j         g}t          | g          }t          |          dk    rq|                                }|                                D ]5}|j         |vr*|                    |            |j        |j                    6t          |          dk    q|S )zM
        Recursively list all frontend types involved in this model.
        r   )r   r   lenpopleftinner_modelsappend)r   r   queuedmi_dms        r   rE   zDataModel.traverse_typesg   s     tf%jj1nnB)) 0 0=--LL&&& EL/// %jj1nn r   c                     g S )z*
        List all *inner* models.
        r<   r   s    r   rJ   zDataModel.inner_modelsw   s	     	r   c                     dS )z
        Returns the MemInfo object or None if it is not tracked.
        It is only defined for types.meminfo_pointer
        Nr<   r&   s      r   get_nrt_meminfozDataModel.get_nrt_meminfo}   s	    
 tr   c                     dS NFr<   r   s    r   has_nrt_meminfozDataModel.has_nrt_meminfo   s    ur   c                 X    t          d |                                 D                       S )zQ
        Recursively check all contained types for need for NRT meminfo.
        c              3   >   K   | ]}|                                 V  d S r   )rT   )rB   models     r   	<genexpr>z1DataModel.contains_nrt_meminfo.<locals>.<genexpr>   s.      OOu5((**OOOOOOr   )anyrF   r   s    r   contains_nrt_meminfozDataModel.contains_nrt_meminfo   s-     OO8L8L8N8NOOOOOOr   c                 .    t          |           | j        fS r   )typer   r   s    r   _compared_fieldszDataModel._compared_fields   s    T

DM**r   c                 ^    t          t          |                                                     S r   )hashtupler]   r   s    r   __hash__zDataModel.__hash__   s$    E$//1122333r   c                     t          |           t          |          u r*|                                 |                                k    S dS rS   )r\   r]   r   others     r   __eq__zDataModel.__eq__   sA    ::e$$((**e.D.D.F.FFF5r   c                 .    |                      |           S r   )re   rc   s     r   __ne__zDataModel.__ne__   s    ;;u%%%%r   r   )__name__
__module____qualname____doc__r   propertyr   r   r   r"   r$   r)   r+   r.   r0   r2   r4   r:   r>   rF   rE   rJ   rQ   rT   rZ   r]   ra   re   rg   r<   r   r   r   r      s        ,        X( ( (% % %% % %
% % %( ( (( ( (( ( (( ( (( ( (( ( (G G G G  = = =         P P P+ + +4 4 4  & & & & &r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )OmittedArgDataModelz
    A data model for omitted arguments.  Only the "argument" representation
    is defined, other representations raise a NotImplementedError.
    c                 *    t          j        g           S r   )r   LiteralStructTyper   s    r   r   z"OmittedArgDataModel.get_value_type   s    #B'''r   c                     dS Nr<   r<   r   s    r   r"   z%OmittedArgDataModel.get_argument_type       rr   c                     dS rr   r<   r   r'   vals      r   r+   zOmittedArgDataModel.as_argument   rs   r   c                 &    |dk    s
J |            d S rr   r<   ru   s      r   r2   z!OmittedArgDataModel.from_argument   s    byyy#yyytr   N)rh   ri   rj   rk   r   r"   r+   r2   r<   r   r   rn   rn      sZ         
( ( (        r   rn   c                       e Zd Z ej        d          Z ej        d          Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd ZdS )BooleanModel      c                     | j         S r   )	_bit_typer   s    r   r   zBooleanModel.get_value_type   s
    ~r   c                     | j         S r   )
_byte_typer   s    r   r   zBooleanModel.get_data_type   
    r   c                 *    |                                  S r   r   r   s    r   r$   zBooleanModel.get_return_type       !!###r   c                 *    |                                  S r   r   r   s    r   r"   zBooleanModel.get_argument_type   r   r   c                 R    |                     ||                                           S r   )zextr   r&   s      r   r)   zBooleanModel.as_data   s"    ||E4#5#5#7#7888r   c                 .    |                      ||          S r   r)   r&   s      r   r+   zBooleanModel.as_argument       ||GU+++r   c                 .    |                      ||          S r   r   r&   s      r   r.   zBooleanModel.as_return   r   r   c                    |                                  }t          j        ||          }|                    d||                    d                    }|                    |          5 \  }}|5  |                     |d          |           d d d            n# 1 swxY w Y   |5  |                     |d          |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                    |          S )Nz==r   rz   )r   r   alloca_onceicmp_unsignedr\   if_elsestorer7   )r   r'   r(   ty	resallocacondthen	otherwises           r   r0   zBooleanModel.from_data   s     ""'44	$$T5%**Q--@@__T"" 	0&7tY 0 0bbeeY///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0bbeeY///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0
 ||I&&&sZ   )C+/ BC+B	C+"B	#C+( CC+C	C+C	C++C/2C/c                 .    |                      ||          S r   r0   r&   s      r   r2   zBooleanModel.from_argument       ~~gu---r   c                 .    |                      ||          S r   r   r&   s      r   r4   zBooleanModel.from_return   r   r   N)rh   ri   rj   r   IntTyper}   r   r   r   r$   r"   r)   r+   r.   r0   r2   r4   r<   r   r   ry   ry      s         
1IAJ    $ $ $$ $ $9 9 9, , ,, , ,	' 	' 	'. . .. . . . .r   ry   c                   L     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
PrimitiveModelzZA primitive type can be represented natively in the target in all
    usage contexts.
    c                 h    t          t          |                               ||           || _        d S r   )superr   r   be_typer   r   r   r   	__class__s       r   r   zPrimitiveModel.__init__   s.    nd##,,S':::r   c                     | j         S r   )r   r   s    r   r   zPrimitiveModel.get_value_type   
    |r   c                     |S r   r<   r&   s      r   r)   zPrimitiveModel.as_data       r   c                     |S r   r<   r&   s      r   r+   zPrimitiveModel.as_argument   r   r   c                     |S r   r<   r&   s      r   r.   zPrimitiveModel.as_return   r   r   c                     |S r   r<   r&   s      r   r0   zPrimitiveModel.from_data   r   r   c                     |S r   r<   r&   s      r   r2   zPrimitiveModel.from_argument   r   r   c                     |S r   r<   r&   s      r   r4   zPrimitiveModel.from_return   r   r   )rh   ri   rj   rk   r   r   r)   r+   r.   r0   r2   r4   __classcell__r   s   @r   r   r      s                               r   r   c                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )
ProxyModelzB
    Helper class for models which delegate to another model.
    c                 4    | j                                         S r   )_proxied_modelr   r   s    r   r   zProxyModel.get_value_type  s    "11333r   c                 4    | j                                         S r   )r   r   r   s    r   r   zProxyModel.get_data_type  s    "00222r   c                 4    | j                                         S r   )r   r$   r   s    r   r$   zProxyModel.get_return_type
  s    "22444r   c                 4    | j                                         S r   )r   r"   r   s    r   r"   zProxyModel.get_argument_type  s    "44666r   c                 8    | j                             ||          S r   )r   r)   r&   s      r   r)   zProxyModel.as_data  s    "**7E:::r   c                 8    | j                             ||          S r   )r   r+   r&   s      r   r+   zProxyModel.as_argument      "..w>>>r   c                 8    | j                             ||          S r   )r   r.   r&   s      r   r.   zProxyModel.as_return      ",,We<<<r   c                 8    | j                             ||          S r   )r   r0   r&   s      r   r0   zProxyModel.from_data  r   r   c                 8    | j                             ||          S r   )r   r2   r&   s      r   r2   zProxyModel.from_argument  s    "00%@@@r   c                 8    | j                             ||          S r   )r   r4   r&   s      r   r4   zProxyModel.from_return  r   r   N)rh   ri   rj   rk   r   r   r$   r"   r)   r+   r.   r0   r2   r4   r<   r   r   r   r      s         4 4 43 3 35 5 57 7 7; ; ;? ? ?= = == = =A A A? ? ? ? ?r   r   c                   "     e Zd ZdZ fdZ xZS )	EnumModelzA
    Enum members are represented exactly like their values.
    c                     t          t          |                               ||           |                    |j                  | _        d S r   )r   r   r   lookupdtyper   r   r   r   r   s      r   r   zEnumModel.__init__)  s?    i''W555!jj77r   rh   ri   rj   rk   r   r   r   s   @r   r   r   #  sB         8 8 8 8 8 8 8 8 8r   r   c                   f     e Zd ZdZ ej        d                                          Z fdZ xZ	S )OpaqueModelz#
    Passed as opaque pointers
    r{   c                 j    | j         }t          t          |                               |||           d S r   )	_ptr_typer   r   r   r   s       r   r   zOpaqueModel.__init__P  s2    .k4  ))#w@@@@@r   )
rh   ri   rj   rk   r   r   
as_pointerr   r   r   r   s   @r   r   r   .  sh        :  
1((**IA A A A A A A A Ar   r   c                        e Zd Zd Zd Zd ZdS )MemInfoModelc                 L    | j                             | j        j                  gS r   )r   r   r   r   r   s    r   rJ   zMemInfoModel.inner_modelsX  s     	  !45566r   c                     dS )NTr<   r   s    r   rT   zMemInfoModel.has_nrt_meminfo[  s    tr   c                     |S r   r<   r&   s      r   rQ   zMemInfoModel.get_nrt_meminfo^  r   r   N)rh   ri   rj   rJ   rT   rQ   r<   r   r   r   r   U  sA        7 7 7      r   r   c                        e Zd Z fdZ xZS )IntegerModelc                     t          j        |j                  }t          t          |                               |||           d S r   )r   r   bitwidthr   r   r   r   s       r   r   zIntegerModel.__init__e  s=    *W-..lD!!**3AAAAAr   rh   ri   rj   r   r   r   s   @r   r   r   b  sA        B B B B B B B B Br   r   c                        e Zd Z fdZ xZS )
FloatModelc                 
   |t           j        k    rt          j                    }n3|t           j        k    rt          j                    }nt          |          t          t          |           	                    |||           d S r   )
r   float32r   	FloatTypefloat64
DoubleTyper   r   r   r   r   s       r   r   zFloatModel.__init__l  sm    em##lnnGG%%mooGG%g...j$((gw?????r   r   r   s   @r   r   r   j  sA        @ @ @ @ @ @ @ @ @r   r   c                        e Zd Z fdZ xZS )PointerModelc                    |                     |j                  | _        | j                                        | _        | j                                        }t          t          |                               |||           d S r   )	r   r   _pointee_modelr   _pointee_be_typer   r   r   r   r   s       r   r   zPointerModel.__init__x  sl    !jj77 $ 3 A A C C'2244lD!!**3AAAAAr   r   r   s   @r   r   r   v  sA        B B B B B B B B Br   r   c                   (    e Zd Zd Zd Zd ZddZdS )EphemeralPointerModelc                     | j         S r   )r   r   s    r   r   z#EphemeralPointerModel.get_data_type  s    $$r   c                 b    |                     |          }| j                            ||          S r   )r7   r   r)   r&   s      r   r)   zEphemeralPointerModel.as_data  s,    U##"**7E:::r   c                      t          d          Nz$use load_from_data_pointer() insteadr   r&   s      r   r0   zEphemeralPointerModel.from_data      !"HIIIr   Nc                 R    |                     ||                                           S r   bitcastr   r8   s       r   r:   z,EphemeralPointerModel.load_from_data_pointer  "    sD$7$7$9$9:::r   r   )rh   ri   rj   r   r)   r0   r:   r<   r   r   r   r     sX        % % %; ; ;J J J; ; ; ; ; ;r   r   c                   8     e Zd Z fdZd Zd Zd ZddZ xZS )EphemeralArrayModelc                     t          t          |                               ||           t          j        | j        | j        j                  | _        d S r   )	r   r   r   r   	ArrayTyper   r   count
_data_typer   s      r   r   zEphemeralArrayModel.__init__  sH    !4((11#w???,t'<'+}':< <r   c                     | j         S r   r   r   s    r   r   z!EphemeralArrayModel.get_data_type  r   r   c                 |    fdt          | j        j                  D             }t          j        |          S )Nc           	      b    g | ]+}                     t          j        |                    ,S r<   )r7   r   gep_inboundsrB   ir'   r(   s     r   rD   z/EphemeralArrayModel.as_data.<locals>.<listcomp>  sD     7 7 7 ,,w3GUAFFGG 7 7 7r   )ranger   r   r   
pack_array)r   r'   r(   valuess    `` r   r)   zEphemeralArrayModel.as_data  sQ    7 7 7 7 7 !4557 7 7!'6222r   c                      t          d          r   r   r&   s      r   r0   zEphemeralArrayModel.from_data  r   r   Nc                 R    |                     ||                                           S r   r   r8   s       r   r:   z*EphemeralArrayModel.load_from_data_pointer  r   r   r   )	rh   ri   rj   r   r   r)   r0   r:   r   r   s   @r   r   r     s|        < < < < <
  3 3 3
J J J; ; ; ; ; ; ; ;r   r   c                        e Zd Z fdZ xZS )ExternalFuncPointerModelc                 8   |j         }                    |j                                                  }fd|j        D             }t          j        t          j        ||                    }t          t          |           
                    ||           d S )Nc                 ^    g | ])}                     |                                          *S r<   )r   r   )rB   rC   r   s     r   rD   z5ExternalFuncPointerModel.__init__.<locals>.<listcomp>  s/    AAA1

1,,..AAAr   )sigr   return_typer   argsr   PointerTypeFunctionTyper   r   r   )r   r   r   r   rettyr   r   r   s    `     r   r   z!ExternalFuncPointerModel.__init__  s    k 

3?++::<<AAAAAAA.!=!=>>&--66sGWMMMMMr   r   r   s   @r   r   r     sA        N N N N N N N N Nr   r   c                   f     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Z xZS )UniTupleModelc                    t          t          |                               ||           |                    |j                  | _        t          |          | _        t          j	        | j        
                                | j                  | _        t          j	        | j                                        | j                  | _        d S r   )r   r  r   r   r   _elem_modelrH   _countr   r   r   _value_typer   r   r   s      r   r   zUniTupleModel.__init__  s    mT""++C999::gm44'll<(8(G(G(I(I(,5 5,t'7'E'E'G'G'+{4 4r   c                     | j         S r   )r	  r   s    r   r   zUniTupleModel.get_value_type  s    r   c                     | j         S r   r   r   s    r   r   zUniTupleModel.get_data_type  r   r   c                 *    |                                  S r   r   r   s    r   r$   zUniTupleModel.get_return_type  r    r   c                 F    | j                                         f| j        z  S r   )r  r"   r  r   s    r   r"   zUniTupleModel.get_argument_type  s!     22446DDr   c                     g }t          | j                  D ]I}|                    ||g          }| j                            ||          }|                    |           J|S r   )r   r  extract_valuer  r+   rK   r   r'   r(   outr   vs         r   r+   zUniTupleModel.as_argument  se    t{## 	 	A%%eaS11A ,,Wa88AJJqMMMM
r   c                     t          j        |                                 t           j                  }t	          |          D ]8\  }}| j                            ||          }|                    |||g          }9|S r   )r   Constantr   	Undefined	enumerater  r2   insert_valuer  s         r   r2   zUniTupleModel.from_argument  st    k$--//>>e$$ 	4 	4DAq ..w::A&&sAs33CC
r   c                 *   t          j        |                                 t           j                  }t	          | j                  D ]L}|                    ||g          }| j                            ||          }|	                    |||g          }M|S r   )
r   r  r   r  r   r  r  r  r)   r  r   r'   r(   r  r   rv   dvals          r   r)   zUniTupleModel.as_data  s    k$,,..==t{## 	7 	7A''s33C#++GS99D&&sD1#66CC
r   c                 *   t          j        |                                 t           j                  }t	          | j                  D ]L}|                    ||g          }| j                            ||          }|	                    |||g          }M|S r   )
r   r  r   r  r   r  r  r  r0   r  r  s          r   r0   zUniTupleModel.from_data  s    k$--//>>t{## 	7 	7A''s33C#--gs;;D&&sD1#66CC
r   c                     |S r   r<   r&   s      r   r.   zUniTupleModel.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zUniTupleModel.from_return  r   r   c                 T     fd fdt           j                  D             S )Nc                 0                         ||           S r   r  )r   r(   r'   s     r   getterz&UniTupleModel.traverse.<locals>.getter  s    ((222r   c                 H    g | ]}j         j        t          |          fS r<   )r   r   r   )rB   r   r!  r   s     r   rD   z*UniTupleModel.traverse.<locals>.<listcomp>  s=     - - - $gfa&8&89 - - -r   )r   r  r   r'   r!  s   ``@r   r>   zUniTupleModel.traverse  sX    	3 	3 	3 	3 	3- - - - -t{++- - - 	-r   c                     | j         gS r   )r  r   s    r   rJ   zUniTupleModel.inner_models  s     !!r   )rh   ri   rj   r   r   r   r$   r"   r+   r2   r)   r0   r.   r4   r>   rJ   r   r   s   @r   r  r    s        4 4 4 4 4       % % %E E E            - - -" " " " " " "r   r  c                       e Zd ZdZdS )CompositeModelzWAny model that is composed of multiple other models should subclass from
    this.
    N)rh   ri   rj   rk   r<   r   r   r&  r&    s          	Dr   r&  c                        e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd ZddZd Zd Zd Zd Zd Zd Zd Zed             Zd Zd Zd Zd Z xZS )StructModelNc                      t          t                                         ||           |rt          | \   _         _        ndx _         _        t           fd j        D                        _        d S )Nr<   c                 D    g | ]}j                             |          S r<   r   r   rA   s     r   rD   z(StructModel.__init__.<locals>.<listcomp>  s)    IIIadi..q11IIIr   )r   r(  r   zip_fields_membersr`   _modelsr   r   r   membersr   s   `   r   r   zStructModel.__init__  sx    k4  ))#w777 	.*-w-'DL$--+--DL4=IIII4=IIIJJr   c                 F    |                      |          }| j        |         S )zU
        StructModel-specific: get the Numba type of the field named *name*.
        )get_field_positionr.  )r   nameposs      r   get_member_fe_typezStructModel.get_member_fe_type  s$     %%d++}S!!r   c                 n    | j         (t          j        d | j        D                       | _         | j         S )Nc                 6    g | ]}|                                 S r<   r   rB   rC   s     r   rD   z.StructModel.get_value_type.<locals>.<listcomp>  s:     5K 5K 5K89 675E5E5G5G 5K 5K 5Kr   )r	  r   rp   r/  r   s    r   r   zStructModel.get_value_type  sN    #!3 5K 5K=A\5K 5K 5K  L  LDr   c                 n    | j         (t          j        d | j        D                       | _         | j         S )Nc                 6    g | ]}|                                 S r<   r   r9  s     r   rD   z-StructModel.get_data_type.<locals>.<listcomp>  s8     4K 4K 4K89 56OO4E4E 4K 4K 4Kr   )r   r   rp   r/  r   s    r   r   zStructModel.get_data_type  sK    ?" 2 4K 4K=A\4K 4K 4K L LDOr   c                 >    t          d | j        D                       S )Nc                 6    g | ]}|                                 S r<   )r"   r9  s     r   rD   z1StructModel.get_argument_type.<locals>.<listcomp>"  s$    BBBa))++BBBr   )r`   r/  r   s    r   r"   zStructModel.get_argument_type!  s!    BBT\BBBCCCr   c                 *    |                                  S r   r   r   s    r   r$   zStructModel.get_return_type$  r   r   c                     g }t          | j                  D ]G\  }}|                     t          ||          ||                     |||                               Ht          |          S r   )r  r/  rK   getattrgetr`   )r   methnamer'   r(   	extractedr   rM   s          r   _aszStructModel._as'  s    	t|,, 	Q 	QEAr2WR2273788GUA3N3NP P Q Q Q QYr   c                 "   t          j        |                                 t           j                  }t	          t          | j        |                    D ]:\  }\  }} t          ||          ||          }|                     ||||          };|S r   )	r   r  r   r  r  r,  r/  r@  set)	r   rB  r'   r(   structr   rM   rv   r  s	            r   _fromzStructModel._from.  s    T0022BLAA%c$,&>&>?? 	5 	5LAyC%H%%gs33AXXgvq!44FFr   c                     |                      d||          }t          j        |                                 t          j                  }t          |          D ]\  }}|                    |||g          }|S )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.
        r)   rD  r   r  r   r  r  r  r   r'   r(   elemsrG  r   els          r   r)   zStructModel.as_data7  ss      GU33T//112<@@u%% 	; 	;EAr))&"qc::FFr   c                     fdt          t          | j                            D             }|                     d|          S )z
        Convert from "data" representation back into "value" representation.
        Usually invoked when loading from array.

        See notes in `as_data()`
        c                 >    g | ]}                     |g          S r<   r   r   s     r   rD   z)StructModel.from_data.<locals>.<listcomp>T  ;     4 4 4 %%eaS11 4 4 4r   r0   r   rH   r.  rH  r   r'   r(   valss    `` r   r0   zStructModel.from_dataM  sY    4 4 4 4 4s4=11224 4 4zz+w555r   c                    g }t          | j                  D ]H\  }}t          j        ||d|          }|                    |||          }|                    |           It          j        |                                 t          j	                  }	t          |          D ]\  }}| 
                    ||	||          }	|	S Nr   )r  r/  r   r   r:   rK   r   r  r   r  rF  )
r   r'   r9   r6   r   r   rW   elem_ptrrv   rG  s
             r   r:   z"StructModel.load_from_data_pointerX  s    !$,// 	 	HAu+GS!Q??H..w%HHCMM#T0022BLAA'' 	7 	7FAsXXgvsA66FFr   c                 0    |                      d||          S )Nr+   )rD  r&   s      r   r+   zStructModel.as_argumentd  s    xxw666r   c                 0    |                      d||          S )Nr2   )rH  r&   s      r   r2   zStructModel.from_argumentg  s    zz/7E:::r   c                     |                      d||          }t          j        |                                 t          j                  }t          |          D ]\  }}|                    |||g          }|S )Nr)   rJ  rK  s          r   r.   zStructModel.as_returnj  sq    GU33T//112<@@u%% 	; 	;EAr))&"qc::FFr   c                     fdt          t          | j                            D             }|                     d|          S )Nc                 >    g | ]}                     |g          S r<   r   r   s     r   rD   z+StructModel.from_return.<locals>.<listcomp>r  rP  r   r0   rQ  rR  s    `` r   r4   zStructModel.from_returnq  sY    4 4 4 4 4s4=11224 4 4zz+w555r   c                     t          |t                    r|                     |          }|                    ||gd| j        |         z             S )a'  Get 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.r4  )
isinstancestrr3  r  r-  )r   r'   rv   r5  s       r   rA  zStructModel.getv  s^      c3 	/))#..C$$S3%*6c9J*J % L L 	Lr   c                     t          |t                    r|                     |          }|                    |||gd| j        |         z             S )an  Set 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_  r3  r  r-  )r   r'   stvalrv   r5  s        r   rF  zStructModel.set  s`    $ c3 	/))#..C##E3)4t|C7H)H $ J J 	Jr   c                     	 | j                             |          S # t          $ r t          | j        j        d|          w xY w)Nz does not have a field named )r-  index
ValueErrorKeyErrorr   rh   )r   fields     r   r3  zStructModel.get_field_position  sa    	?<%%e,,, 	? 	? 	?"n555uu> ? ? ?	?s	    )Ac                 *    t          | j                  S r   )rH   r-  r   s    r   field_countzStructModel.field_count  s    4<   r   c                 p    t          |t                    r|                     |          }| j        |         S )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_  r3  r.  r   r5  s     r   get_typezStructModel.get_type  s6     c3 	/))#..C}S!!r   c                     | j         |         S )z
        Get the datamodel of a field given the position or the fieldname.

        Args
        ----
        pos: int or str
            field index or field name
        r/  rj  s     r   	get_modelzStructModel.get_model  s     |C  r   c                 <      fd fd j         D             S )Nc                     |j                                         k    r2                                |j         f}t           dj        |                               ||           S )Nzexpecting {0} but got {1})r\   r   	TypeErrorformatrA  )kr(   r   r'   r   s      r   r!  z$StructModel.traverse.<locals>.getter  sd    zT002222**,,ej8 B ; BD IJJJ88GUA...r   c                 Z    g | ]'}                     |          t          |          f(S r<   )rk  r   )rB   rs  r!  r   s     r   rD   z(StructModel.traverse.<locals>.<listcomp>  s4    MMM1q!!761#5#56MMMr   )r-  r#  s   ``@r   r>   zStructModel.traverse  sE    	/ 	/ 	/ 	/ 	/ 	/ NMMMMMMMMr   c                     | j         S r   rm  r   s    r   rJ   zStructModel.inner_models  r   r   r   )rh   ri   rj   r	  r   r   r6  r   r   r"   r$   rD  rH  r)   r0   r:   r+   r2   r.   r4   rA  rF  r3  rl   rh  rk  rn  r>   rJ   r   r   s   @r   r(  r(    s       KJK K K K K" " "       D D D$ $ $         ,	6 	6 	6
 
 
 
7 7 7; ; ;  6 6 6
L L L*J J J.? ? ? ! ! X!" " "	! 	! 	!N N N      r   r(  c                   "     e Zd ZeZ fdZ xZS )ComplexModelc                     d|j         fd|j         fg}t          t          |                               |||           d S )Nrealimag)underlying_floatr   rw  r   r0  s       r   r   zComplexModel.__init__  sJ    W-.W-.
 	lD!!**3AAAAAr   )rh   ri   rj   NotImplemented_element_typer   r   r   s   @r   rw  rw    sF        "MB B B B B B B B Br   rw  c                        e Zd Z fdZ xZS )
TupleModelc                     d t          |          D             }t          t          |                               |||           d S )Nc                 <    g | ]\  }}d t          |          z   |fS )f)r_  )rB   r   rC   s      r   rD   z'TupleModel.__init__.<locals>.<listcomp>  s+    DDDAC#a&&L!$DDDr   )r  r   r  r   r0  s       r   r   zTupleModel.__init__  sF    DD71C1CDDDj$((gw?????r   r   r   s   @r   r  r    sA        @ @ @ @ @ @ @ @ @r   r  c                        e Zd Z fdZ xZS )
UnionModelc                     dt           j        fdt           j                            |j                   fg}t	          t
          |                               |||           d S )Ntagpayload)r   uintpTuple
from_typesr   r  r   r0  s       r   r   zUnionModel.__init__  sX    EK ..w}==>

 	j$((gw?????r   r   r   s   @r   r  r    sA        @ @ @ @ @ @ @ @ @r   r  c                        e Zd Z fdZ xZS )	PairModelc                     d|j         fd|j        fg}t          t          |                               |||           d S )Nfirstsecond)
first_typesecond_typer   r  r   r0  s       r   r   zPairModel.__init__  sH    W/0g124i''Wg>>>>>r   r   r   s   @r   r  r    s8        ? ? ? ? ? ? ? ? ?r   r  c                        e Zd Z fdZ xZS )ListPayloadModelc                     dt           j        fdt           j        fdt           j        fd|j        j        fg}t          t          |                               |||           d S )Nsize	allocateddirtydata)r   intpboolean	containerr   r   r  r   r0  s       r   r   zListPayloadModel.__init__  sc    
 UZ %*%em$W&,-
 	%%..sGWEEEEEr   r   r   s   @r   r  r    sA        F F F F F F F F Fr   r  c                        e Zd Z fdZ xZS )	ListModelc                     t          j        |          }dt          j        |          fdt           j        fg}t	          t
          |                               |||           d S Nmeminfoparent)r   ListPayloadMemInfoPointerpyobjectr   r  r   r   r   r   payload_typer1  r   s        r   r   zListModel.__init__  sc    (11 ,\::;u~&	
 	i''Wg>>>>>r   r   r   s   @r   r  r    s8        ? ? ? ? ? ? ? ? ?r   r  c                        e Zd Z fdZ xZS )ListIterModelc                     t          j        |j                  }dt          j        |          fdt          j        t           j                  fg}t          t          |                               |||           d S Nr  rc  )	r   r  r  r  EphemeralPointerr  r   r  r   r  s        r   r   zListIterModel.__init__  sq    ():;; ,\::;e,UZ889	 	mT""++C'BBBBBr   r   r   s   @r   r  r    sA        C C C C C C C C Cr   r  c                        e Zd Z fdZ xZS )SetEntryModelc                     |j         j        }dt          j        fd|fg}t	          t
          |                               |||           d S )Nr_   key)set_typer   r   r  r   r  r   )r   r   r   r   r1  r   s        r   r   zSetEntryModel.__init__*  sR     & UZ EN

 	mT""++C'BBBBBr   r   r   s   @r   r  r  (  sA        C C C C C C C C Cr   r  c                        e Zd Z fdZ xZS )SetPayloadModelc                    t          j        |j                  }dt           j        fdt           j        fdt           j        fdt           j        fdt           j        fd|fg}t          t          |                               |||           d S )Nfillusedmaskfingerr  entries)r   SetEntryr  r  r  r   r  r   )r   r   r   
entry_typer1  r   s        r   r   zSetPayloadModel.__init__6  s    ^G$566
 UZ UZ UZ uz"em$
#
 	ot$$--c7GDDDDDr   r   r   s   @r   r  r  4  sA        E E E E E E E E Er   r  c                        e Zd Z fdZ xZS )SetModelc                     t          j        |          }dt          j        |          fdt           j        fg}t	          t
          |                               |||           d S r  )r   
SetPayloadr  r  r   r  r   r  s        r   r   zSetModel.__init__J  sc    '00 ,\::;u~&	
 	h&&sGW=====r   r   r   s   @r   r  r  H  s8        > > > > > > > > >r   r  c                        e Zd Z fdZ xZS )SetIterModelc                     t          j        |j                  }dt          j        |          fdt          j        t           j                  fg}t          t          |                               |||           d S r  )	r   r  r  r  r  r  r   r  r   r  s        r   r   zSetIterModel.__init__V  sq    '(9:: ,\::;e,UZ889 	lD!!**3AAAAAr   r   r   s   @r   r  r  T  sA        	B 	B 	B 	B 	B 	B 	B 	B 	Br   r  c                        e Zd Z fdZ xZS )
ArrayModelc                    |j         }dt          j        |j                  fdt          j        fdt          j        fdt          j        fdt          j        |j                  fdt          j        t          j        |          fdt          j        t          j        |          fg}t          t          |           
                    |||           d S )Nr  r  nitemsitemsizer  shapestrides)ndimr   r  r   r  r  CPointerUniTupler   r  r   r   r   r   r  r1  r   s        r   r   zArrayModel.__init__i  s    |,W];;<u~&uz"$U^GM223enUZ667uz4889	
 	j$((gw?????r   r   r   s   @r   r  r  b  sA        @ @ @ @ @ @ @ @ @r   r  c                        e Zd Z fdZ xZS )ArrayFlagsModelc                 p    d|j         fg}t          t          |                               |||           d S )Nr  )
array_typer   r  r   r0  s       r   r   zArrayFlagsModel.__init__z  s?    w)*
 	ot$$--c7GDDDDDr   r   r   s   @r   r  r  x  sA        E E E E E E E E Er   r  c                   $     e Zd Z fdZd Z xZS )NestedArrayModelc                     |                     |j                                                  | _        t	          t
          |                               ||           d S r   )r   r   r   _be_typer   r  r   r   s      r   r   zNestedArrayModel.__init__  sK    

7=11??AA%%..sG<<<<<r   c                 N    t          j        | j        | j        j                  }|S )zXReturn the LLVM type representation for the storage of
        the nestedarray.
        )r   r   r  r   r  )r   rets     r   as_storage_typez NestedArrayModel.as_storage_type  s!     l4=$-*>??
r   )rh   ri   rj   r   r  r   r   s   @r   r  r    sG        = = = = =      r   r  c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )OptionalModelc                     d|j         fdt          j        fg}|                    |j                   | _        t          t          |                               |||           d S )Nr  valid)r\   r   r  r   _value_modelr   r  r   r0  s       r   r   zOptionalModel.__init__  s^    W\"em$
  JJw|44mT""++C'BBBBBr   c                 4    | j                                         S r   )r  r$   r   s    r   r$   zOptionalModel.get_return_type  s     00222r   c                     t           r   r   r&   s      r   r.   zOptionalModel.as_return  s    !!r   c                 8    | j                             ||          S r   )r  r4   r&   s      r   r4   zOptionalModel.from_return  s     ,,We<<<r   c                 ~      fd} fd                      d          |f                      d          fgS )Nc                      |           }                     | d          }                    ||t          j        |j        d                     S )Nr  )rA  selectr   r  r\   )r(   r  r  r'   	get_validr   s      r   get_dataz(OptionalModel.traverse.<locals>.get_data  sK    Ie$$E88GUF33D>>%r{49d/K/KLLLr   c                 2                         | d          S )Nr  )rA  )r(   r'   r   s    r   r  z)OptionalModel.traverse.<locals>.get_valid  s    88GUG444r   r  r  )rk  )r   r'   r  r  s   `` @r   r>   zOptionalModel.traverse  s    	M 	M 	M 	M 	M 	M 	M	5 	5 	5 	5 	5 	5 v&&1w''35 	5r   )	rh   ri   rj   r   r$   r.   r4   r>   r   r   s   @r   r  r    sy        C C C C C3 3 3" " "= = =	5 	5 	5 	5 	5 	5 	5r   r  c                   b     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZ xZS )RecordModelc                 *    t          t                                         ||            fd|j        D              _        t          j        t          j        d          |j                   _	         j	        
                                 _        d S )Nc                 J    g | ]\  }}j                             |           S r<   r+  )rB   _rC   r   s      r   rD   z(RecordModel.__init__.<locals>.<listcomp>  s-    HHH1	((++HHHr   r{   )r   r  r   r1  r/  r   r   r   r  r  r   _be_ptr_typer   s   `  r   r   zRecordModel.__init__  sz    k4  ))#w777HHHHHHHRZ]]GLAA M4466r   c                     | j         S )z6Passed around as reference to underlying data
        r  r   s    r   r   zRecordModel.get_value_type  s       r   c                     | j         S r   r  r   s    r   r"   zRecordModel.get_argument_type        r   c                     | j         S r   r  r   s    r   r$   zRecordModel.get_return_type  r  r   c                     | j         S r   r  r   s    r   r   zRecordModel.get_data_type  
    }r   c                 ,    |                     |          S r   r7   r&   s      r   r)   zRecordModel.as_data      ||E"""r   c                      t          d          r   r   r&   s      r   r0   zRecordModel.from_data  r   r   c                     |S r   r<   r&   s      r   r+   zRecordModel.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zRecordModel.from_argument  r   r   c                     |S r   r<   r&   s      r   r.   zRecordModel.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zRecordModel.from_return  r   r   Nc                 R    |                     ||                                           S r   r   r8   s       r   r:   z"RecordModel.load_from_data_pointer  r   r   r   )rh   ri   rj   r   r   r"   r$   r   r)   r0   r+   r2   r.   r4   r:   r   r   s   @r   r  r    s        7 7 7 7 7! ! !
! ! !! ! !  # # #J J J        ; ; ; ; ; ; ; ;r   r  c                   N     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
UnicodeCharSeqc                     t          t          |                               ||           t          j        t
          j        dz            }t          j        ||j                  | _	        d S Nr{   )
r   r  r   r   r   r	   sizeof_unicode_charr   r   r  r   r   r   chartyr   s       r   r   zUnicodeCharSeq.__init__  sS    nd##,,S':::M=ABBVW];;r   c                     | j         S r   r  r   s    r   r   zUnicodeCharSeq.get_value_type  r  r   c                     | j         S r   r  r   s    r   r   zUnicodeCharSeq.get_data_type  r  r   c                     |S r   r<   r&   s      r   r)   zUnicodeCharSeq.as_data  r   r   c                     |S r   r<   r&   s      r   r0   zUnicodeCharSeq.from_data  r   r   c                     |S r   r<   r&   s      r   r.   zUnicodeCharSeq.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zUnicodeCharSeq.from_return  r   r   c                     |S r   r<   r&   s      r   r+   zUnicodeCharSeq.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zUnicodeCharSeq.from_argument  r   r   rh   ri   rj   r   r   r   r)   r0   r.   r4   r+   r2   r   r   s   @r   r  r            < < < < <
                    r   r  c                   N     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
CharSeqc                     t          t          |                               ||           t          j        d          }t          j        ||j                  | _        d S r   )r   r  r   r   r   r   r   r  r  s       r   r   zCharSeq.__init__  sI    gt%%c7333AVW];;r   c                     | j         S r   r  r   s    r   r   zCharSeq.get_value_type  r  r   c                     | j         S r   r  r   s    r   r   zCharSeq.get_data_type  r  r   c                     |S r   r<   r&   s      r   r)   zCharSeq.as_data  r   r   c                     |S r   r<   r&   s      r   r0   zCharSeq.from_data
  r   r   c                     |S r   r<   r&   s      r   r.   zCharSeq.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zCharSeq.from_return  r   r   c                     |S r   r<   r&   s      r   r+   zCharSeq.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zCharSeq.from_argument  r   r   r  r   s   @r   r  r    r  r   r  c                        e Zd Z fdZ xZS )CContiguousFlatIterc                 x   |j         j        dk    sJ |j         }|j        }|j        }d|fdt          j        fdt	          j        t          j                  fg}|r4|                    dt	          j        t          j        |          f           t          t          |                               |||           d S )NCarraystriderc  indices)r  layoutr   r  r   r  r  rK   EphemeralArrayr   r  r   )	r   r   r   need_indicesr  r   r  r1  r   s	           r   r   zCContiguousFlatIter.__init__  s    !(C////'
 Z(ej)U3EJ??@  	PNNIu';EJ'M'MNOOO!4((11#wHHHHHr   r   r   s   @r   r  r    sA        I I I I I I I I Ir   r  c                        e Zd Z fdZ xZS )FlatIterc                 ^   |j         }|j        }|j        }d|fdt          j        t          j        |          |          fdt          j        t          j        |          fdt          j        t          j                  fg}t          t          |                               |||           d S )Nr  pointersr  	exhausted)r  r   r  r   r!  r  r  r  r  r   r$  r   )r   r   r   r  r   r  r1  r   s          r   r   zFlatIter.__init__+  s    '
 Z( 4U^E5J5JD Q QRu3EJEEF!7!F!FG

 	h&&sGW=====r   r   r   s   @r   r$  r$  *  s8        	> 	> 	> 	> 	> 	> 	> 	> 	>r   r$  c                        e Zd Z fdZ xZS )UniTupleIterc                     dt          j        t           j                  fd|j        fg}t	          t
          |                               |||           d S )Nrc  r`   )r   r  r  r  r   r)  r   r0  s       r   r   zUniTupleIter.__init__9  sR    U3EJ??@W.02lD!!**3AAAAAr   r   r   s   @r   r)  r)  7  sA        B B B B B B B B Br   r)  c                        e Zd Z fdZ xZS )
SliceModelc                     dt           j        fdt           j        fdt           j        fg}t          t          |                               |||           d S Nstartstopstep)r   r  r   r,  r   r0  s       r   r   zSliceModel.__init__B  sR    UZ(EJ'EJ' 	j$((gw?????r   r   r   s   @r   r,  r,  ?  sA        @ @ @ @ @ @ @ @ @r   r,  c                        e Zd Z fdZ xZS )NPDatetimeModelc                     t          j        d          }t          t          |                               |||           d S )N@   )r   r   r   r3  r   r   s       r   r   zNPDatetimeModel.__init__M  s8    *R..ot$$--c7GDDDDDr   r   r   s   @r   r3  r3  J  sA        E E E E E E E E Er   r3  c                        e Zd Z fdZ xZS )ArrayIteratorc                     dt          j        t           j                  fd|j        fg}t	          t
          |                               |||           d S )Nrc  r  )r   r  r  r  r   r7  r   r0  s       r   r   zArrayIterator.__init__T  sR    U3EK@@AW/02mT""++C'BBBBBr   r   r   s   @r   r7  r7  R  A        C C C C C C C C Cr   r7  c                        e Zd Z fdZ xZS )EnumerateTypec                     dt          j        t           j                  fd|j        fg}t	          t
          |                               |||           d S )Nr   iter)r   r  r  source_typer   r;  r   r0  s       r   r   zEnumerateType.__init__]  sT    U3EJ??@G/02 	mT""++C'BBBBBr   r   r   s   @r   r;  r;  [  r9  r   r;  c                        e Zd Z fdZ xZS )ZipTypec                     d t          |j                  D             }t          t          |                               |||           d S )Nc                 ,    g | ]\  }}d |z  |j         fS )ziter%d)iterator_type)rB   r   r>  s      r   rD   z$ZipType.__init__.<locals>.<listcomp>g  s>     J J J%q+ qL+";< J J Jr   )r  source_typesr   r@  r   r0  s       r   r   zZipType.__init__f  sY    J J)273G)H)HJ J Jgt%%c7G<<<<<r   r   r   s   @r   r@  r@  d  s8        = = = = = = = = =r   r@  c                        e Zd Z fdZ xZS )RangeIteratorTypec                     |j         }dt          j        |          fd|fd|fdt          j        |          fg}t          t          |                               |||           d S )Nr=  r0  r1  r   )
yield_typer   r  r   rF  r   r   r   r   int_typer1  r   s        r   r   zRangeIteratorType.__init__n  st    %E28<<=H%H%U3H==>@ 	&&//WgFFFFFr   r   r   s   @r   rF  rF  l  sA        G G G G G G G G Gr   rF  c                   Z     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )GeneratorModelc                 L    t          t                                         ||            fd|j        D              _         fd|j        D              _        t          j        d  j        D                        _	        t          j        d  j        D                        _
        t          j         j                            t          j                                                   j	         j
        g           _         j                                         _        d S )Nc                 x    g | ]6}t          |t          j                  j                            |          7S r<   )r^  r   Omittedr   r   rA   s     r   rD   z+GeneratorModel.__init__.<locals>.<listcomp>|  sP     A A AA#-a#?#?ADI,,Q// A A Ar   c                 D    g | ]}j                             |          S r<   r+  rA   s     r   rD   z+GeneratorModel.__init__.<locals>.<listcomp>~  s)    OOOadi..q11OOOr   c                 6    g | ]}|                                 S r<   r   r9  s     r   rD   z+GeneratorModel.__init__.<locals>.<listcomp>  s"    9991Q__999r   c                 6    g | ]}|                                 S r<   r   r9  s     r   rD   z+GeneratorModel.__init__.<locals>.<listcomp>  s"    ;;;1Q__;;;r   )r   rL  r   	arg_types_arg_modelsstate_types_state_modelsr   rp   _args_be_type_state_be_typer   r   r   int32r   r  r   r  r   s   `  r   r   zGeneratorModel.__init__y  s.   nd##,,S':::A A A A9J A A AOOOO7;NOOO199(8999; ; 2;;(:;;;= = ,Yek**99;;!467 7 !M4466r   c                     | j         S )zH
        The generator closure is passed around as a reference.
        r  r   s    r   r   zGeneratorModel.get_value_type  s       r   c                     | j         S r   r  r   s    r   r"   z GeneratorModel.get_argument_type  r  r   c                     | j         S r   r  r   s    r   r$   zGeneratorModel.get_return_type  r  r   c                     | j         S r   r  r   s    r   r   zGeneratorModel.get_data_type  r  r   c                     |S r   r<   r&   s      r   r+   zGeneratorModel.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zGeneratorModel.from_argument  r   r   c                 .    |                      ||          S r   r   r&   s      r   r.   zGeneratorModel.as_return  r   r   c                 .    |                      ||          S r   r   r&   s      r   r4   zGeneratorModel.from_return  r   r   c                 ,    |                     |          S r   r  r&   s      r   r)   zGeneratorModel.as_data  r  r   c                 f    t          j        ||j                  }|                    ||           |S r   )r   r   r\   r   )r   r'   r(   stacks       r   r0   zGeneratorModel.from_data  s/    #GUZ88eU###r   )rh   ri   rj   r   r   r"   r$   r   r+   r2   r.   r4   r)   r0   r   r   s   @r   rL  rL  w  s        7 7 7 7 7"! ! !! ! !        , , ,. . .# # #      r   rL  c                        e Zd Z fdZ xZS )ArrayCTypesModelc                     dt          j        |j                  fdt          j        |j                  fg}t	          t
          |                               |||           d S )Nr  r  )r   r  r   r  r   rf  r   r0  s       r   r   zArrayCTypesModel.__init__  s]    EN7=99:u3GMBBCE%%..sGWEEEEEr   r   r   s   @r   rf  rf    sA        F F F F F F F F Fr   rf  c                        e Zd Z fdZ xZS )
RangeModelc                     |j         j        }d|fd|fd|fg}t          t          |                               |||           d S r.  )rC  rH  r   ri  r   rI  s        r   r   zRangeModel.__init__  sW    (3X&H%H%' 	j$((gw?????r   r   r   s   @r   ri  ri    sA        @ @ @ @ @ @ @ @ @r   ri  c                        e Zd Z fdZ xZS )NdIndexModelc                 ,   |j         }dt          j        t          j        |          fdt          j        t          j        |          fdt          j        t          j                  fg}t          t          |           	                    |||           d S )Nr  r  r'  )
r  r   r  r  r!  r  r  r   rl  r   r  s        r   r   zNdIndexModel.__init__  s}    |U^EJ==>u3EJEEF!7!F!FG 	lD!!**3AAAAAr   r   r   s   @r   rl  rl    sA        B B B B B B B B Br   rl  c                 f    |j         j        dk    rt          | |d          S t          | |          S )Nr  Fr"  r  r   r  r$  r   r   s     r   handle_numpy_flat_typerr    s7    	}s"""3????R   r   c                 f    |j         j        dk    rt          | |d          S t          | |          S )Nr  Tro  rp  rq  s     r   handle_numpy_ndenumerate_typert    s7    	}s"""3>>>>R   r   c                     | |j                  S r   )thisrq  s     r   handle_bound_functionrw    s     rw<r   c                        e Zd Z fdZ xZS )NdIterc                 
   |j         }|j        }|j        r|nd}dt          j        t          j                  fdt          j        |          fdt          j        t          j        |          fdt          j	        t          j        |          fg}t          |j                  D ]Q\  }}|\  }	}
}}d|z  }|	dk    r4|                    |t          j        t          j                  f           K|	dv rPJ t          |j                   D ]M\  }}t          |t          j                  s.d
|z  }|                    |t          j        |          f           Nt          t           |                               |||           d S )Nrz   r'  arraysr  r  zindex%dflat)scalarindexed0dr   zscalar%d)r{  r  need_shaped_indexingr   r  r  r  r  r  r!  r  indexersrK   r^  Arrayr   ry  r   )r   r   r   array_typesr  	shape_lenr1  r   subkind	start_dimend_dimr  member_namer   r   s                  r   r   zNdIter.__init__  s   n|#8?DDa	!7!F!FGek+667U^EJ	BBCu3EJ	JJK	   011 
	 
	FAs*-'D)Wa#a-Kv~~U-CEJ-O-OPQQQQ444q w~.. 	J 	JEArb%+.. J(1nU-CB-G-GHIIIfd$$S'7;;;;;r   r   r   s   @r   ry  ry    s8        < < < < < < < < <r   ry  c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZddZd Zd Zd Zed             Zd Z xZS )DeferredStructModelc                     t          t          |                               ||           d                    t	          |                    | _        |                                | _        d S )Nzdeferred.{0})r   r  r   rr  idtypenamerA  actual_fe_typer   s      r   r   zDeferredStructModel.__init__  sU    !4((11#w???&--bkk::%kkmmr   c                 P    t           j                            | j        dz             S )Nz.valuer   global_contextget_identified_typer  r   s    r   r   z"DeferredStructModel.get_value_type  s      44T]X5MNNNr   c                 P    t           j                            | j        dz             S )Nz.datar  r   s    r   r   z!DeferredStructModel.get_data_type  s      44T]W5LMMMr   c                 4    | j                                         S r   )_actual_modelr"   r   s    r   r"   z%DeferredStructModel.get_argument_type  s    !33555r   c                 d    |                      ||          }| j                            ||          S r   )rA  r  r+   )r   r'   r(   inners       r   r+   zDeferredStructModel.as_argument  s.    %((!--gu===r   c                     | j                             ||          }|                     ||                                 |          S r   )r  r2   rF  make_uninitialized)r   r'   r(   ress       r   r2   z!DeferredStructModel.from_argument  s<     ..w>>xx!8!8!:!:C@@@r   c                     |                                   |                     ||          }| j                            ||          }|                                 }|                     |||          S r   )_definerA  r  r0   r  rF  r   r'   r(   elemr  s        r   r0   zDeferredStructModel.from_data  sa    xx''",,Wd;;%%''xxe,,,r   c                     |                                   |                     ||          }| j                            ||          }|                     d          }|                     |||          S )Nr  )r  )r  rA  r  r)   r  rF  r  s        r   r)   zDeferredStructModel.as_data$  sf    xx''"**7D99%%6%22xxe,,,r   c                     |S r   r<   r&   s      r   r4   zDeferredStructModel.from_return+  r   r   c                     |S r   r<   r&   s      r   r.   zDeferredStructModel.as_return.  r   r   c                 0    |                     |dg          S rU  r   r&   s      r   rA  zDeferredStructModel.get1  s    $$UQC000r   c                 2    |                     ||dg          S rU  )r  )r   r'   r(   contents       r   rF  zDeferredStructModel.set4  s    ##E7QC888r   r(   c                     |                                   |dk    r|                                 }n|                                 }t          j        |t          j                  S )Nr(   )r  r   r   r   r  r  )r   r  r   s      r   r  z&DeferredStructModel.make_uninitialized7  sP    7??$$&&BB##%%B{2r|,,,r   c                     |                                  }|                     |           |                                 }|                     |           d S r   )r   _define_value_typer   _define_data_type)r   valtydattys      r   r  zDeferredStructModel._define?  sR    ##%%&&&""$$u%%%%%r   c                 p    |j         r.|                    | j                                                   d S d S r   )	is_opaqueset_bodyr  r   )r   
value_types     r   r  z&DeferredStructModel._define_value_typeE  sC     	E 2 A A C CDDDDD	E 	Er   c                 p    |j         r.|                    | j                                                   d S d S r   )r  r  r  r   )r   	data_types     r   r  z%DeferredStructModel._define_data_typeI  sC     	Ct1??AABBBBB	C 	Cr   c                 @    | j                             | j                  S r   )r   r   r  r   s    r   r  z!DeferredStructModel._actual_modelM  s    y 3444r   c                     | j         fdfgS )Nc                 2                         | dg          S rU  r   )r(   r'   s    r   <lambda>z.DeferredStructModel.traverse.<locals>.<lambda>S  s    w44UQC@@ r   )r  r=   s    `r   r>   zDeferredStructModel.traverseQ  s'    $@@@@B C 	Cr   )r(   )rh   ri   rj   r   r   r   r"   r+   r2   r0   r)   r4   r.   rA  rF  r  r  r  r  rl   r  r>   r   r   s   @r   r  r    s^       , , , , ,
O O ON N N6 6 6> > >A A A- - -- - -    1 1 19 9 9- - - -& & &E E EC C C 5 5 X5C C C C C C Cr   r  c                   "     e Zd ZdZ fdZ xZS )StructPayloadModelz.Model for the payload of a mutable struct
    c                     t          |j                                                  }t                                          |||           d S r   )r`   
field_dictitemsr   r   )r   r   fe_typr1  r   s       r   r   zStructPayloadModel.__init__Z  sA    )//1122fg.....r   r   r   s   @r   r  r  V  sB         / / / / / / / / /r   r  c                   "     e Zd ZdZ fdZ xZS )StructRefModelz?Model for a mutable struct.
    A reference to the payload
    c                     |                                 }dt          j        |          fg}t                                          |||           d S )Nr  )r   r   r  r   r   )r   r   r  r   r1  r   s        r   r   zStructRefModel.__init__c  sR    $$&&,U334
 	fg.....r   r   r   s   @r   r  r  _  sB         / / / / / / / / /r   r  N)	functoolsr   collectionsr   llvmliter   numba.core.datamodel.registryr   
numba.corer   r   numba.npr	   objectr   rO  rn   BooleanBooleanLiteralry   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!  r   ExternalFunctionPointerr   r  NamedUniTupleStarArgUniTupler  r&  r(  Complexrw  LiteralListLiteralStrKeyDictr  
NamedTupleStarArgTupler  	UnionTyper  Pairr  r  r  Listr  ListIterr  r  r  r  r  Setr  SetIterr  r  Buffer	ByteArrayBytes
MemoryViewPyArrayr  
ArrayFlagsr  NestedArrayr  Optionalr  Recordr  r  r  r  r$  r)  miscSliceLiteral	SliceTyper,  
NPDatetimeNPTimedeltar3  r7  r;  r@  rF  	GeneratorrL  ArrayCTypesrf  	RangeTyperi  NumpyNdIndexTyperl  NumpyFlatTyperr  NumpyNdEnumerateTypert  BoundFunctionrw  NumpyNdIterTypery  DeferredTyper  StructRefPayloadr  r  r<   r   r   <module>r     s0                     : : : : : : % % % % % % % % " " " " " "O& O& O& O& O& O& O& O&d %-      )   ! * %-  %&''(. (. (. (. (.9 (. (. (' ! (.V    Y   >!? !? !? !? !? !? !? !?H %"##%%&&8 8 8 8 8
 8 8 '& $#8 %,%.!!%"##%.!!%%&&%$%%%.!!%*%,%,%-  %.!!%&''%"##%)**%&''%+%)**%())%/""%$%%%#$$%-  %'((%+%%&&%+,,%,A A A A A. A A   -, '&  )( !  %$ &% #" *) +*  (' +* $# (' "! !       "! &% '& "! $# "!  8A %&''	 	 	 	 	; 	 	 ('	 %-  %&''B B B B B> B B (' ! B %+@ @ @ @ @ @ @ @ %.!!B B B B B> B B "!B %()); ; ; ; ;L ; ; *);  %&''; ; ; ; ;, ; ; (';, %/00N N N N N~ N N 10N %.!!%%&&%'((B" B" B" B" B"I B" B" )( '& "!B"J	 	 	 	 	Y 	 	 	M M M M M. M M M` %-  B B B B B; B B ! B %#$$%)**%+%"##%$%%@ @ @ @ @ @ @ &% $#  +* %$
@ %/""@ @ @ @ @ @ @ #"@ %*? ? ? ? ? ? ? ? %#$$F F F F F{ F F %$F  %*	? 	? 	? 	? 	? 	? 	? 	? %.!!	C 	C 	C 	C 	CK 	C 	C "!	C %.!!C C C C CK C C "!C %"##E E E E Ek E E $#E& %)	> 	> 	> 	> 	>{ 	> 	> 	> %-  
B 
B 
B 
B 
B; 
B 
B ! 
B %+%,%/""%+%"##%-  @ @ @ @ @ @ @ !  $#  #"   @  %"##E E E E Ek E E $#E %#$$
 
 
 
 
z 
 
 %$
 %.!!5 5 5 5 5K 5 5 "!5< %,(; (; (; (; (;. (; (;  (;V %&''    Y   ('> %-      i   ! >I I I I I+ I I I 
> 
> 
> 
> 
>{ 
> 
> 
> %$%%B B B B B; B B &%B %*)**%/""@ @ @ @ @ @ @ #" +*@ %"##%#$$E E E E En E E %$ $#E %%&&C C C C CK C C '&C %%&&C C C C CK C C '&C %-  = = = = =k = = ! = %)**G G G G G G G +*G %/""3 3 3 3 3^ 3 3 #"3l %#$$F F F F F{ F F %$F %/""@ @ @ @ @ @ @ #"@ %())B B B B B; B B *)B %%&&! ! '&! %,--! ! .-! %%&&  '&
 %'((< < < < <[ < < )(<D %$%%MC MC MC MC MC. MC MC &%MC` %())/ / / / / / / *)/	/ 	/ 	/ 	/ 	/[ 	/ 	/ 	/ 	/ 	/r   