o
    ٷi                     @   s   d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 dZded_ded	_d
Zdee fddZdZdee deeef fddZedddee fddZdedefddZddee
j fddZdS )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                  C   sB   g } t j }|r| }|| 7 }| | |s	dd | D S )Nc                 S   s   g | ]}|j qS  )framework_name).0br   r   I/home/ubuntu/.local/lib/python3.10/site-packages/einops/tests/__init__.py
<listcomp>   s    z0find_names_of_all_frameworks.<locals>.<listcomp>)r   AbstractBackend__subclasses__popappend)backend_subclassesbackendsbackendr   r   r   find_names_of_all_frameworks   s   

r   EINOPS_TEST_BACKENDSbackend_namesc                 C   s4   t  }| D ]}||vrtd| qtd| fS )NUnknown framework: ,)r   RuntimeErrorENVVAR_NAMEjoin)r   _known_backendsbackend_namer   r   r   unparse_backends%   s   r%      )maxsizec                  C   sT   t tjvrtdt  dtjt  d} t }| D ]}||vr'td| q| S )Nz/Testing frameworks were not specified, env var z not setr   r   )r!   osenvironr    splitr   )parsed_backendsr#   r$   r   r   r   parse_backends_to_test-   s   
r,   r   c                 C   s"   | t  vrtd|  | t v S )z8Used to skip test if corresponding backend is not testedzUnknown framework )r   r    r,   )r   r   r   r   is_backend_tested:   s   

r-   Fc              	   C   s   | s|st jt jt jt jt jt jt jg}nt jt jt jg}n|s%t jg}nt j	g}t
 }g }|D ]#}|j|vr8q0z||  W q0 tyS   tjd| dd Y q0w |S )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_typer   r   r   collect_test_backendsA   s<   
rA   )FF)__doc__loggingr(   r9   	functoolsr   typingr   r   einopsr   
__author__	getLoggerdisabledFLOAT_REDUCTIONSstrr   r!   r%   r,   boolr-   r   rA   r   r   r   r   <module>   s$    
