
    PhI                    ,+   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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.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z= ddl>Z>ddl?Z@ddlAZAddlBZBddlCZBddlDZBddlEZBddlFZBddlGZBddlBmHZH ddlImJZJmKZK ddlLmMZM ddlNmOZOmPZPmQZQmRZRmSZS ddlTmUZUmVZV ddlWmXZX ddlYmZZZm[Z[m\Z\m]Z]m^Z^ ddlYm_Z_ ddl`maZa ddlbmcc mdZe ddlfmgZg  G d d      Zh ej                  ej      ZkeBj                  j                          dZnej                  dk(  rdZnehj                  ddd d! "       ehj                  d#d$d% d &        epeBj                  d'      xr eBj                  j                  Zsehj                  d(d)esd *       ehj                  d+d,d -       ehj                  d.d/d -       ehj                  d0d1d -       ehj                  d2d3d -       ehj                  d4d5et d *       d6Zud7Zvi awi axd8 Zy ej                  d9d:      r ey ej                  d9d:            ax ej                  d;d:      r ey ej                  d;d:            awd<d=d>eBj                  j                         fZ}g d?Z~ ed@ e~D              ZdA ZdBe7e2   fdCZe$ G dD dE             ZdBe7e   fdFZdG Z G dH dI      Z G dJ dK      ZdL ZdM Z G dN dO      Z G dP dQe      Z G dR dSe      Z G dT dUe&      ZdV Ze!dW        Ze!dX        Ze!dY        ZeBj                  j$                  j&                  ZeBj                  j*                  j&                  ZdZ Zd[ Zd\ ZeeBj                  j$                  _        eeBj                  j*                  _        d] Zd^ eeAd_d:      v Z ej:                  e d `      Zej?                  dadbdcd       ej?                  deedfg       ej?                  dhdbi       ej?                  djdkel       ej?                  dmedg       ej?                  dndodbi       ej?                  dpdbi       ej?                  dqdre e       er e       nds       ej?                  dtdbi       ej?                  dued:g       ej?                  dvedg       ej?                  dwedrevx       ej?                  dyedreux       ej?                  dzdbi       ej?                  d{ed|       d} Zd~ejH                  v sdejH                  v rC ejJ                  eejH                  f      ZejO                          ejQ                          ejS                         \  ZZejX                  dk(  rejZ                  ZnCejX                  dk(  rej^                  Zn%ejX                  dk(  rej`                  Zn e       Zejb                  ZesdndZejh                  Zejl                  Zejp                  Zejt                  Zejx                  Zej|                  Zej                  Zej                  Zej*                  Zej                  Zej                  Zej                  Ze>j                  sej                  e>_        ejH                  d   gez   Z eBj                  eʫ        e e- ej                                     Z e e- ej                               j                        Z eej                  jQ                   e- ej                               j                  d            ZԐddZՐddZ	 	 	 	 	 	 	 ddBe8eef   fdZd Zd Zd Zd Zd Zd Zed fdZdefdZde6e   dBe6e   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       Z ej                         dk(  ZdedBefdZ ed      Z ed      Z ed      ZeBj                  j                  j                         ZeBj                  j                  j                         ZeBj                  j                         Z eeBeBj                  j                         d      Z eped      rej                         rdnd Z ed      Z ed      Z ed      xr e Z ed      Z  ed      ZeBj                  j                  ZdefdZd< e ej                  dd:            v Zehj                  dd       ehj                  dd       ehj                  dd       ehj                  dd       ehj                  dd       ehj                  dd        ej                  dd      dk(  Zehj                  dd       ehj                  dd¬       ehj                  ddĬ       ehj                  ddƬ       exr e xr eBj                  j                  xr4  eeBj                  j                  j                  dǫ      d         dk\  xs_ eBj                  j                  xrE  edǐjQ                  eBj                  j                  j                  dǫ      dd             dk\  ZerUdej                  v rF e ej                  dd̫            ZeBj                  j!                   edez  dz
  dɫ             d΄ Z G dτ deBj&                  j(                        Zehj                  ddҬ       ehj                  ddԬ       ehj                  dddׄ ث       erIddlZBdeBj0                  j2                  _        er#ddlZBdeBj:                  j2                  _        dڄ Zdۄ Z dd܄Z!dݐefdބZ"d߄ Z#ddZ$ddZ% ej                  d      dk(  Z&e&r)deBjN                  jP                  jR                  _*        d Z+ehj                  dd嬱       d ej                  dd:      v Z,e@jZ                  eBj                  e@j\                  eBj\                  e@j^                  eBj^                  e@j`                  eBj`                  e@jb                  eBjb                  e@jd                  eBjd                  e@jf                  eBjf                  e@jh                  eBjh                  e@jj                  eBjj                  e@jl                  eBjl                  e@jn                  eBjn                  iZ8d Z9d Z:ereBj@                  e8e@jv                  <   e8jy                         D  ci c]  \  } }|| 
 c}} Z=e=j}                  eBj~                  e@jh                  eBj                  e@jl                  i       ddddZAd ZBd ZCddZDd ZEd ZF G d d      ZG G d d      ZH G d d      ZId ZJd ZKd ZLd ZMd ZNd ZOd ZP ePd d      ZQ ePdd       ZRd ZSddZTd ZUd ZVd ZWd ZXd ZYddZZd	 Z[d
 Z\eBj                  j                  Z^ejB                  d        Z_ejB                  d        Z`ejB                  d        Zad Zbd ZcddZd G d d      Ze G d d      Zfe!d        Zge!d        Zh	 ddliZid Zjeij                  j                  d ejdeij                  j                  gddeij                  j                               eij                  j                  d ejeij                  j                  gddeij                  j                               eij                  j                  d ejeij                  j                  gddeij                  j                               eij                  j                  erdn ej                  dd             d!edBefd"Ztd#ej                  fd$Zv G d% d&eZ      Zw G d' d(e\      Zx G d) d*e^      Zy G d+ d,e^      Zz G d- d.e]      Z{ G d/ d0e{      Z| G d1 d2e{      Z} G d3 d4e{      Z~ G d5 d6e{      Z G d7 d8ej                   j                        Ze!d9efd:       Z G d; d<      Z G d= d>e>j                        Zudd?Zd@ ZdAZdBZdefdCZddDZeBj                  d<fdEZdFdGdHdIZdJ ZdK ZdL ZdM ZdN ZeBj                  d<dOdPZdQ ZdR ZdS Zd dTdUZdV ZdW ZddYZddZZd[ Zd\ Zdad] Zd^ Zd_ Z G d` dae	jD                        ZdbZehj                  dcdd        ejJ                  ede      Zdf ZddgZdh Ze!diedBe5d   fdj       ZeBj                  dkeBj                  dkeBjX                  dXeBj~                  dliZdm Zdn ZejB                  do        ZdpedBe-fdqZdr Zds Zdt Zdue6e   dveBjj                  dweBjl                  fdxZdy Zdz Zd{ Zd| ZeBj~                  d}eBjj                  d~eBjh                  deBjf                  deBj                  deBjl                  deBjn                  deBj^                  deBj`                  deBjb                  deBjd                  deBj                  deBj\                  diZd Zej|                  dBefd       Z e:d      Zdej                  de4e   dBefdZd Ze!d        ZÐd ZĐd Z G d deu      ZƐd Zǐe G d d             ZddddddZyc c}} w # er$ r  esd        Y 7w 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)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   )no_dispatchc                   R    e Zd ZU i Zeed<   ed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     oC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/testing/_internal/common_utils.py<lambda>zTestEnvironment.<lambda>   s    $+[CE+2DE    c                       yNFr8   r8   r=   r;   r<   zTestEnvironment.<lambda>   s    er=   c                     |}|t        j                  |      } |||      } |       }|xs |}|r|||k7  r|st        j                  |<   | t	               vsJ d|  d       |t	               | <   y )Nzduplicate definition of flag '')osgetenvr3   r4   globals)	nameenv_varr:   include_in_repro
enabled_fnimplied_by_fnenabledr9   implieds	            r;   def_flagzTestEnvironment.def_flag   s     ))G,K g6G/$W!47g;MW^6AO**73 79$N(FtfA&NN$!	$r=   returnc            	          dj                  t        j                  j                         D  cg c]  \  } }|  d|  c}}       S c c}} w )N =)joinr3   r4   items)rF   values     r;   repro_env_var_prefixz$TestEnvironment.repro_env_var_prefix   sV    xx/>/M/M/S/S/UW/U^We $9AeW-/UW X 	X Ws   A
)
__name__
__module____qualname__r4   dict__annotations__staticmethodrL   strrT   r8   r=   r;   r3   r3   g   sT     ND0  G#" "4 X# X Xr=   r3   zfile://win32zfile:///IS_CICIFc                     t        |       S N)bool)env_var_value_s     r;   r<   r<      s	    T-=Pr=   )rF   rG   rH   IS_SANDCASTLE
SANDCASTLEc                  2    t        j                  d      dk(  S )NTW_JOB_USER
sandcastle)rB   rC   r8   r=   r;   r<   r<      s    "))M2lBr=   )rF   rI   rG   IS_FBSOURCE	IS_FBCODEPYTORCH_TEST_FBCODE)rF   r:   rG   IS_REMOTE_GPUPYTORCH_TEST_REMOTE_GPU)rF   rG   RETRY_TEST_CASESPYTORCH_RETRY_TEST_CASESOVERRIDE_FLAKY_SIGNALPYTORCH_OVERRIDE_FLAKY_SIGNALDISABLE_RUNNING_SCRIPT_CHK"PYTORCH_DISABLE_RUNNING_SCRIPT_CHKPRINT_REPRO_ON_FAILUREPYTORCH_PRINT_REPRO_ON_FAILUREz.pytorch-disabled-tests.jsonz.pytorch-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.)rB   pathisfileopenjsonloadlogwarning)filenamefps     r;   maybe_load_jsonr      sI    	ww~~h(^r99R= ^KKI8TI ^s   A""A+SLOW_TESTS_FILE DISABLED_TESTS_FILEcpucudameta)orinconcordgalenxaviernanojetsontegrac              #   H   K   | ]  }|t        j                          v   y wr`   )platform).0rE   s     r;   	<genexpr>r      s     D))++s    "c                 B     t        j                          fd       }|S )Nc                      t         r2t        j                          t        j                  j                           | i | y r`   )	IS_JETSONgccollecttorchr   empty_cacheargskwargsfns     r;   wrapperzgcIfJetson.<locals>.wrapper   s,    JJLJJ""$
DFr=   	functoolsr   r   r   s   ` r;   
gcIfJetsonr      s%    __R 
 Nr=   rM   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indexval	type_descN)rU   rV   rW   intrY   r   r[   r8   r=   r;   r   r     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     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                   0    e Zd Zd fdZd Zd ZdefdZy)TrackedInputIterc                     | S r`   r8   xs    r;   r<   zTrackedInputIter.<lambda>   s    qr=   c                 ^    t        |      | _        || _        || _        t	               | _        y r`   )	enumerate
child_iterinput_type_desccallbackr   r   )r   r   r   r   s       r;   __init__zTrackedInputIter.__init__   s'    #J/. &(r=   c                     | S r`   r8   r   s    r;   __iter__zTrackedInputIter.__iter__(      r=   c                     t        | j                        \  }}| j                  t        || j	                  |      | j
                               |S )N)r   r   r   )nextr   _set_tracked_inputr   r   r   )r   	input_idx	input_vals      r;   __next__zTrackedInputIter.__next__+  sI    #DOO4	9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_input5  s,    <<t||_5%2"r=   N)rU   rV   rW   r   r   r   r   r   r8   r=   r;   r   r     s     =H )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_testO  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__e  sR    2'(!#!2!2!%!7!7 78JL^ _B 	 !% 6 6B	r=   N)rU   rV   rW   __doc__r   r   r8   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                  | j                  |            i ||}dj                  ||dk7  r|dk7  rdnd|      }|	|fd}|
|||f   y w)NzParametrization over the same parameter by multiple parametrization decorators is not supported. For test "{}", the following parameters are handled multiple times: {}z{}{}{}r   rc   c                 H    t         ||             t         ||             z   S r`   )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RuntimeErrorformatrU   )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 H=*:J#&'7'<'<'>#?#L#LM]MbMbMd#e #& (HHN+/==:JILM M %M'7$L;K$L!#+??=:G2:MR_ceRe3km3@$B  BLXb [  !13DFYZZ J HQs   CCr8   )r   r   r  s      r;   r   r   p  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 r`   r8   )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)clsrE   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   rc   )r	  rE   r   r   )tupledirr   r   delattrr   rU   )
r   	attr_name
class_attrr
  r   test_suffixr   decorator_fn	full_name	decorators
   `         r;   instantiate_parametrized_testsr    s    $ 3{+,	[)4
z#34 	Y'	: @J?X?X @Y @F;T;l==/;-8I *,7	  8 $)$]ij@F# -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_valuesrE   
decoratorsNc                 B    || _         || _        |r|| _        y g | _        y r`   r  )r   r  rE   r  s       r;   r   zsubtest.__init__  s    $	(2*r=   NN)rU   rV   rW   r   	__slots__r   r8   r=   r;   r  r    s    
 5I;r=   r  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_namesr  name_fn)r   arg_strr  r#  ss        r;   r   zparametrize.__init__  sD    8?c8J$V8J1aSUgQWWY8J$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
ModuleInforc   r   )r   r   dtype
dtype_namedevicer[   typerU   formatted_namer   floatreplace)r   idxrE   rS   s       r;   _formatted_str_reprzparametrize._formatted_str_repr  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 )Nrc   )rQ   zipr"  r1  )r   r0  valuesavs        r;   _default_subtest_namez!parametrize._default_subtest_name(  sD    xxT^^]cIdeIdA11#q!<Ideffes   A

c                 p    |r|}|S | j                   r | j                   | }|S | j                  ||      }|S r`   )r#  r7  )r   r0  r4  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 r`   r8   )rc   s    r;   r<   z/parametrize._parametrize_test.<locals>.<lambda>8  s    "r=   c                       | i |S r`   r8   r   r   r   s     r;   test_wrapperz3parametrize._parametrize_test.<locals>.test_wrapperG  s    #T4V44r=   r0   z+Expected # values == # arg names, but got: z values and z names for test "")r9  c                     |S r`   r8   )rc   r  s     r;   r  z3parametrize._parametrize_test.<locals>.decorator_fnY  s    %%r=   zf: An empty arg_values was passed to @parametrize. Note that this may result from reuse of a generator.)lenr"  objectr   r  r   r  rE   r   r  r   r   rU   rX   r3  r;  
ValueError)r   r   r   r   r   r4  check_exhausted_iteratorr0  
maybe_namer  subr@  gen_testr   r  s    `             r;   r   zparametrize._parametrize_test4  s    t~~!#IB55
 178F-(9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=  :@ 11 D6 *X "X Y Y 2s   E7E:r`   )	rU   rV   rW   r   r   r1  r7  r;  r   r8   r=   r;   r  r    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 r`   )r  predicate_fn)r   r  rM  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 r`   r8   )paramsr  rM  s      r;   r  z2decorateIf._parametrize_test.<locals>.decorator_fn  s    F#!{"	r=   c                       | i |S r`   r8   r?  s     r;   r@  z2decorateIf._parametrize_test.<locals>.test_wrapper  s    (((r=   r   )r  rM  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)rU   rV   rW   r   r   r   r8   r=   r;   rK  rK  c  s    (R):r=   rK  c                       e Zd ZdZdZdZy)ProfilingModer0   r      N)rU   rV   rW   LEGACYSIMPLE	PROFILINGr8   r=   r;   rS  rS    s    FFIr=   rS  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)r   _C_jit_set_profiling_executor_get_graph_executor_optimizerS  rW  rV  rU  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rY  )GRAPH_EXECUTORrS  rW  r   rZ  r[  r\  r]  s     r;   )enable_profiling_mode_for_profiling_testsrc    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rY  )r   rZ  r[  r\  r]  s     r;   enable_profiling_modere    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r`   )r   rZ  _jit_set_num_profiled_runs)num_runsold_num_runss     r;   num_profiled_runsrj    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)rb  rS  rW  rc  )callabler   r   s      r;   prof_callablern    sd    v%'(]444:<$)&)00 =< T$V$$	 =<s   AAc                  (    t        t        g| i |S r`   )rn  	func_callr   r   s     r;   prof_func_callrr        4T4V44r=   c                  (    t        t        g| i |S r`   )rn  	meth_callrq  s     r;   prof_meth_callrv    rs  r=   c                      t         j                  j                  d      } | | nd}t         j                  j	                  d|      S )NTEST_REPORT_SOURCE_OVERRIDEpython-unittestztest-reports)rB   environgetrw   rQ   )overridetest_sources     r;   _get_test_report_pathr~    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  )r,  r:   z--accept)r  z--jit-executorz--jit_executor)r,  z--repeatz--test-bailoutsz--test_bailouts--use-pytestz
--save-xml?)nargsr,  constr:   z--discover-testsz--log-suffixz--run-parallel--import-slow-tests)r,  r  r  --import-disabled-tests--rerun-disabled-tests--pytest-single-test)r,  r  c                 0    t        j                  |        y )Nargv)r   mainr  s    r;   run_unittest_helpr    s    MMtr=   z-hz--help)targetr   legacy	profilingsimplerT  2   	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  5  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   r[   r  Popenr  )commandr  r  r  r  r  r  s          r;   shellr  W  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=r0   )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  f  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 r`   )r   r   r   r  extenddiscover_test_cases_recursively)suite_or_casercelements      r;   r  r    sI    -!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   )rQ   r   r   )
test_casescases     r;   get_test_namesr    s9    <FGJDCHHTWWY__S)"#./JGGGs   8A c                      t        j                         j                  t              } t	        |       }t        |      D ]  }t        |        y r`   )r   
TestLoaderloadTestsFromModule__main__r  r  r  )suiter  rE   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 r`   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 )Nr0   z.py$r   /r   )
startswithCI_TEST_PREFIXrC  rerH  )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   r0   z`This test class should extend from torch.testing._internal.common_utils.TestCase but it doesn't.z - failed. F)
r   r   	TestSuiterC  _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   ry  zpython-pytestT)exist_ok-   z.xml)
r  TEST_SAVE_XML
LOG_SUFFIXrB   rw   rQ   r/  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
                  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  searchgroupr/  r   write)r  ETtreer  full_classnameregex_resultr  r  s           r;   sanitize_pytest_xmlr    s     '&88HDIIj)!5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 Zd Zy)2get_pytest_test_cases.<locals>.TestCollectorPluginc                     g | _         y r`   )testsr   s    r;   r   z;get_pytest_test_cases.<locals>.TestCollectorPlugin.__init__  s	    DJr=   c                     |j                   D ]@  }| j                  j                  |j                  j	                  |j
                               B y r`   )rR   r	  appendconfigcwd_relative_nodeidnodeid)r   sessionitems      r;   pytest_collection_finishzKget_pytest_test_cases.<locals>.TestCollectorPlugin.pytest_collection_finish  s5    

!!'.."D"DT[["QR &r=   N)rU   rV   rW   r   r  r8   r=   r;   TestCollectorPluginr    s    		Sr=   r  r   z-vv)z--collect-onlyz-qq--use-main-module)plugins)r  r  r	  )r  r  test_collector_pluginr  args        r;   get_pytest_test_casesr    sd    S S 01
KK-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,        rg }t        r|j/                  d       t         r|j/                  d       t0        r|j/                  d       t2        r|j/                  d	       t0        rt5        |       n9t7        |      D cg c]%  }|j9                         j;                  d
d      d   ' c}}g }|D ]  }t(        j<                  g| d   gz   |z   | dd  z   t0        rdgng z   |gz   }dj?                  |      }	t2        rd nd}
tA        ||
t2        rdnd      \  }}|dk7  rvd|v rPt        j                  jC                  dd      }t        j                  jC                  dd      }d| d| }|dz   |	z   }	tE        d| d|	        |j/                  |       tG        |      dk(  rJ djI                  tG        |      dj?                  |                    y tJ        dkD  rt7        |      }tM        tO        |      tJ              }g }tQ        tJ              D ]L  }t(        j<                  g| z   d|dz    gz   ||   z   }|j/                  tS        jT                  |d             N d}|D ]  }|tW        |      dk7  z  } |rJ d       y t0        r| dgz   }tX        r.t[        d       }tE        d!|        |j/                  d"|        t\        rt\        |dd  z   }dd l/}d#t        j                  d$<   |ja                  |%      }tX        rtc               t2        st)        j*                  |d&k(  rdn|       y t)        j*                  d       y tX        gdd l2}dd'l3m4}  G d( d)|      }t[               }d*| v xs d+| v }|rtE        d!|        t        j`                  | |jk                  ||rd,nd|-      .       y tl        dkD  rZtQ        tl              D ]G  }t        j`                  d| /      jn                  jq                         r3t)        j*                  d0       I y t        j`                  | 1       y # 1 sw Y   !xY w# 1 sw Y   xY wc c}w )2Nr   z'slow test file provided but not found: r   z+disabled test file provided but not found: r0   r  r  r  r  r   r   r  rO   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 failedr  )r  zTest results will be stored in z--junit-xml-reruns=r7   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 r`   )superr   )r   r   r   	__class__s      r;   r   z0run_tests.<locals>.XMLTestResultVerbose.__init__t  s     $1&1r=   c                     t         |   ||       | j                  j                  D ]7  }t	        |j
                  t              s|j
                  dk(  s.d| |_        9 y )Nskipzskip: )r!  addSkipr   __closure__r   cell_contentsr[   )r   r   reasoncr"  s       r;   r%  z/run_tests.<locals>.XMLTestResultVerbose.addSkipw  sN    f-22A!!//37AOOv<U -36(*;	 3r=   c                 Z    t         |           | j                  d| j                         y )NXPASS)r!  printErrorsprintErrorListunexpectedSuccesses)r   r"  s    r;   r,  z3run_tests.<locals>.XMLTestResultVerbose.printErrors  s$    #%##GT-E-EFr=   rM   N)rU   rV   rW   r   r   r%  r,  __classcell__r"  s   @r;   XMLTestResultVerboser  j  s    2<G Gr=   r2  z	--verbosez-vr   )output	verbosityresultclass)r  
testRunner)exitr  r  )9r   rB   rw   existsry   rz   r{   slow_tests_dictrz  warningswarnr   disabled_tests_dictTEST_DISCOVERr  r   r  r  r  r  r  r7  TEST_IN_SUBPROCESSr  
USE_PYTESTRERUN_DISABLED_TESTSr  r  r   r   
executablerQ   r  r{  r  rC  r   RUN_PARALLELr  r  r  r  r  r  r  r  PYTEST_SINGLE_TESTr  r  r  	xmlrunnerxmlrunner.resultr  XMLTestRunnerREPEAT_COUNTresultwasSuccessful)r  r   r  
other_argsr  r  failed_teststest_case_full_namecmd
string_cmdr  exitcoderc   backend
world_size
env_prefixtest_batches	processesr  r  failedr  pytest_argsr  r  r  rE  r  r2  verboses                                 r;   	run_testsrY    s   77>>/*o&""&))B-0?

,-	 '& MMCOCTUV77>>-.)*b&*iim#4G

01 +*
 MMGH[G\]^ !55h?E#E*
7834n-67 ,6!$'4STY4Z[4ZDTWWY__S!$Q'4Z[ 	
 #-  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	|$A~~&-3GAw1O0PPS_`aSbbGZ--g$OP % A&q)Q..F 999z6	122.d;34D3EFG!45E4FGH,{12>K!$

:KK[K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 e '& +*: \s   -V"-V/0*V<"V,/V9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)NrZ  Fz/proc/cpuinfoascii)encodingvnni)r  r   ry   read)fliness     r;   is_avx512_vnni_supportedrh    sG    
||w	o	0A 
1U? 
1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closerE   rB   unlinkr   r   rf  s      r;   TemporaryFileNamerq    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r`   )rl  rm  rE   rp  s      r;   rq  rq    s/     (($9&9Q&&L :99s   <0	<9<c              #      K   	 t        j                  |       }| t        j                  |       y # t        j                         w xY wwN)suffix)rl  mkdtempshutilrmtree)ru  dir_names     r;   TemporaryDirectoryNamerz    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rt  )rl  TemporaryDirectory)ru  ds     r;   rz  rz    s&     ((71G 877s   3'	303zutf-8rE   c                 h    	 ddl }|j                  j                  |       }|duS # t        $ r Y yw xY w)aP  Returns if a top-level module with :attr:`name` exists *without**
    importing it. This is generally safer than try-catch block around a
    `import X`. It avoids third party libraries breaking assumptions of some of
    our tests, e.g., setting multiprocessing start method when imported
    (see librosa/#747, torchvision/#544).
    r   NF)importlib.utilutil	find_specImportError)rE   	importlibspecs      r;   _check_module_existsr    s;    ~~''-4 s   "% 	11numpyfairseqscipyis_availableTnumbadilllibrosa
opt_einsumz3r   c                 D    t        |       dk7  r| j                  d      S g S )Nr   r   )rC  r   r   s    r;   split_if_not_emptyr    s    q6Q;1773<.B.r=   !PYTORCH_TESTING_DEVICE_EXCEPT_FORNO_MULTIPROCESSING_SPAWN)rF   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_NHWCr6   r7   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@NUM_PARALLEL_PROCS2g)\(?c                 .     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 r`   r8   )r   functypesr   r   rs         r;   __torch_function__zCrossRefMode.__torch_function__$  s    2$!&!r=   )r8   N)rU   rV   rW   r  r8   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 r`   )r  r  r8   r=   r;   r<   r<   .  s    /F/]J]/]r=   )rF   rI   r  c                 <    t         r| S t        j                  |       S r`   r  r   expectedFailurer  s    r;   xpassIfTorchDynamor  9  s    (4Lh.F.Ft.LLr=   c                 <    t         rt        j                  |       S | S r`   r  r  s    r;   xfailIfTorchDynamor  =  s    -B8##D)LLr=   c                       fd}|S )Nc                      t         t              st                fd       }|S t         t              sJ t        rd _         _         S )Nc                  L    t         rt        j                         | i | y r`   )r  r   r  r   r   r   msgs     r;   r   z5skipIfTorchDynamo.<locals>.decorator.<locals>.wrapperD  s$    ("++C00''r=   T)r   r,  r   r  __unittest_skip____unittest_skip_why__r   r   r  s   ` r;   r  z$skipIfTorchDynamo.<locals>.decoratorB  sR    "d#2Y( (
 N"d#$# #'B '*B$	r=   r8   r  r  s   ` r;   skipIfTorchDynamor  A      $ 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 r`   r   r  )r   r   	conditionr   r  s     r;   r   z7skipIfTorchInductor.<locals>.decorator.<locals>.wrapperZ  s$    "++C00''r=   T)r   r,  r   r  r  )r   r   r  r  s   ` r;   r  z&skipIfTorchInductor.<locals>.decoratorX  sR    "d#2Y( (
 N"d#$##'B '*B$	r=   r8   )r  r  r  s   `` r;   skipIfTorchInductorr  V  s    " r=   c                 n    t        j                  |       r	d| _        | S | t              fd       }|S )z~
    Marks the test as 'strict'. In strict mode, we reset before and after the
    test, and run without suppress errors.
    Tc                      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)r   _dynamoresetr   mockpatchr   s     r;   r   z%markDynamoStrictTest.<locals>.wrapperv  sU    ]]  !GO P POs    	A00A9)r   isclassdynamo_strictr   )cls_or_funcr   r   s     @r;   markDynamoStrictTestr  k  sA    
 {#$(!	B
2Y 
 Nr=   c                 4    t        | t        xr t              S )N)r  r  )r  r  r  r  s    r;   skipRocmIfTorchInductorr    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 r`   )rb  rS  rU  r   r  r  s     r;   r   z;skipIfLegacyJitExecutor.<locals>.decorator.<locals>.wrapper  s/    !]%9%99"++C00''r=   T)r   r,  r   rb  rS  rU  r  r  r  s   ` r;   r  z*skipIfLegacyJitExecutor.<locals>.decorator  s]    "d#2Y( (
 N"d#$#]111#'B '*B$	r=   r8   r  s   ` r;   skipIfLegacyJitExecutorr    r  r=   PYTORCH_TEST_WITH_TVc                 B     t        j                          fd       }|S )Nc                      t         j                  j                  j                  r)dt         j                  j
                  j                  _         | i |S r?   )r   r  r  dynamic_shapesfxexperimental_configtranslation_validationr   s     r;   r   zAdisable_translation_validation_if_dynamic_shapes.<locals>.wrapper  s>    ==..CHEHH!!))@4"6""r=   r   r   s   ` r;   0disable_translation_validation_if_dynamic_shapesr    s%    __R# #
 Nr=   TEST_CUDA_MEM_LEAK_CHECK PYTORCH_TEST_CUDA_MEM_LEAK_CHECKtbbBUILD_ENVIRONMENTc                 Z    	 t         |    S # t        $ r t         | j                     cY S w xY wr`   )numpy_to_torch_dtype_dictKeyErrorr,  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  r  r  s    r;   has_corresponding_torch_dtyper    s$    X&     	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 r`   r  r   r  )r   r   r   r(  s     r;   r   z+skipIfRocm.<locals>.dec_fn.<locals>.wrapper  s'    ''//4*6**r=   r  )r   r   r(  r  s   ` @r;   dec_fnzskipIfRocm.<locals>.dec_fn  s,    u%	r	+ 
	+
 r=   r8   )r  r  r  s    ` r;   
skipIfRocmr    s    	 d|Mr=   c                 .     t                fd       }|S )Nc                  L    t         r	 | i | y t        j                  d      )Nz+test currently only works on the ROCm stackr  r   s     r;   r   zrunOnRocm.<locals>.wrapper  s%    ##$QRRr=   r  r   s   ` r;   	runOnRocmr    s"    
2YS S
 Nr=   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  s%    ##$JKKr=   r  r   s   ` r;   	skipIfMpsr
    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r`   )r   r   r   s     r;   r   zMskipIfRocmVersionLessThan.<locals>.dec_fn.<locals>.wrap_fn.<locals>.<genexpr>  s     *S;Ra3q6;R   r   zROCm z is available but z	 required)	r  r[   r   versionhipr   r  r   r  )r   r   r   rocm_versionrocm_version_tupler(  r   r  s         r;   wrap_fnz: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   r  r  s   ` r;   r  z)skipIfRocmVersionLessThan.<locals>.dec_fn	  s     	r	- 
	- r=   r8   )r  r  s   ` r;   skipIfRocmVersionLessThanr    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;   skipIfNotMiopenSuggestNHWCr    r  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r`   )r   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Ls   A +Br  )r   r   s   ` r;   !setLinalgBackendsToDefaultFinallyr!  #  s"    
2YM M Jr=   c                   &    e Zd ZddddZd Zd Zy)DeterministicGuardFT)	warn_onlyfill_uninitialized_memoryc                .    || _         || _        || _        y r`   )deterministicr$  r%  )r   r'  r$  r%  s       r;   r   zDeterministicGuard.__init__1  s    *")B&r=   c                 b   t        j                         | _        t        j                         | _        t         j
                  j                  j                  | _        t        j                  | j                  | j                         | j                  t         j
                  j                  _        y Nr$  )r   $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__6  su    %*%O%O%Q"!&!T!T!V161J1J1d1d.**nn	& ?C>\>\!!;r=   c                     t        j                  | j                  | j                         | j                  t         j
                  j                  _        y r)  )r   r1  r,  r.  r0  r/  r'  r%  r   exception_typeexception_value	tracebacks       r;   __exit__zDeterministicGuard.__exit__?  s=    **&&,,	. ?C>d>d!!;r=   NrU   rV   rW   r   r2  r8  r8   r=   r;   r#  r#  0  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 r`   )r   ra   always_warn)r   r=  s     r;   r   z&AlwaysWarnTypedStorageRemoval.__init__F  s    +t,,,&r=   c                     t         j                  j                         | _        t         j                  j	                  | j
                         y r`   )r   storage&_get_always_warn_typed_storage_removalalways_warn_restore&_set_always_warn_typed_storage_removalr=  r   s    r;   r2  z'AlwaysWarnTypedStorageRemoval.__enter__J  s/    #(==#W#W#Y <<T=M=MNr=   c                 V    t         j                  j                  | j                         y r`   )r   r?  rB  rA  r4  s       r;   r8  z&AlwaysWarnTypedStorageRemoval.__exit__N  s    <<T=U=UVr=   Nr9  r8   r=   r;   r;  r;  E  s    'OWr=   r;  c                       e Zd Zd Zd Zd Zy)CudaSyncGuardc                     || _         y r`   )mode)r   sync_debug_modes     r;   r   zCudaSyncGuard.__init__V  s	    #	r=   c                     t         j                  j                         | _        t         j                  j	                  | j
                         y r`   )r   r   get_sync_debug_modedebug_mode_restoreset_sync_debug_moderG  r   s    r;   r2  zCudaSyncGuard.__enter__Y  s-    "'**"@"@"B

&&tyy1r=   c                 V    t         j                  j                  | j                         y r`   )r   r   rL  rK  r4  s       r;   r8  zCudaSyncGuard.__exit__]  s    

&&t'>'>?r=   Nr9  r8   r=   r;   rE  rE  U  s    $2@r=   rE  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)r   r  r   r   r   is_cuda10_2_or_higherrB   rz  r{  cublas_var_namecublas_config_restore)r   r   s     r;   r2  zRwrapDeterministicFlagAPITest.<locals>.wrapper.<locals>.CuBLASConfigGuard.__enter__  s    ++47 Y.3mm.@.@.F.Fs.KL.Kc!f.K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 r`   )rU  rB   rz  r{  rV  rW  )r   r5  r6  r7  cur_cublas_configs        r;   r8  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)rU   rV   rW   rV  r2  r8  r8   r=   r;   CuBLASConfigGuardrQ    s    ";EZr=   rZ  )r#  r   r+  r-  )r   r   rZ  r   s      r;   r   z-wrapDeterministicFlagAPITest.<locals>.wrapper~  sl    ::<MMOQZ Z& #$D#F# %-Q Q, %$-Q Qs#   A+	AA+A(	$A++A4r  r   s   ` r;   wrapDeterministicFlagAPITestr[  }  s     
2Y$ $2 Nr=   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_NUMPYr   
from_numpynparrayr   r   )r   r   r^  s   ` @r;   skipIfCompiledWithoutNumpyrc    sd     M	" RXXq!f-. 2Y   
 N  	"!M	"s   *A AAc                       fd}|S )Nc                      |       S r`   r8   )r   r+  r   s    r;   run_test_functionz)_test_function.<locals>.run_test_function  s    $r=   r8   )r   r+  rf  s   `` r;   _test_functionrg    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.)r   r  xnnpackrJ   r   r  r   s     r;   r   z skipIfNoXNNPACK.<locals>.wrapper  s5    ~~%%--##$oppr=   r  r   s   ` r;   skipIfNoXNNPACKrk    r  r=   c                 .     t                fd       }|S )Nc                  t    t         j                  j                  st        j                  d       | i | y )NzPyTorch compiled without Lapack)r   rZ  
has_lapackr   r  r   s     r;   r   zskipIfNoLapack.<locals>.wrapper  s/    xx""##$EFFr=   r  r   s   ` r;   skipIfNoLapackro    r  r=   c                     t         st        j                  d      S 	 ddlm} t        j
                  | |j                  v|      }|S # t        $ r t        j                  d      }Y |S w xY w)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 Caffe2r   )corez"Cannot import `caffe2.python.core`)BUILD_WITH_CAFFE2r   r$  caffe2.pythonrq  skipIf_REGISTERED_OPERATORSr  )op_namemessagerq  skippers       r;   skipIfNotRegisteredry    sl     }}ABBF&//'1K1K"K")+ N  F-- DENFs   (A A)(A)c                       fd}|S )Nc                 4     t                fd       }|S )Nc                 x    t         j                  j                  k7  rt        j                         |       S r`   )r   onnx_CAFFE2_ATEN_FALLBACKr   r  )r   expect_caffe2r  r(  s    r;   r   z6_decide_skip_caffe2.<locals>.skip_dec.<locals>.wrapper  s0    zz//=@''//:r=   r  )r  r   r  r(  s   ` r;   skip_decz%_decide_skip_caffe2.<locals>.skip_dec  s     	t	 
	 r=   r8   )r  r(  r  s   `` r;   _decide_skip_caffe2r    s     Or=   zNot compatible with Caffe2zCaffe2 is not availablec                 .     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                       fd}|S )Nc                 2     t                fd       }|S )Nc                  L    t         rt        j                         | i | y r`   )IS_TBBr   r  )r   r   r   rw  s     r;   r   z*skipIfTBB.<locals>.dec_fn.<locals>.wrapper  s$    ''00D#F#r=   r  )r   r   rw  s   ` r;   r  zskipIfTBB.<locals>.dec_fn  s     	r	$ 
	$
 r=   r8   )rw  r  s   ` r;   	skipIfTBBr    s     Mr=   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>.wrapper  s%    ##$bccr=   T	slow_test)r   __dict__r   s   ` r;   slowTestr    s0    
2Y   
 %)G[!Nr=   c                     | rt         S d S )Nc                     | S r`   r8   )r   s    r;   r<   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   r  s    r;   decz&skipCUDAMemoryLeakCheckIf.<locals>.dec  s    23T:09MB)	r=   r8   r  r  s   ` r;   skipCUDAMemoryLeakCheckIfr         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>.dec  s    24d;1:]B*	r=   r8   r  s   ` r;   skipCUDANonDefaultStreamIfr    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>.wrapper  s6    $$&!!(+ '&&s	   =Ar  r   s   ` r;   suppress_warningsr    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   r)  r+  c              3   6   K   | ]  }t        |        y wr`   )to_gpu)r   otype_maps     r;   r   zto_gpu.<locals>.<genexpr>2  s     6#QVAx(#s   )r   r   r   is_leafr{  r)  no_gradclonetorequires_grad
is_storagenewresize_sizecopy_r   r  r  r   )objr  tresr  s    `   r;   r  r  #  s   #u||${{{LLCII.]]_))+..q.8C # 1 1C  
			#	wwy  ,22377	C	-01Sq(#S11	C	6#666}  
 2s   (3E
EEc                 @    t        j                  |       j                  S r`   )r   getfullargspecr   r  s    r;   get_function_arglistr  7  s    !!$',,,r=   c                     t        j                  |        t        j                  |        t        r t
        j                  j                  |        y y r`   )r   manual_seedrandomseedr_  ra  )r  s    r;   set_rng_seedr  ;  s4    	d
KK
		t r=   c            	   #   ~  K   t               5  t               5  t        j                         } t        j                  j                         rt        j                  j                         }d d d        d d d        	 d  t               5  t               5  t        j                  j                         rt        j                  j                         t        j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   *xY w# 1 sw Y   y xY w# t               5  t               5  t        j                  j                         rt        j                  j                         t        j                          d d d        n# 1 sw Y   nxY wd d d        w # 1 sw Y   w xY wxY wwr`   )r1   disable_functorchr   get_rng_stater   r  set_rng_state)	rng_statecuda_rng_states     r;   freeze_rng_stater  E  s      
)+'')	::""$"ZZ557N ,+ ]-/zz&&(

((8	* 0]] ,+ 0/]][]-/zz&&(

((8	* 0//]]]s   F=DAC7)D1F=:D' >
F=DAD&D.	F=7D 	<DDF=D	DD$ F='F:2F.=AF		F.F"F.%	F:.F73F::F=c              #      K   t        j                         }t        j                  |        	 d  t        j                  |       y # t        j                  |       w xY wwr`   )r   get_default_dtypeset_default_dtype)r)  saved_dtypes     r;   r  r  _  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r`   )r   tensorr,  set_default_tensor_type)tensor_typesaved_tensor_types     r;   r  r  h  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   r0   c              3   2   K   | ]  }t        |        y wr`   r  )r   r%  s     r;   r   ziter_indices.<locals>.<genexpr>v  s     5}!U1X}r  )dimr  r  r   )r  s    r;   iter_indicesr  q  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  y  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   r   r   rC  r  r  )iterableinclude_emptyr  tes       r;   is_iterable_of_tensorsr    se     (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r+  r8  	stream_iddevice_indexdevice_type)r   r   current_devicebeforeStreamsr  device_countr  current_streamStreamsynchronizerZ  _cuda_setStreamr  r  r  _cuda_setDevice)r   beforeDevicer}  deviceStreams       r;   r2  zCudaNonDefaultStream.__enter__  s     zz002uzz..01A%%ejj&?&?&BC ::,,A,6Lr"..0HH$$|/E/E2>2K2K1=1I1I % K	 2 	  .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 )Nr  )r   r   r  r  r  rZ  r  r  r  r  r  r  )r   	exec_type
exec_valuer7  r  r}  s         r;   r8  zCudaNonDefaultStream.__exit__  s     zz002uzz..01AHH$$t/A/A!/D/N/N262D2DQ2G2T2T151C1CA1F1R1R % T 2 	  .r=   NrU   rV   rW   r2  r8  r8   r=   r;   r  r    s    //r=   r  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   rE   r  #torch.testing._internal.common_cudar  )r   r  rE   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_beforesr   r   r  r  memory_allocatedr   r   rZ  _cuda_clearCublasWorkspacesr   r  mem_get_info)r   num_devicesr  caching_allocator_mem_allocated
bytes_freebytes_totaldriver_mem_allocateds          r;   r2  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 ]0  }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rRsPdj                  | j                  | j                  |   || j                  |         }t        j                   |       |ssdj                  | j                  | j                  |   || j                  |         }t#        |       y )NFTrT  zCUDA caching allocator reports a memory leak not verified by the driver API in {}! Caching allocator allocated memory was {} and is now reported as {} on device {}. CUDA driver allocated memory was {} and is now {}.zCUDA driver API confirmed a leak in {}! Caching allocator allocated memory was {} and is now reported as {} on device {}. CUDA driver allocated memory was {} and is now {}.)r   r   r  r  rZ  r  r  r  r   r   r   r  r  r   rE   r;  r<  r   )r   r  r  r7  discrepancy_detectedr   r  r  nr  r  r  caching_allocator_discrepancydriver_discrepancyr  s                  r;   r8  zCudaMemoryLeakCheck.__exit__  s    
  %jj--/{#AHH002.3jj.I.I!.L+.1O1OPQ1RR'+$ $ $ 	



 {#A#'  1X27**2M2Ma2P/*/***A*A!*D'
K'2Z'?$05-%*"2T5S5STU5VV481'$*=*=a*@@)-&48J+0(# & (,5GL NTVII22153''*(N*	  c".3EL NTVII22153''*(N*  #3''w $r=   r`   r9  r8   r=   r;   r  r    s    &=.](r=   r  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_typer  7  s;     @ @"3A3 78a?@s   /	 /,',/c              #      K   	 d  y # t         j                  $ r  t        $ rH}t        |j                        dk\  r*|j                  d    d|  g|j                  dd  |_         d }~ww xY ww)Nr0   r   
)r   r  r   rC  r   )	repro_strr  s     r;   print_repro_on_failurer  >  so     	   qvv;!2i[1?AFF12J?AFs%   A0	 A0A-AA((A--A0c                      d|v r.t         j                  j                  dk\  r|j                  d       t        j                  | i |S )Nmin_satisfying_examples)rT  8   r   )
hypothesisr  __version_info__popsettingsrq  s     r;   r  r  P  sA    $.:3E3E3V3VZd3dJJ01""D3F33r=   
pytorch_ci)derandomizesuppress_health_checkdatabasemax_examplesr4  devrT  )r  r  r  r4  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.rc   r8  r0   r  )*torch.testing._internal.common_device_typer"  r  r/   r[   rC  r   rQ   )r   r"  r   device_suffixesdtdtype_suffixestest_name_chunkss          r;    remove_device_and_dtype_suffixesr(  w  s    U.H.JK.Jq}}.JOK8F8HI8H"c"gc(mn-8HNI s+
q %5b%9^%K 1$)9")=)P88,Qr233xx(2.// LIs
   B6B;r   c                 0   	
 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        sgd}d}t        j                         D ]  \  }\  }} 
|      st         t         t"        t"        t$        t&        t(        t*        t,        t        d
t/        t1        fd|            }t3        |      dkD  rddj5                  |      }dj5                  j                               }t7        d| dd| d| ddd|        t/        t1        fd|            }|g k(  st        fd|D              sd}d| d|g k(  rdnd ddj5                  |       d} n |rt8        st        j                  |      |st8        rd}t        j                  |      t:        r]t=          j                        rFt          j                        j                  j?                  d	d      st        j                  d       y y y )!NrA   r0   r   r8  r  c                     | j                         }t        |      dk  ry|d   }|d   dd j                  d      d   }j                  |      xr |j                  fv S )Nr   Fr   r0   r8  r   )r   rC  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r`   r8   )r   r   r0  s     r;   r   z"check_if_enable.<locals>.<genexpr>  s     
;$:q<?$:   Tr  r  Fr   )
macmacoswinwindowsrZ  rocmasandynamoinductorslowc                     | vS r`   r8   r  platform_to_conditionals    r;   r<   z!check_if_enable.<locals>.<lambda>  s    !CZ:Zr=   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 r`   r8   r=  s    r;   r<   z!check_if_enable.<locals>.<lambda>  s    a;R6Rr=   c              3   (   K   | ]	  }|     y wr`   r8   )r   r   r>  s     r;   r   z"check_if_enable.<locals>.<genexpr>  s     )f\ePX*A(*K\es   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) r[   r"  r   r(  r+  anyr:  r   r   r  r  r   r  rd   r=  rR   IS_MACOS
IS_WINDOWSIS_LINUXr  r  r  r  r   filterrC  rQ   r  rA  r  r   r{  )r   should_skipskip_msgdisabled_test	issue_url	platformsinvalid_platformsinvalid_plats_strvalid_platsr  r0  r>  r/  s   `        @@@@r;   check_if_enablerQ    sy   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j`al`mnp !%V,RT]%^ _I?c)f\e)f&f"&K!XYbXcbbAdiiXaNbMc dq qH E 6QH 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   )	r   r   ra  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L9Ke+9K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 )Nr0   zHOnly single element tensor-likes can be compared against a boolean. Got  elements instead.rV  )r   ra  numberra   r  r,  rY  r   r   rW  numelr  _failrE  r!  r[  )r   	bool_liker   rf  r"  s       r;   r[  zRelaxedBooleanPair._to_bool  s    i+	()))_ < <<	?"	ELL"**#=>)3Iu||)LIOO%R[R`R`Eqy

 '!35	   	())7#I"#55r=   )
rU   rV   rW   r   r+   rX  rY  rb  r[  r0  r1  s   @r;   rS  rS    s-    
 )A.??M6 6r=   rS  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 )Nrn  Fr!  r   maxrtolatol)r   r]  r^  rl  rm  rn  other_parametersr"  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 rU  )r   r   ra  rW  rX  r   rZ  
_to_numberr\  s          r;   rb  z!RelaxedNumberPair._process_inputs	  s     49<<2L P$"7"7 P:O PFD$9$9:z(Ti?jx)>)>?JvWlDm&&(<BH;MN;M%"-;M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 )Nr0   zGOnly single element tensor-likes can be compared against a number. Got rd  rV  )r   r   r   ra  rW  rf  r  rg  rE  r  ra   r   r	   r!  rv  )r   number_liker   rf  re  r"  s        r;   rv  zRelaxedNumberPair._to_number&	  s    kELL"**#=>+5k5<<+PK%%'VaVfVfEqy

 '!35	   !%%'F&$'VMT*{##7%kb%99r=   r/  )rU   rV   rW   r   r   r   int64r.  float32complex	complex64_TYPE_TO_DTYPEr   rb  rv  r0  r1  s   @r;   rj  rj  	  sS    	 	U[[u}}N 69Y]2	2O: :r=   rj  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.
    rk  rl  rm  c                    t        |   ||fi | t        | j                  |      | _        t        | j                  |      | _        y r`   rp  r   r]  r^  rl  rm  rt  r"  s         r;   r   zTensorOrArrayPair.__init__F	  s<    >-=>		=1			=1	r=   c                      j                  ||t        j                  t        j                  f        fd||fD        \  }}||fD ]  } j                  ||        ||fS )Nr	  c              3   @   K   | ]  }j                  |        y wr`   )
_to_tensor)r   ra  r   s     r;   r   z4TensorOrArrayPair._process_inputs.<locals>.<genexpr>N	  s     S@RuDOOE2@Rs   rV  )_check_inputs_isinstancer   r   ra  rW  _check_supported)r   r]  r^  r   allow_subclassesr  s   `     r;   rb  z!TensorOrArrayPair._process_inputsK	  sf    %%fhU\\2::<V%WS@RSx(F!!&R!0 )xr=   )rU   rV   rW   r   r   rb  r0  r1  s   @r;   r  r  ;	  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.rk  r  c                    | j                  ||t        j                  j                         t	        |   ||fi | t        | j                  |      | _        t        | j                  |      | _        y Nr  )	r  r   r?  TypedStorager!  r   rq  rr  rs  r  s         r;   r   zTypedStoragePair.__init__V	  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  )r   r  _untyped_storagequint8uint8quint4x2quint2x4qint32int32qint8int8r{  r)  r+  )r   typed_storages     r;   r  zTypedStoragePair._to_tensor\	  s    ||**ekkekkUZZ c-%%}':':; ''

 
	
r=   )rU   rV   rW   r   r   r  r0  r1  s   @r;   r  r  T	  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  r!  r   )r   r]  r^  rt  r"  s       r;   r   zUnittestPair.__init__u	  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^  failureExceptionr[   r  r   r  r,  rU   rg  AssertionErrortitle)r   r  errorr  	type_names        r;   comparezUnittestPair.comparey	  s    %%'		((dmmDD)) 	e*C	 NNh:dhh3MtxxSWS[S[\]S^&h&h	

>ioo&7%88LSE#RSs   %< A AA )rU   rV   rW   r   r   r   r   rY   r  r   r[   r   r  r0  r1  s   @r;   r  r  j	  s<     
tU49%%	&&#Ix}#?	Tr=   r  c                       e Zd ZeefZdZy)
StringPairstringN)rU   rV   rW   r[   bytesr  r  r8   r=   r;   r  r  	  s    ,CIr=   r  c                       e Zd ZeZy)SetPairN)rU   rV   rW   r   r  r8   r=   r;   r  r  	  s    
Cr=   r  c                       e Zd ZeZy)TypePairN)rU   rV   rW   r,  r  r8   r=   r;   r  r  	  s    
Cr=   r  c                       e Zd ZeZy)
ObjectPairN)rU   rV   rW   rD  r  r8   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  skipTestr!  r8  )r   r  	exc_valuetbr"  s       r;   r8  z5AssertRaisesContextIgnoreNotImplementedError.__exit__	  sA    Jx9L$MNN##&7	{$CDw)R88r=   )rU   rV   rW   r8  r0  r1  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r`   )r   is_warn_always_enabledset_warn_always)r  old_vals     r;   set_warn_always_contextr  	  sF     **,G	'"'g&g&r  c                       e Zd ZdZy)NoTestFN)rU   rV   rW   __test__r8   r=   r;   r  r  	  s    Hr=   r  c            
       D    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dH fd	ZdIdZd ZdJ fd	ZdddZdK fd	ZdK fd	Zd Zd Zd Zd ZdL fd	Z dId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+	 	 	 	 	 	 	 	 	 	 	 dMd*Z,d+ Z-d, Z.	 dKd-Z/dNd.Z0dNd/Z1	 dIddddddddd0d1e2e3e4e5e4ge4f   f      d2e2e   d3e2e   fd4Z6dIddd5d1e2e4   d2e2e   d3e2e   ddfd6Z7dNd7Z8d8e9d9e:e9   ddfd:Z; fd;Z< fd<Z=d= Z>d> Z?dOd?Z@eAdOd@       ZBdIdAZCdIdBZDdPdCZEdOdDZFdQdEZGe$dIdF       ZHe$dG        ZI xZJS )Rr   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)	r   r   is_initializedr  r   r  r  r  r[   )r   rtes     r;   _should_stop_test_suitez TestCase._should_stop_test_suite	  sh    ::$$&

&&(
    \cfcmcmnc#hSZZ0s   A   	B	?BBrM   c                     | j                   S r`   r  r   s    r;   	precisionzTestCase.precision	  s    r=   precc                     || _         y r`   r  r   r  s     r;   r  zTestCase.precision	  s	    r=   c                     | j                   S r`   r  r   s    r;   rel_tolzTestCase.rel_tol	  s    }}r=   c                     || _         y r`   r  r  s     r;   r  zTestCase.rel_tol	  s	    r=   c                    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^t        j                         }	 d } |t        j                   t#        |                   }d| d| d| d	}| j                  ||fd
       y y y # t$        $ r*}t&        j)                  dt+        |             Y d }~y d }~ww xY w)Nr  Tr  c                       t        t              S r`   )r  r   r8   r=   r;   r<   z#TestCase.__init__.<locals>.<lambda>	  s    ;NOb;cr=   c                 $   t        |       j                  }t        |      D ]L  \  }}|dk(  st        j                  j
                  |d |  }t        j                  j                  | |      c S  t        j                  j                  |       d   S )Nr   )startr0   )r   partsr   rB   rw   rQ   relpathr   )abs_test_pathr  r  partbase_dirs        r;   _get_rel_test_pathz-TestCase.__init__.<locals>._get_rel_test_path
  sw     !%] 3 9 9'0'7GAt#v~+-77<<r+C')ww}H'U U (8  "ww}}];A>>r=   zE
To execute this test, run the following from the base repo dir:
    z python z -k zL

This message can be suppressed by setting PYTORCH_PRINT_REPRO_ON_FAILURE=0c                     t        |       S )Nr  )r  r  s    r;   r<   z#TestCase.__init__.<locals>.<lambda>
  s    4JU^4_r=   zcould not print repro string)extra)r!  r   r   r  r  rF  wrap_with_cuda_policyassertLeaksNoCudaTensorsr  enforceNonDefaultStream_ignore_not_implemented_errorwrap_with_policyrt   r3   rT   r   getfiler,  r   r|   infor[   )	r   method_nametest_methodenv_var_prefixr  r  r  r  r"  s	           r;   r   zTestCase.__init__	  sh   %dK6"'//7;Hdfj3kk/22:..{D<Y<YZ ,,Ebdh0ii,//
**;8T8TU11%%k3cd%!0!E!E!GK? %7wtDz7R$SM%H]O4} =K!NI
 ))#)2_a/ &! #T ! KHH;3q6HJJKs   =AE 	E; E66E;c                 B    || j                         n|}t        | |      S r`   )r   r  )r   rE   s     r;   r  z!TestCase.assertLeaksNoCudaTensors
  s      Ltwwyd"4..r=   c                     t               S r`   )r  r   s    r;   r  z TestCase.enforceNonDefaultStream"
  s    #%%r=   c                 b    t         |   t        |t              r|n
t        |      ||dz         S Nr0   )r!  assertExpectedInliner   r[   )r   r]  expectr$  r"  s       r;   r  zTestCase.assertExpectedInline%
  s1    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)Nr0   )r  r$  )r$  Did not raise when expected tor  )r  	munge_excfail)r   r  rm  r  r  r  s         r;   assertExpectedInlineMungedz#TestCase.assertExpectedInlineMunged)
  sX    	J 			6	7  	%%!_1EvTU &  		s    A AAc                 R    |t        j                  d      }t        |   ||      S Nr   )logging	getLoggerr!  
assertLogsr   loggerlevelr"  s      r;   r  zTestCase.assertLogs5
  s*    >&&w/Fw!&%00r=   c                 R    |t        j                  d      }t        |   ||      S r  )r  r  r!  assertNoLogsr  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   r  policyr  r  fullnames         r;   r  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 r`   )r   r  r  )r   r  r  r  s       r;   r  zTestCase.wrap_with_policyK
  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r`   r8   )r   r   r   methodr  s      r;   r   z1TestCase.wrap_method_with_policy.<locals>.wrapperY
  s    '' s   	$)r   r  
MethodType)r   r  r  r   s    `` r;   r  z TestCase.wrap_method_with_policyR
  s0     
v	( 
	( ..r=   c                 :    | j                  || j                        S r`   )r  r  )r   r  s     r;   wrap_with_cuda_memory_checkz$TestCase.wrap_with_cuda_memory_check_
  s    ++FD4Q4QRRr=   c                 @   t        |t        j                        }|dk(  r||t        t        d}d}t        r|r|j
                  r|j
                  j                  d      \  }	}|j                  r|j                  j                  d      \  }	}|r||d<   |dk(  r%|j                  | t        j                  |             |dk(  r|j                  |        |dkD  r1|dkD  r,|r*d|d<   |j                  | t        j                  |             y |rK|dnt        |j
                        }
|dnt        |j                        }|dnt        |j                        }t        | <  }|j                   }t"        xs t$        xs t&        }t)        |dd	      xr |}|rt*        j,                  j/                          |r| }n$t*        j,                  j0                  j2                  }t        j4                  j7                  d
|      5  t&        r't+        j,                  j9                  dd	      |      }nZt$        r't+        j,                  j9                  dd	      |      }n-t"        r't+        j,                  j9                  dd	|      |      } ||       d d d        |rt*        j,                  j/                          | j;                         r|j=                         rot?               }t@        .ddl!m"}  |||      }|jF                  |_$        d|_%        d|_&        |j
                  jO                  |df       |j=                         d	u sJ |jQ                          tR        r|sy tU        jV                         }|dz
  }
t        |j
                        k  rtY        d| jZ                   d|        |r	|t        k  s|s@|dkD  r;|j
                  j                  d      \  }	}tY        |       |j]                  | |       | j_                  ||||dz   |       y t        |j                        k  rtY        d| jZ                   d|        |r	|t        k  s|s@|dkD  r;|j                  j                  d      \  }	}tY        |       |j]                  | |       | j_                  ||||dz   |       y t        rg|t        k  r^t        |j                        k(  rFtY        d| jZ                   d|        |j                  |        | j_                  |||||dz          y |rO|t        k  rFtY        d| jZ                   d|        |ja                  |        | j_                  |||||dz          y |s$|t        k  r| j_                  |d|||dz          y y y # 1 sw Y   xY w)Nr   )num_red	num_greenmax_num_retriesrerun_disabled_testr   r8  traceback_strTflakyr  Fr  r:  )save_configaot_eager_decomp_partitioneager)r  nopython)rI  )	_TestInfork  TestSuiteEarlyFailurez%TestSuite execution was aborted earlyr0   z    z failed - num_retries_left: rI  num_runs_leftreport_onlyr  r  z errored - num_retries_left: z succeeded - num_retries_left: )1r   r   
TestResultMAX_NUM_RETRIESrA  failuresr  errorsr%  rz   dumps
addSuccessrC  skippedr!  run__self__r  r  r  r   r   r  r  r  suppress_errorsr  r  optimizer  rJ  r   r  rF  r  ERRORr3  elapsed_timetest_descriptionr  stoprn   r  exc_infor  r+  addExpectedFailure_run_with_retryaddUnexpectedSuccess)r   rI  r  r  r  r  using_unittestskipped_msgr  rc   failures_beforeerrors_beforeskipped_before	super_runtest_clscompiledstrict_modesupress_errorsr  r  r  num_retries_leftr"  s                         r;   r0  zTestCase._run_with_retryg
  s=   #FH,?,?@A #&#2';	K M# ??'-':':2'>$A}=='-}}'8'8'<$A} 3@K0>NN4K)@Aa< %%d+1}1'+G$tTZZ%<=#)>as6??7KO!'AS5GM"(.Qc&..6INGK	%% )Z,?ZCZh?LHMM!
 !,_N"]]11AAN]]  !GX&!MM22:52QR[\	$!MM223O]b2cdmn	&!MM227Xc2deno	V$ Y MM! '')##%z , ;$VT2D"+//DK(+D%,CD) &&.U'VW++-666KKM~lln(1,S11D--..JK[J\]^ 0? BK\lop\p#)??#6#6r#: =m$))$4  >N\g)01	 ! KS//D--..KL\K]^_ 0? BK\lop\p#)==#4#4R#8 =m$))$4  >N\g)01	 ! K!&6/&In`cdjdrdr`sNs D--..MN^M_`ad#  >N\g)0IM ! K-? D--..MN^M_`a''-  >N\g)0IM ! K!1O!C   a[)0IM ! K "DO YXs    BVVc                     t        j                         5 }t        r|j                  t	                      t
        r	t        dz   nd}| j                  ||t         dd       d d d        y # 1 sw Y   y xY w)Nr0   r   r  )	
contextlib	ExitStackr  enter_contextr  rn   r   r0  rp   )r   rI  r   rh  s       r;   r&  zTestCase.run
  sb    !!#u!##LN3.>*AH  & 55 ! 	 $##s   AA**A3c                 J   t        |        t        t               t        j                  j
                  j                         | _        t        j                  j
                  j                          | j                  r(t        j                         t        j                  k(  sJ y y r`   )rQ  r  SEEDr   sparsecheck_sparse_tensor_invariants
is_enabled_check_invariantsenabler  r  r.  r   s    r;   setUpzTestCase.setUp  sp    T "'!L!L!W!W!Y 	33::<,,**,;;; -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 y y )NrF  )
r   rF  r   rC  rD  rG  disabler  r  r.  r   s    r;   tearDownzTestCase.tearDown  sm     4,-%%;;BBD;;CCE,,**,;;; -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 )Nr0   r   r8   )r  mMKn_colsn_rowss       r;   sawteethz-TestCase._make_crow_indices.<locals>.sawteetha  sd    
 !
Q/14A!
Q/A!!a89AQK1<LLLr=   r0   r   r  r   Nr  )r  )r   zerosr+  rq  fill_divmodmathisqrtarangerandpermcumsum_r  )rR  rQ  nnzr+  r)  r  rS  countsr  rN  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_indices)  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=   r8   )	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   Nr8   r   r}  r  s     r;   r   z5TestCase.genSparseCompressedTensor.<locals>.<genexpr>  s     9(8147Q;(8r2  invalid argumentsr  r8  r0   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r+  r)  r  r0   r8  r   r   r+  r)  lowhigh)rl  r   rT  r  sortrZ  r  r(   )n_compressed_dimsn_plain_dimsr\  compressed_indicesplain_indicesr  countrc   ry  rz  r4  rm  
dense_sizer+  r)  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  r)  layoutr+  )operatorrp  r   rq  rC  r  rC  r  r   
sparse_csr
sparse_bsrmapr   r3  r   r   reshapesparse_compressed_tensor)r   r  r\  r  r+  r)  r  rm  rn  rp  rq  
sparse_dim
blocksize0
blocksize1r  batch_shapen_batchr|  r}  blocknnzrc   sparse_tensorssparse_tensors_itr4  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vgubc23DlT\]gu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$)rn  c          
      P    | j                  ||t        j                  |||d|      S )Nr8   r  r+  r)  r  rm  rn  )r  r   r  r   r  r\  r+  r)  r  rn  s          r;   genSparseCSRTensorzTestCase.genSparseCSRTensor  s6    --dC@P@PY_49{^`mw . y 	yr=   c          
      P    | j                  ||t        j                  |||dd      S )Nr8   r   r  )r  r   
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  )rC  r  r   r  r   r  rm  r\  r+  r)  r  rn  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  )rC  r  r   
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rs  r8   rt  s     r;   r   z+TestCase.genSparseTensor.<locals>.<genexpr>  s     :(9147Q;(9r2  r   ru  r8  r0   rx  r  r   .r  F)rC  r  r   r(   r   randmul_r  	unsqueezer  longcatsparse_coo_tensorSizecoalescedetachr  _coalesced__indices_values)r   r  r  r\  is_uncoalescedr+  r)  v_sizer6  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 ]  \  }}|t         j                  u r=t        |      dk(  sJ |j                  dd      }|J |d   j                  |       U|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}d2 fd&	}|D ]  \  }}}|s|D cg c]  }|r|	 }}|r|s!t        j                  |t         j                  '      }|s|j                   d!kD  rX|D ]7  } &||      |   }|D ]"  }|dd% D cg c]  }|j#                  ||(       }} %|d%   |      j#                  ||(      }g ||t%        |||j&                  |z   )      f |r|j                   d!kD  rxd*D ]s  \  }}|D cg c]  } ||||+       }}g ||t%        |||j&                  |z   )      f |	sE ||d%d+      }g ||t%        |||j&                  |z   )      f u |	s ||d%d+      }g ||t%        |||j&                  |z   )      f % :  |rd,d-g|rg d.ndgfd/g d0dgfd1d-gdgffD ]  \  } }}|D ]w  }|D ]n  }|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 g ||t%        ||| |z   )      f q z  yyc c}w c c}w c c}w w)3a  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)

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

          - strided input is defined as
            (values,), dict(device=device, dtype=dtype)
        NF)
r+  r)  r  enable_batchenable_hybridenable_zero_sizedenable_non_contiguous_indicesenable_non_contiguous_valuesenable_batch_variable_nseoutput_tensorr0   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   r0   r8  r  )shaper  	transposerD  r   rY  rf  )patternrm  basesizeblockpattern	block_idss        r;   get_blockpatternz9TestCase.generate_simple_inputs.<locals>.get_blockpatternQ  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   r0   r)  )	minlength)r  rC  r   wherer   rT  ry  cumsumbincountrY  r  
sparse_coor  r  strided)r  r  indicescoo_indicesrk  col_indicesstrided_valuesr4  	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   r0   r   )	r   r  r  r   r  r  r  r  r  )r  rm  nonblock_datar  
block_datar  block_indicesbibj
bsr_values
bsc_valuesr  r  s              r;   get_sparse_data_with_blockzCTestCase.generate_simple_inputs.<locals>.get_sparse_data_with_block  s^   +G4M+GY?L(6J*5==9!<N&u'7'78;M4A4K4KAq4Q&S4Q&"b '5R)A,5FQR[\]R^G^5^57)A,5FQR[\]R^G^5^6_ '`4Q&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   r0   r  r   c              3   F   K   | ]  }|   j                  d         ywrs  )r  )r   jr}  s     r;   r   zQTestCase.generate_simple_inputs.<locals>.get_batch_sparse_data.<locals>.<genexpr>  s"     ?i[hVW!q@Q[hs   !)r  rC  r   rR   r{  r   r  r  fullry  set_r  r  r  )r  rm  r  
batch_datar  r  r  r  ext_coo_indices1r  r}  get_batch_sparse_datar  s             @r;   r  z>TestCase.generate_simple_inputs.<locals>.get_batch_sparse_data  s   ==D4yA~1'9EE J$W-4!6tY!G!M!M!OIFA'^^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] &q	uyy&)QqT^^TUEV9W/X Y &3! "P .& 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   r  r0   NrT  ).N)N.)
r   r   ndimr   r   rT  ry  rY  r   add_)base	densesizebr  r  r}  ygenerate_valuess          r;   r  z8TestCase.generate_simple_inputs.<locals>.generate_values  s     dC(TYY]{{4#P4aOAy$A4#PQQqy{{9EKK@@Yq\=A!)AB-01LL%++6"Q-HiL1Y</ 1 FF4LH $Qs   D)r0   r   r   )r0   r   rT  r   r0   )r0   rT  )r8   r      r  )r0   r   rT  )r0   r   r   )r   r   r   r   rT  r8   r  )r   r0   r   r   r   r   )r   r0   r   r   r   r   )rT  rT  rT  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  r  )   r  r  r   r  r  r  r   rT  r  )r0   r0   r8  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   r0   r  )
assertTrueis_contiguousr  rq  r   rT  r  r)  r+  slicer  assertFalser  )r  r  offsetsteptmp
dim_slicesr  r   s          r;   non_contiguous_copyz<TestCase.generate_simple_inputs.<locals>.non_contiguous_copy  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=   r  rw  )r+  r)  r  >   r   r0   r  r   )r  r  )r   r   r0   r   )r8   r  r  )r   r   )r  r  )rT  r   )r   r   )r8  r   )r   ry  r  r  r  r  generate_simple_inputsr  rC  r  r  r  r  updater  r  r  r  rX   r  empty)*r   r  r+  r)  r  r  r  r  r  r  r  r  patternsis_compressed_sparse_layoutr   r   r  r  r  
blocksizes
densesizesr%  rm  datar  r5  r  r4  r  r  indices_copyvalues_copyr  rk  r  r  r  r  r  r  r  r  s*   `                                    @@@@@r;   r  zTestCase.generate_simple_inputs  s/    F ++K&,1A1A5CSCSUZUeUeglgwgw0x&x# $ ; ;F6Y^lwIUerN_ZwYuVoJO !< !Qf U]]*t9>)>!::fd3D+++q'//$//u///114B6BB0MMM088$I&II1%!Q& 		3"	6H	%(	8	2 4 %v.0BD 	  	 ! $*6"2RJ@ %$$$$$$$& )/x"f? q6q6q6q6 %X0IrT9UHB	  08+GZ )3=A1a
=:ll7%++>GGLL1$4'	,Wi@H!+IOSTWUWyYy!qtt6tEyGY,T"XyADDFZ_D`F,G,V,d&8?	8Q/S S S 59I->MS&dk+ldk_`,?sSY,ZdkL+l"9L"9&"94vUZEL]]U^E^<` #` `  <.A&bYZ.[&B&Bk&BDPV^cNUmm^gNgEi 'i !i .? 4&9&bQR&S555t6QVAHQZAZ8\ \ \) ", ( 08D fX]'9QSPTU5t<fXt,50*j
 ",I%/	!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000$fEX`clXl2mmm; &0 ",5 A > Z ,ms?   G
XXXAX;X	
A X5X(X03X$K/Xc                 |    |j                   t        j                  k(  r|j                         }|j	                         S r`   )r  r   r  r  to_dense)r   r  s     r;   safeToDensezTestCase.safeToDenseZ  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  ra  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_referenceb  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)Nr  rw  )r_  r   r   r   r  r   r)  bfloat16r.  r  copytorch_to_numpy_dtype_dictra  rz  rb  r  rW  r`  r   r  r  )r   r  np_fntensor_liker+  r)  r   t_cpur5  r  r}  	np_resulttorch_results                r;   compare_with_numpyzTestCase.compare_with_numpyq  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   r   	ones_liker   r  r  )r   r   r  r   r   s        r;   assertEqualBroadcastingz TestCase.assertEqualBroadcasting  si     !X&"Q&A!U\\*"U\\!_4At16t6v66r=   )rs  rr  	equal_nanr+  r  exact_layoutexact_strideexact_is_coalescedr  rs  rr  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                        r|j                  r|j                         }t        |t        j                        r|j                  r|j                         }t        ||t        t        t        t        t        t         t"        t$        t&        f	t        t(        t*        t,        t.        t        j0                  j2                  j4                  j6                  ft8        t:        t<        t>        f|| j@                  || jB                  ||||	|
|      }|rJ|g}|jE                         d   jG                  t        tH              r| jJ                  r	fd            y )NTc              3      K   | ]6  }t        |t        j                        xr t        |j                          8 y wr`   )r   ra  rW  r  r)  )r   ra  s     r;   r   z'TestCase.assertEqual.<locals>.<genexpr>  s9      
jpafJubjj)\2OPUP[P[2\.\\jps   <>c                     t        | t        j                  t        j                  f      r| j                         S t        |       S r`   )r   r   r   ra  rW  tolistr   ra  s    r;   to_listz%TestCase.assertEqual.<locals>.to_list  s0    )3EELL"**;U)Vu||~g\`af\ggr=   r  )
pair_typessequence_typesmapping_typesrr  rl  rs  rm  r0  check_devicern  check_layoutcheck_stridecheck_is_coalescedr   c                     |  d S )Nr  r8   )generated_msgr  s    r;   r<   z&TestCase.assertEqual.<locals>.<lambda>  s    -3%'@r=   )&rD  r   r   r   r   	as_tensorr)  r+  	is_nestedunbindr.   r*   rS  rj  r  r  r  r  r  r  r$   r!   r#   r   r/  r  datasetSubsetr   r    r"   r   r  r  r  to_errorr[   longMessage)r   r   r  r  rs  rr  r0  r+  r  r1  r2  r3  __tracebackhide__r9  error_metass      `           r;   r  zTestCase.assertEqual  s   " !  
klnojp
 
h 
A
A 5<<(Z8-DBA8$Au||)DBA a&1;;
Aa&1;;
A+"!! 
   ((// #JzJ,,..%#%%1A!
F &-K//#A&// FPPSUXEY^b^n^n@	  ux	 	 r=   rs  rr  c                    | j                  t        |      5   | j                  |||f||d| d d d        y # 1 sw Y   y xY w)Nr  rL  )assertRaisesr  r  )r   r   r  r  rs  rr  r   s          r;   assertNotEqualzTestCase.assertNotEqual  sA    ~37DQ3GTGG 877s	   :Ac                     | j                  |j                  |j                         | j                  |j                  |j                         | j                  |j                  |j                         y r`   )r  r+  r)  	is_sparse)r   r   r  s      r;   assertEqualTypeStringzTestCase.assertEqualTypeString  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
  s-    D#w"T("  ;<<r=   c                     | j                   r"t        ||       }	 |j                  d||      d }S t        |   |g|i |S # d }w xY w)NrN  )r  r  handler!  rN  )r   expected_exceptionr   r   contextr"  s        r;   rN  zTestCase.assertRaises  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 )Nr  mpsr   assertRaisesRegex)r   r  NATIVE_DEVICESr  r  rW  r!  r\  )r   rX  expected_regexr   r   rY  r"  s         r;   r\  zTestCase.assertRaisesRegex   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 r`   r8   )
unraisableraiseds    r;   record_unraisablez6TestCase.assertNoUnraisable.<locals>.record_unraisable:  s    Fr=   zsys.unraisablehook)r   	isenabledrJ  r   r  r  rG  assertIsNone)r   rm  r   r   rc  prevrb  s         @r;   assertNoUnraisablezTestCase.assertNoUnraisable7  s    	  ||~


	$$%9;LM$)&) N 		&! N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subnamer  r  )assertExpectedr[   r  )r   r  rm  r   r   ri  r  s          r;   assertExpectedRaiseszTestCase.assertExpectedRaisesN  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  r  rC  )r   rm  r  wss       r;   assertNotWarnzTestCase.assertNotWarn[  sb     $$D1R!!(+(.
 /OOCGqL#.	 21.. 21s"   !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
        Trm  ro  Nr   zno warning caughtc              3   L   K   | ]  }t        |j                        u   y wr`   )r,  rw  )r   wcategorys     r;   r   z0TestCase.assertWarnsOnceRegex.<locals>.<genexpr>t  s     HRQYY8 ;Rs   !$c              3   p   K   | ]-  }t        j                  t        |j                               / y wr`   )r  matchr[   rw  )r   rt  r  s     r;   r   z0TestCase.assertWarnsOnceRegex.<locals>.<genexpr>v  s%     Br!BHHWc!))n5rs   36r?  )r  compiler;  r  r  r  rC  r  r  rD  r,  rw  )r   ru  regexrp  rt  r  s    `   @r;   assertWarnsOnceRegexzTestCase.assertWarnsOnceRegexe  s      **U#$$D1R!!(+(. /2w!|		-.OOCHRHHIOOBrBB)2"T"QQYY88Sqyy"TUVX 21.. U 21sG   ,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 r`   )r  rC  )textprefixs     r;   remove_prefixz.TestCase.assertExpected.<locals>.remove_prefix  s$    v&CKL))Kr=   r   r  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 rB  :

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

No expect file exists; to accept the current output, run:
python rO   z	 --acceptzCppOp\[(.+?)\]zCppOp[]z#producer_version: "CURRENT_VERSION"zproducer_version: "rA  zupdated outputassertMultiLineEqual)!r   r[   r  r"  rV   r   rB   rw   realpathr  modulesr  rQ   dirnamery   re  OSErrorerrnoENOENT
expecttestACCEPTr   r  rF  r  rH  r/  r   r}  producer_versionr   r  r  )r   r%  ri  r  	module_id	test_filer^  r  rf  r  r  r  r  s    `        @@@r;   rj  zTestCase.assertExpectedy  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  rH  rj  )r   r%  ri  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 deltar  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domainr  	attributerE   r%  decoder{  r  )	r   
onnx_modelr  r  r  all_aten_nodesopattrattrss	            r;   assertAtenOpzTestCase.assertAtenOp  s    %/%5%5%:%: U%:YY&0QXXAS5S %: U' B<>LLILDTYY/LE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: "rA  r*  rm  ro  )r#  r\  r   r[   r  assertWarnsRegexrk  r;  r  r  r   r  r  r  )r   r   caller_nameshould_alertalert_messager  rt  r}   s           r;   check_nondeterministic_alertz%TestCase.check_nondeterministic_alert  sw   " k),hh  %++$%W , Y D	Y YD &,  5**#%' D' '
 ,,D9Q))(3D#$%g{; OOBIImS\,RVZ,Z[ $% : 65)Y Y $ EQO		68;A?ADEF  &%0' '
 :9 65s   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  rB  PIPEcommunicate)coder  r  popenr  r  s         r;   run_process_no_exceptionz!TestCase.run_process_no_exception1  sV     
  ^^T4(????	
 !,,.r=   c                     t         j                  j                         }d|d<   d|j                         v r|d= t        j                  | |      \  }}|j                  d      S )Nr7   PYTORCH_API_USAGE_STDERRr^   )r  rb  )rB   rz  r"  r   r   r  r  )r  r  r  r  s       r;   runWithPytorchAPIUsageStderrz%TestCase.runWithPytorchAPIUsageStderr>  s]    jjoo*-&' 388:D	#<<Ts<K}}W%%r=   )runTestr`   )r   r  )Nr   Tr   r   )NNNTTTTTFTNr/  )r   )NNNT)KrU   rV   rW   r  r.  rY   r  r  ra   r  maxsize_diffThresholdmaxDiffr  propertyr  setterr  r  r  r  r   r  r  r  r  r  r   r  r  r  r  r0  r&  rH  rK  rZ   rl  r  r  r  r  r  r  r  r  r  r)  r,  r/  r   r   r[   r   r  rO  rR  r   r   rU  rN  r\  rg  rk  rq  r   rz  rj  r  r  r  r  r  r  r0  r1  s   @r;   r   r   	  s)    JHe */ $. [[NG 5   e       ^^E d   "'"' %*!0Kd/&r
 >B
81
3

ZV/SRKj
<&< 48K. K.Z egst ,l\ WX y WX p bc @
 bc @
<: '+%)+/,0-115=A<@9>-1(,EnN
I  /3 <DD
	7 ?C	Z %)$($Z %XseSj%9 9:;	Z 5/Z 5/ZxH/3TH H%e_H;CE?H`dH
3=# =# =4 =
Mb.".8/ X X&N.`()<H6\r 	  	  & &r=   r   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  wbrt  zcould not download test file 'rA   )urllib.parser  urllibr  r  rB   rw   basenamer   rQ   r  r  r9  urlopenre  ry   r  URLErrorr;  r<  RuntimeWarningr   r  )urlbinaryr  r  r  r~   data_dirrw   r  rf  r  r  s               r;   download_filer  J  s   %%wwa 01H bggooh.G!PQH77<<(+D	ww~~d,sB/446$C0AGGDM 1 1>> ,.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
    r0   )	localhostr   N)	r   socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindgetsockname)sockrc   ports      r;   find_free_portr  ^  sn     
v~~v/A/AB	Ct))6+>+>B		"#""$4	 
D	C	Cs   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)NrT  c              3   8   K   | ]  }|t              v   y wr`   )r[   )r   connect_errorr  s     r;   r   z=retry_on_connect_failures.<locals>.wrapper.<locals>.<genexpr>  s     W}}E
2s   r0   r   zFailing after z retries with error: )r   rD  r[   timesleepr  )r   r   	n_retriestries_remainingr  r  r  s       @r;   r   z*retry_on_connect_failures.<locals>.wrapperx  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  r  r   s   `` r;   r  r  q  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)Nr0   z%s, Retrying in %d seconds...zSkipping after z consecutive )r[   r  r  r  r   r  )r   r   mtriesmdelayr  r  ExceptionToCheckdelayrf  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  )rf  r  r  r  r  r  s   ` r;   
deco_retryzretry.<locals>.deco_retry  s"    	q	| 
	| r=   r8   )r  r  r  r  r  s   ```` r;   retryr    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   r0   r  )r   randnlinalgsvdr  r  r  )	lrankr)  r+  Aur%  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  r8  Fr  NT)
descending)r   r.  doublecfloatcdoubler  r  r  r  r  minr{  r4  r  r  )r)  r+  r   r  r  primitive_dtyper   rN  r  r  rc   r  r%  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 )NT   r  ).r   ).r0   )r  r)  is_floating_point
is_complexrW  nanr   ra   	new_emptyr  r  requires_grad_r  )r  rS   rI  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 Nr)  r+  r   r  r   )r{  r   r  r  mTdiv_r  batchesr   r)  r+  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 )Nr8  r  rw  r   )r(   r  r  )r+  r)  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{  r   r  r  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)
    r)  r+  r   r  )r{  r   r  r  r  r  s         r;   random_symmetric_psd_matrixr$    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  )r   r  r!  matrix_sizer)  r+  
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 )Nr)  r+  r   r  h㈵>)r{  r   r  r  matmulr  eye)r'  r(  r   r)  r+  r   s         r;   random_symmetric_pd_matrixr.    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 )Nr8  r  rw  r+  )r(   r   r-  r  )r+  r)  r  r  r  s        r;   make_symmetric_pd_matricesr0    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  )r   r  r!  r-  r&  s        r;   random_hermitian_pd_matrixr2  !  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)Nrw  Fr  r8  r  r   r  r0   g      r  )r   r  r(   r  r  r)  r  realr  rY  reciprocal_r  r  r  )r+  r)  r  r  r  r  rc   r  
real_dtyperh  r%  r   s               r;   4make_fullrank_matrices_with_distinct_singular_valuesr7  /  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
    r)  r+  r   silentFsingularr  r   r  r0   r   r  )r{  r   r  rZ  rn  onesr  rf  r  r  r  linspacer  )rowscolumnsr(  r   r)  r+  r9  r:  r   r  rc   r  rh  r%  s                 r;   random_matrixr?  D  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_matrixrC  c  s>     	dD8:88AdG;j;F;A88A;r=   {Gz?c                    |j                  dt        j                        }|j                  dd      }|j                  dd      }t        | |      }t	        t        | |      t        | |z  |z              }t        |      D 	cg c]  }	|	| z  	 }
}	t        |      D 	cg c]  }	|	|z  	 }}	t        j                  |       |
|g}t        j                  |||      }|t        j                  t        | D 	cg c]  \  }	}t        |	|z
        dz    c}}	||      j                         z  }t        j                  |      }t        j                  ||| |f|      }|j                         S c c}	w c c}	w 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.
    r)  r+  r   r:  Fr  r   r  )r{  r   r  r  rq  r   r  r  shuffler  r  r3  r.  expr  r  )r=  r>  densityr   r)  r+  r:  rh  nonzero_elementsr  r  column_indicesr  r4  r  indices_tensorr   s                    r;   random_sparse_matrixrL  l  sY    JJw-EZZ%(Fzz*e,HD'A3tW-s4'>G3K/LM%*+;%<=%<1t8%<K=+01A+BC+Baa'k+BNC
NN>"N+G[[)vFF
ellgGAU1q5\1_,Gu]cdhhjjF\\'*NwPVWA::< >C
 Hs   E/E48E9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   Nr   r)  r+  r   r0   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  r  cssnleftrh  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   )rQ  Fr  r  )rW  r{  rD   r  r  r.  rC  r  randintuniformpicossinsortedrR   r  r  r  )r'  rH  r   rW  r   r)  r+  r  r  rV  
target_nnzr  thetarO  rP  icoordsjcoordsr4  r6  rK  s                       r;   random_sparse_pd_matrixra    s    JJw	' 23EJJw-EZZ%(F;')' FE!a%L;..' 	 )#" ;&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 )Nr  )r)  r  r+  )r   float16rT  assertIsr)  r  r  r+  )r   dtypesr  r+  r)  outs         r;   do_test_dtypesrg    sd    EMM!++fE&PCMM%+MM&#**-VSZZ0 r=   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   rT  c                    j                  | j                         j                  || j                         j                  || j                         j                  | j
                  |       | j                  r|j                  || j                         |3| j                        j                  |      }j                  | |       y y r`   )
r  r  rd  r)  r  r  is_cudar+  r  rU  )	r  r)  r  r+  rS   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   r0   r8  )rQ   r[   r   r   ry  r  
attrgetter)r)  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=   r8  Fg      )r)  r+  r  r  )rf  r+  r  r  )r)  r+  r  )r)  r  r+  r  r0   r  r  )r   r  r  r  r  r  r  r  r  
empty_likerc  r  new_full	full_like)r   re  r  r+  rl  rp  default_dtyper)  rgint64_dtyper6  rf  fvr  s   `            @r;   do_test_empty_fullrx    s   JJ1vE	+8 ++-ME"M5=="dER

5#&u}}b$PUV**E2B)%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 3 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  )	rB   rw   abspathr  r  r  endswithrunning_script_pathr   )running_files    r;   set_running_script_pathr~     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|  rB   rw   rz  r  r   r  r"  r   )r  test_case_class_files     r;   $check_test_defined_in_running_scriptr  	  s    "77??277+;+;GOOIL_L_<`+ab#66 E:UV_VbVbVdUe f22E1FmThSi jE9E E6r=   c                     t                t        j                         }|D ]8  }t        s|D ]  }t	        |        |j
                  s(|j                  |       : |S r`   )r~  r   r  rr   r  r  addTest)loaderr	  r  
test_suite
test_groupr   s         r;   
load_testsr    sT    ##%J
)"4T: #z*  r=   c                       e Zd Zd Zd Zy)BytesIOContextc                     | S r`   r8   r   s    r;   r2  zBytesIOContext.__enter__  r   r=   c                      y r`   r8   )r   r   s     r;   r8  zBytesIOContext.__exit__!  s    r=   Nr  r8   r=   r;   r  r    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  rR   r{  r   autograd	gradcheck)r   inputsr   default_valueskeyrS   rh  s          r;   r  r  2  st     #N
  &+{#$**,
UJJsD!=aes -
 >>##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  rR   r{  r   r  gradgradcheck)r   r  grad_outputsr   r  r  rS   rh  s           r;   r  r  H  sv     #N
  &+{#$**,
UJJsD!=aes -
 >>''FLKFKKr=   c                 t    | j                  t        ||fi |       | j                  t        ||fi |       y r`   )r  r  r  )r  apply_fnr  r   s       r;   _assertGradAndGradgradChecksr  ]  s8     8V>v>?xB6BCr=   rw   c              #      K   t        j                         }	 t        j                  |        d  t        j                  |       y # t        j                  |       w xY wwr`   )rB   getcwdchdir)rw   old_cwds     r;   set_cwdr  d  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	coalescedTFr8   )r   r   r   rf  s      r;   wrappedzcoalescedonoff.<locals>.wrappedz  s1    	$00040	$11151r=   r  )rf  r  s   ` r;   coalescedonoffr  y  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)r0   r0   r   r8  r  )r  r  r  r   r  r+  cumprodflip
unsqueeze_sumallcloser{  unique)r%  r  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r`   )r   rd  rJ  rG  r8   r=   r;   
disable_gcr    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   r   r  resolveparentrB   rw   r9  )r  
torch_rootrw   s      r;   find_library_locationr    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  rU   r  r  r   r   r  r(  s     r;   r   z?skip_but_pass_in_sandcastle.<locals>.decorator.<locals>.wrapper  s+    Idmm_,QRXQYZadakaklr=   )rd   r  r  r   )r  r   r(  s   ` r;   r  z.skip_but_pass_in_sandcastle.<locals>.decorator  s8    %)D")/D&K	t	 
	 r=   r8   )r(  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 r`   r8   )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_wrapperr    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   r4  )r   r   r  r6  s       r;   get_tensors_fromr    sX    t?tz#v'>t?!==?D?ajF.C?DE F F?Ds   AAA 
A 
	byte_listr)  r+  c                 x   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$                  i
}||   }t        j(                  |      }d }|j*                  rt-        |       |dz  k(  sJ  ||        |j/                  t        j0                  |z  | d |        j2                  }|j/                  t        j0                  |z  | |d         j2                  }|d|z  z   }	nFt-        |       |k(  sJ  ||        |j/                  t        j0                  |z  |        j2                  }	t        j4                  |	||      S )Nc                 2    | D ]  }d|cxk  rdk  rJ  J  y )Nr      r8   )r  bytes     r;   check_bytesz$bytes_to_scalar.<locals>.check_bytes  s%    D###### r=   r   y              ?rw  )r   r  ctypesc_int8r  c_uint8int16c_int16r  c_int32ry  c_int64ra   c_boolrz  c_floatr|  float64c_double
complex128sizeofr  rC  from_bufferc_byterS   r  )
r  r)  r+  dtype_to_ctypectype	num_bytesr  r4  imagr  s
             r;   bytes_to_scalarr    s   

FMMV^^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))rE   argdefsclosure)
r  FunctionType__code____globals__rU   __defaults__r&  r   update_wrapper__kwdefaults__)rf  gs     r;   	copy_funcr    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 r`   )r  r   r  r  r   )r	  r  r	  s     r;   decoz#xfail_inherited_tests.<locals>.deco	  s8    A CH44YwsA5OPQ  
r=   r8   )r	  r  s   ` r;   xfail_inherited_testsr    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>.wrapper  s(    Idmm_4YZ`Yabilisistr=   T)rd   r   r  r  )r  r   r  r(  s   ` r;   r  z1skip_but_pass_in_sandcastle_if.<locals>.decorator  s;    tu u)-&-3*r=   r8   )r  r(  r  s   `` r;   skip_but_pass_in_sandcastle_ifr    s     r=   c                 <    t        |       j                  d      d   S )zC Returns the pretty name of the dtype (e.g. torch.int64 -> int64). r   r0   )r[   r   r  s    r;   r*  r*  '  s    u:C ##r=   bf16f64f32f16c32c64c128i8i16i32i64b8u8c                 >     t         s S t                fd       }|S )zSet test to be single threaded for parallel tbb.

    See https://github.com/pytorch/pytorch/issues/64571#issuecomment-914691883
    c                      t        j                         }t        j                  d       	  | i |t        j                  |       S # t        j                  |       w xY wr  )r   get_num_threadsset_num_threads)r   r   num_threadsr   s      r;   r  z4set_single_threaded_if_parallel_tbb.<locals>.wrap_fnE  sN    ++-a 	/t&v&!!+.E!!+.s   A	 	A )r  r   )r   r  s   ` r;   #set_single_threaded_if_parallel_tbbr  =  s*    
 	
2Y/ / Nr=   c                      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
    rM   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 )r   r   Eventrn  _sleepr  r+  )r  endcycles_per_mss      r;   measurez"get_cycles_per_ms.<locals>.measureU  sy    

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

'"

%"4"4S"99r=   rT  r   )r.  r  r  r\  r   )r  numvalsrc   s       r;   get_cycles_per_msr  P  sU    
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  r  s      r;   first_sampler  r  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 r`   )r   r   r   r  r   r  r  clone_input_helperr8  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   r   r   r  r  backwardgrad)r   
graph_inpsinpsoutsrf  inpgradss          r;   outs_and_gradsr*    s    z?D!!$'c5<<(S->->GGID1 ( "(!3!3D!9[!9#ZU\\=ZSXX!9E[!!$'c5<<(CH ( ;	 \s   ?C/C/c                     t        |||      \  }}t        |||      \  }}| j                  ||       | j                  ||       y r`   )r*  r  )r   m1m2r&  r1g1r2g2s           r;   compare_equal_outs_and_gradsr2    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 r`   )r  )r  r   r   inplace_variants      r;   r   z,TestGradients._get_safe_inplace.<locals>._fn  s    "1779>t>v>>r=   r  )r   r7  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   rA  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r`   )r   r   r   r  r  s     r;   r   z.TestGradients._check_helper.<locals>.<genexpr>  s'     "lh:a;V[\[j[j1hs   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 r  )r  r   r   r   r  r  )r  r(  r   tensor_listr   s        r;   _input_recomposition_helperz@TestGradients._check_helper.<locals>._input_recomposition_helper  s    )#."$K %a61??'..vi/@A(1AI'..q1 ! '	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  )ra  r  r   r   rR   gradcheck_wrapperoutput_process_fn_grad)r  positional_argsr   r(  r   r   rh  r6  r3  rJ  r  samplerC  s            r;   r   z'TestGradients._check_helper.<locals>.fn  s    "$	!<VV\\S\!]Y&&s+A%@I%VNC#**3/ %
 "MM//1DAq%@I%VNC #F1I 2 .--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  rP  rQ  r  r?  check_fwd_over_revFcheck_rev_over_revr  rR  zUnknown check requested!)r  supports_dtyper   r+  r,  rE   r[   test_conjugated_samplesr  sample_inputsr  broadcasts_inputr  ra  r   r   r   r4  r  re  r$  r  r  r  gradcheck_nondet_tolgradcheck_fast_moder  check_batched_gradgradr  )r   r+  r)  r  rC  checkr:  r;  r  r<  rD  rE  r  all_argsgradcheck_argsr  r   rS  r   rJ  rO  s      ``              @@r;   _check_helperzTestGradients._check_helper  st   GGGG?MM=>  V(<(A(ABMMIbggY.Fs5zlST	/
 %'$>$>$S5CSCS!""65`y5M # O F&&:g+> H%fll3 v{{FMM<P<P<RS V]]EYEYE[!\]""lh"llN $!!!&&#UV $*, #%-)+)>)>&	"n=O<@575L5L464J4J;K<M?CE_!a b <<  !17f g3@/7R.0.G.G-1&(&=&=%'%;%;F /7;347<347<349>56OOM"n$O$OP 4A  +EF{ r=   c                6    | j                  ||||d||||	      S )Nr  r9  )r`  )	r   r+  r)  r  rC  r:  r;  r  r<  s	            r;   _grad_test_helperzTestGradients._grad_test_helper   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_dtypesr   r+  r,  r  supports_autogradsupports_forward_ad)r   r  r+  r)  s       r;   _skip_helperzTestGradients._skip_helper&  sX    44U\\&5I5N5NOOMMPQ##B,B,BMM<= -C#r=   )rU   rV   rW   r+  r8  r`  rb  rg  r8   r=   r;   r4  r4    s=    K TYlp)-%pGd QVim-1eY>r=   r4  c                 f    d }|| _         dD ]   d d}fd}t        | | ||             " | S )Nc                      || _         d | _        y r`   )_cb_value)r   cbs     r;   	lazy_initz"make_lazy_class.<locals>.lazy_init.  s    r=   )addrH  rp  truedivfloordivmodrV  powlshiftrshiftandorxornegposabsinverteqneltlegtgera   r   r   __c                       dv fd}|S )N)ra   r   c                     | j                   | j                         | _        d | _         s t        | j                        |i |S  t        t              | j                  g|i |S r`   )rj  rk  r   r  )r   r   r   rE   use_operators      r;   r  z7make_lazy_class.<locals>.inner_wrapper.<locals>.wrapped>  sc    88'"&((*DK#DH#574;;5tFvFF278T24;;PPPPr=   r8   )rE   r  r  r  s   ` @r;   inner_wrapperz&make_lazy_class.<locals>.inner_wrapper;  s    #?:LQ Nr=   )r   r  )r	  rm  rE   r  r  s       @r;   make_lazy_classr  ,  sL     CL
 H:R 	 	T=./), Jr=   c                       e Zd Zy)LazyValN)rU   rV   rW   r8   r=   r;   r  r  L  s    r=   r  )r  suppress_prefixr  r$  c                F   $t        j                         d|z      j                  t        |       }fd}t	        j
                  d||      }t	        j
                  dd|      }t	        j
                  t        j                  j                        |      }t	        j
                  t        j                  j                  t        j                  j                  t        j                        d      d|      }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 )Nr0   c                 z    | j                  d      k7  ry| j                  d      dk(  ry| j                  d      S )Nr0   r   r   z<module>r   )r  )rN  r  s    r;   
repl_framezmunge_exc.<locals>.repl_frameX  s9    771: 771:#wwqzr=   z;  File "([^"]+)", line \d+, in (.+)\n    .+\n( +[~^]+ *\n)?zline \d+zline Nr   z\\r  z\n*Set TORCH_LOGS.+)flagsz$\n*You can suppress this exception.+zCannot export model.+\n\nz +$)r   r   r~   r[   r  rH  rB   rw   r  rQ   r  r   r  DOTALLrO  )r  r  r  r  r$  r%  r  s      `   r;   r  r  Q  s%   |}}q4x(11AA 	Mz[\]A
{Ha(A
tRWW%%d+Q/A
rww||BGGOOENN;R@"aHA
uc1AFF)2q		BFF:BSFF/Q7
vr1BDD)AHr=   r`   )NNNNN)NNNNNr0   F)z'test doesn't currently work with dynamo)z@test doesn't currently work with torchinductor on the ROCm stack)z4test doesn't currently work with legacy JIT executor)zThis test makes TBB sad)Fr  )rT  rT  F)rD  (  r   argparser>  r"  r  r  r   r   r   iorz   r  rW  r  rB   r   r  r  rw  r  r  r  r  rl  	threadingr  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  ra  r  r   torch.backends.cudnntorch.backends.mkltorch.backends.mpstorch.backends.xnnpack
torch.cudar   torch._Cr   r   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_dtyper/   torch.utils._pytreer/  _pytreer!  composite_compliancer1   r3   r  rU   r|   r  disable_global_flagsFILE_SCHEMArL   r   _utils_internalri   _is_fbcode_defaultrj   DEFAULT_DISABLED_TESTS_FILEDEFAULT_SLOW_TESTS_FILEr=  r:  r   rC   rZ  _get_privateuse1_backend_namer]  check_namesrD  r   r   r   r   r   r   r   r   r   r  r  r  rK  rS  r`  rc  re  rj  ScriptFunctionr   rp  ScriptMethodru  rn  rr  rv  r~  r   is_running_via_run_testArgumentParserparseradd_argumentr   r[   r]   r  r  Threadhelp_threadr  rQ   parse_known_argsr   	remainingjit_executorrU  rb  rW  rV  rerun_disabled_testsrA  r   import_slow_testsr   import_disabled_testsr   
log_suffixr  run_parallelrC  test_bailoutsTEST_BAILOUTS
use_pytestr@  pytest_single_testrD  discover_testsr>  r?  save_xmlr  repeatrH  r  rB  r  acceptUNITTEST_ARGSr  r  r  r  
CI_PT_ROOTrw   CI_FUNCTORCH_ROOTr  r  ra   r  r  r  r  r  r  r  r  r  r  rY  rG  rF  rE  machineIS_PPCIS_X86IS_ARM64rh  IS_AVX512_VNNI_SUPPORTEDrq  rz  getfilesystemencodingIS_FILESYSTEM_UTF8_ENCODINGr  r_  TEST_FAIRSEQr  mklr  TEST_MKLr[  r	  r   r  custom_device_modTEST_PRIVATEUSE1
TEST_NUMBA	TEST_DILLTEST_LIBROSATEST_OPT_EINSUMTEST_Z3r}  r~  rr  r  
NOTEST_CPUr  r  r  r   r  r.  TEST_CUDA_GRAPHrz  	num_procsset_per_process_memory_fractionr  r  	overridesTorchFunctionModer  r  torch._dynamor  r  accumulated_cache_size_limitr  torch._inductor.config	_inductorfallback_randomr  r  r  r  r  r  r  TEST_WITH_TVr  r  r  r  r  r  bool_r  r  r  r  ry  rc  rz  r  r|  r  r  r  r  intcrR   r#  r  r!  	complex32r  r  r
  r  r  r!  r#  r;  rE  r[  rc  rg  rk  ro  ry  r  skipIfCaffe2skipIfNoCaffe2r  r  r  r  r  r  r  r  r  r  _DisableFuncTorchr  r  r  r  r  r  r  r  r  r  r  r  r  register_profileHealthChecktoo_slow	VerbositynormalrX  load_profiler  r  r(  r   rQ  rS  rj  r  r  r  r  r  r  r  r  _AssertRaisesContextr  r  r  r  r  ADDRESS_IN_USECONNECT_TIMEOUTr  r  r  r  r  r  r  r  r"  r$  r)  r.  r0  r2  r7  r?  rC  rL  ra  rg  rx  r|  r~  r  r  BytesIOr  GRADCHECK_NONDET_TOLrt  r  skipIfSlowGradcheckEnvr  r  r  r  halfdtype2prec_DONTUSEr  r  r  r  r  r  r  r)  r+  r  r  r  r  r*  dtype_abbrsr  	lru_cacher  r  r  r  r  r*  r2  r4  r  r  r  )r  rS   s   00r;   <module>r 	     s.         	  	     	   	     
       - .  !  $ $      $           + 3  &  < ? $ $ -:X :Xz g!  # # %<<7K   $$P  R   B	   E!!=1 &	%% 
   .C!3*/  1   2K*/  1   +5O*/  1   0:Y*/  1    0  
   1;[&/-5  J = 4   299#%ibii0A2&FGO299"B'))"))4I2*NO)O)O)QRODDD	(+ $   !8L1 !!3 3:1 1h'T,^; ;(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  > 388x388+")""*;388+NK))+i "))N	+%",,N	(""))N 67N00 /!R((00 __
  ""__
,, ##__ {{yyJ!	)   $  T)"))+&'ibiik"))*
T)"))+%6%=%={KL  D0" 	/ 39/dH5'& 'u 
# $'S	 'd3i '$ ! V!p <<7"\\W$
<<8#				y	(				1	18!55 45      $ $   8c779WD s t  "'*
#I.!'*
>>**,>>**,JJ##%	E588#I#I#KTR #$5~FK\KiKiKk4rw !'*
 (	#I.?x<&|4
t
$JJ44 /# / (3VXZ)[\\
   3=W  X   )3K  L   1;[  \   )3K  L   *4M  N   )3K  L !*		*G MQT T    )3K  L   )3K  L   -7S  T   .8U  V %8!8 
]]GC 2 2 8 8 =a @ARG V
]]T5%--*;*;*A*A#*Fq*K!LMQTT 
 %3IBII2C89I	JJ..uQ]S5H!/LM5??44    2<X  Y   .8U  V   0:T']  _ 89EMM5%15.MM* M"9*(^. ryy/0C7;?EHH!!8
    3=_  ` 
)"))/4	4 HHEJJHHEKKGGEJJHHEKKHHEKKHHEKKJJEMMJJEMMJJEMMLLEOOMME$$ $8 
 */bgg& >W=\=\=^_=^\c5US[=^_      	NNBJJ	OOR\\" 
!P e e*
W 
W 	@ 	@P:(
* #5*FG$T+DE	4(- HH..  + +2 - - 9 97./ /4C( C(J @ @ 
 
$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  H`(++ H`f&6 &6R7:
 7:t   2
~ 
,T4 T6 
l |  98==3U3U 9 'T ' ' 
S&z"" S&l,,(  *(#' 42 16U 	0 @C% &4* AFUZ 	D
I _d *&>66sr13Hl  E	RZZ      3=_  `(K 
:,L*D # (4.   kk4llDjj$nnd, &  3C 3D 3(F"9tCy "9 "9ell "9J *$ 
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@ 	 	 	 %)$TPQ  ck ``  S	
QRSs    4AU9@EAU? U?AVVAV