Ë
    øÿæi X  ã                   ól  — 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y)%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ÚAbstractBackendc                 ó  — t        | «      }t        j                  |d«      }|�|S t        t        j                  «       «      }|D ]#  \  }}|j                  | «      sŒ|t        |<   |c S  g }t        j                  «       }|r7|j                  «       }||j                  «       z  }|j                  |«       |rŒ7|D ��	cg c]  \  }}	|‘Œ	 }
}}	|D ]”  }t        rt        d|«       |j                  |
vsŒ$|j                  t        j                  v sŒAt        rt        d|j                  «        |«       }|t        |j                  <   |j                  | «      sŒ‰|t        |<   |c S  t!        dt        | «      › �«      ‚c c}	}w )z’
    Takes a correct backend (e.g. numpy backend if tensor is numpy.ndarray) for a tensor.
    If needed, imports package and creates backend
    Nz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ÚxÚ_Úprev_backend_namesÚBackendSubclasss               úe/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/einops/_backends.pyÚget_backendr"      su  € ô
 �‹L€EÜ×Ñ  tÓ,€GØÐØˆä!%Ô&6×&<Ñ&<Ó&>Ó!?ÐÛ$>Ñ ˆ˜Ø×&Ñ& vÕ.Ø#*ŒM˜%Ñ ØŠNð %?ð ÐÜ×-Ñ-Ó/€HÙ
Ø—,‘,“.ˆØ�G×*Ñ*Ó,Ñ,ˆØ×!Ñ! 'Ô*ò ñ )CÔCÑ(B¡  1š!Ð(BÐÑCÛ-ˆÝÜÐ,¨oÔ>Ø×)Ñ)Ð1CÒCà×-Ñ-´·±Ò<Ý#ÜÐ1°?×3QÑ3QÔRÙ)Ó+�Ø;BÔ  ×!7Ñ!7Ñ8Ø×.Ñ.¨vÕ6Ø+2”M %Ñ(Ø"’Nð .ô Ð7¼¸V»°~ÐFÓ
GÐGùó Ds   Â?E>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y)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   ó   € ä!Ó#Ð#ó    c                 ó   — t        d«      ‚©Nz.framework doesn't support imperative executionr%   ©r(   r   s     r!   Ú
from_numpyzAbstractBackend.from_numpyJ   ó   € Ü!Ð"RÓSÐSr*   c                 ó   — t        d«      ‚r,   r%   r-   s     r!   Úto_numpyzAbstractBackend.to_numpyM   r/   r*   c                 ó   — t        d«      ‚©Nz/framework doesn't support symbolic computationsr%   ©r(   Úshapes     r!   Úcreate_symbolzAbstractBackend.create_symbolP   s   € Ü!Ð"SÓTÐTr*   c                 ó   — t        d«      ‚r3   r%   ©r(   ÚsymbolÚsymbol_value_pairss      r!   Úeval_symbolzAbstractBackend.eval_symbolS   s   € ä!Ð"SÓTÐTr*   c                 ó   — t        d«      ‚)Nz"framework doesn't implement aranger%   ©r(   ÚstartÚstops      r!   ÚarangezAbstractBackend.arangeW   s   € ä!Ð"FÓGÐGr*   c                 ó   — |j                   S )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)©r5   r-   s     r!   r5   zAbstractBackend.shape[   s   € à�w‰wˆr*   c                 ó$   — |j                  |«      S ©N©Úreshape©r(   r   r5   s      r!   rF   zAbstractBackend.reshape_   ó   € Ø�y‰y˜ÓÐr*   c                 ó$   — |j                  |«      S rD   ©Ú	transpose©r(   r   Úaxess      r!   rK   zAbstractBackend.transposeb   ó   € Ø�{‰{˜4Ó Ð r*   c                 ó(   —  t        ||«      |¬«      S ©N©Úaxis)Úgetattr©r(   r   Ú	operationrM   s       r!   ÚreducezAbstractBackend.reducee   s   € Ø$Œw�q˜)Ó$¨$Ô/Ð/r*   Útensorsc                 ó   — t        «       ‚rD   r%   ©r(   rW   s     r!   Ústack_on_zeroth_dimensionz)AbstractBackend.stack_on_zeroth_dimensionh   ó   € Ü!Ó#Ð#r*   c                 ó   — t        «       ‚rD   r%   ©r(   r   Únew_positions      r!   Úadd_axiszAbstractBackend.add_axisk   r[   r*   c                 ó¢   — dg|z  }|j                  «       D ]  \  }}| j                  ||«      }|||<   Œ | j                  |t        |«      «      S )Né   )r
   r_   ÚtileÚtuple©r(   r   Ún_axesÚpos2lenÚrepeatsÚaxis_positionÚaxis_lengths          r!   Úadd_axeszAbstractBackend.add_axesn   sS   € Ø�#˜‘,ˆØ*1¯-©-®/Ñ&ˆM˜;Ø—‘˜a Ó/ˆAØ%0ˆG�MÒ"ð +:ð �y‰y˜œE '›NÓ+Ð+r*   c                 ó   — t        «       ‚)z!repeats - same lengths as x.shaper%   ©r(   r   rg   s      r!   rb   zAbstractBackend.tileu   r)   r*   rR   c                 ó   — t        «       ‚)zzconcatenates tensors along axis.
        Assume identical across tensors: devices, dtypes and shapes except selected axis.r%   ©r(   rW   rR   s      r!   ÚconcatzAbstractBackend.concaty   ó   € ô "Ó#Ð#r*   c                 ó   — t        «       ‚rD   r%   r-   s     r!   Úis_float_typezAbstractBackend.is_float_type~   rp   r*   c                 ó   — t        d«      ‚)Nzbackend does not provide layersr%   ©r(   s    r!   ÚlayerszAbstractBackend.layersƒ   ó   € Ü!Ð"CÓDÐDr*   c                 ó"   — d| j                   › d�S )Nz<einops backend for Ú>)r   rt   s    r!   Ú__repr__zAbstractBackend.__repr__†   s   € Ø% d×&9Ñ&9Ð%:¸!Ð<Ð<r*   c                 ó   — t        d«      ‚)Nzbackend does not support einsumr%   ©r(   Úpatternr   s      r!   ÚeinsumzAbstractBackend.einsum‰   rv   r*   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r.   r1   r6   r;   r@   r5   rF   rK   rV   r	   rZ   r_   rj   rb   Úintro   rr   ru   ry   r}   © r*   r!   r   r   A   s   … ÙTàÓò$òTòTòUòUòHòò ò!ò0ð$°ó $ò$ò,ò$ð$ Có $ò
$ò
Eò=óEr*   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚUnknownSizezUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                 ó   — | S rD   r…   ©r(   Úothers     r!   Ú__floordiv__zUnknownSize.__floordiv__�   ó   € Øˆr*   c                  ó   — y©NTr…   r‰   s     r!   Ú__eq__zUnknownSize.__eq__“   s   € Ør*   c                 ó   — | S rD   r…   r‰   s     r!   Ú__mul__zUnknownSize.__mul__–   rŒ   r*   c                 ó   — | S rD   r…   r‰   s     r!   Ú__rmul__zUnknownSize.__rmul__™   rŒ   r*   c                 ó   — t        d «      S rD   )Úhashrt   s    r!   Ú__hash__zUnknownSize.__hash__œ   s   € Ü�D‹zÐr*   N)	r~   r   r€   r�   r‹   r�   r‘   r“   r–   r…   r*   r!   r‡   r‡   �   s   „ Ù_òòòòó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y)ÚNumpyBackendÚnumpyc                 ó   — dd l }|| _        y ©Nr   )r™   Únp)r(   r™   s     r!   Ú__init__zNumpyBackend.__init__£   s   € Ûàˆ�r*   c                 óB   — t        || j                  j                  «      S rD   )Ú
isinstancerœ   Úndarrayr'   s     r!   r   z NumpyBackend.is_appropriate_type¨   s   € Ü˜& $§'¡'§/¡/Ó2Ð2r*   c                 ó   — |S rD   r…   r-   s     r!   r.   zNumpyBackend.from_numpy«   ó   € Øˆr*   c                 ó   — |S rD   r…   r-   s     r!   r1   zNumpyBackend.to_numpy®   r¢   r*   c                 ó:   — | j                   j                  ||«      S rD   )rœ   r@   r=   s      r!   r@   zNumpyBackend.arange±   ó   € Ø�w‰w�~‰~˜e TÓ*Ð*r*   rW   c                 ó8   — | j                   j                  |«      S rD   )rœ   ÚstackrY   s     r!   rZ   z&NumpyBackend.stack_on_zeroth_dimension´   ó   € Ø�w‰w�}‰}˜WÓ%Ð%r*   c                 ó:   — | j                   j                  ||«      S rD   )rœ   rb   rl   s      r!   rb   zNumpyBackend.tile·   ó   € Ø�w‰w�|‰|˜A˜wÓ'Ð'r*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )rœ   Úconcatenatern   s      r!   ro   zNumpyBackend.concatº   ó   € Ø�w‰w×"Ñ" 7°Ð"Ó6Ð6r*   c                 ó   — |j                   dv S ©N)Úfloat16Úfloat32Úfloat64Úfloat128Úbfloat16©Údtyper-   s     r!   rr   zNumpyBackend.is_float_type½   ó   € Ø�w‰wÐSÐSÐSr*   c                 ó:   — | j                   j                  ||«      S rD   )rœ   Úexpand_dimsr]   s      r!   r_   zNumpyBackend.add_axisÀ   ó   € Ø�w‰w×"Ñ" 1 lÓ3Ð3r*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )rœ   r}   r{   s      r!   r}   zNumpyBackend.einsumÃ   ó   € Øˆt�w‰w�~‰~˜gÐ*¨Ò*Ð*r*   N)r~   r   r€   r   r�   r   r.   r1   r@   r	   rZ   rb   r„   ro   rr   r_   r}   r…   r*   r!   r˜   r˜       sM   „ Ø€Nòò
3òòò+ð&°ó &ò(ð7 Có 7òTò4ó+r*   r˜   c                   ó.   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zˆ xZS )Ú
JaxBackendÚjaxc                 ón   •— t         ‰| �  «        | j                  | _        dd l}|j
                  | _        y r›   )Úsuperr�   rœ   ÚonpÚ	jax.numpyr™   )r(   r¿   Ú	__class__s     €r!   r�   zJaxBackend.__init__Ê   s'   ø€ Ü‰ÑÔØ—7‘7ˆŒãà—)‘)ˆ�r*   c                 ó8   — | j                   j                  |«      S rD   )rœ   Úasarrayr-   s     r!   r.   zJaxBackend.from_numpyÒ   s   € Ø�w‰w�‰˜qÓ!Ð!r*   c                 ó8   — | j                   j                  |«      S rD   )rÂ   rÆ   r-   s     r!   r1   zJaxBackend.to_numpyÕ   s   € Ø�x‰x×Ñ Ó"Ð"r*   )r~   r   r€   r   r�   r.   r1   Ú__classcell__©rÄ   s   @r!   r¾   r¾   Ç   s   ø„ Ø€Nôò"ö#r*   r¾   c                   óv   — 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y)ÚTorchBackendÚtorchc                 ó&   — dd l }|| _         ddlm} y )Nr   ra   )Ú_torch_specific)rÌ   Ú rÎ   )r(   rÌ   rÎ   s      r!   r�   zTorchBackend.__init__Ü   s   € ÛàˆŒ
æ%r*   c                 óB   — t        || j                  j                  «      S rD   )rŸ   rÌ   ÚTensorr'   s     r!   r   z TorchBackend.is_appropriate_typeã   s   € Ü˜& $§*¡*×"3Ñ"3Ó4Ð4r*   c                 ól   — | j                   j                  |«      }| j                  |«      rd|_        |S rŽ   )rÌ   r.   rr   Úrequires_grad©r(   r   Úvariables      r!   r.   zTorchBackend.from_numpyæ   s1   € Ø—:‘:×(Ñ(¨Ó+ˆØ×Ñ˜hÔ'à%)ˆHÔ"Øˆr*   c                 óZ   — |j                  «       j                  «       j                  «       S rD   ©ÚdetachÚcpur™   r-   s     r!   r1   zTorchBackend.to_numpyí   ó   € Ø�x‰x‹z�~‰~Ó×%Ñ%Ó'Ð'r*   c                 óf   — | j                   j                  ||| j                   j                  ¬«      S ©Nrµ   )rÌ   r@   Úint64r=   s      r!   r@   zTorchBackend.arangeð   s(   € Ø�z‰z× Ñ  ¨°D·J±J×4DÑ4DÐ ÓEÐEr*   c                 ó0  — |dk(  r|j                  |¬«      S |dk(  r|j                  |¬«      S |dk(  r|j                  |¬«      S |dk(  r|j                  |¬«      S |dv r+t	        |«      d d d…   D ]  } t        ||«      |¬«      }Œ |S t        d|«      ‚)	NÚmin©ÚdimÚmaxÚsumÚmean)ÚanyÚallÚprodéÿÿÿÿúUnknown reduction )ÚaminÚamaxrã   rä   ÚsortedrS   r&   )r(   r   rU   Úreduced_axesÚis        r!   rV   zTorchBackend.reduceó   s­   € Ø˜ÒØ—6‘6˜l�6Ó+Ð+Ø˜%ÒØ—6‘6˜l�6Ó+Ð+Ø˜%ÒØ—5‘5˜\�5Ó*Ð*Ø˜&Ò Ø—6‘6˜l�6Ó+Ð+ØÐ0Ñ0ä˜LÓ)©$¨B¨$Ô/�Ø)”G˜A˜yÓ)¨aÔ0‘ð 0àˆHä%Ð&:¸IÓFÐFr*   c                 ó$   — |j                  |«      S rD   ©ÚpermuterL   s      r!   rK   zTorchBackend.transpose  ó   € Ø�y‰y˜‹Ðr*   rW   c                 ó8   — | j                   j                  |«      S rD   )rÌ   r§   rY   s     r!   rZ   z&TorchBackend.stack_on_zeroth_dimension  s   € Ø�z‰z×Ñ Ó(Ð(r*   c                 óŽ   — dg|z  }|j                  «       D ]  \  }}| j                  ||«      }|||<   Œ |j                  |«      S ©Nrè   ©r
   r_   Úexpandrd   s          r!   rj   zTorchBackend.add_axes
  óM   € Ø�$˜‘-ˆØ*1¯-©-®/Ñ&ˆM˜;Ø—‘˜a Ó/ˆAØ%0ˆG�MÒ"ð +:ð �x‰x˜Ó Ð r*   c                 ó$   — |j                  |«      S rD   ©Úrepeatrl   s      r!   rb   zTorchBackend.tile  ó   € Ø�x‰x˜Ó Ð r*   rR   c                 ó<   — | j                   j                  ||¬«      S ©Nrà   )rÌ   Úcatrn   s      r!   ro   zTorchBackend.concat  s   € Ø�z‰z�~‰~˜g¨4ˆ~Ó0Ð0r*   c                 ó:   — | j                   j                  ||«      S rD   )rÌ   Ú	unsqueezer]   s      r!   r_   zTorchBackend.add_axis  s   € Ø�z‰z×#Ñ# A |Ó4Ð4r*   c                 óÆ   — |j                   | j                  j                  | j                  j                  | j                  j                  | j                  j
                  fv S rD   )r¶   rÌ   r°   r±   r²   r´   r-   s     r!   rr   zTorchBackend.is_float_type  sE   € Ø�w‰w˜4Ÿ:™:×-Ñ-¨t¯z©z×/AÑ/AÀ4Ç:Á:×CUÑCUÐW[×WaÑWa×WjÑWjÐkÐkÐkr*   c                 ó   — ddl m} |S )Nra   )rÌ   )ru   rÌ   )r(   rÌ   s     r!   ru   zTorchBackend.layers  ó
   € Ý!àˆr*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )rÌ   r}   r{   s      r!   r}   zTorchBackend.einsum"  s   € Ø ˆt�z‰z× Ñ  Ð-¨1Ò-Ð-r*   N©r~   r   r€   r   r�   r   r.   r1   r@   rV   rK   r	   rZ   rj   rb   r„   ro   r_   rr   ru   r}   r…   r*   r!   rË   rË   Ù   sc   „ Ø€Nò&ò5òò(òFòGò"ð)°ó )ò!ò!ð1 Có 1ò5ò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y)ÚCupyBackendÚcupyc                 ó   — dd l }|| _         y r›   )r	  )r(   r	  s     r!   r�   zCupyBackend.__init__)  s   € Ûàˆ�	r*   c                 óB   — t        || j                  j                  «      S rD   )rŸ   r	  r    r'   s     r!   r   zCupyBackend.is_appropriate_type.  s   € Ü˜& $§)¡)×"3Ñ"3Ó4Ð4r*   c                 ó8   — | j                   j                  |«      S rD   )r	  rÆ   r-   s     r!   r.   zCupyBackend.from_numpy1  ó   € Ø�y‰y× Ñ  Ó#Ð#r*   c                 ó8   — | j                   j                  |«      S rD   )r	  Úasnumpyr-   s     r!   r1   zCupyBackend.to_numpy4  r  r*   c                 ó:   — | j                   j                  ||«      S rD   )r	  r@   r=   s      r!   r@   zCupyBackend.arange7  s   € Ø�y‰y×Ñ  tÓ,Ð,r*   rW   c                 ó8   — | j                   j                  |«      S rD   )r	  r§   rY   s     r!   rZ   z%CupyBackend.stack_on_zeroth_dimension:  ó   € Ø�y‰y�‰˜wÓ'Ð'r*   c                 ó:   — | j                   j                  ||«      S rD   )r	  rb   rl   s      r!   rb   zCupyBackend.tile=  s   € Ø�y‰y�~‰~˜a Ó)Ð)r*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )r	  r¬   rn   s      r!   ro   zCupyBackend.concat@  s   € Ø�y‰y×$Ñ$ W°4Ð$Ó8Ð8r*   c                 ó:   — | j                   j                  ||«      S rD   )r	  r¹   r]   s      r!   r_   zCupyBackend.add_axisC  s   € Ø�y‰y×$Ñ$ Q¨Ó5Ð5r*   c                 ó   — |j                   dv S r¯   rµ   r-   s     r!   rr   zCupyBackend.is_float_typeF  r·   r*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )r	  r}   r{   s      r!   r}   zCupyBackend.einsumI  ó   € Øˆt�y‰y×Ñ Ð,¨!Ò,Ð,r*   N)r~   r   r€   r   r�   r   r.   r1   r@   r	   rZ   rb   r„   ro   r_   rr   r}   r…   r*   r!   r  r  &  sM   „ Ø€Nòò
5ò$ò$ò-ð(°ó (ò*ð9 Có 9ò6òTó-r*   r  c                   ó.   — e Zd ZdZdefd„Zd„ Zd„ Zd„ Zy)ÚHashableTuplez.Overcomes non-hashability of symbolic elementsÚelementsc                 ó   — || _         y rD   ©r  )r(   r  s     r!   r�   zHashableTuple.__init__P  s	   € Ø ˆ�r*   c              #   ó8   K  — | j                   E d {  –—†  y 7 Œ­wrD   r  rt   s    r!   Ú__iter__zHashableTuple.__iter__S  s   è ø€ Ø—=‘=× Ò ús   ‚’“c                 ó,   — t        | j                  «      S rD   )Úlenr  rt   s    r!   Ú__len__zHashableTuple.__len__V  s   € Ü�4—=‘=Ó!Ð!r*   c                 ó    — | j                   |   S rD   r  )r(   Úitems     r!   Ú__getitem__zHashableTuple.__getitem__Y  s   € Ø�}‰}˜TÑ"Ð"r*   N)	r~   r   r€   r�   rc   r�   r  r"  r%  r…   r*   r!   r  r  M  s    „ Ù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y)ÚTensorflowBackendÚ
tensorflowc                 ó   — dd l }|| _        y r›   )r(  Útf©r(   r(  s     r!   r�   zTensorflowBackend.__init__b  s   € Ûàˆ�r*   c                 ón   — t        || j                  j                  | j                  j                  f«      S rD   )rŸ   r*  rÑ   ÚVariabler'   s     r!   r   z%TensorflowBackend.is_appropriate_typeg  s&   € Ü˜& 4§7¡7§>¡>°4·7±7×3CÑ3CÐ"DÓEÐEr*   c                 óp   — | j                   j                  «       sJ ‚| j                   j                  |«      S rD   )r*  Úexecuting_eagerlyÚconvert_to_tensorr-   s     r!   r.   zTensorflowBackend.from_numpyj  s-   € Ø�w‰w×(Ñ(Ô*Ð*Ð*Ø�w‰w×(Ñ(¨Ó+Ð+r*   c                 óZ   — | j                   j                  «       sJ ‚|j                  «       S rD   )r*  r/  r™   r-   s     r!   r1   zTensorflowBackend.to_numpyn  s$   € Ø�w‰w×(Ñ(Ô*Ð*Ð*Ø�w‰w‹yÐr*   c                 ó:   — | j                   j                  ||«      S rD   )r*  Úranger=   s      r!   r@   zTensorflowBackend.aranger  s   € Ø�w‰w�}‰}˜U DÓ)Ð)r*   c                 ó�  — | j                   j                  «       rt        d„ |j                  D «       «      S |j                  j	                  «       }| j                   j                  |«      }t        t        |«      D ��cg c]  \  }}|xs ||   ‘Œ c}}«      }	 t        |«       |S c c}}w # t        $ r t        |«      cY S w xY w)Nc              3   óJ   K  — | ]  }|€
t        «       n
t        |«      –— Œ y ­wrD   )r‡   r„   )Ú.0Úds     r!   Ú	<genexpr>z*TensorflowBackend.shape.<locals>.<genexpr>w  s    è ø€ ÐQÉÀA¨!¨)œœ¼¸Q»Ó?Éùs   ‚!#)	r*  r/  rc   r5   Úas_listÚ	enumerater•   ÚBaseExceptionr  )r(   r   Ústatic_shapeÚtf_shaperá   Úsr5   s          r!   r5   zTensorflowBackend.shapeu  s¬   € Ø�7‰7×$Ñ$Ô&ÜÑQÈÏÊÓQÓQÐQàŸ7™7Ÿ?™?Ó,ˆLØ—w‘w—}‘} QÓ'ˆHä¼IÀlÔ<SÔTÑ<S±&°#°q˜1Ò- ¨¡Ñ-Ð<SÒTÓUˆEð,Ü�U”Ø�ùó Uøô !ò ,ä$ UÓ+Ò+ð,ús   Á?B(
ÂB. Â.CÃCc                 óD   —  t        | j                  d|z   «      ||¬«      S )NÚreduce_rQ   )rS   r*  rT   s       r!   rV   zTensorflowBackend.reduce„  s!   € Ø6Œw�t—w‘w 	¨IÑ 5Ó6°q¸tÔDÐDr*   c                 ó:   — | j                   j                  ||«      S rD   )r*  rF   rG   s      r!   rF   zTensorflowBackend.reshape‡  s   € Ø�w‰w�‰˜q %Ó(Ð(r*   c                 ó:   — | j                   j                  ||«      S rD   )r*  rK   rL   s      r!   rK   zTensorflowBackend.transposeŠ  s   € Ø�w‰w× Ñ   DÓ)Ð)r*   rW   c                 ó8   — | j                   j                  |«      S rD   )r*  r§   rY   s     r!   rZ   z+TensorflowBackend.stack_on_zeroth_dimension�  r¨   r*   c                 ó:   — | j                   j                  ||«      S rD   )r*  rb   rl   s      r!   rb   zTensorflowBackend.tile�  rª   r*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )r*  ro   rn   s      r!   ro   zTensorflowBackend.concat“  s   € Ø�w‰w�~‰~˜g¨Dˆ~Ó1Ð1r*   c                 ó:   — | j                   j                  ||«      S rD   )r*  r¹   r]   s      r!   r_   zTensorflowBackend.add_axis–  rº   r*   c                 ó   — |j                   dv S r¯   rµ   r-   s     r!   rr   zTensorflowBackend.is_float_type™  r·   r*   c                 ó   — ddl m} |S )Nra   )r(  )ru   r(  r+  s     r!   ru   zTensorflowBackend.layersœ  s   € Ý&àÐr*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )r*  r}   r{   s      r!   r}   zTensorflowBackend.einsum¡  r¼   r*   N)r~   r   r€   r   r�   r   r.   r1   r@   r5   rV   rF   rK   r	   rZ   rb   r„   ro   r_   rr   ru   r}   r…   r*   r!   r'  r'  _  sh   „ Ø!€Nòò
Fò,òò*ò,òEò)ò*ð&°ó &ò(ð2 Có 2ò4òTòó
+r*   r'  c                   óv   — 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y)ÚTFKerasBackendztensorflow.kerasc                 ór   — dd l }|| _        |j                  | _        |j                  j                  | _        y r›   )r(  r*  Úkerasr   ÚK)r(   r*  s     r!   r�   zTFKerasBackend.__init__¨  s(   € ÛàˆŒØ—X‘XˆŒ
Ø—‘×!Ñ!ˆ�r*   c                 ór   — | j                   j                  |«      xr | j                  j                  |«      S rD   )r*  Ú	is_tensorrN  Úis_keras_tensorr'   s     r!   r   z"TFKerasBackend.is_appropriate_type¯  s+   € Ø�w‰w× Ñ  Ó(ÒK¨T¯V©V×-CÑ-CÀFÓ-KÐKr*   c                 ó:   — | j                   j                  |¬«      S )N)Úbatch_shape)rM  ÚInputr4   s     r!   r6   zTFKerasBackend.create_symbol²  s   € Ø�z‰z×Ñ¨EÐÓ2Ð2r*   c                 óÔ   — | j                   j                  j                  |D ��cg c]  \  }}|‘Œ	 c}}|«      }|j                  |D ��cg c]  \  }}|‘Œ	 c}}«      S c c}}w c c}}w rD   )rM  ÚmodelsÚModelÚpredict_on_batch)r(   r9   r:   Úvarr   ÚmodelÚvals          r!   r;   zTFKerasBackend.eval_symbolµ  se   € Ø—
‘
×!Ñ!×'Ñ'Ñ=OÔ(PÑ=O±°#°qªÐ=OÒ(PÐRXÓYˆØ×%Ñ%Ñ;MÔ&NÑ;M©x°°3¢sÐ;MÒ&NÓOÐOùó )QùÛ&Ns   ¥A
Á
A$
c                 ó:   — | j                   j                  ||«      S rD   )rN  r@   r=   s      r!   r@   zTFKerasBackend.arange¹  s   € Ø�v‰v�}‰}˜U DÓ)Ð)r*   c                 ó`   — | j                   j                  |«      }t        t        |«      «      S rD   )rN  r5   r  rc   rG   s      r!   r5   zTFKerasBackend.shape¼  s"   € Ø—‘—‘˜Q“ˆÜœU 5›\Ó*Ð*r*   c                 ó>   —  t        | j                  |«      ||¬«      S rP   )rS   rN  rT   s       r!   rV   zTFKerasBackend.reduceÀ  s   € Ø)Œw�t—v‘v˜yÓ)¨!°$Ô7Ð7r*   c                 ó:   — | j                   j                  ||«      S rD   )rN  rF   rG   s      r!   rF   zTFKerasBackend.reshapeÃ  s   € Ø�v‰v�~‰~˜a Ó'Ð'r*   c                 ó:   — | j                   j                  ||«      S rD   )rN  Úpermute_dimensionsrL   s      r!   rK   zTFKerasBackend.transposeÆ  s   € Ø�v‰v×(Ñ(¨¨DÓ1Ð1r*   rW   c                 ó8   — | j                   j                  |«      S rD   )rN  r§   rY   s     r!   rZ   z(TFKerasBackend.stack_on_zeroth_dimensionÉ  s   € Ø�v‰v�|‰|˜GÓ$Ð$r*   c                 ó:   — | j                   j                  ||«      S rD   )rN  rb   rl   s      r!   rb   zTFKerasBackend.tileÌ  s   € Ø�v‰v�{‰{˜1˜gÓ&Ð&r*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )rN  r¬   rn   s      r!   ro   zTFKerasBackend.concatÏ  s   € Ø�v‰v×!Ñ! '°Ð!Ó5Ð5r*   c                 ó:   — | j                   j                  ||«      S rD   )rN  r¹   r]   s      r!   r_   zTFKerasBackend.add_axisÒ  s   € Ø�v‰v×!Ñ! ! \Ó2Ð2r*   c                 ó<   — d| j                   j                  |«      v S )NÚfloat)rN  r¶   r-   s     r!   rr   zTFKerasBackend.is_float_typeÕ  s   € Ø˜$Ÿ&™&Ÿ,™, q›/Ð)Ð)r*   c                 ó   — ddl m} |S )Nra   )rM  )ru   rM  )r(   rM  s     r!   ru   zTFKerasBackend.layersØ  r  r*   N)r~   r   r€   r   r�   r   r6   r;   r@   r5   rV   rF   rK   r	   rZ   rb   r„   ro   r_   rr   ru   r…   r*   r!   rK  rK  ¥  sb   „ Ø'€Nò"òLò3òPò*ò+ò8ò(ò2ð%°ó %ò'ð6 Có 6ò3ò*ór*   rK  c                   óv   — 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y)ÚOneFlowBackendÚoneflowc                 ó   — dd l }|| _        y r›   )rk  Úflow)r(   rm  s     r!   r�   zOneFlowBackend.__init__á  s   € Ûàˆ�	r*   c                 óB   — t        || j                  j                  «      S rD   )rŸ   rm  rÑ   r'   s     r!   r   z"OneFlowBackend.is_appropriate_typeæ  s   € Ü˜& $§)¡)×"2Ñ"2Ó3Ð3r*   c                 ól   — | j                   j                  |«      }| j                  |«      rd|_        |S rŽ   )rm  r.   rr   rÓ   rÔ   s      r!   r.   zOneFlowBackend.from_numpyé  s1   € Ø—9‘9×'Ñ'¨Ó*ˆØ×Ñ˜hÔ'à%)ˆHÔ"Øˆr*   c                 óZ   — |j                  «       j                  «       j                  «       S rD   r×   r-   s     r!   r1   zOneFlowBackend.to_numpyð  rÚ   r*   c                 óf   — | j                   j                  ||| j                   j                  ¬«      S rÜ   )rm  r@   rÝ   r=   s      r!   r@   zOneFlowBackend.arangeó  s&   € Ø�y‰y×Ñ  t°4·9±9·?±?ÐÓCÐCr*   c                 óÜ   — t        |d¬«      D ][  }|dk(  r|j                  |¬«      \  }}Œ|dk(  r|j                  |¬«      \  }}Œ9|dv r t        ||«      |¬«      }ŒQt	        d|«      ‚ |S )NT©Úreverserß   rà   râ   )rã   rä   rç   rå   ræ   ré   )rì   rß   râ   rS   r&   )r(   r   rU   rí   rR   r   s         r!   rV   zOneFlowBackend.reduceö  sz   € Ü˜<°×6ˆDØ˜EÒ!Ø—u‘u �u“‘�‘1Ø˜eÒ#Ø—u‘u �u“‘�‘1ØÐCÑCØ)”G˜A˜yÓ)¨dÔ3‘ä)Ð*>À	ÓJÐJð 7ð ˆr*   c                 ó$   — |j                  |«      S rD   rð   rL   s      r!   rK   zOneFlowBackend.transpose  rò   r*   rW   c                 ó8   — | j                   j                  |«      S rD   )rm  r§   rY   s     r!   rZ   z(OneFlowBackend.stack_on_zeroth_dimension  r  r*   c                 óŠ   — dg|z  }|j                  «       D ]  \  }}| j                  ||«      }|||<   Œ  |j                  |Ž S rõ   rö   rd   s          r!   rj   zOneFlowBackend.add_axes  sO   € Ø�$˜‘-ˆØ*1¯-©-®/Ñ&ˆM˜;Ø—‘˜a Ó/ˆAØ%0ˆG�MÒ"ð +:ð ˆq�x‰x˜Ð!Ð!r*   c                 ó$   — |j                  |«      S rD   rú   rl   s      r!   rb   zOneFlowBackend.tile  rü   r*   rR   c                 ó<   — | j                   j                  ||¬«      S rþ   )rm  ro   rn   s      r!   ro   zOneFlowBackend.concat  s   € Ø�y‰y×Ñ ¨TÐÓ2Ð2r*   c                 ó:   — | j                   j                  ||«      S rD   )rm  r  r]   s      r!   r_   zOneFlowBackend.add_axis  s   € Ø�y‰y×"Ñ" 1 lÓ3Ð3r*   c                 óœ   — |j                   | j                  j                  | j                  j                  | j                  j                  fv S rD   )r¶   rm  r°   r±   r²   r-   s     r!   rr   zOneFlowBackend.is_float_type  s6   € Ø�w‰w˜4Ÿ9™9×,Ñ,¨d¯i©i×.?Ñ.?ÀÇÁ×ARÑARÐSÐSÐSr*   c                 ó   — ddl m} |S )Nra   )rk  )ru   rk  )r(   rk  s     r!   ru   zOneFlowBackend.layers  s
   € Ý#àˆr*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )rm  r}   r{   s      r!   r}   zOneFlowBackend.einsum   r  r*   Nr  r…   r*   r!   rj  rj  Þ  sb   „ Ø€Nòò
4òò(òDò
òð(°ó (ò"ò!ð3 Có 3ò4òTòó
-r*   rj  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 }|| _         y r›   ©r€  ©r(   r€  s     r!   r�   zPaddleBackend.__init__'  s   € Ûàˆ�r*   c                 ó8   — | j                   j                  |«      S rD   )r€  rP  r'   s     r!   r   z!PaddleBackend.is_appropriate_type,  s   € Ø�{‰{×$Ñ$ VÓ,Ð,r*   c                 óJ   — | j                   j                  |«      }d|_        |S )NF)r€  Ú	to_tensorÚstop_gradient)r(   r   r   s      r!   r.   zPaddleBackend.from_numpy/  s#   € Ø—‘×&Ñ& qÓ)ˆØ$ˆÔØˆr*   c                 ó>   — |j                  «       j                  «       S rD   )rØ   r™   r-   s     r!   r1   zPaddleBackend.to_numpy4  s   € Ø�x‰x‹z×ÑÓ!Ð!r*   c                 óf   — | j                   j                  ||| j                   j                  ¬«      S rÜ   )r€  r@   rÝ   r=   s      r!   r@   zPaddleBackend.arange7  s(   € Ø�{‰{×!Ñ! %¨°T·[±[×5FÑ5FÐ!ÓGÐGr*   c                 ó–   •— t        |«      |j                  k(  r t        ‰| �  |||«      j	                  d«      S t        ‰| �  |||«      S r›   )r!  ÚndimrÁ   rV   Úsqueeze)r(   r   rU   rM   rÄ   s       €r!   rV   zPaddleBackend.reduce:  sD   ø€ Üˆt‹9˜Ÿ™Òä‘7‘> ! Y°Ó5×=Ñ=¸aÓ@Ð@ä‘7‘> ! Y°Ó5Ð5r*   c                 ó$   — |j                  |«      S rD   rJ   rL   s      r!   rK   zPaddleBackend.transposeA  rN   r*   c                 óŽ   — dg|z  }|j                  «       D ]  \  }}| j                  ||«      }|||<   Œ |j                  |«      S rõ   rö   rd   s          r!   rj   zPaddleBackend.add_axesD  rø   r*   rW   c                 ó8   — | j                   j                  |«      S rD   )r€  r§   rY   s     r!   rZ   z'PaddleBackend.stack_on_zeroth_dimensionK  s   € Ø�{‰{× Ñ  Ó)Ð)r*   c                 ó$   — |j                  |«      S rD   rE   rG   s      r!   rF   zPaddleBackend.reshapeN  rH   r*   c                 ó$   — |j                  |«      S rD   )rb   rl   s      r!   rb   zPaddleBackend.tileQ  s   € Ø�v‰v�g‹Ðr*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )r€  ro   rn   s      r!   ro   zPaddleBackend.concatT  s   € Ø�{‰{×!Ñ! '°Ð!Ó5Ð5r*   c                 ó$   — |j                  |«      S rD   ©r  r]   s      r!   r_   zPaddleBackend.add_axisW  ó   € Ø�{‰{˜<Ó(Ð(r*   c                 óœ   — |j                   | j                  j                  | j                  j                  | j                  j                  fv S rD   )r¶   r€  r°   r±   r²   r-   s     r!   rr   zPaddleBackend.is_float_typeZ  s6   € Ø�w‰w˜4Ÿ;™;×.Ñ.°·±×0CÑ0CÀTÇ[Á[×EXÑEXÐYÐYÐYr*   c                 ó   — ddl m} |S )Nra   r‚  )ru   r€  rƒ  s     r!   ru   zPaddleBackend.layers]  s
   € Ý"àˆr*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )r€  r}   r{   s      r!   r}   zPaddleBackend.einsumb  s   € Ø!ˆt�{‰{×!Ñ! 'Ð.¨AÒ.Ð.r*   c                 ó,   — t        |j                  «      S rD   )rc   r5   r-   s     r!   r5   zPaddleBackend.shapee  s   € Ü�Q—W‘W‹~Ðr*   )r~   r   r€   r   r�   r   r.   r1   r@   rV   rK   rj   r	   rZ   rF   rb   r„   ro   r_   rr   ru   r}   r5   rÈ   rÉ   s   @r!   r  r  $  sm   ø„ Ø€Nòò
-òò
"òHô6ò!ò!ð*°ó *ò òð6 Có 6ò)òZòò
/ör*   r  c                   óv   — 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y)ÚTinygradBackendÚtinygradc                 ó   — dd l }|| _         y r›   )rœ  )r(   rœ  s     r!   r�   zTinygradBackend.__init__l  s   € Ûà ˆ�r*   c                 óB   — t        || j                  j                  «      S rD   )rŸ   rœ  rÑ   r'   s     r!   r   z#TinygradBackend.is_appropriate_typeq  s   € Ü˜& $§-¡-×"6Ñ"6Ó7Ð7r*   c                 ó8   — | j                   j                  |«      S rD   )rœ  rÑ   r-   s     r!   r.   zTinygradBackend.from_numpyt  s   € Ø�}‰}×#Ñ# AÓ&Ð&r*   c                 ó"   — |j                  «       S rD   )r™   r-   s     r!   r1   zTinygradBackend.to_numpyw  s   € Ø�w‰w‹yÐr*   c                 óN   — | j                   j                  j                  ||«      S rD   )rœ  rÑ   r@   r=   s      r!   r@   zTinygradBackend.arangez  s   € Ø�}‰}×#Ñ#×*Ñ*¨5°$Ó7Ð7r*   c                 ó   — |j                   S rD   rB   r-   s     r!   r5   zTinygradBackend.shape}  s   € Ø�w‰wˆr*   c                 ó$   — |j                  |«      S rD   rE   rG   s      r!   rF   zTinygradBackend.reshape€  rH   r*   c                 ó$   — |j                  |«      S rD   rð   rL   s      r!   rK   zTinygradBackend.transposeƒ  rò   r*   c                 óP   — t        |d¬«      D ]  } t        ||«      |¬«      }Œ |S )NTrs  rQ   )rì   rS   )r(   r   rU   rM   rR   s        r!   rV   zTinygradBackend.reduce†  s+   € Ü˜4¨×.ˆDØ%”˜˜9Ó%¨4Ô0‰Að /àˆr*   rW   c                 óL   — | j                   j                  j                  |«      S rD   )rœ  rÑ   r§   rY   s     r!   rZ   z)TinygradBackend.stack_on_zeroth_dimension‹  s   € Ø�}‰}×#Ñ#×)Ñ)¨'Ó2Ð2r*   c                 ó$   — |j                  |«      S rD   r”  r]   s      r!   r_   zTinygradBackend.add_axisŽ  r•  r*   c                 ó$   — |j                  |«      S rD   rú   rl   s      r!   rb   zTinygradBackend.tile‘  rü   r*   rR   c                 óX   — t        |«      dkD  r |d   j                  |dd  d|iŽS |d   S )Nra   r   rá   )r!  rÿ   rn   s      r!   ro   zTinygradBackend.concat”  s7   € Ü9<¸W»ÈÒ9Iˆ~ˆw�q‰z�~‰~˜w q r˜{Ð5°Ñ5ÐYÈwÐWXÉzÐYr*   c                 ó`   — | j                   j                  j                  |j                  «      S rD   )rœ  ÚdtypesÚis_floatr¶   r-   s     r!   rr   zTinygradBackend.is_float_type—  s!   € Ø�}‰}×#Ñ#×,Ñ,¨Q¯W©WÓ5Ð5r*   c                 óP   —  | j                   j                  j                  |g|¢­Ž S rD   )rœ  rÑ   r}   r{   s      r!   r}   zTinygradBackend.einsumš  s$   € Ø*ˆt�}‰}×#Ñ#×*Ñ*¨7Ð7°QÒ7Ð7r*   N)r~   r   r€   r   r�   r   r.   r1   r@   r5   rF   rK   rV   r	   rZ   r_   rb   r„   ro   rr   r}   r…   r*   r!   r›  r›  i  sb   „ Ø€Nò!ò
8ò'òò8òò òòð
3°ó 3ò)ò!ðZ Có Zò6ó8r*   r›  c                   óp   — 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y)ÚPyTensorBackendÚpytensorc                 ó   — ddl m} || _        y )Nr   )r   )r°  r   Úptr'   s     r!   r�   zPyTensorBackend.__init__¡  s   € Ý#àˆ�r*   c                 óB   — t        || j                  j                  «      S rD   )rŸ   r²  ÚTensorVariabler'   s     r!   r   z#PyTensorBackend.is_appropriate_type¦  s   € Ü˜& $§'¡'×"8Ñ"8Ó9Ð9r*   c                 óZ   — |j                   | j                  j                  j                  v S rD   )r¶   r²  r   Úfloat_dtypesr-   s     r!   rr   zPyTensorBackend.is_float_type©  s   € Ø�w‰w˜$Ÿ'™'Ÿ,™,×3Ñ3Ð3Ð3r*   c                 ó8   — | j                   j                  |«      S rD   )r²  Ú	as_tensorr-   s     r!   r.   zPyTensorBackend.from_numpy¬  s   € Ø�w‰w× Ñ  Ó#Ð#r*   c                 ó"   — |j                  «       S rD   )Úevalr-   s     r!   r1   zPyTensorBackend.to_numpy¯  s   € Ø�v‰v‹xˆr*   c                 ón   — t        |t        t        z  «      s|f}| j                  j	                  |¬«      S )NrB   )rŸ   rc   r	   r²  r   r4   s     r!   r6   zPyTensorBackend.create_symbol²  s,   € Ü˜%¤¬¡Ô.Ø�HˆEØ�w‰w�~‰~ Eˆ~Ó*Ð*r*   c                 ó6   — |j                  t        |«      «      S rD   )rº  Údictr8   s      r!   r;   zPyTensorBackend.eval_symbol·  s   € Ø�{‰{œ4Ð 2Ó3Ó4Ð4r*   c                 ó:   — | j                   j                  ||«      S rD   )r²  r@   r=   s      r!   r@   zPyTensorBackend.arangeº  r¥   r*   c                 óv   — t        d„ t        |j                  j                  |j                  «      D «       «      S )Nc              3   ó.   K  — | ]  \  }}|�|n|–— Œ y ­wrD   r…   )r6  Ú
static_dimÚsymbolic_dims      r!   r8  z(PyTensorBackend.shape.<locals>.<genexpr>¿  s'   è ø€ ð 
á,FÑ(�
˜Lð %Ð0‰J°lÓBÙ,Fùs   ‚)rc   Úzipr   r5   r-   s     r!   r5   zPyTensorBackend.shape½  s/   € äñ 
ä,/°·±·±¸a¿g¹gÔ,Fó
ó 
ð 	
r*   rW   c                 ó8   — | j                   j                  |«      S rD   )r²  r§   rY   s     r!   rZ   z)PyTensorBackend.stack_on_zeroth_dimensionÄ  r¨   r*   c                 ó:   — | j                   j                  ||«      S rD   )r²  rb   rl   s      r!   rb   zPyTensorBackend.tileÇ  rª   r*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )r²  r¬   rn   s      r!   ro   zPyTensorBackend.concatÊ  r­   r*   c                 ó:   — | j                   j                  ||«      S rD   )r²  r¹   r]   s      r!   r_   zPyTensorBackend.add_axisÍ  rº   r*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )r²  r}   r{   s      r!   r}   zPyTensorBackend.einsumÐ  r¼   r*   N)r~   r   r€   r   r�   r   rr   r.   r1   r6   r;   r@   r5   r	   rZ   rb   r„   ro   r_   r}   r…   r*   r!   r¯  r¯  ž  s[   „ Ø€Nòò
:ò4ò$òò+ò
5ò+ò
ð&°ó &ò(ð7 Có 7ò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y)Ú
MLXBackendÚmlxc                 ó4   — dd l m} dd l}|| _        || _        y r›   )Úmlx.coreÚcorer™   Úmxrœ   )r(   rÏ  rœ   s      r!   r�   zMLXBackend.__init__×  s   € ÝÛàˆŒØˆ�r*   c                 óB   — t        || j                  j                  «      S rD   )rŸ   rÏ  Úarrayr'   s     r!   r   zMLXBackend.is_appropriate_typeÞ  s   € Ü˜& $§'¡'§-¡-Ó0Ð0r*   c                 ó8   — | j                   j                  |«      S rD   )rÏ  rÑ  r-   s     r!   r.   zMLXBackend.from_numpyá  s   € Ø�w‰w�}‰}˜QÓÐr*   c                 óÈ   — |j                   | j                  j                  k(  r%|j                  | j                  j                  «      }| j
                  j                  |«      S rD   )r¶   rÏ  r´   Úastyper±   rœ   rÑ  r-   s     r!   r1   zMLXBackend.to_numpyä  sA   € Ø�7‰7�d—g‘g×&Ñ&Ò&Ø—‘˜Ÿ™Ÿ™Ó)ˆAØ�w‰w�}‰}˜QÓÐr*   c                 ó:   — | j                   j                  ||«      S rD   )rÏ  r@   r=   s      r!   r@   zMLXBackend.arangeé  r¥   r*   rW   c                 ó8   — | j                   j                  |«      S rD   )rÏ  r§   rY   s     r!   rZ   z$MLXBackend.stack_on_zeroth_dimensionì  r¨   r*   c                 ó:   — | j                   j                  ||«      S rD   )rÏ  r¹   r]   s      r!   rj   zMLXBackend.add_axesï  rº   r*   c                 ó:   — | j                   j                  ||«      S rD   )rÏ  rb   rl   s      r!   rb   zMLXBackend.tileò  rª   r*   rR   c                 ó<   — | j                   j                  ||¬«      S rP   )rÏ  r¬   rn   s      r!   ro   zMLXBackend.concatõ  r­   r*   c                 óv   — | j                   j                  |j                  | j                   j                  «      S rD   )rÏ  Ú
issubdtyper¶   Úfloatingr-   s     r!   rr   zMLXBackend.is_float_typeø  s'   € Ø�w‰w×!Ñ! !§'¡'¨4¯7©7×+;Ñ+;Ó<Ð<r*   c                 ó<   —  | j                   j                  |g|¢­Ž S rD   )rÏ  r}   r{   s      r!   r}   zMLXBackend.einsumû  r¼   r*   N)r~   r   r€   r   r�   r   r.   r1   r@   r	   rZ   rj   rb   r„   ro   rr   r}   r…   r*   r!   rÊ  rÊ  Ô  sL   „ Ø€Nòò1ò ò ò
+ð&°ó &ò4ò(ð7 Có 7ò=ó+r*   rÊ  )Úreturnr   )r�   r   Ú
__author__r   r½  rƒ   r   r   r"   r   r‡   r˜   r¾   rË   r  r  r'  rK  rj  r  r›  r¯  rÊ  r…   r*   r!   Ú<module>rà     sî   ðò
ó à€
àÐ �$Ó Ø€ˆtÓ ØÐ ó(H÷VIEñ IE÷Xñ ô&$+�?ô $+ôN#�ô #ô$J.�?ô J.ôZ$-�/ô $-÷N#ñ #ô$C+˜ô C+ôL6�_ô 6ôrC-�_ô C-ôLB�Oô BôJ28�oô 28ôj3+�oô 3+ôl(+�õ (+r*   