§
    �Åj X  ã                   óÂ  — U d Z ddlZdZi Zeed<   i Zeed<   dZd%d	„Z G d
„ d¦  «        Z	 G d„ d¦  «        Z
 G d„ de	¦  «        Z G d„ de¦  «        Z G d„ de	¦  «        Z G d„ de	¦  «        Z G d„ d¦  «        Z G d„ de	¦  «        Z G d„ de	¦  «        Z G d„ de	¦  «        Z G d„ de	¦  «        Z G d„ d e	¦  «        Z G d!„ d"e	¦  «        Z G d#„ d$e	¦  «        ZdS )&ac  
Backends in `einops` are organized to meet the following requirements
- backends are not imported unless those are actually needed, because
    - backends may not be installed
    - importing all available backends will drive to significant memory footprint
    - backends may be present but installed with errors (but never used),
      importing may drive to crashes
- backend should be either symbolic or imperative
    - this determines which methods (from_numpy/to_numpy or create_symbol/eval_symbol) should be defined
- if backend can't provide symbols for shape dimensions, UnknownSize objects are used
é    NzAlex RogozhnikovÚ_loaded_backendsÚ_type2backendFÚreturnÚAbstractBackendc                 ó4  — t          | ¦  «        }t                               |d¦  «        }|�|S t          t                               ¦   «         ¦  «        }|D ](\  }}|                     | ¦  «        r|t          |<   |c S Œ)g }t                               ¦   «         }|rB| 	                    ¦   «         }||                     ¦   «         z  }| 
                    |¦  «         |°Bd„ |D ¦   «         }|D ]�}	t          rt          d|	¦  «         |	j        |vrk|	j        t          j        v rXt          rt          d|	j        ¦  «          |	¦   «         }|t          |j        <   |                     | ¦  «        r|t          |<   |c S ŒŽt!          dt          | ¦  «        › �¦  «        ‚)z’
    Takes a correct backend (e.g. numpy backend if tensor is numpy.ndarray) for a tensor.
    If needed, imports package and creates backend
    Nc                 ó   — g | ]\  }}|‘ŒS © r	   )Ú.0ÚxÚ_s      úAC:\Projects\Historical\venv\Lib\site-packages\einops/_backends.pyú
<listcomp>zget_backend.<locals>.<listcomp>/   s   € ÐCÐCÐC¡  1˜!ÐCÐCÐCó    zTesting for subclass of zImported backend for zTensor type unknown to einops )Útyper   ÚgetÚlistr   ÚitemsÚis_appropriate_typer   Ú__subclasses__ÚpopÚappendÚ_debug_importingÚprintÚframework_nameÚsysÚmodulesÚRuntimeError)
ÚtensorÚ_typeÚ_resultÚpreviously_loaded_backendsÚ_framework_nameÚbackendÚbackend_subclassesÚbackendsÚprev_backend_namesÚBackendSubclasss
             r   Úget_backendr(      sÌ  € õ
 �‰LŒL€EÝ×Ò  tÑ,Ô,€GØÐØˆå!%Õ&6×&<Ò&<Ñ&>Ô&>Ñ!?Ô!?ÐØ$>ð ð Ñ ˆ˜Ø×&Ò& vÑ.Ô.ð 	Ø#*�M˜%Ñ ØˆNˆNˆNð	ð
 ÐÝ×-Ò-Ñ/Ô/€HØ
ð +Ø—,’,‘.”.ˆØ�G×*Ò*Ñ,Ô,Ñ,ˆØ×!Ò! 'Ñ*Ô*Ð*ð ð +ð DÐCÐ(BÐCÑCÔCÐØ-ð #ð #ˆÝð 	?ÝÐ,¨oÑ>Ô>Ð>ØÔ)Ð1CÐCÐCàÔ-µ´Ð<Ð<Ý#ð SÝÐ1°?Ô3QÑRÔRÐRØ)˜/Ñ+Ô+�Ø;BÕ  Ô!7Ñ8Ø×.Ò.¨vÑ6Ô6ð #Ø+2•M %Ñ(Ø"�N�N�Nøå
ÐF½¸V¹¼ÐFÐFÑ
GÔ
GÐGr   c                   óœ   — e Zd ZU dZeed<   d„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zdefd„Zd„ Zd„ Zd„ Zdefd„Zd„ Zd„ Zd„ Zd„ ZdS )r   zJBase backend class, major part of methods are only for debugging purposes.r   c                 ó   — t          ¦   «         ‚)z4helper method should recognize tensors it can handle©ÚNotImplementedError©Úselfr   s     r   r   z#AbstractBackend.is_appropriate_typeF   ó   € å!Ñ#Ô#Ð#r   c                 ó    — t          d¦  «        ‚©Nz.framework doesn't support imperative executionr+   ©r.   r   s     r   Ú
from_numpyzAbstractBackend.from_numpyJ   ó   € Ý!Ð"RÑSÔSÐSr   c                 ó    — t          d¦  «        ‚r1   r+   r2   s     r   Úto_numpyzAbstractBackend.to_numpyM   r4   r   c                 ó    — t          d¦  «        ‚©Nz/framework doesn't support symbolic computationsr+   ©r.   Úshapes     r   Úcreate_symbolzAbstractBackend.create_symbolP   s   € Ý!Ð"SÑTÔTÐTr   c                 ó    — t          d¦  «        ‚r8   r+   ©r.   ÚsymbolÚsymbol_value_pairss      r   Úeval_symbolzAbstractBackend.eval_symbolS   s   € å!Ð"SÑTÔTÐTr   c                 ó    — t          d¦  «        ‚)Nz"framework doesn't implement aranger+   ©r.   ÚstartÚstops      r   ÚarangezAbstractBackend.arangeW   s   € å!Ð"FÑGÔGÐGr   c                 ó   — |j         S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)©r:   r2   s     r   r:   zAbstractBackend.shape[   s	   € àŒwˆr   c                 ó,   — |                      |¦  «        S ©N©Úreshape©r.   r   r:   s      r   rK   zAbstractBackend.reshape_   ó   € Ø�yŠy˜ÑÔÐr   c                 ó,   — |                      |¦  «        S rI   ©Ú	transpose©r.   r   Úaxess      r   rP   zAbstractBackend.transposeb   ó   € Ø�{Š{˜4Ñ Ô Ð r   c                 ó6   —  t          ||¦  «        |¬¦  «        S ©N©Úaxis)Úgetattr©r.   r   Ú	operationrR   s       r   ÚreducezAbstractBackend.reducee   s   € Ø$�w�q˜)Ñ$Ô$¨$Ð/Ñ/Ô/Ð/r   Útensorsc                 ó   — t          ¦   «         ‚rI   r+   ©r.   r\   s     r   Ústack_on_zeroth_dimensionz)AbstractBackend.stack_on_zeroth_dimensionh   ó   € Ý!Ñ#Ô#Ð#r   c                 ó   — t          ¦   «         ‚rI   r+   ©r.   r   Únew_positions      r   Úadd_axiszAbstractBackend.add_axisk   r`   r   c                 ó¾   — dg|z  }|                      ¦   «         D ] \  }}|                      ||¦  «        }|||<   Œ!|                      |t          |¦  «        ¦  «        S )Né   )r   rd   ÚtileÚtuple©r.   r   Ún_axesÚpos2lenÚrepeatsÚaxis_positionÚaxis_lengths          r   Úadd_axeszAbstractBackend.add_axesn   sc   € Ø�#˜‘,ˆØ*1¯-ª-©/¬/ð 	1ð 	1Ñ&ˆM˜;Ø—’˜a Ñ/Ô/ˆAØ%0ˆG�MÑ"Ð"Ø�yŠy˜�E '™NœNÑ+Ô+Ð+r   c                 ó   — t          ¦   «         ‚)z!repeats - same lengths as x.shaper+   ©r.   r   rl   s      r   rg   zAbstractBackend.tileu   r/   r   rW   c                 ó   — t          ¦   «         ‚)zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r+   ©r.   r\   rW   s      r   ÚconcatzAbstractBackend.concaty   ó   € õ "Ñ#Ô#Ð#r   c                 ó   — t          ¦   «         ‚rI   r+   r2   s     r   Úis_float_typezAbstractBackend.is_float_type~   ru   r   c                 ó    — t          d¦  «        ‚)Nzbackend does not provide layersr+   ©r.   s    r   ÚlayerszAbstractBackend.layersƒ   ó   € Ý!Ð"CÑDÔDÐDr   c                 ó   — d| j         › d�S )Nz<einops backend for ú>)r   ry   s    r   Ú__repr__zAbstractBackend.__repr__†   s   € Ø< dÔ&9Ð<Ð<Ð<Ð<r   c                 ó    — t          d¦  «        ‚)Nzbackend does not support einsumr+   ©r.   Úpatternr   s      r   ÚeinsumzAbstractBackend.einsum‰   r{   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r3   r6   r;   r@   rE   r:   rK   rP   r[   r   r_   rd   ro   rg   Úintrt   rw   rz   r~   r‚   r	   r   r   r   r   A   st  € € € € € € ØTÐTàÐÐÑð$ð $ð $ðTð Tð TðTð Tð TðUð Uð UðUð Uð UðHð Hð Hðð ð ð ð  ð  ð!ð !ð !ð0ð 0ð 0ð$°ð $ð $ð $ð $ð$ð $ð $ð,ð ,ð ,ð$ð $ð $ð$ Cð $ð $ð $ð $ð
$ð $ð $ð
Eð Eð Eð=ð =ð =ðEð Eð Eð Eð Er   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚUnknownSizezUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                 ó   — | S rI   r	   ©r.   Úothers     r   Ú__floordiv__zUnknownSize.__floordiv__�   ó   € Øˆr   c                 ó   — dS ©NTr	   r�   s     r   Ú__eq__zUnknownSize.__eq__“   s   € Øˆtr   c                 ó   — | S rI   r	   r�   s     r   Ú__mul__zUnknownSize.__mul__–   r�   r   c                 ó   — | S rI   r	   r�   s     r   Ú__rmul__zUnknownSize.__rmul__™   r�   r   c                 ó    — t          d ¦  «        S rI   )Úhashry   s    r   Ú__hash__zUnknownSize.__hash__œ   s   € Ý�D‰zŒzÐr   N)	rƒ   r„   r…   r†   r�   r“   r•   r—   rš   r	   r   r   r‹   r‹   �   se   € € € € € Ø_Ð_ðð ð ðð ð ðð ð ðð ð ðð ð ð ð r   r‹   c                   ó`   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zde	fd„Z
d	„ Zd
efd„Zd„ Zd„ Zd„ ZdS )ÚNumpyBackendÚnumpyc                 ó   — dd l }|| _        d S ©Nr   )r�   Únp)r.   r�   s     r   Ú__init__zNumpyBackend.__init__£   s   € ØˆˆˆàˆŒˆˆr   c                 ó6   — t          || j        j        ¦  «        S rI   )Ú
isinstancer    Úndarrayr-   s     r   r   z NumpyBackend.is_appropriate_type¨   s   € Ý˜& $¤'¤/Ñ2Ô2Ð2r   c                 ó   — |S rI   r	   r2   s     r   r3   zNumpyBackend.from_numpy«   ó   € Øˆr   c                 ó   — |S rI   r	   r2   s     r   r6   zNumpyBackend.to_numpy®   r¦   r   c                 ó8   — | j                              ||¦  «        S rI   )r    rE   rB   s      r   rE   zNumpyBackend.arange±   ó   € ØŒw�~Š~˜e TÑ*Ô*Ð*r   r\   c                 ó6   — | j                              |¦  «        S rI   )r    Ústackr^   s     r   r_   z&NumpyBackend.stack_on_zeroth_dimension´   ó   € ØŒw�}Š}˜WÑ%Ô%Ð%r   c                 ó8   — | j                              ||¦  «        S rI   )r    rg   rq   s      r   rg   zNumpyBackend.tile·   ó   € ØŒw�|Š|˜A˜wÑ'Ô'Ð'r   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )r    Úconcatenaters   s      r   rt   zNumpyBackend.concatº   ó   € ØŒw×"Ò" 7°Ð"Ñ6Ô6Ð6r   c                 ó   — |j         dv S ©N)Úfloat16Úfloat32Úfloat64Úfloat128Úbfloat16©Údtyper2   s     r   rw   zNumpyBackend.is_float_type½   ó   € ØŒwÐSÐSÐSr   c                 ó8   — | j                              ||¦  «        S rI   )r    Úexpand_dimsrb   s      r   rd   zNumpyBackend.add_axisÀ   ó   € ØŒw×"Ò" 1 lÑ3Ô3Ð3r   c                 ó(   —  | j         j        |g|¢R Ž S rI   )r    r‚   r€   s      r   r‚   zNumpyBackend.einsumÃ   ó   € ØˆtŒwŒ~˜gÐ*¨Ð*Ð*Ð*Ð*r   N)rƒ   r„   r…   r   r¡   r   r3   r6   rE   r   r_   rg   r‰   rt   rw   rd   r‚   r	   r   r   rœ   rœ       sÙ   € € € € € Ø€Nðð ð ð
3ð 3ð 3ðð ð ðð ð ð+ð +ð +ð&°ð &ð &ð &ð &ð(ð (ð (ð7 Cð 7ð 7ð 7ð 7ðTð Tð Tð4ð 4ð 4ð+ð +ð +ð +ð +r   rœ   c                   ó.   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zˆ xZS )Ú
JaxBackendÚjaxc                 ó€   •— t          ¦   «                              ¦   «          | j        | _        dd l}|j        | _        d S rŸ   )Úsuperr¡   r    ÚonpÚ	jax.numpyr�   )r.   rÃ   Ú	__class__s     €r   r¡   zJaxBackend.__init__Ê   s;   ø€ Ý‰Œ×ÒÑÔÐØ”7ˆŒàÐÐÐà”)ˆŒˆˆr   c                 ó6   — | j                              |¦  «        S rI   )r    Úasarrayr2   s     r   r3   zJaxBackend.from_numpyÒ   s   € ØŒw�Š˜qÑ!Ô!Ð!r   c                 ó6   — | j                              |¦  «        S rI   )rÆ   rÊ   r2   s     r   r6   zJaxBackend.to_numpyÕ   s   € ØŒx×Ò Ñ"Ô"Ð"r   )rƒ   r„   r…   r   r¡   r3   r6   Ú__classcell__©rÈ   s   @r   rÂ   rÂ   Ç   s[   ø€ € € € € Ø€Nðð ð ð ð ð"ð "ð "ð#ð #ð #ð #ð #ð #ð #r   rÂ   c                   óx   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	efd
„Zd„ Zd„ Zdefd„Zd„ Zd„ Zd„ Zd„ ZdS )ÚTorchBackendÚtorchc                 ó(   — dd l }|| _         ddlm} d S )Nr   rf   )Ú_torch_specific)rÐ   Ú rÒ   )r.   rÐ   rÒ   s      r   r¡   zTorchBackend.__init__Ü   s*   € ØˆˆˆàˆŒ
à%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r   c                 ó6   — t          || j        j        ¦  «        S rI   )r£   rÐ   ÚTensorr-   s     r   r   z TorchBackend.is_appropriate_typeã   s   € Ý˜& $¤*Ô"3Ñ4Ô4Ð4r   c                 ór   — | j                              |¦  «        }|                      |¦  «        rd|_        |S r’   )rÐ   r3   rw   Úrequires_grad©r.   r   Úvariables      r   r3   zTorchBackend.from_numpyæ   s:   € Ø”:×(Ò(¨Ñ+Ô+ˆØ×Ò˜hÑ'Ô'ð 	*à%)ˆHÔ"Øˆr   c                 ór   — |                      ¦   «                              ¦   «                              ¦   «         S rI   ©ÚdetachÚcpur�   r2   s     r   r6   zTorchBackend.to_numpyí   ó&   € Ø�xŠx‰zŒz�~Š~ÑÔ×%Ò%Ñ'Ô'Ð'r   c                 óP   — | j                              ||| j         j        ¬¦  «        S ©Nr¹   )rÐ   rE   Úint64rB   s      r   rE   zTorchBackend.arangeð   s$   € ØŒz× Ò  ¨°D´JÔ4DÐ ÑEÔEÐEr   c                 óx  — |dk    r|                      |¬¦  «        S |dk    r|                     |¬¦  «        S |dk    r|                     |¬¦  «        S |dk    r|                     |¬¦  «        S |dv r7t	          |¦  «        d d d…         D ]} t          ||¦  «        |¬¦  «        }Œ|S t          d|¦  «        ‚)	NÚmin©ÚdimÚmaxÚsumÚmean)ÚanyÚallÚprodéÿÿÿÿúUnknown reduction )ÚaminÚamaxrç   rè   ÚsortedrX   r,   )r.   r   rZ   Úreduced_axesÚis        r   r[   zTorchBackend.reduceó   sà   € Ø˜ÒÐØ—6’6˜l�6Ñ+Ô+Ð+Ø˜%ÒÐØ—6’6˜l�6Ñ+Ô+Ð+Ø˜%ÒÐØ—5’5˜\�5Ñ*Ô*Ð*Ø˜&Ò Ð Ø—6’6˜l�6Ñ+Ô+Ð+ØÐ0Ð0Ð0å˜LÑ)Ô)¨$¨$¨B¨$Ô/ð 1ð 1�Ø)•G˜A˜yÑ)Ô)¨aÐ0Ñ0Ô0��ØˆHå%Ð&:¸IÑFÔFÐFr   c                 ó,   — |                      |¦  «        S rI   ©ÚpermuterQ   s      r   rP   zTorchBackend.transpose  ó   € Ø�yŠy˜‰ŒÐr   r\   c                 ó6   — | j                              |¦  «        S rI   )rÐ   r«   r^   s     r   r_   z&TorchBackend.stack_on_zeroth_dimension  s   € ØŒz×Ò Ñ(Ô(Ð(r   c                 ó¢   — dg|z  }|                      ¦   «         D ] \  }}|                      ||¦  «        }|||<   Œ!|                     |¦  «        S ©Nrì   ©r   rd   Úexpandri   s          r   ro   zTorchBackend.add_axes
  ó[   € Ø�$˜‘-ˆØ*1¯-ª-©/¬/ð 	1ð 	1Ñ&ˆM˜;Ø—’˜a Ñ/Ô/ˆAØ%0ˆG�MÑ"Ð"Ø�xŠx˜Ñ Ô Ð r   c                 ó,   — |                      |¦  «        S rI   ©Úrepeatrq   s      r   rg   zTorchBackend.tile  ó   € Ø�xŠx˜Ñ Ô Ð r   rW   c                 ó:   — | j                              ||¬¦  «        S ©Nrä   )rÐ   Úcatrs   s      r   rt   zTorchBackend.concat  s   € ØŒz�~Š~˜g¨4ˆ~Ñ0Ô0Ð0r   c                 ó8   — | j                              ||¦  «        S rI   )rÐ   Ú	unsqueezerb   s      r   rd   zTorchBackend.add_axis  s   € ØŒz×#Ò# A |Ñ4Ô4Ð4r   c                 ól   — |j         | j        j        | j        j        | j        j        | j        j        fv S rI   )rº   rÐ   r´   rµ   r¶   r¸   r2   s     r   rw   zTorchBackend.is_float_type  s.   € ØŒw˜4œ:Ô-¨t¬zÔ/AÀ4Ä:ÔCUÐW[ÔWaÔWjÐkÐkÐkr   c                 ó   — ddl m} |S )Nrf   )rÐ   )rz   rÐ   )r.   rÐ   s     r   rz   zTorchBackend.layers  ó   € Ø!Ð!Ð!Ð!Ð!Ð!àˆr   c                 ó(   —  | j         j        |g|¢R Ž S rI   )rÐ   r‚   r€   s      r   r‚   zTorchBackend.einsum"  s   € Ø ˆtŒzÔ  Ð-¨1Ð-Ð-Ð-Ð-r   N©rƒ   r„   r…   r   r¡   r   r3   r6   rE   r[   rP   r   r_   ro   rg   r‰   rt   rd   rw   rz   r‚   r	   r   r   rÏ   rÏ   Ù   s  € € € € € Ø€Nð&ð &ð &ð5ð 5ð 5ðð ð ð(ð (ð (ðFð Fð FðGð Gð Gð"ð ð ð)°ð )ð )ð )ð )ð!ð !ð !ð!ð !ð !ð1 Cð 1ð 1ð 1ð 1ð5ð 5ð 5ðlð lð lðð ð ð
.ð .ð .ð .ð .r   rÏ   c                   ó`   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zde	fd„Z
d	„ Zd
efd„Zd„ Zd„ Zd„ ZdS )ÚCupyBackendÚcupyc                 ó   — dd l }|| _         d S rŸ   )r  )r.   r  s     r   r¡   zCupyBackend.__init__)  s   € ØˆˆˆàˆŒ	ˆ	ˆ	r   c                 ó6   — t          || j        j        ¦  «        S rI   )r£   r  r¤   r-   s     r   r   zCupyBackend.is_appropriate_type.  s   € Ý˜& $¤)Ô"3Ñ4Ô4Ð4r   c                 ó6   — | j                              |¦  «        S rI   )r  rÊ   r2   s     r   r3   zCupyBackend.from_numpy1  ó   € ØŒy× Ò  Ñ#Ô#Ð#r   c                 ó6   — | j                              |¦  «        S rI   )r  Úasnumpyr2   s     r   r6   zCupyBackend.to_numpy4  r  r   c                 ó8   — | j                              ||¦  «        S rI   )r  rE   rB   s      r   rE   zCupyBackend.arange7  s   € ØŒy×Ò  tÑ,Ô,Ð,r   r\   c                 ó6   — | j                              |¦  «        S rI   )r  r«   r^   s     r   r_   z%CupyBackend.stack_on_zeroth_dimension:  ó   € ØŒy�Š˜wÑ'Ô'Ð'r   c                 ó8   — | j                              ||¦  «        S rI   )r  rg   rq   s      r   rg   zCupyBackend.tile=  s   € ØŒy�~Š~˜a Ñ)Ô)Ð)r   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )r  r°   rs   s      r   rt   zCupyBackend.concat@  s   € ØŒy×$Ò$ W°4Ð$Ñ8Ô8Ð8r   c                 ó8   — | j                              ||¦  «        S rI   )r  r½   rb   s      r   rd   zCupyBackend.add_axisC  s   € ØŒy×$Ò$ Q¨Ñ5Ô5Ð5r   c                 ó   — |j         dv S r³   r¹   r2   s     r   rw   zCupyBackend.is_float_typeF  r»   r   c                 ó(   —  | j         j        |g|¢R Ž S rI   )r  r‚   r€   s      r   r‚   zCupyBackend.einsumI  ó   € ØˆtŒyÔ Ð,¨!Ð,Ð,Ð,Ð,r   N)rƒ   r„   r…   r   r¡   r   r3   r6   rE   r   r_   rg   r‰   rt   rd   rw   r‚   r	   r   r   r  r  &  sÙ   € € € € € Ø€Nðð ð ð
5ð 5ð 5ð$ð $ð $ð$ð $ð $ð-ð -ð -ð(°ð (ð (ð (ð (ð*ð *ð *ð9 Cð 9ð 9ð 9ð 9ð6ð 6ð 6ðTð Tð Tð-ð -ð -ð -ð -r   r  c                   ó0   — e Zd ZdZdefd„Zd„ Zd„ Zd„ ZdS )ÚHashableTuplez.Overcomes non-hashability of symbolic elementsÚelementsc                 ó   — || _         d S rI   ©r  )r.   r  s     r   r¡   zHashableTuple.__init__P  s   € Ø ˆŒˆˆr   c              #   ó$   K  — | j         E d {V —† d S rI   r!  ry   s    r   Ú__iter__zHashableTuple.__iter__S  s&   è è € Ø”=Ð Ð Ð Ð Ð Ð Ð Ð Ð r   c                 ó*   — t          | j        ¦  «        S rI   )Úlenr  ry   s    r   Ú__len__zHashableTuple.__len__V  s   € Ý�4”=Ñ!Ô!Ð!r   c                 ó   — | j         |         S rI   r!  )r.   Úitems     r   Ú__getitem__zHashableTuple.__getitem__Y  s   € ØŒ}˜TÔ"Ð"r   N)	rƒ   r„   r…   r†   rh   r¡   r#  r&  r)  r	   r   r   r  r  M  sb   € € € € € Ø8Ð8ð! ð !ð !ð !ð !ð!ð !ð !ð"ð "ð "ð#ð #ð #ð #ð #r   r  c                   ó~   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdefd„Zd„ Zdefd„Zd„ Zd„ Zd„ Zd„ ZdS )ÚTensorflowBackendÚ
tensorflowc                 ó   — dd l }|| _        d S rŸ   )r,  Útf©r.   r,  s     r   r¡   zTensorflowBackend.__init__b  s   € ØÐÐÐàˆŒˆˆr   c                 óN   — t          || j        j        | j        j        f¦  «        S rI   )r£   r.  rÕ   ÚVariabler-   s     r   r   z%TensorflowBackend.is_appropriate_typeg  s    € Ý˜& 4¤7¤>°4´7Ô3CÐ"DÑEÔEÐEr   c                 ól   — | j                              ¦   «         sJ ‚| j                              |¦  «        S rI   )r.  Úexecuting_eagerlyÚconvert_to_tensorr2   s     r   r3   zTensorflowBackend.from_numpyj  s2   € ØŒw×(Ò(Ñ*Ô*Ð*Ð*Ð*ØŒw×(Ò(¨Ñ+Ô+Ð+r   c                 ó`   — | j                              ¦   «         sJ ‚|                     ¦   «         S rI   )r.  r3  r�   r2   s     r   r6   zTensorflowBackend.to_numpyn  s*   € ØŒw×(Ò(Ñ*Ô*Ð*Ð*Ð*Ø�wŠw‰yŒyÐr   c                 ó8   — | j                              ||¦  «        S rI   )r.  ÚrangerB   s      r   rE   zTensorflowBackend.aranger  s   € ØŒw�}Š}˜U DÑ)Ô)Ð)r   c                 óŠ  ‡— | j                              ¦   «         rt          d„ |j        D ¦   «         ¦  «        S |j                             ¦   «         }| j                              |¦  «        Št          ˆfd„t          |¦  «        D ¦   «         ¦  «        }	 t          |¦  «         |S # t          $ r t          |¦  «        cY S w xY w)Nc              3   óT   K  — | ]#}|€t          ¦   «         nt          |¦  «        V — Œ$d S rI   )r‹   r‰   )r
   Úds     r   ú	<genexpr>z*TensorflowBackend.shape.<locals>.<genexpr>w  s4   è è € ÐQÐQÀA¨!¨)�™œ˜½¸Q¹¼ÐQÐQÐQÐQÐQÐQr   c                 ó*   •— g | ]\  }}|p‰|         ‘ŒS r	   r	   )r
   rå   ÚsÚtf_shapes      €r   r   z+TensorflowBackend.shape.<locals>.<listcomp>|  s&   ø€ ÐTÐTÐT±&°#°q˜1Ð- ¨¤ÐTÐTÐTr   )	r.  r3  rh   r:   Úas_listÚ	enumerater™   ÚBaseExceptionr  )r.   r   Ústatic_shaper:   r>  s       @r   r:   zTensorflowBackend.shapeu  sÊ   ø€ ØŒ7×$Ò$Ñ&Ô&ð 	,ÝÐQÐQÈÌÐQÑQÔQÑQÔQÐQàœ7Ÿ?š?Ñ,Ô,ˆLØ”w—}’} QÑ'Ô'ˆHåÐTÐTÐTÐT½IÀlÑ<SÔ<SÐTÑTÔTÑUÔUˆEð,Ý�U‘”�Ø�øÝ ð ,ð ,ð ,å$ UÑ+Ô+Ð+Ð+Ð+ð,øøøs   ÂB& Â&CÃCc                 óH   —  t          | j        d|z   ¦  «        ||¬¦  «        S )NÚreduce_rV   )rX   r.  rY   s       r   r[   zTensorflowBackend.reduce„  s(   € Ø6�w�t”w 	¨IÑ 5Ñ6Ô6°q¸tÐDÑDÔDÐDr   c                 ó8   — | j                              ||¦  «        S rI   )r.  rK   rL   s      r   rK   zTensorflowBackend.reshape‡  s   € ØŒw�Š˜q %Ñ(Ô(Ð(r   c                 ó8   — | j                              ||¦  «        S rI   )r.  rP   rQ   s      r   rP   zTensorflowBackend.transposeŠ  s   € ØŒw× Ò   DÑ)Ô)Ð)r   r\   c                 ó6   — | j                              |¦  «        S rI   )r.  r«   r^   s     r   r_   z+TensorflowBackend.stack_on_zeroth_dimension�  r¬   r   c                 ó8   — | j                              ||¦  «        S rI   )r.  rg   rq   s      r   rg   zTensorflowBackend.tile�  r®   r   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )r.  rt   rs   s      r   rt   zTensorflowBackend.concat“  s   € ØŒw�~Š~˜g¨Dˆ~Ñ1Ô1Ð1r   c                 ó8   — | j                              ||¦  «        S rI   )r.  r½   rb   s      r   rd   zTensorflowBackend.add_axis–  r¾   r   c                 ó   — |j         dv S r³   r¹   r2   s     r   rw   zTensorflowBackend.is_float_type™  r»   r   c                 ó   — ddl m} |S )Nrf   )r,  )rz   r,  r/  s     r   rz   zTensorflowBackend.layersœ  s   € Ø&Ð&Ð&Ð&Ð&Ð&àÐr   c                 ó(   —  | j         j        |g|¢R Ž S rI   )r.  r‚   r€   s      r   r‚   zTensorflowBackend.einsum¡  rÀ   r   N)rƒ   r„   r…   r   r¡   r   r3   r6   rE   r:   r[   rK   rP   r   r_   rg   r‰   rt   rd   rw   rz   r‚   r	   r   r   r+  r+  _  s*  € € € € € Ø!€Nðð ð ð
Fð Fð Fð,ð ,ð ,ðð ð ð*ð *ð *ð,ð ,ð ,ðEð Eð Eð)ð )ð )ð*ð *ð *ð&°ð &ð &ð &ð &ð(ð (ð (ð2 Cð 2ð 2ð 2ð 2ð4ð 4ð 4ðTð Tð Tðð ð ð
+ð +ð +ð +ð +r   r+  c                   óx   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdefd„Zd„ Zdefd„Zd„ Zd„ Zd„ ZdS )ÚTFKerasBackendztensorflow.kerasc                 óV   — dd l }|| _        |j        | _        |j        j        | _        d S rŸ   )r,  r.  Úkerasr#   ÚK)r.   r.  s     r   r¡   zTFKerasBackend.__init__¨  s.   € ØÐÐÐàˆŒØ”XˆŒ
Ø”Ô!ˆŒˆˆr   c                 ój   — | j                              |¦  «        o| j                             |¦  «        S rI   )r.  Ú	is_tensorrR  Úis_keras_tensorr-   s     r   r   z"TFKerasBackend.is_appropriate_type¯  s-   € ØŒw× Ò  Ñ(Ô(ÐK¨T¬V×-CÒ-CÀFÑ-KÔ-KÐKr   c                 ó8   — | j                              |¬¦  «        S )N)Úbatch_shape)rQ  ÚInputr9   s     r   r;   zTFKerasBackend.create_symbol²  s   € ØŒz×Ò¨EÐÑ2Ô2Ð2r   c                 ó”   — | j         j                             d„ |D ¦   «         |¦  «        }|                     d„ |D ¦   «         ¦  «        S )Nc                 ó   — g | ]\  }}|‘ŒS r	   r	   )r
   Úvarr   s      r   r   z.TFKerasBackend.eval_symbol.<locals>.<listcomp>¶  s   € Ð(PÐ(PÐ(P±°#°q¨Ð(PÐ(PÐ(Pr   c                 ó   — g | ]\  }}|‘ŒS r	   r	   )r
   r   Úvals      r   r   z.TFKerasBackend.eval_symbol.<locals>.<listcomp>·  s   € Ð&NÐ&NÐ&N©x°°3 sÐ&NÐ&NÐ&Nr   )rQ  ÚmodelsÚModelÚpredict_on_batch)r.   r>   r?   Úmodels       r   r@   zTFKerasBackend.eval_symbolµ  sQ   € Ø”
Ô!×'Ò'Ð(PÐ(PÐ=OÐ(PÑ(PÔ(PÐRXÑYÔYˆØ×%Ò%Ð&NÐ&NÐ;MÐ&NÑ&NÔ&NÑOÔOÐOr   c                 ó8   — | j                              ||¦  «        S rI   )rR  rE   rB   s      r   rE   zTFKerasBackend.arange¹  s   € ØŒv�}Š}˜U DÑ)Ô)Ð)r   c                 ón   — | j                              |¦  «        }t          t          |¦  «        ¦  «        S rI   )rR  r:   r  rh   rL   s      r   r:   zTFKerasBackend.shape¼  s'   € Ø”—’˜Q‘”ˆÝ�U 5™\œ\Ñ*Ô*Ð*r   c                 óB   —  t          | j        |¦  «        ||¬¦  «        S rU   )rX   rR  rY   s       r   r[   zTFKerasBackend.reduceÀ  s#   € Ø)�w�t”v˜yÑ)Ô)¨!°$Ð7Ñ7Ô7Ð7r   c                 ó8   — | j                              ||¦  «        S rI   )rR  rK   rL   s      r   rK   zTFKerasBackend.reshapeÃ  s   € ØŒv�~Š~˜a Ñ'Ô'Ð'r   c                 ó8   — | j                              ||¦  «        S rI   )rR  Úpermute_dimensionsrQ   s      r   rP   zTFKerasBackend.transposeÆ  s   € ØŒv×(Ò(¨¨DÑ1Ô1Ð1r   r\   c                 ó6   — | j                              |¦  «        S rI   )rR  r«   r^   s     r   r_   z(TFKerasBackend.stack_on_zeroth_dimensionÉ  s   € ØŒv�|Š|˜GÑ$Ô$Ð$r   c                 ó8   — | j                              ||¦  «        S rI   )rR  rg   rq   s      r   rg   zTFKerasBackend.tileÌ  s   € ØŒv�{Š{˜1˜gÑ&Ô&Ð&r   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )rR  r°   rs   s      r   rt   zTFKerasBackend.concatÏ  s   € ØŒv×!Ò! '°Ð!Ñ5Ô5Ð5r   c                 ó8   — | j                              ||¦  «        S rI   )rR  r½   rb   s      r   rd   zTFKerasBackend.add_axisÒ  s   € ØŒv×!Ò! ! \Ñ2Ô2Ð2r   c                 ó:   — d| j                              |¦  «        v S )NÚfloat)rR  rº   r2   s     r   rw   zTFKerasBackend.is_float_typeÕ  s   € Ø˜$œ&Ÿ,š, q™/œ/Ð)Ð)r   c                 ó   — ddl m} |S )Nrf   )rQ  )rz   rQ  )r.   rQ  s     r   rz   zTFKerasBackend.layersØ  r  r   N)rƒ   r„   r…   r   r¡   r   r;   r@   rE   r:   r[   rK   rP   r   r_   rg   r‰   rt   rd   rw   rz   r	   r   r   rO  rO  ¥  s  € € € € € Ø'€Nð"ð "ð "ðLð Lð Lð3ð 3ð 3ðPð Pð Pð*ð *ð *ð+ð +ð +ð8ð 8ð 8ð(ð (ð (ð2ð 2ð 2ð%°ð %ð %ð %ð %ð'ð 'ð 'ð6 Cð 6ð 6ð 6ð 6ð3ð 3ð 3ð*ð *ð *ðð ð ð ð r   rO  c                   óx   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	efd
„Zd„ Zd„ Zdefd„Zd„ Zd„ Zd„ Zd„ ZdS )ÚOneFlowBackendÚoneflowc                 ó   — dd l }|| _        d S rŸ   )rq  Úflow)r.   rs  s     r   r¡   zOneFlowBackend.__init__á  s   € ØÐÐÐàˆŒ	ˆ	ˆ	r   c                 ó6   — t          || j        j        ¦  «        S rI   )r£   rs  rÕ   r-   s     r   r   z"OneFlowBackend.is_appropriate_typeæ  s   € Ý˜& $¤)Ô"2Ñ3Ô3Ð3r   c                 ór   — | j                              |¦  «        }|                      |¦  «        rd|_        |S r’   )rs  r3   rw   r×   rØ   s      r   r3   zOneFlowBackend.from_numpyé  s:   € Ø”9×'Ò'¨Ñ*Ô*ˆØ×Ò˜hÑ'Ô'ð 	*à%)ˆHÔ"Øˆr   c                 ór   — |                      ¦   «                              ¦   «                              ¦   «         S rI   rÛ   r2   s     r   r6   zOneFlowBackend.to_numpyð  rÞ   r   c                 óP   — | j                              ||| j         j        ¬¦  «        S rà   )rs  rE   rá   rB   s      r   rE   zOneFlowBackend.arangeó  s#   € ØŒy×Ò  t°4´9´?ÐÑCÔCÐCr   c                 ó
  — t          |d¬¦  «        D ]p}|dk    r|                     |¬¦  «        \  }}Œ"|dk    r|                     |¬¦  «        \  }}ŒB|dv r t          ||¦  «        |¬¦  «        }Œat	          d|¦  «        ‚|S )NT©Úreverserã   rä   ræ   )rç   rè   rë   ré   rê   rí   )rð   rã   ræ   rX   r,   )r.   r   rZ   rñ   rW   r   s         r   r[   zOneFlowBackend.reduceö  s¤   € Ý˜<°Ð6Ñ6Ô6ð 	Kð 	KˆDØ˜EÒ!Ð!Ø—u’u �u‘”‘��1�1Ø˜eÒ#Ð#Ø—u’u �u‘”‘��1�1ØÐCÐCÐCØ)•G˜A˜yÑ)Ô)¨dÐ3Ñ3Ô3��å)Ð*>À	ÑJÔJÐJØˆr   c                 ó,   — |                      |¦  «        S rI   rô   rQ   s      r   rP   zOneFlowBackend.transpose  rö   r   r\   c                 ó6   — | j                              |¦  «        S rI   )rs  r«   r^   s     r   r_   z(OneFlowBackend.stack_on_zeroth_dimension  r  r   c                 óŒ   — dg|z  }|                      ¦   «         D ] \  }}|                      ||¦  «        }|||<   Œ! |j        |Ž S rù   rú   ri   s          r   ro   zOneFlowBackend.add_axes  sX   € Ø�$˜‘-ˆØ*1¯-ª-©/¬/ð 	1ð 	1Ñ&ˆM˜;Ø—’˜a Ñ/Ô/ˆAØ%0ˆG�MÑ"Ð"ØˆqŒx˜Ð!Ð!r   c                 ó,   — |                      |¦  «        S rI   rþ   rq   s      r   rg   zOneFlowBackend.tile  r   r   rW   c                 ó:   — | j                              ||¬¦  «        S r  )rs  rt   rs   s      r   rt   zOneFlowBackend.concat  s   € ØŒy×Ò ¨TÐÑ2Ô2Ð2r   c                 ó8   — | j                              ||¦  «        S rI   )rs  r  rb   s      r   rd   zOneFlowBackend.add_axis  s   € ØŒy×"Ò" 1 lÑ3Ô3Ð3r   c                 óV   — |j         | j        j        | j        j        | j        j        fv S rI   )rº   rs  r´   rµ   r¶   r2   s     r   rw   zOneFlowBackend.is_float_type  s%   € ØŒw˜4œ9Ô,¨d¬iÔ.?ÀÄÔARÐSÐSÐSr   c                 ó   — ddl m} |S )Nrf   )rq  )rz   rq  )r.   rq  s     r   rz   zOneFlowBackend.layers  s   € Ø#Ð#Ð#Ð#Ð#Ð#àˆr   c                 ó(   —  | j         j        |g|¢R Ž S rI   )rs  r‚   r€   s      r   r‚   zOneFlowBackend.einsum   r  r   Nr
  r	   r   r   rp  rp  Þ  s  € € € € € Ø€Nðð ð ð
4ð 4ð 4ðð ð ð(ð (ð (ðDð Dð Dð
ð 
ð 
ðð ð ð(°ð (ð (ð (ð (ð"ð "ð "ð!ð !ð !ð3 Cð 3ð 3ð 3ð 3ð4ð 4ð 4ðTð Tð Tðð ð ð
-ð -ð -ð -ð -r   rp  c                   óŽ   ‡ — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Z	d„ Z
d	„ Zd
efd„Zd„ Zd„ Zdefd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚPaddleBackendÚpaddlec                 ó   — dd l }|| _         d S rŸ   ©r†  ©r.   r†  s     r   r¡   zPaddleBackend.__init__'  s   € ØˆˆˆàˆŒˆˆr   c                 ó6   — | j                              |¦  «        S rI   )r†  rT  r-   s     r   r   z!PaddleBackend.is_appropriate_type,  s   € ØŒ{×$Ò$ VÑ,Ô,Ð,r   c                 óH   — | j                              |¦  «        }d|_        |S )NF)r†  Ú	to_tensorÚstop_gradient)r.   r   r   s      r   r3   zPaddleBackend.from_numpy/  s$   € Ø”×&Ò& qÑ)Ô)ˆØ$ˆÔØˆr   c                 óN   — |                      ¦   «                              ¦   «         S rI   )rÜ   r�   r2   s     r   r6   zPaddleBackend.to_numpy4  s   € Ø�xŠx‰zŒz×ÒÑ!Ô!Ð!r   c                 óP   — | j                              ||| j         j        ¬¦  «        S rà   )r†  rE   rá   rB   s      r   rE   zPaddleBackend.arange7  s$   € ØŒ{×!Ò! %¨°T´[Ô5FÐ!ÑGÔGÐGr   c                 óæ   •— t          |¦  «        |j        k    r6t          ¦   «                              |||¦  «                             d¦  «        S t          ¦   «                              |||¦  «        S rŸ   )r%  ÚndimrÅ   r[   Úsqueeze)r.   r   rZ   rR   rÈ   s       €r   r[   zPaddleBackend.reduce:  sX   ø€ Ýˆt‰9Œ9˜œÒÐå‘7”7—>’> ! Y°Ñ5Ô5×=Ò=¸aÑ@Ô@Ð@å‘7”7—>’> ! Y°Ñ5Ô5Ð5r   c                 ó,   — |                      |¦  «        S rI   rO   rQ   s      r   rP   zPaddleBackend.transposeA  rS   r   c                 ó¢   — dg|z  }|                      ¦   «         D ] \  }}|                      ||¦  «        }|||<   Œ!|                     |¦  «        S rù   rú   ri   s          r   ro   zPaddleBackend.add_axesD  rü   r   r\   c                 ó6   — | j                              |¦  «        S rI   )r†  r«   r^   s     r   r_   z'PaddleBackend.stack_on_zeroth_dimensionK  s   € ØŒ{× Ò  Ñ)Ô)Ð)r   c                 ó,   — |                      |¦  «        S rI   rJ   rL   s      r   rK   zPaddleBackend.reshapeN  rM   r   c                 ó,   — |                      |¦  «        S rI   )rg   rq   s      r   rg   zPaddleBackend.tileQ  s   € Ø�vŠv�g‰ŒÐr   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )r†  rt   rs   s      r   rt   zPaddleBackend.concatT  s   € ØŒ{×!Ò! '°Ð!Ñ5Ô5Ð5r   c                 ó,   — |                      |¦  «        S rI   ©r  rb   s      r   rd   zPaddleBackend.add_axisW  ó   € Ø�{Š{˜<Ñ(Ô(Ð(r   c                 óV   — |j         | j        j        | j        j        | j        j        fv S rI   )rº   r†  r´   rµ   r¶   r2   s     r   rw   zPaddleBackend.is_float_typeZ  s%   € ØŒw˜4œ;Ô.°´Ô0CÀTÄ[ÔEXÐYÐYÐYr   c                 ó   — ddl m} |S )Nrf   rˆ  )rz   r†  r‰  s     r   rz   zPaddleBackend.layers]  s   € Ø"Ð"Ð"Ð"Ð"Ð"àˆr   c                 ó(   —  | j         j        |g|¢R Ž S rI   )r†  r‚   r€   s      r   r‚   zPaddleBackend.einsumb  s   € Ø!ˆtŒ{Ô! 'Ð.¨AÐ.Ð.Ð.Ð.r   c                 ó*   — t          |j        ¦  «        S rI   )rh   r:   r2   s     r   r:   zPaddleBackend.shapee  s   € Ý�Q”W‰~Œ~Ðr   )rƒ   r„   r…   r   r¡   r   r3   r6   rE   r[   rP   ro   r   r_   rK   rg   r‰   rt   rd   rw   rz   r‚   r:   rÌ   rÍ   s   @r   r…  r…  $  sK  ø€ € € € € Ø€Nðð ð ð
-ð -ð -ðð ð ð
"ð "ð "ðHð Hð Hð6ð 6ð 6ð 6ð 6ð!ð !ð !ð!ð !ð !ð*°ð *ð *ð *ð *ð ð  ð  ðð ð ð6 Cð 6ð 6ð 6ð 6ð)ð )ð )ðZð Zð Zðð ð ð
/ð /ð /ðð ð ð ð ð ð r   r…  c                   óx   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdefd„Zd„ Zd„ Zdefd„Zd„ Zd„ ZdS )ÚTinygradBackendÚtinygradc                 ó   — dd l }|| _         d S rŸ   )r¢  )r.   r¢  s     r   r¡   zTinygradBackend.__init__l  s   € Øˆˆˆà ˆŒˆˆr   c                 ó6   — t          || j        j        ¦  «        S rI   )r£   r¢  rÕ   r-   s     r   r   z#TinygradBackend.is_appropriate_typeq  s   € Ý˜& $¤-Ô"6Ñ7Ô7Ð7r   c                 ó6   — | j                              |¦  «        S rI   )r¢  rÕ   r2   s     r   r3   zTinygradBackend.from_numpyt  s   € ØŒ}×#Ò# AÑ&Ô&Ð&r   c                 ó*   — |                      ¦   «         S rI   )r�   r2   s     r   r6   zTinygradBackend.to_numpyw  s   € Ø�wŠw‰yŒyÐr   c                 óB   — | j         j                             ||¦  «        S rI   )r¢  rÕ   rE   rB   s      r   rE   zTinygradBackend.arangez  s   € ØŒ}Ô#×*Ò*¨5°$Ñ7Ô7Ð7r   c                 ó   — |j         S rI   rG   r2   s     r   r:   zTinygradBackend.shape}  s	   € ØŒwˆr   c                 ó,   — |                      |¦  «        S rI   rJ   rL   s      r   rK   zTinygradBackend.reshape€  rM   r   c                 ó,   — |                      |¦  «        S rI   rô   rQ   s      r   rP   zTinygradBackend.transposeƒ  rö   r   c                 ób   — t          |d¬¦  «        D ]} t          ||¦  «        |¬¦  «        }Œ|S )NTry  rV   )rð   rX   )r.   r   rZ   rR   rW   s        r   r[   zTinygradBackend.reduce†  sA   € Ý˜4¨Ð.Ñ.Ô.ð 	1ð 	1ˆDØ%•˜˜9Ñ%Ô%¨4Ð0Ñ0Ô0ˆAˆAØˆr   r\   c                 ó@   — | j         j                             |¦  «        S rI   )r¢  rÕ   r«   r^   s     r   r_   z)TinygradBackend.stack_on_zeroth_dimension‹  s   € ØŒ}Ô#×)Ò)¨'Ñ2Ô2Ð2r   c                 ó,   — |                      |¦  «        S rI   rš  rb   s      r   rd   zTinygradBackend.add_axisŽ  r›  r   c                 ó,   — |                      |¦  «        S rI   rþ   rq   s      r   rg   zTinygradBackend.tile‘  r   r   rW   c                 ón   — t          |¦  «        dk    r |d         j        |dd …         d|iŽn|d         S )Nrf   r   rå   )r%  r  rs   s      r   rt   zTinygradBackend.concat”  s?   € Ý9<¸W¹¼ÈÒ9IÐ9Iˆ~ˆw�qŒzŒ~˜w q r rœ{Ð5°Ð5Ð5Ð5ÈwÐWXÌzÐYr   c                 óJ   — | j         j                             |j        ¦  «        S rI   )r¢  ÚdtypesÚis_floatrº   r2   s     r   rw   zTinygradBackend.is_float_type—  s   € ØŒ}Ô#×,Ò,¨Q¬WÑ5Ô5Ð5r   c                 ó2   —  | j         j        j        |g|¢R Ž S rI   )r¢  rÕ   r‚   r€   s      r   r‚   zTinygradBackend.einsumš  s"   € Ø*ˆtŒ}Ô#Ô*¨7Ð7°QÐ7Ð7Ð7Ð7r   N)rƒ   r„   r…   r   r¡   r   r3   r6   rE   r:   rK   rP   r[   r   r_   rd   rg   r‰   rt   rw   r‚   r	   r   r   r¡  r¡  i  s  € € € € € Ø€Nð!ð !ð !ð
8ð 8ð 8ð'ð 'ð 'ðð ð ð8ð 8ð 8ðð ð ð ð  ð  ðð ð ðð ð ð
3°ð 3ð 3ð 3ð 3ð)ð )ð )ð!ð !ð !ðZ Cð Zð Zð Zð Zð6ð 6ð 6ð8ð 8ð 8ð 8ð 8r   r¡  c                   ór   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdefd„Zd„ Zdefd„Zd„ Zd„ ZdS )ÚPyTensorBackendÚpytensorc                 ó    — ddl m} || _        d S )Nr   )r   )r¶  r   Úptr-   s     r   r¡   zPyTensorBackend.__init__¡  s   € Ø#Ð#Ð#Ð#Ð#Ð#àˆŒˆˆr   c                 ó6   — t          || j        j        ¦  «        S rI   )r£   r¸  ÚTensorVariabler-   s     r   r   z#PyTensorBackend.is_appropriate_type¦  s   € Ý˜& $¤'Ô"8Ñ9Ô9Ð9r   c                 ó2   — |j         | j        j        j        v S rI   )rº   r¸  r   Úfloat_dtypesr2   s     r   rw   zPyTensorBackend.is_float_type©  s   € ØŒw˜$œ'œ,Ô3Ð3Ð3r   c                 ó6   — | j                              |¦  «        S rI   )r¸  Ú	as_tensorr2   s     r   r3   zPyTensorBackend.from_numpy¬  s   € ØŒw× Ò  Ñ#Ô#Ð#r   c                 ó*   — |                      ¦   «         S rI   )Úevalr2   s     r   r6   zPyTensorBackend.to_numpy¯  s   € Ø�vŠv‰xŒxˆr   c                 óx   — t          |t          t          z  ¦  «        s|f}| j                             |¬¦  «        S )NrG   )r£   rh   r   r¸  r   r9   s     r   r;   zPyTensorBackend.create_symbol²  s5   € Ý˜%¥­¡Ñ.Ô.ð 	Ø�HˆEØŒw�~Š~ Eˆ~Ñ*Ô*Ð*r   c                 óF   — |                      t          |¦  «        ¦  «        S rI   )rÀ  Údictr=   s      r   r@   zPyTensorBackend.eval_symbol·  s   € Ø�{Š{�4Ð 2Ñ3Ô3Ñ4Ô4Ð4r   c                 ó8   — | j                              ||¦  «        S rI   )r¸  rE   rB   s      r   rE   zPyTensorBackend.arangeº  r©   r   c                 ón   — t          d„ t          |j        j        |j        ¦  «        D ¦   «         ¦  «        S )Nc              3   ó(   K  — | ]\  }}|�|n|V — Œd S rI   r	   )r
   Ú
static_dimÚsymbolic_dims      r   r;  z(PyTensorBackend.shape.<locals>.<genexpr>¿  sC   è è € ð 
ð 
á(�
˜Lð %Ð0ˆJˆJ°lð
ð 
ð 
ð 
ð 
ð 
r   )rh   Úzipr   r:   r2   s     r   r:   zPyTensorBackend.shape½  s@   € åð 
ð 
å,/°´´¸a¼gÑ,FÔ,Fð
ñ 
ô 
ñ 
ô 
ð 	
r   r\   c                 ó6   — | j                              |¦  «        S rI   )r¸  r«   r^   s     r   r_   z)PyTensorBackend.stack_on_zeroth_dimensionÄ  r¬   r   c                 ó8   — | j                              ||¦  «        S rI   )r¸  rg   rq   s      r   rg   zPyTensorBackend.tileÇ  r®   r   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )r¸  r°   rs   s      r   rt   zPyTensorBackend.concatÊ  r±   r   c                 ó8   — | j                              ||¦  «        S rI   )r¸  r½   rb   s      r   rd   zPyTensorBackend.add_axisÍ  r¾   r   c                 ó(   —  | j         j        |g|¢R Ž S rI   )r¸  r‚   r€   s      r   r‚   zPyTensorBackend.einsumÐ  rÀ   r   N)rƒ   r„   r…   r   r¡   r   rw   r3   r6   r;   r@   rE   r:   r   r_   rg   r‰   rt   rd   r‚   r	   r   r   rµ  rµ  ž  s  € € € € € Ø€Nðð ð ð
:ð :ð :ð4ð 4ð 4ð$ð $ð $ðð ð ð+ð +ð +ð
5ð 5ð 5ð+ð +ð +ð
ð 
ð 
ð&°ð &ð &ð &ð &ð(ð (ð (ð7 Cð 7ð 7ð 7ð 7ð4ð 4ð 4ð+ð +ð +ð +ð +r   rµ  c                   ó`   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zde	fd„Z
d	„ Zd
„ Zdefd„Zd„ Zd„ ZdS )Ú
MLXBackendÚmlxc                 ó6   — dd l m} dd l}|| _        || _        d S rŸ   )Úmlx.coreÚcorer�   Úmxr    )r.   rÕ  r    s      r   r¡   zMLXBackend.__init__×  s2   € ØÐÐÐÐÐØÐÐÐàˆŒØˆŒˆˆr   c                 ó6   — t          || j        j        ¦  «        S rI   )r£   rÕ  Úarrayr-   s     r   r   zMLXBackend.is_appropriate_typeÞ  s   € Ý˜& $¤'¤-Ñ0Ô0Ð0r   c                 ó6   — | j                              |¦  «        S rI   )rÕ  r×  r2   s     r   r3   zMLXBackend.from_numpyá  s   € ØŒw�}Š}˜QÑÔÐr   c                 óž   — |j         | j        j        k    r|                     | j        j        ¦  «        }| j                             |¦  «        S rI   )rº   rÕ  r¸   Úastyperµ   r    r×  r2   s     r   r6   zMLXBackend.to_numpyä  s=   € ØŒ7�d”gÔ&Ò&Ð&Ø—’˜œœÑ)Ô)ˆAØŒw�}Š}˜QÑÔÐr   c                 ó8   — | j                              ||¦  «        S rI   )rÕ  rE   rB   s      r   rE   zMLXBackend.arangeé  r©   r   r\   c                 ó6   — | j                              |¦  «        S rI   )rÕ  r«   r^   s     r   r_   z$MLXBackend.stack_on_zeroth_dimensionì  r¬   r   c                 ó8   — | j                              ||¦  «        S rI   )rÕ  r½   rb   s      r   ro   zMLXBackend.add_axesï  r¾   r   c                 ó8   — | j                              ||¦  «        S rI   )rÕ  rg   rq   s      r   rg   zMLXBackend.tileò  r®   r   rW   c                 ó:   — | j                              ||¬¦  «        S rU   )rÕ  r°   rs   s      r   rt   zMLXBackend.concatõ  r±   r   c                 óV   — | j                              |j        | j         j        ¦  «        S rI   )rÕ  Ú
issubdtyperº   Úfloatingr2   s     r   rw   zMLXBackend.is_float_typeø  s!   € ØŒw×!Ò! !¤'¨4¬7Ô+;Ñ<Ô<Ð<r   c                 ó(   —  | j         j        |g|¢R Ž S rI   )rÕ  r‚   r€   s      r   r‚   zMLXBackend.einsumû  rÀ   r   N)rƒ   r„   r…   r   r¡   r   r3   r6   rE   r   r_   ro   rg   r‰   rt   rw   r‚   r	   r   r   rÐ  rÐ  Ô  sÖ   € € € € € Ø€Nðð ð ð1ð 1ð 1ð ð  ð  ð ð  ð  ð
+ð +ð +ð&°ð &ð &ð &ð &ð4ð 4ð 4ð(ð (ð (ð7 Cð 7ð 7ð 7ð 7ð=ð =ð =ð+ð +ð +ð +ð +r   rÐ  )r   r   )r†   r   Ú
__author__r   rÃ  rˆ   r   r   r(   r   r‹   rœ   rÂ   rÏ   r  r  r+  rO  rp  r…  r¡  rµ  rÐ  r	   r   r   ú<module>rå     sî  ðð
ð 
ð 
ð €
€
€
à€
àÐ �$Ð Ð Ñ Ø€ˆtÐ Ð Ñ ØÐ ð(Hð (Hð (Hð (HðVIEð IEð IEð IEð IEñ IEô IEð IEðXð ð ð ð ñ ô ð ð&$+ð $+ð $+ð $+ð $+�?ñ $+ô $+ð $+ðN#ð #ð #ð #ð #�ñ #ô #ð #ð$J.ð J.ð J.ð J.ð J.�?ñ J.ô J.ð J.ðZ$-ð $-ð $-ð $-ð $-�/ñ $-ô $-ð $-ðN#ð #ð #ð #ð #ñ #ô #ð #ð$C+ð C+ð C+ð C+ð C+˜ñ C+ô C+ð C+ðL6ð 6ð 6ð 6ð 6�_ñ 6ô 6ð 6ðrC-ð C-ð C-ð C-ð C-�_ñ C-ô C-ð C-ðLBð Bð Bð Bð B�Oñ Bô Bð BðJ28ð 28ð 28ð 28ð 28�oñ 28ô 28ð 28ðj3+ð 3+ð 3+ð 3+ð 3+�oñ 3+ô 3+ð 3+ðl(+ð (+ð (+ð (+ð (+�ñ (+ô (+ð (+ð (+ð (+r   