o
    i0                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlZd dl	Z
G dd dZG dd dZG d	d
 d
ZG dd dZG dd dZe ZdS )    N)ImportBackendError)OperationNotSupportedError)BackendResolutionErrorc                   @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )InvalidBackendr   c                 C   s   || _ || _|| _d S N)namemessagepriority)selfr   r   r	    r   N/home/ubuntu/.local/lib/python3.10/site-packages/einx/_src/frontend/backend.py__init__   s   
zInvalidBackend.__init__c                 C   s   dS )NFr   )r
   tensorr   r   r   is_supported_tensor      z"InvalidBackend.is_supported_tensorc                 C   
   t | jr   r   r   )r
   r   r   r   r   __getattr__      
zInvalidBackend.__getattr__c                 C   r   r   r   r
   r   r   r   raise_on_import_failure   r   z&InvalidBackend.raise_on_import_failurec                 C      t | S r   idr   r   r   r   __hash__      zInvalidBackend.__hash__c                 C      | |u S r   r   r
   otherr   r   r   __eq__   r   zInvalidBackend.__eq__c                 C      t | t  d S r   Useregistry	__enter__r   r   r   r   r$   !      zInvalidBackend.__enter__c                 G      t | tj|  d S r   r"   r#   __exit__r
   argsr   r   r   r(   $      zInvalidBackend.__exit__N)r   )__name__
__module____qualname__r   r   r   r   r   r   r$   r(   r   r   r   r   r      s    
r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )Backendc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S r   )opsr   r	   optimizationscompilerr   	get_shape)r
   r0   r   r	   r1   r2   r   r3   r   r   r   r   )   s   
zBackend.__init__c                    s:    fdd} j v rtj   |}|S  |_|S )Nc                     s4    j vrt  dj dj   | i |S )Nz# operation is not supported by the z	 backend.)r0   r   r   )r*   kwargsr   r
   r   r   op3   s   
zBackend.__getattr__.<locals>.op)r0   	functoolswrapsr,   )r
   r   r6   r   r5   r   r   2   s   
zBackend.__getattr__c                 C   s   d S r   r   r   r   r   r   r   ?   r   zBackend.raise_on_import_failurec                 C   r   r   r   r   r   r   r   r   B   r   zBackend.__hash__c                 C   r   r   r   r   r   r   r   r   E   r   zBackend.__eq__c                 C   r    r   r!   r   r   r   r   r$   H   r%   zBackend.__enter__c                 G   r&   r   r'   r)   r   r   r   r(   K   r+   zBackend.__exit__N)
r,   r-   r.   r   r   r   r   r   r$   r(   r   r   r   r   r/   (   s    	r/   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r"   c                 C   s   || _ || _d S r   )backendr#   )r
   r9   r#   r   r   r   r   P   s   
zUse.__init__c                 C      | j | j d S r   )r#   enterr9   r   r   r   r   r$   T   r%   zUse.__enter__c                 C   r:   r   )r#   exitr9   )r
   exc_type	exc_value	tracebackr   r   r   r(   W   r%   zUse.__exit__N)r,   r-   r.   r   r$   r(   r   r   r   r   r"   O   s    r"   c                   @   s   e Zd Zd&ddZdd Zdd Zdd	 Zd
d Zdd Zd&ddZ	d&ddZ
d'ddZdd Zdd Zdd Zdd Zdd Zdd Zd(d d!Zd"d# Zd$d% ZdS ))BackendRegistryStateNc                 C   s   t  | _i | _g | _i | _i | _g | _|d urC| j|j | j|j | j|j | j|j | j|j | j|j d S d S r   )	setseen_module_namesuninitialized_backendsbackendstensortypes_to_backendname_to_backend	use_stackupdateextend)r
   stater   r   r   r   \   s   zBackendRegistryState.__init__c                 C   sX   dd | j D }t|dkr(d}|D ]}|d|j d7 }||j d7 }q|S d}|S )	Nc                 S   s   g | ]	}t |tr|qS r   )
isinstancer   .0r9   r   r   r   
<listcomp>l       zABackendRegistryState._invalid_backend_reasons.<locals>.<listcomp>r   z3

The following backends could not be initialized:
z
############################ z ############################

 )rD   lenr   r   )r
   invalid_backendsr   r9   r   r   r   _invalid_backend_reasonsk   s   z-BackendRegistryState._invalid_backend_reasonsc                 C   sL   z| }W n t y   t|d| d| dt  }Y nw | | d S )NzFailed to import backend "z" for module "z" due to the following error:
)	Exceptionr   r?   
format_exc	_register)r
   module_namebackend_namebackend_factoryr9   r   r   r   _run_factoryv   s   
z!BackendRegistryState._run_factoryc                 C   s2   t |ttB std| j| || j|j< d S )Nz9Backend must be an instance of Backend or InvalidBackend.)rK   r/   r   
ValueErrorrD   appendrF   r   r
   r9   r   r   r   rW      s   zBackendRegistryState._registerc                 C   sH   |t jv r| ||| d S || jvrg | j|< | j| ||f d S r   )sysmodulesr[   rC   r]   r
   rX   rY   rZ   r   r   r   _register_on_import   s
   


z(BackendRegistryState._register_on_importc                    s   |d rdS d|d< t  fddtjD rG fddtjD }|D ]"} j| | jv rD j| D ]\}} ||| q4 j|= q"dS dS )Nr   FTc                 3   s    | ]}| j vV  qd S r   rB   rM   rX   r   r   r   	<genexpr>   s    z:BackendRegistryState._check_new_imports.<locals>.<genexpr>c                    s   g | ]	}| j vr|qS r   rc   rd   r   r   r   rN      rO   z;BackendRegistryState._check_new_imports.<locals>.<listcomp>)anyr_   r`   rB   addrC   r[   )r
   has_checkednew_module_namesnew_module_namerY   rZ   r   r   r   _check_new_imports   s   
z'BackendRegistryState._check_new_importsc                    s   t dd |D }|jv rj| gS d u rdg fdd t }|D ]	}| | q(t|}tdd |D rEdg}t|dkr]td	d |D fd
d|D }t|dkrj|d j|< |S )Nc                 s   s    | ]}t |V  qd S r   )typerM   r   r   r   r   re      s    z7BackendRegistryState._get_by_tensors.<locals>.<genexpr>Fc                    s>    fddj D }t|dkr|S }|r S g S )Nc                    s   g | ]	}|  r|qS r   )r   rL   r   r   r   rN      rO   zPBackendRegistryState._get_by_tensors.<locals>._get_by_tensor.<locals>.<listcomp>r   )rD   rR   rk   )r   rD   changed)_get_by_tensorhas_checked_new_importsr
   rn   r   rp      s   
z<BackendRegistryState._get_by_tensors.<locals>._get_by_tensorc                 s   s4    | ]}t |ttB tB tjB tjB tjB V  qd S r   )rK   floatintboolnpfloatingintegerbool_rm   r   r   r   re      s   2 numpy   c                 s   s    | ]}|j V  qd S r   r	   rL   r   r   r   re      s    c                    s   g | ]	}|j  kr|qS r   r{   rL   )max_priorityr   r   rN      rO   z8BackendRegistryState._get_by_tensors.<locals>.<listcomp>r   )	tuplerE   rA   rH   listall_get_by_namerR   max)r
   tensorsrq   tensortypesrD   r   r   )rp   rq   r|   r
   r   _get_by_tensors   s$   
z$BackendRegistryState._get_by_tensorsc                 C   sb   || j vr+|d u rdg}| |}|r|| j vr+td| dt| j   |   | j |S )NFzBackend with name z/ not found. Currently registered backends are: )rF   rk   r\   r~   keysrT   get)r
   r   rq   ro   r   r   r   r      s   

z!BackendRegistryState._get_by_namec                 C   s   |d u rg }t |ttB r|S |d u rdg}t |tr!| ||S t| jdkr-| jd S |d ur5td| ||}t|dkrE|d S t|dkrZt	dd
dd	 |D  d
d
dd	 |D  }||  7 }t	|)NFr   z=Backend must be either a Backend instance, a string, or None.rz   a  Failed to determine which backend to use for this operation:
 - The 'backend' parameter is not specified.
 - No global default backend is specified using 'with backend:'.
 - Multiple registered backends with same priority match the tensor types of the arguments: z, c                 S   s   g | ]}|j qS r   )r   rL   r   r   r   rN      s    z-BackendRegistryState._get.<locals>.<listcomp>zFailed to determine which backend to use for this operation:
 - The 'backend' parameter is not specified.
 - No global default backend is specified using 'with backend:'.
 - No registered backends match the tensor types of the arguments: c                 S   s   g | ]}t t|qS r   )strrl   )rM   tr   r   r   rN      s    )rK   r/   r   r   r   rR   rG   r\   r   r   joinrT   )r
   r9   r   rq   rD   r   r   r   r   _get   s6   

	zBackendRegistryState._getc                 C   s   | j | d S r   )rG   r]   r^   r   r   r   _enter  s   zBackendRegistryState._enterc                 C   s(   t | jd t |ksJ | j  d S )Nr   )r   rG   popr^   r   r   r   _exit  s   zBackendRegistryState._exitc                 C      t | }|| |S r   )r@   rW   r
   r9   	new_stater   r   r   register     
zBackendRegistryState.registerc                 C   s   t | }|||| |S r   )r@   rb   )r
   rX   rY   rZ   r   r   r   r   register_on_import  s   z'BackendRegistryState.register_on_importc                 C      t | }||}||fS r   )r@   r   )r
   r   r   rD   r   r   r   get_by_tensors     
z#BackendRegistryState.get_by_tensorsc                 C   r   r   )r@   r   )r
   r   r   r9   r   r   r   get_by_name  r   z BackendRegistryState.get_by_namec                 C   s   t | }|||}||fS r   )r@   r   )r
   r9   r   r   r   r   r   r      s   zBackendRegistryState.getc                 C   r   r   )r@   r   r   r   r   r   r;   %  r   zBackendRegistryState.enterc                 C   r   r   )r@   r   r   r   r   r   r<   *  r   zBackendRegistryState.exitr   )NNNNN)r,   r-   r.   r   rT   r[   rW   rb   rk   r   r   r   r   r   r   r   r   r   r   r;   r<   r   r   r   r   r@   [   s&    
	


(
.
r@   c                   @   sN   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdddZdd Z	dd Z
dS )BackendRegistryc                 C   s   t  | _t | _d S r   )r@   rJ   	threadingLockuse_lockr   r   r   r   r   1  s   zBackendRegistry.__init__c                 C   s   | j || _ d S r   )rJ   r   r^   r   r   r   r   5  r%   zBackendRegistry.registerc                 C   s   | j |||| _ d S r   )rJ   r   ra   r   r   r   r   8  s   z"BackendRegistry.register_on_importc                 C      | j |\| _ }|S r   )rJ   r   )r
   r   rD   r   r   r   r   ;     zBackendRegistry.get_by_tensorsc                 C   r   r   )rJ   r   )r
   r   r9   r   r   r   r   ?  r   zBackendRegistry.get_by_nameNc                 C   s   | j ||\| _ }|S r   )rJ   r   )r
   r9   r   r   r   r   r   C  s   zBackendRegistry.getc                 C   :   | j  | j|| _W d    d S 1 sw   Y  d S r   )r   rJ   r;   r^   r   r   r   r;   G     "zBackendRegistry.enterc                 C   r   r   )r   rJ   r<   r^   r   r   r   r<   K  r   zBackendRegistry.exitr   )r,   r-   r.   r   r   r   r   r   r   r;   r<   r   r   r   r   r   0  s    
r   )r_   r?   typesr   einx._src.frontend.errorsr   r   r   r7   ry   ru   r   r/   r"   r@   r   r#   r   r   r   r   <module>   s     ' V
 