o
    װiW8                  
   @   s  U d dl Zd dlZd dlmZ dZdZdZdZee	df e
d< d	Zed
7 ZdZdZdZe Zdd Zdd Zdd Zdd Zdd ZedkreddZe ZW d   n1 sZw   Y  dZeD ]TZeeedZe ZW d   n1 s|w   Y  d ZeD ]1Z e! Z"ej#$ee Z%e%Ze & Z'W d   n1 sw   Y  ee'ee"e eZdZqqce(ddZe(dd Zee)d!d Zed"d#Ze*e W d   dS 1 sw   Y  dS dS )$    N)Tuplez&/usr/local/cuda-{0}/include/cusparse.h)z11.3z11.0z10.2zehttps://raw.githubusercontent.com/ROCmSoftwarePlatform/hipSPARSE/rocm-{0}/library/include/hipsparse.h)z3.5.0z3.7.0z3.8.0z3.9.0z4.0.0z4.2.0.typedefs)cusparseIndexBase_tcusparseStatus_tcusparseHandle_tcusparseMatDescr_tcsrsv2Info_tcsrsm2Info_tcsric02Info_tbsric02Info_tcsrilu02Info_tbsrilu02Info_tcsrgemm2Info_tcusparseMatrixType_tcusparseFillMode_tcusparseDiagType_tcusparsePointerMode_tcusparseAction_tcusparseDirection_tcusparseSolvePolicy_tcusparseOperation_t)cusparseSpVecDescr_tcusparseDnVecDescr_tcusparseSpMatDescr_tcusparseDnMatDescr_tcusparseIndexType_tcusparseFormat_tcusparseOrder_tcusparseSpMVAlg_tcusparseSpMMAlg_tcusparseSparseToDenseAlg_tcusparseDenseToSparseAlg_tcusparseCsr2CscAlg_ta  
#if HIP_VERSION >= 402
static hipDataType convert_hipDatatype(cudaDataType type) {
    switch(static_cast<int>(type)) {
        case 2 /* CUDA_R_16F */: return HIP_R_16F;
        case 0 /* CUDA_R_32F */: return HIP_R_32F;
        case 1 /* CUDA_R_64F */: return HIP_R_64F;
        case 6 /* CUDA_C_16F */: return HIP_C_16F;
        case 4 /* CUDA_C_32F */: return HIP_C_32F;
        case 5 /* CUDA_C_64F */: return HIP_C_64F;
        default: throw std::runtime_error("unrecognized type");
    }
}
#endif
a|  
#if HIP_VERSION >= 402
typedef enum {} cusparseOrder_t;
static hipsparseOrder_t convert_hipsparseOrder_t(cusparseOrder_t type) {
    switch(static_cast<int>(type)) {
        case 1 /* CUSPARSE_ORDER_COL */: return HIPSPARSE_ORDER_COLUMN;
        case 2 /* CUSPARSE_ORDER_ROW */: return HIPSPARSE_ORDER_ROW;
        default: throw std::runtime_error("unrecognized type");
    }
}
z[
#if HIP_VERSION < 401
#define HIPSPARSE_STATUS_NOT_SUPPORTED (hipsparseStatus_t)10
#endif
c                 C   sH   |  |}	 |dkr	 |S | |t|  dkr |  ||d }n	 |S q)NT(   )findlen)cu_hcu_funccu_sig r+   V/home/ubuntu/.local/lib/python3.10/site-packages/cupyx/tools/_hipsparse_stub_mapper.pyget_idx_to_funca   s   
r-   c                 C   s&   |  d} t| d d t| d  S )N.r   d   r%   )splitint)hip_versionr+   r+   r,   get_hip_ver_numo   s   
r3   c                 C   s   g }d }t | D ]E\}}||krM|ds|dr || q|d}|dkr.|d}|dkrB||| |d    |d }q||d |d   q|S )N,)r#   r%   )	enumerateendswithappendr&   )r*   cu_sig_processed	skip_linelines	break_idxr+   r+   r,   merge_bad_broken_linesu   s   


r>   c                 C   s4  d| v r|   } d| d d d  d | d d  }d}npd| v r<|   } d| d d d  d | d d  }d}nRd| v rZ|   } d| d d d  d | d d  }d	}n4d
| v rx|   } d| d d d  d | d d  }d}nd| v r|   } |d7 }|d| d d d  d| d d d  d7 }d| d d  }d}nd| v r|   } |d7 }|d| d d d  d| d d d  d7 }d| d d  }d}nd| v r|   } d| d d d  d | d d  }d}nd| v r|   } |d7 }|| d d d d 7 }d| d d  }d}nyd| v r;|   } |d7 }|d| d d d  d 7 }d| d d  }d}nSd| v ra|   } |d7 }|d| d d d  d 7 }d | d d  }d}n-d!| v r|d"kr|   } d| d d d  d | d d  }d#}n
|   } | d }d}||| d$ 7 }||fS )%Nzconst cuComplex*r$   r#   r5   z#reinterpret_cast<const hipComplex*>zconst cuDoubleComplex*z)reinterpret_cast<const hipDoubleComplex*>z
cuComplex*zreinterpret_cast<hipComplex*>zcuDoubleComplex*z#reinterpret_cast<hipDoubleComplex*>	cuComplexz  hipComplex blah;
z	  blah.x=z.x;
  blah.y=z.y;
blah cuDoubleComplexz  hipDoubleComplex blah;
zcudaDataType*zreinterpret_cast<hipDataType*>cudaDataTypez)  hipDataType blah = convert_hipDatatype(z);
zcusparseOrder_t*z  hipsparseOrder_t blah2 = zconvert_hipsparseOrder_t(*z&blah2r   zconvert_hipsparseOrder_t(blah2zconst void*hipsparseSpVV_bufferSizezconst_cast<void*> )r0   )r<   hip_sigdeclhip_funcargcastr+   r+   r,   process_func_args   sx   $$$$..$




$rL   c              	   C   s  t |}g }t|D ]I\}}|dkr8|s8|| |dkr7|d |d |d |t |t q
|drd}d}	d	}
tD ]>}||v r|tvr|d
r\d|dd   n|}|| v r|}||kru|}d| d | d }n|dkr{d }d}
d	}	n	  nqEd }|d ur|dkr|dkr|t n|	r|dkr|
r|d|  n|d|  |dkr|dks|| |	r|dkr|
r|d || |d |d ur|	rt	| q
d|v r*|
 }z
t|dksJ W n ty   td|   w |d }|d |d }d|dd   }t||}t| |}|dkr0|dkr0J |dkrE|dkrEt|dtjd d}n`|dkrZ|dkrZt|dtjd d}nK||d  d}|dksjJ |||| d  }|
d}|d  d }|dd  D ]}|dt|d  d  | d 7 }q|d d }||d< d	}|d| ||d  }d!|vr||d  }d!|v sJ |r|
d}t|}|dkr|d|  d"| d }d}|D ]}t||||\}}q|d d d }|||  |dkr|d |d# |d$ q
||d |d!d%  d&  q
d!|v rOd'|v r5q
d(|v rId||d  v rH|| q
|| q
|| q
d|d S ))N   i1  z#include <hipsparse.h>z2#include <hip/hip_version.h>    // for HIP_VERSIONz2#include <hip/library_types.h>  // for hipDataTypetypedefrA   FTcuhip   ztypedef rF   ;r   i  z#if HIP_VERSION >= z#if HIP_VERSION < z#elsez#endif
z...zsig is r%   r$   r#   z%not found in cuSPARSE, maybe removed?)filez,not found in hipSPARSE, maybe not supported?r5   
r   returnz	  return z(  return HIPSPARSE_STATUS_NOT_SUPPORTED;z#endif   z  HIPSPARSE_STATUS_NOT_SUPPORTED;CUSPARSE_STATUSHIPSPARSE_STATUS_NOT_SUPPORTED)r3   r6   r8   cudaDataType_converterdefault_return_code
startswithr   processed_typedefscusparseOrder_converteraddr0   r'   AssertionErrorprintr&   r-   sysstderrjoinr>   rL   )hip_hr(   stubsr2   init
hip_stub_hir;   old_linetypedef_foundtypedef_neededthip_tsigr)   rI   r*   rG   can_mapend_idx
new_cu_sigr<   rH   r+   r+   r,   main   s   













$









rr   __main__z"cupy_backends/stub/cupy_cusparse.hrFTz#define CUSPARSE_VERSION -1zg#define CUSPARSE_VERSION (hipsparseVersionMajor*100000+hipsparseVersionMinor*100+hipsparseVersionPatch)"INCLUDE_GUARD_STUB_CUPY_CUSPARSE_H"INCLUDE_GUARD_HIP_CUPY_HIPSPARSE_HrT   z"cupy_backends/hip/cupy_hipsparse.hw)+urllib.requesturllibra   typingr   
cusparse_hcu_versionshipsparse_urlhip_versionsstr__annotations__r   rY   r]   rZ   setr\   r-   r3   r>   rL   rr   __name__openfreadre   rf   cu_verformatr(   xhip_ver
splitlinesstubs_splittedrequesturlopenreqdecoderd   replacer&   writer+   r+   r+   r,   <module>   sh   
 
		E #

"