U
    Mhc9                     @   sz  d dl mZ 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m
Z
 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 ejejejfZedd ejdejdejd iZdd Zdd Zdd Zdd Zejd+ddZejd,ddZ ejdddej!fddZ"ejd-ddZ#ejd.d#d$Z$ej%j&Z'ej(ej) j*Z+de+d%< e'd&krne'd'k rnej,e+d(< d)d* Z-dS )/    )defaultdict)IterableN)reduce)assume)settings)
strategies)numpy)SearchStrategy)_calculate_dynamic_qparams&_calculate_dynamic_per_channel_qparamsc                   C   s   d S )N r   r   r   Z/var/www/html/venv/lib/python3.8/site-packages/torch/testing/_internal/hypothesis_utils.py<lambda>        r   c           
      C   s   | \}}}dt t jj }t t j}|j| |j|  }}t|| | || | }t|| | || | }	t	|t	|	fS N   )
torchfinfofloatepsiinfolongminmaxnpfloat32)
qparamsscale
zero_pointquantized_typeZ
adjustmentZ_long_type_infoZlong_minZlong_max	min_value	max_valuer   r   r   _get_valid_min_max&   s    
r"   c                  O   s   d|krt jjdk rd|kr*|d  s2d|koJd|krD|d  pJd|k}t| dkofd|kofd|k}|r
|r
|d dkrttjj|d< ttjj|d< nd|d d	krttj	j|d< ttj	j|d< n2|d d
kr
ttj
j|d< ttj
j|d< |d tj| |S )Nwidth)   C   r   	allow_nanallow_infinityr   r    r!          @   )
hypothesisversion__version_info__lenr   r   Zfloat16r   r   r   Zfloat64popstfloats)argskwargsZno_nan_and_infZmin_and_max_not_specifiedr   r   r   _floats_wrapper3   s0    
r4   c                  O   s   d|krd|d< t | |S )Nr#   r)   )r4   )r2   r3   r   r   r   r1   N   s    r1   c                 C   s0   t |\}}t|  |k t|  |k dS )NT)r"   r   r   r   )tensorr   r    r!   r   r   r   assume_not_overflowingb   s    r6   c                 C   s   |d krt }t|ttfs |f}| t|}t|}|j|j	 }}	t
| }
|
d k	r\|
}n2|d krh|n|}|d krx|	n|}| tj||d}|d krttjj}|d krttjj	}| t||dd}|||fS )N)r    r!   r)   )r    r!   r#   )_ALL_QINT_TYPES
isinstancelisttupler0   sampled_fromr   r   r   r   _ENFORCED_ZERO_POINTintegersr   r   r   r1   )drawZdtypesZ	scale_minZ	scale_maxZzero_point_minZzero_point_maxr   Z
_type_infoZqminZqmaxZ_zp_enforcedr   Z_zp_minZ_zp_maxr   r   r   r   r   w   s&    
r   r   c                    s~   |dk st |dkr"t|d d}|dk s.t |dkr>|d }tjt||||d} dk	rp| fdd}| |tS )z8Return a strategy for array shapes (tuples of int >= 1).r)   N      )Zmin_sizemax_sizec                    s   t tj| d kS r   )r   int__mul__)x	max_numelr   r   r      r   zarray_shapes.<locals>.<lambda>)AssertionErrorr   r0   listsr=   filtermapr:   )r>   Zmin_dimsZmax_dimsZmin_sideZmax_siderF   	candidater   rE   r   array_shapes   s    rL   c                 C   s  t |tr| |}n| t|}|d kr|d krBtddddd}| tj|||d}tt	|
 prt|
   |d fS | |}|d krt|\}}t||dddd}| tj|||d}t||d \}	}
t|d d }|d k	r|}
||	|
|d ffS )	N    .    .AFr)   r&   r#   dtypeelementsshaper'   r&   r#   r?   )r8   r	   r0   r;   r1   stnparraysr   r   isnananyisinfr"   r
   r<   get)r>   shapesrR   r   rQ   _shapeXr    r!   r   zpenforced_zpr   r   r   r5      s,    

" r5   c                 C   sF  t |tr| |}n| t|}|d kr|d krBtddddd}| tjtj||d}t	t
| ptt|   |d fS | |}|d krt|\}}t||dddd}| tjtj||d}t||d \}}	t|d d }
|
d k	r|
}	ttjd	|jd
}t|j}||d	< d	||< t||}|||	||d ffS )NrM   rN   Fr)   rO   rP   rT   r?   r   r   )r8   r	   r0   r;   r1   rU   rV   r   r   r   rW   rX   rY   r"   r   r<   rZ   rB   randomrandintndimZarangeZ	transpose)r>   r[   rR   r   r\   r]   r    r!   r   r^   r_   ZaxisZpermute_axesr   r   r   per_channel_tensor   s6    

" rc   r?   r      r$            Fc                 C   s  | t j| }| t j| }| t j| }| t d|}|| }|| }t|trb| t |}g }t|D ]}|| t j|  qng }t|D ]}|| t j|  qd}||ft| }|}|r| t  }|r||ft| }|}|
d k	r*t|
t	tfr t
|
dks*tdn
|
gd }
| t||ft| f|	|
d d}| t|f|	|
d d}| t|f|	|
d d}|||||fS )Nr   Fr$   zNeed 3 qparams for X, w, br   )r[   rR   r   r?   )r0   r=   r8   r   r;   rangeappendr:   Zbooleansr9   r.   rG   r5   )r>   Zspatial_dimZbatch_size_rangeZinput_channels_per_group_rangeZoutput_channels_per_group_rangeZfeature_map_rangeZkernel_rangeZ
max_groupsZcan_be_transposedrR   r   Z
batch_sizeZinput_channels_per_groupZoutput_channels_per_groupgroupsZinput_channelsZoutput_channelsZfeature_map_shapeiZkernelstrZweight_shapeZ
bias_shaper]   Wbr   r   r   tensor_conv)  sV    



 

rr   deadline)r$   r(   r   )r@   r   r   timeoutc                  C   s<   t dk r(dd l} dtj }| | nt jd ks8td S )N)r$      r   r   zwYour version of hypothesis is outdated. To avoid `DeadlineExceeded` errors, please update. Current hypothesis version: )hypothesis_versionwarningsr+   __version__warnr   rs   rG   )rw   Zwarning_messager   r   r   assert_deadline_disabledi  s    
rz   )NNNNN)r   Nr   NN)NNN)
r?   rd   rf   rf   rh   rf   r   FNN).collectionsr   collections.abcr   r   r   r   r+   	functoolsr   r   r   r   r0   Zhypothesis.extrarU   Zhypothesis.strategiesr	   Z(torch.testing._internal.common_quantizedr
   r   Zquint8Zqint8Zqint32r7   r<   r"   r4   r1   r6   Z	compositer   rL   r   r5   rc   rr   r,   r-   rv   Z	_profilesZ_current_profile__dict__Zcurrent_settingsZ	unlimitedrz   r   r   r   r   <module>   sp   	       )N               :
