
    sg]                    d1   U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZm Z  ddlm!Z!m"Z" ddlm#Z# ddl$m%Z% ddl&m'Z' ddlm(Z(m)Z) dd	l*m+Z+m,Z, dd
l-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?Z?ddl@ZAddlBZBddlCZCddlDZCddlEZCddlFZCddlGZCddlHZCddlCmIZI ddlJmKZKmLZL ddlMmNZN ddlOmPZP ddlQmRZRmSZSmTZTmUZUmVZV ddlWmXZXmYZY ddlZm[Z[ ddl\m]Z]m^Z^m_Z_m`Z`maZa ddl\mbZb ddlcmdZd ddlemfZf ddlgmhc miZj 	 ddlkZkdZldZnd Zo G d d      Zp ej                  er      ZseCj                  j                          dZvej                   d k(  rd!Zvepj                  d"d#dd$ %      Zxeyezd"<   epj                  d&d'd( d)      Z{eyezd&<    e|eCj                  d*      xr eCj                  j                  Zepj                  d+d,ed-      Zeyezd+<   epj                  d.d/d0      Zeyezd.<   epj                  d1d2d0      Zeyezd1<   epj                  d3d4e d-      Zeyezd3<   epj	                  d5d6ddd7 8      Ze8e   ezd5<   d9Zd:Zi ai ad; Z ej                  d<d=      r e ej                  d<d=            a ej                  d>d=      r e ej                  d>d=            ad?d@dAdBeCj                  j                         fZg dCZ edD eD              ZdE ZdFe8e3   fdGZe% G dH dI             ZdFe8e   fdJZdK Z G dL dM      Z G dN dO      ZdP ZdQ Z G dR dS      Z G dT dUe      Z G dV dWe      Z G dX dYe'      ZdZ Ze"d[        Ze"d\        Ze"d]        ZeCj                  jH                  jJ                  ZeCj                  jN                  jJ                  Zd^ Zd_ Zd` ZeeCj                  jH                  _        eeCj                  jN                  _        da Zdb eeBdcd=      v Z ej^                  e dd      Zejc                  dedfdgh       ejc                  diedjk       ejc                  dldfm       ejc                  dndoep       ejc                  dqedrk       ejc                  dsdtdfm       ejc                  dudfm       ejc                  dvdwe e       exr e       ndx       ejc                  dydfm       ejc                  dzed=k       ejc                  d{edrk       ejc                  d|edwe}       ejc                  d~edwe}       ejc                  ddfm       ejc                  dedr       ejf                  dk\  r!ejc                  dejh                  d       n*ejc                  ddfd       ejc                  ddd       d Zdejl                  v sdejl                  v rC ejn                  eejl                  f      Zejs                          eju                          ejw                         \  ZZej|                  dk(  rej~                  ZnCej|                  dk(  rej                  Zn%ej|                  dk(  rej                  Zn e       Zej                  Zej                  Zej                  Zej                  Zej                  Zej                  Zej                  Zej                  Zej                  Zej,                  Zej                  Zej                  Zej                  Zej                  Z ee?dd      sej                  e?_        ejl                  d   gez   Z eCj                  e۫        e e. ej                                     Z e e. ej                               j                        Z eej                  ju                   e. ej                               j                  d            ZddZddZ	 	 	 	 	 	 	 ddFe9eeyf   fdZd Zd Zd Zd Zd Zd ZedfdZdefdZde7e   dFe7e   fdZefdZej                   dk(  Zej                   d k(  Zej                   dk(  Z ej                         dk(  Z ej                         dv Z ej                         dv Zd Z e       Zer	e"d        Zne"d        Zere"dd       Zn
e"dd       Zd Z  ej                         dk(  Z efd      Z efd      Z efd      ZeCj                  j                  j                         ZeCj                  j                  j                         Z
eCj                  j                         Z e|eCd      reCj                  j                         rdndZeCj                  j                         Z eeCeCj                  j                         d      Z e        ZeCj                  j                         Z efd      Z efd      Z efd      Z efd      xr e Z efd      Z efd      ZdefdZd? e ej                  dd=            v Z ej8                  e d      Zepj                  dd      Zeyezd<   epj                  dd      Zeyezd<   epj                  dd      Z eyezd<   epj                  dd¬      Z!eyezd<   epj                  ddĬ      Z"eyezd<   epj                  ddƬ      Z#eyezd<    ej                  ddȫ      dk(  Z$epj                  ddˬ      Z%eyezd<   epj                  ddͬ      Z&eyezd<   epj                  ddϬ      Z'eyezd<   epj                  ddѬ      Z(eyezd<   exr e( xr eCjR                  j                  xr4  eeCjR                  j                  jU                  dҫ      d         dk\  xs_ eCjR                  jV                  xrE  e,dҐju                  eCjR                  jV                  jU                  dҫ      dd             dk\  Z-exrN eCjR                  j                  xr4  eeCjR                  j                  jU                  dҫ      d         dk\  Z.dׄ Z/epj                  dd ejP                  e/dڬ۫      ܫ      Z0eyezd<   erdejb                  v rs e ej                  ddޫ            Z2eCj                  jg                         dr   dz  Z4eCj                  jk                   e6e4e2dz  z
  e4z  e2z  dԫ              ejn                  eCj                  j                         d      Z8d Z9 G d deCjt                  jv                        Z<epj                  dd欼      Z=eyezd<   epj                  dd謼      Z>eyezd<   epj                  ddd       Z?eyezd<   e?rgddl@ZCdeCj                  j                  _C        deCj                  j                  _D        e=r#ddlEZCdeCj                  j                  _G        d ZHd ZIddZJde=fdZKddZLddZMddZNddZOddZP ej                  d      dk(  ZQeQr)deCj                  j                  j                  _U        d ZVepj                  dd      ZWeyezd<   eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  eAj                  eCj                  iZfd Zgd ZhereCj                  efeAj                  <   efj                         D  ci c]  \  } }|| 
 c}} Zkekj                  eCj                  eAj                  eCj                  eAj                  i       deCj                  j                  j                  fdZpdÐd ddZqd Zrde9edf   fdZsdÐdddZtd	 Zud
 ZvdÐdZwd ZxdÐdddZyd Zzd Z{ G d d      Z| G d d      Z} G d d      Z~ G d d      Zd ZdÐdZ G d de      Zd Zd Zd Zd  Zd! Zd" Zd# Zd$ Zd% Zd& Zd' Zd( ZdÐd)Zd* Zd+ ZejD                  d,        ZejD                  d-        Zd. Zd/ Zdːd0Z G d1 d2      Z G d3 d4      Ze"d5        Ze"d6        Z	 ddlZd7 Zej8                  j;                  d8 edej<                  j>                  gdd9ej@                  jB                  :             ej8                  j;                  d; eej<                  j>                  gdd<ej@                  jB                  =             ej8                  j;                  d> eej<                  j>                  gdd?ej@                  jD                  =             ej8                  jG                  exrd8n ej                  d@d;             dBedFefdCZdDejL                  fdEZ G dF dGe]      Z G dH dIe_      Z G dJ dKea      Z G dL dMea      Z G dN dOe`      Z G dP dQe      Z G dR dSe      Z G dT dUe      Z G dV dWe      Z G dX dYejb                  jd                        Ze"dZeyfd[       Z G d\ d]      Z G d^ d_e?jL                        Z G d` dae      ZdǐdbZdc ZddZdeZdefdfZd̐dgZeCjz                  d?fdhZdidjdkdlZdm Zdn Zdo Zdp ZÐdq ZeCjz                  d?drdsZŐdt ZƐdu Zǐdv ZddwdxZɐdy Zʐdz Zːd{ed|ed}edFeCj                  fd~Z̐d͐dZ͐d͐dZΐd Zϐd Zdaѐd ZҐd ZӐd Z G d de
j                        Z֐dZepj                  dd      Zeyezd<    ej8                  eؐd      Zِd ZڐdÐdZېd Ze"dedFe6d   fd       ZeCjX                  deCjz                  deCj                  deCj                  diZߐd Zd ZejD                  d        ZdedFe.fdZd Zd Zd Zde7e   deCj                  deCj                  fdZd Zd Zd Zd ZeCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  deCj                  diZej                  dFe,fd       Z e;d      ZdejL                  de5e   dFefdZd Ze"d        Zd Zd Z G d de      Zd Z G d de      Ze G d d             ZddddddZy# em$ r dZlY 2w xY wc c}} w # em$ r  edA       Y ~w xY w(  a=  Importing this file must **not** initialize CUDA context. test_distributed
relies on this assumption to properly run. This means that when this is imported
no CUDA calls shall be made, including torch.cuda.device_count(), etc.

torch.testing._internal.common_cuda.py can freely initialize CUDA context when imported.
    N)MappingSequence)closingcontextmanager)deepcopy)	dataclass)Enum)partialwraps)productchain)Path)mean)AnyCallableDictIterableIteratorListOptionalTupleTypeTypeVarUnion)	MagicMock)Tensor)
ScriptDict
ScriptList)_as_posix_path)get_writable_path)
ModuleDict
ModuleListParameterDictParameterList
Sequentialregister_custom_op_symbolicunregister_custom_op_symbolic)make_tensor)BooleanPairNonePair
NumberPairPairTensorLikePair)not_close_error_metas)get_all_dtypes)_check_module_existsTF)gfx940gfx941gfx942c                  T    t        j                  j                  j                  | i |S N)torchtesting_utilsfreeze_rng_stateargskwargss     W/var/www/html/venv/lib/python3.12/site-packages/torch/testing/_internal/common_utils.pyr:   r:   n   s"    ==00$A&AA    c                   n    e Zd ZU i Zeed<   edddd d fd       Zedddd fd	       Zed
e	fd       Z
y)TestEnvironmentrepro_env_varsNFTc                     |r| dk7  S | dk(  S )N01 )env_var_valdefaults     r>   <lambda>zTestEnvironment.<lambda>   s    $+[C 2=2D r?   c                       yNFrF   rF   r?   r>   rI   zTestEnvironment.<lambda>   s    r?   c                     |}|t        j                  |      } |||      } |       }|xs |}|r|||k7  r|st        j                  |<   | t	               vsJ d|  d       |t	               | <   |S )Nzduplicate definition of flag ''osgetenvrA   rB   globals)	nameenv_varrH   include_in_repro
enabled_fnimplied_by_fnenabledrG   implieds	            r>   def_flagzTestEnvironment.def_flag   s     ))G,K g6G/$W!47g;MW^6AO**73 79$N(FtfA&NN$!	$r?   c                     | S r6   rF   )maybe_val_strs    r>   rI   zTestEnvironment.<lambda>   s    } r?   c                     ||nt        j                  |      } ||      }|r||k7  r|t        j                  |<   | t	               vsJ d|  d       |t	               | <   |S )Nz!duplicate definition of setting 'rM   rN   )rR   rS   rH   rT   parse_fnvalues         r>   def_settingzTestEnvironment.def_setting   sl     #?		'0B'!16;O**73 79$Q(I$q&QQ$	$r?   returnc            	          dj                  t        j                  j                         D  cg c]  \  } }|  d|  c}}       S c c}} w )N =)joinrA   rB   items)rS   r^   s     r>   repro_env_var_prefixz$TestEnvironment.repro_env_var_prefix   sQ    xx/>/M/M/S/S/UW+We $9AeW- W X 	X Ws   A
)__name__
__module____qualname__rB   dict__annotations__staticmethodrY   r_   strrf   rF   r?   r>   rA   rA   v   sw     ND0  G# P  4 * X# X Xr?   rA   zfile://win32zfile:///IS_CICIc                     t        |       S r6   )bool)env_var_value_s     r>   rI   rI      s    ](; r?   )rS   rT   rU   IS_SANDCASTLE
SANDCASTLEc                  2    t        j                  d      dk(  S )NTW_JOB_USER
sandcastle)rO   rP   rF   r?   r>   rI   rI      s    "))M2lB r?   )rS   rV   rT   IS_FBSOURCE	IS_FBCODEPYTORCH_TEST_FBCODE)rS   rH   rT   IS_REMOTE_GPUPYTORCH_TEST_REMOTE_GPU)rS   rT   DISABLE_RUNNING_SCRIPT_CHK"PYTORCH_DISABLE_RUNNING_SCRIPT_CHKPRINT_REPRO_ON_FAILUREPYTORCH_PRINT_REPRO_ON_FAILUREOPINFO_SAMPLE_INPUT_INDEX!PYTORCH_OPINFO_SAMPLE_INPUT_INDEXc                      | d S t        |       S r6   int)vals    r>   rI   rI     s     #c( r?   )rS   rH   rT   r]   z.pytorch-disabled-tests.jsonzslow_tests.jsonc                     t         j                  j                  |       r*t        |       5 }t	        j
                  |      cd d d        S t        j                  d|        i S # 1 sw Y   !xY w)Nz7Attempted to load json file '%s' but it does not exist.)rO   pathisfileopenjsonloadlogwarning)filenamefps     r>   maybe_load_jsonr     sT    	ww~~h(^ 	!r99R=	! 	!KKI8TI	! 	!s   A""A+SLOW_TESTS_FILE DISABLED_TESTS_FILEcpucudaxpumeta)orinconcordgalenxaviernanojetsontegrac              #   H   K   | ]  }|t        j                          v   y wr6   )platform).0rR   s     r>   	<genexpr>r   /  s     D))++Ds    "c                 B     t        j                          fd       }|S )Nc                      t         r2t        j                          t        j                  j                           | i | y r6   )	IS_JETSONgccollectr7   r   empty_cacher<   r=   fns     r>   wrapperzgcIfJetson.<locals>.wrapper3  s,    JJLJJ""$
DFr?   	functoolsr   r   r   s   ` r>   
gcIfJetsonr   1  s%    __R 
 Nr?   r`   c                  `   	 t        j                         } | D ]  }|j                  }d|j                  vr|j                  d   }t	        |t
        j                        sH|j                         }|j                  d      d   }t        ||      j                  }|c S  	 y # t        $ r Y y w xY w)Nself.   )inspectstackframef_locals
isinstanceunittestTestCaseidsplitgetattr__func__	Exception)r   
frame_infor   self_valtest_id	test_nametest_fns          r>   extract_test_fnr   =  s     		J$$EU^^+~~f-H(H$5$56"++-#MM#.q1	!(I6??		   s   AB!  =B! B! !	B-,B-c                   ,    e Zd ZU eed<   eed<   eed<   y)TrackedInputindexr   	type_descN)rg   rh   ri   r   rk   r   rm   rF   r?   r>   r   r   O  s    J	HNr?   r   c                  N    t               } | y t        | d      sy | j                  S Ntracked_inputr   hasattrr   r   s    r>   get_tracked_inputr   W  s+    G7O,   r?   c                  F    t               } | y t        | d      sy d | _        y r   r   r   s    r>   clear_tracked_inputr   _  s'    G7O, Gr?   c                   4    e Zd Zd ddfdZd Zd ZdefdZy)	TrackedInputIterc                     | S r6   rF   xs    r>   rI   zTrackedInputIter.<lambda>k  s    A r?   TNc                 z    t        |      | _        || _        || _        t	               | _        || _        || _        y r6   )	enumerate
child_iterinput_type_desccallbackr   r   set_seedrestrict_to_index)r   r   r   r   r   r   s         r>   __init__zTrackedInputIter.__init__j  s8    #J/. &(  "3r?   c                     | S r6   rF   r   s    r>   __iter__zTrackedInputIter.__iter__x      r?   c                    	 | j                   rz| j                  ]t        j                  t	        j
                  | j                  j                  j                  d            j                         d d d      nt        }t        |       t        | j                        \  }}| j                  || j                  k(  rn| j                  t        || j!                  |      | j"                               |S )Nutf-8   little)r   r   r   )r   r   r   
from_byteshashlibsha256ri   encodedigestSEEDset_rng_seednextr   r   _set_tracked_inputr   r   r   )r   seed	input_idx	input_vals       r>   __next__zTrackedInputIter.__next__{  s    }}
 ||/ NN7>>1188A$CCI68BQ$PQY[59 
 T" $(#8 Iy&&.IAWAW4W  	T]]9%=I]I]	

 r?   r   c                 n    | j                   y t        | j                   d      sy || j                   _        y r   )r   r   r   )r   r   s     r>   r   z#TrackedInputIter._set_tracked_input  s,    <<t||_5%2"r?   )rg   rh   ri   r   r   r   r   r   rF   r?   r>   r   r   i  s$    %3.3 3r?   r   c                       e Zd ZdZd Zd Zy)_TestParametrizera  
    Decorator class for parametrizing a test function, yielding a set of new tests spawned
    from the original generic test, each specialized for a specific set of test inputs. For
    example, parametrizing a test across the set of ops will result in a test function per op.

    The decision of how to parametrize / what to parametrize over is intended to be implemented
    by each derived class.

    In the details, the decorator adds a 'parametrize_fn' property to the test function. This function
    is intended to be called later by one of:
      * Device-specific test instantiation via instantiate_device_type_tests(). Note that for this
        case there is no need to explicitly parametrize over device type, as that is handled separately.
      * Device-agnostic parametrized test instantiation via instantiate_parametrized_tests().

    If the decorator is applied to a test function that already has a 'parametrize_fn' property, a new
    composite 'parametrize_fn' will be created that generates tests with the product of the parameters
    generated by the old and new parametrize_fns. This allows for convenient composability of decorators.
    c                     t         )a  
        Parametrizes the given test function across whatever dimension is specified by the derived class.
        Tests can be parametrized over any arbitrary dimension or combination of dimensions, such as all
        ops, all modules, or all ops + their associated dtypes.

        Args:
            test (fn): Test function to parametrize over
            generic_cls (class): Generic test class object containing tests (e.g. TestFoo)
            device_cls (class): Device-specialized test class object (e.g. TestFooCPU); set to None
                if the tests are not part of a device-specific set

        Returns:
            Generator object returning 4-tuples of:
                test (fn): Parametrized test function; must support a device arg and args for any params
                test_name (str): Parametrized suffix for the test (e.g. opname_int64); will be appended to
                    the base name of the test
                param_kwargs (dict): Param kwargs to pass to the test (e.g. {'op': 'add', 'dtype': torch.int64})
                decorator_fn (callable): Callable[[Dict], List] for list of decorators to apply given param_kwargs
        )NotImplementedError)r   testgeneric_cls
device_clss       r>   _parametrize_testz#_TestParametrizer._parametrize_test  s
    ( "!r?   c                     t        |d      r+|j                  }| j                  }t        ||      |_        |S | j                  |_        |S )Nparametrize_fn)r   r  r   compose_parametrize_fns)r   r   old_parametrize_fnnew_parametrize_fns       r>   __call__z_TestParametrizer.__call__  sR    2'(!#!2!2!%!7!7 78JL^ _B 	 !% 6 6B	r?   N)rg   rh   ri   __doc__r   r  rF   r?   r>   r   r     s    $",r?   r   c                     | |fd}|S )a  
    Returns a parametrize_fn that parametrizes over the product of the parameters handled
    by the given parametrize_fns. Each given parametrize_fn should each have the signature
    f(test, generic_cls, device_cls).

    The test names will be a combination of the names produced by the parametrize_fns in
    "<new_name>_<old_name>" order. This order is done to match intuition for constructed names
    when composing multiple decorators; the names will be built in top to bottom order when stacking
    parametrization decorators.

    Args:
        old_parametrize_fn (callable) - First parametrize_fn to compose.
        new_parametrize_fn (callable) - Second parametrize_fn to compose.
    c              3   ~  K   t         || ||            }|D ]  \  }}}}	 ||||      D ]  \  }
}}}t        |j                               j                  |j                               }|rt	        d| j
                   d|       i ||}dj                  ||dk7  r|dk7  rdnd|      }|	|fd}|
|||f   y w)NzkParametrization over the same parameter by multiple parametrization decorators is not supported. For test "z8", the following parameters are handled multiple times: z{}{}{}r   rt   c                 H    t         ||             t         ||             z   S r6   )list)param_kwargs
old_dec_fn
new_dec_fns      r>   merged_decorator_fnzJcompose_parametrize_fns.<locals>.composite_fn.<locals>.merged_decorator_fn  s!    
< 89DLAY<ZZZr?   )r  setkeysintersectionRuntimeErrorrg   format)r   r   r   r  r  	old_testsold_testold_test_nameold_param_kwargsr  new_testnew_test_namenew_param_kwargsr  redundant_paramsfull_param_kwargsmerged_test_namer  s                     r>   composite_fnz-compose_parametrize_fns.<locals>.composite_fn  s      +D+zJK	GP 	[CX}&6
&xjI[G=*:J#&'7'<'<'>#?#L#LM]MbMbMd#e #& (QQUQ^Q^P_ `FFVEW(Y Z Z %M'7$L;K$L!#+??=:G2:MR_ceRe3km3@$B  BLXb [  !13DFYZZ[	[s   B;B=rF   )r  r  r  s      r>   r  r    s    " );(:[, r?   c                 .    t        t                     D ]|  }t         |      }t        |d      st	         |        fd}|j                  | d      D ]9  \  }}}}|j                   d| } ||      D ]
  }	 |	|      }  | |||       ; ~  S )ai  
    Instantiates tests that have been decorated with a parametrize_fn. This is generally performed by a
    decorator subclass of _TestParametrizer. The generic test will be replaced on the test class by
    parametrized tests with specialized names. This should be used instead of
    instantiate_device_type_tests() if the test class contains device-agnostic tests.

    You can also use it as a class decorator. E.g.

    ```
    @instantiate_parametrized_tests
    class TestFoo(TestCase):
        ...
    ```

    Args:
        generic_cls (class): Generic test class object containing tests (e.g. TestFoo)
    r  c                 x    t              |ffd	       }t        |      r
J d|        t        ||       y )Nc                      | fi | y r6   rF   )r   r  r   s     r>   instantiated_testzZinstantiate_parametrized_tests.<locals>.instantiate_test_helper.<locals>.instantiated_test  s    T*\*r?   zRedefinition of test )r   r   setattr)clsrR   r   r  r#  r   s     `  r>   instantiate_test_helperz?instantiate_parametrized_tests.<locals>.instantiate_test_helper  sH    4[5A + + {D1Q5J4&3QQ1K'89r?   N)r   r   rt   )r%  rR   r   r  )tupledirr   r   delattrr  rg   )
r   	attr_name
class_attrr&  r   test_suffixr  decorator_fn	full_name	decorators
   `         r>   instantiate_parametrized_testsr0    s    $ 3{+, k	[)4
z#34 	Y'	: @J?X?X @Y @F 	k;T;l==/;-8I *,7 '	 ' $)$]ij	k#k4 r?   c                        e Zd ZdZg dZddZy)subtesta  
    Explicit subtest case for use with test parametrization.
    Allows for explicit naming of individual subtest cases as well as applying
    decorators to the parametrized test.

    Args:
        arg_values (iterable): Iterable of arg values (e.g. range(10)) or
            tuples of arg values (e.g. [(1, 2), (3, 4)]).
        name (str): Optional name to use for the test.
        decorators (iterable): Iterable of decorators to apply to the generated test.
    
arg_valuesrR   
decoratorsNc                 B    || _         || _        |r|| _        y g | _        y r6   r3  )r   r4  rR   r5  s       r>   r   zsubtest.__init__3  s    $	(2*r?   NN)rg   rh   ri   r  	__slots__r   rF   r?   r>   r2  r2  %  s    
 5I;r?   r2  c                   2    e Zd ZdZddZd Zd ZddZd Zy)	parametrizeax
  
    Decorator for applying generic test parametrizations.

    The interface for this decorator is modeled after `@pytest.mark.parametrize`.
    Basic usage between this decorator and pytest's is identical. The first argument
    should be a string containing comma-separated names of parameters for the test, and
    the second argument should be an iterable returning values or tuples of values for
    the case of multiple parameters.

    Beyond this basic usage, the decorator provides some additional functionality that
    pytest does not.

    1. Parametrized tests end up as generated test functions on unittest test classes.
    Since this differs from how pytest works, this decorator takes on the additional
    responsibility of naming these test functions. The default test names consists of
    the test's base name followed by each parameter name + value (e.g. "test_bar_x_1_y_foo"),
    but custom names can be defined using `name_fn` or the `subtest` structure (see below).

    2. The decorator specially handles parameter values of type `subtest`, which allows for
    more fine-grained control over both test naming and test execution. In particular, it can
    be used to tag subtests with explicit test names or apply arbitrary decorators (see examples
    below).

    Examples::

        @parametrize("x", range(5))
        def test_foo(self, x):
            ...

        @parametrize("x,y", [(1, 'foo'), (2, 'bar'), (3, 'baz')])
        def test_bar(self, x, y):
            ...

        @parametrize("x,y", [(1, 'foo'), (2, 'bar'), (3, 'baz')],
                     name_fn=lambda x, y: '{}_{}'.format(x, y))
        def test_bar_custom_names(self, x, y):
            ...

        @parametrize("x, y", [subtest((1, 2), name='double'),
                              subtest((1, 3), name='triple', decorators=[unittest.expectedFailure]),
                              subtest((1, 4), name='quadruple')])
        def test_baz(self, x, y):
            ...

    To actually instantiate the parametrized tests, one of instantiate_parametrized_tests() or
    instantiate_device_type_tests() should be called. The former is intended for test classes
    that contain device-agnostic tests, while the latter should be used for test classes that
    contain device-specific tests. Both support arbitrary parametrizations using the decorator.

    Args:
        arg_str (str): String of arg names separate by commas (e.g. "x,y").
        arg_values (iterable): Iterable of arg values (e.g. range(10)) or
            tuples of arg values (e.g. [(1, 2), (3, 4)]).
        name_fn (Callable): Optional function that takes in parameters and returns subtest name.
    Nc                     |j                  d      D cg c]  }|dk7  s	|j                          c}| _        || _        || _        y c c}w )N,r   )r   strip	arg_namesr4  name_fn)r   arg_strr4  r?  ss        r>   r   zparametrize.__init__q  s>    8?c8J$V1aSUgQWWY$V$ %Ws
   
AAc                 ^   t        |t        j                        rt        |      S t        |t        j                        rt        |      S t        |      j                  dv r|j                  S t        |t        t        t
        f      r | dt        |      j                  dd       S | | S )zd Returns a string representation for the given arg that is suitable for use in test function names. >   OpInfo
ModuleInfort   r   )r   r7   dtype
dtype_namedevicerm   typerg   formatted_namer   floatreplace)r   idxrR   r^   s       r>   _formatted_str_reprzparametrize._formatted_str_reprv  s    eU[[)e$$u||,u:%[!!%=='''UC01V1SZ//S9:;;VC5>!r?   c                     dj                  t        | j                  |      D cg c]  \  }}| j                  |||       c}}      S c c}}w )Nrt   )rd   zipr>  rM  )r   rL  valuesavs        r>   _default_subtest_namez!parametrize._default_subtest_name  s>    xxT^^]cIdeA11#q!<effes   A

c                 p    |r|}|S | j                   r | j                   | }|S | j                  ||      }|S r6   )r?  rS  )r   rL  rP  explicit_namesubtest_names        r>   _get_subtest_namezparametrize._get_subtest_name  sM    (L
 	 \\'4<<0L   55c6BLr?   c           
   #     K   t        | j                        dk(  rd}|i d f y t               x}}t        | j                        D ]  \  }}d }g }	t        |t              r<|}
|
j                  }|
j                  }t              fd       }|
j                  }	|}n}t        | j                        dkD  rt        |      n|g}t        |      t        | j                        k7  r;t        dt        |       dt        | j                         dj                   d	      t        t        | j                  |            }| j                  |||
      }|	fd}||||f  ||u rt!         d      y w)Nr   r   c                     g S r6   rF   rt   s    r>   rI   z/parametrize._parametrize_test.<locals>.<lambda>  s    " r?   c                       | i |S r6   rF   r<   r=   r   s     r>   test_wrapperz3parametrize._parametrize_test.<locals>.test_wrapper  s    #T4V44r?      z+Expected # values == # arg names, but got: z values and z names for test "")rU  c                     |S r6   rF   )rt   r5  s     r>   r-  z3parametrize._parametrize_test.<locals>.decorator_fn  s    %%r?   zf: An empty arg_values was passed to @parametrize. Note that this may result from reuse of a generator.)lenr>  objectr   r4  r   r2  rR   r   r5  r  r  rg   rj   rO  rW  
ValueError)r   r   r   r   r   rP  check_exhausted_iteratorrL  
maybe_namer5  subr]  gen_testr  r-  s    `             r>   r   zparametrize._parametrize_test  s    t~~!#IB55
 178F-(9 HV!

fg. C ^^F!$J4[5 !5 "%J+H#H),T^^)<q)@fvhv;#dnn"55&)TUXY_U`Ta b5585H4IIZ[_[h[hZiij(l m m  $C$?@ 223j2Y	/9 &  L,GG=H@ 11 D6 *X "X Y Y 2s   E7E:r6   )	rg   rh   ri   r  r   rM  rS  rW  r   rF   r?   r>   r:  r:  9  s#    6n
"g,Yr?   r:  c                       e Zd ZdZd Zd Zy)
decorateIfa[  
    Decorator for applying parameter-specific conditional decoration.
    Composes with other test parametrizers (e.g. @modules, @ops, @parametrize, etc.).

    Examples::

        @decorateIf(unittest.skip, lambda params: params["x"] == 2)
        @parametrize("x", range(5))
        def test_foo(self, x):
            ...

        @parametrize("x,y", [(1, 'foo'), (2, 'bar'), (3, 'baz')])
        @decorateIf(
            unittest.expectedFailure,
            lambda params: params["x"] == 3 and params["y"] == "baz"
        )
        def test_bar(self, x, y):
            ...

        @decorateIf(
            unittest.expectedFailure,
            lambda params: params["op"].name == "add" and params["dtype"] == torch.float16
        )
        @ops(op_db)
        def test_op_foo(self, device, dtype, op):
            ...

        @decorateIf(
            unittest.skip,
            lambda params: params["module_info"].module_cls is torch.nn.Linear and                 params["device"] == "cpu"
        )
        @modules(module_db)
        def test_module_foo(self, device, dtype, module_info):
            ...

    Args:
        decorator: Test decorator to apply if the predicate is satisfied.
        predicate_fn (Callable): Function taking in a dict of params and returning a boolean
            indicating whether the decorator should be applied or not.
    c                      || _         || _        y r6   )r/  predicate_fn)r   r/  rk  s      r>   r   zdecorateIf.__init__  s    "(r?   c              #   |   K   | j                   | j                  fd}t              fd       }d}||i |f y w)Nc                      ||       r|gS g S r6   rF   )paramsr/  rk  s      r>   r-  z2decorateIf._parametrize_test.<locals>.decorator_fn  s    F#!{"	r?   c                       | i |S r6   rF   r\  s     r>   r]  z2decorateIf._parametrize_test.<locals>.test_wrapper  s    (((r?   r   )r/  rk  r   )r   r   r   r   r-  r]  r   s    `     r>   r   zdecorateIf._parametrize_test  sK      ,0>>HYHY 	 
t	) 
	) 	YL99s   9<N)rg   rh   ri   r  r   r   rF   r?   r>   ri  ri    s    (R):r?   ri  c                       e Zd ZdZdZdZy)ProfilingModer^  r      N)rg   rh   ri   LEGACYSIMPLE	PROFILINGrF   r?   r>   rq  rq    s    FFIr?   rq  c                  b   t         j                  j                  d      } t         j                  j                  d      }t         j                  j                  |        t         j                  j                  |       | r"|rt        j
                  S t        j                  S t        j                  S NT)r7   _C_jit_set_profiling_executor_get_graph_executor_optimizerq  ru  rt  rs  old_prof_exec_stateold_prof_mode_states     r>    cppProfilingFlagsToProfilingModer~    s|    ((>>tD((??E	HH(()<=	HH))*=> *** '''###r?   c               #   "  K   t         t        j                  k(  r>t        j                  j                  d      } t        j                  j                  d      }	 d  t         t        j                  k(  r?t        j                  j                          t        j                  j                         y y # t         t        j                  k(  r?t        j                  j                          t        j                  j                         w w xY wwrw  )GRAPH_EXECUTORrq  ru  r7   rx  ry  rz  r{  s     r>   )enable_profiling_mode_for_profiling_testsr    s     000#hhBB4H#hhCCDIG]444HH001DEHH112EF 5>]444HH001DEHH112EF 5s    ADB4 AD4ADDc               #     K   t         j                  j                  d      } t         j                  j                  d      }	 d  t         j                  j                  |        t         j                  j                  |       y # t         j                  j                  |        t         j                  j                  |       w xY wwrw  )r7   rx  ry  rz  r{  s     r>   enable_profiling_moder    s     ((>>tD((??EC,,-@A--.AB 	,,-@A--.ABs   ?CB ?CA CCc              #      K   t         j                  j                  |       }	 d  t         j                  j                  |       y # t         j                  j                  |       w xY wwr6   )r7   rx  _jit_set_num_profiled_runs)num_runsold_num_runss     r>   num_profiled_runsr  '  sF     8866x@L:++L9++L9s    A+A  A+!A((A+c                     d|v r>|d= t         t        j                  k(  r$t               5   | |i |  | |i |cd d d        S  | |i |S # 1 sw Y   xY w)Nprofile_and_replay)r  rq  ru  r  )callabler<   r=   s      r>   prof_callabler  2  sm    v%'(]444:< 1$)&)001 1 T$V$$	1 1s   AAc                  (    t        t        g| i |S r6   )r  	func_callr;   s     r>   prof_func_callr  <      4T4V44r?   c                  (    t        t        g| i |S r6   )r  	meth_callr;   s     r>   prof_meth_callr  ?  r  r?   c                      t         j                  j                  d      } | | nd}t         j                  j	                  d|      S )NTEST_REPORT_SOURCE_OVERRIDEpython-unittestztest-reports)rO   environgetr   rd   )overridetest_sources     r>   _get_test_report_pathr  E  s9     zz~~;<H&2(8IK77<<44r?   zrun_test.py__file__)add_helpallow_abbrevz--subprocess
store_truez(whether to run each test in a subprocess)actionhelpz--seedi  )rH  rH   z--accept)r  z--jit-executorz--jit_executor)rH  z--repeatr^  z--test-bailoutsz--test_bailouts--use-pytest
--save-xml?)nargsrH  constrH   z--discover-testsz--log-suffixz--run-parallel--import-slow-tests)rH  r  r  --import-disabled-tests--rerun-disabled-tests--pytest-single-test)rH  r  )rr  	   --showlocals)r  rH   z--no-showlocals
showlocalsstore_false)destr  c                 0    t        j                  |        y )Nargv)r   mainr  s    r>   run_unittest_helpr  h  s    MMtr?   z-hz--help)targetr<   legacy	profilingsimpleACCEPT	functorchc                 .   	 | j                  |      | j                          S # t        $ r: | j                  d      }||cY | j                          S | j                           t        j                  $ rv | j                  t        j                         d }	 | j                  d      }n# t        j                  $ r Y nw xY w||cY | j                          S | j                            | j                           xY w# | j                          w xY w)Ntimeout   )waitKeyboardInterruptkill
subprocessTimeoutExpiredsend_signalsignalSIGINT)pr  exit_statuss      r>   wait_for_processr    s    vvgv&< 	
;   ffQf'"0 	
- FFH$$ 	fmm$	&&&+K (( 		" 	
 FFH	 	
sR   $ C?D AC?B-,C?-C C?CC?
D #C??D Dc                     t         j                  j                          t         j                  j                          t	        | t
              rJ d       t        j                  | d||||      }t        ||      S )Nz4Command to shell should be a list or tuple of tokensT)universal_newlinescwdenvstdoutstderrr  )	sysr  flushr  r   rm   r  Popenr  )commandr  r  r  r  r  r  s          r>   shellr    sc    JJJJ '3'_)__'TsTZcijAAw//r?   c           
      X   |dk\  s
J d|        	 t        | |||||      }|dk(  s|dk(  r||fS t        d| d| d|d       t	        | ||||||dz
  d      S # t        j                  $ r; |dk(  rt        d	|d
z   d|d       d|fcY S t        d	|d
z   d| d|d       Y cw xY w)Nr   z9Expecting non negative number for number of retries, got )r  r  r  r  r  zGot exit code z, retrying (retries left=)T)filer  zCommand took ><   zmin, returning 124|   zmin, retrying (retries left=r^  )r  r  r  r  r  retries	was_rerun)r  printr  r  retry_shell)	r  r  r  r  r  r  r  r  	exit_codes	            r>   r  r    s    	1M	B7)LM
#fVW
	 >W\i''YK'@	K	
$ !	 	 $$ 
a< B/AB
 	>!W]O+GyPQR	

s   A A 1B)B)(B)c                     t        | t        j                        r| gS g }| D ]'  }t        |       |j	                  t        |             ) |S r6   )r   r   r   r  extenddiscover_test_cases_recursively)suite_or_casercelements      r>   r  r    sN    -!2!23	B  <g
		1':;< Ir?   c                     | D cg c]3  }dj                  |j                         j                  d      dd        5 c}S c c}w )Nr   )rd   r   r   )
test_casescases     r>   get_test_namesr     s5    <FGDCHHTWWY__S)"#./GGGs   8A c                      t        j                         j                  t              } t	        |       }t        |      D ]  }t        |        y r6   )r   
TestLoaderloadTestsFromModule__main__r  r  r  )suiter  rR   s      r>   _print_test_namesr    s@    !55h?E07Jz* dr?   c                 J    t        |      D cg c]
  }| |d |    c}S c c}w r6   range)lstnchunksis      r>   
chunk_listr  	  s$    %*7^4C
7
O444s    c                     | j                  t              r| t        t              dz   d  } t        j                  dd|       }t        j                  dd|      S )Nr^  z.py$r   /r   )
startswithCI_TEST_PREFIXra  rerf  )r   strip_pys     r>   sanitize_test_filenamer    sL    >*C/!345vvgr8,H66#tX&&r?   c                    d}| D ]  }|}t        |t        j                        rXt        |j                        dkD  r|j                  d   nd }|+t        |t        j                        r|xr t        |      c S |}|z|j                         j                  dd      d   j                  d      d   }t        |t              rd}t        | d|        d} |S )NTr   r   r^  z`This test class should extend from torch.testing._internal.common_utils.TestCase but it doesn't.z - failed. F)
r   r   	TestSuitera  _testslint_test_case_extensionr   r   r   r  )r  succeedtest_case_or_suite	test_case
first_test
test_classerrs          r>   r  r    s    G#  &	((*<*<=9<=O=V=V9WZ[9[+2215aeJ%*ZASAS*TO#;<N#OO"I "--c15a8>>sCAFJi2xKu56  Nr?   c                    t        | d         }t        t        z   }t        j                  j                  ||      }|rr|j                  dd      }t        j                  |d       t        j                  j                  || dt        j                  d      j                          d      }|S t        j                  |d       |S )	Nr   r  zpython-pytestT)exist_ok-   z.xml)
r  TEST_SAVE_XML
LOG_SUFFIXrO   r   rd   rK  makedirsurandomhex)r  pytesttest_filenametest_report_paths       r>   get_report_pathr  '  s    *473M$z1ww||$4mD+334EW
$t477<<(8]O1RZZXY]M^M^M`Laae:fgKK 40r?   xml_filec                    dd l mc m} |j                  |       }|j	                  d      D ]  }|j
                  j                  d      }|!t        j                  d|      }|:|j                  d      }|j                  d      j                  dd      }|j                  d|       |j                  d| d        |j                  |        y )	Nr   testcase	classnamez.^(test\.)?(?P<file>.*)\.(?P<classname>[^\.]*)$r  r   r  .py)xml.etree.ElementTreeetreeElementTreeparseiterattribr  r  searchgrouprK  r  write)r  ETtreer  full_classnameregex_resultr  r  s           r>   sanitize_pytest_xmlr'  4  s     '&88HDIIj) +!,,[9!yy!RTbc &&{3	!!&)11#s;[),VvS\*+ 	JJxr?   r  c                      G d d      } |       }dd l } |j                  | D cg c]
  }|dk7  s	| c}g dz   |g       |j                  S c c}w )Nc                       e Zd ZddZd Zy)2get_pytest_test_cases.<locals>.TestCollectorPluginNc                     g | _         y r6   )testsr   s    r>   r   z;get_pytest_test_cases.<locals>.TestCollectorPlugin.__init__J  s	    DJr?   c                     |j                   D ]@  }| j                  j                  |j                  j	                  |j
                               B y r6   )re   r,  appendconfigcwd_relative_nodeidnodeid)r   sessionitems      r>   pytest_collection_finishzKget_pytest_test_cases.<locals>.TestCollectorPlugin.pytest_collection_finishM  s<     S

!!'.."D"DT[["QRSr?   r`   N)rg   rh   ri   r   r4  rF   r?   r>   TestCollectorPluginr*  I  s    		Sr?   r6  r   z-vv)z--collect-onlyz-qq--use-main-module)plugins)r  r  r,  )r  r6  test_collector_pluginr  args        r>   get_pytest_test_casesr;  H  s]    S S 01FKK-u-0^^&' !&&& 	.s
   
AAc                    t         rt        j                  j                  t               rEt	        t               5 }t        j                  |      at         t        j                  d<   d d d        nt        j                  dt                 t        rt        j                  j                  t              rEt	        t              5 }t        j                  |      at        t        j                  d<   d d d        nt        j                  dt                t        rt                y t        j                          j#                  t$              }t'        |      st)        j*                  d       t,        r| d   gt.        rg dndg| dd  } t0        rg }t        r|j3                  d	       t         r|j3                  d
       t.        r|j3                  d       t4        r|j3                  d       t6        r|dt8        j:                  gz  }t.        rt=        |       n9t?        |      D cg c]%  }|jA                         jC                  dd      d   ' c}}g }|D ]  }t(        jD                  g| d   gz   |z   | dd  z   t.        rdgng z   |gz   }djG                  |      }	t4        rd nd}
tI        ||
t4        rdnd      \  }}|dk7  rvd|v rPt        j                  jK                  dd      }t        j                  jK                  dd      }d| d| }|dz   |	z   }	tM        d| d|	        |j3                  |       tO        |      dk(  rJ djQ                  tO        |      djG                  |                    y tR        dkD  rt?        |      }tU        tW        |      tR              }g }tY        tR              D ]L  }t(        jD                  g| z   d|dz    gz   ||   z   }|j3                  t[        j\                  |d             N d }|D ]  }|t_        |      dk7  z  } |rJ d!       y t.        r| d"gz   }t6        r.ta        d#      }tM        d$|        |j3                  d%|        tb        rtb        |dd  z   }dd l2}d&t        j                  d'<    |jf                  |(      }t6        rti               t4        st)        j*                  |d)k(  rdn|       y t)        j*                  d       y t6        gdd l5}dd*l6m7}  G d+ d,|      }ta               }d-| v xs d.| v }|rtM        d$|        t        jf                  | |jq                  ||rd/nd|0      1       y tr        dkD  rZtY        tr              D ]G  }t        jf                  d | 2      jt                  jw                         r3t)        j*                  d3       I y t        jf                  | 4       y # 1 sw Y   [xY w# 1 sw Y   xY wc c}w )5Nr   z'slow test file provided but not found: r   z+disabled test file provided but not found: r^  r   )r  z	--tb=longz--color=yesz--localsr  r  r  r  r  r   r  rb   i  )r  r  TestDistBackendWithSpawnBACKENDr   
WORLD_SIZEzBACKEND=z WORLD_SIZE=z#Test exited with non-zero exitcode z. Command to reproduce: z{} unit test(s) failed:
	{}z
	z--log-suffix=-shard-T)r  FzSome test shards have failedr7  )r  zTest results will be stored in z--junit-xml-reruns=rE   NO_COLOR)r<   r  )_XMLTestResultc                   8     e Zd ZdZ fdZ fdZd fdZ xZS )'run_tests.<locals>.XMLTestResultVerboseaZ  
            Adding verbosity to test outputs:
            by default test summary prints 'skip',
            but we want to also print the skip reason.
            GH issue: https://github.com/pytorch/pytorch/issues/69014

            This works with unittest_xml_reporting<=3.2.0,>=2.0.0
            (3.2.0 is latest at the moment)
            c                 $    t        |   |i | y r6   )superr   )r   r<   r=   	__class__s      r>   r   z0run_tests.<locals>.XMLTestResultVerbose.__init__  s     $1&1r?   c                     t         |   ||       | j                  j                  D ]7  }t	        |j
                  t              s|j
                  dk(  s.d| |_        9 y )Nskipzskip: )rE  addSkipr   __closure__r   cell_contentsrm   )r   r   reasoncrF  s       r>   rI  z/run_tests.<locals>.XMLTestResultVerbose.addSkip  sS    f-22 <A!!//37AOOv<U -36(*;	<r?   c                 Z    t         |           | j                  d| j                         y )NXPASS)rE  printErrorsprintErrorListunexpectedSuccesses)r   rF  s    r>   rP  z3run_tests.<locals>.XMLTestResultVerbose.printErrors  s$    #%##GT-E-EFr?   r5  )rg   rh   ri   r  r   rI  rP  __classcell__rF  s   @r>   XMLTestResultVerboserC    s    2<G Gr?   rU  z	--verbosez-vr   )output	verbosityresultclass)r  
testRunner)exitr  r  )<r   rO   r   existsr   r   r   slow_tests_dictr  warningswarnr   disabled_tests_dictTEST_DISCOVERr  r   r  r  r  r  r  rZ  
SHOWLOCALS
USE_PYTESTTEST_IN_SUBPROCESSr.  RERUN_DISABLED_TESTSr  r<   save_xmlr;  r  r   r   
executablerd   r  r  r  ra  r  RUN_PARALLELr  r  r  r  r  r  r  PYTEST_SINGLE_TESTr  r  r'  	xmlrunnerxmlrunner.resultrA  XMLTestRunnerREPEAT_COUNTresultwasSuccessful)r  r   r  
other_argsr  r  failed_teststest_case_full_namecmd
string_cmdr  exitcodert   backend
world_size
env_prefixtest_batches	processesr  r  failedr  pytest_argsr  r  r  rj  rA  rU  verboses                                 r>   	run_testsr~  Z  s   77>>/*o& @""&))B-0?

,-	@ @ MMCOCTUV77>>-.)* Hb&*iim#4G

01H H
 MMGH[G\]^ !55h?E#E*G
>H:zl
 !"X
 
7834n-67<77J ,6!$'4STY4Z[DTWWY__S!$Q'[ 	
 #- 	>  DG9,z9DHD-7()RA$%& 
 #J2dG%c7I]AcdeKHa1}-1DD jjnnY;G!#b!AJ#+G9L!MJ!+c!1J!>J;H:E]^h]ijk##$78|$) >+J+Q+QL!6;;|#<,> >)1	>6 
	4U;
!."<lK	|$ 	QA~~&-3GAw1O0PPS_`aSbbGZ--g$OP	Q  	/A&q)Q..F	/999z6	122.d;34D3EFG!45E4FGH,{12>K!$

:FKK[1	 01# HH)q.Qi8 HHQK		"3	G> 	G0 +,%534D3EFG4I,C,C#"a, -D -. 	/ 
	|$ 	A==e$7>>LLN	 	4 w@ @H HL \s   -W-W))*W6W&)W3linuxdarwinppc64le)x86_64i386)arm64aarch64c                      t         j                  dk7  ryt        dd      5 } | j                         }d d d        d|v S # 1 sw Y   dv S xY w)Nr  Fz/proc/cpuinfoascii)encodingvnni)r  r   r   read)fliness     r>   is_avx512_vnni_supportedr    sL    
||w	o	0 AU?U?s	   ?Ac               /   0  K   d|v r|d   durt        d      d|d<   t        j                  | i |}	 |j                          |j                   t        j                  |j                         y # t        j                  |j                         w xY ww)NdeleteFzAonly TemporaryFileName with delete=False is supported on Windows.)UserWarningtempfileNamedTemporaryFilecloserR   rO   unlinkr<   r=   r  s      r>   TemporaryFileNamer    s     
 vhu,!"eff$F8''88	GGI&&LIIaffBIIaffs   1BA2  B2!BBc               /   |   K   t        j                  | i |5 }|j                   d d d        y # 1 sw Y   y xY wwr6   )r  r  rR   r  s      r>   r  r    s8     (($9&9 	Q&&L	 	 	s   <0	<9<c              #      K   	 t        j                  |       }| t        j                  |       y # t        j                         w xY wwN)suffix)r  mkdtempshutilrmtree)r  dir_names     r>   TemporaryDirectoryNamer  #  s8     	$''v6HNMM(#FMM(#s   A4 AAAc              #   j   K   t        j                  |       5 }| d d d        y # 1 sw Y   y xY wwr  )r  TemporaryDirectory)r  ds     r>   r  r  -  s/     ((7 	1G	 	 	s   3'	303c                      t         j                  j                         } t        t         | d       }t	        |d      xr |j                         S )Nis_available)r7   rx  _get_privateuse1_backend_namer   r   r  )privateuse1_backend_nameprivateuse1_backend_modules     r>    is_privateuse1_backend_availabler  3  sB    $xxEEG!(0H$!O-~>lC]CjCjCllr?   r   numpyfairseqscipyhpunumbatransformersdilllibrosa
opt_einsumz3r   c                 D    t        |       dk7  r| j                  d      S g S )Nr   r<  )ra  r   r   s    r>   split_if_not_emptyr  P  s    q6Q;1773<.B.r?   !PYTORCH_TESTING_DEVICE_EXCEPT_FORzno dillNO_MULTIPROCESSING_SPAWN)rS   TEST_WITH_ASANPYTORCH_TEST_WITH_ASANTEST_WITH_DEV_DBG_ASANPYTORCH_TEST_WITH_DEV_DBG_ASANTEST_WITH_TSANPYTORCH_TEST_WITH_TSANTEST_WITH_UBSANPYTORCH_TEST_WITH_UBSANTEST_WITH_ROCMPYTORCH_TEST_WITH_ROCMPYTORCH_MIOPEN_SUGGEST_NHWCrD   rE   TEST_WITH_SLOWPYTORCH_TEST_WITH_SLOWTEST_SKIP_FASTPYTORCH_TEST_SKIP_FASTTEST_WITH_CROSSREFPYTORCH_TEST_WITH_CROSSREFTEST_SKIP_CUDAGRAPHPYTORCH_TEST_SKIP_CUDAGRAPHr      r   g333333@   c                     | yd| v r| j                  d      n| g} t        | D cg c]  }|j                  d       c}      }||v r	||   dk(  ryyc c}w )NFr<  :TrueT)r   rj   )allocator_configrt   optionvarmappings        r>   allocator_option_enabled_fnr    sh    69=M6M'--c2TdSe.>?sCIIcN?@GWV_6 @s   AEXPANDABLE_SEGMENTSPYTORCH_CUDA_ALLOC_CONFexpandable_segments)r  )rS   rU   NUM_PARALLEL_PROCS2i   @g333333?zRequires CUDAc                 .     t                fd       }|S )Nc                  L    t         rt        j                  d       | i | y )Nz$test doesn't currently with crossref)r  r   SkipTestr   s     r>   r   zskipIfCrossRef.<locals>.wrapper  s%    ##$JKKr?   r   r   s   ` r>   skipIfCrossRefr         
2Y   
 Nr?   c                       e Zd ZddZy)CrossRefModeNc                 "    |xs i } ||i |}|S r6   rF   )r   functypesr<   r=   rs         r>   __torch_function__zCrossRefMode.__torch_function__  s    2$!&!r?   )rF   N)rg   rh   ri   r  rF   r?   r>   r  r    s    r?   r  TEST_WITH_TORCHINDUCTORPYTORCH_TEST_WITH_INDUCTORTEST_WITH_AOT_EAGERPYTORCH_TEST_WITH_AOT_EAGERTEST_WITH_TORCHDYNAMOPYTORCH_TEST_WITH_DYNAMOc                      t         xs t        S r6   )r  r  rF   r?   r>   rI   rI     s    1H5H r?   )rS   rV   @   c                 <    t         r| S t        j                  |       S r6   r  r   expectedFailurer  s    r>   xpassIfTorchDynamor    s    (4Lh.F.Ft.LLr?   c                 <    t         rt        j                  |       S | S r6   r  r  s    r>   xfailIfTorchDynamor    s    -B8##D)LLr?   c                 @     t         t              sJ d        fd}|S )zQ
    Usage:
    @skipIfTorchDynamo(msg)
    def test_blah(self):
        ...
    z*Are you using skipIfTorchDynamo correctly?c                      t         t              st                fd       }|S t         t              sJ t        rd _         _         S )Nc                  L    t         rt        j                         | i | y r6   )r  r   r  r<   r=   r   msgs     r>   r   z5skipIfTorchDynamo.<locals>.decorator.<locals>.wrapper  s$    ("++C00''r?   T)r   rH  r   r  __unittest_skip____unittest_skip_why__r   r   r  s   ` r>   r/  z$skipIfTorchDynamo.<locals>.decorator  sR    "d#2Y( (
 N"d### #'B '*B$	r?   )r   rm   r  r/  s   ` r>   skipIfTorchDynamor    s(     c3M!MM" r?   z.test doesn't currently work with torchinductorc                       fd}|S )Nc                      t         t              st                fd       }|S t         t              sJ rd _         _         S )Nc                  D    rt        j                         | i | y r6   r   r  r<   r=   	conditionr   r  s     r>   r   z7skipIfTorchInductor.<locals>.decorator.<locals>.wrapper  $    "++C00''r?   Tr   rH  r   r  r  r   r   r  r  s   ` r>   r/  z&skipIfTorchInductor.<locals>.decorator  sR    "d#2Y( (
 N"d####'B '*B$	r?   rF   r  r  r/  s   `` r>   skipIfTorchInductorr	    s    " r?   c                       fd}|S )z@
    Decorator for running tests serially.  Requires pytest
    c                 V    t         r!rt        j                  j                  |       S | S r6   )
has_pytestr  markserialr   r  s    r>   r/  zserialTest.<locals>.decorator  s"    );;%%b))	r?   rF   )r  r/  s   ` r>   
serialTestr    s     r?   c                      d }| |S  ||       S )Nc                     d| _         | S rK   )dynamo_strictr%  s    r>   r/  z)unMarkDynamoStrictTest.<locals>.decorator"  s    !
r?   rF   )r%  r/  s     r>   unMarkDynamoStrictTestr  !  s     {~r?   c                 &    fd}| |S  ||       S )z
    Marks the test as 'strict'. In strict mode, we reset before and after the
    test, and run without suppress errors.

    Args:
    - nopython: if we should run torch._dynamo.optimize with nopython={True/False}.
    c                 ~    t        j                  |       rd| _        | _        | S | t	              fd       }|S )NTc                      t         j                  j                          t        j                  j                  dd      5   | i | d d d        t         j                  j                          y # 1 sw Y   (xY w)N$torch._dynamo.config.suppress_errorsF)r7   _dynamoresetr   mockpatchr   s     r>   r   z8markDynamoStrictTest.<locals>.decorator.<locals>.wrapper<  sZ    MM!$$%KUS $D#F#$MM!$ $s    	A00A9)r   isclassr  dynamo_strict_nopythonr   )cls_or_funcr   r   nopythons     @r>   r/  z'markDynamoStrictTest.<locals>.decorator4  sG    ??;'(,K%19K.	r	" 
	"
 r?   rF   )r   r!  r/  s    ` r>   markDynamoStrictTestr"  ,  s!      %%r?   c                 4    t        | t        xr t              S )N)r  r  )r	  r  r  r  s    r>   skipRocmIfTorchInductorr%  J  s    3.2\E\]]r?   c                       fd}|S )Nc                      t         t              st                fd       }|S t         t              sJ t        t        j
                  k(  rd _         _         S )Nc                  n    t         t        j                  k(  rt        j                         | i | y r6   )r  rq  rs  r   r  r  s     r>   r   z;skipIfLegacyJitExecutor.<locals>.decorator.<locals>.wrapperP  s/    !]%9%99"++C00''r?   T)r   rH  r   r  rq  rs  r  r  r  s   ` r>   r/  z*skipIfLegacyJitExecutor.<locals>.decoratorN  s]    "d#2Y( (
 N"d###]111#'B '*B$	r?   rF   r  s   ` r>   skipIfLegacyJitExecutorr)  M  s    $ r?   PYTORCH_TEST_WITH_TVc                 B     t        j                          fd       }|S )Nc                      t         j                  j                  j                  r)dt         j                  j
                  j                  _         | i |S rK   )r7   r  r/  dynamic_shapesfxexperimental_configtranslation_validationr   s     r>   r   zAdisable_translation_validation_if_dynamic_shapes.<locals>.wrapperm  s>    ==..CHEHH!!))@4"6""r?   r   r   s   ` r>   0disable_translation_validation_if_dynamic_shapesr2  l  s%    __R# #
 Nr?   TEST_CUDA_MEM_LEAK_CHECK PYTORCH_TEST_CUDA_MEM_LEAK_CHECKc                 Z    	 t         |    S # t        $ r t         | j                     cY S w xY wr6   )numpy_to_torch_dtype_dictKeyErrorrH  np_dtypes    r>   numpy_to_torch_dtyper:    s0    8(22 8(778s    **c                 :    	 t        |        y# t        $ r Y yw xY wNTF)r:  r7  r8  s    r>   has_corresponding_torch_dtyper=    s$    X&     	z3test doesn't currently work with nn module inliningc                       fd}|S )Nc                      t         t              st                fd       }|S t         t              sJ rd _         _         S )Nc                  D    rt        j                         | i | y r6   r  r  s     r>   r   z9skipIfNNModuleInlined.<locals>.decorator.<locals>.wrapper  r  r?   Tr  r  s   ` r>   r/  z(skipIfNNModuleInlined.<locals>.decorator  sR    "d#2Y( ( N"d####'B '*B$	r?   rF   r  s   `` r>   skipIfNNModuleInlinedrB    s    & r?   z-test doesn't currently work on the ROCm stackr$  c                &    fd}| r ||       S |S )Nc                 >     d t                fd       }|S )NzskipIfRocm: c                  J    t         rt        j                         | i |S r6   r  r   r  r<   r=   r   rL  s     r>   r   z+skipIfRocm.<locals>.dec_fn.<locals>.wrapper  s'    ''//4*6**r?   r  r   r   rL  r  s   ` @r>   dec_fnzskipIfRocm.<locals>.dec_fn  s,    u%	r	+ 
	+
 r?   rF   r  r  rI  s    ` r>   
skipIfRocmrK        	 d|Mr?   c                 .     t                fd       }|S )Nc                  L    t         r	 | i | y t        j                  d      )Nz+test currently only works on the ROCm stackrF  r   s     r>   r   zrunOnRocm.<locals>.wrapper  s%    ##$QRRr?   r  r   s   ` r>   	runOnRocmrO    s"    
2YS S
 Nr?   arch.c                       fd}|S )Nc                 2     t                fd       }|S )Nc                     t         rYt        j                  j                  d      }|j                  j                  d      d   vrd }t        j                  |       | g|i |S )Nr   r  zskipIfRocm: test only runs on )r  r7   r   get_device_propertiesgcnArchNamer   r   r  )r   r<   r=   proprL  rP  r   s        r>   wrap_fnz.runOnRocmArch.<locals>.dec_fn.<locals>.wrap_fn  sj    zz77:##))#.q1==dVDF"++F33d,T,V,,r?   r  )r   rW  rP  s   ` r>   rI  zrunOnRocmArch.<locals>.dec_fn  s     	r	- 
	- r?   rF   )rP  rI  s   ` r>   runOnRocmArchrX    s    	 Mr?   z,test doesn't currently work on the XPU stackc                &    fd}| r ||       S |S )Nc                 >     d t                fd       }|S )NzskipIfXpu: c                  J    t         rt        j                         | i |S r6   )TEST_XPUr   r  rG  s     r>   r   z*skipIfXpu.<locals>.dec_fn.<locals>.wrapper  s'    ''//4*6**r?   r  rH  s   ` @r>   rI  zskipIfXpu.<locals>.dec_fn  s,    se$	r	+ 
	+
 r?   rF   rJ  s    ` r>   	skipIfXpur]    rL  r?   c                 .     t                fd       }|S )Nc                  L    t         rt        j                  d       | i | y )Nz$test doesn't currently work with MPS)TEST_MPSr   r  r   s     r>   r   zskipIfMps.<locals>.wrapper  %    ##$JKKr?   r  r   s   ` r>   	skipIfMpsrb    r  r?   c                 .     t                fd       }|S )Nc                  L    t         rt        j                  d       | i | y )Nz$test doesn't currently work with HPU)TEST_HPUr   r  r   s     r>   r   zskipIfHpu.<locals>.wrapper  ra  r?   r  r   s   ` r>   	skipIfHpurf    r  r?   c                       fd}|S )Nc                 2     t                fd       }|S )Nc                 8   t         rt        t        j                  j                        }|j                  d      d   }t        d |j                  d      D              }||t              k  rd| d d}t        j                  |       | g|i |S )Nr
  r   c              3   2   K   | ]  }t        |        y wr6   r   r   r   s     r>   r   zMskipIfRocmVersionLessThan.<locals>.dec_fn.<locals>.wrap_fn.<locals>.<genexpr>  s     *Sa3q6*S   r   zROCm z is available but z	 required)	r  rm   r7   versionhipr   r'  r   r  )r   r<   r=   rocm_versionrocm_version_tuplerL  r   rm  s         r>   rW  z:skipIfRocmVersionLessThan.<locals>.dec_fn.<locals>.wrap_fn  s    "5==#4#45+11#6q9%**S<;M;Mc;R*S%S"%-DVY^_fYgDg$%7$88J7)S\]F"++F33d,T,V,,r?   r  )r   rW  rm  s   ` r>   rI  z)skipIfRocmVersionLessThan.<locals>.dec_fn  s     	r	- 
	- r?   rF   )rm  rI  s   ` r>   skipIfRocmVersionLessThanrq    s     Mr?   c                 .     t                fd       }|S )Nc                  L    t         st        j                  d       | i | y )Nz:test doesn't currently work without MIOpen NHWC activation)TEST_WITH_MIOPEN_SUGGEST_NHWCr   r  r   s     r>   r   z+skipIfNotMiopenSuggestNHWC.<locals>.wrapper%  s%    ,##$`aar?   r  r   s   ` r>   skipIfNotMiopenSuggestNHWCru  $  r  r?   z0test doesn't currently work on the Windows stackc                &    fd}| r ||       S |S )Nc                 >     d t                fd       }|S )NzskipIfWindows: c                  J    t         rt        j                         | i |S r6   )
IS_WINDOWSr   r  rG  s     r>   r   z.skipIfWindows.<locals>.dec_fn.<locals>.wrapper1  s'    ''//4*6**r?   r  rH  s   ` @r>   rI  zskipIfWindows.<locals>.dec_fn.  s,    "3%(	r	+ 
	+
 r?   rF   rJ  s    ` r>   skipIfWindowsrz  -  rL  r?   c                 .     t                fd       }|S )Nc                     t         j                  j                  j                         }	  | i | t         j                  j                  j                  |       y # t         j                  j                  j                  |       w xY wr6   )r7   backendsr   preferred_linalg_libraryr<   r=   _preferred_backendr   s      r>   _fnz.setLinalgBackendsToDefaultFinally.<locals>._fn?  sb    "^^00IIK	MNN889KLENN889KL   A +Br  r   r  s   ` r>   !setLinalgBackendsToDefaultFinallyr  >  s"    
2YM M Jr?   c                 .     t                fd       }|S )Nc                     t         j                  j                  j                         }	  | i | t         j                  j                  j                  |       y # t         j                  j                  j                  |       w xY wr6   )r7   r}  r   preferred_blas_libraryr  s      r>   r  z,setBlasBackendsToDefaultFinally.<locals>._fnL  sb    "^^00GGI	KNN667IJENN667IJr  r  r  s   ` r>   setBlasBackendsToDefaultFinallyr  K  s"    
2YK K Jr?   c                   &    e Zd ZddddZd Zd Zy)DeterministicGuardFT)	warn_onlyfill_uninitialized_memoryc                .    || _         || _        || _        y r6   )deterministicr  r  )r   r  r  r  s       r>   r   zDeterministicGuard.__init__Y  s    *")B&r?   c                 b   t        j                         | _        t        j                         | _        t         j
                  j                  j                  | _        t        j                  | j                  | j                         | j                  t         j
                  j                  _        y Nr  )r7   $are_deterministic_algorithms_enableddeterministic_restore-is_deterministic_algorithms_warn_only_enabledwarn_only_restoreutilsr  r  !fill_uninitialized_memory_restoreuse_deterministic_algorithmsr  r   s    r>   	__enter__zDeterministicGuard.__enter__^  su    %*%O%O%Q"!&!T!T!V161J1J1d1d.**nn	& ?C>\>\!!;r?   c                     t        j                  | j                  | j                         | j                  t         j
                  j                  _        y r  )r7   r  r  r  r  r  r  r  r   exception_typeexception_value	tracebacks       r>   __exit__zDeterministicGuard.__exit__g  s=    **&&,,	. ?C>d>d!!;r?   Nrg   rh   ri   r   r  r  rF   r?   r>   r  r  X  s    38TX C
]er?   r  c                       e Zd Zd Zd Zd Zy)AlwaysWarnTypedStorageRemovalc                 6    t        |t              sJ || _        y r6   )r   rr   always_warn)r   r  s     r>   r   z&AlwaysWarnTypedStorageRemoval.__init__n  s    +t,,,&r?   c                     t         j                  j                         | _        t         j                  j	                  | j
                         y r6   )r7   storage&_get_always_warn_typed_storage_removalalways_warn_restore&_set_always_warn_typed_storage_removalr  r   s    r>   r  z'AlwaysWarnTypedStorageRemoval.__enter__r  s/    #(==#W#W#Y <<T=M=MNr?   c                 V    t         j                  j                  | j                         y r6   )r7   r  r  r  r  s       r>   r  z&AlwaysWarnTypedStorageRemoval.__exit__v  s    <<T=U=UVr?   Nr  rF   r?   r>   r  r  m  s    'OWr?   r  c                       e Zd Zd Zd Zd Zy)CudaSyncGuardc                     || _         y r6   )mode)r   sync_debug_modes     r>   r   zCudaSyncGuard.__init__~  s	    #	r?   c                     t         j                  j                         | _        t         j                  j	                  | j
                         y r6   )r7   r   get_sync_debug_modedebug_mode_restoreset_sync_debug_moder  r   s    r>   r  zCudaSyncGuard.__enter__  s-    "'**"@"@"B

&&tyy1r?   c                 V    t         j                  j                  | j                         y r6   )r7   r   r  r  r  s       r>   r  zCudaSyncGuard.__exit__  s    

&&t'>'>?r?   Nr  rF   r?   r>   r  r  }  s    $2@r?   r  c                       e Zd Zd Zd Zd Zy)SwapTensorsGuardc                     || _         y r6   )use_swap_tensors)r   r  s     r>   r   zSwapTensorsGuard.__init__  s
     0r?   c                     t         j                  j                         | _        | j                  *t         j                  j                  | j                         y y r6   )r7   
__future__$get_swap_module_params_on_conversionswap_tensors_restorer  $set_swap_module_params_on_conversionr   s    r>   r  zSwapTensorsGuard.__enter__  sD    $)$4$4$Y$Y$[!  ,AA$BWBWX -r?   c                 V    t         j                  j                  | j                         y r6   )r7   r  r  r  r  s       r>   r  zSwapTensorsGuard.__exit__  s    ==d>W>WXr?   Nr  rF   r?   r>   r  r    s    1Y
Yr?   r  c                 .     t                fd       }|S )Nc                      t        t        j                         t        j                               5   G d d      } |       5   | i | d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr  c                       e Zd ZdZd Zd Zy)HwrapDeterministicFlagAPITest.<locals>.wrapper.<locals>.CuBLASConfigGuardCUBLAS_WORKSPACE_CONFIGc                    t         j                  j                  d uxrE t         j                  j                  j                  d      D cg c]  }t	        |       c}ddgk\  | _        | j
                  rLt        j                  j                  | j                        | _
        dt        j                  | j                  <   y y c c}w )Nr   
   r   z:4096:8)r7   rm  r   r   r   is_cuda10_2_or_higherrO   r  r  cublas_var_namecublas_config_restore)r   r   s     r>   r  zRwrapDeterministicFlagAPITest.<locals>.wrapper.<locals>.CuBLASConfigGuard.__enter__  s    ++47 Y.3mm.@.@.F.Fs.KLc!fLQSUVPWW . 1157ZZ^^DDXDX5Y2;D

4#7#78 2 Ms   
Cc                    | j                   r|t        j                  j                  | j                        }| j
                  |t        j                  | j                  = y y | j
                  t        j                  | j                  <   y y r6   )r  rO   r  r  r  r  )r   r  r  r  cur_cublas_configs        r>   r  zQwrapDeterministicFlagAPITest.<locals>.wrapper.<locals>.CuBLASConfigGuard.__exit__  sp    11,.JJNN4;O;O,P)55=0<$&JJt/C/C$D  = @D?Y?YBJJt';';< 2r?   N)rg   rh   ri   r  r  r  rF   r?   r>   CuBLASConfigGuardr    s    ";EZr?   r  )r  r7   r  r  )r<   r=   r  r   s      r>   r   z-wrapDeterministicFlagAPITest.<locals>.wrapper  st    ::<MMOQ 	$Z Z& #$ $D#F#$-	$ 	$,$ $-	$ 	$s#   A+	AA+A(	$A++A4r  r   s   ` r>   wrapDeterministicFlagAPITestr    s     
2Y$ $2 Nr?   c                       fd}|S )Nc                 2     t                fd       }|S )Nc                  V    t              5   | i | d d d        y # 1 sw Y   y xY wr6   )r  )r<   r=   r   swaps     r>   r   z4wrapSwapTensorsTest.<locals>.dec_fn.<locals>.wrapper  s-    !$' $D#F#$ $ $s   	(r  )r   r   r  s   ` r>   rI  z#wrapSwapTensorsTest.<locals>.dec_fn  s     	r	$ 
	$ r?   rF   )r  rI  s   ` r>   wrapSwapTensorsTestr    s     Mr?   c                   $     e Zd Z fdZd Z xZS )r  c                 0    t         |           || _        y r6   )rE  r   swap_values)r   r  rF  s     r>   r   zswap.__init__  s    &r?   c              #   d   K   | j                   D ]  } t        |      |      d| i d f  y w)Nswap_c                     g S r6   rF   rZ  s    r>   rI   z(swap._parametrize_test.<locals>.<lambda>  s    QS r?   )r  r  )r   r   r   r   r  s        r>   r   zswap._parametrize_test  s?     $$ 	TD+%d+D1U4&>2|SS	Ts   .0)rg   rh   ri   r   r   rS  rT  s   @r>   r  r    s    'Tr?   r  c                      t         r+	 t        j                  t        j                  ddg             t                fd       }|S # t
        $ r dY #w xY w)Nr   Fc                  D    st        j                  d       | i | y )Nz*PyTorch was compiled without numpy supportr  )r<   r=   r   numpy_supports     r>   r   z+skipIfCompiledWithoutNumpy.<locals>.wrapper  s%    ##$PQQr?   )
TEST_NUMPYr7   
from_numpynparrayr  r   )r   r   r  s   ` @r>   skipIfCompiledWithoutNumpyr    sd     M	" RXXq!f-. 2Y   
 N  	"!M	"s   *A AAc                       fd}|S )Nc                      |       S r6   rF   )r   rG  r   s    r>   run_test_functionz)_test_function.<locals>.run_test_function  s    $r?   rF   )r   rG  r  s   `` r>   _test_functionr    s     r?   c                 .     t                fd       }|S )Nc                      t         j                  j                  j                  st	        j
                  d       | i | y )NzIXNNPACK must be enabled for these tests. Please build with USE_XNNPACK=1.)r7   r}  xnnpackrW   r   r  r   s     r>   r   z skipIfNoXNNPACK.<locals>.wrapper  s5    ~~%%--##$oppr?   r  r   s   ` r>   skipIfNoXNNPACKr    r  r?   c                 .     t                fd       }|S )Nc                  t    t         j                  j                  st        j                  d       | i | y )NzPyTorch compiled without Lapack)r7   rx  
has_lapackr   r  r   s     r>   r   zskipIfNoLapack.<locals>.wrapper  s/    xx""##$EFFr?   r  r   s   ` r>   skipIfNoLapackr  
  r  r?   c                 ,    t        j                  d      S )aH  Wraps the decorator to hide the import of the `core`.

    Args:
        op_name: Check if this op is registered in `core._REGISTERED_OPERATORS`.
        message: message to fail with.

    Usage:
        @skipIfNotRegistered('MyOp', 'MyOp is not linked!')
            This will check if 'MyOp' is in the caffe2.python.core
    z"Pytorch is compiled without Caffe2)r   rH  )op_namemessages     r>   skipIfNotRegisteredr    s     ===>>r?   c                 .     t                fd       }|S )Nc                  L    t         st        j                  d       | i | y )Nz'test require SciPy, but SciPy not found)
TEST_SCIPYr   r  r   s     r>   r   zskipIfNoSciPy.<locals>.wrapper!  s%    ##$MNNr?   r  r   s   ` r>   skipIfNoSciPyr     r  r?   c                 .     t                fd       }|S )Nc                  b    dt         j                  v rt        j                  d       | i |S )NPYTEST_CURRENT_TESTzdoes not work under pytest)rO   r  r   r  r   s     r>   wrappedzskip_if_pytest.<locals>.wrapped*  s1     BJJ.##$@AA4"6""r?   r  )r   r  s   ` r>   skip_if_pytestr  )  s     
2Y# #
 Nr?   c                 L     t                fd       }d|j                  d<   |S )Nc                  L    t         st        j                  d       | i | y )N<test is slow; run with PYTORCH_TEST_WITH_SLOW to enable test)r  r   r  r   s     r>   r   zslowTest.<locals>.wrapper4  s%    ##$bccr?   T	slow_test)r   __dict__r   s   ` r>   slowTestr  3  s0    
2Y   
 %)G[!Nr?   c                     | rt         S d S )Nc                     | S r6   rF   )r   s    r>   rI   zslowTestIf.<locals>.<lambda>?  s     r?   )r  )r  s    r>   
slowTestIfr  >  s     83m3r?   c                       fd}|S )Nc                 2    t        | dd      r | _        | S )N_do_cuda_memory_leak_checkT)r   r  r  s    r>   decz&skipCUDAMemoryLeakCheckIf.<locals>.decC  s    23T:09MB)	r?   rF   r  r  s   ` r>   skipCUDAMemoryLeakCheckIfr  B       Jr?   c                       fd}|S )Nc                 2    t        | dd      r | _        | S )N_do_cuda_non_default_streamT)r   r  r  s    r>   r  z'skipCUDANonDefaultStreamIf.<locals>.decJ  s    24d;1:]B*	r?   rF   r  s   ` r>   skipCUDANonDefaultStreamIfr  I  r  r?   c                 .     t                fd       }|S )Nc                      t        j                         5  t        j                  d        | i | d d d        y # 1 sw Y   y xY w)Nignore)r^  catch_warningssimplefilterr   s     r>   r   z"suppress_warnings.<locals>.wrapperQ  s?    $$& 	 !!(+	  	  	 s	   =Ar  r   s   ` r>   suppress_warningsr  P  s     
2Y    Nr?   c                    i t        | t        j                        r| j                  sJ j	                  | j
                  | j
                        }t        j                         5  | j                         j                  |d      }| j                  |_	        d d d        |S t        j                  |       r<| j                         j                  | j                               j                  |       S t        | t              r| D cg c]  }t!        |       c}S t        | t"              rt#        fd| D              S t%        |       S # 1 sw Y   S xY wc c}w )Nr   rE  rG  c              3   6   K   | ]  }t        |        y wr6   )to_gpu)r   otype_maps     r>   r   zto_gpu.<locals>.<genexpr>h  s     6QVAx(6s   )r   r7   r   is_leafr  rE  no_gradclonetorequires_grad
is_storagenewresize_sizecopy_r  r  r'  r   )objr  tresr  s    `   r>   r  r  Y  s   #u||${{{LLCII.]]_ 	2))+..q.8C # 1 1C	2 
			#	wwy  ,22377	C	-01q(#11	C	6#666}	2 
 2s   (3E
EEc                 @    t        j                  |       j                  S r6   )r   getfullargspecr<   r  s    r>   get_function_arglistr(  m  s    !!$',,,r?   c                     t        j                  |        t        j                  |        t        r t
        j                  j                  |        y y r6   )r7   manual_seedrandomr   r  r  )r   s    r>   r   r   q  s4    	d
KK
		t r?   c              #      K   t        j                         }t        j                  |        	 d  t        j                  |       y # t        j                  |       w xY wwr6   )r7   get_default_dtypeset_default_dtype)rE  saved_dtypes     r>   r.  r.  x  sF     ))+K	E"-,,   *A!A A!AA!c              #      K   t        j                  g       j                         }t        j                  |        	 d  t        j                  |       y # t        j                  |       w xY wwr6   )r7   tensorrH  set_default_tensor_type)tensor_typesaved_tensor_types     r>   r3  r3    sR     R(--/	!!+.9%%&78%%&78s   9A0A  A0A--A0c                     | j                         dk(  rt        d      S | j                         dk(  rt        | j                  d            S t        d | j                         D         S )Nr   r^  c              3   2   K   | ]  }t        |        y wr6   r  )r   rA  s     r>   r   ziter_indices.<locals>.<genexpr>  s     5!U1X5rl  )dimr  r!  r   )r2  s    r>   iter_indicesr9    sQ    zz|qQxzz|qV[[^$$5v{{}566r?   c                 :    	 t        |        y# t        $ r Y yw xY wr<  )r  	TypeError)r#  s    r>   is_iterabler<    s#    S	 r>  c                     t        | t        j                        ry	 t        |       dk(  r|S t	        |       D ]  }t        |t        j                        r y 	 y# t
        $ r
}Y d}~yd}~ww xY w)z Returns True if iterable is an iterable of tensors and False o.w.

        If the iterable is empty, the return value is :attr:`include_empty`
    Fr   NT)r   r7   r   ra  r  r;  )iterableinclude_emptyr$  tes       r>   is_iterable_of_tensorsrA    sj     (ELL)	x=A  h 	Aa.	   s"   A (A A A 	A.)A.c                       e Zd Zd Zd Zy)CudaNonDefaultStreamc                 N   t         j                  j                         }g | _        t	        t         j                  j                               D ]  }| j                  j                  t         j                  j                  |             t         j                  j                  |      }| j                  d   j                          t         j                  j                  |j                  |j                  |j                          t         j                  j                  |       y )NrG  r[  	stream_iddevice_indexdevice_type)r7   r   current_devicebeforeStreamsr  device_countr.  current_streamStreamsynchronizerx  _cuda_setStreamrG  rH  rI  _cuda_setDevice)r   beforeDevicer  deviceStreams       r>   r  zCudaNonDefaultStream.__enter__  s     zz002uzz..01 	KA%%ejj&?&?&BC ::,,A,6Lr"..0HH$$|/E/E2>2K2K1=1I1I % K		K 	  .r?   c                    t         j                  j                         }t        t         j                  j	                               D ]i  }t         j
                  j                  | j                  |   j                  | j                  |   j                  | j                  |   j                         k t         j
                  j                  |       y )NrF  )r7   r   rJ  r  rL  rx  rP  rK  rG  rH  rI  rQ  )r   	exec_type
exec_valuer  rR  r  s         r>   r  zCudaNonDefaultStream.__exit__  s     zz002uzz..01 	TAHH$$t/A/A!/D/N/N262D2DQ2G2T2T151C1CA1F1R1R % T	T 	  .r?   Nrg   rh   ri   r  r  rF   r?   r>   rC  rC    s    //r?   rC  c                        e Zd ZddZd Zd Zy)CudaMemoryLeakCheckNc                 ^    ||j                         n|| _        || _        ddlm}  |        y )Nr   )initialize_cuda_context_rng)r   rR   r  #torch.testing._internal.common_cudar[  )r   r  rR   r[  s       r>   r   zCudaMemoryLeakCheck.__init__  s(    %)\HKKMt	  	T#%r?   c                 |   g | _         g | _        t        j                  j	                         }t        |      D ]x  }t        j                  j                  |      }|dkD  s(t        j                          t        j                  j                          t        j                  j                           n t        |      D ]|  }| j                   j                  t        j                  j                  |             t        j                  j                  |      \  }}||z
  }| j                  j                  |       ~ y Nr   )caching_allocator_beforesdriver_beforesr7   r   rL  r  memory_allocatedr   r   rx  _cuda_clearCublasWorkspacesr   r.  mem_get_info)r   num_devicesr  caching_allocator_mem_allocated
bytes_freebytes_totaldriver_mem_allocateds          r>   r  zCudaMemoryLeakCheck.__enter__  s    )+&  jj--/{# 	A.3jj.I.I!.L+ /2

446

&&(	 {# 	=A**11%**2M2Ma2PQ&+jj&=&=a&@#J#.#; &&';<		=r?   c                    |y d}t         j                  j                         }t        |      D ]U  }t         j                  j                          t         j                  j                  |      }|| j                  |   kD  sSd} n |sy t        j                          t         j                  j                          t        |      D ].  }d}t        d      D ]}  }t         j                  j                  |      }t         j                  j                  |      \  }	}
|
|	z
  }d}d}|| j                  |   kD  rd}|| j                  |   kD  rd}|rx|r{d} n |srQsOd| j                   d| j                  |    d d| d| j                  |    d	 d
}t        j                  |       |ssd| j                   d| j                  |    d d| d| j                  |    d	 d
}t!        |       y )NFTrr  zOCUDA caching allocator reports a memory leak not verified by the driver API in z)! Caching allocator allocated memory was z and is now reported as z on device z#. CUDA driver allocated memory was z and is now r   z$CUDA driver API confirmed a leak in )r7   r   rL  r  rx  rb  ra  r_  r   r   r   rc  r`  rR   r^  r_  r  )r   rU  rV  r  discrepancy_detectedrd  r  re  nrf  rg  rh  caching_allocator_discrepancydriver_discrepancyr  s                  r>   r  zCudaMemoryLeakCheck.__exit__  sS    
  %jj--/{# 	AHH002.3jj.I.I!.L+.1O1OPQ1RR'+$	 $ 	



 {# 1	(A#'  1X 27**2M2Ma2P/*/***A*A!*D'
K'2Z'?$05-%*"2T5S5STU5VV481'$*=*=a*@@)-&59K+0(#& (,5G88<		{ CAAEA_A_`aAb@c d11P0Q R$$%3 ';;?;N;Nq;Q:RR^_s^ttuw c".3E >dii[ IAAEA_A_`aAb@c d11P0Q R$$%3 ';;?;N;Nq;Q:RR^_s^ttu	w #3''c1	(r?   r6   r  rF   r?   r>   rY  rY    s    &=.S(r?   rY  c              #   b   K   	 d  y # | $ r}t        j                  d|       |d }~ww xY ww)Nznot implemented: r  )exc_typees     r>   skip_exception_typerq  F	  s;     @ @"3A3 78a?@s   /	 /,',/c              #   n  K   	 d  y # t         j                  $ r  t        $ r}d}t        |dd       }|d|j                   }dj                  t        d |g|             }d| d}t        |j                        dk\  r*|j                  d    d	| g|j                  dd  |_         d }~ww xY ww)
Nr   _tracked_inputz"PYTORCH_OPINFO_SAMPLE_INPUT_INDEX=rb   zE
To execute this test, run the following from the base repo dir:
    zL

This message can be suppressed by setting PYTORCH_PRINT_REPRO_ON_FAILURE=0r^  r   
)	r   r  r   r   r   rd   filterra  r<   )repro_partsrp  sample_isolation_prefixr   	repro_str	repro_msgs         r>   print_repro_on_failurerz  M	  s       "$#3T:$(J=K^K^J_&`#HHVD+B*Q[*QRS	K KN	 qvv;!2i[1?AFF12J?AF%s%   B5	 B5B2BB--B22B5c                      d|v r.t         j                  j                  dk\  r|j                  d       t        j                  | i |S )Nmin_satisfying_examples)rr  8   r   )
hypothesisrm  __version_info__popsettingsr;   s     r>   r  r  l	  sA    $.:3E3E3V3VZd3dJJ01""D3F33r?   
pytorch_ci2   )derandomizesuppress_health_checkdatabasemax_examplesrW  devr  )r  r  r  rW  debugi  PYTORCH_HYPOTHESIS_PROFILEzEFail to import hypothesis in common_utils, tests are not derandomizedr   c                    ddl m}  |       D cg c]  }|j                   }}t               D cg c]  }t	        |      t        d      d   }}| j                  d      }t        |      dkD  rD|d   |v r=t        |      dkD  r|d   |v rdj                  |dd       S dj                  |dd       S | S c c}w c c}w )Nr   )get_device_type_test_basesztorch.rt   r[  r^  r  )*torch.testing._internal.common_device_typer  rI  r0   rm   ra  r   rd   )r   r  r   device_suffixesdtdtype_suffixestest_name_chunkss          r>    remove_device_and_dtype_suffixesr  	  s    U.H.JKq}}KOK8F8HI"c"gc(mn-INI s+
q %5b%9^%K 1$)9")=)P88,Qr233xx(2.// LIs
   B6B;r   c                 :   	
 t         j                        j                  d      d   j                  d      d   	t         j                        dt         f	 fd
t        
fdt        j                         D              r>dt          j                        j                  d	<   t        st        j                  d
      t        sld}d}t        j                         D ]  \  }\  }} 
|      st         t         t"        t"        t$        t&        t(        t*        t,        t.        t        dt1        t3        fd|            }t5        |      dkD  rddj7                  |      }dj7                  j                               }t9        d| dd| d| ddd|        t1        t3        fd|            }|g k(  st        fd|D              sd}d| d|g k(  rdnd ddj7                  |       d} n |rt:        st        j                  |      |st:        rd}t        j                  |      t<        r]t?          j                        rFt          j                        j                  jA                  d	d      st        j                  d       y y y )!NrM   r^  r   r[  r  c                     | j                         }t        |      dk  ry|d   }|d   dd j                  d      d   }j                  |      xr |j                  fv S )Nr   Fr   r^  r[  r   )r   ra  r  _testMethodName)r  target_test_partstarget_testnametarget_classnamer  sanitized_testnamer   s       r>   matches_testz%check_if_enable.<locals>.matches_test	  sv    "LLN !A%+A.,Q/"5;;C@D ##$45y?tOcOcewNx;xyr?   c              3   .   K   | ]  } |        y wr6   rF   )r   r   r  s     r>   r   z"check_if_enable.<locals>.<genexpr>	  s     
;q<?
;   Tr  r  Fr   )macmacoswinwindowsr  rocmr   asandynamoinductorslowc                     | vS r6   rF   r  platform_to_conditionals    r>   rI   z!check_if_enable.<locals>.<lambda>	  s    !CZ:Z r?   r   , zTest z# is disabled for some unrecognized zplatforms: [z]. Please edit issue z to fix the platforms zLassigned to this flaky test, changing "Platforms: ..." to a comma separated zDsubset of the following (or leave it blank to match all platforms): c                     | v S r6   rF   r  s    r>   rI   z!check_if_enable.<locals>.<lambda>	  s    a;R6R r?   c              3   (   K   | ]	  }|     y wr6   rF   )r   r   r  s     r>   r   z"check_if_enable.<locals>.<genexpr>	  s     )fPX*A(*K)fs   z7Test is disabled because an issue exists disabling it:  for allzplatform(s) z. If you're seeing this on your local machine and would like to enable this test, please make sure CI is not set and you are not using the flag --import-disabled-tests.zcTest is enabled but --rerun-disabled-tests verification mode is set, so only disabled tests are runz8test is fast; we disabled it with PYTORCH_TEST_SKIP_FAST)!rm   rF  r   r  r  anyr]  r  r   r  r  r   r  ru   r`  re   IS_MACOSry  IS_LINUXr  r\  r  r  r  r  ru  ra  rd   r  re  r  r   r  )r   should_skipskip_msgdisabled_test	issue_url	platformsinvalid_platformsinvalid_plats_strvalid_platsr  r  r  r  s   `        @@@@r>   check_if_enabler  	  s   DNN#))#.q177<R@I9$:N:NO
zS 
z 
;O$8$8$:
;;DHd**+44[A##$bcc5H5N5N5P #	1M1IyM*#%%)%*#*3 7*1' %)0Z\e)f$g!()A-(,		2C(D%"&)),C,H,H,J"KKE-0ST():(;;PQZP[[qrh`al`mnp !%V,RT]%^ _I?c)f\e)f&f"&K!XYbXcbbAdiiXaNbMc dq qH G#	J 3##H--3*H##H--4--.wtTEYEY7Z7c7c7g7ghsuz7{##$^__ 8|. r?   c                   N     e Zd ZdZ edd      j
                  Zd Z fdZ xZ	S )RelaxedBooleanPairzPair for boolean-like inputs.

    In contrast to the builtin :class:`BooleanPair`, this class also supports one input being a number or a single
    element tensor-like.
    r   c                t   t         j                  t        j                  f}g | j                  | j
                  |}t        || j                        rt        ||      s2t        || j                        rt        ||      s| j                          ||fD cg c]  }| j                  ||       c}S c c}w Nr   )	r7   r   r  ndarray_supported_types_supported_number_typesr   _inputs_not_supported_to_boolr   actualexpectedr   tensor_or_array_typesother_supported_typesinputs          r>   _process_inputsz"RelaxedBooleanPair._process_inputs	  s     49<<2L o$"7"7 o$:V:V oYn o 5 56:hPe;f8T%:%:;
6Sh@i&&(:@(9KLe+LLLs   B5c                   t        |t        j                        rt        |j	                               S t        |      | j                  v rt        |      S t        |t        j                  t        j                  f      rpt        |t        j                        r|j                         n|j                  }|dkD  r| j                  t        d| d|       t        |j	                               S t        | =  ||      S )Nr^  zHOnly single element tensor-likes can be compared against a boolean. Got  elements instead.r  )r   r  numberrr   r3  rH  r  r7   r   r  numelr!  _failrc  rE  r  )r   	bool_liker   r  rF  s       r>   r  zRelaxedBooleanPair._to_bool

  s    i+	()))_ < <<	?"	ELL"**#=>)3Iu||)LIOO%R[R`R`Eqy

 '!35	   	())7#I"#55r?   )
rg   rh   ri   r  r,   r  r  r  r  rS  rT  s   @r>   r  r  	  s-    
 )A.??M6 6r?   r  c                        e Zd ZdZeej                  eej                  e	ej                  iZdddd	 d fdZd Z fdZ xZS )	RelaxedNumberPaira#  Pair for number-like inputs.

    In contrast to the builtin :class:`NumberPair`, this class also supports one input being a single element
    tensor-like or a :class:`enum.Enum`. (D)Type checks are disabled, meaning comparing 1 to 1.0 succeeds even when
    ``check_dtype=True`` is passed.

    In addition, this class uses looser default tolerances for :class:`float` and :class:`complex` inputs. Also
    supports overriding the absolute and relative tolerance through the ``@precisionOverride`` and
    ``@toleranceOverride`` decorators.
            N)rtol_overrideatol_overridecheck_dtypec                    t        |   ||fddi| t        | j                  |      | _        t        | j                  |      | _        y )Nr  FrE  r   maxrtolatol)r   r  r  r  r  r  other_parametersrF  s          r>   r   zRelaxedNumberPair.__init__/
  sC     	QuQ@PQ		=1			=1	r?   c                \   t         j                  t        j                  f}g | j                  |}t        || j                        rt        ||      s2t        || j                        rt        ||      s| j                          ||fD cg c]  }| j                  ||       c}S c c}w r  )r7   r   r  r  r  r   r  
_to_numberr  s          r>   r  z!RelaxedNumberPair._process_inputs6
  s     49<<2L P$"7"7 P:O PFD$9$9:z(Ti?jx)>)>?JvWlDm&&(<BH;MN%"-NNNs   B)c                   t        |t        j                  t        j                  f      rt        |t        j                        r|j                         n|j                  }|dkD  r| j                  t        d| d|       |j                         }t        |t              rt        |      }|S t        |t              rt        |      S t        | 9  ||      S )Nr^  zGOnly single element tensor-likes can be compared against a number. Got r  r  )r   r7   r   r  r  r  r!  r  rc  r3  rr   r   r	   rE  r  )r   number_liker   r  r  rF  s        r>   r  zRelaxedNumberPair._to_numberC
  s    kELL"**#=>+5k5<<+PK%%'VaVfVfEqy

 '!35	   !%%'F&$'VMT*{##7%kb%99r?   r5  )rg   rh   ri   r  r   r7   int64rJ  float32complex	complex64_TYPE_TO_DTYPEr   r  r  rS  rT  s   @r>   r  r  
  sS    	 	U[[u}}N 69Y]2	2O: :r?   r  c                   0     e Zd ZdZddd fd
Zd Z xZS )TensorOrArrayPaira  Pair for tensor-like inputs.

    On the one hand this class is stricter than the builtin :class:`TensorLikePair` since it only allows instances of
    :class:`torch.Tensor` and :class:`numpy.ndarray` rather than allowing any tensor-like than can be converted into a
    tensor. On the other hand this class is looser since it converts all inputs into tensors with no regard of their
    relationship, e.g. comparing a :class:`torch.Tensor` to :class:`numpy.ndarray` is fine.

    In addition, this class supports overriding the absolute and relative tolerance through the ``@precisionOverride``
    and ``@toleranceOverride`` decorators.
    r  r  r  c                    t        |   ||fi | t        | j                  |      | _        t        | j                  |      | _        y r6   r  r   r  r  r  r  r  rF  s         r>   r   zTensorOrArrayPair.__init__c
  s<    >-=>		=1			=1	r?   c                      j                  ||t        j                  t        j                  f        fd||fD        \  }}||fD ]  } j                  ||        ||fS )Nr  c              3   @   K   | ]  }j                  |        y wr6   )
_to_tensor)r   r  r   s     r>   r   z4TensorOrArrayPair._process_inputs.<locals>.<genexpr>k
  s     SuDOOE2Ss   r  )_check_inputs_isinstancer7   r   r  r  _check_supported)r   r  r  r   allow_subclassesr2  s   `     r>   r  z!TensorOrArrayPair._process_inputsh
  sk    %%fhU\\2::<V%WS@RSx( 	1F!!&R!0	1xr?   )rg   rh   ri   r  r   r  rS  rT  s   @r>   r  r  X
  s    	 ;>S 2
 r?   r  c                   0     e Zd ZdZddd fd
Zd Z xZS )TypedStoragePairz4Pair for :class:`torch.storage.TypedStorage` inputs.r  r  c                    | j                  ||t        j                  j                         t	        |   ||fi | t        | j                  |      | _        t        | j                  |      | _        y Nr  )	r  r7   r  TypedStoragerE  r   r  r  r  r  s         r>   r   zTypedStoragePair.__init__s
  s[    %%fhEMM<V<V%W>-=>		=1			=1	r?   c                    t        j                  |j                  t         j                  t         j                  t         j
                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  ij                  |j                  |j                        |j                        S )Nr  )r7   r2  _untyped_storagequint8uint8quint4x2quint2x4qint32int32qint8int8r  rE  rG  )r   typed_storages     r>   r  zTypedStoragePair._to_tensory
  s    ||**ekkekkUZZ c-%%}':':; ''

 
	
r?   )rg   rh   ri   r  r   r  rS  rT  s   @r>   r  r  q
  s    >:=S 2
r?   r  c                   \     e Zd ZU dZeeeedf   f   ed<   dZe	e
   ed<    fdZd Z xZS )UnittestPairav  Fallback ABC pair that handles non-numeric inputs.

    To avoid recreating the mismatch messages of :meth:`unittest.TestCase.assertEqual`, this pair simply wraps it in
    order to use it with the :class:`Pair` "framework" from :func:`are_equal`.

    Define the :attr:`UnittestPair.CLS` in a subclass to indicate which class(es) of the inputs the pair should support.
    .CLSN	TYPE_NAMEc                 d    | j                  ||| j                         t        |   ||fi | y r  )r  r  rE  r   )r   r  r  r  rF  s       r>   r   zUnittestPair.__init__
  s1    %%fhDHH%E>-=>r?   c                    t        j                         }	 |j                  | j                  | j                        S # |j
                  $ r}t        |      }Y d }~nd }~ww xY w| j                  xs? t        | j                  t              r| j                  n| j                  d   j                  }| j                  t        |j                          d|        y )Nr   z comparison failed: )r   r   assertEqualr  r  failureExceptionrm   r  r   r  rH  rg   r  AssertionErrortitle)r   r  errorr  	type_names        r>   comparezUnittestPair.compare
  s    %%'		((dmmDD)) 	e*C	 NNh:dhh3MtxxSWS[S[\]S^&h&h	

>ioo&7%88LSE#RSs   %< A AA )rg   rh   ri   r  r   r   r   rk   r  r   rm   r   r  rS  rT  s   @r>   r  r  
  s<     
tU49%%	&&#Ix}#?	Tr?   r  c                       e Zd ZeefZdZy)
StringPairstringN)rg   rh   ri   rm   bytesr  r  rF   r?   r>   r  r  
  s    ,CIr?   r  c                       e Zd ZeZy)SetPairN)rg   rh   ri   r  r  rF   r?   r>   r  r  
  s    
Cr?   r  c                       e Zd ZeZy)TypePairN)rg   rh   ri   rH  r  rF   r?   r>   r  r  
  s    
Cr?   r  c                       e Zd ZeZy)
ObjectPairN)rg   rh   ri   rb  r  rF   r?   r>   r  r  
  s    
Cr?   r  c                        e Zd Z fdZ xZS ),AssertRaisesContextIgnoreNotImplementedErrorc                     |.t        |t              r| j                  j                  d|        t        |   |||      S )Nznot_implemented: )
issubclassr   r  skipTestrE  r  )r   ro  	exc_valuetbrF  s       r>   r  z5AssertRaisesContextIgnoreNotImplementedError.__exit__
  sA    Jx9L$MNN##&7	{$CDw)R88r?   )rg   rh   ri   r  rS  rT  s   @r>   r  r  
  s    9 9r?   r  new_valc              #      K   t        j                         }t        j                  |        	 d  t        j                  |       y # t        j                  |       w xY wwr6   )r7   is_warn_always_enabledset_warn_always)r  old_vals     r>   set_warn_always_contextr$  
  sF     **,G	'"'g&g&r0  c                       e Zd ZdZy)NoTestFN)rg   rh   ri   __test__rF   r?   r>   r&  r&  
  s    Hr?   r&  c            
       Z    e Zd ZU dZeed<   dZeed<   dZeed<   e	j                  ZdZd Zedefd	       Zej                   d
eddfd       Zedefd       Zej                   d
eddfd       ZdZdZdZdK fd	ZdLdZd Zd Zd Zd ZdM fd	ZdddZdN fd	ZdN fd	Zd Zd Z d Z!d Z"dL fd	Z#dLdZ$d  Z%d! Z&e'dd"d#       Z(d$dd%d&Z)dd'd(Z*dd'd)Z+dd'd*Z,dd'd+Z-d, Z.	 	 	 	 	 	 	 	 	 	 	 	 	 dOd-Z/d. Z0d/ Z1	 dNd0Z2dPd1Z3dPd2Z4	 dLddddddddd3d4e5e6e7e8e7ge7f   f      d5e5e   d6e5e   fd7Z9dLddd8d4e5e7   d5e5e   d6e5e   ddfd9Z:dPd:Z;d;e<d<e=e<   ddfd=Z> fd>Z? fd?Z@d@ ZAdA ZBdQdBZCeDdQdC       ZEdLdDZFdLdEZGdRdFZHdQdGZIdSdHZJe'dLdI       ZKe'dJ        ZL xZMS )Tr   r   
_precision_rel_tolF_default_dtype_check_enabledNc                 *   t         j                  j                         r 	 t         j                  j                          yy# t        $ rI}t        dt        j                         t        t        |      t        j                         Y d }~yd }~ww xY w)NzDTEST SUITE EARLY TERMINATION due to torch.cuda.synchronize() failurer  TF)	r7   r   is_initializedrO  r  r  r  r  rm   )r   rtes     r>   _should_stop_test_suitez TestCase._should_stop_test_suite
  sh    ::$$&

&&(
    \cfcmcmnc#hSZZ0s   A   	B	?BBr`   c                     | j                   S r6   r)  r   s    r>   	precisionzTestCase.precision
  s    r?   precc                     || _         y r6   r2  r   r4  s     r>   r3  zTestCase.precision
  s	    r?   c                     | j                   S r6   r*  r   s    r>   rel_tolzTestCase.rel_tol
  s    }}r?   c                     || _         y r6   r8  r6  s     r>   r9  zTestCase.rel_tol
  s	    r?   c                 x   |dk7  r|}t         |   |       t        | |d       }|]t        rN| xj                  t        |dd      z  c_        | j                  r"t
        s| j                  || j                         | xj                  t        |dd      z  c_        | j                  r"t
        s| j                  || j                         | j                  r| j                  |d        t        r	 d }t        j                  j                  t!        j"                  t%        |                   } ||      }t%        |       j&                  }d| d| d	| }t(        j+                         }	|	|g}
| j                  ||
fd
       y y y # t,        $ r*}t.        j1                  dt3        |             Y d }~y d }~ww xY w)NrunTestr  Tr  c                       t        t              S r6   )rq  r   rF   r?   r>   rI   z#TestCase.__init__.<locals>.<lambda>  s    ;NOb;c r?   c                 2   t        |       j                  }t        |      D ]S  \  }}|dk(  s|dkD  rt        j                  j
                  |d |  nd}t        j                  j                  | |      c S  t        j                  j                  |       d   S )Nr   r   r   )startr^  )r   partsr   rO   r   rd   relpathr   )abs_test_pathr@  r  partbase_dirs        r>   _get_rel_test_pathz-TestCase.__init__.<locals>._get_rel_test_path#  s     !%] 3 9 9'0'7 VGAt#v~GH1u277<<r+CRT')ww}H'U UV  "ww}}];A>>r?   zpython rb   r   c                     t        |       S r6   )rz  )rv  s    r>   rI   z#TestCase.__init__.<locals>.<lambda>;  s    8N{8[ r?   zcould not print repro string)extra)rE  r   r   r3  r  ry  wrap_with_cuda_policyassertLeaksNoCudaTensorsr  enforceNonDefaultStream_ignore_not_implemented_errorwrap_with_policyr   rO   r   abspathr   getfilerH  rg   rA   rf   r   r   inform   )r   method_name
methodNametest_methodrE  rB  r  
class_nametest_run_cmdenv_var_prefixrv  rp  rF  s               r>   r   zTestCase.__init__	  s    "$K%dK6"'//7;Hdfj3kk/22:..{D<Y<YZ ,,Ebdh0ii,//
**;8T8TU11%%k3cd%K?  %'GGOOGOODJ4O$PM$6}$EM!%d!4!4J%,]O1ZL+#WL%4%I%I%KN#1<"@K))#+6[]1 &! #V ! KHH;3q6HJJKs   0BF 	F9 F44F9c                 B    || j                         n|}t        | |      S r6   )r   rY  )r   rR   s     r>   rI  z!TestCase.assertLeaksNoCudaTensors@  s      Ltwwyd"4..r?   c                     t               S r6   )rC  r   s    r>   rJ  z TestCase.enforceNonDefaultStreamD  s    #%%r?   c                 n    t        j                  dt         j                        }|j                  d|      S )NaF  
            \x1B  # ESC
            (?:   # 7-bit C1 Fe (except CSI)
                [@-Z\\-_]
            |     # or [ for CSI, followed by a control sequence
                \[
                [0-?]*  # Parameter bytes
                [ -/]*  # Intermediate bytes
                [@-~]   # Final byte
            )
        r   )r  compileVERBOSErf  )r   r  ansi_escapes      r>   _remove_ansi_escapezTestCase._remove_ansi_escapeG  s1    jj 
" ZZ
 r5))r?   c                     |j                  d      }|D cg c]$  }|j                         j                  d      r#|& }}dj                  |      S c c}w )Nrt  #)r   r=  r  rd   r   input_stringr  linefiltered_liness        r>   remove_comment_lineszTestCase.remove_comment_linesV  sN    ""4(+0U4

8O8OPS8T$UUyy(( Vs
   $AAc                     |j                  d      }|D cg c]  }|j                         dk(  r| }}dj                  |      S c c}w )Nrt  r   )r   r=  rd   r_  s        r>   remove_empty_lineszTestCase.remove_empty_lines[  sG    ""4(+0K4

8J$KKyy(( Ls
   AAc                 p   t        |t              r|n
t        |      }| j                  |      }| j                  |      }|r"| j                  |      }| j                  |      }|r"| j	                  |      }| j	                  |      }t
        |   t        |t              r|n
t        |      ||dz         S Nr^  )r   rm   r\  rc  re  rE  assertExpectedInline)r   r  expectrH  ignore_commentsignore_empty_linesrF  s         r>   rh  zTestCase.assertExpectedInlinea  s    %fc2F))&1))&1..v6F..v6F,,V4F,,V4Fw+j6MFSVW]S^`fhlophpqqr?   T)suppress_suffixc                    	  |        | j                  d       y # |$ r*}| j                  t        ||d      |d       Y d }~y d }~ww xY w)Nr^  )rl  rH  )rH  Did not raise when expected tor$  )rh  	munge_excfail)r   ro  r  ri  rl  rp  s         r>   assertExpectedInlineMungedz#TestCase.assertExpectedInlineMungedp  sX    	J 			6	7  	%%!_1EvTU &  		s    A AAc                 R    |t        j                  d      }t        |   ||      S Nr7   )logging	getLoggerrE  
assertLogsr   loggerlevelrF  s      r>   rv  zTestCase.assertLogs|  s*    >&&w/Fw!&%00r?   c                 R    |t        j                  d      }t        |   ||      S rs  )rt  ru  rE  assertNoLogsrw  s      r>   r{  zTestCase.assertNoLogs  s*    >&&w/Fw#FE22r?   c                     t        | |      }ddlm} | j                         j	                         }|r'd|v sd|v rt        | || j                  ||             y y y )Nr   )	TEST_CUDAgpur   )r   r\  r}  r   lowerr$  wrap_method_with_policy)r   rP  policyrR  r}  fullnames         r>   rH  zTestCase.wrap_with_cuda_policy  sY    dK0 	B779??$%8+v/AD+t'C'CKQW'XY 0B9r?   c                 V    t        | |      }t        | || j                  ||             y r6   )r   r$  r  )r   rP  r  rR  s       r>   rL  zTestCase.wrap_with_policy  s'    dK0k4#?#?V#TUr?   c                 Z    t              fd       }t        j                  ||       S )Nc                 N            5   |i | d d d        y # 1 sw Y   y xY wr6   rF   )r   r<   r=   methodr  s      r>   r   z1TestCase.wrap_method_with_policy.<locals>.wrapper  s*     (''( ( (s   	$)r   r  
MethodType)r   r  r  r   s    `` r>   r  z TestCase.wrap_method_with_policy  s0     
v	( 
	( ..r?   c                 :    | j                  || j                        S r6   )r  rI  )r   r  s     r>   wrap_with_cuda_memory_checkz$TestCase.wrap_with_cuda_memory_check  s    ++FD4Q4QRRr?   c           	          t        |t        j                        }t           }|j
                  }t        xs t        xs t        }d}d}|r	 t        j                  t        |            }t        j                  j                  |      }	t        j                   d|	      }
|
.|
j#                  d      }t        rddlm} ||v}ddlm} ||v}nd}dt        j.                  v rt        j.                  d   dk(  rd}d}|rJt1          j2                        }t5        |d	      r|j6                  }nt5        |d	      r|j6                  }n|}t1        |d
d      xr |}|s|rt8        j:                  j=                          |r| }n$t8        j:                  j>                  j@                  }t        jB                  jE                  d|      5  t        r%t9        j:                  jG                  d      |      }nt        r%t9        j:                  jG                  d      |      }nt        rt9        j:                  jG                  d|      |      } jH                  jJ                   d j2                   }ddlm&}m'}  fd}||v r4t1          j2                        }tQ          j2                   |||              fd}||v r4t1          j2                        }tQ          j2                   |||              ||       d d d        |s|rt8        j:                  j=                          |r jS                         r|jU                         rotW               }tX        .ddl-m.}  |||      }|j^                  |_0        d|_1        d|_2        |jf                  ji                  |df       |jU                         du sJ |jk                          y y y # t*        t,        f$ r Y w xY w# 1 sw Y   xY w)NFz.*/test/(.*).pyr^  )FIXME_inductor_non_strict) FIXME_inductor_dont_reset_dynamoTSTRICT_DEFAULTrE   r  r  r  r  aot_eager_decomp_partitioneager_noexcept)r!  r   )dynamo_expected_failuresdynamo_skipsc                 6     t                fd       }|S )Nc                      	  | i | t        d d      # t         $ r}j                  |       Y d }~.d }~ww xY w)NzAUnexpected success, please remove `test/dynamo_expected_failures/`)BaseExceptionr  r  )r<   r=   rp  r  r   r   s      r>   r   z=TestCase._run_custom.<locals>.expect_failure.<locals>.wrapper  sP    -t.v. +-noxnyyz+{||  - - MM!,,-s    	>9>r  r  r   r   r   s   `` r>   expect_failurez,TestCase._run_custom.<locals>.expect_failure  s"    1X} } #Nr?   c                 6     t                fd       }|S )Nc                      	  | i | t        j                        }t        |dd      rj                  d       y j                  d d       y # t         $ r}j                  |       Y d }~jd }~ww xY w)N__unittest_expecting_failure__Fzunexpected successz9This test passed, maybe we can remove `test/dynamo_skips/r  )r  r  r   r  )r<   r=   rp  r  r  r   r   s       r>   r   z=TestCase._run_custom.<locals>.ignore_failure.<locals>.wrapper  s}    -t.v. ")t/C/C!D"6+KUS MM*>? MM,efoeppq*rs  - - MM!,,-s   A 	A:A55A:r  r  s   `` r>   ignore_failurez,TestCase._run_custom.<locals>.ignore_failure  s"    1X	t 	t #Nr?   rn  r   )	_TestInfor  TestSuiteEarlyFailurez%TestSuite execution was aborted early)6r   r   
TestResultrE  run__self__r  r  r  r   rN  rH  rO   r   rM  r  matchr!  dynamo_test_failuresr  r  OSErrorr;  r  r   r  r   r  r7   r  r  r/  suppress_errorsr  r  optimizerF  rg   r  r  r$  r0  ro  r   r  rk  r  ERRORrV  elapsed_timetest_descriptionfailuresr.  stop)r   rn  using_unittest	super_runtest_clscompiledstrict_defaultshould_reset_dynamor   	full_pathr  r   r  r  strict_moderR  r!  r  keyr  r  r  r  r  r  r  rF  s   `                         r>   _run_customzTestCase._run_custom  sj   #FH,?,?@GK	%% )Z,?ZCZ#tH~6GGOOD1	!3Y?$${{1~H.S)19R)RZ.6>^.^+)-  2::-::./36%)N!$(<(<=K{O4)77?3&44,8%=uER(-MM!
 "-oO#mm22BBO]]  !GY -	%&!MM22:>yI	$!MM223OPQZ[	& "MM223Ch2WXab	00143G3G2HIX# 22$T4+?+?@FD$"6"6vs8ST# ,&$T4+?+?@FD$"6"6vs8STV$[-	%^ -MM! d::<##%z , ;$VT2D"+//DK(+D%,CD) &&.U'VW++-666KKM =>] Y' 6-	% -	%s    BO	 D3O	OOO(c                     t        j                         5 }t        r|j                  t	                      | j                  |       d d d        y # 1 sw Y   y xY w)Nr  )
contextlib	ExitStackr  enter_contextr  r  )r   rn  r   s      r>   r  zTestCase.run$  sN    !!# 	u!##LN3  	 	 	s   2AAc                 z   t        |        t        t               t        j                  j
                  j                         | _        t        j                  j
                  j                          | j                  r't        j                         t        j                  k(  sJ t        j                         | _        y r6   )r  r   r   r7   sparsecheck_sparse_tensor_invariants
is_enabled_check_invariantsenabler+  r-  rJ  is_grad_enabled_prev_grad_stater   s    r>   setUpzTestCase.setUp,  s~    T "'!L!L!W!W!Y 	33::<,,**,;;; !& 5 5 7r?   c                    t        | d      r]| j                  r)t        j                  j                  j                          n(t        j                  j                  j                          | j                  r't        j                         t        j                  k(  sJ t        | d      r t        j                  | j                         y y )Nr  r  )r   r  r7   r  r  r  disabler+  r-  rJ  set_grad_enabledr  r   s    r>   tearDownzTestCase.tearDownB  s     4,-%%;;BBD;;CCE,,**,;;; 4+,""4#8#89 -r?   )r+  c          	          d|cxk  r z  k  sn J | f        fd}t        j                   dz   |t        j                  d            }dx}}	 |||	      }
|
r|t        |
      k\  rp|} dz
  } |||	      }||z
  dkD  r;||z   dz  } |||	      }|dk(  s||z  z
  t        |      k  r||}}n|}||z
  dkD  r;||}
}|sJ || d j	                         |
r||z  z
  t        |
 |z
        k\  r|	}dz
  } |||      }||z
  dkD  rG||z   dz  } |||      }|dk(  s!||z  z
  | |z
  z  z
  t        | |z
        k  r||}}n|}||z
  dkD  rG||}
}	|	sJ |d |z
  dz    j	                  |	       |
rt        ||z  z
  |	 |z
  z  z
  |	z
  |	z
  dz   z  dz        \  }}d||	z
  dz   z  z   }t        j                  d|z        }||dz   z  d|z  kD  r|dz  }|||dz   z  dz  z
  }|dkD  r|	dkD  rJ t        j                  |dz
  ||j                        |	z
  dz   z  |d| ||||z   dz   xxx t        j                  |dz   ||j                        z  ccc nd}||z  z
  |	 |z
  z  z
  }||xx   |z  cc<   |r,t        j                   |j                        }|dd |   |dd |}|j                  d	       |j                  |      S )
a  Return crow_indices of a CSR tensor with size (n_rows, n_cols) and
        the number of specified elements nnz.

        If random is True, the column counts of rows are in random
        order. Otherwise, the column counts of rows are defined by the
        used sampling method.

        Sampling method
        ---------------

        The used sampling method was introduced in
        https://pearu.github.io/csr_sampling.html, and here we give
        only an overall description of the method.

        Notice that crow_indices can be defined as cumsum(counts)
        where counts is a sequence of non-negative integers satisfying
        the following conditions:

          len(counts) == n_rows + 1
          counts.max() <= n_cols

        while counts[i + 1] is interpreted as the number of specified
        elements in the i-th row.

        The used sampling method aims at increasing the diversity of
        CSR samples, that is, a CSR sample should contain (i) rows
        that are all filled, (ii) rows with no elements at all, and
        (iii) rows that are partially filled. At the same time and for
        the given total number of specified elements (nnz), there
        should be minimal preference to rows with a given number of
        elements.  To achieve this, the sampling method is built-up on
        using a sawteeth model for counts. In the simplest case, we
        would have

          counts = arange(n_rows + 1) % (n_cols + 1)

        that has equal number of all possible column counts per row.
        This formula can be used only for specific input values of
        n_rows, n_cols, and nnz. To generalize this model to any
        combinations of inputs, the counts model above is extended
        with an incomplete sawtooth, and the right and lower
        rectangular parts that will guarantee that

          counts.sum() == nnz

        for any combination of n_rows, n_cols, and nnz. Basically,
        we'll find a maximal window in (n_rows + 1, n_cols + 1)-grid
        that is able to hold a sequence of sawteeth and so-called
        final correction, while the external part of the window is
        filled with counts to meet the nnz constraint exactly.
        r   c                 |    |z
  |z
  dz   z  dz  }| z
  |z
  dz   z  }|| z
  |z
  dz   z  z  ||dz
  z  dz  z   S )Nr^  r   rF   )rk  mMKn_colsn_rowss       r>   sawteethz-TestCase._make_crow_indices.<locals>.sawteeth  sd    
 !
Q/14A!
Q/A!!a89AQK1<LLLr?   r^  r   r  r   NrE  )r8  )r7   zerosrG  r  fill_divmodmathisqrtarangerandpermcumsum_r  )r  r  nnzrG  rE  r+  r  countsrk  r  Nn_leftn_rightN_rightn_middleN_middlem_leftm_rightm_middleqr  r  kcorrpermcrow_indicess   ``                        r>   _make_crow_indiceszTestCase._make_crow_indicesT  s   l C*6F?*AS&&,AA*	M VaZuU\\%=PQ	AQNAv& FqjGw*GF"Q&"W,2#Ha0q=C(V*;$;c(F>S$S'/WG%F F"Q& GqAH1A23Kf%q6z!SFQJ%77 FqjGq'*GF"Q&"W,2#Ax0q=C!f*$4x6A:7N$NQTU]_ehi_iQj$j'/WG%F F"Q& GqAH11VaZ!^$**1-#F
*Q&1*-==!A:&1*q.9Q>@DAqA!a((A

1q5!AAE{QU"QqAE{a''DQQU,,,,q1uE&--PTZ]^T^abTbcF1QK1QUQY5<<AU6==#YY AV#a6A:&66D 	q	T	 >>&?DD)F12J #f--r?   rF   )	blocksize
dense_dimsc          	      R    ddl m}	 ddlm}
 d}t	        fdt        t                    D              s|dk(  sJ d       t              |k\  sJ rQt              dk(  s	J f       d|z
     d   z  dk(  s	J f       d|z
     d	   z  dk(  s	J f       \  }}nd	x}}t              t              |z
  d   fd
}d d|z
   } |
|	|d	      }|t        j                  t        j                  hv rd|z
     |z  d|z
     |z  }}nd|z
     |z  d|z
     |z  }}|||z  z  }t        |      D cg c]  } ||||       }}t        t        t        |       } t        j                  t        |            j                   g || } t        j                  t        |            j                   g |d } t        j                  t        |            j                   g |d }t        j"                  ||||      S c c}w )Nr   )mul)reducer   c              3   .   K   | ]  }|   d kD    ywr   NrF   r   r  r!  s     r>   r   z5TestCase.genSparseCompressedTensor.<locals>.<genexpr>  s     9147Q;9r  invalid argumentsr  r[  r^  c                    j                  | ||      }t        j                  |      }t        |       D ]M  }||dz      ||   z
  }t        j                  t        j
                  |      d |       \  |||   ||dz       }O t        j                  k7  rdnd}t        j                  k7  rdnd}	t        |fz   z   ||	      }
|
||fS )NrG  rE  r  r^  r[  r   r   rG  rE  lowhigh)r  r7   r  r  sortr  r  r)   )n_compressed_dimsn_plain_dimsr  compressed_indicesplain_indicesr  countrt   r  r  rP  r  
dense_sizerG  rE  index_dtyper   s              r>   random_sparse_compressedzDTestCase.genSparseCompressedTensor.<locals>.random_sparse_compressed  s   !%!8!89JLZ]flt!8  "A!KK;vNM,- \*1q514Fq4IITYT^T^NN<{6RSYTYZU\Q034Fq1u4MNPQ\ ,"!C,1!D #)!3j!@W\belpqF-}<<r?   )r!  rE  layoutrG  )operatorr  r   r  r  r  ra  r'  r7   
sparse_csr
sparse_bsrmapr  rO  r   r   reshapesparse_compressed_tensor)r   r!  r  r  rG  rE  r  r  r  r  r  
sparse_dim
blocksize0
blocksize1r  batch_shapen_batchr  r  blocknnzrt   sparse_tensorssparse_tensors_itrP  r  r  r  s   ``  ````                  @r>   genSparseCompressedTensorz"TestCase.genSparseCompressedTensor  s    $
9c$i(899SAXZGZZE4yJ&&&y>Q&9y(99&Z(9Q<71<OtY>OO<Z(9Q<71<OtY>OO<%."J
&''JT{3t9z134

	= 
	= +BO,k1-e&&(8(899.22
?.Cz.QSWXZ]gXgShlvSv|.22
?.Cz.QSWXZ]gXgShlvSv|:
23glmtguvbc23DlT\]vvc>&:;=T"345==n{nHnW`ncmnIU[[.?)@AII[;[XZ[DD):$;<DDVkVSUV--.@-.44uU[djl 	l ws   H$)r  c          
      P    | j                  ||t        j                  |||d|      S )NrF   r  rG  rE  r  r  r  )r  r7   r  r   r!  r  rG  rE  r  r  s          r>   genSparseCSRTensorzTestCase.genSparseCSRTensor  s6    --dC@P@PY_49{^`mw . y 	yr?   c          
      P    | j                  ||t        j                  |||dd      S )NrF   r   r  )r  r7   
sparse_cscr  s          r>   genSparseCSCTensorzTestCase.genSparseCSCTensor  s6    --dC@P@PY_49{^`mn . p 	pr?   c          
      p    t        |      dk(  sJ | j                  ||t        j                  |||||      S Nr   r  )ra  r  r7   r  r   r!  r  r  rG  rE  r  r  s           r>   genSparseBSRTensorzTestCase.genSparseBSRTensor  H    9~"""--dC@P@PY_49{^gt~ . @ 	@r?   c          
      p    t        |      dk(  sJ | j                  ||t        j                  |||||      S r  )ra  r  r7   
sparse_bscr  s           r>   genSparseBSCTensorzTestCase.genSparseBSCTensor  r  r?   c                 \   t        fdt        |      D              s|dk(  sJ d       |gt        |d        z   }t        |||dd      }t	        j
                  |||      }	|	j                  t	        j                  d |       j                  d      j                  |	             |	j                  t        j                        }	|r9|	d d d |dz  d	f   }
|	d d d |dz   dz  d	f   }t	        j                  |
|gd      }	t	        j                  |	|t	        j                        ||
      }|s|j                         }n-|j                         j!                         j#                  d      }||j%                         j!                         |j'                         j!                         fS )Nc              3   .   K   | ]  }|   d kD    ywr  rF   r  s     r>   r   z+TestCase.genSparseTensor.<locals>.<genexpr>%  s     :147Q;:r  r   r  r[  r^  r  rE  r   .r  F)r  r  r  r)   r7   randmul_r2  	unsqueezer  longcatsparse_coo_tensorSizecoalescedetachr  _coalesced__indices_values)r   r!  r  r  is_uncoalescedrG  rE  v_sizerR  r  i1i2r   s    `           r>   genSparseTensorzTestCase.genSparseTensor"  su    :j(9::cQh[H[[Fd:;/00vUKJJz3v6	u||D*-.88;>>qABDD1kqk3&'B1'qQ',-B		2r(A&A##Aq%**T*:%PVW

A 
  "..u5A!**,$$&		(9(9(;;;r?   c              #      '()*+K   |t         j                  }|t         j                  t         j                  t         j                  t         j
                  hv }|r j                  ||||||||	|
||d      D ]  \  }}|rt        d |D              }|t         j                  u rdt        |      dk(  sJ |j                  dd      }|J |r%|d   j                  |      j                          y|d   j                  |       |t         j                  u rt        j                  |i | |r*|j                  |       t        j                   |i | J  yd	 )d
 *)*fd+(+fd('fd'|{g dg dgddgg dfg dg dgg dg dgg dg dggg dg dgg dg dgg dg dgggddgddgfg dg dg dg dg dg dg dg d gdgdd!gfdd"gd#d$ggddgddgggd%g|rdgng fg}d4 fd'	}|D ]  \  }}}|s|D cg c]  }|r|	 }}|r|s!t        j"                  |t         j                  (      }|s|j$                  d"kD  rX|D ];  } (||      |   }|D ]&  }|dd& D cg c]  }|j'                  ||)       }} '|d&   |      j'                  ||)      }t)        |||j*                  |z   *      }||j                  |+       g |||j-                         f |
rq|j$                  d"kD  rbd,D ]]  \  }}|D cg c]  } ||||-       } }g | ||j-                         f |s: ||d&d-      }!g | |!|j-                         f _ |s ||d&d-      }!g ||!|j-                         f ) >  |	rd.d/g|rg d0ndgfd1g d2dgfd3d/gdgffD ]  \  }"}}|D ]  }|D ]  }|t         j                  k(  rd}t        j.                  |"|z   ||)      }n|t         j                  k(  rAt        j.                  t        |"      d||)      f}t        j.                  dg|||)      }n|t         j                  k(  r\t        j"                  dg|"d   dz   z  ||)      }#t        j.                  d||)      }$|#|$f}t        j.                  dg|||)      }n\|t         j                  k(  r[t        j"                  dg|"d   dz   z  ||)      }%t        j.                  d||)      }&|%|&f}t        j.                  dg|||)      }n|t         j                  k(  rct        j"                  dg|"d   |d   z  dz   z  ||)      }#t        j.                  d||)      }$|#|$f}t        j.                  dg||||)      }nx|t         j
                  k(  rct        j"                  dg|"d   |d   z  dz   z  ||)      }%t        j.                  d||)      }&|%|&f}t        j.                  dg||||)      }nJ t)        |||"|z   *      }||j                  |+       g |||f    yyc c}w c c}w c c}w w)5a  Generator of simple inputs for tensor constructors of the given layout.

        The generated tensor inputs have the following properties:

        - tensor shapes are minimal but not trivial
        - tensor values are sorted sequences for COO and CSR formats, e.g. [1, 2, 3, 4]
        - the generated tensors represent the same mathematical tensor for all layouts
        - the generated tensors include regular, zero-sized, and optionally, batched or/and hybrid tensors.
        - the generated tensors include contiguous or non-contiguous tensors both in indices and values

        If output_tensor is True, yield tensors with the given
        layout. Otherwise, yield inputs to the corresponding tensor
        constructors:

          - sparse compressed input is defined as
            (compressed_indices, plain_indices, values), dict(size=expected_size_from_shape_inference, device=device, dtype=dtype,
                                                              pin_memory=pin_memory)

          - sparse COO input is defined as
            (indices, values), dict(size=expected_size_from_shape_inference, device=device, dtype=dtype, pin_memory=pin_memory)

          - strided input is defined as
            (values,), dict(device=device, dtype=dtype)
        NF)rG  rE  r  
pin_memoryenable_batchenable_hybridenable_zero_sizedenable_non_contiguous_indicesenable_non_contiguous_valuesenable_batch_variable_nseoutput_tensorc              3   <   K   | ]  }|j                           y wr6   r2  )r   rQ  s     r>   r   z2TestCase.generate_simple_inputs.<locals>.<genexpr>s  s      >A >s   r^  r!  r   )r  c                    | j                   }|d   |d   z  dk(  s	J ||f       |d   |d   z  dk(  s	J ||f       | j                  d|d   |d   |d   z  |d         j                  dd      j                  d      j                  d      }t	        j
                  d|j                         dz         j                  |j                         }|dk7  |z  S )Nr   r^  r[  r  )shaper  	transposer  r7   r  r  )patternr  basesizeblockpattern	block_idss        r>   get_blockpatternz9TestCase.generate_simple_inputs.<locals>.get_blockpattern  s    }}HA;1-2IXy4II2A;1-2IXy4II2"??2+4Q<+3A;)A,+F+4Q<9 :C2r9J33r7SVSVWYSZ  Q(:(:(<q(@AII,J\J\]I A%22r?   c                    | j                   }t        |      dk(  sJ |       t        j                  | dk7        }t        j                  |      }t        j
                  |d   dz   t        j                        }t        j                  |d   j                  |d         d      |dd  |d   }t        j
                  |t        j                        }t        j                  ddt        |d         z   t        j                        }|||<   t        j                  | j                  dd      dk7        }t        j                  |      }	t        j
                  |d   dz   t        j                        }
t        j                  |	d   j                  |d         d      |
dd  |	d   }|j                  dd      |   }t        j                  ||ft        j                  |||ft        j                  |
||ft        j                  |fiS )Nr   r   r^  rE  )	minlength)r>  ra  r7   wherer   r  r  cumsumbincountr  r?  
sparse_coor  r  strided)r@  rA  indicescoo_indicesr  col_indicesstrided_valuesrP  	indices_Tcoo_indices_Tccol_indicesrow_indices
csc_valuess                r>   get_sparse_dataz8TestCase.generate_simple_inputs.<locals>.get_sparse_data  s   }}Hx=A%/x/% kk'Q,/G++g.K ;;x{QekkJL$||KN,C,ChWXk,C,Z\]^L%a.K"[[EN
 \\!QWQZ%8LF&,N7#G$5$5a$;q$@AI!KK	2M ;;x{QekkJL$||M!,<,E,EPXYZP[,E,\^_`L'*K'11!Q7	BJ$${F&;$$|[&&I$$|[*&MMMN#46 6r?   c                 <    |       } | |      } |      }|t         j                     d   }|t         j                     d   }t        j                  |j	                  dd      D cg c].  \  }}|||d   z  |dz   |d   z  ||d   z  |dz   |d   z  f   0 c}}      }	|	|t         j
                     d   dz
     }
t         j                  g |t         j                     d d |	t         j                  g |t         j
                     d d |
i|S c c}}w )Nr   r^  r   )	r7   rL  rK  r   r?  r  r  r  r  )r@  r  nonblock_datarB  
block_datarP  block_indicesbibj
bsr_values
bsc_valuesrD  rV  s              r>   get_sparse_data_with_blockzCTestCase.generate_simple_inputs.<locals>.get_sparse_data_with_block  sY   +G4M+GY?L(6J*5==9!<N&u'7'78;M4A4K4KAq4Q&S*0"b '5R)A,5FQR[\]R^G^5^57)A,5FQR[\]R^G^5^6_ '` &S TJ $Ju/?/?$@$Ca$GHJ$$&U
53C3C(DRa(H&U*&U$$&U
53C3C(DRa(H&U*&U%#% %&Ss   +3D
c                   
 | j                   }t        |      dk  r	 | |      S i }t        |       D ]  \  }} ||      j                         D ]g  \  }
|j	                  |      }|t
        j                  u rt        j                  t        j                  dt        
d         f|t
        j                        
d   f      }||
d   fx}||<   |d   j                  t        j                  |d   |fd             |d   j                  t        j                  |d   
d   f             |-t        
fdt        t        
            D              x}||<   t        t        
            D ]@  }	||	   j                  t        j                  ||	   
|	   j                  d      f             B j  |S )Nr   r^  rF  r   c              3   F   K   | ]  }|   j                  d         ywr  )r"  )r   jr  s     r>   r   zQTestCase.generate_simple_inputs.<locals>.get_batch_sparse_data.<locals>.<genexpr>  s     ?iVW!q@Q?is   !)r>  ra  r   re   r  r7   rK  r$  fullr  set_r'  r  r"  )r@  r  r!  
batch_datar  r3  r  r  ext_coo_indices1rb  r  get_batch_sparse_datar_  s             @r>   rg  z>TestCase.generate_simple_inputs.<locals>.get_batch_sparse_data  s   ==D4yA~1'9EE J$W- Z4!6tY!G!M!M!O ZIFA'^^F3F!1!11 ,199ejj!S1YQRZ_ZeZe6fhijkhl5m+n(!>;KQqT:RRFZ%7"1INN599fQiAQ5RTU+VW"1INN599fQi15F+GH!>:??i[`adefag[h?i:iiFZ%7%*3q6] Z &q	uyy&)QqT^^TUEV9W/X YZ!ZZ& r?   c           	         |s| S t        | t              s9| j                  dkD  r*t        j                  | D cg c]  } ||       c}      S | dk(  r%t        j
                  |t        j                        S t        j                  |d   t        j                        }t        |dd       D ]>  \  }}t        j                  |t        j                        d|dz   z  z  }|d   |d   z   }@ |j                  |        |S c c}w )aq  Generates a tensor of shape densesize with values equal to

              base + i_1 * 10^0 + ... + i_d * 10^{d - 1}

            at indices i_1, ..., i_d (with 0 <= i_j < densesize[j] for any 1 <= j <=
            len(densesize))

            This mapping produces unique values as long as
            densesize[i] < 10 for all i in range(len(densesize)).
            r   rF  r^  Nr  ).N)N.)
r   r   ndimr7   r   r  r  r  r   add_)base	densesizebr  r  r  ygenerate_valuess          r>   ro  z8TestCase.generate_simple_inputs.<locals>.generate_values  s     dC(TYY]{{4#PaOAy$A#PQQqy{{9EKK@@Yq\=A!)AB-0 01LL%++6"Q-HiL1Y</0 FF4LH $Qs   D)r^  r   r   )r^  r   rr  r   r^  )r^  rr  )rF   r   r   r  )r^  r   rr  )r^  r   r   )r   r   r   r   rr  rF   rq  )r   r^  r   r   r   r   )r   r^  r   r   r   r   )rr  rr  rr  r   r   r   )r   r   r   r   r   r   )r   r  r      rt  rt  )r  r   r  rt  rt  rt  )r   r   r   r   r  r  )   ru  ru  r   r  r  rr  r   rr  r   )r^  r^  r[  c                 @   j                  | j                                |dk  r|| j                  z   }|dk\  r|| j                  k  sJ t        d|dz         }t	        j
                  g | j                  d | | j                  |   |z  | j                  |dz   d  | j                  | j                        }g t        d       f|z  t        |d |      }||   j                  |       }j                  |j                                j                  | |       |S )Nr   r   r^  r  )
assertTrueis_contiguousri  r  r7   r  r>  rE  rG  slicer"  assertFalser  )r$  r8  offsetsteptmp
dim_slicesr  r   s          r>   non_contiguous_copyz<TestCase.generate_simple_inputs.<locals>.non_contiguous_copy6  s    OOAOO-.QwAFFl!8aff,,q&1*%D++WWqwws|d/BWQWWSSTWXEVW_`_f_fopowowxCMU4[NS0M5t3LMJJ%%a(AQ__./Q"Hr?   rF  r  )rG  rE  r!  r;  >   r   r^  r  r   )r8  r{  )r   r   r^  r   )rF   rq  rs  )r   r   )r  rp  )rr  r   )r   r   )r[  r   )r7   r  r  r  r  r  generate_simple_inputsr'  rL  ra  r  r  r2  rK  r%  updater  r2  ri  r  rj   r>  copyempty),r   r  rG  rE  r  r2  members_pin_memoryr3  r4  r5  r6  r7  r8  r9  patternsis_compressed_sparse_layoutr<   r=   r!  r  r@  
blocksizes
densesizesrA  r  datarl  rQ  rM  rP  r8  r{  indices_copyvalues_copyrA  r  rO  rS  rT  ro  rg  rD  rV  r_  s,   `                                      @@@@@r>   r  zTestCase.generate_simple_inputs>  sn    L ++K&,1A1A5CSCSUZUeUeglgwgw0x&x# $ ; ;F6Y^lwGQIUerN_ZwYuVoJO !< !Q f &  > >>DU]]*t9>)>!::fd3D+++!"1good3>>@@"1good33u///114B6BB0MMM088$I&II112 		3"	6H	%(	8	2 4 %v.0BD 	  	 ! $*6"2RJ@ %$$$$$$$& )/x"f? q6q6q6q6 %X0IrT9UHB	  08 	E+GZ )3=A1a=
=:ll7%++>GGLL1$4' E	,Wi@H!+ EIOSTWUWyY!qtt6tEYGY,T"XyADDFZ_D`F!u7==S\C\]F!-<,G,V,fkkm;;49I-> RMS&dk+l_`,?sSY,Z+lL+l"9L"9&"96;;="HH;.A&bYZ.[&B&Bk&BFKKM&Q QR 4&9&bQR&S555v{{}DD)EE	EB fX]'9QSPTU5t<fXt,5 &90*j
 ", !9I%/  9	!U]]2&(G%*[[(Y2FPV^c%dF#u'7'77',{{3x=!FZe'f&hG%*[[!iW\%]F#u'7'77+0<<x{Q8OX^fq+rL*/++ak*ZK'3[&AG%*[[!iW\%]F#u'7'77+0<<x{Q8OX^fq+rL*/++ak*ZK'3[&AG%*[[!iW\%]F#u'7'77+0<<x{iXYl?Z]^?^8_hn  wB  ,CL*/++ak*ZK'3[&AG%*[[!1Li1L)1LU[ch%iF#u'7'77+0<<x{iXYl?Z]^?^8_hn  wB  ,CL*/++ak*ZK'3[&AG%*[[!1Li1L)1LU[ch%iF$1!%V5xR[G[!\%1"MMZM@000&88A 9!9&9 ? > Z ,ms?   HY*YYAY*8Y 
BY*Y%(Y*(Y*0K:Y*c                 |    |j                   t        j                  k(  r|j                         }|j	                         S r6   )r  r7   rK  r'  to_dense)r   r$  s     r>   safeToDensezTestCase.safeToDense  s+    88u'''

Azz|r?   c                    |j                         }|j                  |j                  |j                  }}}|j                  |j                  |j                  }}
}	 ||	g|
i |} ||g|i |} | j                  ||fddi| y )Nexact_deviceF)r  r  r<   r=   r  )r   torch_fnref_fnsample_inputr=   numpy_samplen_inpn_argsn_kwargst_inpt_argst_kwargsr  r  s                 r>   compare_with_referencezTestCase.compare_with_reference  s    #))+"."4"4l6G6GI\I\xv"."4"4l6G6GI\I\xv%5&5H5%5&5H5HHHr?   c                    t         sJ t        |t        j                        re|J |J |j	                         j                         }|j                  t        j                  u r|j                         }|j                         }|}	nlt        j                  t              }
t        j                  |
t        j                  <   t        j                  ||
|         }t        j                  |||      }	 ||      } ||	      j                         }t        |t        j                         r	 t        j"                  |      }|	j                  t        j                  u rW|j                  t        j                  u r;|j                  t        j                  u r|j'                  t        j                        } | j(                  ||fi | y # t$        $ r& t        j"                  |j                               }Y w xY w)NrF  r  )r  r   r7   r   r(  r   rE  bfloat16rJ  r  r  torch_to_numpy_dtype_dictr  r  r  r2  r  r  r   r  r  )r   r  np_fntensor_likerG  rE  r=   t_cpurQ  r$  r  	np_resulttorch_results                r>   compare_with_numpyzTestCase.compare_with_numpy  s~   zk5<<0>!>= =&&(,,.E{{enn,AA		34A "

AennAeH5A[uEA!H	{( i,?!,,Y7	
 ww%..(\-?-?5>>-QV_VeVeinititVt+u{{;L;F;  ? ",,Y^^-=>	?s   -G
 
,G98G9c                 *     | j                   |ddi|S )Nexact_dtypeF)r  )r   r<   r=   s      r>   assertEqualIgnoreTypezTestCase.assertEqualIgnoreType  s!      tC5CFCCr?   c                 
   t        |t              st        j                  |      |z  }t        |t        j                        s+t        j                  |      t        j
                  |      z  } | j                  ||g|i |S )zHTests if tensor x equals to y, if y to be broadcast to x.shape.
        )r   r   r7   	ones_liker   r2  r  )r   r   rn  r<   r=   s        r>   assertEqualBroadcastingz TestCase.assertEqualBroadcasting  si     !X&"Q&A!U\\*"U\\!_4At16t6v66r?   )r  r  	equal_nanr  r  exact_layoutexact_strideexact_is_coalescedr  r  r  c                   d}t        d ||fD              rd } ||      } ||      }nt        |t        j                        r=t        |t              r-t        j
                  ||j                  |j                        }nVt        |t              rFt        |t        j                        r,t        j
                  ||j                  |j                        }t        |t        j                        r9|j                  r-|j                  t        j                  k(  r|j                         }t        |t        j                        r9|j                  r-|j                  t        j                  k(  r|j                         }t        ||t        t        t        t         t"        t$        t&        t(        t*        f	t        t,        t.        t0        t2        t        j4                  j6                  j8                  j:                  ft<        t>        t@        tB        f|| jD                  || jF                  ||||	|
|      }|rJ|g}|jI                         d   jK                  t        tL              r| jN                  r	fd            y )NTc              3      K   | ]6  }t        |t        j                        xr t        |j                          8 y wr6   )r   r  r  r=  rE  )r   r  s     r>   r   z'TestCase.assertEqual.<locals>.<genexpr>  s8      
afJubjj)\2OPUP[P[2\.\\
s   <>c                     t        | t        j                  t        j                  f      r| j                         S t        |       S r6   )r   r7   r   r  r  tolistr  r  s    r>   to_listz%TestCase.assertEqual.<locals>.to_list  s0    )3EELL"**;U)Vu||~g\`af\ggr?   r  )
pair_typessequence_typesmapping_typesr  r  r  r  r  check_devicer  check_layoutcheck_stridecheck_is_coalescedr   c                     |  d S )Nrt  rF   )generated_msgr  s    r>   rI   z&TestCase.assertEqual.<locals>.<lambda>1  s    -3%'@ r?   )(r  r   r7   r   r   	as_tensorrE  rG  	is_nestedr  rL  unbindr/   r+   r  r  r  r  r  r  r  r  r%   r"   r$   r   r  r  datasetSubsetr   r!   r#   r   r9  r3  r  to_errorrm   longMessage)r   r   rn  r  r  r  r  r  r  r  r  r  __tracebackhide__r  error_metass      `           r>   r  zTestCase.assertEqual  s   " !  
klnojp
 
h 
A
A 5<<(Z8-DBA8$Au||)DBA a&1;;188u}};T
Aa&1;;188u}};T
A+"!! 
   ((// #JzJ,,..%#%%1A!
F &-K//#A&// FPPSUXEY^b^n^n@	  ux	 	 r?   r  r  c                    | j                  t        |      5   | j                  |||f||d| d d d        y # 1 sw Y   y xY w)Nr$  r  )assertRaisesr	  r  )r   r   rn  r  r  r  r=   s          r>   assertNotEqualzTestCase.assertNotEqual4  sN    ~37 	HDQ3GTGG	H 	H 	Hs	   :Ac                     | j                  |j                  |j                         | j                  |j                  |j                         | j                  |j                  |j                         y r6   )r  rG  rE  	is_sparse)r   r   rn  s      r>   assertEqualTypeStringzTestCase.assertEqualTypeString9  sJ    188,!''*akk2r?   r#  r>  c                 X    |D ]  }t        |      t        |      k(  s y  t        d      )Nzobject not found in iterable)r   r	  )r   r#  r>  elems       r>   assertObjectInzTestCase.assertObjectIn?  s2     	D#w"T("	 ;<<r?   c                     | j                   r"t        ||       }	 |j                  d||      d }S t        |   |g|i |S # d }w xY w)Nr  )rK  r  handlerE  r  )r   expected_exceptionr<   r=   contextrF  s        r>   r  zTestCase.assertRaisesG  s]    --<=OQUV ~~ndFC 7'(:LTLVLL s   A Ac                     t        | d      r#| j                  t        vr| j                  dk7  rd}| j                  r t	        || |      }|j                  d||      S t        |   ||g|i |S )NrI  mpsr   assertRaisesRegex)r   rI  NATIVE_DEVICESrK  r  r  rE  r  )r   r  expected_regexr<   r=   r  rF  s         r>   r  zTestCase.assertRaisesRegexU  s}     4'D,<,<N,RW[WgWgkpWpN--B"D.:G>>"5tVDD7,-?aRVaZ`aar?   c                 h   d fd}t        j                         }t        j                          	 t        j                  j                  d|      5   ||i | d d d        |rt        j                          	 | j                         y # 1 sw Y   2xY w# |rt        j                          w w xY w)Nc                 
    | y r6   rF   )
unraisableraiseds    r>   record_unraisablez6TestCase.assertNoUnraisable.<locals>.record_unraisableo  s    Fr?   zsys.unraisablehook)r   	isenabledr  r   r  r  r  assertIsNone)r   r  r<   r=   r  prevr  s         @r>   assertNoUnraisablezTestCase.assertNoUnraisablel  s    	  ||~


	$$%9;LM *$)&)* 		&!* * 		 s#    B 	BB BB B1c                     d }d|v r|d   }|d= 	  ||i | | j                  d       y # |$ r%}| j                  t        |      |       Y d }~y d }~ww xY w)Nsubnamern  r$  )assertExpectedrm   rp  )r   ro  r  r<   r=   r  rp  s          r>   assertExpectedRaiseszTestCase.assertExpectedRaises  sm    Y'Gy!	d%f%
 			6	7	  	A0	s   + AAAc                    t        j                  d      5 }t        j                  d       t        d      5   |        ddd       | j	                  t        |      dk(  |       ddd       y# 1 sw Y   0xY w# 1 sw Y   yxY w)zD
        Test if :attr:`callable` does not raise a warning.
        TrecordalwaysNr   )r^  r  r  r$  rw  ra  )r   r  r  wss       r>   assertNotWarnzTestCase.assertNotWarn  st     $$D1 	/R!!(+(. 
OOCGqL#.		/ 	/ 	/ 	/s"   !A;A/ &A;/A8	4A;;Bc              #   B  K   t        j                  |      t        j                  d      5 }t        j                  d       t        d      5  d ddd       t        |      dk(  r| j                  d       | j                  t        fd|D                     | j                  t        fd|D               d	|D cg c]&  }t        |j                        u s|j                  ( c}        ddd       y# 1 sw Y   xY wc c}w # 1 sw Y   yxY ww)
zContext manager for code that *must always* warn

        This filters expected warnings from the test and fails if
        the expected warning is not caught. It uses set_warn_always() to force
        TORCH_WARN_ONCE to behave like TORCH_WARN
        Tr  r  Nr   zno warning caughtc              3   L   K   | ]  }t        |j                        u   y wr6   )rH  r  )r   wcategorys     r>   r   z0TestCase.assertWarnsOnceRegex.<locals>.<genexpr>  s     HQYY8 ;Hs   !$c              3   p   K   | ]-  }t        j                  t        |j                               / y wr6   )r  r  rm   r  )r   r  r@  s     r>   r   z0TestCase.assertWarnsOnceRegex.<locals>.<genexpr>  s$     B!BHHWc!))n5Bs   36r  )r  rY  r^  r  r  r$  ra  rp  rw  r  rH  r  )r   r  regexr  r  r@  s    `   @r>   assertWarnsOnceRegexzTestCase.assertWarnsOnceRegex  s      **U#$$D1 		XR!!(+(. 2w!|		-.OOCHRHHIOOBrBB)2"TQQYY88SqyyTUVX		X 		X  U		X 		XsG   ,D!DDA/DD"D0	D9	DD	DDDc                   
 t        t              st        d      d }| j                  j                  } || j                         |dz         t        j                  j                  t        j                  |   j                        }t        j                  j                  t        j                  j                  |      d      
d|r
d|z   z  
d| d
d	z  
d
}
fd}	 t        
      5 }|j                         }d
d
d
       t.        r.t1        j2                  dd|      }t1        j2                  dd      |j5                  ddt6        j8                  j:                   d      }t&        j(                  r|k7  r |d      S y
t=        | d      r| j?                  |       y
| jA                  |       y
# 1 sw Y   xY w# t         $ ri}	|	j"                  t"        j$                  k7  r t&        j(                  r |d      cY d
}	~	S t+        d  d dt,        j                   d d
      d
d
}	~	ww xY w)a  
        Test that a string matches the recorded contents of a file
        derived from the name of this test and subname.  This file
        is placed in the 'expect' directory in the same directory
        as the test script. You can automatically update the recorded test
        output using --accept.

        If you call this multiple times in a single function, you must
        give a unique subname each time.
        zassertExpected is strings onlyc                 D    | j                  |      r| t        |      d  S | S r6   )r  ra  )textprefixs     r>   remove_prefixz.TestCase.assertExpected.<locals>.remove_prefix  s$    v&CKL))Kr?   r   ri  r   r
  z (r  z.expectNc           	          t        d|  d  d        t        d      5 }t        j                  dd      }|j	                  |       d d d        y # 1 sw Y   y xY w)Nz
Accepting r  :

r  z(producer_version): "[0-9.]*"z\1: "CURRENT_VERSION")r  r   r  rf  r"  )update_typer  s_tagexpected_file	munged_idrA  subname_outputs      r>   accept_outputz.TestCase.assertExpected.<locals>.accept_output  sg    J{m5N;K5QRPSTUmS) Q?7<	  s   )AArV  zI got this output for r  zC

No expect file exists; to accept the current output, run:
python rb   z	 --acceptzCppOp\[(.+?)\]zCppOp[]z#producer_version: "CURRENT_VERSION"zproducer_version: "r_  zupdated outputassertMultiLineEqual)!r   rm   r;  rF  rh   r   rO   r   realpathr  modulesr  rd   dirnamer   r  r  errnoENOENT
expecttestr  r  r  ry  r  rf  rK  r7   onnxproducer_versionr   r  r  )r   rA  r  r  	module_id	test_filer  r  r  rp  r   r  r  s    `        @@@r>   r  zTestCase.assertExpected  s$    !S!<==	 NN--	!$'')Y_=	GG$$S[[%;%D%DE	RWW__Y%?%-%.0 S7]*M!'!_N"		Tm$ $668$ vv/HEH()Q7A ##1!%**"="=!>a@
 1}$%566  t34 ))(A6  H-A$ $ 		Tww%,,&""$X..".yk.9Iqc R  ( 1 12!I;iIJ PTT		Ts<   -G 8G	G GG 	I5H<I)H<<Ic                 V    t        j                  dd|      }| j                  ||       y )Nz__torch__[^ ]+r   )r  rf  r  )r   rA  r  s      r>   assertExpectedStripMangledz#TestCase.assertExpectedStripMangled  s%    FF$b!,Aw'r?   c                     ||t        d      ||k\  ry||z
  }|||k  ry| d| d| d}n|d}t        ||      dk(  ry| d| d| d}| j                  ||      }| j                  |      )	zAssert that ``first`` is greater than or almost equal to ``second``.

        The equality of ``first`` and ``second`` is determined in a similar way to
        the ``assertAlmostEqual`` function of the standard library.
        Nz specify delta or places not bothz not greater than or equal to z within z deltaru  r   z places)r;  round_formatMessager  )r   firstsecondplacesr  deltadiffstandardMsgs           r>   assertGreaterAlmostEqualz!TestCase.assertGreaterAlmostEqual  s     !3>??F?~u}"G#A&RWQXX^_K~T6"a'"G#A&RXQYY`aK!!#{3##C((r?   c                    |j                   j                  D cg c]"  }|j                  dk(  r|j                  dk(  r|$ }}| j	                  |       |D ]T  }|j
                  D ci c]'  }|j                  |j                  j                         ) }}|j                  d      |k(  sT n | j                  d   |       | j                  |j                  dd      |       y c c}w c c}w )NATenzorg.pytorch.atenr   overload_namer   )graphnodeop_typedomainrw  	attributerR   rA  decoder  r  )	r   
onnx_modelr   r  r  all_aten_nodesopattrattrss	            r>   assertAtenOpzTestCase.assertAtenOp   s    %/%5%5%:%: UYY&0QXXAS5S  U U'  	B<>LLIDTYY/IEIyy$0	
 	z*H5?B7GU
 Js   'C$&,C)c                     d|z   dz   }t        d      5  |r)| j                  t        |d      5   |        ddd       n	  |        ddd       t        dd
      5  |r'| j                  t        |      5   |        ddd       nt        j                  d      5 }t        j                  d        |        |D ]C  }t        |t              s| j                  t        j                  |t        |            du        E 	 ddd       ddd       y# 1 sw Y   xY w# t        $ r3}dt        |      v r | j	                  dt        |      z   d	z           d}~ww xY w# 1 sw Y   xY w# 1 sw Y   jxY w# 1 sw Y   vxY w# 1 sw Y   yxY w)a  Checks that an operation produces a nondeterministic alert when
        expected while `torch.use_deterministic_algorithms(True)` is set.

        Args:
          fn (callable): Function to check for a nondeterministic alert

          caller_name (str): Name of the operation that produces the
              nondeterministic alert. This name is expected to appear at the
              beginning of the error/warning message.

          should_alert (bool, optional): If True, then the check will only pass
              if calling `fn` produces a nondeterministic error/warning with the
              expected message. If False, then the check will only pass if
              calling `fn` does not produce an error. Default: `True`.
        ^z: does not have a deterministic implementation, but you setTz9expected a non-deterministic error, but it was not raisedr$  Nz,does not have a deterministic implementationzEdid not expect non-deterministic error message, but got one anyway: "r_  r  r  r  )r  r  r  rm   rp  assertWarnsRegexr  r^  r  r  r   rw  r  r   )r   r   caller_nameshould_alertalert_messagerp  r  r   s           r>   check_nondeterministic_alertz%TestCase.check_nondeterministic_alert-  s   " k),hh  % 	++$%W , Y  D	 D	,  5 	\**#%'  D 
 ,,D9 \Q))(3D#$ \%g{; OOBIImS\,RVZ,Z[\\	\ 	\)  $ EQO		68;A?ADEF 	 	0 
\ \	\ 	\s   ED	ED F6E,>F2E82E8FD	E 	E).EEEE),E5	1F8F	=FFc                     dd l } |j                  t        j                  d| g|j                  |j                  |      }|j                         \  }}||fS )Nr   z-c)r  r  r  )r  r  r  rg  PIPEcommunicate)coder  r  popenr  r  s         r>   run_process_no_exceptionz!TestCase.run_process_no_exceptionf  sV     
  ^^T4(????	
 !,,.r?   c                     t         j                  j                         }d|d<   |j                  dd        |j                  dd        t        j                  | |      \  }}|j                  d      S )NrE   PYTORCH_API_USAGE_STDERRrp   TEST_SHOWLOCALS)r  r  )rO   r  r  r  r   r6  r#  )r4  r  r  r  s       r>   runWithPytorchAPIUsageStderrz%TestCase.runWithPytorchAPIUsageStderrs  se    jjoo*-&' 	d!4(#<<Ts<K}}W%%r?   )r<  r<  r6   )r   FFr7  )NNNNNTTTTTFTNr5  )r   )NNNT)Nrg   rh   ri   r)  rJ  rk   r*  r+  rr   r  maxsize_diffThresholdmaxDiffr0  propertyr3  setterr9  r  r  rK  r   rI  rJ  r\  rc  re  rh  rq  rv  r{  rH  rL  r  r  r  r  r  r  rl   r  r  r  r  r  r  r0  r  r  r  r  r  r  r   r   rm   r   r  r  r  r   r   r  r  r  r  r  r  r   r  r  r  r  r)  r0  r6  r:  rS  rT  s   @r>   r   r   
  s<    JHe */ $. [[NG 5   e       ^^E d   "'"' %*!5Kn/&*)
)r  >B
81
3

ZV/Sxv8,:$ 48K. K.Z egst ,l\ WX y WX p bc @
 bc @
<: '+%)+/*.26,0-115=A<@9>-1(,P9d
I  /3 <DD
	7 ?C	Y %)$($Y %XseSj%9 9:;	Y 5/Y 5/YvH/3TH H%e_H;CE?H`dH
3=# =# =4 =
Mb.".8/ X X&N.`()<H6\r 	  	  & &r?   r   c                       e Zd Zy)TestCaseBaseNrg   rh   ri   rF   r?   r>   rB  rB    s    
 	r?   rB  c                    ddl m} ddlm}m} t
        j                  j                   ||       d         }t        t
        j                  j                  t
        j                  j                  t              d            }t
        j                  j                  ||      }t
        j                  j                  |      r|S 	 |j                  | d      j                         }t        ||rdnd	      5 }	|	j!                  |       d d d        |S # 1 sw Y   |S xY w# |j"                  $ r;}
d
|  d}t%        j&                  |t(               t+        j,                  |      |
d }
~
ww xY w)Nr   )urlsplit)requestr  r   r     r  wbr  zcould not download test file 'rM   )urllib.parserE  urllibrF  r  rO   r   basenamer    rd   r  r  r\  urlopenr  r   r"  URLErrorr^  r_  RuntimeWarningr   r  )urlbinaryrE  rF  r  r   data_dirr   r  r  rp  r  s               r>   download_filerR    s   %%wwa 01H bggooh.G!PQH77<<(+D	ww~~d,sB/446$C0 	AGGDM		>> ,.se15c>*$!+,s6   1D 4D	D DD D E',6E""E'c                  N   t        t        j                  t        j                  t        j                              5 } | j	                  t        j
                  t        j                  d       | j                  d       | j                         \  }}|cddd       S # 1 sw Y   yxY w)a  
    Finds an available port and returns that port number.

    NOTE: If this function is being used to allocate a port to Store (or
    indirectly via init_process_group or init_rpc), it should be used
    in conjuction with the `retry_on_connect_failures` decorator as there is a potential
    race condition where the allocated port may become unavailable before it can be used
    r^  )	localhostr   N)	r   socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindgetsockname)sockrt   ports      r>   find_free_portr_    sv     
v~~v/A/AB	C t))6+>+>B		"#""$4	  s   ABB$zAddress already in usezconnect() timed out.c                 X      t        t              S t                fd       }|S )zuReruns a test if the test returns a RuntimeError and the exception
    contains one of the strings in connect_errors.)connect_errorsc            	         d}|}	 	  | i |S # t         $ rkt        fdD              rQ|dz  }|dk(  rt        d| dt                     t        j                  t        j
                                Y d x d ww xY w)Nr  c              3   8   K   | ]  }|t              v   y wr6   )rm   )r   connect_errorr  s     r>   r   z=retry_on_connect_failures.<locals>.wrapper.<locals>.<genexpr>  s     W}}E
2Ws   r^  r   zFailing after z retries with error: )r  r  rm   timesleepr+  )r<   r=   	n_retriestries_remainingr  ra  r  s       @r>   r   z*retry_on_connect_failures.<locals>.wrapper  s    	#	T,V,, WWW#q(O&!+*^I;F[\_`e\f[g+hiottJJv}}/s    	BA B ?B  B)r
   retry_on_connect_failuresr   )r  ra  r   s   `` r>   ri  ri    s5     |0PP
4[  Nr?   c                       fd}|S )Nc                 8     t                fd       }|S )Nc            	      B   
}}|dkD  r		  | i |S 	  | i |S # $ r?}dt        |      |fz  }t        |       t        j                  |       |dz  }Y d }~nd }~ww xY w|dkD  r_W# $ r.}t	        j
                  d
 dt        |             	r||d }~ww xY w)Nr^  z%s, Retrying in %d seconds...zSkipping after z consecutive )rm   r  re  rf  r   r  )r<   r=   mtriesmdelayrp  r  ExceptionToCheckdelayr  skip_after_retriestriess         r>   f_retryz*retry.<locals>.deco_retry.<locals>.f_retry  s    "EFF1* d-f--|$)&)) (  9SVV<LLC#JJJv&aKF	  1* $ |''/%cRSfX(VWbt]^{z{{|s+    A+ A!5AA!+B0)BBr  )r  rs  ro  rp  rq  rr  s   ` r>   
deco_retryzretry.<locals>.deco_retry  s"    	q	| 
	| r?   rF   )ro  rr  rp  rq  rt  s   ```` r>   retryru    s    " r?   c                 *   || k  sJ t        j                  | | ||      }t         j                  j                  |d      \  }}}t	        |       D ]  }||k\  rd||<   ||   dk(  sd||<    ||j                  |      j                  d      z  |z  S )Nr  Ffull_matricesr   r^  r  )r7   randnlinalgsvdr  r  r"  )	lrankrE  rG  AurA  vhr  s	            r>   random_square_matrix_of_rankr    s    199Aqf5A||7HAq"1X 9AaDqTQYAaD	
 U%%b))R//r?         ?gMbP?)r   sigmac                    t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  t         j                  i}t        j
                  || |      }|j                  d      }|j                  d      }t         j                  j                  |d      \  }	}
}t        j                  |dd t        ||      fz   ||    |d|z  |z   j                  dd      j                  j                  |       }|	|j                  d      z  |z  S )	z
    Returns a random rectangular matrix (batch of matrices)
    with singular values sampled from a Gaussian with
    mean `mean` and standard deviation `sigma`.
    The smaller the `sigma`, the better conditioned
    the output matrix is.
    r  r  r[  Frw  NT)
descending)r7   rJ  doublecfloatcdoubler   r!  rz  r{  ry  minr  rP  r  r"  )rE  rG  r   r  r>  primitive_dtyper   r  rk  r  rt   r  rA  s                r>   random_well_conditioned_matrixr    s     	U[[ellekku||	O 	

5f5A	r
A	r
A||7HAq"	uSbzSAYL09OX^	_bg	gjn	n	bT	"66""U) B2%%r?   c                    | j                         s| S | j                  j                  s| j                  j                  rt        j
                  }n"| j                  t        j                  k(  rd}nd}| j                  | j                  dz         }||d<   | j                         |d<   |d   }|j                  | j                         |S )NTr  rq  ).r   ).r^  )rx  rE  is_floating_point
is_complexr  nanr7   rr   	new_emptyr>  r(  requires_grad_r  )r$  r^   rn  s      r>   noncontiguous_liker    s    ?? 	ww  AGG$6$6	
EJJ	[[4(FF6NXXZF6NF^F
!//*Mr?   c                     |j                  dt        j                        }|j                  dd      }t        j                  || | fz   ||d}||j                  z   j                  d      }|S NrE  rG  r   r  r   )r  r7   r  ry  mTdiv_r|  batchesr=   rE  rG  r~  s         r>   random_symmetric_matrixr    \    JJw-EZZ%(FgA&uVDA	
QTTAHr?   c                 x    |d   |d   k(  sJ t        || |      }||j                  z   j                  d      }|S )Nr[  r  r  r   )r)   r  r  )rG  rE  r>  r$  s       r>   make_symmetric_matricesr  $  sA    9b	!!!E&6A	
QTTAHr?   c                     |j                  dt        j                        }|j                  dd      }t        j                  || | fz   ||d}||j                  z   j                  d      }|S r  )r  r7   r  ry  mHr  r  s         r>   random_hermitian_matrixr  *  r  r?   c                     |j                  dt        j                        }|j                  dd      }t        j                  || | fz   ||d}||j                  z  S )a[  
    Returns a batch of random symmetric positive-semi-definite matrices.
    The shape of the result is batch_dims + (matrix_size, matrix_size)
    The following example creates a tensor of size 2 x 4 x 3 x 3
    >>> # xdoctest: +SKIP("undefined variables")
    >>> matrices = random_symmetric_psd_matrix(3, 2, 4, dtype=dtype, device=device)
    rE  rG  r   r  )r  r7   r  ry  r  r  s         r>   random_symmetric_psd_matrixr  2  sP     JJw-EZZ%(FgA&uVDAqtt8Or?   r  c                V    t        j                  || | fz   ||d}||j                  z  S )a[  
    Returns a batch of random Hermitian positive-semi-definite matrices.
    The shape of the result is batch_dims + (matrix_size, matrix_size)
    The following example creates a tensor of size 2 x 4 x 3 x 3
    >>> # xdoctest: +SKIP("undefined variables")
    >>> matrices = random_hermitian_psd_matrix(3, 2, 4, dtype=dtype, device=device)
    r  )r7   ry  r  matrix_sizerE  rG  
batch_dimsr~  s        r>   random_hermitian_psd_matrixr  @  s.     	jK#==eTZ[Aqtt8Or?   c                    |j                  dt        j                        }|j                  dd      }t        j                  || | fz   ||d}t        j                  ||j
                        t        j                  | ||      dz  z   S )NrE  rG  r   r  h㈵>)r  r7   r  ry  matmulr  eye)r  r  r=   rE  rG  r~  s         r>   random_symmetric_pd_matrixr  M  sx    JJw-EZZ%(FjK#==	0A<<144 
))KuV
<t
CD Dr?   c                     |d   |d   k(  sJ t        || |      }t        j                  |d   | |      dz  }||j                  z  |z   S )Nr[  r  r  r  )r)   r7   r  r  )rG  rE  r>  r$  r  s        r>   make_symmetric_pd_matricesr  X  sS    9b	!!!E&6A		%)F%84?Aqtt8a<r?   c                    t        j                  || | fz   ||d}||j                  z  t        j                  | ||      z   S )aU  
    Returns a batch of random Hermitian positive-definite matrices.
    The shape of the result is batch_dims + (matrix_size, matrix_size)
    The following example creates a tensor of size 2 x 4 x 3 x 3
    >>> # xdoctest: +SKIP("undefined variables")
    >>> matrices = random_hermitian_pd_matrix(3, 2, 4, dtype=dtype, device=device)
    r  )r7   ry  r  r  r  s        r>   random_hermitian_pd_matrixr  ^  sC     	jK#==	0Aqtt8eii5HHHr?   )r  c                 L   t        j                         5  t        || |      }t         j                  j	                  |d      \  }}}|j
                  j                  r|j                  j
                  n|j
                  }t        |d   |d         }	t        j                  d|	dz   ||       }
|
dd dxx   d	z  cc<   |
j                         j                  d
       ||
j                  |j
                        z  |z  }d d d        j                  |       |S # 1 sw Y   xY w)Nr  Frw  r[  r  r   r  r^  g      r  )r7   r  r)   rz  r{  rE  r  realr  r  reciprocal_rj  r  r  )rG  rE  r  r>  r$  r  rt   r  
real_dtyper  rA  r   s               r>   4make_fullrank_matrices_with_distinct_singular_valuesr  l  s    	 %fE:<<##AU#;1b%&WW%7%7QVV\\QWW
b	59% LLAEFC	!$Q$3 	
R  agg"$!%" ]#H%% %s   C*DD#c                 t   |j                  dt        j                        }|j                  dd      }|j                  dd      }|j                  dd      }|r3t        j                  j                  st        j
                  | |||      S t        j                  || |fz   ||      }|j                         dk(  r|S t        j                  j                  |d	      \  }	}
}t        | |      }t        j                  d
|d
z   z  d
|||      }|rd||d
z
  <   |dkD  rd|d<   |	|j                  d      z  |z  S )zReturn rectangular matrix or batches of rectangular matrices.

    Parameters:
      dtype - the data type
      device - the device kind
      singular - when True, the output will be singular
    rE  rG  r   silentFsingularr  r   rw  r^  r   r  )r  r7   r  rx  r  onesry  r  rz  r{  r  linspacer"  )rowscolumnsr  r=   rE  rG  r  r  r~  r  rt   r  r  rA  s                 r>   random_matrixr    s    JJw-EZZ%(FZZ%(Fzz*e,Hehh))zz$uVDDJ$0fMAwwyA~||7HAq"D'AqAE{AqfEA!a%q5 AaDB2%%r?   c                 d    t        || g|i |}t        | |g|i |}|j                  |      S )zVReturn rectangular matrix or batches of rectangular matrices with
    given rank.
    )r  r  )r}  r  r  r  r=   BCs          r>   random_lowrank_matrixr    s>     	dD8:88AdG;j;F;A88A;r?   r  colsnum_indicesc                    g }t        j                  || z        }t        t        |            }t        |       D ]1  }t	        j
                  ||      D ]  }|j                  ||f        3 t        j                  |d|       S )z\Generate indices for a row x cols matrix, preferring at least one index per row if possible.)r  N)	r  ceilr  r  r+  choicesr.  r7   r2  )r  r  r  rM  	n_per_rowrO  r  rM  s           r>   !_generate_indices_prefer_all_rowsr    s}    G		+,-IuT{#K4[ #y9 	#ANNAq6"	##
 <<-..r?   {Gz?c                    |j                  dt        j                        }|j                  dd      }t        t	        | |      t        | |z  |z              }t        | ||      }t        j                  |||      }|t        j                  |D 	
cg c]  \  }	}
t        |	|
z
        dz    c}
}	||      j                         z  }t        j                  |j                         || |f|      }|j                         S c c}
}	w )a4  Return rectangular random sparse matrix within given density.

    The density of the result approaches to given density as the size
    of the matrix is increased and a relatively small value of density
    is specified but higher than min(rows, columns)/(rows * columns)
    for non-singular matrices.
    rE  rG  r   r  r   rE  )r  r7   r  r  r  r   r  ry  r2  rJ  expr%  r$  r'  )r  r  densityr=   rE  rG  nonzero_elementsrM  rP  r  rb  r~  s               r>   random_sparse_matrixr    s     JJw-EZZ%(F3tW-s4'>G3K/LM/g?OPG[[)vFF ellAAU1q5\1_,AW]^bbddF		VdG_VTA::< Bs   Dc           	         ddl }|j                  dt               d         }|j                  d|j                        }|j                  dd      }t	        |       D ci c]  }||ft        |dz         | z   }}dd	}	|| z  | z  }
t        |      |
k  rt        j                  d| dz
        }t        j                  d| dz
        }||k7  ret        j                  dd
|j                  z        } |j                  |      } |j                  |      } |	|| ||||d        |	|| ||||d       t        |      |
k  rg g g }}}t        |j                               D ];  \  \  }}}|j                  |       |j                  |       |j                  |       =  |j                   ||g      } |j"                  ||| | f||      S c c}w )a  Return random sparse positive-definite matrix with given density.

    The eigenvalues of the matrix are defined as::
      arange(1, matrix_size+1)/matrix_size

    Algorithm:
      A = diag(arange(1, matrix_size+1)/matrix_size)
      while <A density is smaller than required>:
          <choose random i, j in range(matrix_size), theta in [0, 2*pi]>
          R = <rotation matrix (i,j,theta)>
          A = R^T A R
    r   Nr7   rE  rG  r   r^  Tc                 (   t        |      D ]  }|r	||f||f}	}n||f||f}	}| j                  |d      | j                  |	d      }}
||
z  ||z  z   | |
z  ||z  z   }}
|
r|
| |<   n| j                  |d        |r|| |	<   s| j                  |	d         y r^  )r  r  r  )r  r  r  rb  cssnleftr  ikjkaikajks               r>   multiplyz)random_sparse_pd_matrix.<locals>.multiply  s    q 	#AQ!QBQ!QBxxAQCCx"s(*RC#IS,@CRT"RT"	#r?   r   )r  Fr  r;  )r  r  rQ   r  r  rJ  ra  r+  randintuniformpicossinsortedre   r.  r2  r%  )r  r  r=   r  r7   rE  rG  r  r  r  
target_nnzrb  thetar  r  icoordsjcoordsrP  rR  indices_tensors                       r>   random_sparse_pd_matrixr    s    JJw	' 23EJJw-EZZ%(F;') FE!a%L;.. )D )#" ;&4J
d)j
 NN1kAo.NN1kAo.6NN1a$''k2E%B%BT;1b"4@T;1b"5A d)j
   "2rfWGDJJL) 	Aqqa "U\\7G"45N"5"">6K;U]bkqrrK)s   G	c                    |D ]  }|t         j                  k7  st        j                  d|||      }| j                  ||j                         | j                  ||j
                         | j                  ||j                          y )Nrs  )rE  r  rG  )r7   float16r  assertIsrE  r  r  rG  )r   dtypesr  rG  rE  outs         r>   do_test_dtypesr    si     1EMM!++fE&PCMM%+MM&#**-VSZZ01r?   c                     t        j                  ddg       fd}d }t        j                         } |t        j                        |t         j                  dd d        |t        j
                  d      |t         j                  dd d       |D ](  }|j                  dhD ]  } ||      }	t        j                  ||||      }
 ||
|||d |       |
j                         } |t        j                  ||||	      |||d |        ||
j                        |||d d        ||
j                  |	|d
      |	||d d        |t        j                  |
      |||d d        |t        j                  |
|	||d      |	||d d       |t         j                  us|t         j                  k7  sd}t        j
                  |||||      }
 ||
|||||        ||
j                  |dz         ||||dz   d       |
j                         } |t        j
                  |dz   ||||	      ||||dz   |        ||
j                  |dz   |	|d
      |	|||dz   d        |t        j                  |
|dz         ||||dz   d        |t        j                  |
|dz   |	||d      |	|||dz   d        + y )Nr   rr  c                    j                  | j                         j                  || j                         j                  || j                         j                  | j
                  |       | j                  r|j                  || j                         |3| j                        j                  |      }j                  | |       y y r6   )
r  r>  r  rE  r  r  is_cudarG  r  r  )	r2  rE  r  rG  r^   r  fillr   r>  s	          r>   check_valuez'do_test_empty_full.<locals>.check_value  s    -eV\\*ffmm,--}=>>f0VV]]3::e$**51DVT* r?   c                     dj                  t        |       j                  d      dd       }|st        j                  S  t        j                  |      t              j                  S )Nr   r^  r[  )rd   rm   r   r7   r  r   
attrgetter)rE  modules     r>   get_int64_dtypez+do_test_empty_full.<locals>.get_int64_dtype  sQ    #e***3/"56;;*x""6*51777r?   r[  Fg      )rE  rG  r  r  )r  rG  r  r  )rE  rG  r  )rE  r  rG  r  r^  r   r  )r7   r&  r-  r  rL  rc  r  r  r  
empty_liker  rK  new_full	full_like)r   r  r  rG  r  r  default_dtyperE  rgint64_dtyperR  r  fvr>  s   `            @r>   do_test_empty_fullr    s   JJ1vE	+8 ++-ME"M5=="dER

5#&u}}b$PUV H**E2 	HB)%0KEvf\^_A5&&$;%%'CEs6&`bcvvtR9E*E664OEV[`a#VVT5B((+UFFD%P((+fU[kpq#VVT5B EMM)f8H8H.HJJubfVcefAuffb"=AJJub1f5uffbSTfV[\eegEJJub1f#fU[kmn!66262?AJJub1fKPVfkJl'aHEOOArAv6vvrTUvW\]EOOArAv2=fU[kpr'aH3	HHr?   c                      	 t         j                  j                  t         j                  j                  t        j
                  d               } | j                  d      r| ay y # t        $ r Y y w xY w)Nr   r  )	rO   r   rM  r  r  r  endswithrunning_script_pathr   )running_files    r>   set_running_script_pathr  E  s[    wwrww'7'7'DE  '". ( s   A A$ $	A0/A0c                    t         y t        j                  j                  t        j                  j	                  t        j                  | j                                    }|t         k(  s#J d| j                          dt          d| d       y )NzClass of loaded TestCase "z(" is not defined in the running script "z", but in "zE". Did you accidentally import a unittest.TestCase from another file?)	r  rO   r   rM  r  r   rN  rF  r   )r  test_case_class_files     r>   $check_test_defined_in_running_scriptr  N  s    "77??277+;+;GOOIL_L_<`+ab#66 E:TU^UaUaUcTd e11D0E[QePf gE9E E6r?   c                     t                t        j                         }|D ]8  }t        s|D ]  }t	        |        |j
                  s(|j                  |       : |S r6   )r  r   r  r   r  r   addTest)loaderr,  r@  
test_suite
test_groupr   s         r>   
load_testsr  V  s^    ##%J +
)" ;4T:;z*+ r?   c                       e Zd Zd Zd Zy)BytesIOContextc                     | S r6   rF   r   s    r>   r  zBytesIOContext.__enter__c  r   r?   c                      y r6   rF   )r   r<   s     r>   r  zBytesIOContext.__exit__f  s    r?   NrW  rF   r?   r>   r
  r
  b  s    r?   r
  g-q=TEST_WITH_SLOW_GRADCHECK PYTORCH_TEST_WITH_SLOW_GRADCHECKzETests that don't use gradcheck don't need to run on slow_gradcheck CIc                     ddd}t         rd|d<   |j                         D ]   \  }}|j                  |d       }||n|||<   " t        j                  j
                  | |fi |S NT)check_batched_grad	fast_modeFr  )r  re   r  r7   autograd	gradcheck)r   inputsr=   default_valuesr  r^   r  s          r>   r  r  {  sy     #N
  &+{#$**, 4
UJJsD!=aes4
 >>##B9&99r?   c                     ddd}t         rd|d<   |j                         D ]   \  }}|j                  |d       }||n|||<   " t        j                  j
                  | ||fi |S r  )r  re   r  r7   r  gradgradcheck)r   r  grad_outputsr=   r  r  r^   r  s           r>   r  r    s{     #N
  &+{#$**, 4
UJJsD!=aes4
 >>''FLKFKKr?   c                 t    | j                  t        ||fi |       | j                  t        ||fi |       y r6   )rw  r  r  )r  apply_fnr  r=   s       r>   _assertGradAndGradgradChecksr    s8     8V>v>?xB6BCr?   r   c              #      K   t        j                         }	 t        j                  |        d  t        j                  |       y # t        j                  |       w xY wwr6   )rO   getcwdchdir)r   old_cwds     r>   set_cwdr!    s<     iikG

s   A!A A!AA!r  g?c                 .     t                fd       }|S )Nc                 F     | g|i |ddi  | g|i |ddi y )N	coalescedTFrF   )r   r<   r=   r  s      r>   r  zcoalescedonoff.<locals>.wrapped  s1    	$00040	$11151r?   r  )r  r  s   ` r>   coalescedonoffr%    s     
1X2 2 Nr?   c                 
   | j                         }d| j                  | j                         dz
  dd   z   }t        j                  || j
                        j                  d      j                  d      }| j                         dkD  r&|j                  d       ||z  j                  d      }n||z  }t        j                  ||j                         d         }|xr$ t        j                  ||j                               }|S )N)r^  r^  r   r[  rE  )r*  r>  r  r7   r2  rG  cumprodflip
unsqueeze_sumallcloser  unique)rA  rM  hash_coeffshash_indicesr%  s        r>   is_coalesced_indicesr/    s    jjlG!!3Ab!899K<<AHH=EEbINNrRL||~#,.33A6- ..|'8'8':1'=
>C 
E%..|/B/B/DECJr?   c               #      K   t        j                         r.	 t        j                          d  t        j                          y d  y # t        j                          w xY wwr6   )r   r  r  r  rF   r?   r>   
disable_gcr1    s8     	||~	JJLIIK IIKs   A#A
 A#
A  A#lib_namec                 B   t        t        j                        j                         j                  }|dz  | z  }t
        j                  j                  |      r|S t        t              j                         j                  j                  j                  }|dz  dz  | z  S )Nlibbuild)r   r7   r  resolveparentrO   r   r\  )r2  
torch_rootr   s      r>   find_library_locationr9    s~     enn%--/66J(D	ww~~dh'')0077>>J%'(22r?   c                       fd}|S )z
    Similar to unittest.skip, however in the sandcastle environment it just
    "passes" the test instead to avoid creating tasks complaining about tests
    skipping continuously.
    c                 ^     t         sd _         _         S t                fd       }|S )NTc                  \    t        dj                   d t        j                         y Nz	Skipping z% on sandcastle for following reason: r-  r  rg   r  r  r<   r=   r  rL  s     r>   r   z?skip_but_pass_in_sandcastle.<locals>.decorator.<locals>.wrapper  s+    Idmm_,QRXQYZadakaklr?   )ru   r  r  r   )r  r   rL  s   ` r>   r/  z.skip_but_pass_in_sandcastle.<locals>.decorator  s8    %)D")/D&K	t	 
	 r?   rF   )rL  r/  s   ` r>   skip_but_pass_in_sandcastler@    s    
 r?   c                 T     t               t                fd       }|_        |S )z}
    Returns a function that calls the real implementation of a method
    in addition to passing args to a mock object.
    c                 ,     |i |  | g|i |S r6   rF   )r   r<   r=   r  r  s      r>   r   zmock_wrapper.<locals>.wrapper  s%    dfd,T,V,,r?   )r   r   r  )r  r   r  s   ` @r>   mock_wrapperrC    s0    
 ;D
6]- - GLNr?   c           
          t        | D cg c]  }t        |t              s| c}|j                         D cg c]  }t        |t              s| c}z         S c c}w c c}w )zC Returns a set of all Tensor objects in the given args and kwargs. )r  r   r   rP  )r<   r=   r:  rR  s       r>   get_tensors_fromrE    sP    t?z#v'>?!==?DajF.CDE F F?Ds   AAA 
A 
	byte_listrE  rG  c                 ,   t         j                  t        j                  t         j                  t        j
                  t         j                  t        j                  t         j                  t        j                  t         j                  t        j                  t         j                  t        j                  t         j                  t        j                  t         j                   t        j"                  t         j$                  t        j&                  t         j(                  t        j*                  t         j,                  t        j*                  t         j.                  t        j0                  t         j2                  t        j0                  i}||   }t        j4                  |      }d }|j6                  rt9        |       |dz  k(  sJ  ||        |j;                  t        j<                  |z  | d |        j>                  }|j;                  t        j<                  |z  | |d         j>                  }|d|z  z   }	nFt9        |       |k(  sJ  ||        |j;                  t        j<                  |z  |        j>                  }	t        j@                  |	||      S )Nc                 2    | D ]  }d|cxk  rdk  rJ  J  y )Nr      rF   )rF  bytes     r>   check_bytesz$bytes_to_scalar.<locals>.check_bytes/  s*     	$D######	$r?   r   y              ?r  )!r7   r  ctypesc_int8r  c_uint8uint16c_uint16uint32c_uint32uint64c_uint64int16c_int16r  c_int32r  c_int64rr   c_boolr  c_floatr  float64c_double
complex128sizeofr  ra  from_bufferc_byter^   r2  )
rF  rE  rG  dtype_to_ctypectype	num_bytesrK  r  imagr%  s
             r>   bytes_to_scalarre    s   

FMMV^^foofoofooV^^V^^V^^

FMMv~~v&//.N 5!Ee$I$ 9~)a-000I  &--)";z	""$ %%*U 	  &--)";yz""$ %%*U 	R$Y9~***I!:!  	 <<F%88r?   c                     t        j                  | j                  | j                  | j                  | j
                  | j                        }t        j                  ||       }| j                  |_	        |S )zBBased on http://stackoverflow.com/a/6528148/190597 (Glenn Maynard))rR   argdefsclosure)
r  FunctionType__code____globals__rg   __defaults__rJ  r   update_wrapper__kwdefaults__)r  gs     r>   	copy_funcrp  D  sY    1::q}}1::#$>>#$==	2A 	  A&A''AHr?   c                       fd}|S )z
    Given a list of test names which are defined by a superclass of the
    class this decorates, mark them as expected failure.  This is useful
    if you are doing poor man's parameterized tests by subclassing a generic
    test class.
    c                 |    D ]5  }t        | |t        j                  t        t	        | |                         7 | S r6   )r$  r   r  rp  r   )r%  r$  r,  s     r>   decoz#xfail_inherited_tests.<locals>.decoU  s?     	RA CH44YwsA5OPQ	R 
r?   rF   )r,  rs  s   ` r>   xfail_inherited_testsrt  N  s     Kr?   c                       fd}|S )z
    Similar to unittest.skipIf, however in the sandcastle environment it just
    "passes" the test instead to avoid creating tasks complaining about tests
    skipping continuously.
    c                 b     r*t         rt                fd       }|S d _         _         S )Nc                  \    t        dj                   d t        j                         y r=  r>  r?  s     r>   r   zBskip_but_pass_in_sandcastle_if.<locals>.decorator.<locals>.wrapperg  s(    Idmm_4YZ`Yabilisistr?   T)ru   r   r  r  )r  r   r  rL  s   ` r>   r/  z1skip_but_pass_in_sandcastle_if.<locals>.decoratord  s;    tu u)-&-3*r?   rF   )r  rL  r/  s   `` r>   skip_but_pass_in_sandcastle_ifrx  ^  s     r?   c                 <    t        |       j                  d      d   S )zC Returns the pretty name of the dtype (e.g. torch.int64 -> int64). r   r^  )rm   r   rF  s    r>   rF  rF  s  s    u:C ##r?   bf16f64f32f16c32c64c128i8i16i32i64b8u8c                      dt         fd} d}g }t        |      D ]  }|j                   |                t        |      }t	        |d|dz
         S )zZMeasure and return approximate number of cycles per millisecond for torch.cuda._sleep
    r`   c                  L   t         j                  j                  d      } t         j                  j                  d      }| j                          t         j                  j	                  d       |j                          |j                          d| j                  |      z  }|S )NT)enable_timingi@B )r7   r   Eventr  _sleeprO  r  )r?  endcycles_per_mss      r>   measurez"get_cycles_per_ms.<locals>.measure  sy    

  t 4jjT2

'"

%"4"4S"99r?   r  r   )rJ  r  r.  r  r   )r  numvalsrt   s       r>   get_cycles_per_msr    sZ    
U $ CD3Z GI$<DQq!""r?   Tr   samplesc                 z    	 t        t        |            S # t        $ r}t        j                  d      |d}~ww xY w)z
    Returns the first sample from an iterable of samples, like those returned by OpInfo.
    The test will be skipped if no samples are available.
    z%Skipped! Need at least 1 sample inputN)r   r  StopIterationr   r  )r   r  rp  s      r>   first_sampler    s=    
PDM"" P GHaOPs    	:5:c                     t        | t        j                        rt        j                  |       S t        | t              rt        t        t        |             S | S r6   )r   r7   r   r  r   r'  r  clone_input_helperr  s    r>   r  r    sA    %&{{5!!%"S+U344Lr?   c              #   j   K   	 t        | ||       d t        | |       y# t        | |       w xY ww)zBContext manager/decorator to test ONNX export with custom operatorNr&   )opnamesymbolic_fnopset_versions      r>   	custom_opr    s/     =#FKG%fm<%fm<s   3" 303c                     | | }t        j                  |      D ]J  }t        |t        j                        s|j
                  s+|j                         j                  d       L t        j                  |      D cg c])  }t        |t        j                        s|j                  + }}t        j                  |      D ]$  }t        |t        j                        sd |_        & ||fS c c}w )NT)retain_graph)	pytreetree_leavesr   r7   r   r  r*  backwardgrad)r   
graph_inpsinpsoutsr  inpgradss          r>   outs_and_gradsr    s    z?D!!$' 2c5<<(S->->GGID12 "(!3!3D!9[#ZU\\=ZSXX[E[!!$' c5<<(CH ;	 \s   ?C/C/c                     t        |||      \  }}t        |||      \  }}| j                  ||       | j                  ||       y r6   )r  r  )r   m1m2r  r1g1r2g2s           r>   compare_equal_outs_and_gradsr    sF    Bd+FBBd+FBRRr?   c                   @    e Zd ZdZd ZddddddZddddddZd Zy)	TestGradientsTc                 .    t              fd       }|S )Nc                 8     | j                         g|i |S r6   )r  )r$  r<   r=   inplace_variants      r>   r  z,TestGradients._get_safe_inplace.<locals>._fn  s    "1779>t>v>>r?   r  )r   r  r  s    ` r>   _get_safe_inplacezTestGradients._get_safe_inplace  s!    			? 
 	? 
r?   FNcheck_forward_adcheck_backward_adr  check_batched_forward_gradc                   |dv sJ | j                  d       j                  |t        j                  |      j                        s*| j                  dj
                   dt        |              fd}
j                  xr |j                  }j                  ||d|t              }|D ]  j                  r	 |
      rd }t        j                        r:t        j                  j                  j                   j#                               }nCt%        t        j                  fj                  j                   j#                                     }t%        d |D              }|D ]  }| j'                  |j(                  d	         d
 fd}|dk(  rH|j*                  }| j-                  t/        |||dj0                  j2                  ||d|	
             :|dv rw| j5                  |d       dD ]]  }|j6                  dj0                  j2                  d}|dk(  rd|d<   d|d<   d|d<   d|d<   | j-                  t9        ||fi |       _ | j-                  dd        y )N)r  bwgrad_bwgradfwgrad_bwgradz!Skipped! Variant not implemented.z	Skipped! z does not support dtype c                 x    t        | d      r| j                  j                         u S | j                         u S )N__wrapped__)r   r  get_inplace)variantr&  s    r>   
is_inplacez/TestGradients._check_helper.<locals>.is_inplace  s7    w.**bnn.>>>bnn...r?   T)r  include_conjugated_inputssmall_inputs_onlyc              3   p   K   | ].  }t        |t        j                        s|j                  s+| 0 y wr6   )r   r7   r   r  rk  s     r>   r   z.TestGradients._check_helper.<locals>.<genexpr>	  s&     "l:a;V[\[j[j1"ls   666zA sampled input has a gradient before running autograd. This usually means that (at least) one input tensor is reused across different SampleInputs. Please create a new tensor for each SampleInput.c                 <   t        |      r^g }|D ]S  }t        |t        j                        r&|j                  r|j                  | |          |dz   }C|j                  |       U ||fS t        |t        j                        r|j                  r
| |   |dz   fS ||fS rg  )rA  r   r7   r   r  r.  )r  r  r   tensor_listr   s        r>   _input_recomposition_helperz@TestGradients._check_helper.<locals>._input_recomposition_helper  s    )#."$K  2%a61??'..vi/@A(1AI'..q12 '	11U\\2s7H7H!),i!m;;	>)r?   c                     g }d} 	| j                   |      \  }}|j                  |       j                  D ]   } 	| ||      \  }}|j                  |       " i }j                  j	                         D ]  \  }} 	| ||      \  }}|||<     
j
                  g|i |}j                  j                  |      S |S r^  )r  r.  r<   r=   re   gradcheck_wrapperoutput_process_fn_grad)r  positional_argsr   r  r   r=   r  rR  rV  r  r&  sampler  s            r>   r   z'TestGradients._check_helper.<locals>.fn#  s    "$	!<VV\\S\!]Y&&s+ 0A%@I%VNC#**3/0
 "MM//1 $DAq%@I%VNC #F1I$ .--gRR6R00<!88@@r?   r  )r  check_grad_dtypes
nondet_tolr  r  r  check_undefined_gradr  )r  r  z-Cannot run forward AD check for gradgradcheckr$  )FT)gen_non_contig_grad_outputsr  r  r  r  r  check_fwd_over_revFcheck_rev_over_revr  r  zUnknown check requested!)r  supports_dtyper7   rG  rH  rR   rm   test_conjugated_samplesr  sample_inputsr  broadcasts_inputrA  r  r   r<   r=   rP  r'  r  r  r  rw  r  gradcheck_nondet_tolgradcheck_fast_moderz  check_batched_gradgradr  )r   rG  rE  r&  r  checkr  r  r  r  r  r  r  all_argsgradcheck_argsr$  r   r  r=   r  r  s      ``              @@r>   _check_helperzTestGradients._check_helper  s   GGGG?MM=>  V(<(A(ABMMIbggY.Fs5zlST	/
 %'$>$>$S5CSCS!""65`y5M # O  ]	GF&&:g+> H%fll3 v{{FMM<P<P<RS V]]EYEYE[!\]""lh"llN $ V!!!&&#UVV*, #%-)+)>)>&	"n=O<@575L5L464J4J;K<M?CE_!a b <<  !17f g3@ Q/7R.0.G.G-1&(&=&=%'%;%;F /7;347<347<349>56OOM"n$O$OPQ  +EF{]	Gr?   c                6    | j                  ||||d||||	      S )Nr  r  )r  )	r   rG  rE  r&  r  r  r  r  r  s	            r>   _grad_test_helperzTestGradients._grad_test_helperY  s2    !!&%Wk\l4EZl=W " Y 	Yr?   c                     ||j                  t        j                  |      j                        vr| j	                  d       |j
                  s|j                  s| j	                  d       y y y )Nz4Skipped! Op doesn't support autograd for this dtype.z Skipped! autograd not supported.)supported_backward_dtypesr7   rG  rH  r  supports_autogradsupports_forward_ad)r   r&  rG  rE  s       r>   _skip_helperzTestGradients._skip_helper_  sX    44U\\&5I5N5NOOMMPQ##B,B,BMM<= -C#r?   )rg   rh   ri   r  r  r  r  r  rF   r?   r>   r  r    s=    K TYlp)-%pGd QVim-1eY>r?   r  c                 f    d }|| _         dD ]   d d}fd}t        | | ||             " | S )Nc                      || _         d | _        y r6   )_cb_value)r   cbs     r>   	lazy_initz"make_lazy_class.<locals>.lazy_initg  s    r?   )addrf  r  truedivfloordivmodr  powlshiftrshiftandorxornegposabsinverteqneltlegtgerr   r   r   __c                       dv fd}|S )N)rr   r   c                     | j                   | j                         | _        d | _         s t        | j                        |i |S  t        t              | j                  g|i |S r6   )r  r  r   r   )r   r<   r=   rR   use_operators      r>   r  z7make_lazy_class.<locals>.inner_wrapper.<locals>.wrappedw  sc    88'"&((*DK#DH#574;;5tFvFF278T24;;PPPPr?   rF   )rR   r  r	  rK  s   ` @r>   inner_wrapperz&make_lazy_class.<locals>.inner_wrappert  s    #?:LQ Nr?   )r   r$  )r%  r  rR   r	  rK  s       @r>   make_lazy_classr	  e  sQ     CL 0
 H:R 	 	T=./)0, Jr?   c                   6    e Zd Zd Zej
                  d        Zy)NestedTensorTestCasec                 ~    d }| j                  t        j                  ||      t        j                  ||             y )Nc                     t        | t        j                        r9| j                  r-| j                  t        j
                  k(  r| j                         S | S r6   )r   r7   r   r  r  jaggedr  r   s    r>   _unbind_njtszHNestedTensorTestCase.assertEqualIgnoringNestedInts.<locals>._unbind_njts  s6    !U\\*q{{qxx5<<?Wxxz!r?   )r  r  tree_map)r   rQ  rm  r	  s       r>   assertEqualIgnoringNestedIntsz2NestedTensorTestCase.assertEqualIgnoringNestedInts  s0    	 	q96??<YZ;[\r?   c              #      K   t         j                  j                  j                  }|j                  j                         }|j                  }	 d ||_        ||_        y# ||_        ||_        w xY ww)z>Context manager to branch and restore the nested tensor state.N)r7   nested	_internalnested_tensor_tensor_symint_registryr  _tensor_id_counter)r   nested_tensor_moduleoriginal_tensor_symint_registryoriginal_tensor_id_counters       r>   branch_nested_statez(NestedTensorTestCase.branch_nested_state  sp       %||55CC*>*V*V*[*[*]'%9%L%L"	[6P 3;Z 8 7Q 3;Z 8s   AA4A! A4!A11A4N)rg   rh   ri   r	  r  r   r	  rF   r?   r>   r	  r	    s$    	] 	[ 	[r?   r	  c                       e Zd Zy)LazyValNrC  rF   r?   r>   r	  r	    s    r?   r	  )rl  suppress_prefixr  rH  c          	         $t        j                         d|z      j                  t              t        t	        |             }fd}t        j                  d||      }t        j                  dd|      }t        j                  dd|      }t        j                  t        t        j                  j                              |      }t        j                  t        t        j                  j                  t        j                  j                  t        j                        d            d|      }|rNt        j                  d	d|t
        j                  
      }t        j                  dd|t
        j                  
      }|rt        j                  dd|      }t        j                  dd|t
        j                  
      }|S )Nr^  c                 z    | j                  d      k7  ry| j                  d      dk(  ry| j                  d      S )Nr^  r   r   z<module>r   )r!  )r  r  s    r>   
repl_framezmunge_exc.<locals>.repl_frame  s9    771: 771:#wwqzr?   z>  File "([^"]+)", line \d+, in (.+)\n(    .+\n( +[~^]+ *\n)?)+zline \d+zline Nz.py:\d+z.py:Nr   z\n*Set TORCH_LOGS.+)flagsz$\n*You can suppress this exception.+zCannot export model.+\n\nz +$)r   r   r   r   rm   r  rf  rO   r   rK  rd   r  r7   r  DOTALL	MULTILINE)rp  rl  r	  r  rH  rA  r	  s      `   r>   ro  ro    sA   |}}q4x(11$Ds1vA 	PR\^_`A
{Ha(A
z7A&A
t^BGG$4$4T$:;Q?A
~bggll277??5>>+JBOPRTVWXAFF)2q		BFF:BSFF/Q7
vr1BLL1AHr?   r6   )NNNNN)NNNNNr^  F)z'test doesn't currently work with dynamor;  rK   )z@test doesn't currently work with torchinductor on the ROCm stack)z4test doesn't currently work with legacy JIT executor)F)rr  rr  F)r  (  r  argparser  r  rL  r  r   r   r   r   ior   rt  r  r   rO   r   r+  r  r  r  rU  r  r  r  	threadingre  r  r   r^  collections.abcr   r   r   r   r   dataclassesr   enumr	   r
   r   	itertoolsr   r   pathlibr   
statisticsr   typingr   r   r   r   r   r   r   r   r   r   r   unittest.mockr   r
  r  r  r  r7   torch.backends.cudnntorch.backends.mkltorch.backends.mpstorch.backends.xnnpack
torch.cudar   torch._Cr   r   torch._dynamo.trace_rulesr   torch._utils_internalr    torch.nnr!   r"   r#   r$   r%   
torch.onnxr'   r(   torch.testingr)   torch.testing._comparisonr*   r+   r,   r-   r.   r/   $torch.testing._internal.common_dtyper0   torch.utils._import_utilsr1   torch.utils._pytreer  _pytreer  r  r  ImportError
MI300_ARCHr:   rA   ru  rg   r   r}  disable_global_flagsFILE_SCHEMArY   ro   rr   rk   ru   r   _utils_internalrz   _is_fbcode_defaultr{   r}   r   r   r_   r   r   DEFAULT_DISABLED_TESTS_FILEDEFAULT_SLOW_TESTS_FILEr`  r]  r   rP   rx  r  r  check_namesr  r   r   r   r   r   r   r   r   r  r0  r2  r:  ri  rq  r~  r  r  r  ScriptFunctionr  r  ScriptMethodr  r  r  r  r  r   is_running_via_run_testArgumentParserparseradd_argumentrm   version_infoBooleanOptionalActionr  r  Threadhelp_threadr?  rd   parse_known_argsr<   	remainingjit_executorrs  r  ru  rt  rerun_disabled_testsre  import_slow_testsr   import_disabled_testsr   
log_suffixr  run_parallelrh  test_bailoutsTEST_BAILOUTS
use_pytestrc  pytest_single_testri  discover_testsra  rd  rf  r  repeatrm  r   r   r  rb  acceptr  UNITTEST_ARGSr*  r  r  r7  
CI_PT_ROOTr   CI_FUNCTORCH_ROOTr  r  r  r  r  r  r  r  r  r  r'  r;  r~  r  ry  r  machineIS_PPCIS_X86IS_ARM64r  IS_AVX512_VNNI_SUPPORTEDr  r  r  getfilesystemencodingIS_FILESYSTEM_UTF8_ENCODINGr  TEST_FAIRSEQr  mklr  TEST_MKLr  r`  r   r\  r  re  r   r}  custom_device_modTEST_PRIVATEUSE1TEST_PRIVATEUSE1_DEVICE_TYPE
TEST_NUMBATEST_TRANSFORMERS	TEST_DILLTEST_LIBROSATEST_OPT_EINSUMTEST_Z3r  
NOTEST_CPUskipIfskipIfNoDillr  r  r  r  r  r  rt  r  r  r  r  rm  r   rn  rJ  TEST_CUDA_GRAPHTEST_CUDA_CUDSSr  r  r  	num_procsrc  gb_availableset_per_process_memory_fractionr  
skipUnlessrequires_cudar  	overridesTorchFunctionModer  r  r  r  torch._dynamor  r/  accumulated_cache_size_limitlog_compilation_metricstorch._inductor.config	_inductorfallback_randomr  r  r  r	  r  r  r"  r%  r)  TEST_WITH_TVr.  r/  r0  r1  r2  r3  bool_r  rO  rQ  rS  r  rU  r  r  r  r  r[  r  r]  r6  r:  r=  intcre   r  r  r  	complex32inline_inbuilt_nn_modulesrB  rK  rO  rX  r]  rb  rf  rq  ru  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r   r.  r3  r9  r<  rA  rC  rY  rq  rz  r~  r  register_profileHealthChecktoo_slow	Verbositynormalr}  load_profiler  r  r   r  r  r  r  r  r  r  r  r  r  r  _AssertRaisesContextr  r$  r&  rB  rR  r_  ADDRESS_IN_USECONNECT_TIMEOUTri  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  BytesIOr
  GRADCHECK_NONDET_TOLr  skipIfSlowGradcheckEnvr  r  r  r!  halfdtype2prec_DONTUSEr%  r/  r1  r9  r@  rC  rE  rE  rG  re  rp  rt  rx  rF  dtype_abbrs	lru_cacher  r  r  r  r  r  r  r  r	  r	  r	  ro  )r  r^   s   00r>   <module>r	     sY         	   	     	   	     
       - .  !  $ $      $           + 4 3  &  < ? : $ $J
 ,
B^X ^XB g!  # # %<<7K &&;	 ' t  &..B	 / t  E!!=1 &	%% 
 "**!	 + 	4  &..% / t  $3#;#; 0 $< $ D   /77,]	  8     ,;+F+F/ : ,G , 8C=  = +   299#%ibii0A2&FGO299"B'))"))4I2*NO0V0V0XYODDD	(+ $   !8L1 !!.3 .3`1 1h&R,^; ;(CY# CYL<:" <:~D 
$ 	G 	G C C : : HH##,,	HH!!**	%55 $2    !/   5 (78Z+LL 	 	 	 .E*ETY	Z   N<C  E   H3  5   J|  4   $&6S  A   JS!  4   %'8  N   N<  8   L#/17<13$  H   &|  <   Nb  9   $3  :   )3F]  ^   -CsJe  f   ,\  B   *A  >v
x/M/MW\]
|UK
)]S 388x388+")""*;388+NK))+i "))N	+%",,N	(""))N 67N00 ((00 __
  ""__
,, ##__ {{yy__
z8U+J!	)   $  T)"))+&'ibiik"))*
T)"))+%6%=%={KL  D0" 	/ 39/dH5'& 'u 
# ('S	 'd3i '$ ! _!B <<7"\\W$
<<8#				y	(				1	18!55 45      $ $  
m 8c779WD !'*
#I.!'*
>>**,>>**,99!!#E5)eii.D.D.F4UJJ##%	E588#I#I#KTR 35 $xxEEG !'*
(8  (	#I.?x<&|4
t
$/# / (3VXZ)[\\
x9}i8 "1!9!9& ": " $  '//$ 0    /77,  8     '//$ 0   (00% 1   '//$ 0   !*		*G MQT T &//$ 0   '//$ 0   +33( 4  D 
 ,44) 5  T   %8!8 
]]GC 2 2 8 8 =a @ARG V
]]T5%--*;*;*A*A#*Fq*K!LMQTT 
 d!3!3!cEMM<N<N<T<TUX<YZ[<\8]ac8c	 ,44% y  !<EZ[ 5  T  %3IBII2C89I::**,Q/'9L	JJ..ulYQT_6TXd5dgp5prs/tu###EJJ$;$;$=O5??44  !0 8 8( !9 !  
 ,44) 5  T  .66&H 7  t  8:EMM538EMM0%15.MM8 M"9*&<^. ryy/0C7;?EHH!!8
  "1!9!9. ": " $  HHEJJHHEKKIIELLIIELLIIELLGGEJJHHEKKHHEKKHHEKKJJEMMJJEMMJJEMMLLEOOMME$$ *8 
 */bgg& >W=\=\=^_\c5US[_      	NNBJJ	OOR\\"  	>mm""<<2!P c3h  N $V "e e*
W 
W 	@ 	@
Y 
YRDT T(
?4(- - - 9 97./ /4y( y(v @ @  6$S4 ((#-#9#9#B#B"C **11	34 ((#-#9#9#B#B"C **11		34 ((#-#9#9#B#B"C **22		45 $$9299-I5#Q  I`(++ I`h&6 &6R7:
 7:t   2
~ 
,T4 T6 
l |  98==3U3U 9 'T ' ' 
k&z"" k&\-	8 	,(  *(#' 42 16U 	0 @C% &4* AFUZ 	D
I _d *&>/C /s / /QVQ]Q] /*6sr13Hl  E	RZZ   !0!9!9. ": " $ 
 )K :,L*D # (4.   kk4llDjj$nnd, &  3C 3D 3(F%9tCy %9 %9ell %9P *$ 
NNF	MM5	MM5	MM5	OOU	OOU	f	JJ	KK	KK	KK	JJ	KK" #5 # #@ CLPx(( P8A; P1 P = =	H>H H>TD[8 [2 	 	 	 %)$TPQ  }a  JP2 `z  S	
QRSs8   Ab DAbKEAb bAbbAbbAb/b.Ab/