U
    <c[                     @   sp  d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl	m
Z
 ddlmZ dd	 Zeeejeeeed
ddZeddddgZedejjejedejjejedejjejedejjejedejjejgZdd eD Zdd eD ZddgZdd Z e!dkrlee dZ"e"j#d eed!ed" e"j#d#eed!ed" e"j#d$edd% e"j#d&ed'd% e"j#d(ed)d% e"j#d*d+ed, e"$ Z%e&e%j'e&e%j( Z)dZ*g Z+e%j'D ]pZ'd-d. e%j(D D ]XZ(e+ee(j,e(j-e(je%j.e'e%j/e%j0d
7 Z+e*d/7 Z*e1d0e(j, d1e' d2e* d3e) d4	 qqe%j2dk	rJe3e%j2d5Z4e e4e+ W 5 Q R X e
5e+Z6e67  e68  e61  dS )6z(Microbenchmarks for the torch.fft module    )ArgumentParser)
namedtuple)IterableN)	benchmark)SpectralOpFuzzerc                 C   sJ   | dkrd gS | dkr ddd gS | dkr8dddddd gS t d|  d S )N      r      )r   r   )r   r   z Expected ndim in range 1-3, got )
ValueError)ndim r   Y/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/benchmark/examples/spectral_ops_fuzz_test.py_dim_options   s    
r   )namefunctiondtypeseeddevicesamplesprobability_regularc                 C   s  |dk}t ||||d}g }	||D ]\}
}}|d |d |d gd |d  }ddd	 |D }| d
|d d r|dnd }t|d D ]z}|sdndD ]h}tjd||
d |d|  d| |d| |djdd}| |||d|_|j|d  |		| qqq&|	S )Ncuda)r   r   r   r   Zk0Zk1Zk2r   z x c                 S   s   g | ]}d  |qS )z{:<4})format.0sr   r   r   
<listcomp>   s     z!run_benchmark.<locals>.<listcomp> xis_contiguous z(discontiguous))r         )r   zfunc(x, dim=dim))funcr   dim_zdim=)Zstmtglobalslabel	sub_labeldescriptionnum_threadsr   )Zmin_run_time)r   r   r#   shape)
r   Ztakejoinr   r   TimerZblocked_autorangemetadataupdateappend)r   r   r   r   r   r   r   r   Zspectral_fuzzerresultsZtensorsZtensor_paramsparamsr*   Z	str_shaper'   r#   Znthreadsmeasurementr   r   r   run_benchmark   s:    "	r3   	Benchmarkr   r   r   Zfft_realZfft_complexZifftZrfftZirfftc                 C   s   i | ]}|j |qS r   r   r   br   r   r   
<dictcomp>=   s      r8   c                 C   s   g | ]
}|j qS r   r5   r6   r   r   r   r   >   s     r   cpur   c                 C   s   |  d |D ]}|j}|d |d |d |d |d |d f\}}}}}}	t|trldd	d
 |D }
nt|}
ddd
 |D }t|||jj|||	|
|j	d |j
d |jd d| d qd S )NzWbenchmark,device,num_threads,numel,shape,contiguous,dim,mean (us),median (us),iqr (us)
r   r#   r*   r   numelr   -c                 s   s   | ]}t |V  qd S Nstr)r   dr   r   r   	<genexpr>J   s     z_output_csv.<locals>.<genexpr>r   c                 s   s   | ]}t |V  qd S r<   r=   r   r   r   r   r@   M   s     g    .A,)sepfile)writer-   
isinstancer   r+   r>   printZ	task_specr)   ZmeanZmedianZiqr)rC   r0   r2   r-   r   r#   r*   r   r:   
contiguousZdim_strZ	shape_strr   r   r   _output_csvA   s*    
    
   rH   __main__)r(   z--device+)typechoicesnargsdefaultz--benchz--seed)rK   rN   z	--samples
   z--probability_regularg      ?z-oz--output)rK   c                 c   s   | ]}t | V  qd S r<   )BENCHMARK_MAPr6   r   r   r   r@   b   s     r@   r   z
Completed z benchmark on z (z of )w)9__doc__argparser   collectionsr   collections.abcr   ZtorchZ	torch.fftZtorch.utilsr   Z)torch.utils.benchmark.op_fuzzers.spectralr   r   r>   objectr   intfloatr3   r4   ZfftZfftnZfloat32Z	complex64ZifftnZrfftnZirfftnZ
BENCHMARKSrP   ZBENCHMARK_NAMESZDEVICE_NAMESrH   __name__parseradd_argument
parse_argsargslenr   ZbenchZnum_benchmarksir0   r   r   r   r   r   rF   outputopenfZComparecompareZtrim_significant_figuresZcolorizer   r   r   r   <module>   sl   



    ,
