o
    giѭ                      @   s.  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 deZee	jG d	d
 d
eZee	jee	jG dd deZG dd deZG dd deZee	jee	jG d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 deZ5ee	j6G dd de5Z7ee	j8ee	j9G dd deZ:ee	j;G dd deZ<ee	j=G dd deZ>ee	j?G dd de>Z@ee	jAG dd  d e>ZBee	jCG d!d" d"eZDee	jEee	jFee	jGG d#d$ d$eZHG d%d& d&eZIG d'd( d(eIZJee	jKG d)d* d*eJZLee	jMee	jNee	jOee	jPee	jQG d+d, d,eJZRee	jSG d-d. d.eJZTee	jUG d/d0 d0eJZVee	jWG d1d2 d2eJZXee	jYG d3d4 d4eJZZee	j[G d5d6 d6eJZ\ee	j]G d7d8 d8eJZ^ee	j_G d9d: d:eJZ`ee	jaG d;d< d<eJZbee	jcG d=d> d>eJZdee	jeee	jfee	jgee	jhee	jiee	jjG d?d@ d@eJZkee	jlG dAdB dBeJZmee	jnG dCdD dDekZoee	jpG dEdF dFeJZqee	jrG dGdH dHeIZsee	jtG dIdJ dJeZtee	juG dKdL dLeZuG dMdN dNeJZvG dOdP dPeJZwee	jxG dQdR dReJZxee	jyjzee	j{G dSdT dTeJZ|ee	j}ee	j~G dUdV dVeZee	jG dWdX dXeJZee	jG dYdZ dZeJZee	jG d[d\ d\eJZee	jG d]d^ d^eJZee	jG d_d` d`eIZee	jG dadb dbeJZee	jG dcdd ddeJZee	jG dedf dfeJZee	jdgdh Zee	jdidj Zee	jdkdl Zee	jG dmdn dneJZee	jG dodp dpeIZee	jG dqdr dreJZG dsdt dteJZduS )v    )partial)deque)ir)register_default)typescgutils)numpy_supportc                   @   s   e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zd3ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 ZdS )4	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                 C   s   || _ || _d S N)_dmm_fe_typeselfdmmfe_type r   N/home/kuhnn/.local/lib/python3.10/site-packages/numba/core/datamodel/models.py__init__"   s   
zDataModel.__init__c                 C      | j S r
   )r   r   r   r   r   r   &   s   zDataModel.fe_typec                 C      t | r
   NotImplementedErrorr   r   r   r   get_value_type*      zDataModel.get_value_typec                 C      |   S r
   r   r   r   r   r   get_data_type-   r   zDataModel.get_data_typec                 C   r   )z8Return a LLVM type or nested tuple of LLVM type
        r   r   r   r   r   get_argument_type0   s   zDataModel.get_argument_typec                 C   r   r
   r   r   r   r   r   get_return_type5   r   zDataModel.get_return_typec                 C   r   r
   r   r   buildervaluer   r   r   as_data8   r   zDataModel.as_datac                 C   r   )z`
        Takes one LLVM value
        Return a LLVM value or nested tuple of LLVM value
        r   r    r   r   r   as_argument;      zDataModel.as_argumentc                 C   r   r
   r   r    r   r   r   	as_returnB   r   zDataModel.as_returnc                 C   r   r
   r   r    r   r   r   	from_dataE   r   zDataModel.from_datac                 C   r   )za
        Takes a LLVM value or nested tuple of LLVM value
        Returns one LLVM value
        r   r    r   r   r   from_argumentH   r%   zDataModel.from_argumentc                 C   r   r
   r   r    r   r   r   from_returnO   r   zDataModel.from_returnNc                 C   s   |  ||j||dS )z~
        Load value from a pointer to data.
        This is the default implementation, sufficient for most purposes.
        )align)r'   loadr   r!   ptrr*   r   r   r   load_from_data_pointerR   s   z DataModel.load_from_data_pointerc                 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   r!   r   r   r   traverseY   s   zDataModel.traversec                    s    fdd   D S )zE
        Recursively list all models involved in this model.
        c                    s   g | ]} j | qS r   )r   .0tr   r   r   
<listcomp>e   s    z-DataModel.traverse_models.<locals>.<listcomp>)traverse_typesr   r   r   r   traverse_modelsa      zDataModel.traverse_modelsc                 C   sd   | j g}t| g}t|dkr0| }| D ]}|j |vr)|| ||j  qt|dks|S )zM
        Recursively list all frontend types involved in this model.
        r   )r   r   lenpopleftinner_modelsappend)r   r   queuedmi_dmr   r   r   r6   g   s   


zDataModel.traverse_typesc                 C   r/   )z*
        List all *inner* models.
        r   r   r   r   r   r;   w   s   zDataModel.inner_modelsc                 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    r   r   r   get_nrt_meminfo}   s   zDataModel.get_nrt_meminfoc                 C   r@   NFr   r   r   r   r   has_nrt_meminfo      zDataModel.has_nrt_meminfoc                 C   s   t dd |  D S )zQ
        Recursively check all contained types for need for NRT meminfo.
        c                 s   s    | ]}|  V  qd S r
   )rC   )r3   modelr   r   r   	<genexpr>   s    z1DataModel.contains_nrt_meminfo.<locals>.<genexpr>)anyr7   r   r   r   r   contains_nrt_meminfo   r8   zDataModel.contains_nrt_meminfoc                 C   s   t | | jfS r
   )typer   r   r   r   r   _compared_fields      zDataModel._compared_fieldsc                 C   s   t t|  S r
   )hashtuplerJ   r   r   r   r   __hash__      zDataModel.__hash__c                 C   s$   t | t |u r|  | kS dS rB   )rI   rJ   r   otherr   r   r   __eq__   s   zDataModel.__eq__c                 C   s   |  | S r
   )rR   rP   r   r   r   __ne__      zDataModel.__ne__r
   )__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r#   r$   r&   r'   r(   r)   r.   r1   r7   r6   r;   rA   rC   rH   rJ   rN   rR   rS   r   r   r   r   r	      s6    

r	   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )OmittedArgDataModelz
    A data model for omitted arguments.  Only the "argument" representation
    is defined, other representations raise a NotImplementedError.
    c                 C   s
   t g S r
   )r   LiteralStructTyper   r   r   r   r         
z"OmittedArgDataModel.get_value_typec                 C   r@   Nr   r   r   r   r   r   r      rD   z%OmittedArgDataModel.get_argument_typec                 C   r@   r]   r   r   r!   valr   r   r   r$      rD   zOmittedArgDataModel.as_argumentc                 C   s   |dksJ |d S r]   r   r^   r   r   r   r(      s   z!OmittedArgDataModel.from_argumentN)rU   rV   rW   rX   r   r   r$   r(   r   r   r   r   rZ      s    rZ   c                   @   sp   e Zd ZedZedZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )BooleanModel      c                 C   r   r
   )	_bit_typer   r   r   r   r         zBooleanModel.get_value_typec                 C   r   r
   )
_byte_typer   r   r   r   r      rd   zBooleanModel.get_data_typec                 C   r   r
   r   r   r   r   r   r      r   zBooleanModel.get_return_typec                 C   r   r
   rf   r   r   r   r   r      r   zBooleanModel.get_argument_typec                 C      | ||  S r
   )zextr   r    r   r   r   r#      rO   zBooleanModel.as_datac                 C      |  ||S r
   r#   r    r   r   r   r$      rT   zBooleanModel.as_argumentc                 C   ri   r
   rj   r    r   r   r   r&      rT   zBooleanModel.as_returnc              	   C   s   |   }t||}|d||d}||>\}}| ||d| W d    n1 s1w   Y  | ||d| W d    n1 sKw   Y  W d    n1 sZw   Y  ||S )Nz==r   ra   )r   r   alloca_onceicmp_unsignedrI   if_elsestorer+   )r   r!   r"   ty	resallocacondthen	otherwiser   r   r   r'      s   
zBooleanModel.from_datac                 C   ri   r
   r'   r    r   r   r   r(      rT   zBooleanModel.from_argumentc                 C   ri   r
   rt   r    r   r   r   r)      rT   zBooleanModel.from_returnN)rU   rV   rW   r   IntTyperc   re   r   r   r   r   r#   r$   r&   r'   r(   r)   r   r   r   r   r`      s    

r`   c                       sX   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Z  ZS )PrimitiveModelzZA primitive type can be represented natively in the target in all
    usage contexts.
    c                    s   t t| || || _d S r
   )superrv   r   be_typer   r   r   rx   	__class__r   r   r      s   
zPrimitiveModel.__init__c                 C   r   r
   )rx   r   r   r   r   r      rd   zPrimitiveModel.get_value_typec                 C      |S r
   r   r    r   r   r   r#      rD   zPrimitiveModel.as_datac                 C   r|   r
   r   r    r   r   r   r$      rD   zPrimitiveModel.as_argumentc                 C   r|   r
   r   r    r   r   r   r&      rD   zPrimitiveModel.as_returnc                 C   r|   r
   r   r    r   r   r   r'      rD   zPrimitiveModel.from_datac                 C   r|   r
   r   r    r   r   r   r(      rD   zPrimitiveModel.from_argumentc                 C   r|   r
   r   r    r   r   r   r)      rD   zPrimitiveModel.from_return)rU   rV   rW   rX   r   r   r#   r$   r&   r'   r(   r)   __classcell__r   r   rz   r   rv      s    rv   c                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd ZdS )
ProxyModelzB
    Helper class for models which delegate to another model.
    c                 C   
   | j  S r
   )_proxied_modelr   r   r   r   r   r     r\   zProxyModel.get_value_typec                 C   r   r
   )r   r   r   r   r   r   r     r\   zProxyModel.get_data_typec                 C   r   r
   )r   r   r   r   r   r   r   
  r\   zProxyModel.get_return_typec                 C   r   r
   )r   r   r   r   r   r   r     r\   zProxyModel.get_argument_typec                 C      | j ||S r
   )r   r#   r    r   r   r   r#     rK   zProxyModel.as_datac                 C   r   r
   )r   r$   r    r   r   r   r$     rK   zProxyModel.as_argumentc                 C   r   r
   )r   r&   r    r   r   r   r&     rK   zProxyModel.as_returnc                 C   r   r
   )r   r'   r    r   r   r   r'     rK   zProxyModel.from_datac                 C   r   r
   )r   r(   r    r   r   r   r(     rK   zProxyModel.from_argumentc                 C   r   r
   )r   r)   r    r   r   r   r)     rK   zProxyModel.from_returnN)rU   rV   rW   rX   r   r   r   r   r#   r$   r&   r'   r(   r)   r   r   r   r   r~      s    r~   c                           e Zd ZdZ fddZ  ZS )	EnumModelzA
    Enum members are represented exactly like their values.
    c                    s$   t t| || ||j| _d S r
   )rw   r   r   lookupdtyper   r   rz   r   r   r   )  s   zEnumModel.__init__rU   rV   rW   rX   r   r}   r   r   rz   r   r   #  s    r   c                       s.   e Zd ZdZed Z fddZ  Z	S )OpaqueModelz#
    Passed as opaque pointers
    rb   c                    s   | j }tt| ||| d S r
   )	_ptr_typerw   r   r   ry   rz   r   r   r   P  s   zOpaqueModel.__init__)
rU   rV   rW   rX   r   ru   
as_pointerr   r   r}   r   r   rz   r   r   .  s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )MemInfoModelc                 C   s   | j | jjgS r
   )r   r   r   r   r   r   r   r   r;   X     zMemInfoModel.inner_modelsc                 C   r@   )NTr   r   r   r   r   rC   [  rD   zMemInfoModel.has_nrt_meminfoc                 C   r|   r
   r   r    r   r   r   rA   ^  rD   zMemInfoModel.get_nrt_meminfoN)rU   rV   rW   r;   rC   rA   r   r   r   r   r   U  s    r   c                          e Zd Z fddZ  ZS )IntegerModelc                    s$   t |j}tt| ||| d S r
   )r   ru   bitwidthrw   r   r   ry   rz   r   r   r   e  s   zIntegerModel.__init__rU   rV   rW   r   r}   r   r   rz   r   r   b      r   c                       r   )
FloatModelc                    sH   |t jkr
t }n|t jkrt }nt|tt| 	||| d S r
   )
r   float32r   	FloatTypefloat64
DoubleTyper   rw   r   r   ry   rz   r   r   r   l  s   



zFloatModel.__init__r   r   r   rz   r   r   j      r   c                       r   )PointerModelc                    s<   | |j| _| j | _| j }tt| ||| d S r
   )	r   r   _pointee_modelr   _pointee_be_typer   rw   r   r   ry   rz   r   r   r   x  s   
zPointerModel.__init__r   r   r   rz   r   r   v  r   r   c                   @   s.   e Zd Zdd Zdd Zdd Zd
dd	ZdS )EphemeralPointerModelc                 C   r   r
   )r   r   r   r   r   r     rd   z#EphemeralPointerModel.get_data_typec                 C   s   | |}| j||S r
   )r+   r   r#   r    r   r   r   r#     s   
zEphemeralPointerModel.as_datac                 C      t dNz$use load_from_data_pointer() insteadr   r    r   r   r   r'     r   zEphemeralPointerModel.from_dataNc                 C   rg   r
   bitcastr   r,   r   r   r   r.     rO   z,EphemeralPointerModel.load_from_data_pointerr
   )rU   rV   rW   r   r#   r'   r.   r   r   r   r   r     s
    r   c                       s>   e Zd Z fddZdd Zdd Zdd Zdd
dZ  ZS )EphemeralArrayModelc                    s*   t t| || t| j| jj| _d S r
   )	rw   r   r   r   	ArrayTyper   r   count
_data_typer   rz   r   r   r     s   
zEphemeralArrayModel.__init__c                 C   r   r
   r   r   r   r   r   r     rd   z!EphemeralArrayModel.get_data_typec                    s(    fddt | jjD }t |S )Nc              	      s    g | ]}  t |qS r   )r+   r   gep_inboundsr3   ir!   r"   r   r   r5     s    z/EphemeralArrayModel.as_data.<locals>.<listcomp>)ranger   r   r   
pack_array)r   r!   r"   valuesr   r   r   r#     s   
zEphemeralArrayModel.as_datac                 C   r   r   r   r    r   r   r   r'     r   zEphemeralArrayModel.from_dataNc                 C   rg   r
   r   r,   r   r   r   r.     rO   z*EphemeralArrayModel.load_from_data_pointerr
   )	rU   rV   rW   r   r   r#   r'   r.   r}   r   r   rz   r   r     s    r   c                       r   )ExternalFuncPointerModelc                    sT   |j } |j } fdd|jD }tt||}tt	| 
 || d S )Nc                    s   g | ]	}  | qS r   )r   r   r2   r   r   r   r5     s    z5ExternalFuncPointerModel.__init__.<locals>.<listcomp>)sigr   return_typer   argsr   PointerTypeFunctionTyperw   r   r   )r   r   r   r   rettyr   rx   rz   r   r   r     s
   z!ExternalFuncPointerModel.__init__r   r   r   rz   r   r     r   r   c                       s|   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Z  ZS )UniTupleModelc                    sZ   t t| || ||j| _t|| _t	| j
 | j| _t	| j | j| _d S r
   )rw   r   r   r   r   _elem_modelr9   _countr   r   r   _value_typer   r   r   rz   r   r   r     s   

zUniTupleModel.__init__c                 C   r   r
   )r   r   r   r   r   r     rd   zUniTupleModel.get_value_typec                 C   r   r
   r   r   r   r   r   r     rd   zUniTupleModel.get_data_typec                 C   r   r
   r   r   r   r   r   r     r   zUniTupleModel.get_return_typec                 C   s   | j  f| j S r
   )r   r   r   r   r   r   r   r     r   zUniTupleModel.get_argument_typec                 C   s>   g }t | jD ]}|||g}| j||}|| q|S r
   )r   r   extract_valuer   r$   r<   r   r!   r"   outr   vr   r   r   r$     s   zUniTupleModel.as_argumentc                 C   sF   t |  t j}t|D ]\}}| j||}||||g}q|S r
   )r   Constantr   	Undefined	enumerater   r(   insert_valuer   r   r   r   r(     s
   zUniTupleModel.from_argumentc                 C   R   t |  t j}t| jD ]}|||g}| j||}|	|||g}q|S r
   )
r   r   r   r   r   r   r   r   r#   r   r   r!   r"   r   r   r_   dvalr   r   r   r#        zUniTupleModel.as_datac                 C   r   r
   )
r   r   r   r   r   r   r   r   r'   r   r   r   r   r   r'     r   zUniTupleModel.from_datac                 C   r|   r
   r   r    r   r   r   r&     rD   zUniTupleModel.as_returnc                 C   r|   r
   r   r    r   r   r   r)     rD   zUniTupleModel.from_returnc                    s&    fddfddt jD S )Nc                    s     || S r
   r   )r   r"   r!   r   r   getter  rT   z&UniTupleModel.traverse.<locals>.getterc                    s   g | ]}j jt |fqS r   )r   r   r   r   r   r   r   r   r5     s    z*UniTupleModel.traverse.<locals>.<listcomp>)r   r   r0   r   r!   r   r   r   r1     s   zUniTupleModel.traversec                 C   s   | j gS r
   )r   r   r   r   r   r;     r   zUniTupleModel.inner_models)rU   rV   rW   r   r   r   r   r   r$   r(   r#   r'   r&   r)   r1   r;   r}   r   r   rz   r   r     s    	r   c                   @   s   e Zd ZdZdS )CompositeModelzWAny model that is composed of multiple other models should subclass from
    this.
    N)rU   rV   rW   rX   r   r   r   r   r     s    r   c                       s   e Zd ZdZdZ fddZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zd0ddZdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zed&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z  ZS )1StructModelNc                    sR   t t || |rt| \ _ _nd  _ _t fdd jD  _d S )Nr   c                       g | ]} j |qS r   r   r   r2   r   r   r   r5         z(StructModel.__init__.<locals>.<listcomp>)rw   r   r   zip_fields_membersrM   _modelsr   r   r   membersrz   r   r   r     s
   zStructModel.__init__c                 C   s   |  |}| j| S )zU
        StructModel-specific: get the Numba type of the field named *name*.
        )get_field_positionr   )r   nameposr   r   r   get_member_fe_type  s   

zStructModel.get_member_fe_typec                 C   (   | j d u rtdd | jD | _ | j S )Nc                 S      g | ]}|  qS r   r   r2   r   r   r   r5         z.StructModel.get_value_type.<locals>.<listcomp>)r   r   r[   r   r   r   r   r   r     
   


zStructModel.get_value_typec                 C   r   )Nc                 S   r   r   rf   r2   r   r   r   r5     r   z-StructModel.get_data_type.<locals>.<listcomp>)r   r   r[   r   r   r   r   r   r     r   zStructModel.get_data_typec                 C   s   t dd | jD S )Nc                 S   r   r   )r   r2   r   r   r   r5   "      z1StructModel.get_argument_type.<locals>.<listcomp>)rM   r   r   r   r   r   r   !  s   zStructModel.get_argument_typec                 C   r   r
   rf   r   r   r   r   r   $  r   zStructModel.get_return_typec              
   C   s@   g }t | jD ]\}}|t|||| ||| qt|S r
   )r   r   r<   getattrgetrM   )r   methnamer!   r"   	extractedr   r>   r   r   r   _as'  s   zStructModel._asc           	      C   sT   t |  t j}tt| j|D ]\}\}}t||||}| ||||}q|S r
   )	r   r   r   r   r   r   r   r   set)	r   r   r!   r"   structr   r>   r_   r   r   r   r   _from.  s
   zStructModel._fromc                 C   F   |  d||}t|  tj}t|D ]\}}||||g}q|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#   r   r   r   r   r   r   r   r   r!   r"   elemsr   r   elr   r   r   r#   7  s
   zStructModel.as_datac                    ,    fd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qS r   r   r   r   r   r   r5   T      z)StructModel.from_data.<locals>.<listcomp>r'   r   r9   r   r   r   r!   r"   valsr   r   r   r'   M  s   zStructModel.from_datac           
      C   sx   g }t | jD ]\}}t||d|}||||}|| qt|  tj	}	t |D ]\}}| 
||	||}	q-|	S Nr   )r   r   r   r   r.   r<   r   r   r   r   r   )
r   r!   r-   r*   r   r   rE   elem_ptrr_   r   r   r   r   r.   X  s   z"StructModel.load_from_data_pointerc                 C      |  d||S )Nr$   )r   r    r   r   r   r$   d  rK   zStructModel.as_argumentc                 C   r   )Nr(   )r   r    r   r   r   r(   g  rK   zStructModel.from_argumentc                 C   r   )Nr#   r   r   r   r   r   r&   j  s
   zStructModel.as_returnc                    r   )Nc                    r   r   r   r   r   r   r   r5   r  r   z+StructModel.from_return.<locals>.<listcomp>r'   r   r   r   r   r   r)   q  s   zStructModel.from_returnc                 C   s0   t |tr
| |}|j||gd| j|  d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.r   )
isinstancestrr   r   r   )r   r!   r_   r   r   r   r   r   v  s
   


zStructModel.getc                 C   s2   t |tr
| |}|j|||gd| j|  d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   r   r   r   )r   r!   stvalr_   r   r   r   r   r     s
   

zStructModel.setc                 C   s2   z| j |W S  ty   td| jj|f w )Nz!%s does not have a field named %r)r   index
ValueErrorKeyErrorr{   rU   )r   fieldr   r   r   r     s   
zStructModel.get_field_positionc                 C   s
   t | jS r
   )r9   r   r   r   r   r   field_count  s   
zStructModel.field_countc                 C   s   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   r   r   r   r   r   r   r   get_type  s   
	

zStructModel.get_typec                 C   s
   | 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   r   r   r   r   	get_model  s   
	zStructModel.get_modelc                    s$    fddfddj D S )Nc                    s8   |j  kr |j f}tdj|  || S )Nzexpecting {0} but got {1})rI   r   	TypeErrorformatr   )kr"   r   r!   r   r   r   r     s   z$StructModel.traverse.<locals>.getterc                    s    g | ]} |t |fqS r   )r   r   )r3   r  r   r   r   r5          z(StructModel.traverse.<locals>.<listcomp>)r   r0   r   r   r   r1     s   zStructModel.traversec                 C   r   r
   r   r   r   r   r   r;     rd   zStructModel.inner_modelsr
   )rU   rV   rW   r   r   r   r   r   r   r   r   r   r   r#   r'   r.   r$   r(   r&   r)   r   r   r   rY   r   r   r   r1   r;   r}   r   r   rz   r   r     s6    	

	r   c                       s    e Zd ZeZ fddZ  ZS )ComplexModelc                    s,   d|j fd|j fg}tt| ||| d S )Nrealimag)underlying_floatrw   r  r   r   rz   r   r   r     s   zComplexModel.__init__)rU   rV   rW   NotImplemented_element_typer   r}   r   r   rz   r   r        r  c                       r   )
TupleModelc                    s*   dd t |D }tt| ||| d S )Nc                 S   s    g | ]\}}d t | |fqS )f)r   )r3   r   r4   r   r   r   r5     r  z'TupleModel.__init__.<locals>.<listcomp>)r   rw   r  r   r   rz   r   r   r     s   zTupleModel.__init__r   r   r   rz   r   r    s    r  c                       r   )
UnionModelc                    s4   dt jfdt j|j fg}tt| ||| d S )Ntagpayload)r   uintpTuple
from_typesrw   r  r   r   rz   r   r   r     s   zUnionModel.__init__r   r   r   rz   r   r    r   r  c                       r   )	PairModelc                    s,   d|j fd|jfg}tt| ||| d S )Nfirstsecond)
first_typesecond_typerw   r  r   r   rz   r   r   r     s   zPairModel.__init__r   r   r   rz   r   r    r   r  c                       r   )ListPayloadModelc                    s>   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   rw   r  r   r   rz   r   r   r     s   
zListPayloadModel.__init__r   r   r   rz   r   r    r   r  c                       r   )	ListModelc                    :   t |}dt |fdt jfg}tt| ||| d S Nmeminfoparent)r   ListPayloadMemInfoPointerpyobjectrw   r   r   r   r   r   payload_typer   rz   r   r   r     
   
zListModel.__init__r   r   r   rz   r   r     r   r   c                       r   )ListIterModelc                    B   t |j}dt |fdt t jfg}tt| ||| d S Nr#  r   )	r   r%  r  r&  EphemeralPointerr  rw   r+  r   r(  rz   r   r   r     s
   zListIterModel.__init__r   r   r   rz   r   r+    r   r+  c                       r   )SetEntryModelc                    s2   |j j}dtjfd|fg}tt| ||| d S )NrL   key)set_typer   r   r  rw   r/  r   )r   r   r   r   r   rz   r   r   r   *  s
   zSetEntryModel.__init__r   r   r   rz   r   r/  (  r   r/  c                       r   )SetPayloadModelc                    sV   t |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  rw   r2  r   )r   r   r   
entry_typer   rz   r   r   r   6  s   zSetPayloadModel.__init__r   r   r   rz   r   r2  4  r   r2  c                       r   )SetModelc                    r!  r"  )r   
SetPayloadr&  r'  rw   r:  r   r(  rz   r   r   r   J  r*  zSetModel.__init__r   r   r   rz   r   r:  H  r   r:  c                       r   )SetIterModelc                    r,  r-  )	r   r;  r  r&  r.  r  rw   r<  r   r(  rz   r   r   r   V  s
   zSetIterModel.__init__r   r   r   rz   r   r<  T  r   r<  c                       r   )
ArrayModelc                    sv   |j }dt|jfdtjfdtjfdtjfdt|jfdttj|fdttj|fg}tt	| 
||| d S )Nr#  r$  nitemsitemsizer  shapestrides)ndimr   r&  r   r'  r  CPointerUniTuplerw   r=  r   r   r   r   rB  r   rz   r   r   r   i  s   
zArrayModel.__init__r   r   r   rz   r   r=  b  s    r=  c                       r   )ArrayFlagsModelc                    s$   d|j fg}tt| ||| d S )Nr$  )
array_typerw   rF  r   r   rz   r   r   r   z  s   zArrayFlagsModel.__init__r   r   r   rz   r   rF  x  r   rF  c                       s$   e Zd Z fddZdd Z  ZS )NestedArrayModelc                    s(   | |j | _tt| || d S r
   )r   r   r   _be_typerw   rH  r   r   rz   r   r   r     s   zNestedArrayModel.__init__c                 C   s   t | j| jj}|S )zXReturn the LLVM type representation for the storage of
        the nestedarray.
        )r   r   rI  r   r>  )r   retr   r   r   as_storage_type  s   z NestedArrayModel.as_storage_type)rU   rV   rW   r   rK  r}   r   r   rz   r   rH    s    rH  c                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )OptionalModelc                    s:   d|j fdtjfg}||j | _tt| ||| d S )Nr  valid)rI   r   r  r   _value_modelrw   rL  r   r   rz   r   r   r     s
   zOptionalModel.__init__c                 C   r   r
   )rN  r   r   r   r   r   r     r\   zOptionalModel.get_return_typec                 C   s   t r
   r   r    r   r   r   r&     rD   zOptionalModel.as_returnc                 C   r   r
   )rN  r)   r    r   r   r   r)     rK   zOptionalModel.from_returnc                    s:    fdd} fdd d|f dfgS )Nc                    s.   | }  | d} ||t|jd S )Nr  )r   selectr   r   rI   )r"   rM  r  r!   	get_validr   r   r   get_data  s   z(OptionalModel.traverse.<locals>.get_datac                    s     | dS )NrM  )r   r"   r  r   r   rQ    rK   z)OptionalModel.traverse.<locals>.get_validr  rM  )r   )r   r!   rR  r   rP  r   r1     s
   zOptionalModel.traverse)	rU   rV   rW   r   r   r&   r)   r1   r}   r   r   rz   r   rL    s    rL  c                       sv   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdddZ  ZS )RecordModelc                    sN   t t ||  fdd|jD  _ttd|j _	 j	
  _d S )Nc                    s   g | ]
\}} j |qS r   r   )r3   _r4   r   r   r   r5     s    z(RecordModel.__init__.<locals>.<listcomp>rb   )rw   rT  r   r   r   r   r   ru   r  rI  r   _be_ptr_typer   rz   r   r   r     s   zRecordModel.__init__c                 C   r   )z6Passed around as reference to underlying data
        rV  r   r   r   r   r     s   zRecordModel.get_value_typec                 C   r   r
   rW  r   r   r   r   r     rd   zRecordModel.get_argument_typec                 C   r   r
   rW  r   r   r   r   r     rd   zRecordModel.get_return_typec                 C   r   r
   rI  r   r   r   r   r     rd   zRecordModel.get_data_typec                 C   
   | |S r
   r+   r    r   r   r   r#     r\   zRecordModel.as_datac                 C   r   r   r   r    r   r   r   r'     r   zRecordModel.from_datac                 C   r|   r
   r   r    r   r   r   r$     rD   zRecordModel.as_argumentc                 C   r|   r
   r   r    r   r   r   r(     rD   zRecordModel.from_argumentc                 C   r|   r
   r   r    r   r   r   r&     rD   zRecordModel.as_returnc                 C   r|   r
   r   r    r   r   r   r)     rD   zRecordModel.from_returnNc                 C   rg   r
   r   r,   r   r   r   r.     rO   z"RecordModel.load_from_data_pointerr
   )rU   rV   rW   r   r   r   r   r   r#   r'   r$   r(   r&   r)   r.   r}   r   r   rz   r   rT    s    rT  c                       \   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Z  ZS )UnicodeCharSeqc                    s6   t t| || ttjd }t||j| _	d S Nrb   )
rw   r\  r   r   ru   r   sizeof_unicode_charr   r   rI  r   r   r   chartyrz   r   r   r     s   zUnicodeCharSeq.__init__c                 C   r   r
   rX  r   r   r   r   r     rd   zUnicodeCharSeq.get_value_typec                 C   r   r
   rX  r   r   r   r   r     rd   zUnicodeCharSeq.get_data_typec                 C   r|   r
   r   r    r   r   r   r#     rD   zUnicodeCharSeq.as_datac                 C   r|   r
   r   r    r   r   r   r'     rD   zUnicodeCharSeq.from_datac                 C   r|   r
   r   r    r   r   r   r&     rD   zUnicodeCharSeq.as_returnc                 C   r|   r
   r   r    r   r   r   r)     rD   zUnicodeCharSeq.from_returnc                 C   r|   r
   r   r    r   r   r   r$     rD   zUnicodeCharSeq.as_argumentc                 C   r|   r
   r   r    r   r   r   r(     rD   zUnicodeCharSeq.from_argumentrU   rV   rW   r   r   r   r#   r'   r&   r)   r$   r(   r}   r   r   rz   r   r\        r\  c                       r[  )CharSeqc                    s0   t t| || td}t||j| _d S r]  )rw   rc  r   r   ru   r   r   rI  r_  rz   r   r   r     s   
zCharSeq.__init__c                 C   r   r
   rX  r   r   r   r   r     rd   zCharSeq.get_value_typec                 C   r   r
   rX  r   r   r   r   r     rd   zCharSeq.get_data_typec                 C   r|   r
   r   r    r   r   r   r#     rD   zCharSeq.as_datac                 C   r|   r
   r   r    r   r   r   r'   
  rD   zCharSeq.from_datac                 C   r|   r
   r   r    r   r   r   r&     rD   zCharSeq.as_returnc                 C   r|   r
   r   r    r   r   r   r)     rD   zCharSeq.from_returnc                 C   r|   r
   r   r    r   r   r   r$     rD   zCharSeq.as_argumentc                 C   r|   r
   r   r    r   r   r   r(     rD   zCharSeq.from_argumentra  r   r   rz   r   rc    rb  rc  c                       r   )CContiguousFlatIterc                    sv   |j jdksJ |j }|j}|j}d|fdtjfdttjfg}|r/|dttj|f t	t
| ||| d S )NCarraystrider   indices)rG  layoutr   rB  r   r  r.  r<   EphemeralArrayrw   rd  r   )r   r   r   need_indicesrG  r   rB  r   rz   r   r   r     s   zCContiguousFlatIter.__init__r   r   r   rz   r   rd        rd  c                       r   )FlatIterc                    sf   |j }|j}|j}d|fdtt||fdttj|fdttjfg}t	t
| ||| d S )Nrf  pointersrh  	exhausted)rG  r   rB  r   rj  rC  r  r.  r  rw   rm  r   )r   r   r   rG  r   rB  r   rz   r   r   r   +  s   zFlatIter.__init__r   r   r   rz   r   rm  *  rl  rm  c                       r   )UniTupleIterc                    2   dt t jfd|jfg}tt| ||| d S )Nr   rM   )r   r.  r  r  rw   rp  r   r   rz   r   r   r   9  s   zUniTupleIter.__init__r   r   r   rz   r   rp  7  r   rp  c                       r   )
SliceModelc                    s4   dt jfdt jfdt jfg}tt| ||| d S Nstartstopstep)r   r  rw   rr  r   r   rz   r   r   r   B  s
   zSliceModel.__init__r   r   r   rz   r   rr  ?  r   rr  c                       r   )NPDatetimeModelc                    s"   t d}tt| ||| d S )N@   )r   ru   rw   rw  r   ry   rz   r   r   r   M  s   
zNPDatetimeModel.__init__r   r   r   rz   r   rw  J  r   rw  c                       r   )ArrayIteratorc                    rq  )Nr   rf  )r   r.  r  rG  rw   ry  r   r   rz   r   r   r   T  s   zArrayIterator.__init__r   r   r   rz   r   ry  R  r   ry  c                       r   )EnumerateTypec                    rq  )Nr   iter)r   r.  r  source_typerw   rz  r   r   rz   r   r   r   ]  s   zEnumerateType.__init__r   r   r   rz   r   rz  [  r   rz  c                       r   )ZipTypec                    s,   dd t |jD }tt| ||| d S )Nc                 S   s   g | ]\}}d | |j fqS )ziter%d)iterator_type)r3   r   r|  r   r   r   r5   g  s    z$ZipType.__init__.<locals>.<listcomp>)r   source_typesrw   r}  r   r   rz   r   r   r   f  s   zZipType.__init__r   r   r   rz   r   r}  d  r   r}  c                       r   )RangeIteratorTypec                    sF   |j }dt|fd|fd|fdt|fg}tt| ||| d S )Nr{  ru  rv  r   )
yield_typer   r.  rw   r  r   r   r   r   int_typer   rz   r   r   r   n  s   zRangeIteratorType.__init__r   r   r   rz   r   r  l  r   r  c                       sl   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Z  ZS )GeneratorModelc                    s   t t ||  fdd|jD  _ fdd|jD  _tdd  jD  _	tdd  jD  _
t jtj  j	 j
g _ j  _d S )Nc                    s$   g | ]}t |tjs j|qS r   )r   r   Omittedr   r   r2   r   r   r   r5   |  s    
z+GeneratorModel.__init__.<locals>.<listcomp>c                    r   r   r   r2   r   r   r   r5   ~  r   c                 S   r   r   rf   r2   r   r   r   r5     r   c                 S   r   r   rf   r2   r   r   r   r5     r   )rw   r  r   	arg_types_arg_modelsstate_types_state_modelsr   r[   _args_be_type_state_be_typer   r   r   int32r   rI  r   rV  r   rz   r   r   r   y  s   zGeneratorModel.__init__c                 C   r   )zH
        The generator closure is passed around as a reference.
        rW  r   r   r   r   r     s   zGeneratorModel.get_value_typec                 C   r   r
   rW  r   r   r   r   r     rd   z GeneratorModel.get_argument_typec                 C   r   r
   rX  r   r   r   r   r     rd   zGeneratorModel.get_return_typec                 C   r   r
   rX  r   r   r   r   r     rd   zGeneratorModel.get_data_typec                 C   r|   r
   r   r    r   r   r   r$     rD   zGeneratorModel.as_argumentc                 C   r|   r
   r   r    r   r   r   r(     rD   zGeneratorModel.from_argumentc                 C   ri   r
   rj   r    r   r   r   r&     rT   zGeneratorModel.as_returnc                 C   ri   r
   rt   r    r   r   r   r)     rT   zGeneratorModel.from_returnc                 C   rY  r
   rZ  r    r   r   r   r#     r\   zGeneratorModel.as_datac                 C   s   t ||j}||| |S r
   )r   rk   rI   rn   )r   r!   r"   stackr   r   r   r'     s   zGeneratorModel.from_data)rU   rV   rW   r   r   r   r   r   r$   r(   r&   r)   r#   r'   r}   r   r   rz   r   r  w  s    r  c                       r   )ArrayCTypesModelc                    s8   dt |jfdt |jfg}tt| ||| d S )Nr  r#  )r   rC  r   r&  rw   r  r   r   rz   r   r   r     s   zArrayCTypesModel.__init__r   r   r   rz   r   r    r   r  c                       r   )
RangeModelc                    s6   |j j}d|fd|fd|fg}tt| ||| d S rs  )r~  r  rw   r  r   r  rz   r   r   r     s   zRangeModel.__init__r   r   r   rz   r   r    r   r  c                       r   )NdIndexModelc                    sP   |j }dttj|fdttj|fdttjfg}tt| 	||| d S )Nr@  rh  ro  )
rB  r   rD  r  rj  r.  r  rw   r  r   rE  rz   r   r   r     s   zNdIndexModel.__init__r   r   r   rz   r   r    r   r  c                 C   $   |j jdkrt| |ddS t| |S )Nre  Frk  rG  ri  rd  rm  r   ro   r   r   r   handle_numpy_flat_type     
r  c                 C   r  )Nre  Tr  r  r  r   r   r   handle_numpy_ndenumerate_type  r  r  c                 C   s
   | |j  S r
   )thisr  r   r   r   handle_bound_function  s   
r  c                       r   )NdIterc                    s   |j }|j}|jr|nd}dttjfdt|fdttj|fdt	tj|fg}t
|jD ]$\}}|\}	}
}}d| }|	dkrO||ttjf q1|	dv rTq1J t
|j D ]\}}t|tjssd
| }||t|f q[tt| ||| d S )Nra   ro  arraysr@  rh  zindex%dflat)scalarindexed0dr   zscalar%d)r  rB  need_shaped_indexingr   r.  r  r  rD  r  rj  r   indexersr<   r   Arrayrw   r  r   )r   r   r   array_typesrB  	shape_lenr   r   subkind	start_dimend_dimrU  member_namero   rz   r   r   r     s,   zNdIter.__init__r   r   r   rz   r   r    r   r  c                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd&ddZdd Zdd Zd d! Zed"d# Zd$d% Z  ZS )'DeferredStructModelc                    s0   t t| || dt|| _| | _d S )Nzdeferred.{0})rw   r  r   r   idtypenamer   actual_fe_typer   rz   r   r   r     s   zDeferredStructModel.__init__c                 C      t j| jd S )Nz.valuer   global_contextget_identified_typer  r   r   r   r   r     r   z"DeferredStructModel.get_value_typec                 C   r  )Nz.datar  r   r   r   r   r     r   z!DeferredStructModel.get_data_typec                 C   r   r
   )_actual_modelr   r   r   r   r   r     r\   z%DeferredStructModel.get_argument_typec                 C   s   |  ||}| j||S r
   )r   r  r$   )r   r!   r"   innerr   r   r   r$     s   zDeferredStructModel.as_argumentc                 C   s    | j ||}| ||  |S r
   )r  r(   r   make_uninitialized)r   r!   r"   resr   r   r   r(     s   z!DeferredStructModel.from_argumentc                 C   s8   |    | ||}| j||}|  }| |||S r
   )_definer   r  r'   r  r   r   r!   r"   elemr   r   r   r   r'     s
   zDeferredStructModel.from_datac                 C   s<   |    | ||}| j||}| jdd}| |||S )Nr  )r  )r  r   r  r#   r  r   r  r   r   r   r#   $  s
   zDeferredStructModel.as_datac                 C   r|   r
   r   r    r   r   r   r)   +  rD   zDeferredStructModel.from_returnc                 C   r|   r
   r   r    r   r   r   r&   .  rD   zDeferredStructModel.as_returnc                 C   s   | |dgS r   r   r    r   r   r   r   1  rK   zDeferredStructModel.getc                 C   s   | ||dgS r   )r   )r   r!   r"   contentr   r   r   r   4  rO   zDeferredStructModel.setr"   c                 C   s0   |    |dkr|  }n|  }t|tjS )Nr"   )r  r   r   r   r   r   )r   r  ro   r   r   r   r  7  s
   
z&DeferredStructModel.make_uninitializedc                 C   s(   |   }| | |  }| | d S r
   )r   _define_value_typer   _define_data_type)r   valtydattyr   r   r   r  ?  s   
zDeferredStructModel._definec                 C      |j r|| j  d S d S r
   )	is_opaqueset_bodyr  r   )r   
value_typer   r   r   r  E     z&DeferredStructModel._define_value_typec                 C   r  r
   )r  r  r  r   )r   	data_typer   r   r   r  I  r  z%DeferredStructModel._define_data_typec                 C   s   | j | jS r
   )r   r   r  r   r   r   r   r  M  s   z!DeferredStructModel._actual_modelc                    s   | j  fddfgS )Nc                    s     | dgS r   r   rS  r   r   r   <lambda>S  s    z.DeferredStructModel.traverse.<locals>.<lambda>)r  r0   r   r   r   r1   Q  s   
zDeferredStructModel.traverserS  )rU   rV   rW   r   r   r   r   r$   r(   r'   r#   r)   r&   r   r   r  r  r  r  rY   r  r1   r}   r   r   rz   r   r    s(    

r  c                       r   )StructPayloadModelz.Model for the payload of a mutable struct
    c                    s"   t |j }t ||| d S r
   )rM   
field_dictitemsrw   r   )r   r   fe_typr   rz   r   r   r   Z  s   zStructPayloadModel.__init__r   r   r   rz   r   r  V  r
  r  c                       r   )StructRefModelz?Model for a mutable struct.
    A reference to the payload
    c                    s,   |  }dt|fg}t ||| d S )Nr#  )r   r   r&  rw   r   )r   r   r  r   r   rz   r   r   r   c  s   zStructRefModel.__init__r   r   r   rz   r   r  _  s    r  N)	functoolsr   collectionsr   llvmliter   numba.core.datamodel.registryr   
numba.corer   r   numba.npr   objectr	   r  rZ   BooleanBooleanLiteralr`   rv   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   rC  r   r.  r   rj  r   ExternalFunctionPointerr   rD  NamedUniTupleStarArgUniTupler   r   r   Complexr  LiteralListLiteralStrKeyDictr  
NamedTupleStarArgTupler  	UnionTyper  Pairr  r%  r  Listr   ListIterr+  r8  r/  r;  r2  Setr:  SetIterr<  r  Buffer	ByteArrayBytes
MemoryViewPyArrayr=  
ArrayFlagsrF  NestedArrayrH  OptionalrL  RecordrT  r\  rc  rd  rm  rp  miscSliceLiteral	SliceTyperr  
NPDatetimeNPTimedeltarw  ry  rz  r}  r  	Generatorr  ArrayCTypesr  	RangeTyper  NumpyNdIndexTyper  NumpyFlatTyper  NumpyNdEnumerateTyper  BoundFunctionr  NumpyNdIterTyper  DeferredTyper  StructRefPayloadr  r  r   r   r   r   <module>   s2    +$	HE Q+
	
6



"P