§
    ƒÛg·  ã                   ó¶   — 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        ¦   «          dS dS )é    N)ÚcudaÚdoubleÚvoid)ÚunittestÚCUDATestCaseg{®Gáz”?g333333Ó?gìø’:¿pÔ?g[2¨åðÑÖ¿gh^_ï€ü?gÐxòNÝ#ý¿gC)ôÖÍHõ?gQ6Ô3EˆÙ?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k    d|z
  |¦  «        S ©Nç      ð?gqq¦Í?g      à¿r   )
ÚnpÚabsÚRSQRT2PIÚexpÚA1ÚA2ÚA3ÚA4ÚA5Úwhere©ÚdÚKÚret_vals      ú_/granary/edev/quantum/lib/python3.11/site-packages/numba/cuda/tests/cudapy/test_blackscholes.pyÚcndr      sŠ   € Øˆs�Y¥¤¨¡¤Ñ*Ñ*Ñ+€AÝ�"œ& ¨¡¨A¡Ñ.Ô.Ñ.Ø•R˜!�r A­¨aµ2¸½B¹±;Ñ.?Ñ)?Ñ$@Ñ@ÑAÑAÑBñD€GåŒ8�A˜’E˜3 ™=¨'Ñ2Ô2Ð2ó    c                 ón  — |}|}|}	|}
|}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 …<   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ÚexpRTs                     r   Úblack_scholesr2      sÙ   € à€AØ€AØ€AØ€AØ€AÝŒG�A‰JŒJ€EÝ
Œ&��Q‘‰-Œ-˜1˜s Q™w¨™{™?¨aÑ/Ñ
/°A¸±IÑ	>€BØ	ˆa�%‰i‰€BÝ�‰GŒG€EÝ�‰GŒG€EåŒF�Q�3˜‘7‰OŒO€EØ˜‘Y  U¡¨UÑ!2Ñ2€Jˆqˆqˆq�MØ˜‘I  u¡Ñ-°°S¸5±[Ñ0AÑA€Iˆaˆaˆa�L€L€Lr   c                 ó   — d| z
  |z  | |z  z   S )Nr
   © )Úrand_varÚlowÚhighs      r   Ú	randfloatr8   +   s   € Ø�(‰N˜cÑ! H¨t¡OÑ3Ð3r   c                   ó   — e Zd Zd„ ZdS )ÚTestBlackScholesc                 ó  ‡— d}d}t          t          j                             |¦  «        dd¦  «        }t          t          j                             |¦  «        dd¦  «        }t          t          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          ¦  «         Œ'|                     ||¦  «         |                     |	|¦  «         |                     ¦   «          t          j        ||z
  ¦  «        }|                     ¦   «         t          j        |¦  «                             ¦   «         z  }|                     ¦   «         }|                      |dk     ¦  «         |                      |dk     ¦  «         d S )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k    rd|z
  }|S r	   )	ÚmathÚfabsr   r   r   r   r   r   r   r   s      r   Úcnd_cudaz4TestBlackScholes.test_blackscholes.<locals>.cnd_cudaC   s…   € à�s˜Y­¬°1©¬Ñ5Ñ5Ñ6ˆAÝ¥$¤(¨4°!©8°a©<Ñ"8Ô"8Ñ8Ø�R !¥r¨Aµ°a½2ÀÅBÁ¹;Ñ6GÑ1GÑ,HÑ'HÑ"IÑIÑJñLˆGà�1ŠuˆuØ ™-�ØˆNr   c                 óD  •— t           j        j        t           j        j        t           j        j        z  z   }||j        d         k    rd S 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
  ||<   d S )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ÑDˆAØ�A”G˜A”JŠˆØ�Ý”I˜a œd‘O”OˆEÝ”8˜A˜aœD 1 Q¤4™KÑ(Ô(¨A°°a±¸!±©O¸qÀ¼tÑ+CÑCØ˜‘Yñ ˆBà�a˜%‘i‘ˆBØ�H˜R‘L”LˆEØ�H˜R‘L”LˆEå”H˜c A™g¨¨1¬Ñ-Ñ.Ô.ˆEØ˜qœT E™\¨A¨a¬D°5©L¸5Ñ,@Ñ@ˆJ�q‰MØ˜aœD 5™L¨C°%©KÑ8¸1¸Q¼4À3ÈÁ;Ñ;OÑOˆI�a‰LˆLˆLr   )i   é   r   rK   g‚vIhÂ%<=)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   s7  ø€ ØˆØˆ
å�rœy×/Ò/°Ñ6Ô6¸¸TÑBÔBˆ
Ý ¥¤×!1Ò!1°%Ñ!8Ô!8¸#¸uÑEÔEˆÝ¥¤	× 0Ò 0°Ñ 7Ô 7¸¸tÑDÔDˆåœ( 5™/œ/ˆÝœ' %™.œ.˜ˆåœ( 5™/œ/ˆÝœ' %™.œ.˜ˆõ �zÑ"Ô"ð 	Kð 	KˆAÝ˜/¨>¸:Ø&¨µX½zñKô Kð Kð Kõ 
Œ•&�‘.”.¨°dÐ	;Ñ	;Ô	;ð	ð 	ñ 
<Ô	;ð	õ 
Œ•$•v˜a˜a˜a”y¥&¨¨¨¤)­V°A°A°A¬Y½¸q¸q¸q¼	Å6È!È!È!Ä9Ý�vñ'ô 'ñ 
(ô 
(ð	Qð 	Qð 	Qð 	Qñ
(ô 
(ð	Qð  ˆÝ•d”i¥ e¡¤¨x¸¬{Ñ :Ñ;Ô;Ñ<Ô<¸aÐ?ˆÝ”‘”ˆÝ”~ o°vÑ>Ô>ˆÝ”n ^°VÑ<Ô<ˆÝ”~ j°&Ñ9Ô9ˆÝœ¨°fÑ=Ô=ˆÝœ {°FÑ;Ô;ˆå�zÑ"Ô"ð 	5ð 	5ˆAØ9Ð˜w¨°&Ð8Ô9Ø˜k¨<¸Ø�x­ñ5ô 5ð 5ð 5ð 	×!Ò! /°6Ñ:Ô:Ð:Ø× Ò  °Ñ8Ô8Ð8Ø×ÒÑÔÐå”�¨Ñ8Ñ9Ô9ˆØ—’‘”�rœv oÑ6Ô6×:Ò:Ñ<Ô<Ñ<ˆà—i’i‘k”kˆØ�Š˜ šÑ'Ô'Ð'Ø�Š˜ eÒ+Ñ,Ô,Ð,Ð,Ð,r   N)Ú__name__Ú
__module__Ú__qualname__rn   r4   r   r   r:   r:   /   s(   € € € € € ðD-ð D-ð D-ð D-ð 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      s  ðØ Ð Ð Ð Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5ð €Ø€
à€Ø€Ø€Ø€Ø€Ø-€ð3ð 3ð 3ðCð Cð Cð$4ð 4ð 4ðE-ð E-ð E-ð E-ð E-�|ñ E-ô E-ð E-ðP ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   