o
    kìEiÞ  ã                   @  sT   d dl mZ d dlmZ d dlZd dlmZ erd dlm	Z	 ddd	„Z
ddd„ZdS )é    )Úannotations)ÚTYPE_CHECKINGN)Úis_list_like)ÚNumpyIndexTÚreturnúlist[np.ndarray]c                   sÈ   d}t | ƒs
t|ƒ‚| D ]
}t |ƒst|ƒ‚qt| ƒdkrg S tjdd„ | D ƒtjd�}t |¡}t |dk ¡r<tdƒ‚t 	|d¡‰ dˆ d< |d dkrS|d | ‰nt 
|¡‰‡ ‡fd	d
„t| ƒD ƒS )añ  
    Numpy version of itertools.product.
    Sometimes faster (for large inputs)...

    Parameters
    ----------
    X : list-like of list-likes

    Returns
    -------
    product : list of ndarrays

    Examples
    --------
    >>> cartesian_product([list('ABC'), [1, 2]])
    [array(['A', 'A', 'B', 'B', 'C', 'C'], dtype='<U1'), array([1, 2, 1, 2, 1, 2])]

    See Also
    --------
    itertools.product : Cartesian product of input iterables.  Equivalent to
        nested for-loops.
    z'Input must be a list-like of list-likesr   c                 s  s   � | ]}t |ƒV  qd S )N)Úlen)Ú.0Úx© r   úU/var/www/agentarbitrage/venv/lib/python3.10/site-packages/pandas/core/reshape/util.pyÚ	<genexpr>.   s   € z$cartesian_product.<locals>.<genexpr>)Údtypez+Product space too large to allocate arrays!é   éÿÿÿÿc                   s0   g | ]\}}t t |ˆ| ¡t ˆ | ¡ƒ‘qS r   )Útile_compatÚnpÚrepeatÚprod)r	   Úir
   ©ÚaÚbr   r   Ú
<listcomp>?   s    üþÿz%cartesian_product.<locals>.<listcomp>)r   Ú	TypeErrorr   r   ÚfromiterÚintpÚcumprodÚanyÚ
ValueErrorÚrollÚ
zeros_likeÚ	enumerate)ÚXÚmsgr
   ÚlenXÚcumprodXr   r   r   Úcartesian_product   s*   ÿ

ûr'   Úarrr   ÚnumÚintc                 C  s8   t | tjƒrt | |¡S t t t| ƒ¡|¡}|  |¡S )zf
    Index compat for np.tile.

    Notes
    -----
    Does not support multi-dimensional `num`.
    )Ú
isinstancer   ÚndarrayÚtileÚaranger   Útake)r(   r)   Útakerr   r   r   r   H   s   
r   )r   r   )r(   r   r)   r*   r   r   )Ú
__future__r   Útypingr   Únumpyr   Úpandas.core.dtypes.commonr   Úpandas._typingr   r'   r   r   r   r   r   Ú<module>   s    
;