U
    <c?                     @   s  d dl Z d dlZd dlZd dlmZ dZdZdZdZ	dZ
dZe jZdZG d	d
 d
eZdd Zdd Zdd Zdd Zdd Zdd Zdd Zedkre Zejre jd ejse jd e jd ej se j!d e j"d ej#Zej$Zej%reej&e nej'&ej& g Z(ej')d ej&ej*D ]HZ&zee&e W n2 ek
rx Z+ ze(,e-e+ W 5 dZ+[+X Y nX q4e.e(d kre/d n2e/d0e.e(ej* e/d e(D ]Z1e/e1 qdS )    N)DictF      i   cuda   c                   @   s   e Zd ZdS )WrongResultExceptionN)__name__
__module____qualname__ r   r   T/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/codegen/random_topo_test.pyr   !   s   r   c                 C   sn   t | }tjd|d }tjdt|d |}| || }tjjt|| || ddD ]}d||< q\|S )Nr      Freplace)lennprandomrandintminchoicerange)tensor_shapeZmax_dimZ
num_b_dimsZ	trim_headshapeir   r   r   get_broadcast_compatible_shape*   s    

r   c              	      s>  t jt|    |}t|}t jd|d }t j|}tr\|D ]}t	d| qL fdd i }|}t
t|}	tjtjg}
tjtjtjg}t|
}t|}t j|d |t }g }|dks|dkrt jdt|	}t jd|| }|	| }d }d }tr*t	d|||	t||| |dkr|d8 }||k rX|
| || }nt jdt|| }|t|k r||kr|d t| }|}n*|| }||t|  }|||  ||}tr&t	d|| nHt jdt|	}||kr
|d t|	 }|	| }tr&t	d| t||	|<  ||}|d k	r|||  || || }||	krt|	|  ||}||kr|d8 }t|||< t|||< || q|	D ]}|||  qt jt|t|t jdt|| d	}|D ]}||	kr|||  qtr6t	d
t| t|S )Nr   r   z----- real number {:.10f}c                    s   | |kr ||  |S | S d S )Nr   )xZdependency_mapget_rootr   r   r   G   s    z&random_topology_test.<locals>.get_rootzWiteration {0}, num_sets{1}, candidates {2}, tensor_list {3}, lh_index {4}, op_index {5}z%binary, op_2_index {0}, rh_index ?{1}zbinary rh_index ?{0}Fzended with tensor_list: {0})r   r   seedintnumpytolistr   r   DEBUG_PRINTprintlistr   torchZsigmoidZreluaddsubmulGRAPH_FACTORformatremoveappendr   tuple)r   Zinp_tensor_listtensor_list
num_tensorZ	num_const
const_listZ
const_itemZd_mapZnum_sets	candidateZunary_operationsZbinary_operationsZ	u_op_sizeZ	b_op_sizeZnum_operationsZret_listindexZop_indexZlh_indexZrh_indexZ
out_tensorZ
op_2_indexleftrightZ
cand_indexZlh_rootZrh_rootindZout_listr   r   r   random_topology_test9   s         











r6   c              	   C   sT  t j|  tt jd|  tt jd| }t jd|}t jd|}	g }
d}|rh|
d nVt|	D ]L}t jdt	|| d|	|   }t
|d|d  }|
d| ||9 }qptrtd|
 t jdd}t jjt||dd}g }t|D ]L}||kr0t|
}|tj|||dd	  q|tj|
||dd	  q||fS )
Nr   r   r      zoutput tensor shape: Fr   )devicedtyped   )r   r   r   r%   Zmanual_seedr   Ztensorr,   r   r   r   insertr"   r#   r   Zaranger   Zrandn)r   Zmax_tensor_nummax_tensor_dimmax_tensor_sizedebug_tensorr8   r9   seed_tensorr/   Z
tensor_dimr   Znumelr   Zsize_iZnum_broadcasted_tensorsZbroadcasted_tensors_indicesr.   Zcompatible_shaper   r   r   #prepareInputTensorsToRandomTopoTest   s8    "


r@   c                 C   sr   d t}|jr|d7 }|jr&|d7 }|jr4|d7 }|jrB|d7 }|jrP|d7 }|d |j|j|j	|j
| 7 }|S )Nz
python {0}z --cuda_fuserz --legacy_fuserz --profiling_executorz --fp16z --cpuzj --max_num_tensor {0} --max_tensor_dim {1} --max_tensor_size {2} --depth_factor {3} --seed {4} --repro_run)r*   __file__
cuda_fuserlegacy_fuserprofiling_executorfp16cpumax_num_tensorr<   r=   depth_factor)Zcurrent_seedargsZ	repro_strr   r   r   reproString   s&    
   rJ   c           	      C   s   t | tttttt\}}t|f| }tj	
t|f|}||f| }||f| }t||}|D ]\}}|j|dddsd dS qddS )Ngh㈵>T)Zatol	equal_nanF)r@   
MAX_TENSORMAX_TENSOR_DIMMAX_TENSOR_SIZEDEBUG_TENSORDEVICEDTYPEr6   r%   jittracezipallclose)	r   r?   r.   otraced_modeljit_o
validate_ooojit_oor   r   r   runDefaultTestWithSeed  s"    
r\   c              
   C   s  t | |j|j|j|j|jsdnd|js,tjntj	\}}z<t
rHtd| t|f| }t
rr|D ]}td|  q^W n8 tk
r } ztdt| | |W 5 d }~X Y nX ztjt|f|}t
rtd|j ||f| }||f| }t
rtd|j|f|  t||}	|	D ]B\}
}|
j|dd	std
|
 td| td||
  t qW nr tk
r } ztdt| | |W 5 d }~X Y n: tk
r } ztdt| | |W 5 d }~X Y nX d S )Nr   rF   zseed tensor: z
val size: z>Testing script failure with error message, repro by running:
	zoriginal graph: zoptimized graph: T)rK   zeager output: zjit output: zdiff z3cuda fuser gives wrong results, repro by running:
	z7something in cuda fuser went wrong, repro by running:
	)r@   rG   r<   r=   r>   rF   rE   r%   Zfloat32Zfloat16r"   r#   r6   size	ExceptionrJ   rR   rS   graphZ	graph_forrT   rU   r   )r   rI   r?   r.   rV   outerrrW   rX   rY   rZ   r[   r   r   r   runTest%  sT    	



rb   c                  C   s   t  } | jdddd | jdddd | jdddd | jdddd | jd	ddd | jd
ddd | jdddd | jdttd | jdttd | jdttd | jdttd | jddtd |  }|jddtd |jdddd | 	 S )Nz--cuda_fuser
store_trueT)actiondefaultz--legacy_fuserFz--profiling_executorz--fp16z--cpuz--debug_printz--debug_tensorz--max_num_tensor)re   typez--max_tensor_dimz--max_tensor_sizez--depth_factorz--seedi  z--iterations   z--repro_run)
argparseArgumentParseradd_argumentrL   r   rM   rN   r)   add_mutually_exclusive_group
parse_args)parsergroupr   r   r   rl   R  s"    rl   __main__Tztest passedz{0} out of {1} tests failed;zTo repro failing tests, run
)2r%   r    r   rh   typingr   r"   rL   rM   rN   rO   rP   floatrQ   r)   r^   r   r   r6   r@   rJ   r\   rb   rl   r   rI   rB   Z_CZ_jit_set_nvfuser_enabledrC   Z_jit_override_can_fuse_on_cpuZ_jit_override_can_fuse_on_gpurD   Z_jit_set_profiling_executorZ_get_graph_executor_optimizerH   debug_printZ	repro_runr   r   Zfailing_reprosr   Z
iterationser,   strr   r#   r*   Zrepror   r   r   r   <module>   sd   	 	9-
$
 