ó
    EñiAS  ã                  ó
  • S SK Jr  S SKrS SKJrJrJr  S SKrS SKJ	r	  SSK
JrJr  SSKJrJrJrJr  SSKJrJrJrJr  SS	KJrJrJrJrJrJr  SS
KJ r   \(       a  S SK!J"r"  SSKJ#r#  \RH                  " \%5      r&\RN                  RP                  r(\S 5       r)\S 5       r*Sr+ \" S\)S\+-   S-   \+-   S-   S9r,Sr-\" S\*S\--   S-   \--   S-   S9r.\" \R^                  SS\(R^                  R`                  S9r1S r2\" \2S5      r3 " S S\5      r4                    S&S  jr5S! r6S" r7\" \(R^                  5                        S'S# j5       r/\" \(Rp                  5      S$ 5       r8S% r9\" \(R^                  \95        g)(é    )ÚannotationsN)ÚOptionalÚTYPE_CHECKINGÚ	TypedDict)ÚCKGroupedConvFwdTemplateé   )ÚconfigÚir)Úadd_layout_constraintÚconstrain_to_fx_stridesÚ	loweringsÚregister_lowering)Úautotune_select_algorithmÚExternKernelChoiceÚSymbolicGridFnÚTritonTemplate)Úis_onesÚis_zerosÚpad_listlikeÚsympy_productÚuse_ck_conv_templateÚuse_triton_template)ÚV)ÚSequence)Ú	TensorBoxc               óB   • U" X-  U-  US   5      U" XS   5      US   4$ ©NÚBLOCK_MÚBLOCK_NÚGROUPS© )ÚnÚcÚhÚwÚmetaÚcdivs         ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/kernel/conv.pyÚconv2d_gridr)   -   s5   € ñ 	ˆQ‰U�Q‰Y˜˜Y™Ó(ÙˆQ�Y‘Ó ØˆX‰ðð ó    c               óH   • U" X-  U-  U-  US   5      U" XS   5      US   4$ r   r!   )r"   r#   Údr$   r%   r&   r'   s          r(   Úconv3d_gridr-   6   s9   € ñ 	ˆQ‰U�Q‰Y˜‰]˜D ™OÓ,ÙˆQ�Y‘Ó ØˆX‰ðð r*   aÓ  
        idx_x_h = i - PADDING_H + idx_y_h * STRIDE_H
        idx_x_w = j - PADDING_W + idx_y_w * STRIDE_W
        idx_x_c = tl.arange(0, BLOCK_K) + k

        x_ptrs = x_base + (
            (idx_x_h * stride_xh)[:, None]
            + (idx_x_w * stride_xw)[:, None]
            + (idx_x_c * stride_xc)[None, :]
        )
        mask_x = (
            (idx_n < BATCH)[:, None]
            & (idx_x_h >= 0)[:, None]
            & (idx_x_h < IN_H)[:, None]
            & (idx_x_w >= 0)[:, None]
            & (idx_x_w < IN_W)[:, None]
            & (idx_x_c < GROUP_IN_C)[None, :]
        )
        matrix_x = tl.load(x_ptrs, mask=mask_x, other=0.0)

        w_ptrs = w_base + (
            (idx_x_c * stride_wc_in)[:, None] + (i * stride_wh) + (j * stride_ww)
        )
        mask_w = (idx_x_c[:, None] < GROUP_IN_C) & (idx_y_c[None, :] < GROUP_OUT_C)
        matrix_w = tl.load(w_ptrs, mask=mask_w, other=0.0)
        acc += tl.dot(matrix_x, matrix_w, allow_tf32=ALLOW_TF32)
Úconvolution2da—  
{{def_kernel("X", "W")}}
    # Tensor dimensions
    BATCH = {{size("X", 0)}}
    IN_C = {{size("X", 1)}}
    IN_H = {{size("X", 2)}}
    IN_W = {{size("X", 3)}}
    OUT_C = {{size(None, 1)}}
    OUT_H = {{size(None, 2)}}
    OUT_W = {{size(None, 3)}}

    # Strides:
    stride_xn = {{stride("X", 0)}}
    stride_xc = {{stride("X", 1)}}
    stride_xh = {{stride("X", 2)}}
    stride_xw = {{stride("X", 3)}}
    stride_wc_out = {{stride("W", 0)}}
    stride_wc_in = {{stride("W", 1)}}
    stride_wh = {{stride("W", 2)}}
    stride_ww = {{stride("W", 3)}}

    nhw = tl.program_id(0).to(INDEX_DTYPE) * BLOCK_M + tl.arange(0, BLOCK_M)
    idx_y_w = nhw % OUT_W
    nh = nhw // OUT_W
    idx_y_h = nh % OUT_H
    idx_n = nh // OUT_H
    idx_y_c = tl.program_id(1).to(INDEX_DTYPE) * BLOCK_N + tl.arange(0, BLOCK_N)

{% if GROUPS == 1 %}
    group = 0
    GROUP_IN_C = IN_C
    GROUP_OUT_C = OUT_C
{% else %}
    group = tl.program_id(2).to(INDEX_DTYPE)
    GROUP_IN_C = IN_C // GROUPS
    GROUP_OUT_C = OUT_C // GROUPS
{% endif %}

    x_base = X + (group * stride_xc * GROUP_IN_C + idx_n * stride_xn)[:, None]
    w_base = (
        W + (group * stride_wc_out * GROUP_OUT_C + idx_y_c * stride_wc_out)[None, :]
    )

    acc = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)

{% if UNROLL %}
{% for i in range(KERNEL_H) %}
{% for j in range(KERNEL_W) %}
    i = {{i}}
    j = {{j}}
    for k in range(0, GROUP_IN_C, BLOCK_K):
        aÐ  
{% endfor %}
{% endfor %}
{% else %}
    # Could be simplified, but slightly slower:
    # for i in range(KERNEL_H):
    #     for j in range(KERNEL_W):
    #         for k in range(0, GROUP_IN_C, BLOCK_K):
    BLOCK_K_COUNT = (GROUP_IN_C + BLOCK_K - 1) // BLOCK_K
    for ijk in range(KERNEL_H * KERNEL_W * BLOCK_K_COUNT):
        k = (ijk % BLOCK_K_COUNT) * BLOCK_K
        ij = ijk // BLOCK_K_COUNT
        i = ij // KERNEL_W
        j = ij % KERNEL_W
        aÎ  
{% endif %}

    mask = (
        (idx_n < BATCH)[:, None]
        & (idx_y_h < OUT_H)[:, None]
        & (idx_y_w < OUT_W)[:, None]
        & (idx_y_c < GROUP_OUT_C)[None, :]
    )
    idx_n = idx_n[:, None]
    idx_c = idx_y_c[None, :] + group * GROUP_OUT_C
    idx_h = idx_y_h[:, None]
    idx_w = idx_y_w[:, None]

    # inductor generates a suffix
    {{store_output(("idx_n", "idx_c", "idx_h", "idx_w"), "acc", "mask", val_shape=("BLOCK_M", "BLOCK_N"))}}
)ÚnameÚgridÚsourcea¡  
        idx_x_d = d - PADDING_D + idx_y_d * STRIDE_D
        idx_x_h = i - PADDING_H + idx_y_h * STRIDE_H
        idx_x_w = j - PADDING_W + idx_y_w * STRIDE_W
        idx_x_c = tl.arange(0, BLOCK_K) + k

        x_ptrs = x_base + (
            (idx_x_d * stride_xd)[:, None]
            + (idx_x_h * stride_xh)[:, None]
            + (idx_x_w * stride_xw)[:, None]
            + (idx_x_c * stride_xc)[None, :]
        )
        mask_x = (
            (idx_n < BATCH)[:, None]
            & (idx_x_d >= 0)[:, None]
            & (idx_x_d < IN_D)[:, None]
            & (idx_x_h >= 0)[:, None]
            & (idx_x_h < IN_H)[:, None]
            & (idx_x_w >= 0)[:, None]
            & (idx_x_w < IN_W)[:, None]
            & (idx_x_c < GROUP_IN_C)[None, :]
        )
        matrix_x = tl.load(x_ptrs, mask=mask_x, other=0.0)

        w_ptrs = w_base + (
            (idx_x_c * stride_wc_in)[:, None] +
            (d * stride_wd) + (i * stride_wh) + (j * stride_ww)
        )
        mask_w = (idx_x_c[:, None] < GROUP_IN_C) & (idx_y_c[None, :] < GROUP_OUT_C)
        matrix_w = tl.load(w_ptrs, mask=mask_w, other=0.0)
        acc += tl.dot(matrix_x, matrix_w, allow_tf32=ALLOW_TF32)
Úconvolution3dax  
{{def_kernel("X", "W")}}
    # Tensor dimensions
    BATCH = {{size("X", 0)}}
    IN_C = {{size("X", 1)}}
    IN_D = {{size("X", 2)}}
    IN_H = {{size("X", 3)}}
    IN_W = {{size("X", 4)}}
    OUT_C = {{size(None, 1)}}
    OUT_D = {{size(None, 2)}}
    OUT_H = {{size(None, 3)}}
    OUT_W = {{size(None, 4)}}

    # Strides:
    stride_xn = {{stride("X", 0)}}
    stride_xc = {{stride("X", 1)}}
    stride_xd = {{stride("X", 2)}}
    stride_xh = {{stride("X", 3)}}
    stride_xw = {{stride("X", 4)}}
    stride_wc_out = {{stride("W", 0)}}
    stride_wc_in = {{stride("W", 1)}}
    stride_wd = {{stride("W", 2)}}
    stride_wh = {{stride("W", 3)}}
    stride_ww = {{stride("W", 4)}}

    ndhw = tl.program_id(0).to(INDEX_DTYPE) * BLOCK_M + tl.arange(0, BLOCK_M)
    idx_y_w = ndhw % OUT_W
    ndh = ndhw // OUT_W
    idx_y_h = ndh % OUT_H
    nd = ndh // OUT_H
    idx_y_d = nd % OUT_D
    idx_n = nd // OUT_D
    idx_y_c = tl.program_id(1).to(INDEX_DTYPE) * BLOCK_N + tl.arange(0, BLOCK_N)

{% if GROUPS == 1 %}
    group = 0
    GROUP_IN_C = IN_C
    GROUP_OUT_C = OUT_C
{% else %}
    group = tl.program_id(2).to(INDEX_DTYPE)
    GROUP_IN_C = IN_C // GROUPS
    GROUP_OUT_C = OUT_C // GROUPS
{% endif %}

    x_base = X + (group * stride_xc * GROUP_IN_C + idx_n * stride_xn)[:, None]
    w_base = (
        W + (group * stride_wc_out * GROUP_OUT_C + idx_y_c * stride_wc_out)[None, :]
    )

    acc = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)

{% if UNROLL %}
{% for d in range(KERNEL_D) %}
{% for i in range(KERNEL_H) %}
{% for j in range(KERNEL_W) %}
    d = {{d}}
    i = {{i}}
    j = {{j}}
    for k in range(0, GROUP_IN_C, BLOCK_K):
        aF  
{% endfor %}
{% endfor %}
{% endfor %}
{% else %}
    # Could be simplified, but slightly slower:
    # for d in range(KERNEL_D):
    #   for i in range(KERNEL_H):
    #     for j in range(KERNEL_W):
    #         for k in range(0, GROUP_IN_C, BLOCK_K):
    BLOCK_K_COUNT = (GROUP_IN_C + BLOCK_K - 1) // BLOCK_K
    for dijk in range(KERNEL_D * KERNEL_H * KERNEL_W * BLOCK_K_COUNT):
        k = (dijk % BLOCK_K_COUNT) * BLOCK_K
        dij = dijk // BLOCK_K_COUNT
        j = dij % KERNEL_W
        di = dij // KERNEL_W
        i = di % KERNEL_H
        d = di // KERNEL_H
        a  
{% endif %}

    mask = (
        (idx_n < BATCH)[:, None]
        & (idx_y_d < OUT_D)[:, None]
        & (idx_y_h < OUT_H)[:, None]
        & (idx_y_w < OUT_W)[:, None]
        & (idx_y_c < GROUP_OUT_C)[None, :]
    )
    idx_n = idx_n[:, None]
    idx_c = idx_y_c[None, :] + group * GROUP_OUT_C
    idx_d = idx_y_d[:, None]
    idx_h = idx_y_h[:, None]
    idx_w = idx_y_w[:, None]

    # inductor generates a suffix
    {{store_output(("idx_n", "idx_c", "idx_d", "idx_h", "idx_w"), "acc", "mask", val_shape=("BLOCK_M", "BLOCK_N"))}}
zat::convolutionF)Úhas_out_variantÚop_overloadc          
     óî   • [         R                  " [         R                  " US5      S5      n[         R                  " U R                  SSSS5      UR                  SS5      UR                  SSSS5      S9$ )Néÿÿÿÿr   r   é   é   )Úout)ÚtorchÚsqueezeÚmatmulÚpermute)Úxr%   r9   s      r(   Úconv1x1_via_mmr?   M  s]   € Ü�Š”e—m’m A rÓ*¨BÓ/€AÜ�<Š<Ø	�	‰	�!�Q˜˜1Ó˜qŸy™y¨¨A›°C·K±KÀÀ1ÀaÈÓ4Kñð r*   c                  óR   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S	\S
'   Srg)ÚConvLayoutParamsiW  útuple[int, ...]ÚstrideÚpaddingÚdilationÚboolÚ
transposedÚoutput_paddingÚintÚgroupsr!   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r!   r*   r(   rA   rA   W  s%   ‡ ØÓØÓØÓØÓØ#Ó#Ø†Kr*   rA   c	                óp  • [         R                  R                     [        R                  R
                  R                  [        R                  " U SS9[        R                  " USS9[        R                  " USS9[         R                  R                  R                  U5      [         R                  R                  R                  U5      [         R                  R                  R                  U5      U[         R                  R                  R                  U5      U5	      n	[        R                  " U	R                  5       5      n
[        R                  " U	R                  5       5      nSSS5        [        R                  " U R                  5       U R!                  5       W
U5      $ ! , (       d  f       NC= f)z)Determine output layout for a convolutionT)Úguard_shapeN)r   ÚgraphÚ	fake_moder:   ÚopsÚatenÚconvolutionr
   Úir_node_to_tensorÚsizevarsÚ
size_hintsÚconvert_shape_to_inductorÚsizerC   ÚFixedLayoutÚget_device_or_errorÚ	get_dtype)r>   ÚweightÚbiasrC   rD   rE   rG   rH   rJ   ÚoutputÚsizess              r(   Úconv_layoutrd   `  s)  € ô 
�‰×	Ó	Ü—‘—‘×+Ñ+Ü× Ò  °Ñ5Ü× Ò  °TÑ:Ü× Ò  °4Ñ8Ü�G‰G×Ñ×'Ñ'¨Ó/Ü�G‰G×Ñ×'Ñ'¨Ó0Ü�G‰G×Ñ×'Ñ'¨Ó1ØÜ�G‰G×Ñ×'Ñ'¨Ó7Øó

ˆô ×,Ò,¨V¯[©[«]Ó;ˆÜ×-Ò-¨f¯m©m«oÓ>ˆ÷ 
ô �>Š>Ø	×ÑÓØ	�‰‹ØØó	ð ÷ 
Õ	ús   ›EF'Æ'
F5c                ó‚   • [        [        [        U 5      5      5      nUR                  SUR	                  S5      5        U$ )Nr8   r6   )ÚlistÚreversedÚrangeÚinsertÚpop)ÚrankÚorders     r(   Úchannels_last_orderrm   ƒ  s0   € Ü”œ% ›+Ó&Ó'€EØ	‡L�L��E—I‘I˜b“MÔ"Ø€Lr*   c                ó¦  • [        UR                  5       5      n[        US-
  5       H  n[        [        R
                     " USS9nM!     [        [        R                     " USS/5      n[        R                  R                  U [        U5      5      n [        [        U5      5      nUR                  UR                  S5      5        [        [        R                     " X5      n U R                  5       Gt pg[        [        R                     " U [        U5      U/5      n Uc  [        [        R                      " X5      nO[        [        R"                     " X U5      n[        [        R                     " U/ UQSP5      n[        [        U5      5      n	U	R%                  SU	R                  S5      5        [        [        R                     " X‰5      $ )Nr   r6   ©Údimr8   r   )ÚlenÚget_sizerh   ÚLrV   r;   r=   r
   ÚExternKernelÚrequire_stride_orderrm   rf   Úappendrj   Úreshaper   ÚmmÚaddmmri   )
r>   r`   ra   rk   Ú_Ú	x_permuterc   Úin_chanÚresultÚresult_permutes
             r(   Úconvert_1x1_conv_to_mmr   ‰  sR  € äˆv�‰Ó Ó!€DÜ�4˜!‘8Ž_ˆÜ”4—<‘<’ ¨RÑ0Šñ äŒt�|‰|Š_˜V a¨ VÓ,€Fä
�‰×,Ñ,¨QÔ0CÀDÓ0IÓJ€AÜ”U˜4“[Ó!€IØ×Ñ�Y—]‘] 1Ó%Ô&Ü	Œ$�,‰,Š˜Ó%€AØ—j‘j“l�O€UÜ	Œ$�,‰,Š˜œM¨%Ó0°'Ð:Ó;€AØ�|Ü”4—7‘7’˜AÓ&‰ä”4—:‘:’˜t¨Ó/ˆÜŒt�|‰|Š_˜V \ u \¨b \Ó2€FÜœ% ›+Ó&€NØ×Ñ˜!˜^×/Ñ/°Ó3Ô4ÜŒT�\‰\Š?˜6Ó2Ð2r*   c	                ó¦  ^ ^^^• [        U5      n[        U5      n[        U5      n[        U5      n[        U[        5      (       d)  [        R                  R
                  R                  U5      n[        U[        5      (       d   e[        [        R                  R
                  R                  U5      5      n[        [        R                  R
                  R                  U5      5      nUUUUUUS.m[        R                  " T 5      n	[        T R                  5       5      [        TR                  5       5      S-
  :X  aU  [        [        R                     " [        [        [        R                      " T S/T R                  5       Q5      TU40 TD6SS9$ [        R                  R
                  R                  TR                  5       5      tp«n[        T R                  5       5      S:X  a—  [        U5      S:X  aˆ  U	S:X  a‚  TR#                  SU-   SU-   SU-   SU-   S	.5        [        [        R$                     " T S
S9m [        [        R$                     " TS
S9m[        [        R                     " [        T TU40 TD6S
S9$ [        U5      m['        UT5      n['        UT5      n['        UT5      n['        UT5      nUUUU 4S jn[(        R*                  =(       d    [(        R,                  n[(        R.                  (       d  U(       a¼  U" 5       (       a°  [1        U5      (       a   [1        U5      (       a�  [3        U5      (       a€  [1        U5      (       ap  U(       di  [3        U5      (       aY  US:X  aS  [        R                  R
                  R5                  [7        T R                  5       5      S5      (       a  [9        T TU5      $ Ubf  U	S:w  a`  [        T TS 40 TD6n[        [        R:                     " U[        [        R<                     " X/R                  5       S   /TS/-  -   5      5      $ T R?                  5         TR?                  5         [        R                  R@                  (       av  TS
:X  ap  [        R                  =RB                  S-  sl!        [        RD                  RG                  T 5      m [        RD                  RG                  T5      m[I        T TS 40 TD6nO•[I        T TS 40 TD6n[        RJ                  " [        R                  R
                  RM                  URN                  5      5      n[        RD                  RQ                  T U5      m [        RD                  RQ                  TU5      m/ SQnUc  T T/nS TS'   URS                  SS5        O\T TU/nUR?                  5         URU                  5         [        R                  R
                  R                  UR                  5       5        / n[V        RX                  RZ                  R]                  S5      (       a  [^        R`                  " UUU40 TD6/n[V        RX                  RZ                  R]                  S5      (       Ga—  [c        U5      (       Ga†  [1        U5      (       Gau  U(       Gdm  [3        U5      (       Ga\  [        R                  R
                  Re                  X¸-  T R                  5       S   5      (       Ga  [1        U5      (       aK  [1        U5      (       a;  [3        U5      (       a+  US:X  a%  URg                  [h        Ra                  UU5      5        [        Rj                  Rm                  U	5      nT Ro                  5       Rp                  nU" [7        T R                  5       S   /T R                  5       S
S  Q5      U
UUS9 GHI  nTS
:X  a‡  [r        Rt                  " U4T T4UUS   US   US   US   US   US   U[1        U5      [V        Rv                  Rx                  Rz                  S:H  UR|                  UR~                  S.UR€                  D6  M‘  TS:X  d  M™  [‚        Rt                  " U40 ST T4_SU_SUS   _SUS   _SUS
   _SUS   _SUS   _SUS
   _SUS   _SUS   _SUS
   _SU_S[1        U5      _S [V        Rv                  Rx                  Rz                  S:H  _S!UR|                  _S"UR~                  _UR€                  D6  GML     […        U5      (       a.  [†        Rˆ                  " UUT T4Ub  U4O	[        5       -   UUUUTS#9  [‹        S$UUU5      $ )%N)rC   rD   rE   rG   rH   rJ   r8   r   ro   r7   Úxpu)r8   )r   )rC   rD   rE   rH   r   c                 ó   >• [         R                  R                  (       a  TS:X  a  g[        TTS 40 TD6n [        R
                  " [         R                  R                  R                  U R                  5      5      nU[        R                  :H  $ )Nr   T)
r   rS   Ú
layout_optrd   r
   Úget_stride_orderrY   rZ   rC   ÚNHWC_STRIDE_ORDER)ÚlayoutÚreq_stride_orderÚkwargsÚndimr`   r>   s     €€€€r(   Úchannels_last_convÚ'convolution.<locals>.channels_last_convì  sl   ø€ Ü�7‰7×× $¨!£)Øä˜Q ¨Ñ7°Ñ7ˆÜ×.Ò.Ü�G‰G×Ñ×'Ñ'¨¯©Ó6ó
Ðð  ¤2×#7Ñ#7Ñ7Ð7r*   Úcpura   ÚATENÚTRITON)Ú
dtype_sizeÚtf32)Úinput_nodesr†   ÚKERNEL_HÚKERNEL_WÚSTRIDE_HÚSTRIDE_WÚ	PADDING_HÚ	PADDING_Wr    ÚUNROLLÚ
ALLOW_TF32Ú
num_stagesÚ	num_warpsr‘   r†   ÚKERNEL_Dr’   r“   ÚSTRIDE_Dr”   r•   Ú	PADDING_Dr–   r—   r    r˜   r™   rš   r›   )r‘   rC   rD   rE   rJ   Ún_spatial_dimensionsrW   )FÚtupleÚ
isinstancerI   r   rS   rY   Ú	guard_intÚguard_int_seqr
   Úget_device_typerq   rr   rs   rV   r;   rW   ÚexpandÚupdateÚ	unsqueezer   r	   Úmax_autotuneÚmax_autotune_gemmÚconv_1x1_as_mmr   r   Ústatically_known_gtr   r   ÚaddÚviewÚrealizerƒ   Únum_channels_last_convrt   Úrequire_channels_lastrd   r„   rZ   rC   ru   ri   Úfreeze_layoutr:   Ú	_inductorÚutilsÚ_use_conv_autotune_backendÚaten_convolutionÚbindr   Ústatically_known_equalsrv   Úaten_conv1x1_via_mmÚchoicesÚget_conv_configsr_   ÚitemsizeÚconv2d_templateÚmaybe_append_choiceÚbackendsÚcudnnÚfp32_precisionrš   r›   rˆ   Úconv3d_templater   r   Úadd_ck_conv_choicesr   )r>   r`   ra   rC   rD   rE   rG   rH   rJ   Údevice_typeÚout_chanr|   Úkernel_shaperŠ   Úautotuning_gemmr}   r†   r‡   Úordered_kwargs_for_cpp_kernelÚargsr¹   Úconv_configsr�   Úcfgrˆ   r‰   s   ``                      @@r(   rW   rW      s  û€ ô �6‹]€FÜ�G‹n€GÜ�X‹€HÜ˜>Ó*€NÜ�fœc×"Ñ"Ü—‘×!Ñ!×+Ñ+¨FÓ3ˆÜ�fœc×"Ñ"Ð"Ð"ô ”1—7‘7×#Ñ#×1Ñ1°&Ó9Ó:€FÜ”A—G‘G×$Ñ$×2Ñ2°7Ó;Ó<€Gð ØØØ Ø(Øñ €Fô ×$Ò$ QÓ'€Kä
ˆ1�:‰:‹<ÓœC §¡Ó 1Ó2°QÑ6Ó6ä”—‘ŠÜœœ$Ÿ+™+š q¨1Ð*<¨q¯z©z«|Ð*<Ó=¸vÀtÑVÈvÑVØñ
ð 	
ô
 ()§w¡w×'7Ñ'7×'EÑ'EÀfÇoÁoÓFWÓ'XÐ$€H˜ô
 ˆ1�:‰:‹<Ó˜AÓ¤# lÓ"3°qÓ"8¸[ÈEÓ=QØ�‰à ™-Ø '™>Ø  8™OØ"&¨Ñ"7ñ	ô	
ô Œd�n‰nÒ˜a QÑ'ˆÜ”4—>‘>Ò" 6¨qÑ1ˆä”—‘ŠÜ˜˜6 4Ñ2¨6Ñ2Øñ
ð 	
ô
 ˆ|Ó€DÜ˜& $Ó'€FÜ˜7 DÓ)€GÜ˜H dÓ+€HÜ! .°$Ó7€N÷8ð 8ô ×)Ñ)×E¬V×-EÑ-E€Oô 
×	×	¦?Ñ7I×7KÑ7KÜ�L×!Ñ!Ü�F�O‰OÜ�W×ÑÜ�H×ÑÞÜ�^×$Ñ$Ø�a‹KÜ�G‰G×Ñ×0Ñ0´¸q¿z¹z»|Ó1LÈa×PÑPä% a¨°Ó6Ð6àÑ˜K¨5Ó0ä˜Q ¨Ñ7°Ñ7ˆÜ”—‘Š{Ø”A”d—i‘i’L ¯©Ó(9¸!Ñ(<Ð'=ÀÈÀsÁ
Ñ'JÓKó
ð 	
ð ‡I�I„KØ
‡N�NÔô
 	‡w�w××˜d a›iÜ	�‰×&Ò&¨!Ñ+Õ&Ü�O‰O×1Ñ1°!Ó4ˆô —‘×6Ñ6°vÓ>ˆÜ˜Q ¨Ñ7°Ñ7‰ä˜Q ¨Ñ7°Ñ7ˆÜ×.Ò.Ü�G‰G×Ñ×'Ñ'¨¯©Ó6ó
Ðô �O‰O×0Ñ0°Ð4DÓEˆÜ—‘×5Ñ5°fÐ>NÓOˆò%Ð!ð �|Ø�6ˆ{ˆØˆˆv‰Ø%×,Ñ,¨Q°Õ7à�6˜4Ð ˆØ�‰ŒØ×ÑÔÜ	�‰×Ñ×&Ñ& t§}¡}£Ô7à€GÜ‡�×Ñ×7Ñ7¸×?Ñ?ä×!Ò!ØØØ-ñð ñ	ð
ˆô 	�‰×Ñ×8Ñ8¸×BÒBÜ ×'Ò'ä�H×ÒßÜ�^×$Ò$ä�G‰G×Ñ×4Ñ4°WÑ5EÀqÇzÁzÃ|ÐTUÁ×WÒWô �L×!Ñ!Ü˜—‘Ü˜×!Ñ!Ø˜!“à�N‰NÔ.×3Ñ3°D¸&ÓAÔBä—y‘y×1Ñ1°+Ó>ˆà—[‘[“]×+Ñ+ˆ
ÙÜ˜1Ÿ:™:›<¨™?Ð>¨Q¯Z©Z«\¸!¸"Ð-=Ð>Ó?ØØØ!õ	
ˆCð �q‹yÜ×3Ò3Øðà!" F Ø!Ø)¨!™_Ø)¨!™_Ø# A™YØ# A™YØ% a™jØ% a™jØ!ô # <Ó0Ü$Ÿ~™~×3Ñ3×BÑBÀfÑLØ"Ÿ~™~Ø!Ÿm™mñ!ð" —j‘jô#ð& ˜•Ü×3Ò3Øòà!" F¡ðñ "ðð *¨!š_ð	ð
 *¨!š_ðð *¨!š_ðð $ AšYðð $ AšYðð $ AšYðð & ašjðð & ašjðð & ašjðñ "ðô  # <Ô0ð!ô"  %Ÿ~™~×3Ñ3×BÑBÀfÒLð#ð$  #Ÿ~š~ð%ð& "ŸmšmØ—j‘jõ)ñ7
ôb ˜F×#Ñ#Ü ×4Ò4ØØØ˜F˜°$Ñ2B¨¡wÌËÑPØØØØØ!%ò		
ô % ]°G¸TÀ6ÓJÐJr*   c                ó    • [        XX#XEXgU5	      $ ©N)rW   )r>   r`   ra   rC   rD   rE   rG   rH   rJ   Ú	benchmarkÚdeterministicÚcudnn_enabledÚ
allow_tf32s                r(   Ú_convolutionrÑ   ’  s   € ô  Ø	�4 °JÐPVóð r*   c                óÞ   • U R                   [        R                  R                  R                  R
                  L d   e[        R                  R                  (       a  X4$ [        U /UQ70 UD6$ rÌ   )
Útargetr:   rU   rV   rW   Údefaultr   rS   rƒ   r   )Úfx_noderÈ   rˆ   s      r(   Úconstrain_conv_to_fx_stridesrÖ   §  sR   € Ø�>‰>œUŸY™YŸ^™^×7Ñ7×?Ñ?Ò?Ð?Ð?Ü‡w�w××Øˆ|Ðä& wÐ@°Ò@¸Ñ@Ð@r*   )r>   r   r`   r   ra   úOptional[TensorBox]rC   úSequence[int]rD   rB   rE   rB   rG   rF   rH   rB   rJ   rI   Úreturnz	ir.Layout)r>   r   r`   r   ra   r×   rC   rØ   rD   rØ   rE   rØ   rG   rF   rH   rØ   rJ   rI   ):Ú
__future__r   ÚloggingÚtypingr   r   r   r:   Ú-torch._inductor.codegen.rocm.ck_conv_templater   Ú r	   r
   Úloweringr   r   r   rs   r   Úselect_algorithmr   r   r   r   r³   r   r   r   r   r   r   Úvirtualizedr   Úcollections.abcr   r   Ú	getLoggerrK   ÚlogrU   rV   r)   r-   ÚLOOP_BODY_2Dr¼   ÚLOOP_BODY_3DrÁ   rW   rÔ   rµ   r?   r¸   rA   rd   rm   r   rÑ   rÖ   r!   r*   r(   Ú<module>rç      sº  ðå "ã ß 5Ñ 5ã Ý Rç ÷ó ÷ó ÷÷ õ ö Ý(åà×Ò˜Ó!€ð ‡y�y‡~�~€ð ñó ðð ñó ðð€ð8ñ
 !Ø	Ø	ð3ðh ñi4ðjñkCðH ñIDðJñKUñY€ðv€ñB !Ø	Ø	ð;ðx ñy<ðzñ{Oð` ñaPðbñccñg€ñR &Ø	×ÑØØØ× Ñ ×(Ñ(ñ	Ð òñ )¨¸Ó>Ð ô�yô ð Øð àð ð ð ð ð	 ð
 ð ð ð ð ð ð $ð ð ð ð ô òFò3ñ. �4×#Ñ#Ó$ðnKØðnKàðnKð ðnKð ð	nKð
 ðnKð ðnKð ðnKð "ðnKð ónKó %ðnKñb �4×$Ñ$Ó%ñó &ðò(Añ �d×&Ñ&Ð(DÕ Er*   