ó
\K]c           @` sð   d  d l  m Z m Z m Z d  d l Z d  d l Z d  d l Z d  d l 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 d e e j f d „  ƒ  YZ e d k rì e j ƒ  n  d S(   i    (   t   print_functiont   absolute_importt   divisionN(   t   cudat   double(   t   unittestt   SerialMixing{®Gáz”?g333333Ó?gìø’:¿pÔ?g[2¨åðÑÖ¿gh^_ï€ü?gÐxòNÝ#ý¿gC)ôÖÍHõ?gQ6Ô3EˆÙ?c         C` s{   d d d t  j |  ƒ } t t  j d |  |  ƒ | t | t | t | t | t } t  j	 |  d k d | | ƒ S(   Ng      ð?gqq¦Í?g      à¿i    (
   t   npt   abst   RSQRT2PIt   expt   A1t   A2t   A3t   A4t   A5t   where(   t   dt   Kt   ret_val(    (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt   cnd   s    +c         C` sÐ   | } | } | }	 | }
 | } t  j |	 ƒ } t  j | | ƒ |
 d | | |	 | | } | | | } t | ƒ } t | ƒ } t  j |
 |	 ƒ } | | | | | |  (| | d | | d | | (d  S(   Ng      à?g      ð?(   R   t   sqrtt   logR   R
   (   t
   callResultt	   putResultt
   stockPricet   optionStriket   optionYearst   Riskfreet
   Volatilityt   St   Xt   Tt   Rt   Vt   sqrtTt   d1t   d2t   cndd1t   cndd2t   expRT(    (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt   black_scholes   s    /c         C` s   d |  | |  | S(   Ng      ð?(    (   t   rand_vart   lowt   high(    (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt	   randfloat.   s    t   TestBlackScholesc           B` s   e  Z d  „  Z RS(   c      	   ` sË  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 | ƒ }	 x0 t | ƒ D]" }
 t | | | | | t t ƒ q± Wt	 j
 d	 t f d
 t d t d t ƒ d „  ƒ ‰  t	 j
 d	 t t t t t t t f ƒ ‡  f d †  ƒ } t j ƒ  } d } t t j t | ƒ | d ƒ ƒ d f } t	 j ƒ  } t	 j | | ƒ } t	 j |	 | ƒ } t	 j | | ƒ } t	 j | | ƒ } t	 j | | ƒ } t j ƒ  } x= t | ƒ D]/ }
 | | | | f | | | | | t t ƒ qüW| j | | ƒ | j |	 | ƒ | j ƒ  | | } t j | | ƒ } | j ƒ  t j | ƒ j ƒ  } | j ƒ  } |  j | d k  ƒ |  j | d k  ƒ d  S(   Ni  i   g      @g      >@g      ð?g      Y@g      Ð?g      $@t   argtypest   restypet   devicet   inlinec         S` s{   d d d t  j |  ƒ } t t  j d |  |  ƒ | t | t | t | t | t } |  d k rw d | } n  | S(   Ng      ð?gqq¦Í?g      à¿i    (	   t   matht   fabsR	   R
   R   R   R   R   R   (   R   R   R   (    (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt   cnd_cudaH   s    +c         ` s  t  j j t  j j t  j j } | | j d k r7 d  St j | | ƒ } t j | | | | ƒ | d | | | | | | }	 |	 | | }
 ˆ  |	 ƒ } ˆ  |
 ƒ } t j	 d | | | ƒ } | | | | | | | |  | <| | | d | | | d | | | <d  S(   Ni    g      à?g      ð¿g      ð?(
   R   t	   threadIdxt   xt   blockIdxt   blockDimt   shapeR3   R   R   R
   (   R   R   R   R   R    R!   R"   t   iR#   R$   R%   R&   R'   R(   (   R5   (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt   black_scholes_cudaR   s     ;"i   i   i    g‚vIhÂ%<=(   i   i   (   R-   R   t   randomt   zerost   onest   rangeR)   t   RISKFREEt
   VOLATILITYR   t   jitR   t   Truet   timet   intR3   t   ceilt   floatt   streamt	   to_devicet   copy_to_hostt   synchronizeR   t   sumt   maxt
   assertTrue(   t   selft   OPT_Nt
   iterationsR   R   R   t   callResultNumpyt   putResultNumpyt   callResultNumbaprot   putResultNumbaproR;   R<   t   time0t   blockdimt   griddimRI   t   d_callResultt   d_putResultt   d_stockPricet   d_optionStriket   d_optionYearst   time1t   dtt   deltat   L1normt   max_abs_err(    (   R5   sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt   test_blackscholes3   sL    0
)

(   t   __name__t
   __module__Rd   (    (    (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyR.   2   s   t   __main__(   t
   __future__R    R   R   t   numpyR   R3   RE   t   numbaR   R   t   numba.cuda.testingR   R   RA   RB   R   R   R   R   R   R	   R   R)   R-   t   TestCaseR.   Re   t   main(    (    (    sH   lib/python2.7/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyt   <module>   s&   			M