Ë
    *êñi=M  ã                   óÞ  — d dl Z d dlZd dlmZ d dlZd dlmZ de j                  fd„Z	de j                  fd„Z
de j                  fd„Zdeddfd	„Zde j                  fd
„Zde j                  fd„Zde j                  fd„Zdee   fd„Z	 	 	 	 d dedededz  dedz  dedz  dedeeef   fd„Z G d„ d«      Z G d„ d«      Z	 d!deez  dee   dz  deeedf   z  fd„Z	 d"dedededefd„Zy)#é    N)ÚAny)Ú_get_device_indexÚreturnc                  óþ  — 	 dd l } t        j                  t        | j	                  d«      d   «      «      }|j                  |_        |j                  |_        |j                   |_        |j$                  |_        |j(                  |_        |S # t
        t        f$ r` t        j                  dk(  r5t        j                  dt        j                  j                  d   › d�«      }nt        j                  d«      }Y ŒÅw xY w)Nr   Úamdhip64Úwin32Ú	amdhip64_ú.dllzlibamdhip64.so)Úrocm_sdkÚctypesÚCDLLÚstrÚfind_librariesÚImportErrorÚ
IndexErrorÚsysÚplatformÚtorchÚversionÚhipÚhipGetErrorStringÚcuGetErrorStringÚhipModuleLoadDataÚcuModuleLoadDataÚhipModuleGetFunctionÚcuModuleGetFunctionÚhipModuleLaunchKernelÚcuLaunchKernelÚhipFuncSetAttributeÚcuFuncSetAttribute)r   Úlibs     úS/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/torch/cuda/_utils.pyÚ_get_hip_runtime_libraryr#      sÓ   € ð	0ãä�k‰kœ#˜h×5Ñ5°jÓAÀ!ÑDÓEÓFˆð ×0Ñ0€CÔØ×0Ñ0€CÔØ!×6Ñ6€CÔØ×2Ñ2€CÔØ ×4Ñ4€CÔØ€Jøô œÐ$ò 0Ü�<‰<˜7Ò"Ü—+‘+ 	¬%¯-©-×*;Ñ*;¸AÑ*>Ð)?¸tÐDÓE‰Cä—+‘+Ð.Ó/ˆCùð	0ús   ‚4B ÂA,C<Ã;C<c                  ó|   — t         j                  dk(  rt        j                  d«      S t        j                  d«      S )Nr   z
nvcuda.dllzlibcuda.so.1)r   r   r   r   © ó    r"   Ú_get_cuda_libraryr'   "   s,   € Ü
‡|�|�wÒÜ�{‰{˜<Ó(Ð(ä�{‰{˜>Ó*Ð*r&   c                  ó^   — t         j                  j                  r
t        «       S t	        «       S ©N)r   r   r   r#   r'   r%   r&   r"   Ú_get_gpu_runtime_libraryr*   *   s!   € Ü‡}�}×ÒÜ'Ó)Ð)ä Ó"Ð"r&   Úresultc                 ó   — | dk(  ry t        j                  «       }t        «       }|j                  | t        j                  |«      «       |j
                  �|j
                  j                  «       nd}t        d|› �«      ‚)Nr   úUnknown CUDA errorúCUDA error: )r   Úc_char_pr*   r   ÚbyrefÚvalueÚdecodeÚRuntimeError)r+   Úerr_strÚlibcudaÚerror_messages       r"   Ú_check_cudar7   2   sn   € Ø�‚{ØÜ�o‰oÓ€GÜ&Ó(€GØ×Ñ˜V¤V§\¡\°'Ó%:Ô;à")§-¡-Ð";ˆ�‰×ÑÔÐAUð ô ˜ m _Ð5Ó
6Ð6r&   c                  ó
  — 	 dd l } t        j                  t        | j	                  d«      d   «      «      }|j                  |_        |j                  |_        |j"                  |_        |j&                  |_        |j*                  |_        |j.                  |_        |j2                  |_        |j6                  |_        |j:                  |_        |j>                  |_         |S # t
        t        f$ r‘ t        j                  dk(  redj                  dt        j                  j                  d   dt        j                  j                  d   g«      }t        j                  d|› d�«      }nt        j                  d«      }Y �ŒKw xY w)	Nr   Úhiprtcr   Ú Ú0é   r
   zlibhiprtc.so)!r   r   r   r   r   r   r   r   r   Újoinr   r   r   ÚhiprtcGetErrorStringÚnvrtcGetErrorStringÚhiprtcCreateProgramÚnvrtcCreateProgramÚhiprtcDestroyProgramÚnvrtcDestroyProgramÚhiprtcCompileProgramÚnvrtcCompileProgramÚhiprtcGetCodeSizeÚnvrtcGetCUBINSizeÚhiprtcGetCodeÚnvrtcGetCUBINÚhiprtcGetProgramLogSizeÚnvrtcGetProgramLogSizeÚhiprtcGetProgramLogÚnvrtcGetProgramLogÚhiprtcAddNameExpressionÚnvrtcAddNameExpressionÚhiprtcGetLoweredNameÚnvrtcGetLoweredName)r   r!   Úversion_strs      r"   Ú_get_hiprtc_libraryrS   >   sB  € ð.ãä�k‰kœ#˜h×5Ñ5°hÓ?ÀÑBÓCÓDˆð "×6Ñ6€CÔØ ×4Ñ4€CÔØ!×6Ñ6€CÔØ!×6Ñ6€CÔØ×1Ñ1€CÔØ×)Ñ)€CÔØ!$×!<Ñ!<€CÔØ ×4Ñ4€CÔØ!$×!<Ñ!<€CÔØ!×6Ñ6€CÔØ€Jøô) œÐ$ò .Ü�<‰<˜7Ò"ØŸ'™'Ø”e—m‘m×'Ñ'¨Ñ*¨C´·±×1BÑ1BÀ1Ñ1EÐFóˆKô —+‘+  { m°4Ð8Ó9‰Cä—+‘+˜nÓ-ˆCúð.ús   ‚4C" Ã"BFÆFc                  ó   — t        t        j                  j                  j	                  d«      d   «      } t
        j                  dk(  rd| › d�g}nd| › �dg}|D ]  }	 t        j                  |«      c S  t        d«      ‚# t        $ r Y Œ2w xY w)	Nú.r   r   Únvrtc64_z0_0.dllzlibnvrtc.so.zlibnvrtc.soz Could not find any NVRTC library)
Úintr   r   ÚcudaÚsplitr   r   r   r   ÚOSError)Úmajor_versionÚ
nvrtc_libsÚlib_names      r"   Ú_get_nvrtc_libraryr^   [   s¢   € ÜœŸ™×*Ñ*×0Ñ0°Ó5°aÑ8Ó9€MÜ
‡|�|�wÒà�}�o WÐ-ð
‰
ð
 ˜=˜/Ð*Øð
ˆ
ð ò ˆð	Ü—;‘;˜xÓ(Ò(ðô
 Ð4Ó
5Ð5øô ò 	Ùð	ús   ÁBÂ	BÂBc                  ó^   — t         j                  j                  r
t        «       S t	        «       S r)   )r   r   r   rS   r^   r%   r&   r"   Ú_get_gpu_rtc_libraryr`   n   s#   € ô ‡}�}×ÒÜ"Ó$Ð$ä!Ó#Ð#r&   c                  ó¤   — ddl m} m} dh}|D �cg c]	  }||vsŒ|‘Œ }}t        j                  j
                  r|j                  | «       |S c c}w )z�
    Get HIPCC/NVCC flags that are compatible with NVRTC compilation.

    Returns:
        List of HIPCC/NVCC flags that can be safely used with NVRTC.
    r   )ÚCOMMON_HIPCC_FLAGSÚCOMMON_NVCC_FLAGSz--expt-relaxed-constexpr)Útorch.utils.cpp_extensionrb   rc   r   r   r   Úextend)rb   rc   Únvrtc_unsupported_flagsÚflagÚcompatible_flagss        r"   Ú_get_gpu_rtc_compatible_flagsri   w   sc   € ÷ Pð 	#ðÐð +öØ¨dÐ:QÒ.QŠðÐð ô ‡}�}×ÒØ×ÑÐ 2Ô3àÐùòs
   �	AšAÚkernel_sourceÚkernel_nameÚcompute_capabilityÚcuda_include_dirsÚnvcc_optionsÚauto_pchc           
      óø  ‡‡— ddl }t        «       ŠdŠdt        ddfˆˆfd„}| j                  d«      }|€q|j                  j                  |j                  j                  «       «      }	|j                  j                  r|	j                  › }n|	j                  › |	j                  › �}g }
|j                  j                  r#|
j                  d|› �j                  «       «       n"|
j                  d|› �j                  «       «       dd	lm}  |d
«      }|D ]$  }|
j                  d|› �j                  «       «       Œ& |r)|D ]$  }|
j                  d|› �j                  «       «       Œ& |rYt        |j                  j                  «      dk  r"t!        d|j                  j                  › �«      ‚|€g }|j                  d«       |r'|D ]"  }|
j                  |j                  d«      «       Œ$ t#        «       }|
j%                  |D �cg c]  }|j                  d«      ‘Œ c}«       t'        |
«      }t)        j*                  |z  |
Ž }t)        j,                  «       } |‰j/                  t)        j0                  |«      ||› d�j                  «       ddd«      «       |j                  d«      } |‰j3                  ||«      «       ‰j5                  |||«      }|‰k7  r�t)        j6                  «       }‰j9                  |t)        j0                  |«      «       t)        j:                  |j<                  «      }‰j?                  ||«       tA        d|j<                  jC                  «       › �«      ‚t)        j6                  «       } |‰jE                  |t)        j0                  |«      «      «       t)        j:                  |j<                  «      } |‰jG                  ||«      «       t)        j*                  «       } |‰jI                  ||t)        j0                  |«      «      «       |j<                  �|j<                  jC                  «       }nd}‰jK                  t)        j0                  |«      «       |jL                  |fS c c}w )aÅ  
    Compiles a CUDA kernel using NVRTC and returns the PTX code.

    Args:
        kernel_source (str): The CUDA kernel source code as a string
        kernel_name (str): The name of the kernel function to compile
        compute_capability (str, None): The compute capability to target (e.g., "86").
                                           If None, will detect from current device.
        cuda_include_dirs (list, None): List of directories containing CUDA headers
        nvcc_options (list, None): Additional options to pass to NVRTC
        auto_pch (bool): Enable automatic precompiled headers (CUDA 12.8+)

    Returns:
        Tuple[bytes, str]: The compiled PTX code and mangled kernel name
    r   Nr+   r   c                 óî   •— | ‰k7  rot        j                  «       }‰j                  | t        j                  |«      «       |j                  �|j                  j                  «       nd}t        d|› �«      ‚y )Nr-   r.   )r   r/   r?   r0   r1   r2   r3   )r+   r4   r6   ÚNVRTC_SUCCESSÚlibnvrtcs      €€r"   Úcheck_nvrtcz#_nvrtc_compile.<locals>.check_nvrtc°   so   ø€ Ø�]Ò"Ü—o‘oÓ'ˆGØ×(Ñ(¨´·±¸gÓ1FÔGð —=‘=Ð,ð —‘×$Ñ$Ô&à)ð ô
  ¨m¨_Ð=Ó>Ð>ð #r&   úutf-8z--offload-arch=z--gpu-architecture=sm_)Úinclude_pathsrX   z-Iz12.8zPCH requires CUDA 12.8+, got z--pchz.cuzKernel compilation failed:
r:   )'Ú
torch.cudar`   rW   ÚencoderX   Úget_device_propertiesÚcurrent_devicer   r   ÚgcnArchNameÚmajorÚminorÚappendrd   rv   r   ÚAssertionErrorri   re   Úlenr   r/   Úc_void_prA   r0   rO   rE   Úc_size_trK   Úcreate_string_bufferr1   rM   r3   r2   rG   rI   rQ   rC   Úraw)rj   rk   rl   rm   rn   ro   r   rt   Úsource_bytesÚpropsÚoptionsrv   Úcuda_include_pathsÚ	cuda_pathÚ	directoryÚoptionÚnvrtc_compatible_flagsrg   Únum_optionsÚoptions_arrayÚprogÚc_kernel_nameÚresÚlog_sizeÚlogÚbinary_sizeÚbinaryÚc_mangled_nameÚmangled_namerr   rs   s                                @@r"   Ú_nvrtc_compiler˜   �   sú  ù€ ó0 ô $Ó%€Hð €Mð	?œCð 	? Dö 	?ð !×'Ñ'¨Ó0€Lð Ð!Ø—
‘
×0Ñ0°·±×1JÑ1JÓ1LÓMˆØ�=‰=×ÒØ$)×$5Ñ$5Ð#6Ñà$)§K¡K =°·±°Ð!>Ðð €GØ‡}�}×ÒØ�‰˜Ð);Ð(<Ð=×DÑDÓFÕGà�‰Ð/Ð0BÐ/CÐD×KÑKÓMÔNõ 8á& vÓ.ÐØ'ò 2ˆ	Ø�‰˜˜I˜;Ð'×.Ñ.Ó0Õ1ð2ñ Ø*ò 	6ˆIØ�N‰N˜R 	˜{Ð+×2Ñ2Ó4Õ5ð	6ñ Üˆu�}‰}×!Ñ!Ó" VÒ+Ü Ð#@ÀÇÁ×ASÑASÐ@TÐ!UÓVÐVØÐØˆLØ×Ñ˜GÔ$ñ Ø"ò 	3ˆFØ�N‰N˜6Ÿ=™=¨Ó1Õ2ð	3ô ;Ó<ÐØ‡N�NÐ5KÖL¨T�D—K‘K Õ(ÒLÔMô �g“,€KÜ—_‘_ {Ñ2°WÐ=€Mô �?‰?Ó€DÙØ×#Ñ#Ü�L‰L˜ÓØØˆm˜3Ð×&Ñ&Ó(ØØØó	
ô	ð  ×&Ñ& wÓ/€MÙ�×/Ñ/°°mÓDÔEð ×
&Ñ
& t¨[¸-Ó
H€Cð ˆmÒä—?‘?Ó$ˆØ×'Ñ'¨¬f¯l©l¸8Ó.DÔEÜ×)Ñ)¨(¯.©.Ó9ˆØ×#Ñ# D¨#Ô.ÜÐ9¸#¿)¹)×:JÑ:JÓ:LÐ9MÐNÓOÐOô —/‘/Ó#€KÙ�×*Ñ*¨4´·±¸kÓ1JÓKÔLÜ×(Ñ(¨×):Ñ):Ó;€FÙ�×&Ñ& t¨VÓ4Ô5ô —_‘_Ó&€NÙØ×$Ñ$ T¨=¼&¿,¹,À~Ó:VÓWôð ×ÑÐ'Ø%×+Ñ+×2Ñ2Ó4‰àˆà× Ñ ¤§¡¨dÓ!3Ô4ð �:‰:�|Ð#Ð#ùòo Ms   ÈQ7c                   ó@   — e Zd Zdej                  ddfd„Zdeddfd„Zy)Ú_CudaModuleÚmoduler   Nc                 ó    — || _         i | _        y r)   )Ú_moduleÚ_kernels)Úselfr›   s     r"   Ú__init__z_CudaModule.__init__"  s   € ØˆŒØ02ˆ�r&   ÚnameÚ_CudaKernelc           	      ó   — || j                   v r| j                   |   S ddlm}  |«       }t        j                  «       }	 t        |j                  t        j                  |«      | j                  |j                  d«      «      «       t        || j                  «      }|| j                   |<   |S # t        $ r}t        d|› d�«      |‚d }~ww xY w)Nr   )r*   ru   zNo kernel named 'z' in this module)rž   Útorch.cuda._utilsr*   r   r�   r7   r   r0   r�   rx   r¢   r3   ÚAttributeError)rŸ   r¡   r*   r5   ÚfuncÚkernelÚerrs          r"   Ú__getattr__z_CudaModule.__getattr__&  s¿   € Ø�4—=‘=Ñ Ø—=‘= Ñ&Ð&õ 	?á*Ó,ˆä�‰Ó ˆð	VÜØ×+Ñ+Ü—L‘L Ó&¨¯©°d·k±kÀ'Ó6Jóôô
 !  t§|¡|Ó4ˆFØ"(ˆD�M‰M˜$ÑØˆMøäò 	VÜ Ð#4°T°FÐ:JÐ!KÓLÐRUÐUûð	Vús   Á A.B/ Â/	CÂ8CÃC)Ú__name__Ú
__module__Ú__qualname__r   r�   r    r   r©   r%   r&   r"   rš   rš   !  s/   „ ð3˜vŸ™ð 3°4ó 3ðV ð V¨ô Vr&   rš   c                   ó¬   — e Zd ZdZdej
                  dej
                  ddfd„Z	 	 	 	 	 ddeeeef   deeeef   d	e	dz  d
ede
dz  ddfd„Zdeddfd„Zy)r¢   zT
    Represents a compiled CUDA kernel that can be called with PyTorch tensors.
    r¦   r›   r   Nc                 ó.   — || _         || _        d| _        y )Nr   )r¦   r›   Ú_max_shared_mem_bytes)rŸ   r¦   r›   s      r"   r    z_CudaKernel.__init__D  s   € ØˆŒ	ØˆŒØ%&ˆÕ"r&   ÚgridÚblockÚargsÚ
shared_memÚstreamc                 óB  — ddl }|j                  j                  j                  «       }|sg }g }g }	|D �]O  }
t	        |
|j
                  «      rŒ|
j                  s'|
j                  r|
j                  «       st        d«      ‚t        j                  |
j                  «       «      }|j                  |«       |	j                  t        j                  |«      «       Œ¦t	        |
t        «      r:t        j                   |
«      }|	j                  t        j                  |«      «       Œðt	        |
t"        «      r;t        j$                  |
«      }|	j                  t        j                  |«      «       �Œ;t'        dt)        |
«      › �«      ‚ t        j                  t+        |	«      z  «       }t-        |	«      D ],  \  }}
t        j.                  |
t        j                  «      ||<   Œ. |€ddl}|j                  j3                  «       }|dk\  rQ| j4                  dk(  s|| j4                  kD  r3| j4                  dk(  rdnd| j4                  › d�}t7        d	|› d
|› d�«      ‚t9        |j;                  | j<                  |d   |d   |d   |d   |d   |d   ||j>                  |d«      «       y)aþ  
        Call the compiled CUDA kernel

        Args:
            grid (tuple): Grid dimensions (grid_x, grid_y, grid_z)
            block (tuple): Block dimensions (block_x, block_y, block_z)
            args (list): List of arguments to pass to the kernel.
                         PyTorch tensor arguments will be automatically converted to pointers.
            shared_mem (int): Shared memory size in bytes
            stream (torch.cuda.Stream): CUDA stream to use. If None, uses current stream.
        r   Nz?All tensor arguments must be CUDA tensors or pinned CPU tensorszUnsupported argument type: é À  znot configuredzonly z bytes configuredzKernel requires z' bytes of shared memory (>= 48KB), but ze. Call kernel.set_shared_memory_config(shared_mem) after compilation and before launching the kernel.é   r<   ) r   rX   Ú_utilsr*   Ú
isinstanceÚTensorÚis_cudaÚis_cpuÚ	is_pinnedÚ
ValueErrorr   r�   Údata_ptrr~   r0   rW   Úc_intÚfloatÚc_doubleÚ	TypeErrorÚtyper€   Ú	enumerateÚcastrw   Úcurrent_streamr¯   r3   r7   r   r¦   Ú_as_parameter_)rŸ   r°   r±   r²   r³   r´   r   r5   Úprocessed_argsÚc_argsÚargÚptrrÀ   rÂ   Úc_args_arrayÚiÚconfigured_msgs                    r"   Ú__call__z_CudaKernel.__call__I  s_  € ó& 	à—*‘*×#Ñ#×<Ñ<Ó>ˆáØˆDð 13ˆØˆàó 	KˆCÜ˜#˜uŸ|™|Ô,Ø—{’{¨C¯JªJ¸3¿=¹=¼?Ü$ØYóð ô —o‘o c§l¡l£nÓ5�Ø×%Ñ% cÔ*Ø—‘œfŸl™l¨3Ó/Õ0Ü˜C¤Ô%äŸ™ SÓ)�à—‘œfŸl™l¨5Ó1Õ2Ü˜C¤Ô'ä!Ÿ?™?¨3Ó/�à—‘œfŸl™l¨8Ó4Ö5äÐ"=¼dÀ3»i¸[Ð IÓJÐJð+	Kô0 Ÿ™¬#¨f«+Ñ5Ó8ˆÜ Ó'ò 	@‰FˆAˆsÜ$Ÿk™k¨#¬v¯©Ó?ˆL˜ŠOð	@ð ˆ>ãà—Z‘Z×.Ñ.Ó0ˆFð ˜Ò"Ø×&Ñ&¨!Ò+¨z¸D×<VÑ<VÒ/Vð ×-Ñ-°Ò2ñ !à˜T×7Ñ7Ð8Ð8IÐJð ô
 Ø" : ,ð /Ø%Ð&ð '3ð3óð ô 	Ø×"Ñ"Ø—	‘	Ø�Q‘Ø�Q‘Ø�Q‘Ø�a‘Ø�a‘Ø�a‘ØØ×%Ñ%ØØóõ	
r&   Úshared_mem_bytesc                 óp  — |dk  r|| _         y t        «       }t        j                  j	                  «       }t        j
                  j                  r|j                  dk7  rdnd}nt        |dd«      }||kD  rt        d|› d|› d�«      ‚d	}t        |j                  | j                  ||«      «       || _         y )
Nr¶   Úgfx950i   i € Úshared_memory_per_block_optinzRequested shared memory (z bytes) exceeds device limit (z= bytes). Consider reducing block size or shared memory usage.é   )r¯   r*   r   rX   ry   r   r   r{   Úgetattrr3   r7   r    r¦   )rŸ   rÑ   r5   Údevice_propsÚmax_shared_memÚ+cudaFuncAttributeMaxDynamicSharedMemorySizes         r"   Úset_shared_memory_configz$_CudaKernel.set_shared_memory_configª  s×   € Ø˜iÒ'à)9ˆDÔ&Øä*Ó,ˆô —z‘z×7Ñ7Ó9ˆä�=‰=×Òð &×1Ñ1°XÒ=‘À:ñ ô %ØÐ=¸uóˆNð ˜nÒ,ÜØ+Ð,<Ð+=ð >!Ø!/Ð 0ð 1GðGóð ð 78Ð3ÜØ×&Ñ&Ø—	‘	Ø;Ø óô	
ð &6ˆÕ"r&   )©r·   r·   r·   rÛ   Nr   N)rª   r«   r¬   Ú__doc__r   r�   r    ÚtuplerW   Úlistr   rÐ   rÚ   r%   r&   r"   r¢   r¢   ?  s²   „ ñð'˜VŸ_™_ð '°f·o±oð 'È$ó 'ð &/Ø&/Ø ØØ!ñ_
à�C˜˜c�MÑ"ð_
ð �S˜#˜s�]Ñ#ð_
ð �T‰kð	_
ð
 ð_
ð �d‘
ð_
ð 
ó_
ðB(6¸ð (6Àô (6r&   r¢   ÚptxÚkernel_namesc           
      ó8  — ddl }t        «       }t        | t        «      r| j	                  d«      } t        j                  «       }|j                  j                  «       }|5  t        |j                  t        j                  |«      | «      «       ddd«       |st        |«      S i }|D ]c  }t        j                  «       }t        |j                  t        j                  |«      ||j	                  d«      «      «       t        ||«      ||<   Œe |S # 1 sw Y   Œ‚xY w)a,  
    Loads a CUDA module from PTX code and returns a module object that can access kernels.

    Args:
        ptx (bytes or str): The PTX code to load
        kernel_names (list, optional): List of kernel names to extract from the module.
                                      If None, will return a module object with __getattr__.

    Returns:
        object: If kernel_names is None, returns a module object with __getattr__ to access kernels.
               If kernel_names is provided, returns a dict mapping kernel names to _CudaKernel objects.
    r   Nru   )rw   r*   r¹   r   rx   r   r�   rX   rÇ   r7   r   r0   rš   r   r¢   )	rß   rà   r   r5   r›   r´   Úkernelsr¡   r¦   s	            r"   Ú_cuda_load_modulerã   Õ  sÿ   € ó  ô 'Ó(€Gô �#”sÔØ�j‰j˜Ó!ˆô �_‰_Ó€Fà�Z‰Z×&Ñ&Ó(€FØ	ñ IÜ�G×,Ñ,¬V¯\©\¸&Ó-AÀ3ÓGÔH÷Iñ Ü˜6Ó"Ð"ð €GØò 2ˆÜ�‰Ó ˆÜØ×'Ñ'Ü—‘˜TÓ" F¨D¯K©K¸Ó,@óô	
ô
 $ D¨&Ó1ˆ�Šð2ð €N÷!Ið Iús   Á /DÄDÚdeviceÚoptionalÚ	allow_cpuc                 óÐ  — t        | t        «      r| S t        | t        «      rt        j                  | «      } t        | t        j                  «      r;|r| j
                  dvr+t        d| › �«      ‚| j
                  dk7  rt        d| › �«      ‚t        j                  j                  «       s0t        | t        j                  j                  «      r| j                  S t        | ||«      S )a±  Get the device index from :attr:`device`, which can be a torch.device object, a Python integer, or ``None``.

    If :attr:`device` is a torch.device object, returns the device index if it
    is a CUDA device. Note that for a CUDA device without a specified index,
    i.e., ``torch.device('cuda')``, this will return the current default CUDA
    device if :attr:`optional` is ``True``. If :attr:`allow_cpu` is ``True``,
    CPU devices will be accepted and ``-1`` will be returned in this case.

    If :attr:`device` is a Python integer, it is returned as is.

    If :attr:`device` is ``None``, this will return the current default CUDA
    device if :attr:`optional` is ``True``.
    )rX   Úcpuz(Expected a cuda or cpu device, but got: rX   z!Expected a cuda device, but got: )r¹   rW   r   r   rä   rÄ   r¾   ÚjitÚis_scriptingrX   ÚidxÚ_torch_get_device_index)rä   rå   ræ   s      r"   r   r     s·   € ô  �&œ#ÔØˆÜ�&œ#ÔÜ—‘˜fÓ%ˆÜ�&œ%Ÿ,™,Ô'ÙØ�{‰{ /Ñ1Ü Ð#KÈFÈ8Ð!TÓUÐUØ�[‰[˜FÒ"ÜÐ@ÀÀÐIÓJÐJÜ�9‰9×!Ñ!Ô#Ü�fœeŸj™j×/Ñ/Ô0Ø—:‘:ÐÜ" 6¨8°YÓ?Ð?r&   )NNNFr)   )FF)r   r   Útypingr   r   Útorch._utilsr   rì   r   r#   r'   r*   rW   r7   rS   r^   r`   rÞ   r   ri   ÚboolrÝ   Úbytesr˜   rš   r¢   Údictrã   r%   r&   r"   ú<module>rò      s•  ðÛ Û 
Ý ã õ Fð &§+¡+ó ð.+˜6Ÿ;™;ó +ð# &§+¡+ó #ð	7˜ð 	7 ó 	7ð˜VŸ[™[ó ð:6˜FŸK™Kó 6ð&$˜fŸk™kó $ð t¨C¡yó ð6 &*Ø%)Ø $ØñO$ØðO$àðO$ð ˜d™
ðO$ð ˜d‘{ð	O$ð
 ˜‘+ðO$ð ðO$ð ˆ5�#ˆ:ÑóO$÷dVñ V÷<S6ñ S6ðn 8<ñ-Ø	ˆu‰ð-Ø$(¨¡I°Ñ$4ð-à�4˜˜]Ð*Ñ+Ñ+ó-ðb <Añ@Øð@Øð@Ø48ð@àô@r&   