o
    ei                     @   s   d Z ddlZddlZddlmZ dd ZG dd deeZG d	d
 d
e	e
Zdd Zdd Zd'ddZd(ddZdd Zdd Zdd ZddddZdd Zdd  Zd!d" Zd)d#d$Zd%d& ZdS )*zKAssorted utilities, which do not need anything other then torch and stdlib.    N   )_dtypes_implc                 C   s2   t | trdS zt|  W dS  ty   Y dS w )NFT)
isinstancestrlen	Exception)seq r	   \/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_numpy/_util.pyis_sequence   s   

r   c                   @      e Zd ZdS )	AxisErrorN__name__
__module____qualname__r	   r	   r	   r
   r          r   c                   @   r   )UFuncTypeErrorNr   r	   r	   r	   r
   r      r   r   c                 C   s    |d ur| j |kr| |} | S N)dtypeto)tensorr   r	   r	   r
   cast_if_needed   s   
r   c                 C   s$   t | jdk r| t  j} | S )N   )r   	_categoryr   r   default_dtypesfloat_dtype)xr	   r	   r
   cast_int_to_float&   s   r   c                 C   s@   | |   kr|k sn t d|  d| | dk r| |7 } | S )Nzaxis z) is out of bounds for array of dimension r   )r   )axndimargnamer	   r	   r
   normalize_axis_index.   s
   r"   Fc                    s   t | ttfvrzt| g} W n	 ty   Y nw t fdd| D } |sCtttt	| t| krC r?t
d  dt
d| S )a  
    Normalizes an axis argument into a tuple of non-negative integer axes.

    This handles shorthands such as ``1`` and converts them to ``(1,)``,
    as well as performing the handling of negative indices covered by
    `normalize_axis_index`.

    By default, this forbids axes from being specified multiple times.
    Used internally by multi-axis-checking logic.

    Parameters
    ----------
    axis : int, iterable of int
        The un-normalized index or indices of the axis.
    ndim : int
        The number of dimensions of the array that `axis` should be normalized
        against.
    argname : str, optional
        A prefix to put before the error message, typically the name of the
        argument.
    allow_duplicate : bool, optional
        If False, the default, disallow an axis from being specified twice.

    Returns
    -------
    normalized_axes : tuple of int
        The normalized axis index, such that `0 <= normalized_axis < ndim`
    c                 3       | ]	}t | V  qd S r   )r"   .0r   r!   r    r	   r
   	<genexpr>[       z'normalize_axis_tuple.<locals>.<genexpr>zrepeated axis in `z
` argumentzrepeated axis)typetuplelistoperatorindex	TypeErrorr   setmapint
ValueError)axisr    r!   allow_duplicater	   r&   r
   normalize_axis_tuple7   s   r5   c                 C   s(   | d u r| S t | dkrtd| d S )Nr   zdoes not handle tuple axisr   )r   NotImplementedErrorr3   r	   r	   r
   allow_only_single_axisd   s
   r8   c                    sT   t  ttfvr f t t|  }t | t|  fddt|D }|S )Nc                    s    g | ]}| v r
d nt qS r   )nextr$   r3   shape_itr	   r
   
<listcomp>s   s     z expand_shape.<locals>.<listcomp>)r)   r+   r*   r   r5   iterrange)	arr_shaper3   out_ndimshaper	   r;   r
   expand_shapel   s   
rC   c                 C   s<   |d u rd| }|  | } | S t| j|}| |} | S )Nr9   )expand
contiguousrC   rB   reshape)r   r3   r    rB   r	   r	   r
   apply_keepdimsw   s   
rG   r7   c                 G   s*   | du rt dd |D }|dfS || fS )z#Flatten the arrays if axis is None.Nc                 s   s    | ]}|  V  qd S r   )flatten)r%   arr	   r	   r
   r'      s    z$axis_none_flatten.<locals>.<genexpr>r   r*   )r3   tensorsr	   r	   r
   axis_none_flatten   s   rL   c                 C   s>   t j}|| j||dstd| j d| d| dt| |S )a  Dtype-cast tensor to target_dtype.

    Parameters
    ----------
    t : torch.Tensor
        The tensor to cast
    target_dtype : torch dtype object
        The array dtype to cast all tensors to
    casting : str
        The casting mode, see `np.can_cast`

     Returns
     -------
    `torch.Tensor` of the `target_dtype` dtype

     Raises
     ------
     ValueError
        if the argument cannot be cast according to the `casting` rule

    )castingzCannot cast array data from z to z according to the rule '')r   can_cast_implr   r.   r   )ttarget_dtyperM   can_castr	   r	   r
   typecast_tensor   s   

rS   c                    s   t  fdd| D S )Nc                 3   r#   r   )rS   )r%   rP   rM   rQ   r	   r
   r'      r(   z#typecast_tensors.<locals>.<genexpr>rJ   )rK   rQ   rM   r	   rT   r
   typecast_tensors   s   rU   c              
   C   sH   zt | }W |S  ty# } zd|  dt| d}t|d }~ww )Nzfailed to convert z! to ndarray. 
Internal error is: .)torch	as_tensorr   r   r6   )objr   emesgr	   r	   r
   _try_convert_to_tensor   s   r\   c              	   C   s   t | tjr	| }nt }tttj zt| }W t| nt| w t	||}||j
 }|dkr@|d| |j }zt|}W n tyQ   d}Y nw |rX| }|S )a  The core logic of the array(...) function.

    Parameters
    ----------
    obj : tensor_like
        The thing to coerce
    dtype : torch.dtype object or None
        Coerce to this torch dtype
    copy : bool
        Copy or not
    ndmin : int
        The results as least this many dimensions
    is_weak : bool
        Whether obj is a weakly typed python scalar.

    Returns
    -------
    tensor : torch.Tensor
        a tensor object with requested dtype, ndim and copy semantics.

    Notes
    -----
    This is almost a "tensor_like" coercive function. Does not handle wrapper
    ndarrays (those should be handled in the ndarray-aware layer prior to
    invoking this function).
    r   r9   F)r   rW   Tensorget_default_dtypeset_default_dtyper   get_default_dtype_forfloat32r\   r   r    viewrB   boolr2   clone)rY   r   copyndminr   default_dtype
ndim_extrar	   r	   r
   _coerce_to_tensor   s&   


ri   c                  G   s   ddl m} t| dkrt S t| dkr<| d }t||r!|jS t|tr:g }|D ]}t|}|| q*t|S |S t| tsKt	dt
| j t| S )zHConvert all ndarrays from `inputs` to tensors. (other things are intact)r   )ndarrayr   z#Expected inputs to be a tuple, got )_ndarrayrj   r   r2   r   r   r*   ndarrays_to_tensorsappendAssertionErrorr)   r   )inputsrj   input_result	sub_input
sub_resultr	   r	   r
   rl      s&   


rl   r   )NF)NFr   )__doc__r,   rW    r   r   r2   
IndexErrorr   r.   RuntimeErrorr   r   r   r"   r5   r8   rC   rG   rL   rS   rU   r\   ri   rl   r	   r	   r	   r
   <module>   s(   


	-	 
	>