o
    Y۷i                     @   s   d dl Zd dlZd dlmZmZmZ d dlmZm	Z	 dZ
dZdZdZdZd	Zd
ZdZdd Zdd Zdd ZG dd de	ZedkrHe  dS dS )    N)cudadoublevoid)unittestCUDATestCaseg{Gz?g333333?g:p?g[2ֿgh^_?gxN#gC)H?gQ63E?c                 C   sj   dddt |    }tt d|  |   |t|t|t|t|t          }t 	| dkd| |S N      ?gqq?g      r   )
npabsRSQRT2PIexpA1A2A3A4A5wheredKret_val r   _/home/ubuntu/vllm_env/lib/python3.10/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pycnd   s
   &r   c                 C   s   |}|}|}	|}
|}t |	}t || |
d| |  |	  ||  }|||  }t|}t|}t |
 |	 }|| || |  | d d < || d|  |d|   |d d < d S )N      ?r   )r	   sqrtlogr   r   )
callResult	putResult
stockPriceoptionStrikeoptionYearsRiskfree
VolatilitySXTRVsqrtTd1d2cndd1cndd2expRTr   r   r   black_scholes   s   
*(r/   c                 C   s   d|  | | |  S )Nr   r   )rand_varlowhighr   r   r   	randfloat+   s   r3   c                   @   s   e Zd Zdd ZdS )TestBlackScholesc              
      s  d}d}t tj|dd}t tj|dd}t tj|dd}t|}t| }t|}t| }	t|D ]}
t|||||tt q<t	j
ttd	d	d
dd  t	
ttd d  td d  td d  td d  td d  tt fdd}d}ttt||d  df}t	 }t	||}t	|	|}t	||}t	||}t	||}t|D ]}
||||f |||||tt q||| ||	| |  t|| }| t|  }| }| |dk  | |dk  d S )Ni     g      @g      >@r   g      Y@g      ?g      $@T)deviceinlinec                 S   sh   dddt |    }tt d|  |   |t|t|t|t|t          }| dkr2d| }|S r   )	mathfabsr   r   r   r   r   r   r   r   r   r   r   cnd_cudaC   s   &z4TestBlackScholes.test_blackscholes.<locals>.cnd_cudac                    s   t jjt jjt jj  }||jd krd S t|| }t|| ||  |d| |  ||   ||  }	|	||  }
 |	} |
}t	d| ||  }|| | || | |  | |< || | d|  || d|   ||< d S )Nr   r   g      r   )
r   	threadIdxxblockIdxblockDimshaper8   r   r   r   )r   r   r$   r%   r&   r'   r(   ir)   r*   r+   r,   r-   r.   r:   r   r   black_scholes_cudaL   s   , ,z>TestBlackScholes.test_blackscholes.<locals>.black_scholes_cuda)i      r   rC   gvIh%<=)r3   r	   randomzerosonesranger/   RISKFREE
VOLATILITYr   jitr   r   intr8   ceilfloatstream	to_devicecopy_to_hostsynchronizer
   summax
assertTrue)selfOPT_N
iterationsr   r    r!   callResultNumpyputResultNumpycallResultNumbaputResultNumbar@   rB   blockdimgriddimrN   d_callResultd_putResultd_stockPriced_optionStriked_optionYearsdeltaL1normmax_abs_errr   rA   r   test_blackscholes0   sP   


8z"TestBlackScholes.test_blackscholesN)__name__
__module____qualname__rf   r   r   r   r   r4   /   s    r4   __main__)numpyr	   r8   numbar   r   r   numba.cuda.testingr   r   rH   rI   r   r   r   r   r   r   r   r/   r3   r4   rg   mainr   r   r   r   <module>   s&    H