ó
    pyüi>i  ã                  ó  • S SK Jr  S SKJr  S SKJr  SSKJr  SSKJ	r	  SSK
JrJrJrJr  SS	KJr  \" 5       (       a:  S S
Kr\R$                  R'                  \5      r\R$                  R'                  \5      r\R(                  " \5      r  S          S!S jjr          S"S jrS#S jrS#S jrS rS r\" 5       (       aR  \R:                  R=                  S\SS9  \R:                  R?                  S\5        \R:                  RA                  S\\S9  S$S jr!        S#S jr"  S            S%S jjr#          S"S jr$ " S S\	5      r%\%" 5       r&S&S jr' S'\&SSSSS.             S(S jjjr(g
))é    )Úannotations)ÚCallable)Úwrapsé   )Úlogging)ÚGeneralInterface)Úis_torch_availableÚis_torch_greater_or_equalÚis_torch_less_or_equalÚis_torchdynamo_compilingé   )Úsonicmoe_experts_forwardNFc                ó  • U(       a6  [         R                  " U R                  S5      U5      R                  S5      nO4[         R                  " XR                  S5      5      R                  S5      nUb  UR	                  U5        U$ )a‚  Batched linear layer supporting optional bias and transposed weights.

Args:
    input (`torch.Tensor`):
        Input tensor of shape (batch_size, input_dim).
    weight (`torch.Tensor`):
        Weight tensor of shape (batch_size, output_dim, input_dim) if transposed is `False`,
        else of shape (batch_size, input_dim, output_dim).
    bias (`torch.Tensor`, *optional*):
        Bias tensor of shape (batch_size, output_dim). Default is `None`.
    is_transposed (`bool`, *optional*, defaults to `False`):
        Whether the weight tensor is transposed.
Returns:
    `torch.Tensor`: Output tensor of shape (batch_size, output_dim).
r   éÿÿÿÿ)ÚtorchÚbmmÚ	unsqueezeÚsqueezeÚadd_)ÚinputÚweightÚbiasÚis_transposedÚouts        ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/integrations/moe.pyÚ_batched_linearr   S   se   € ö* ä�iŠi˜Ÿ™¨Ó*¨FÓ3×;Ñ;¸AÓ>‰ô �iŠi˜§¡°Ó 3Ó4×<Ñ<¸RÓ@ˆàÑØ�‰�Œà€Jó    c                ó¦  • UR                  S5      nUR                  S5      nUR                  S5      nUR                  USS9nUR                  S5      nUR                  S5      n	U	R                  SU R                  S-
  5        U R
                  (       a2  U R                  U	   n
U R                  (       a  U R                  U	   OS nO1U R                  U	   n
U R                  (       a  U R                  U	   OS n[        XzX°R                  S9nU R
                  (       a  U R                  U5      nOU R                  U5      nU R                  U	   n
U R                  (       a  U R                   U	   OS n[        XÊX°R                  S9nXÈR#                  S5      -  nUR%                  XTU5      R'                  SS9nUR)                  UR*                  5      $ )Nr   r   ©Údimr   ©r   r   )ÚsizeÚrepeat_interleaveÚreshapeÚclamp_Únum_expertsÚhas_gateÚgate_up_projÚhas_biasÚgate_up_proj_biasÚup_projÚup_proj_biasr   r   Ú_apply_gateÚact_fnÚ	down_projÚdown_proj_biasr   ÚviewÚsumÚtoÚdtype)ÚselfÚhidden_statesÚtop_k_indexÚtop_k_weightsÚ	num_top_kÚ
num_tokensÚ
hidden_dimÚselected_hidden_statesÚsample_weightsÚ
expert_idsÚselected_weightsÚselected_biasesÚproj_outÚweighted_outÚfinal_hidden_statess                  r   Úbatched_mm_experts_forwardrD   u   s³  € ð × Ñ  Ó$€IØ×#Ñ# AÓ&€JØ×#Ñ# BÓ'€Jð +×<Ñ<¸YÈAÐ<ÐNÐØ"×*Ñ*¨2Ó.€NØ×$Ñ$ RÓ(€Jð
 ×Ñ�a˜×)Ñ)¨AÑ-Ô.ð ‡}‡}Ø×,Ñ,¨ZÑ8ÐØ@DÇÇ˜$×0Ñ0°Ò<ÐSW‰àŸ<™<¨
Ñ3ÐØ;?¿=¿=˜$×+Ñ+¨JÒ7Èdˆô Ø°×VhÑVhñ€Hð
 ‡}‡}à×#Ñ# HÓ-‰ð —;‘;˜xÓ(ˆð —~‘~ jÑ1ÐØ9=¿¿�d×)Ñ)¨*Ò5ÈD€Oô Ø¨×HZÑHZñ€Hð
 ×6Ñ6°rÓ:Ñ:€Lð '×+Ñ+¨JÀ:ÓN×RÑRÐWXÐRÐYÐà×!Ñ! -×"5Ñ"5Ó6Ð6r   c                ó*  • [         R                  " U R                  S5      UR                  S5      U R                  U R                  S9nSn[        UR                  5       5       H*  u  pVXF:X  a  M  [         R                  " XU X   X4U S9  UnM,     U$ )a  
Fallback grouped matrix multiplication used when `torch.nn.functional.grouped_mm` and `torch._grouped_mm`
are unavailable or incompatible with `torch.compile` (e.g. non-bfloat16 weights).

Args:
    input (`torch.Tensor`): Input of shape (S, input_dim), sorted by expert id.
    weight (`torch.Tensor`): Expert weights of shape (num_experts, input_dim, output_dim).
    offs (`torch.Tensor`): Cumulative token counts per expert of shape (num_experts,).
Returns:
    `torch.Tensor`: Output of shape (S, output_dim).
r   r   ©Údevicer4   ©r   )r   Úzerosr"   rG   r4   Ú	enumerateÚtolistÚmm)r   r   ÚoffsÚoutputÚstartÚiÚends          r   Ú_grouped_mm_fallbackrR   ·   s�   € ô �[Š[˜Ÿ™ A›¨¯©°A«¸u¿|¹|ÐSX×S^ÑS^Ñ_€Fà€Eô ˜DŸK™K›MÖ*‰ˆØ‹<ÙÜ�Š�˜SÐ! 6¡9°&¸sÐ2CÒDØŠñ	 +ð €Mr   c                óz  • U R                  5       S:X  d   S[        U R                  5       35       eUR                  5       S:X  d   S[        UR                  5       35       eUR                  5       S:X  d   S[        UR                  5       35       eUR                  S5      UR                  S5      :X  d+   SUR                  S5       S	UR                  S5       35       eU R                  S5      UR                  S5      :X  d+   S
U R                  S5       SUR                  S5       35       eUR                  [
        R                  [
        R                  4;   d   SUR                   35       e[
        R                  " U R                  S5      UR                  S5      U R                  U R                  S9$ )zRShape/dtype inference stub for `_grouped_mm_fallback` required by `torch.compile`.r   z+input must be 2D (S, input_dim), got shape é   zBweight must be 3D (num_experts, input_dim, output_dim), got shape r   z*offs must be 1D (num_experts,), got shape r   zoffs length z must match number of experts zinput_dim mismatch: input has z, weight has z$offs must be an integer tensor, got rF   )
r    ÚtupleÚshaper"   r4   r   Úint32Úint64ÚemptyrG   ©r   r   rM   s      r   Ú_grouped_mm_fallback_faker[   Ñ   s�  € à�9‰9‹;˜!ÓÐ_ÐJÌ5ÐQV×Q\ÑQ\ÓK]ÐJ^Ð_Ó_ÐØ�:‰:‹<˜1Óð Ø
LÌUÐSY×S_ÑS_ÓM`ÐLaÐbóÐð �8‰8‹:˜‹?Ð\ÐHÌÈtÏzÉzÓIZÐH[Ð\Ó\ˆ?Ø�9‰9�Q‹<˜6Ÿ;™; q›>Ó)Ðv¨\¸$¿)¹)ÀA»,¸ÐGeÐfl×fqÑfqÐrsÓftÐeuÐ+vÓvÐ)Ø�:‰:�a‹=˜FŸK™K¨›NÓ*ð Ø
(¨¯©°A«¨°}ÀVÇ[Á[ÐQRÃ^ÐDTÐUóÐ*ð �:‰:œ%Ÿ+™+¤u§{¡{Ð3Ó3ÐhÐ7[Ð\`×\fÑ\fÐ[gÐ5hÓhÐ3Ü�;Š;�u—z‘z !“} f§k¡k°!£n¸U¿\¹\ÐQV×Q\ÑQ\Ñ]Ð]r   c                óH   • U R                  US   US   5        US   U l        g)zjSaves input and weight for backward; offs is stored directly as it is a non-differentiable integer tensor.r   r   r   N)Úsave_for_backwardrM   )ÚctxÚinputsrN   s      r   Ú"_grouped_mm_fallback_setup_contextr`   à   s%   € à×Ñ˜& ™) V¨A¡YÔ/Ø�a‰y€C…Hr   c                ó„  • U R                   u  p#[        R                  " U5      n[        R                  " U5      nSn[        U R                  R                  5       5       HZ  u  pxXh:X  a  M  [        R                  " XU X7   R                  XFU S9  [        R                  " X&U R                  XU XW   S9  UnM\     XES4$ )zuBackward pass for `_grouped_mm_fallback`. Computes grad_input and grad_weight per expert group; offs has no gradient.r   rH   N)Úsaved_tensorsr   Ú
zeros_likerJ   rM   rK   rL   ÚT)	r^   Úgrad_outputr   r   Ú
grad_inputÚgrad_weightrO   rP   rQ   s	            r   Ú_grouped_mm_fallback_backwardrh   æ   s®   € à×%Ñ%�M€EÜ×!Ò! %Ó(€JÜ×"Ò" 6Ó*€Kà€Eô ˜CŸH™HŸO™OÓ-Ö.‰ˆØ‹<ÙÜ�Š� 3Ð'¨©¯©¸*È3Ð:OÒPÜ�Š�˜SÐ!×#Ñ# [°sÐ%;ÀÁÒPØŠñ /ð  DÐ(Ð(r   z!transformers::grouped_mm_fallback© )Úmutates_args)Úsetup_contextc                óZ  • [        5       (       a  UR                  [        R                  :w  dW  UR                  R
                  S:X  a>  [        SSS9(       a/  UR                  5       S-  S:w  d  U R                  5       S-  S:w  a  gUR                  R
                  S:X  aÒ  [        [        R                  R                  S	5      (       a,  [        R                  R                  UR                  5      S
:¬  $ [        [        S5      (       ag  [        SSS9(       a,  [        R                  R                  UR                  5      S
:¬  $ [        R                  R                  UR                  5      S:¬  $ g[        [        R                  R                  S	5      =(       d    [        [        S5      $ )aî  
Check if torch.nn.functional.grouped_mm or torch._grouped_mm can be used based on availability and compatibility with torch.compile.

Args:
    input (`torch.Tensor`):
        Input tensor of shape (S, input_dim).
    weight (`torch.Tensor`):
        Weight tensor of shape (num_experts, input_dim, output_dim).
    offs (`torch.Tensor`):
        Offsets tensor indicating the boundaries of each group in the input tensor.
Returns:
    `bool`: True if grouped_mm can be used, False otherwise.
Úcpuz2.10.0T)Ú
accept_devé   r   FÚcudaÚ
grouped_mm)é   r   Ú_grouped_mmz2.9)é	   r   )r   r4   r   Úbfloat16rG   Útyper   Údata_ptrÚhasattrÚnnÚ
functionalrp   Úget_device_capabilityr
   rZ   s      r   Ú_can_use_grouped_mmr|     s&  € ô 	!×"Ñ" v§|¡|´u·~±~Ó'EØ�‰×Ñ˜eÓ#ä" 8¸×=Ø�_‰_Ó Ñ# qÓ(¨E¯N©NÓ,<¸rÑ,AÀQÓ,Fð ð
 ‡}�}×Ñ˜VÓ#Ü”5—8‘8×&Ñ&¨×5Ñ5Ü—:‘:×3Ñ3°F·M±MÓBÀfÑLÐLÜ”5˜-×(Ñ(Ü(¨¸4×@Ü—z‘z×7Ñ7¸¿¹ÓFÈ&ÑPÐPä—z‘z×7Ñ7¸¿¹ÓFÈ&ÑPÐPàä”5—8‘8×&Ñ&¨Ó5×V¼ÄÈÓ9VÐVr   c                óÎ  • [        XU5      (       a­  [        [        R                  R                  S5      (       aA  [        R                  R                  R                  U R                  UR                  5      XS9$ [        [        S5      (       a.  [        R                  " U R                  UR                  5      XS9$ [        R                  R                  R                  XUS9$ )aí  Grouped matrix multiplication dispatcher that uses torch.nn.functional.grouped_mm if available, else falls back to torch._grouped_mm.

Args:
    input (`torch.Tensor`):
        Input tensor of shape (S, input_dim).
    weight (`torch.Tensor`):
        Weight tensor of shape (num_experts, input_dim, output_dim).
    offs (`torch.Tensor`):
        Offsets tensor indicating the boundaries of each group in the input tensor.
Returns:
    `torch.Tensor`: Output tensor of shape (S, output_dim).
rq   ©rM   rs   )r|   rx   r   ry   rz   rq   r3   r4   rs   ÚopsÚtransformersÚgrouped_mm_fallbackrZ   s      r   rs   rs   0  s¤   € ô$ ˜5¨$×/Ñ/ô
 ”5—8‘8×&Ñ&¨×5Ñ5Ü—8‘8×&Ñ&×1Ñ1°%·(±(¸6¿<¹<Ó2HÈ&Ð1Ð\Ð\Ü”U˜M×*Ñ*Ü×$Ò$ U§X¡X¨f¯l©lÓ%;¸VÑOÐOä�9‰9×!Ñ!×5Ñ5°eÈ$Ð5ÐOÐOr   c                ó†   • U(       a  [        XUS9nO[        XR                  SS5      US9nUb  UR                  U5        U$ )aÜ  Grouped linear layer supporting optional bias and transposed weights.

Args:
    input (`torch.Tensor`):
        Input tensor of shape (S, input_dim).
    weight (`torch.Tensor`):
        Weight tensor of shape (num_experts, input_dim, output_dim) if `is_transposed`,
        else of shape (num_experts, output_dim, input_dim).
    offs (`torch.Tensor`):
        Offsets tensor indicating the boundaries of each group in the input tensor.
    bias (`torch.Tensor`, *optional*):
        Bias tensor of shape (num_experts, output_dim). Default is `None`.
    is_transposed (`bool`, *optional*, defaults to `False`):
        Whether the weight tensor is transposed.
Returns:
    `torch.Tensor`: Output tensor of shape (S, output_dim).
r~   éþÿÿÿr   )rs   Ú	transposer   )r   r   rM   r   r   r   s         r   Ú_grouped_linearr…   O  sD   € ö0 ä˜%¨dÑ3‰ô ˜%×!1Ñ!1°"°bÓ!9ÀÑEˆàÑà�‰�Œà€Jr   c                óâ  • UR                   nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      n	[        R                  " U	5      u  p«XU-     nX‹   nUR
                  S;   a  U
R                  5       OU
R                  5       n[        R                  " XàR                  SU R                  S-
  S9n[        R                  " US[        R                  S9nX R                  :¬  R                  S5      nU
R                  U R                  S-
  S9  U R                  (       a/  U R                  nU R                   (       a  U R"                  U
   OS nO.U R$                  nU R                   (       a  U R&                  U
   OS nUR)                  US5        [+        UUUUU R,                  S	9nU R                  (       a  U R/                  U5      nOU R1                  U5      nU R2                  nU R                   (       a  U R4                  U
   OS n[+        UUUUU R,                  S	9nUUR                  S5      -  nUR)                  US5        [        R6                  " U5      n[        R8                  " UR                  S5      US
9UU'   UU   nUR;                  XeU5      R=                  SS9nUR?                  UR@                  5      $ )Nr   r   )rm   Úmpsr   )ÚbinsÚminÚmax)r    r4   )rŠ   g        r!   )rG   r   )!rG   r"   r$   r   Úsortrv   ÚfloatÚintÚhistcr&   ÚcumsumrW   r   r%   r'   r(   r)   r*   r+   r,   Úmasked_fill_r…   r   r-   r.   r/   r0   Ú
empty_likeÚaranger1   r2   r3   r4   )r5   r6   r7   r8   rG   r9   r:   r;   r=   r>   Úexpert_ids_gÚpermÚselected_hidden_states_gÚsample_weights_gÚhistc_inputÚtokens_per_expertÚoffsetsÚsentinel_maskr?   r@   rA   rB   Úinv_permrC   s                           r   Úgrouped_mm_experts_forwardrœ   u  s°  € ð ×!Ñ!€FØ× Ñ  Ó$€IØ×#Ñ# AÓ&€JØ×#Ñ# BÓ'€Jð #×*Ñ*¨2Ó.€NØ×$Ñ$ RÓ(€Jô Ÿš JÓ/Ñ€LØ,°YÑ->Ñ?ÐØ%Ñ+Ðð +1¯+©+¸Ó*G�,×$Ñ$Ô&È\×M]ÑM]ÓM_€KÜŸš K×6FÑ6FÈAÐSW×ScÑScÐfgÑSgÑhÐÜ�lŠlÐ,°!¼5¿;¹;ÑG€Gð" "×%5Ñ%5Ñ5×@Ñ@ÀÓD€MØ×Ñ˜D×,Ñ,¨qÑ0ÐÑ1ð ‡}‡}Ø×,Ñ,ÐØBFÇ-Ç-˜$×0Ñ0°Ò>ÐUY‰àŸ<™<ÐØ=A¿]¿]˜$×+Ñ+¨LÒ9ÐPTˆð ×)Ñ)¨-¸Ô=ô Ø Ð"2°GÀ/Ðae×asÑasñ€Hð
 ‡}‡}à×#Ñ# HÓ-‰ð —;‘;˜xÓ(ˆð —~‘~ÐØ;?¿=¿=�d×)Ñ)¨,Ò7Èd€Oô ØÐ" G°/ÐQU×QcÑQcñ€Hð
 Ð.×8Ñ8¸Ó<Ñ<€Lð ×Ñ˜m¨SÔ1ô ×Ò Ó%€HÜ—\’\ $§)¡)¨A£,°vÑ>€HˆT�NØ Ñ)€Lð '×+Ñ+¨JÀ:ÓN×RÑRÐWXÐRÐYÐà×!Ñ! -×"5Ñ"5Ó6Ð6r   c                  ó<   ^ • \ rS rSrSr\\\S.rSU 4S jjr	Sr
U =r$ )ÚExpertsInterfaceiÝ  z;Interface for registering custom experts forward functions.)Ú
batched_mmrq   Úsonicmoec                óˆ   >• Uc  [         R                  S5        OUS:w  a  X;  a  [        SU S35      e[        TU ]  X5      $ )zfReturn the requested `experts_implementation`. Also strictly check its validity, and raise if invalid.a
  You tried to access the `ExpertsInterface` with a `config._experts_implementation` set to `None`. This is expected if you use an Expert Module as a standalone Module. If this is not the case, something went wrong with the dispatch of `config._experts_implementation`ÚeagerÚ`zL` is not a valid experts implementation registered in the `ExpertsInterface`)ÚloggerÚwarning_onceÚKeyErrorÚsuperÚget)r5   Úexperts_implementationÚdefaultÚ	__class__s      €r   Úget_interfaceÚExpertsInterface.get_interfaceæ  s[   ø€ à!Ñ)Ü×ÑðNõð
 $ wÓ.Ð3IÓ3UÜØÐ*Ð+Ð+wÐxóð ô ‰w‰{Ð1Ó;Ð;r   ri   )r©   Ústrrª   r   Úreturnr   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rD   rœ   r   Ú_global_mappingr¬   Ú__static_attributes__Ú__classcell__)r«   s   @r   rž   rž   Ý  s"   ø† ÙEð 1Ø0Ø,ñ€O÷<õ <r   rž   c                óN   • UR                  SSS9u  p#U R                  U5      U-  $ )a{  
Default gating mechanism: splits the gate_up_out into gate and up parts,
applies the activation function to the gate part, and multiplies it with the up part.
Args:
    gate_up_out (`torch.Tensor`):
        The output tensor from the gate and up projection of shape (S, 2 * intermediate_dim).
Returns:
    `torch.Tensor`: The gated output tensor of shape (S, intermediate_dim).
r   r   r   )Úchunkr.   )r5   Úgate_up_outÚgateÚups       r   Ú_default_apply_gater½   ø  s/   € ð × Ñ  ¨Ð Ð+�H€DØ�;‰;�tÓ˜rÑ!Ð!r   T)Úexperts_interfaceÚis_concatenatedr   r)   r'   c               ó>   ^^^^^• SUUUUU4S jjnU b  U" U 5      $ U$ )a\  Decorator to modify experts class to support different experts implementations.

Args:
    experts_class (`type[torch.nn.Module]`, *optional*):
        The experts class to modify. If not provided, returns a decorator that can be applied to the class.
    experts_interface (`ExpertsInterface`, *optional*, defaults to `ALL_EXPERTS_FUNCTIONS`):
        The experts interface to use for dispatching the forward method.
    is_concatenated (`bool`, *optional*, defaults to `True`):
        Whether the expert weights are stored in concatenated layout [gate;up]
        or interleaved layout [gate0, up0, gate1, up1, ...].
    is_transposed (`bool`, *optional*, defaults to `False`):
        Whether the expert weights are stored in transposed format.
    has_bias (`bool`, *optional*, defaults to `False`):
        Whether the expert layers include bias terms or not.
    has_gate (`bool`, *optional*, defaults to `True`):
        Whether the experts use a gating mechanism or not.
        Whether it has gate_up_proj weights or just up_proj weights.

Returns:
    `type[torch.nn.Module]`: The modified experts class.
c                óæ   >^^• U R                   mU R                  m[        T5      UUUU	U4S j5       n[        T5      UU4S j5       n[        U S5      (       d  [        U l        Xl         X l        U $ )Nc                ób   >• T" X/UQ70 UD6  Xl         TU l        TU l        TU l        TU l        g ©N)Úconfigr'   r)   r   r¿   )	r5   rÄ   ÚargsÚkwargsr)   r'   r¿   r   Úoriginal_inits	       €€€€€r   Ú__init__Ú=use_experts_implementation.<locals>.wrapper.<locals>.__init__)  s8   ø€ á˜$Ð8¨Ò8°Ò8Ø ŒKØ$ˆDŒMØ$ˆDŒMØ!.ˆDÔØ#2ˆDÕ r   c                óh   >• TR                  U R                  R                  T5      nU" U /UQ70 UD6$ rÃ   )r¬   rÄ   Ú_experts_implementation)r5   rÅ   rÆ   Úexperts_forwardr¾   Úoriginal_forwards       €€r   ÚforwardÚ<use_experts_implementation.<locals>.wrapper.<locals>.forward2  s5   ø€ à/×=Ñ=¸d¿k¹k×>aÑ>aÐcsÓtˆOÙ" 4Ð9¨$Ò9°&Ñ9Ð9r   r-   )rÈ   rÎ   r   rx   r½   r-   )
Úexperts_classrÈ   rÎ   rÍ   rÇ   r¾   r)   r'   r¿   r   s
      @@€€€€€r   ÚwrapperÚ+use_experts_implementation.<locals>.wrapper%  sy   ú€ Ø%×.Ñ.ˆØ(×0Ñ0Ðä	ˆ}Ó	÷	3ð 	3ó 
ð	3ô 
ÐÓ	 õ	:ó 
!ð	:ô �} m×4Ñ4Ü(;ˆMÔ%à!)ÔØ 'ÔØÐr   )rÐ   útype[torch.nn.Module]r¯   rÓ   ri   )rÐ   r¾   r¿   r   r)   r'   rÑ   s    ````` r   Úuse_experts_implementationrÔ     s%   ü€ ÷>ó ð2 Ñ Ù�}Ó%Ð%à€Nr   )NF)
r   útorch.Tensorr   rÕ   r   útorch.Tensor | Noner   Úboolr¯   rÕ   )
r5   ztorch.nn.Moduler6   rÕ   r7   rÕ   r8   rÕ   r¯   rÕ   )r   rÕ   r   rÕ   rM   rÕ   r¯   rÕ   )r   rÕ   r   rÕ   rM   rÕ   r¯   r×   )r   rÕ   r   rÕ   rM   rÕ   r   rÖ   r   r×   r¯   rÕ   )rº   rÕ   r¯   rÕ   rÃ   )rÐ   ztype[torch.nn.Module] | Noner¾   rž   r¿   r×   r   r×   r)   r×   r'   r×   r¯   rÓ   ))Ú
__future__r   Úcollections.abcr   Ú	functoolsr   Úutilsr   Úutils.genericr   Úutils.import_utilsr	   r
   r   r   r    r   r   Ú_dynamoÚassume_constant_resultÚ
get_loggerr°   r¤   r   rD   rR   r[   r`   rh   ÚlibraryÚ	custom_opÚregister_fakeÚregister_autogradr|   rs   r…   rœ   rž   ÚALL_EXPERTS_FUNCTIONSr½   rÔ   ri   r   r   Ú<module>ræ      sŽ  ðõ #å $Ý å Ý ,÷ó õ /ñ ×ÑÛð
 !&§¡× DÑ DÐE^Ó _ÐØ"Ÿ]™]×AÑAÐBXÓYÐð 
×	Ò	˜HÓ	%€ð\ !%Øð	Øðàðð ðð ð	ð
 õðD<7Ø
ð<7àð<7ð ð<7ð  ð	<7ð
 ô<7ôDô4^òò)ñ& ×ÑØ	‡M�M×ÑÐ?ÐAUÐdfÐÑgØ	‡M�M×ÑÐ CÐE^Ô_Ø	‡M�M×#Ñ#Ø+Ø%Ø8ð $ñ ô*WðZPØðPàðPð ðPð ô	PðF !%Øð#Øð#àð#ð ð#ð ð	#ð
 ð#ð õ#ðLe7Ø
ðe7àðe7ð ðe7ð  ð	e7ð
 ôe7ôP<Ð'ô <ñ0 )Ó*Ð ô"ð 37ð;ð +@Ø ØØØñ;Ø/ð;ð (ð;ð ð	;ð
 ð;ð ð;ð ð;ð ÷;r   