U
    )3g1                     @   s   d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlZd dl	Z
dZee ZdZdd Zddd	Zdd
dZdddZedZdddZG dd deZdS )    N)partiali   g333333?c                 C   s*   t |t| \}}| g| | d | g S N)divmodlen)baseZtarget_sizeqr r	   5/tmp/pip-unpacked-wheel-0fuzq0j6/benchmarks/common.py_multiplicate_sequence#   s    r   *   c                 C   s`   t j|}d}t| |\}}|dkr2||}n||}dt|| }t|| ks\t|S )z`
    Generate a random bytes object of size *n*.
    Note the result might be compressible.
    i r       )	nprandomRandomStater   bytesjoinr   r   AssertionError)nseedrnd	base_sizer   r   resultr   r	   r	   r
   get_random_bytes(   s    
r   c                 C   sL   t jt| |dt jdd@ }t|\}}t|ts8tt	|| ksHt|S )z=
    Get a random ASCII-only unicode string of size *n*.
    r   Zdtype   )
r   
frombufferr   Zint8codecsascii_decode
isinstancestrr   r   )r   r   Zarrr   _r	   r	   r
   get_random_ascii;   s
    r#   c                    sf    fdd}t j|g }g }t| k rb|s8| }t| }t|d dkr"|| q"|S )z=
    Generate a string of random unicode letters (slow).
    c                      s   j dtj d S )Nr   size)randintsys
maxunicodetolistr	   r   r   r	   r
   _get_more_candidatesJ   s    z5_random_unicode_letters.<locals>._get_more_candidatesr   L)	r   r   r   r   chrpopunicodedatacategoryappend)r   r   r+   out
candidateschr	   r*   r
   _random_unicode_lettersF   s    r5   c                 C   s`   t jt| d |dt jdd@ }t t| }d| }t|| ks\t	t|t|f|S )z<
    Get a random non-ASCII unicode string of size *n*.
       r   r   i   )
r   r   r   Zint16array_1024_random_unicode_lettersr   r)   r   r   )r   r   indicesZunicode_arrr   r	   r	   r
   get_random_unicode^   s     r;   c                   @   s   e Zd Zd&ddZdd Zdd Zefdd	Zed
fddZefddZ	ed
fddZ
efddZdd ZefddZefddZefddZefddZefddZefdd Zefd!d"Zd#d$ Zd%S )'BuiltinsGeneratorr   c                 C   s   t j|| _d S r   )r   r   r   r   )selfr   r	   r	   r
   __init__m   s    zBuiltinsGenerator.__init__c                 C   s4   t | jjt|dD ]\}}||k r|||< qdS )zP
        Sprinkle *value* entries in list *lst* with likelihood *prob*.
        r$   N)	enumerater   Zrandom_sampler   )r=   lstprobvalueipr	   r	   r
   sprinklep   s    zBuiltinsGenerator.sprinklec                 C   s   |  ||d dS )zM
        Sprinkle None entries in list *lst* with likelihood *prob*.
        N)rE   )r=   r@   rA   r	   r	   r
   sprinkle_nonesx   s    z BuiltinsGenerator.sprinkle_nonesc                 C   s   t t|}| || |S )zm
        Generate a list of Python ints with *none_prob* probability of
        an entry being None.
        )listrangerF   r=   r   	none_probdatar	   r	   r
   generate_int_list~   s    z#BuiltinsGenerator.generate_int_listFc                 C   sJ   t tt| jdd|}t||ks*t| j|||r>tdndd |S )z
        Generate a list of Python floats with *none_prob* probability of
        an entry being None (or NaN if *use_nan* is true).
                      ?nanNrB   )rG   mapfloatr   uniformr   r   rE   r=   r   rJ   Zuse_nanrK   r	   r	   r
   generate_float_list   s    z%BuiltinsGenerator.generate_float_listc                 C   s:   dd | j dd|D }t||ks*t| || |S )zn
        Generate a list of Python bools with *none_prob* probability of
        an entry being None.
        c                 S   s   g | ]}t |d kqS )g      ?)bool).0xr	   r	   r
   
<listcomp>   s     z8BuiltinsGenerator.generate_bool_list.<locals>.<listcomp>rM   rN   )r   rS   r   r   rF   rI   r	   r	   r
   generate_bool_list   s    z$BuiltinsGenerator.generate_bool_listc                 C   sL   dd | j dd|D }t||ks*t| j|||r@tdndd |S )z
        Generate a list of Python Decimals with *none_prob* probability of
        an entry being None (or NaN if *use_nan* is true).
        c                 S   s   g | ]}t d | qS )z%.9f)decimalDecimal)rW   fr	   r	   r
   rY      s   z;BuiltinsGenerator.generate_decimal_list.<locals>.<listcomp>rM   rN   rO   NrP   )r   rS   r   r   rE   r[   r\   rT   r	   r	   r
   generate_decimal_list   s    z'BuiltinsGenerator.generate_decimal_listc                 C   s"   dd t |D }| || |S )zx
        Generate a list of generic Python objects with *none_prob*
        probability of an entry being None.
        c                 S   s   g | ]
}t  qS r	   )object)rW   rC   r	   r	   r
   rY      s     z:BuiltinsGenerator.generate_object_list.<locals>.<listcomp>)rH   rF   rI   r	   r	   r
   generate_object_list   s    z&BuiltinsGenerator.generate_object_listc                 C   s   d}||| }g }t |D ]F}	| j|}
||kr:|}n| j||d }|||
|
|   q| || t||kst|S )a  
        Generate a list of *n* sequences of varying size between *min_size*
        and *max_size*, with *none_prob* probability of an entry being None.
        The base material for each sequence is obtained by calling
        `random_factory(<some size>)`
        i'     )rH   r   r&   r1   rF   r   r   )r=   Zrandom_factoryr   min_sizemax_sizerJ   r   r   rK   rC   offr%   r	   r	   r
   _generate_varying_sequences   s    z-BuiltinsGenerator._generate_varying_sequencesc                 C   s   |  t||||S )zE
        Generate a list of bytestrings with a fixed *size*.
        re   r   )r=   r   r%   rJ   r	   r	   r
   generate_fixed_binary_list   s
      z,BuiltinsGenerator.generate_fixed_binary_listc                 C   s   |  t||||S )zn
        Generate a list of bytestrings with a random size between
        *min_size* and *max_size*.
        rf   r=   r   rb   rc   rJ   r	   r	   r
   generate_varying_binary_list   s
      z.BuiltinsGenerator.generate_varying_binary_listc                 C   s   |  t||||S )zp
        Generate a list of ASCII strings with a random size between
        *min_size* and *max_size*.
        )re   r#   rh   r	   r	   r
   generate_ascii_string_list   s
      z,BuiltinsGenerator.generate_ascii_string_listc                 C   s   |  t||||S )zr
        Generate a list of unicode strings with a random size between
        *min_size* and *max_size*.
        )re   r;   rh   r	   r	   r
   generate_unicode_string_list   s
      z.BuiltinsGenerator.generate_unicode_string_listc                 C   s   |  t| j|d||||S )zw
        Generate a list of lists of Python ints with a random size between
        *min_size* and *max_size*.
        rJ   )re   r   rL   rh   r	   r	   r
   generate_int_list_list   s       z(BuiltinsGenerator.generate_int_list_listc                 C   s0   | j ||d}dd |D }t||ks,t|S )z
        Generate a list of tuples with random values.
        Each tuple has the form `(int value, float value, bool value)`
        rl   c                 S   s4   g | ],}|d k	r,| d| d| dfnd qS )Nuvw)get)rW   dr	   r	   r
   rY      s   z9BuiltinsGenerator.generate_tuple_list.<locals>.<listcomp>)generate_dict_listr   r   )r=   r   rJ   dictsZtuplesr	   r	   r
   generate_tuple_list   s    z%BuiltinsGenerator.generate_tuple_listc                 C   s   | j ||d}| j||d}| j||d}g }tddg}t|||D ]`\}}	}
i }|dk	sft|rn||d< |	dk	s~t|r|	|d< |
dk	st|r|
|d< || qH| || t	||kst
|S )z
        Generate a list of dicts with random values.
        Each dict has the form

            `{'u': int value, 'v': float value, 'w': bool value}`
        rl   TFNrn   ro   rp   )rL   rU   rZ   	itertoolscyclezipnextr1   rF   r   r   )r=   r   rJ   ZintsZfloatsZboolsrt   Z
keep_nonesrn   ro   rp   rr   r	   r	   r
   rs     s"    z$BuiltinsGenerator.generate_dict_listc                 C   s  d}|dkr|}nx| dr"d}nh| dr2d}nX| drBd}nH|dkrPd}n:| dr|d	}t|d
d }|dkstntd|f |dkrtt| }n|dkrt }n|dkrtdd}n|d	krt|}n~|dkrt }nl|dkrt	 }nX|dkrt
t }n>|dkrZttdt tdt tdt g}| j| j| j| jt| j|dt| jdddt| jdddt| jdddt| jddd| j| jd}|| |}||fS )z
        Return a `(arrow type, list)` tuple where the arrow type
        corresponds to the given logical *type_name*, and the list
        is a list of *n* random-generated Python objects compatible
        with the arrow type.
        N)rV   r[   asciiunicode
int64 list)intZuintr}   rR   structbinaryvarying binaryfixed binary   r   zunrecognized type %r)r}   rR   rV   r[   	   )rz   r{   r|   rn   ro   rp   r$      (   )rb   rc      )r}   rR   rV   r[   r   r   rz   r{   r|   r~   zstruct from tuples)
startswithr}   r   
ValueErrorgetattrpaZbool_Z
decimal128r   stringlist_Zint64r~   fieldZfloat64rL   rU   rZ   r^   r   rg   ri   rj   rk   rm   rs   ru   )r=   r   	type_namer%   kindtyZ	factoriesrK   r	   r	   r
   get_type_and_builtins  s~    









    z'BuiltinsGenerator.get_type_and_builtinsN)r   )__name__
__module____qualname__r>   rE   rF   DEFAULT_NONE_PROBrL   rU   rZ   r^   r`   re   rg   ri   rj   rk   rm   ru   rs   r   r	   r	   r	   r
   r<   k   s2   
	

	







r<   )r   )r   )r   )r   )r   r[   	functoolsr   rv   r'   r/   Znumpyr   Zpyarrowr   ZKILOBYTEZMEGABYTEr   r   r   r#   r5   r9   r;   r_   r<   r	   r	   r	   r
   <module>   s"   



