
    xKg                         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 Zd Zd Z G d de	      Zedk(  r ej.                          yy)    N)cudadoublevoid)unittestCUDATestCaseg{Gz?g333333?g:p?g[2ֿgh^_?gxN#gC)H?gQ63E?c                     dddt        j                  |       z  z   z  }t        t        j                  d| z  | z        z  |t        |t
        |t        |t        |t        z  z   z  z   z  z   z  z   z  z  }t        j                  | dkD  d|z
  |      S N      ?gqq?g      r   )
npabsRSQRT2PIexpA1A2A3A4A5wheredKret_vals      m/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pycndr      s    sY**+A"&&A..R!rAa2B;.?)?$@@AABDG88AE3='22    c                 Z   |}|}|}	|}
|}t        j                  |	      }t        j                  ||z        |
d|z  |z  z   |	z  z   ||z  z  }|||z  z
  }t        |      }t        |      }t        j                  |
 |	z        }||z  ||z  |z  z
  | d d  ||z  d|z
  z  |d|z
  z  z
  |d d  y )N      ?r
   )r   sqrtlogr   r   )
callResult	putResult
stockPriceoptionStrikeoptionYearsRiskfree
VolatilitySXTRVsqrtTd1d2cndd1cndd2expRTs                     r   black_scholesr2      s    AAAAAGGAJE
&&Q-1sQw{?a/
/AI	>B	a%iBGEGEFFQ37OEYUU!22JqMIu-S5[0AAIaLr   c                     d| z
  |z  | |z  z   S )Nr
    )rand_varlowhighs      r   	randfloatr8   +   s    (Nc!HtO33r   c                       e Zd Zd Zy)TestBlackScholesc                 :   d}d}t        t        j                  j                  |      dd      }t        t        j                  j                  |      dd      }t        t        j                  j                  |      dd      }t        j                  |      }t        j                  |       }t        j                  |      }t        j                  |       }	t        |      D ]  }
t        |||||t        t                t        j                  t        t              d	d	
      d        t        j                  t        t        d d  t        d d  t        d d  t        d d  t        d d  t        t                    fd       }d}t        t        j                  t!        |      |d   z              df}t        j"                         }t        j$                  ||      }t        j$                  |	|      }t        j$                  ||      }t        j$                  ||      }t        j$                  ||      }t        |      D ]  }
 ||||f   |||||t        t                 |j'                  ||       |j'                  |	|       |j)                          t        j*                  ||z
        }|j-                         t        j*                  |      j-                         z  }|j/                         }| j1                  |dk         | j1                  |dk         y )Ni     g      @g      >@r
   g      Y@g      ?g      $@T)deviceinlinec                     dddt        j                  |       z  z   z  }t        t        j                  d| z  | z        z  |t        |t
        |t        |t        |t        z  z   z  z   z  z   z  z   z  z  }| dkD  rd|z
  }|S r	   )	mathfabsr   r   r   r   r   r   r   r   s      r   cnd_cudaz4TestBlackScholes.test_blackscholes.<locals>.cnd_cudaC   s    sY1556A$((4!8a<"88R!rAa2B;6G1G,H'H"IIJLG1u-Nr   c                 <   t         j                  j                  t         j                  j                  t         j                  j                  z  z   }||j
                  d   k\  ry t        j                  ||         }t        j                  ||   ||   z        |d|z  |z  z   ||   z  z   ||z  z  }	|	||z  z
  }
 |	      } |
      }t        j                  d|z  ||   z        }||   |z  ||   |z  |z  z
  | |<   ||   |z  d|z
  z  ||   d|z
  z  z
  ||<   y )Nr   r   g      r
   )
r   	threadIdxxblockIdxblockDimshaper@   r   r   r   )r    r!   r'   r(   r)   r*   r+   ir,   r-   r.   r/   r0   r1   rB   s                 r   black_scholes_cudaz>TestBlackScholes.test_blackscholes.<locals>.black_scholes_cudaL   s      4==??T]]__#DDAAGGAJIIadOE88AaD1Q4K(Aa!Oqt+CCY Ba%iBRLERLEHHcAg1-.EqTE\AaD5L5,@@JqMaD5LC%K81Q43;;OOIaLr   )i      r   rK   gvIh%<=)r8   r   randomzerosonesranger2   RISKFREE
VOLATILITYr   jitr   r   intr@   ceilfloatstream	to_devicecopy_to_hostsynchronizer   summax
assertTrue)selfOPT_N
iterationsr"   r#   r$   callResultNumpyputResultNumpycallResultNumbaputResultNumbarI   rJ   blockdimgriddimrV   d_callResultd_putResultd_stockPriced_optionStriked_optionYearsdeltaL1normmax_abs_errrB   s                          @r   test_blackscholesz"TestBlackScholes.test_blackscholes0   s   
ryy//6TB
 !1!1%!8#uE		 0 0 7tD((5/''%.((5/''%. z"A/>:&XzK # 
&.d	;	 
<	 
$vay&)VAYq	6!9v' 
(	Q
(	Q  diiex{ :;<a?~~ov>nn^V<~~j&9f={F;z"A9w&89k<x5 # 	!!/6:  889rvvo6::<<iik'e+,r   N)__name__
__module____qualname__rn   r4   r   r   r:   r:   /   s    D-r   r:   __main__)numpyr   r@   numbar   r   r   numba.cuda.testingr   r   rP   rQ   r   r   r   r   r   r   r   r2   r8   r:   ro   mainr4   r   r   <module>rw      sw      $ $ 5 
-3C$4E-| E-P zHMMO r   