
    3j                     J   S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J
r
  SrS\R                  " S5      l        S\R                  " S	5      l        S
rS\\   4S jrSrS\\   S\\\4   4S jr\" SS9S\\   4S j5       rS\S\4S jrSS\\
R,                     4S jjrg)zX
Common utils for testing.
These functions allow testing only some frameworks, not all.
    N)	lru_cache)ListTuple)	_backendszAlex RogozhnikovT
tensorflow
matplotlib)minmaxsummeanprodreturnc                  
   / n [         R                  R                  5       nU(       a<  UR                  5       nXR                  5       -  nU R	                  U5        U(       a  M<  U  Vs/ s H  o3R
                  PM     sn$ s  snf )N)r   AbstractBackend__subclasses__popappendframework_name)backend_subclassesbackendsbackendbs       O/home/wildlama/miniconda3/lib/python3.13/site-packages/einops/tests/__init__.pyfind_names_of_all_frameworksr      sp    ((779H
,,.**,,!!'* ( '99&8&8999s   (B EINOPS_TEST_BACKENDSbackend_namesc                 |    [        5       nU  H  nX!;  d  M
  [        SU 35      e   [        SR                  U 5      4$ )NUnknown framework: ,)r   RuntimeErrorENVVAR_NAMEjoin)r   _known_backendsbackend_names      r   unparse_backendsr%   %   sC    24O%.!4\NCDD & ///       )maxsizec                      [         [        R                  ;  a  [        S[          S35      e[        R                  [            R	                  S5      n [        5       nU  H  nX!;  d  M
  [        SU 35      e   U $ )Nz/Testing frameworks were not specified, env var z not setr   r   )r!   osenvironr    splitr   )parsed_backendsr#   r$   s      r   parse_backends_to_testr.   -   sp    "**$L[MYabccjj-33C8O24O'.!4\NCDD ( r&   r   c                 T    U [        5       ;  a  [        SU  35      eU [        5       ;   $ )z8Used to skip test if corresponding backend is not testedzUnknown framework )r   r    r.   )r   s    r   is_backend_testedr0   :   s0    244/y9::,...r&   c                 |   U (       d  U(       dl  [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  /nOZ[         R                  [         R
                  [         R                  /nO*U(       d  [         R                  /nO[         R                  /n[        5       n/ nU H,  nUR                  U;  a  M   UR                  U" 5       5        M.     U$ ! [         a    [        R                  " SU 3SS9   MW  f = f)z
:param symbolic: symbolic or imperative frameworks?
:param layers: layers or operations?
:return: list of backends satisfying set conditions
z,backend could not be initialized for tests: r'   )
stacklevel)r   NumpyBackend
JaxBackendTorchBackendTensorflowBackendOneFlowBackendPaddleBackendCupyBackendPyTensorBackendTFKerasBackendr.   r   r   ImportErrorwarningswarn)symboliclayersbackend_typesbackend_names_to_testresultbackend_types         r   collect_test_backendsrE   A   s    &&$$&&++((''%%M &&((''M ))M
 ((M 34F%&&.CC	gMM,.)	 & M	  	g MMHWdef	gs   9D"D;:D;)FF)__doc__loggingr*   r=   	functoolsr   typingr   r   einopsr   
__author__	getLoggerdisabledFLOAT_REDUCTIONSstrr   r!   r%   r.   boolr0   r   rE    r&   r   <module>rR      s   
  	    
 ,0  ,  (+/  ,  (8 :d3i : %0DI 0%S/ 0 1	S	 	 	/s /t /,4	@Y@Y;Z ,r&   