o
    eiHU                     @  s  d dl mZ d dlZd dlZd dlZd dlmZ d dlZddlm	Z	m
Z
mZmZmZ ddlmZmZmZmZ dZg dZdd	d
ddddddd	ZG dd dZd`ddZi ddddddddddddddddddddd dd!dd"dd#dd$dd%dd&ddddddddddddd'Zd(dd)d*d+d,d-d.d/Zdd0d1d2d3d4d5d6d7d8d9d:dd;Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZG dFdG dGZ e  e _!G dHdI dIZ"dJdK Z#d`dLdMdNd ddOdPdQZ$daddRdSdTZ%d`ddRdUdVZ&dWdX Z'dYdZ Z(dbd\d]Z)d^d_ Z*dS )c    )annotationsN)Sequence   )_dtypes_dtypes_impl_funcs_ufuncs_util)	ArrayLikenormalize_array_like
normalizerNotImplementedType)C_CONTIGUOUSF_CONTIGUOUSOWNDATA	WRITEABLEALIGNEDWRITEBACKIFCOPYFNCFORCBEHAVEDCARRAYFARRAYr   r   r   r   r   r   r   r   r   )	CFOWAXBCAFAc                      s@   e Zd ZdddZdddZd	d
 Z fddZdd Z  ZS )Flagsflag_to_valuedictc                 C  s*   dd |D }|rt d| || _d S )Nc                 S  s   g | ]}|t vr|qS  )FLAGS).0kr%   r%   _/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_numpy/_ndarray.py
<listcomp>4   s    z"Flags.__init__.<locals>.<listcomp>zInvalid flag keys: )AssertionError_flag_to_value)selfr#   invalid_keysr%   r%   r)   __init__3   s   
zFlags.__init__attrstrc                 C  s0   |  r| tv r| |  S td| d)NzNo flag attribute '')islowerupperr&   AttributeError)r-   r0   r%   r%   r)   __getattr__9   s   zFlags.__getattr__c              
   C  s^   |t v rt | }|tv r'z| j| W S  ty& } ztd||d }~ww td| d)Nzkey=No flag key 'r2   )SHORTHAND_TO_FLAGSr&   r,   KeyErrorNotImplementedError)r-   keyer%   r%   r)   __getitem__?   s   zFlags.__getitem__c                   s6   |  r| tv r|| | < d S t || d S N)r3   r4   r&   super__setattr__)r-   r0   value	__class__r%   r)   r@   J   s   zFlags.__setattr__c                 C  s(   |t v s|tv rtdtd| d)Nz"Modifying flags is not implementedr7   r2   )r&   r8   r:   r9   )r-   r;   rA   r%   r%   r)   __setitem__P   s   zFlags.__setitem__)r#   r$   )r0   r1   )	__name__
__module____qualname__r/   r6   r=   r@   rD   __classcell__r%   r%   rB   r)   r"   2   s    

r"   c                   s,   |p j } fdd}||_ d| |_|S )Nc                    s    | i |S r>   r%   )argskwargsfnr%   r)   fZ      zcreate_method.<locals>.fzndarray.)rE   rG   )rL   namerM   r%   rK   r)   create_methodW   s
   
rP   clipnonzerorepeatroundsqueezeswapaxesraveldiagonaldottraceargsortsearchsortedargmaxargminanyallmax)minptpsumprodmeanvarstdcumsumcumprodtakechooseabsolutepositivenegativegreaterlessgreater_equal
less_equal)absinvertposneggtltgelesubtractmultiplydividefloor_dividepower	remainderbitwise_and
bitwise_orbitwise_xor
left_shiftright_shift)addsubmultruedivfloordivpowmodandorxorlshiftrshiftmatmulc                 C  sV   t | tjr| jtjtjtjtjfv r| tj	S | S t | t
r)t
dd | D S | S )Nc                 s      | ]}t |V  qd S r>   )_upcast_int_indices)r'   ir%   r%   r)   	<genexpr>       z&_upcast_int_indices.<locals>.<genexpr>)
isinstancetorchTensordtypeint8int16int32uint8toint64tupleindexr%   r%   r)   r      s   
r   c                 C  s   t dd | D S )z&Check if there's any advanced indexingc                 s  s@    | ]}t |ttfpt |tjo|jtjkp|jd kV  qdS r   N)r   r   boolr   r   r   ndimr'   idxr%   r%   r)   r      s     
z)_has_advanced_indexing.<locals>.<genexpr>)r_   r   r%   r%   r)   _has_advanced_indexing   s   r   c                 C  s   t | ts| f} t| }|s| S g }| D ]5}t |tr't |ts'||g qt |tjrD|jdkrDt	|sD|j
tjkrD||g q|| qt|S )zZConvert scalar indices to lists when advanced indexing is present for NumPy compatibility.r   )r   r   r   intr   appendr   r   r   is_floating_pointr   )r   has_advanced	convertedr   r%   r%   r)   _numpy_compatible_indexing   s$   


r   c                 C  sj   t | trdS t | tjr| jtjkrd| jfS t | tr%| r%| d | ks'dS t| d \}}||d fS )z.Returns the depth of a boolean sequence/tensor)Tr   Tr   )Fr   r   )r   r   r   r   r   r   r   _get_bool_depth)sis_booldepthr%   r%   r)   r      s   

r   c                   sD  t | ts| f} d}t| D ]\}}|tu r|} nq|du r(| dd dd fS d}| D ]}t|\}}|r;||7 }q,|tu sC|du rDq,|d7 }q,|| }|dkrt| d| }	t| |d d }
|	r|
r| d| d | |d d  }dtdd | |d d D    fd	d
} fdd}|||fS | dd dd fS )a  
    Patch for NumPy-compatible ellipsis behavior when ellipsis doesn't match any dimensions.

    In NumPy, when an ellipsis (...) doesn't actually match any dimensions of the input array,
    it still acts as a separator between advanced indices. PyTorch doesn't have this behavior.

    This function detects when we have:
    1. Advanced indexing on both sides of an ellipsis
    2. The ellipsis doesn't actually match any dimensions
    Nc                 S     | S r>   r%   xr%   r%   r)   <lambda>       z-_numpy_empty_ellipsis_patch.<locals>.<lambda>r   r   r>   c                 s  s    | ]
}t |trd V  qdS )r   N)r   slicer   r%   r%   r)   r     s    

z._numpy_empty_ellipsis_patch.<locals>.<genexpr>c                   s   |    S r>   )rU   r   	end_ndimsr%   r)   
squeeze_fn     z/_numpy_empty_ellipsis_patch.<locals>.squeeze_fnc                   s&   t | tjr| j kr|   S | S r>   )r   r   r   r   	unsqueezer   r   r%   r)   unsqueeze_fn  s   z1_numpy_empty_ellipsis_patch.<locals>.unsqueeze_fnc                 S  r   r>   r%   r   r%   r%   r)   r   #  r   )r   r   	enumerateEllipsisr   r   rd   )r   tensor_ndimellipsis_posr   r   consumed_dimsr   r   ellipsis_dimsleft_advancedright_advanced	new_indexr   r   r%   r   r)   _numpy_empty_ellipsis_patch   s>   


 


r   c                   @  s   e Zd ZdS )_UnspecifiedN)rE   rF   rG   r%   r%   r%   r)   r   (  s    r   c                   @  s  e Zd ZdlddZe D ]\ZZee	epeZ
ee
ee e< qeejdZeejZe D ]\ZZeeep9eZ
de dZee
ee e< q0e D ]=\ZZeeepWeZ
de dZee
ee e< de dZee
fddee e< d	e dZee
fd
dee e< qNeejdZedd dZ[[[[[
[edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Z edd Z!ed d! Z"ed"d# Z#e#j$d$d# Z#ed%d& Z%e%j$d'd& Z%dmd+d,Z&e'dndod2d3Z(e'dndod4d5Z)d6d7d8d9Z*e+j,e+j,fd:d;Z-e'dpd=d>Z.d?d@ Z/dAdB Z0dCdD Z1ee1Z2dEdF Z3dGdH Z4dIdJ Z5dKdL Z6dMdN Z7dOdP Z8dQdR Z9dSdT Z:dUdV Z;dWdX Z<dYdZ Z=d-d[d\d]Z>dqd_d`Z?dadb Z@dcdd ZAdedf ZBe	jCZCe	jDZDddgdhdiZEdjdk ZFdS )rndarrayNc                 C  s4   |d u rt  | _d S t|t jr|| _d S td)NzSndarray constructor is not recommended; prefereither array(...) or zeros/empty(...))r   r   tensorr   
ValueError)r-   tr%   r%   r)   r/   4  s   
zndarray.__init__conj____rc                 C  s
   ||| S r>   r%   r-   otherrL   r%   r%   r)   r   R  s   
 zndarray.<lambda>__ic                 C  s   || || dS )N)outr%   r   r%   r%   r)   r   U  s    
__divmod__c                 C  s   t || S r>   )r   divmodr-   r   r%   r%   r)   r   [  s    __rdivmod__c                 C  s   t | jjS r>   )r   r   shaper-   r%   r%   r)   r   a     zndarray.shapec                 C  
   | j  S r>   )r   numelr   r%   r%   r)   sizee     
zndarray.sizec                 C  s   | j jS r>   )r   r   r   r%   r%   r)   r   i     zndarray.ndimc                 C  s   t | jjS r>   )r   r   r   r   r%   r%   r)   r   m     zndarray.dtypec                   s&   | j   t fdd| j  D S )Nc                 3  s    | ]}|  V  qd S r>   r%   )r'   strideelsizer%   r)   r   t  r   z"ndarray.strides.<locals>.<genexpr>)r   element_sizer   r   r   r%   r   r)   stridesq  s   
zndarray.stridesc                 C  r   r>   )r   r   r   r%   r%   r)   itemsizev  r   zndarray.itemsizec                 C  s(   t | j | jj | jjd u ddS )NT)r   r   r   r   )r"   r   is_contiguousT_baser   r%   r%   r)   flagsz  s   

zndarray.flagsc                 C  r   r>   )r   data_ptrr   r%   r%   r)   data  r   zndarray.datac                 C  s   | j   S r>   )r   storagenbytesr   r%   r%   r)   r     r   zndarray.nbytesc                 C     |   S r>   )	transposer   r%   r%   r)   r     r   z	ndarray.Tc                 C  
   t | S r>   )r   realr   r%   r%   r)   r     r   zndarray.realc                 C     t |j| j_d S r>   )asarrayr   r   r-   rA   r%   r%   r)   r        c                 C  r   r>   )r   imagr   r%   r%   r)   r     r   zndarray.imagc                 C  r   r>   )r   r   r   r   r%   r%   r)   r     r   KunsafeTc                 C  sx   |dkrt d| d|dkrt d| d|s"t d| d|s,t d| dt|j}| j|}t|S )Nr   zastype(..., order= is not implemented.r   zastype(..., casting=zastype(..., subok=zastype(..., copy=)r:   r   r   torch_dtyper   r   r   )r-   r   ordercastingsubokcopyr   r   r%   r%   r)   astype  s   
zndarray.astyper   r-   r
   r   r   c                 C  r   r>   )cloner-   r   r%   r%   r)   r    r   zndarray.copyc                 C  r   r>   )r   flattenr  r%   r%   r)   r    r   zndarray.flattenF)refcheckc                G  s   |r
t d| d|dv rd S t|dkr|d }t|tr"|f}tdd |D r0tdt|| j	
 }}| j	| ||kr]| j	 sNtd	| j	 }||d    d S d S )
Nzresize(..., refcheck=r   )r%   r>   r   r   c                 s  s    | ]}|d k V  qdS r   r%   r'   r   r%   r%   r)   r     r   z!ndarray.resize.<locals>.<genexpr>z0all elements of `new_shape` must be non-negativez0tensor must be contiguous for resize with growth)r:   lenr   r   builtinsr_   r   mathre   r   r   resize_r   r+   r  zero_)r-   r  	new_shape	new_numel	old_numelbr%   r%   r)   resize  s(   



zndarray.resizec                 C  sJ   |t ju r| j}|t jurtd| dt|j}| j|}t|S )Nzview(..., type=r   )	r   unspecifiedr   r:   r   r   r   viewr   )r-   r   typer   tviewr%   r%   r)   r    s   

zndarray.viewrA   c                 C  s   | j | d S r>   )r   fill_r   r%   r%   r)   fill  s   zndarray.fillc                 C  r   r>   )r   tolistr   r%   r%   r)   r       
zndarray.tolistc                 C  s   dd | j  D S )Nc                 s  r   r>   )r   r	  r%   r%   r)   r     r   z#ndarray.__iter__.<locals>.<genexpr>)r   __iter__r   r%   r%   r)   r       zndarray.__iter__c                 C  s   t | jddddS )Nr   ztorch.ndarrayzdtype=torch.zdtype=)r1   r   replacer   r%   r%   r)   __str__  s   zndarray.__str__c              	   C  s@   zt | |W S  ttfy   tj| jdtd}t| Y S w )NF)
fill_valuer   )	r   equalRuntimeError	TypeErrorr   fullr   r   r   )r-   r   falsyr%   r%   r)   __eq__  s   zndarray.__eq__c                 C  s
   | |k S r>   r%   r   r%   r%   r)   __ne__  r  zndarray.__ne__c              
   C  s6   z	t | j W S  ty } ztd|d }~ww )Nz=only integer scalar arrays can be converted to a scalar index)operatorr   r   item	Exceptionr#  )r-   excr%   r%   r)   	__index__   s   zndarray.__index__c                 C  
   t | jS r>   )r   r   r   r%   r%   r)   __bool__  r  zndarray.__bool__c                 C  r-  r>   )r   r   r   r%   r%   r)   __int__  r  zndarray.__int__c                 C  r-  r>   )floatr   r   r%   r%   r)   	__float__  r  zndarray.__float__c                 C  r-  r>   )complexr   r   r%   r%   r)   __complex__  r  zndarray.__complex__c                 C  s6   z| j  }t||k}W |S  ty   d}Y |S w )NF)r   r)  r   r*  )r-   vresultr%   r%   r)   
is_integer  s   
zndarray.is_integerc                 C  s   | j jd S )Nr   )r   r   r   r%   r%   r)   __len__  r   zndarray.__len__c                 C  s   | j |S r>   )r   __contains__)r-   r   r%   r%   r)   r8    r   zndarray.__contains__c                 G  s   t | |S r>   )r   r   )r-   axesr%   r%   r)   r   "  r   zndarray.transposer   c                G  s   t j| ||dS )Nr:  )r   reshape)r-   r   r   r%   r%   r)   r;  &  s   zndarray.reshapec              	   C  s   t | t | ||| d S r>   )r   copytosort)r-   axiskindr   r%   r%   r)   r>  *  s   zndarray.sortc                 G  s8   |dkr	| j  S t|dkr|  |d  S | |S )Nr%   r   r   )r   r)  r
  rW   r=   )r-   rI   r%   r%   r)   r)  .  s
   

zndarray.itemc                   s   | j fdd t|trt| fddt|D }n d|}t|}t|}t|}t	|j
\}}}|t|S )Nc                   s   t |tr|jd ur|jdk s|S t | f t |jts.|jd u s.tdt|jj	 t |j
tsD|j
d u sDtdt|j
j	 |j
rL|j
d nd }|jrV|jd nd }t|||j S )Nr   z%slice start must be int or None, got z$slice stop must be int or None, got r   )r   r   stepr   flipstartr   r+   r  rE   stop)r   r   rC  rD  )r   r%   r)   neg_step=  s   z%ndarray.__getitem__.<locals>.neg_stepc                 3  s    | ]
\}} ||V  qd S r>   r%   )r'   r   r   )rE  r%   r)   r   S  s    z&ndarray.__getitem__.<locals>.<genexpr>r   )r   r   r   r  r   r	   ndarrays_to_tensorsr   r   r   r   r   r=   )r-   r   maybe_squeeze_r%   )rE  r   r)   r=   :  s   
 

zndarray.__getitem__c                 C  sb   t |}t|}t|}t|| jj\}}}t|s(t	|}t 
|| jj}| j|||S r>   )r	   rF  r   r   r   r   r   r   	is_scalarr   cast_if_neededr   rD   )r-   r   rA   rH  maybe_unsqueezer%   r%   r)   rD   ^  s   

zndarray.__setitem__streamc                C  s   | j j|dS )NrL  )r   
__dlpack__)r-   rM  r%   r%   r)   rN  o  rN   zndarray.__dlpack__c                 C  r   r>   )r   __dlpack_device__r   r%   r%   r)   rO  r  r  zndarray.__dlpack_device__r>   )r   r   TT)r   )r-   r
   r   r   )rA   r
   )r<  NN)GrE   rF   rG   r/   methodsitemsmethodrO   getattrr   rL   rP   varsr   	conjugater   dunder	ri_dunderplainrvarivarr   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   setterr   r  r   r  r  r  r   r  r  r  r  r  r  __repr__r&  r'  r,  r.  r/  r1  r3  r6  r7  r8  r   r;  r>  r)  r=   rD   rk   putrN  rO  r%   r%   r%   r)   r   3  s    
















	
$r   c                 C  sN   g }| D ] }t |ttfrt|}t |tr||j  q|| q|S )z'Recursively convert tensors into lists.)r   listr   _tolistr   r   r   r  )obja1elemr%   r%   r)   r`  v  s   
r`  Tr   F)r  r   r  ndminlikec          	      C  s   |durt d|d urt d|dkrt t| tr*|du r*|d u r*|| jkr*| S t| ttfrF| rBtdd | D rBt| } nt	| } t| trN| j
} d }|d urZt|j}t| |||}t|S )NFz#'subok' parameter is not supported.z"'like' parameter is not supported.r   c                 s  s    | ]	}t |tjV  qd S r>   )r   r   r   r	  r%   r%   r)   r     s    zarray.<locals>.<genexpr>)r:   r   r   r   r_  r   r`   r   stackr`  r   r   r   r   r	   _coerce_to_tensor)	ra  r   r  r   r  rd  re  r   r   r%   r%   r)   array  s.   

rh  )re  c                C  s   t | |||dddS )NFr   )r   r   re  r  rd  )rh  )ar   r   re  r%   r%   r)   r     r  r   c                C  s(   t | ||d}|j s|j |_|S )N)r   re  )r   r   r   
contiguous)ri  r   re  arrr%   r%   r)   ascontiguousarray  s   
rl  c                C  s   t | }t|S r>   )r   from_dlpackr   )r   r   r%   r%   r)   rm    s   
rm  c                 C  s0   zt | }W |S  ty   t| j}Y |S w r>   )r   r   r*  r   )entrydtyr%   r%   r)   _extract_dtype  s   rp  safec                 C  s"   t | } t |}t| j|j|S r>   )rp  r   can_cast_implr   )from_r   r  to_r%   r%   r)   can_cast  s   ru  c                  G  sn   g }| D ](}zt |j}W n tttfy&   t|}tjd|j	d}Y nw |
| qtj| }t|S )Nr   )r   )r   r   r"  r   r#  r   r   r   emptyr   r   r   result_type_impl)arrays_and_dtypestensorsrn  r   ro  r   r%   r%   r)   result_type  s   


rz  r>   )Nr   )rq  )+
__future__r   r  r  r(  collections.abcr   r    r   r   r   r   r	   _normalizationsr
   r   r   r   newaxisr&   r8   r"   rP   rP  rV  rW  r   r   r   r   r   r   r  r   r`  rh  r   rl  rm  rp  ru  rz  r%   r%   r%   r)   <module>   s   
%	
%		!D  E(
