ó
    Ÿ“,j X  ã                   ón  • % S r SSKrSr0 r\\S'   0 r\\S'   SrS$S jr " S	 S5      r	 " S
 S5      r
 " S S\	5      r " S S\5      r " S S\	5      r " S S\	5      r " S S5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S S\	5      r " S  S!\	5      r " S" S#\	5      rg)%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                 ó\  • [        U 5      n[        R                  US5      nUb  U$ [        [        R                  5       5      nU H(  u  pEUR                  U 5      (       d  M  U[        U'   Us  $    / n[        R                  5       nU(       a<  UR                  5       nXuR                  5       -  nUR                  U5        U(       a  M<  U VV	s/ s H  u  p‰UPM	     n
nn	U Hª  n[        (       a  [        SU5        UR                  U
;  d  M,  UR                  [        R                  ;   d  ML  [        (       a  [        SUR                  5        U" 5       nU[        UR                  '   UR                  U 5      (       d  MŸ  U[        U'   Us  $    [!        S[        U 5       35      es  sn	nf )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               ÚžC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\einops/_backends.pyÚget_backendr"      s}  € ô
 �‹L€EÜ×Ñ  tÓ,€GØÑØˆä!%Ô&6×&<Ñ&<Ó&>Ó!?ÐÛ$>Ñ ˆØ×&Ñ& v×.Ó.Ø#*ŒM˜%Ñ ØŠNñ %?ð ÐÜ×-Ñ-Ó/€HÞ
Ø—,‘,“.ˆØ×*Ñ*Ó,Ñ,ˆØ×!Ñ! 'Ô*÷ ˆ(ñ )CÔCÒ(B¡ ›!Ñ(BÐÑCÛ-ˆßÒÜÐ,¨oÔ>Ø×)Ñ)Ð1CÕCà×-Ñ-´·±Õ<ß#Ò#ÜÐ1°?×3QÑ3QÔRÙ)Ó+�Ø;BÔ  ×!7Ñ!7Ñ8Ø×.Ñ.¨v×6Ó6Ø+2”M %Ñ(Ø"’Nñ .ô Ð7¼¸V»°~ÐFÓ
GÐGùó Ds   ÃF(c                   ó¦   • \ rS rSr% Sr\\S'   S rS rS r	S r
S rS	 rS
 rS rS rS rS\4S jrS rS rS rS\4S jrS rS rS rS rSrg)r   éA   zJBase backend class, major part of methods are only for debugging purposes.r   c                 ó   • [        5       e)z4helper method should recognize tensors it can handle©ÚNotImplementedError©Úselfr   s     r!   r   Ú#AbstractBackend.is_appropriate_typeF   ó   € ä!Ó#Ð#ó    c                 ó   • [        S5      e©Nz.framework doesn't support imperative executionr&   ©r)   r   s     r!   Ú
from_numpyÚAbstractBackend.from_numpyJ   ó   € Ü!Ð"RÓSÐSr,   c                 ó   • [        S5      er.   r&   r/   s     r!   Úto_numpyÚAbstractBackend.to_numpyM   r2   r,   c                 ó   • [        S5      e©Nz/framework doesn't support symbolic computationsr&   ©r)   Úshapes     r!   Úcreate_symbolÚAbstractBackend.create_symbolP   s   € Ü!Ð"SÓTÐTr,   c                 ó   • [        S5      er7   r&   ©r)   ÚsymbolÚsymbol_value_pairss      r!   Úeval_symbolÚAbstractBackend.eval_symbolS   s   € ä!Ð"SÓTÐTr,   c                 ó   • [        S5      e)Nz"framework doesn't implement aranger&   ©r)   ÚstartÚstops      r!   ÚarangeÚAbstractBackend.arangeW   s   € ä!Ð"FÓGÐGr,   c                 ó   • UR                   $ )zashape should return a tuple with integers or "shape symbols" (which will evaluate to actual size)©r9   r/   s     r!   r9   ÚAbstractBackend.shape[   s   € à�w‰wˆr,   c                 ó$   • UR                  U5      $ ©N©Úreshape©r)   r   r9   s      r!   rN   ÚAbstractBackend.reshape_   ó   € Ø�y‰y˜ÓÐr,   c                 ó$   • UR                  U5      $ rL   ©Ú	transpose©r)   r   Úaxess      r!   rT   ÚAbstractBackend.transposeb   ó   € Ø�{‰{˜4Ó Ð r,   c                 ó    • [        X5      " US9$ ©N©Úaxis)Úgetattr©r)   r   Ú	operationrV   s       r!   ÚreduceÚAbstractBackend.reducee   s   € Ü�qÔ$¨$Ñ/Ð/r,   Útensorsc                 ó   • [        5       erL   r&   ©r)   rb   s     r!   Ústack_on_zeroth_dimensionÚ)AbstractBackend.stack_on_zeroth_dimensionh   ó   € Ü!Ó#Ð#r,   c                 ó   • [        5       erL   r&   ©r)   r   Únew_positions      r!   Úadd_axisÚAbstractBackend.add_axisk   rg   r,   c                 ó    • S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     U R                  U[        U5      5      $ )Né   )r
   rk   ÚtileÚtuple©r)   r   Ún_axesÚpos2lenÚrepeatsÚaxis_positionÚaxis_lengths          r!   Úadd_axesÚAbstractBackend.add_axesn   sM   € Ø�#˜‘,ˆØ*1¯-©-®/Ñ&ˆMØ—‘˜aÓ/ˆAØ%0�MÓ"ñ +:ð �y‰y˜œE '›NÓ+Ð+r,   c                 ó   • [        5       e)z!repeats - same lengths as x.shaper&   ©r)   r   rt   s      r!   ro   ÚAbstractBackend.tileu   r+   r,   r\   c                 ó   • [        5       e)zrconcatenates tensors along axis.
Assume identical across tensors: devices, dtypes and shapes except selected axis.r&   ©r)   rb   r\   s      r!   ÚconcatÚAbstractBackend.concaty   ó   € ô "Ó#Ð#r,   c                 ó   • [        5       erL   r&   r/   s     r!   Úis_float_typeÚAbstractBackend.is_float_type~   r€   r,   c                 ó   • [        S5      e)Nzbackend does not provide layersr&   ©r)   s    r!   ÚlayersÚAbstractBackend.layersƒ   ó   € Ü!Ð"CÓDÐDr,   c                 ó"   • SU R                    S3$ )Nz<einops backend for Ú>)r   r…   s    r!   Ú__repr__ÚAbstractBackend.__repr__†   s   € Ø% d×&9Ñ&9Ð%:¸!Ð<Ð<r,   c                 ó   • [        S5      e)Nzbackend does not support einsumr&   ©r)   Úpatternr   s      r!   ÚeinsumÚAbstractBackend.einsum‰   rˆ   r,   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚstrÚ__annotations__r   r0   r4   r:   r@   rF   r9   rN   rT   r`   r	   re   rk   rw   ro   Úintr~   r‚   r†   r‹   r�   Ú__static_attributes__r’   r,   r!   r   r   A   s   ‡ ÙTàÓò$òTòTòUòUòHòò ò!ò0ð$°ô $ò$ò,ò$ð$ Cô $ò
$ò
Eò=õEr,   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚUnknownSizeé�   zUpseudo-symbol for symbolic frameworks which do not provide symbols for shape elementsc                 ó   • U $ rL   r’   ©r)   Úothers     r!   Ú__floordiv__ÚUnknownSize.__floordiv__�   ó   € Øˆr,   c                 ó   • g©NTr’   r    s     r!   Ú__eq__ÚUnknownSize.__eq__“   s   € Ør,   c                 ó   • U $ rL   r’   r    s     r!   Ú__mul__ÚUnknownSize.__mul__–   r¤   r,   c                 ó   • U $ rL   r’   r    s     r!   Ú__rmul__ÚUnknownSize.__rmul__™   r¤   r,   c                 ó   • [        S 5      $ rL   )Úhashr…   s    r!   Ú__hash__ÚUnknownSize.__hash__œ   s   € Ü�D‹zÐr,   r’   N)r“   r”   r•   r–   r—   r¢   r§   rª   r­   r±   r›   r’   r,   r!   r�   r�   �   s   † Ù_òòòòõr,   r�   c                   ój   • \ rS rSrSrS rS rS rS rS r	S\
4S	 jrS
 rS\4S jrS rS rS rSrg)ÚNumpyBackendé    Únumpyc                 ó   • SS K nXl        g ©Nr   )r¶   Únp)r)   r¶   s     r!   Ú__init__ÚNumpyBackend.__init__£   s
   € Ûà�r,   c                 ó@   • [        XR                  R                  5      $ rL   )Ú
isinstancer¹   Úndarrayr(   s     r!   r   Ú NumpyBackend.is_appropriate_type¨   s   € Ü˜&§'¡'§/¡/Ó2Ð2r,   c                 ó   • U$ rL   r’   r/   s     r!   r0   ÚNumpyBackend.from_numpy«   ó   € Øˆr,   c                 ó   • U$ rL   r’   r/   s     r!   r4   ÚNumpyBackend.to_numpy®   rÂ   r,   c                 ó8   • U R                   R                  X5      $ rL   )r¹   rF   rC   s      r!   rF   ÚNumpyBackend.arange±   ó   € Ø�w‰w�~‰~˜eÓ*Ð*r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )r¹   Ústackrd   s     r!   re   Ú&NumpyBackend.stack_on_zeroth_dimension´   ó   € Ø�w‰w�}‰}˜WÓ%Ð%r,   c                 ó8   • U R                   R                  X5      $ rL   )r¹   ro   rz   s      r!   ro   ÚNumpyBackend.tile·   ó   € Ø�w‰w�|‰|˜AÓ'Ð'r,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )r¹   Úconcatenater}   s      r!   r~   ÚNumpyBackend.concatº   ó   € Ø�w‰w×"Ñ" 7Ð"Ð6Ð6r,   c                 ó    • UR                   S;   $ ©N)Úfloat16Úfloat32Úfloat64Úfloat128Úbfloat16©Údtyper/   s     r!   r‚   ÚNumpyBackend.is_float_type½   ó   € Ø�w‰wÐSÑSÐSr,   c                 ó8   • U R                   R                  X5      $ rL   )r¹   Úexpand_dimsri   s      r!   rk   ÚNumpyBackend.add_axisÀ   ó   € Ø�w‰w×"Ñ" 1Ó3Ð3r,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )r¹   r�   rŽ   s      r!   r�   ÚNumpyBackend.einsumÃ   ó   € Ø�w‰w�~Š~˜gÐ*¨Ò*Ð*r,   )r¹   N)r“   r”   r•   r–   r   rº   r   r0   r4   rF   r	   re   ro   rš   r~   r‚   rk   r�   r›   r’   r,   r!   r´   r´       sM   † Ø€Nòò
3òòò+ð&°ô &ò(ð7 Cô 7òTò4õ+r,   r´   c                   ó8   ^ • \ rS rSrSrU 4S jrS rS rSrU =r	$ )Ú
JaxBackendéÇ   Újaxc                 ón   >• [         TU ]  5         U R                  U l        SS KnUR
                  U l        g r¸   )Úsuperrº   r¹   ÚonpÚ	jax.numpyr¶   )r)   rè   Ú	__class__s     €r!   rº   ÚJaxBackend.__init__Ê   s'   ø€ Ü‰ÑÔØ—7‘7ˆŒãà—)‘)ˆ�r,   c                 ó8   • U R                   R                  U5      $ rL   )r¹   Úasarrayr/   s     r!   r0   ÚJaxBackend.from_numpyÒ   s   € Ø�w‰w�‰˜qÓ!Ð!r,   c                 ó8   • U R                   R                  U5      $ rL   )rë   rð   r/   s     r!   r4   ÚJaxBackend.to_numpyÕ   s   € Ø�x‰x×Ñ Ó"Ð"r,   )r¹   rë   )
r“   r”   r•   r–   r   rº   r0   r4   r›   Ú__classcell__©rí   s   @r!   ræ   ræ   Ç   s   ø† Ø€Nõò"÷#ð #r,   ræ   c                   ó‚   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
\4S jrS rS rS\4S jrS rS rS rS rSrg)ÚTorchBackendéÙ   Útorchc                 ó$   • SS K nXl         SSKJn  g )Nr   rn   )Ú_torch_specific)rù   Ú rû   )r)   rù   rû   s      r!   rº   ÚTorchBackend.__init__Ü   s   € ÛàŒ
æ%r,   c                 ó@   • [        XR                  R                  5      $ rL   )r½   rù   ÚTensorr(   s     r!   r   Ú TorchBackend.is_appropriate_typeã   s   € Ü˜&§*¡*×"3Ñ"3Ó4Ð4r,   c                 óv   • U R                   R                  U5      nU R                  U5      (       a  SUl        U$ r¦   )rù   r0   r‚   Úrequires_grad©r)   r   Úvariables      r!   r0   ÚTorchBackend.from_numpyæ   s4   € Ø—:‘:×(Ñ(¨Ó+ˆØ×Ñ˜h×'Ñ'à%)ˆHÔ"Øˆr,   c                 óZ   • UR                  5       R                  5       R                  5       $ rL   ©ÚdetachÚcpur¶   r/   s     r!   r4   ÚTorchBackend.to_numpyí   ó   € Ø�x‰x‹z�~‰~Ó×%Ñ%Ó'Ð'r,   c                 ó^   • U R                   R                  XU R                   R                  S9$ ©NrÚ   )rù   rF   Úint64rC   s      r!   rF   ÚTorchBackend.arangeð   s&   € Ø�z‰z× Ñ  °D·J±J×4DÑ4DÐ ÐEÐEr,   c                 ó   • US:X  a  UR                  US9$ US:X  a  UR                  US9$ US:X  a  UR                  US9$ US:X  a  UR                  US9$ US;   a)  [	        U5      S S S2    H  n[        X5      " US9nM     U$ [        SU5      e)	NÚmin©ÚdimÚmaxÚsumÚmean)ÚanyÚallÚprodéÿÿÿÿúUnknown reduction )ÚaminÚamaxr  r  Úsortedr]   r'   )r)   r   r_   Úreduced_axesÚis        r!   r`   ÚTorchBackend.reduceó   s©   € Ø˜ÓØ—6‘6˜l�6Ð+Ð+Ø˜%ÓØ—6‘6˜l�6Ð+Ð+Ø˜%ÓØ—5‘5˜\�5Ð*Ð*Ø˜&Ó Ø—6‘6˜l�6Ð+Ð+ØÐ0Ó0ä˜LÓ)©$¨B¨$Ô/�Ü˜AÔ)¨aÑ0’ñ 0àˆHä%Ð&:¸IÓFÐFr,   c                 ó$   • UR                  U5      $ rL   ©ÚpermuterU   s      r!   rT   ÚTorchBackend.transpose  ó   € Ø�y‰y˜‹Ðr,   rb   c                 ó8   • U R                   R                  U5      $ rL   )rù   rÉ   rd   s     r!   re   Ú&TorchBackend.stack_on_zeroth_dimension  s   € Ø�z‰z×Ñ Ó(Ð(r,   c                 óŒ   • S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     UR                  U5      $ ©Nr  ©r
   rk   Úexpandrq   s          r!   rw   ÚTorchBackend.add_axes
  óG   € Ø�$˜‘-ˆØ*1¯-©-®/Ñ&ˆMØ—‘˜aÓ/ˆAØ%0�MÓ"ñ +:ð �x‰x˜Ó Ð r,   c                 ó$   • UR                  U5      $ rL   ©Úrepeatrz   s      r!   ro   ÚTorchBackend.tile  ó   € Ø�x‰x˜Ó Ð r,   r\   c                 ó4   • U R                   R                  XS9$ ©Nr  )rù   Úcatr}   s      r!   r~   ÚTorchBackend.concat  s   € Ø�z‰z�~‰~˜gˆ~Ð0Ð0r,   c                 ó8   • U R                   R                  X5      $ rL   )rù   Ú	unsqueezeri   s      r!   rk   ÚTorchBackend.add_axis  s   € Ø�z‰z×#Ñ# AÓ4Ð4r,   c                 óÈ   • UR                   U R                  R                  U R                  R                  U R                  R                  U R                  R
                  4;   $ rL   )rÛ   rù   rÕ   rÖ   r×   rÙ   r/   s     r!   r‚   Ú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                 ó   • SSK Jn  U$ )Nrn   ©rù   )r†   rù   )r)   rù   s     r!   r†   ÚTorchBackend.layers  ó
   € Ý!àˆr,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )rù   r�   rŽ   s      r!   r�   ÚTorchBackend.einsum"  s   € Ø�z‰z× Ò  Ð-¨1Ò-Ð-r,   r>  N©r“   r”   r•   r–   r   rº   r   r0   r4   rF   r`   rT   r	   re   rw   ro   rš   r~   rk   r‚   r†   r�   r›   r’   r,   r!   r÷   r÷   Ù   sc   † Ø€Nò&ò5òò(òFòGò"ð)°ô )ò!ò!ð1 Cô 1ò5òlòõ
.r,   r÷   c                   ój   • \ rS rSrSrS rS rS rS rS r	S\
4S	 jrS
 rS\4S jrS rS rS rSrg)ÚCupyBackendi&  Úcupyc                 ó   • SS K nXl         g r¸   ©rF  )r)   rF  s     r!   rº   ÚCupyBackend.__init__)  s
   € Ûà�	r,   c                 ó@   • [        XR                  R                  5      $ rL   )r½   rF  r¾   r(   s     r!   r   ÚCupyBackend.is_appropriate_type.  s   € Ü˜&§)¡)×"3Ñ"3Ó4Ð4r,   c                 ó8   • U R                   R                  U5      $ rL   )rF  rð   r/   s     r!   r0   ÚCupyBackend.from_numpy1  ó   € Ø�y‰y× Ñ  Ó#Ð#r,   c                 ó8   • U R                   R                  U5      $ rL   )rF  Úasnumpyr/   s     r!   r4   ÚCupyBackend.to_numpy4  rN  r,   c                 ó8   • U R                   R                  X5      $ rL   )rF  rF   rC   s      r!   rF   ÚCupyBackend.arange7  s   € Ø�y‰y×Ñ Ó,Ð,r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )rF  rÉ   rd   s     r!   re   Ú%CupyBackend.stack_on_zeroth_dimension:  ó   € Ø�y‰y�‰˜wÓ'Ð'r,   c                 ó8   • U R                   R                  X5      $ rL   )rF  ro   rz   s      r!   ro   ÚCupyBackend.tile=  s   € Ø�y‰y�~‰~˜aÓ)Ð)r,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )rF  rÐ   r}   s      r!   r~   ÚCupyBackend.concat@  s   € Ø�y‰y×$Ñ$ WÐ$Ð8Ð8r,   c                 ó8   • U R                   R                  X5      $ rL   )rF  rß   ri   s      r!   rk   ÚCupyBackend.add_axisC  s   € Ø�y‰y×$Ñ$ QÓ5Ð5r,   c                 ó    • UR                   S;   $ rÔ   rÚ   r/   s     r!   r‚   ÚCupyBackend.is_float_typeF  rÝ   r,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )rF  r�   rŽ   s      r!   r�   ÚCupyBackend.einsumI  ó   € Ø�y‰y×Ò Ð,¨!Ò,Ð,r,   rH  N)r“   r”   r•   r–   r   rº   r   r0   r4   rF   r	   re   ro   rš   r~   rk   r‚   r�   r›   r’   r,   r!   rE  rE  &  sM   † Ø€Nòò
5ò$ò$ò-ð(°ô (ò*ð9 Cô 9ò6òTõ-r,   rE  c                   ó8   • \ rS rSrSrS\4S jrS rS rS r	Sr
g	)
ÚHashableTupleiM  z.Overcomes non-hashability of symbolic elementsÚelementsc                 ó   • Xl         g rL   ©rd  )r)   rd  s     r!   rº   ÚHashableTuple.__init__P  s   € Ø �r,   c              #   ó8   #   • U R                    S h  v•N   g  N7frL   rf  r…   s    r!   Ú__iter__ÚHashableTuple.__iter__S  s   é € Ø—=‘=× Ó ùs   ‚’“c                 ó,   • [        U R                  5      $ rL   )Úlenrd  r…   s    r!   Ú__len__ÚHashableTuple.__len__V  s   € Ü�4—=‘=Ó!Ð!r,   c                 ó    • U R                   U   $ rL   rf  )r)   Úitems     r!   Ú__getitem__ÚHashableTuple.__getitem__Y  s   € Ø�}‰}˜TÑ"Ð"r,   rf  N)r“   r”   r•   r–   r—   rp   rº   ri  rm  rq  r›   r’   r,   r!   rc  rc  M  s    † Ù8ð! ô !ò!ò"õ#r,   rc  c                   óˆ   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS\4S jrS rS rS rS rSrg)ÚTensorflowBackendi_  Ú
tensorflowc                 ó   • SS K nXl        g r¸   )ru  Útf©r)   ru  s     r!   rº   ÚTensorflowBackend.__init__b  s
   € Ûà�r,   c                 ól   • [        XR                  R                  U R                  R                  45      $ rL   )r½   rw  rÿ   ÚVariabler(   s     r!   r   Ú%TensorflowBackend.is_appropriate_typeg  s$   € Ü˜&§7¡7§>¡>°4·7±7×3CÑ3CÐ"DÓEÐEr,   c                 óz   • U R                   R                  5       (       d   eU R                   R                  U5      $ rL   )rw  Úexecuting_eagerlyÚconvert_to_tensorr/   s     r!   r0   ÚTensorflowBackend.from_numpyj  s0   € Ø�w‰w×(Ñ(×*Ñ*Ð*Ð*Ø�w‰w×(Ñ(¨Ó+Ð+r,   c                 ód   • U R                   R                  5       (       d   eUR                  5       $ rL   )rw  r~  r¶   r/   s     r!   r4   ÚTensorflowBackend.to_numpyn  s'   € Ø�w‰w×(Ñ(×*Ñ*Ð*Ð*Ø�w‰w‹yÐr,   c                 ó8   • U R                   R                  X5      $ rL   )rw  ÚrangerC   s      r!   rF   ÚTensorflowBackend.aranger  s   € Ø�w‰w�}‰}˜UÓ)Ð)r,   c                 ó¨  • U R                   R                  5       (       a  [        S UR                   5       5      $ UR                  R	                  5       nU R                   R                  U5      n[        [        U5       VVs/ s H  u  pEU=(       d    X4   PM     snn5      n [        U5        U$ s  snnf ! [         a    [        U5      s $ f = f)Nc              3   óP   #   • U  H  oc
  [        5       O
[        U5      v •  M     g 7frL   )r�   rš   )Ú.0Úds     r!   Ú	<genexpr>Ú*TensorflowBackend.shape.<locals>.<genexpr>w  s   é € ÐQÊÀA©)œœ¼¸Q»Ô?Êùs   ‚$&)	rw  r~  rp   r9   Úas_listÚ	enumerater°   ÚBaseExceptionrc  )r)   r   Ústatic_shapeÚtf_shaper  Úsr9   s          r!   r9   ÚTensorflowBackend.shapeu  s«   € Ø�7‰7×$Ñ$×&Ñ&ÜÑQÈÏÊÓQÓQÐQàŸ7™7Ÿ?™?Ó,ˆLØ—w‘w—}‘} QÓ'ˆHä¼IÀlÔ<SÔTÒ<S±&°#˜1×- ¡Ò-Ñ<SÒTÓUˆEð,Ü�U”Ø�ùó Uøô !ó ,ä$ UÓ+Ò+ð,ús   ÂB3
Â&B9 Â9CÃCc                 ó<   • [        U R                  SU-   5      " XS9$ )NÚreduce_r[   )r]   rw  r^   s       r!   r`   ÚTensorflowBackend.reduce„  s   € Ü�t—w‘w 	¨IÑ 5Ô6°qÑDÐDr,   c                 ó8   • U R                   R                  X5      $ rL   )rw  rN   rO   s      r!   rN   ÚTensorflowBackend.reshape‡  s   € Ø�w‰w�‰˜qÓ(Ð(r,   c                 ó8   • U R                   R                  X5      $ rL   )rw  rT   rU   s      r!   rT   ÚTensorflowBackend.transposeŠ  s   € Ø�w‰w× Ñ  Ó)Ð)r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )rw  rÉ   rd   s     r!   re   Ú+TensorflowBackend.stack_on_zeroth_dimension�  rË   r,   c                 ó8   • U R                   R                  X5      $ rL   )rw  ro   rz   s      r!   ro   ÚTensorflowBackend.tile�  rÎ   r,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )rw  r~   r}   s      r!   r~   ÚTensorflowBackend.concat“  s   € Ø�w‰w�~‰~˜gˆ~Ð1Ð1r,   c                 ó8   • U R                   R                  X5      $ rL   )rw  rß   ri   s      r!   rk   ÚTensorflowBackend.add_axis–  rá   r,   c                 ó    • UR                   S;   $ rÔ   rÚ   r/   s     r!   r‚   ÚTensorflowBackend.is_float_type™  rÝ   r,   c                 ó   • SSK Jn  U$ )Nrn   )ru  )r†   ru  rx  s     r!   r†   ÚTensorflowBackend.layersœ  s   € Ý&àÐr,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )rw  r�   rŽ   s      r!   r�   ÚTensorflowBackend.einsum¡  rä   r,   )rw  N)r“   r”   r•   r–   r   rº   r   r0   r4   rF   r9   r`   rN   rT   r	   re   ro   rš   r~   rk   r‚   r†   r�   r›   r’   r,   r!   rt  rt  _  sh   † Ø!€Nòò
Fò,òò*ò,òEò)ò*ð&°ô &ò(ð2 Cô 2ò4òTòõ
+r,   rt  c                   ó‚   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS\4S jrS rS rS rSrg)ÚTFKerasBackendi¥  ztensorflow.kerasc                 óp   • SS K nXl        UR                  U l        UR                  R                  U l        g r¸   )ru  rw  Úkerasr   ÚK)r)   rw  s     r!   rº   ÚTFKerasBackend.__init__¨  s&   € ÛàŒØ—X‘XˆŒ
Ø—‘×!Ñ!ˆ�r,   c                 ó|   • U R                   R                  U5      =(       a    U R                  R                  U5      $ rL   )rw  Ú	is_tensorr¬  Úis_keras_tensorr(   s     r!   r   Ú"TFKerasBackend.is_appropriate_type¯  s+   € Ø�w‰w× Ñ  Ó(×K¨T¯V©V×-CÑ-CÀFÓ-KÐKr,   c                 ó4   • U R                   R                  US9$ )N)Úbatch_shape)r«  ÚInputr8   s     r!   r:   ÚTFKerasBackend.create_symbol²  s   € Ø�z‰z×Ñ¨EÐÐ2Ð2r,   c                 óÜ   • U R                   R                  R                  U VVs/ s H  u  p4UPM	     snnU5      nUR                  U VVs/ s H  u  pFUPM	     snn5      $ s  snnf s  snnf rL   )r«  ÚmodelsÚModelÚpredict_on_batch)r)   r>   r?   Úvarr   ÚmodelÚvals          r!   r@   ÚTFKerasBackend.eval_symbolµ  sa   € Ø—
‘
×!Ñ!×'Ñ'Ñ=OÔ(PÒ=O±°#«Ñ=OÒ(PÐRXÓYˆØ×%Ñ%Ñ;MÔ&NÒ;M©x°£sÑ;MÒ&NÓOÐOùó )QùÛ&Ns   ¥A"
ÁA(
c                 ó8   • U R                   R                  X5      $ rL   )r¬  rF   rC   s      r!   rF   ÚTFKerasBackend.arange¹  s   € Ø�v‰v�}‰}˜UÓ)Ð)r,   c                 ó`   • U R                   R                  U5      n[        [        U5      5      $ rL   )r¬  r9   rc  rp   rO   s      r!   r9   ÚTFKerasBackend.shape¼  s"   € Ø—‘—‘˜Q“ˆÜœU 5›\Ó*Ð*r,   c                 ó6   • [        U R                  U5      " XS9$ rZ   )r]   r¬  r^   s       r!   r`   ÚTFKerasBackend.reduceÀ  s   € Ü�t—v‘v˜yÔ)¨!Ñ7Ð7r,   c                 ó8   • U R                   R                  X5      $ rL   )r¬  rN   rO   s      r!   rN   ÚTFKerasBackend.reshapeÃ  s   € Ø�v‰v�~‰~˜aÓ'Ð'r,   c                 ó8   • U R                   R                  X5      $ rL   )r¬  Úpermute_dimensionsrU   s      r!   rT   ÚTFKerasBackend.transposeÆ  s   € Ø�v‰v×(Ñ(¨Ó1Ð1r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )r¬  rÉ   rd   s     r!   re   Ú(TFKerasBackend.stack_on_zeroth_dimensionÉ  s   € Ø�v‰v�|‰|˜GÓ$Ð$r,   c                 ó8   • U R                   R                  X5      $ rL   )r¬  ro   rz   s      r!   ro   ÚTFKerasBackend.tileÌ  s   € Ø�v‰v�{‰{˜1Ó&Ð&r,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )r¬  rÐ   r}   s      r!   r~   ÚTFKerasBackend.concatÏ  s   € Ø�v‰v×!Ñ! 'Ð!Ð5Ð5r,   c                 ó8   • U R                   R                  X5      $ rL   )r¬  rß   ri   s      r!   rk   ÚTFKerasBackend.add_axisÒ  s   € Ø�v‰v×!Ñ! !Ó2Ð2r,   c                 ó>   • SU R                   R                  U5      ;   $ )NÚfloat)r¬  rÛ   r/   s     r!   r‚   ÚTFKerasBackend.is_float_typeÕ  s   € Ø˜$Ÿ&™&Ÿ,™, q›/Ñ)Ð)r,   c                 ó   • SSK Jn  U$ )Nrn   )r«  )r†   r«  )r)   r«  s     r!   r†   ÚTFKerasBackend.layersØ  r@  r,   )r¬  r«  rw  N)r“   r”   r•   r–   r   rº   r   r:   r@   rF   r9   r`   rN   rT   r	   re   ro   rš   r~   rk   r‚   r†   r›   r’   r,   r!   r©  r©  ¥  sb   † Ø'€Nò"òLò3òPò*ò+ò8ò(ò2ð%°ô %ò'ð6 Cô 6ò3ò*õr,   r©  c                   ó‚   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
\4S jrS rS rS\4S jrS rS rS rS rSrg)ÚOneFlowBackendiÞ  Úoneflowc                 ó   • SS K nXl        g r¸   )rØ  Úflow)r)   rÚ  s     r!   rº   ÚOneFlowBackend.__init__á  s
   € Ûà�	r,   c                 ó@   • [        XR                  R                  5      $ rL   )r½   rÚ  rÿ   r(   s     r!   r   Ú"OneFlowBackend.is_appropriate_typeæ  s   € Ü˜&§)¡)×"2Ñ"2Ó3Ð3r,   c                 óv   • U R                   R                  U5      nU R                  U5      (       a  SUl        U$ r¦   )rÚ  r0   r‚   r  r  s      r!   r0   ÚOneFlowBackend.from_numpyé  s4   € Ø—9‘9×'Ñ'¨Ó*ˆØ×Ñ˜h×'Ñ'à%)ˆHÔ"Øˆr,   c                 óZ   • UR                  5       R                  5       R                  5       $ rL   r  r/   s     r!   r4   ÚOneFlowBackend.to_numpyð  r  r,   c                 ó^   • U R                   R                  XU R                   R                  S9$ r  )rÚ  rF   r  rC   s      r!   rF   ÚOneFlowBackend.arangeó  s$   € Ø�y‰y×Ñ °4·9±9·?±?ÐÐCÐCr,   c                 óÎ   • [        USS9 HV  nUS:X  a  UR                  US9u  pM  US:X  a  UR                  US9u  pM5  US;   a  [        X5      " US9nML  [	        SU5      e   U$ )NT©Úreverser  r  r  )r  r  r  r  r  r  )r  r  r  r]   r'   )r)   r   r_   r  r\   r   s         r!   r`   ÚOneFlowBackend.reduceö  sv   € Ü˜<°Ô6ˆDØ˜EÓ!Ø—u‘u �u�‘�‘1Ø˜eÓ#Ø—u‘u �u�‘�‘1ØÐCÓCÜ˜AÔ)¨dÑ3’ä)Ð*>À	ÓJÐJñ 7ð ˆr,   c                 ó$   • UR                  U5      $ rL   r#  rU   s      r!   rT   ÚOneFlowBackend.transpose  r&  r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )rÚ  rÉ   rd   s     r!   re   Ú(OneFlowBackend.stack_on_zeroth_dimension  rV  r,   c                 óˆ   • S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     UR                  " U6 $ r*  r+  rq   s          r!   rw   ÚOneFlowBackend.add_axes  sG   € Ø�$˜‘-ˆØ*1¯-©-®/Ñ&ˆMØ—‘˜aÓ/ˆAØ%0�MÓ"ñ +:ð �xŠx˜Ð!Ð!r,   c                 ó$   • UR                  U5      $ rL   r0  rz   s      r!   ro   ÚOneFlowBackend.tile  r3  r,   r\   c                 ó4   • U R                   R                  XS9$ r5  )rÚ  r~   r}   s      r!   r~   ÚOneFlowBackend.concat  s   € Ø�y‰y×Ñ ÐÐ2Ð2r,   c                 ó8   • U R                   R                  X5      $ rL   )rÚ  r9  ri   s      r!   rk   ÚOneFlowBackend.add_axis  s   € Ø�y‰y×"Ñ" 1Ó3Ð3r,   c                 óž   • UR                   U R                  R                  U R                  R                  U R                  R                  4;   $ rL   )rÛ   rÚ  rÕ   rÖ   r×   r/   s     r!   r‚   ÚOneFlowBackend.is_float_type  s6   € Ø�w‰w˜4Ÿ9™9×,Ñ,¨d¯i©i×.?Ñ.?ÀÇÁ×ARÑARÐSÑSÐSr,   c                 ó   • SSK Jn  U$ )Nrn   )rØ  )r†   rØ  )r)   rØ  s     r!   r†   ÚOneFlowBackend.layers  s
   € Ý#àˆr,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )rÚ  r�   rŽ   s      r!   r�   ÚOneFlowBackend.einsum   ra  r,   )rÚ  NrC  r’   r,   r!   r×  r×  Þ  sb   † Ø€Nòò
4òò(òDò
òð(°ô (ò"ò!ð3 Cô 3ò4òTòõ
-r,   r×  c                   óœ   ^ • \ rS rSrSrS rS rS rS rS r	U 4S jr
S	 rS
 rS\4S jrS rS rS\4S jrS rS rS rS rS rSrU =r$ )ÚPaddleBackendi$  Úpaddlec                 ó   • SS K nXl         g r¸   ©rü  ©r)   rü  s     r!   rº   ÚPaddleBackend.__init__'  s
   € Ûà�r,   c                 ó8   • U R                   R                  U5      $ rL   )rü  r¯  r(   s     r!   r   Ú!PaddleBackend.is_appropriate_type,  s   € Ø�{‰{×$Ñ$ VÓ,Ð,r,   c                 óJ   • U R                   R                  U5      nSUl        U$ )NF)rü  Ú	to_tensorÚstop_gradient)r)   r   r   s      r!   r0   ÚPaddleBackend.from_numpy/  s#   € Ø—‘×&Ñ& qÓ)ˆØ$ˆÔØˆr,   c                 ó>   • UR                  5       R                  5       $ rL   )r  r¶   r/   s     r!   r4   ÚPaddleBackend.to_numpy4  s   € Ø�x‰x‹z×ÑÓ!Ð!r,   c                 ó^   • U R                   R                  XU R                   R                  S9$ r  )rü  rF   r  rC   s      r!   rF   ÚPaddleBackend.arange7  s&   € Ø�{‰{×!Ñ! %°T·[±[×5FÑ5FÐ!ÐGÐGr,   c                 ó”   >• [        U5      UR                  :X  a  [        TU ]  XU5      R	                  S5      $ [        TU ]  XU5      $ r¸   )rl  Úndimrê   r`   Úsqueeze)r)   r   r_   rV   rí   s       €r!   r`   ÚPaddleBackend.reduce:  s@   ø€ Üˆt‹9˜Ÿ™Óä‘7‘> !°Ó5×=Ñ=¸aÓ@Ð@ä‘7‘> !°Ó5Ð5r,   c                 ó$   • UR                  U5      $ rL   rS   rU   s      r!   rT   ÚPaddleBackend.transposeA  rX   r,   c                 óŒ   • S/U-  nUR                  5        H  u  pVU R                  X5      nXdU'   M     UR                  U5      $ r*  r+  rq   s          r!   rw   ÚPaddleBackend.add_axesD  r.  r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )rü  rÉ   rd   s     r!   re   Ú'PaddleBackend.stack_on_zeroth_dimensionK  s   € Ø�{‰{× Ñ  Ó)Ð)r,   c                 ó$   • UR                  U5      $ rL   rM   rO   s      r!   rN   ÚPaddleBackend.reshapeN  rQ   r,   c                 ó$   • UR                  U5      $ rL   )ro   rz   s      r!   ro   ÚPaddleBackend.tileQ  s   € Ø�v‰v�g‹Ðr,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )rü  r~   r}   s      r!   r~   ÚPaddleBackend.concatT  s   € Ø�{‰{×!Ñ! 'Ð!Ð5Ð5r,   c                 ó$   • UR                  U5      $ rL   ©r9  ri   s      r!   rk   ÚPaddleBackend.add_axisW  ó   € Ø�{‰{˜<Ó(Ð(r,   c                 óž   • UR                   U R                  R                  U R                  R                  U R                  R                  4;   $ rL   )rÛ   rü  rÕ   rÖ   r×   r/   s     r!   r‚   ÚPaddleBackend.is_float_typeZ  s6   € Ø�w‰w˜4Ÿ;™;×.Ñ.°·±×0CÑ0CÀTÇ[Á[×EXÑEXÐYÑYÐYr,   c                 ó   • SSK Jn  U$ )Nrn   rþ  )r†   rü  rÿ  s     r!   r†   ÚPaddleBackend.layers]  s
   € Ý"àˆr,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )rü  r�   rŽ   s      r!   r�   ÚPaddleBackend.einsumb  s   € Ø�{‰{×!Ò! 'Ð.¨AÒ.Ð.r,   c                 ó,   • [        UR                  5      $ rL   )rp   r9   r/   s     r!   r9   ÚPaddleBackend.shapee  s   € Ü�Q—W‘W‹~Ðr,   rþ  )r“   r”   r•   r–   r   rº   r   r0   r4   rF   r`   rT   rw   r	   re   rN   ro   rš   r~   rk   r‚   r†   r�   r9   r›   rô   rõ   s   @r!   rû  rû  $  sr   ø† Ø€Nòò
-òò
"òHõ6ò!ò!ð*°ô *ò òð6 Cô 6ò)òZòò
/÷ð r,   rû  c                   ó‚   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS rS\4S jrS rS rSrg)ÚTinygradBackendii  Útinygradc                 ó   • SS K nXl         g r¸   ©r)  )r)   r)  s     r!   rº   ÚTinygradBackend.__init__l  s
   € Ûà �r,   c                 ó@   • [        XR                  R                  5      $ rL   )r½   r)  rÿ   r(   s     r!   r   Ú#TinygradBackend.is_appropriate_typeq  s   € Ü˜&§-¡-×"6Ñ"6Ó7Ð7r,   c                 ó8   • U R                   R                  U5      $ rL   )r)  rÿ   r/   s     r!   r0   ÚTinygradBackend.from_numpyt  s   € Ø�}‰}×#Ñ# AÓ&Ð&r,   c                 ó"   • UR                  5       $ rL   )r¶   r/   s     r!   r4   ÚTinygradBackend.to_numpyw  s   € Ø�w‰w‹yÐr,   c                 óL   • U R                   R                  R                  X5      $ rL   )r)  rÿ   rF   rC   s      r!   rF   ÚTinygradBackend.arangez  s   € Ø�}‰}×#Ñ#×*Ñ*¨5Ó7Ð7r,   c                 ó   • UR                   $ rL   rI   r/   s     r!   r9   ÚTinygradBackend.shape}  s   € Ø�w‰wˆr,   c                 ó$   • UR                  U5      $ rL   rM   rO   s      r!   rN   ÚTinygradBackend.reshape€  rQ   r,   c                 ó$   • UR                  U5      $ rL   r#  rU   s      r!   rT   ÚTinygradBackend.transposeƒ  r&  r,   c                 óF   • [        USS9 H  n[        X5      " US9nM     U$ )NTrå  r[   )r  r]   )r)   r   r_   rV   r\   s        r!   r`   ÚTinygradBackend.reduce†  s'   € Ü˜4¨Ô.ˆDÜ˜Ô%¨4Ñ0ŠAñ /àˆr,   rb   c                 óL   • U R                   R                  R                  U5      $ rL   )r)  rÿ   rÉ   rd   s     r!   re   Ú)TinygradBackend.stack_on_zeroth_dimension‹  s   € Ø�}‰}×#Ñ#×)Ñ)¨'Ó2Ð2r,   c                 ó$   • UR                  U5      $ rL   r  ri   s      r!   rk   ÚTinygradBackend.add_axisŽ  r  r,   c                 ó$   • UR                  U5      $ rL   r0  rz   s      r!   ro   ÚTinygradBackend.tile‘  r3  r,   r\   c                 óZ   • [        U5      S:”  a  US   R                  " USS  SU06$ US   $ )Nrn   r   r  )rl  r6  r}   s      r!   r~   ÚTinygradBackend.concat”  s5   € Ü9<¸W»ÈÓ9Iˆw�q‰z�~Š~˜w q r˜{Ð5°Ñ5ÐYÈwÐWXÉzÐYr,   c                 ó`   • U R                   R                  R                  UR                  5      $ rL   )r)  ÚdtypesÚis_floatrÛ   r/   s     r!   r‚   ÚTinygradBackend.is_float_type—  s!   € Ø�}‰}×#Ñ#×,Ñ,¨Q¯W©WÓ5Ð5r,   c                 óP   • U R                   R                  R                  " U/UQ76 $ rL   )r)  rÿ   r�   rŽ   s      r!   r�   ÚTinygradBackend.einsumš  s"   € Ø�}‰}×#Ñ#×*Ò*¨7Ð7°QÒ7Ð7r,   r+  N)r“   r”   r•   r–   r   rº   r   r0   r4   rF   r9   rN   rT   r`   r	   re   rk   ro   rš   r~   r‚   r�   r›   r’   r,   r!   r(  r(  i  sb   † Ø€Nò!ò
8ò'òò8òò òòð
3°ô 3ò)ò!ðZ Cô Zò6õ8r,   r(  c                   ó|   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS\4S jrS rS\4S jrS rS rSrg)ÚPyTensorBackendiž  Úpytensorc                 ó   • SSK Jn  Xl        g )Nr   )r   )rM  r   Úptr(   s     r!   rº   ÚPyTensorBackend.__init__¡  s
   € Ý#à�r,   c                 ó@   • [        XR                  R                  5      $ rL   )r½   rO  ÚTensorVariabler(   s     r!   r   Ú#PyTensorBackend.is_appropriate_type¦  s   € Ü˜&§'¡'×"8Ñ"8Ó9Ð9r,   c                 ó\   • UR                   U R                  R                  R                  ;   $ rL   )rÛ   rO  r   Úfloat_dtypesr/   s     r!   r‚   ÚPyTensorBackend.is_float_type©  s   € Ø�w‰w˜$Ÿ'™'Ÿ,™,×3Ñ3Ñ3Ð3r,   c                 ó8   • U R                   R                  U5      $ rL   )rO  Ú	as_tensorr/   s     r!   r0   ÚPyTensorBackend.from_numpy¬  s   € Ø�w‰w× Ñ  Ó#Ð#r,   c                 ó"   • UR                  5       $ rL   )Úevalr/   s     r!   r4   ÚPyTensorBackend.to_numpy¯  s   € Ø�v‰v‹xˆr,   c                 ór   • [        U[        [        -  5      (       d  U4nU R                  R	                  US9$ )NrI   )r½   rp   r	   rO  r   r8   s     r!   r:   ÚPyTensorBackend.create_symbol²  s/   € Ü˜%¤¬¡×.Ñ.Ø�HˆEØ�w‰w�~‰~ Eˆ~Ð*Ð*r,   c                 ó6   • UR                  [        U5      5      $ rL   )r[  Údictr=   s      r!   r@   ÚPyTensorBackend.eval_symbol·  s   € Ø�{‰{œ4Ð 2Ó3Ó4Ð4r,   c                 ó8   • U R                   R                  X5      $ rL   )rO  rF   rC   s      r!   rF   ÚPyTensorBackend.arangeº  rÇ   r,   c                 óv   • [        S [        UR                  R                  UR                  5       5       5      $ )Nc              3   ó4   #   • U  H  u  pUb  UOUv •  M     g 7frL   r’   )rˆ  Ú
static_dimÚsymbolic_dims      r!   rŠ  Ú(PyTensorBackend.shape.<locals>.<genexpr>¿  s$   é € ð 
â,FÑ(�
ð %Ñ0‰J°lÔBÚ,Fùs   ‚)rp   Úzipr   r9   r/   s     r!   r9   ÚPyTensorBackend.shape½  s/   € äñ 
ä,/°·±·±¸a¿g¹gÔ,Fó
ó 
ð 	
r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )rO  rÉ   rd   s     r!   re   Ú)PyTensorBackend.stack_on_zeroth_dimensionÄ  rË   r,   c                 ó8   • U R                   R                  X5      $ rL   )rO  ro   rz   s      r!   ro   ÚPyTensorBackend.tileÇ  rÎ   r,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )rO  rÐ   r}   s      r!   r~   ÚPyTensorBackend.concatÊ  rÒ   r,   c                 ó8   • U R                   R                  X5      $ rL   )rO  rß   ri   s      r!   rk   ÚPyTensorBackend.add_axisÍ  rá   r,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )rO  r�   rŽ   s      r!   r�   ÚPyTensorBackend.einsumÐ  rä   r,   )rO  N)r“   r”   r•   r–   r   rº   r   r‚   r0   r4   r:   r@   rF   r9   r	   re   ro   rš   r~   rk   r�   r›   r’   r,   r!   rL  rL  ž  s[   † Ø€Nòò
:ò4ò$òò+ò
5ò+ò
ð&°ô &ò(ð7 Cô 7ò4õ+r,   rL  c                   ój   • \ rS rSrSrS rS rS rS rS r	S\
4S	 jrS
 rS rS\4S jrS rS rSrg)Ú
MLXBackendiÔ  Úmlxc                 ó0   • SS K Jn  SS KnXl        X l        g r¸   )Úmlx.coreÚcorer¶   Úmxr¹   )r)   r{  r¹   s      r!   rº   ÚMLXBackend.__init__×  s   € ÝÛàŒØ�r,   c                 ó@   • [        XR                  R                  5      $ rL   )r½   r{  Úarrayr(   s     r!   r   ÚMLXBackend.is_appropriate_typeÞ  s   € Ü˜&§'¡'§-¡-Ó0Ð0r,   c                 ó8   • U R                   R                  U5      $ rL   )r{  r~  r/   s     r!   r0   ÚMLXBackend.from_numpyá  s   € Ø�w‰w�}‰}˜QÓÐr,   c                 óÊ   • UR                   U R                  R                  :X  a%  UR                  U R                  R                  5      nU R
                  R                  U5      $ rL   )rÛ   r{  rÙ   ÚastyperÖ   r¹   r~  r/   s     r!   r4   ÚMLXBackend.to_numpyä  sA   € Ø�7‰7�d—g‘g×&Ñ&Ó&Ø—‘˜Ÿ™Ÿ™Ó)ˆAØ�w‰w�}‰}˜QÓÐr,   c                 ó8   • U R                   R                  X5      $ rL   )r{  rF   rC   s      r!   rF   ÚMLXBackend.arangeé  rÇ   r,   rb   c                 ó8   • U R                   R                  U5      $ rL   )r{  rÉ   rd   s     r!   re   Ú$MLXBackend.stack_on_zeroth_dimensionì  rË   r,   c                 ó8   • U R                   R                  X5      $ rL   )r{  rß   ri   s      r!   rw   ÚMLXBackend.add_axesï  rá   r,   c                 ó8   • U R                   R                  X5      $ rL   )r{  ro   rz   s      r!   ro   ÚMLXBackend.tileò  rÎ   r,   r\   c                 ó4   • U R                   R                  XS9$ rZ   )r{  rÐ   r}   s      r!   r~   ÚMLXBackend.concatõ  rÒ   r,   c                 óv   • U R                   R                  UR                  U R                   R                  5      $ rL   )r{  Ú
issubdtyperÛ   Úfloatingr/   s     r!   r‚   ÚMLXBackend.is_float_typeø  s'   € Ø�w‰w×!Ñ! !§'¡'¨4¯7©7×+;Ñ+;Ó<Ð<r,   c                 ó<   • U R                   R                  " U/UQ76 $ rL   )r{  r�   rŽ   s      r!   r�   ÚMLXBackend.einsumû  rä   r,   )r{  r¹   N)r“   r”   r•   r–   r   rº   r   r0   r4   rF   r	   re   rw   ro   rš   r~   r‚   r�   r›   r’   r,   r!   rv  rv  Ô  sL   † Ø€Nòò1ò ò ò
+ð&°ô &ò4ò(ð7 Cô 7ò=õ+r,   rv  )Úreturnr   )r—   r   Ú
__author__r   r`  r™   r   r   r"   r   r�   r´   ræ   r÷   rE  rc  rt  r©  r×  rû  r(  rL  rv  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,   