U
    -e                     @   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re  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KZret_val r   j/var/www/html/Darija-Ai-Train/env/lib/python3.8/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optionYearsZRiskfreeZ
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   )Zrand_varlowhighr   r   r   	randfloat+   s    r/   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 qxt	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 qj||| ||	| |  t|| }| t|  }| }| |dk  | |dk  d S )Ni     g      @g      >@r   g      Y@g      ?g      $@T)Zdeviceinlinec                 S   sh   dddt |    }tt d|  |   |t|t|t|t|t          }| dkrdd| }|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   Z	threadIdxxZblockIdxZblockDimshaper3   r   r   r   )r   r   r!   r"   r#   r$   r%   ir&   r'   r(   r)   r*   r+   r5   r   r   black_scholes_cudaL   s    , z>TestBlackScholes.test_blackscholes.<locals>.black_scholes_cuda)i      r   r;   gvIh%<=)r/   r	   randomZzerosZonesranger,   RISKFREE
VOLATILITYr   Zjitr   r   intr3   ceilfloatstreamZ	to_deviceZcopy_to_hostZsynchronizer
   summax
assertTrue)selfZOPT_NZ
iterationsr   r   r    ZcallResultNumpyZputResultNumpyZcallResultNumbaZputResultNumbar8   r:   ZblockdimZgriddimrC   Zd_callResultZd_putResultZd_stockPriceZd_optionStrikeZd_optionYearsdeltaZL1normZmax_abs_errr   r9   r   test_blackscholes0   sb    

   
8      z"TestBlackScholes.test_blackscholesN)__name__
__module____qualname__rI   r   r   r   r   r0   /   s   r0   __main__)numpyr	   r3   Znumbar   r   r   Znumba.cuda.testingr   r   r>   r?   r   r   r   r   r   r   r   r,   r/   r0   rJ   mainr   r   r   r   <module>   s"   H