From 0ec0e69bfecd39fa279ace7c6b9167e0c8f9ce26 Mon Sep 17 00:00:00 2001 From: Kevin Date: Sun, 30 Jul 2017 21:06:53 -0400 Subject: [PATCH] Made program multi-threaded --- build/opt-pricer | Bin 18816 -> 18192 bytes src/gbm_mc.c | 100 +++++++++++++++++++++++++++++------------------ src/utils.h | 1 + 3 files changed, 63 insertions(+), 38 deletions(-) diff --git a/build/opt-pricer b/build/opt-pricer index 8507225aa5f8bb9f795482e35c3924c686924835..a2f084fd4be8383b21babf532f25066079551294 100755 GIT binary patch literal 18192 zcmeHPe{@vUoxg*OL}Yvu1e;QjCnh>j6B3keM3EVifj5VYjV6JNLLNghlgW}Fv-1PN z0>;L4nU2%V)>=7xicQbf-RyewWZTunAHc*YApVLTcSX@dRH`qH+87m5wPruxd+#KZ zLEQG7{;_||J9+Q>^M3FBe($~Cd*7Xzy!82pU(I05bRJ{v(->n4?h!L%olFJB*tcRnG zBTa(wz+JRTUTVBZn#KvnFdr+Vq3f;9dU!|6mbPX+7zv%zUdkMeH!7dHs6Q`G5rDeh z*f!YDGVvJBDb_Q>CFO|jSDjd&*+nej_Xdv+c~ z#)wYu*U6Fs)AcRk$ysr>zigTCcYa#I^!CYWCZv;jq{4OMI%l~nl>_V<{R)~cD>;aZ zK)S6(jJ2cbjM+u3t$>uDQdg}Vc?JdA9gH0Xlg3&e?#-(iy8|I2ge|2_E7=y*Ek)=m9>x{8#Ackzy*_;l>DnxYqI3G*9xL*CR6^*dbfiA0vee8~n z8P~x|Li~ zjsV8vDTWq%-3V~r0V;2NiGu|#aeyou!5qSu_rV6nWHHyW{0LMB*EMOeW04scYuh=C zikOJD1VAHr_jZE=D1%_#CxT#2*ad&(AS^=uK$6p*_klko-1Ync_#@=vsNy+;`v7;l z9L5HT2_zAa$i0R{_5~&K07H05=b=4^O@cpcdXBtkMm=+C9$0>!KWNDtyuSU3A%Gczz4)rc89JW20k}qt2mk>Ni3t z*ChK`4ji0J}q2zr6I4e!J0C-p0Mfp|h_`r&x>m2hd zwx`f}N!;cy;LfO0+XuW~+3@VBa?^8urP{KQ$M>lP??OBcfh{Bif?>Z>^SWPI{}%M$ z!2Kr59*4bt!>^Dbk8=$9-zwAp)cnu$JJ0Sx#MBl0%GI&El--fzI zxbl;Sk(=FdzkSrHSl8$H%az47U4+-Egzux(fXEy9P)zWl=}@d|ipgsWdF@ne!?0cZ zA$&D}%pQTCXrI;cp76QP?@(+nk187n5WbVJYBSHLf)1tnIMfP$2{ojm_mz8+sA#?nT>Spc^T{Iy_6py@O(4|vG8Kxo+@qFM=WEn>C=d4hJl=vOu- z$X{v`xeED*eno$Q+D5gayyZ6*#8Ih52xW3rJcm)q(~$MUCMGaV+B)-3xt`VCE0lBH zh>J~n?dhamgrJi~iP4YMhT2DN@OUs@cV=63%THhviWFHM971f)Bq$k_#YEUTDUM{F zy4Uc*IvU5fS7@jcA@Mj73f(-8@WBoD{!|n9YvcVD*M6bgUBd%nB58;BXTv&IUEVz^< zFOlIcXw;BH2x=YAgy1@Q2Y(5MRzhZ*^tDtI0R+kX5MqgfG+m7Eik5F8RZ6w)0SxZk8#U29 zplbrMU9=0@h|aB>dw_ZxqV<*BHFO7NtgVym0q>*+!5TNTJ_rd$)W$wCyJmAmYy_(w zWoTOU_?o9I%-ElId{FC(eR(K}%xbh>fb}xw#EXq{{~&)gRXCPq^Z< zPNGYu_l+kj>PKAhiu_V7c2w&dTc!0GD>W0L=ee#uto*Fcsg!@FJo>EZxsES#qK~^` z<@u$LA(3JSv1vbE^|0yxM0>y$FVDAXu`;VGUY(z(#j5hOxVv48t+Q9eqe*w7bvrME z_6mJ1*0G0d#O~?hrrdk9Se)K$T#17tT(E18EJ5a>PM^g=J%>Qty%*}mK%pMsf?a#3 zs&5zS?Lxg9>h#$g)CYxn_f+)}p-wv?Snq+liv2XyYXP*_uAZst0nWWANFeU+h5BBh zJ|NV4r>YMMbwj9QlN`5VT)FN%tN}>XGZTTS1rwfbCY3n)6`=wu2Ht1*bQl8A)-jL^|<2g$!e@$OpTYHXYcp1GU-%lOmug z5m2kWc2Wd1C92ip_EMJ#4Z*U2NtzSA6MM+ov`u$c7e60ZUxh7frACJWKd>4WYJTi6 z@I1o=ydri+iybzOB^N@0mTwQ&q;;SyhsyL2W+O#Zu)(|-EimZI z0mOk!DA1zhaVCu?FgdxPJbpD2`4ZY69)$r~S9lZ3G@=aSr%-fsd}WH{&_eSxynv~) zN~%jmnX+QCLM1JBE~7;bORgwfBWnSfTNaRI>dX(zR*@=S$WYJc>8iC8?(+>C--6JN z*)xEl4l(PnCm_|;j0H>_(Yb6yq1dQmIX1mD{pnwZR*c>KdY+byP2Y+%6-^W zRGW`;*Xzucyaua9K;El!f6ZmJ$1vCsMyus|uHyk+Ybi~`uSvs;)9|Y%@Lcx@nx3R! z9Dz~ee%Wu}TIa3=2a$u>jYpM7ab#!tEw9)!3vr~{J(hP6JgD@^V?TM`Me~)+;x<$E zH`a2qb>=5f9-fn&W^-PA!D8%HI!{DaqCT?)IK`MMH|I#gFfI{oGT+ZTs?KTPJ&Q~` zM}}TRe6c?O4u604iZK_5B(=$I${4#SPNm@gl#A6=Y;);u)7KS1z|rVtd}r4 zvkW{*SSw-A64pT23Bqn6Y=|&=6A6qFwuZ0^5W}JC37bdQGGLIMb$RT9HF!wC5vetD z2hpV$?{>^;G2j1QD$k?eHBs}S2fMK{`r#S zuN>Na%Lj+m?+>gpUwL}rJ(lTqd{YfgKk1P6nOab|Y;imfX` zE4Hm@Sm9f7(Plp4!iZz~#ofBH zq@=k)jDf!_mNQvl_$myRehI_uW#`6|Xjofr9AJv4tjTq2v z!AK$Rg^+qHaAcWqQBlz*#+;!LTG!O7Mgk$9w?VDPlf+b>)?a)C$G_K0%Ntz;v8vN$ zGU4y#TC<71!)^zIZuA{S5Vy^8FI_NcbBGpOo;hgaZ=3A>kO8M32kOw9#Wsz(IvJuEeARB>f1hNsxMj#u3Yy`3q z$VMO=foudA%Uz^yzSz;8lSe1$xN_|}{UqL7zg4dfY}Fg1-cSR(DP--k>p0i&h8kIy zoqpEJe>Sgg!7sn@GxzpEdAvMsqAwEA6;d-S`Mpietc!(g;5Rh+{gI{?AJN62am+$! zDbPk=1oi06ZTN*cSaz_Q+c>HLZNVu|TRjOXiQ1YnQVS~Bb{h#c6N(?WNBl$uh!RIH zIzM{hbq3S8f7{m7N}Ah=7mb7oZ#RJmd0QKZ*h56v7eU3|W?sCDb5ioXoC?=_TX~J$ zoQ#Af9PE({oC*n#dx;?l93JTS?ePq~C4eaS>Z1`K{&#?vg1VY}!T*y0TN7gITD)jz zOCt+y3AeC+F}1dZ5DoUAiB5~oW4)K-+z18r2+o^XAlj;@pP~H%|KDMt0BR!zP}|bN z?lO6!;V^fhA16j>%IrQ9`xU7dLw%qGkFJ&Uz-KMf>Kpv*F;fuFgU}dR2Y%9x$DkYa zcTZCXXSSP?7q(w8XdW=BXcjIH4rVUG=S!*IpEnYX&)ZVJACF2pXPG!h>5#Nl(p{3y zlQem&n5<-)pG)D(;h=FY2LA#0@2rU)yh6|bT;6r5pua2WN_?_J`qxRCeqT+rBSj-n zL{~^UDeY~Lbn5?1&^Zm&Hz3Qmrf6xOK4^iMO!4a<@l20WY8~U z(Epu5zm-A1lR^JJgZ?~&rf>eFxBsFHdQJwtFoV7#gD%RT=?l8z4;ABDok43EG>rs= zo?VO^Upr?w=H$QMr~i#W|8rm-Zu~TWpR+Ci#4unBajUp5!@USMh7QZejV`Clj^kGT z+xWkxZ597P;_Nw&f3ncR^u~#~s5fG6(j$FBBI{x1>te#w6qG2iK1dOQVh6K2giKZlAQbHynnUF|+?aYLR zAFZi_zD$R>Y~#9gvAbApU%FZ!-qp9u7Po{SO1iausa?Bttu=MA-U!x+ztUEn_w)VU zb0(8v#${&-dr~p6@yLoO92elY3YBR%d5r36-+NX9Z!^E`v$-U5J4) zMkTFOTqX>miEG7lP;zk@%pqv!6r7Nz70i=zIe^n}m1f(7(rkk>3eLC5LP2SUeWUUw zlOeM<)Niy=1qHmMMEc~b+d~+^rYUfOoI%nO#x=&tJ<=POdgD?r0i|Q(5~})A!-qn&LB^9h;Xe`Alc4r?aEGuiw*Oy3Dg|i8s{aUCi|+`y{*O&h=c9ilYXMe4dSq z`T+5td${=X8@@C5g^#|rb>G4VZg}eY@u!xMuDX!@qtpG6ydsVCEYP$x^j6T)$&X~9 zlT+#BFV8^l%wVTI1ATr5J0~*8{}%KDT&d}L5VTYxa90NV=fO)?uZtPzb28XDl0p87 z4D_F8pg)v>z6^8?S8BQg1TB>aycbuxdcBr`eli1Hpucxf_g*Iam9M$W~9Q9O&;AojqGb zZ_gJ*=r4j{Dzi7-9t|Wh?RgZOt8>A`}j`g*&>y4+ncW)79Jw6%h)xG~9-_M$%$t#2;jxnjA*XLoeu(}=Sg zIHfH9vt>2lwtNoDD}Em`WQ&r`&ra}1Khwl?8f$4xQOQc8U#^INg~d&b&A?r{z_^w~ zr*TjvcM@HV?Zhiiq9>*(&`Xo($>YC~M5nS5;nehFO^kn@aBA|gYR1#Fn$N&)YZp|8DB{_b@4Hc@#Tb5 z7Z`IfzL;=o`Z2-yBEqT3$HqSap=crD)YN06jL#*Unt1FC<5v()O*=Ns_)NmDB>XVr zi;FbTwhuU`vb)PR{PPTC%hs3GmPJ2WUt>n!UsVz}zkI=sAo>QM(a(VE8+=kH9rJXB z&cSarW7CS2M9xgaavE1dP&@R6z)b(TVDY%2Y1^xqSJKB4?xI_R_J-=V1?dKITz)6DOc!R zPyy~>ei{W6!)ELej!LU}(|it-^ZqNR!NQkMQB*f>Dr+d)RMuGLKM9*(Bb$Rue|#0f9K8tZ z*3GazwjAZR?E`Xhxsj-sbdoiS$pPmt4G>#6lS3d|5 z&J>eQ^cj7hgqqEGNZ-SRC-wbAFr7Er9RxZL>4lQz1~k!esa!A~(GL*;{gs-`9DIZw zV@9bh@wk3iWejAjdq1MCH)jbuIwl=_!)hmT^lhsbPpKJw)!KunA0eDOSBPUYa9Gzv z014)@DvWMJWy%c(s+pUk-Wjvx!*cm%!C}^+lA|aAFXzL+p z!(Is5~5#;5lK<%jZ(cfV17)*s@;u>?jm1YVV%Otk>=E6fU{Y)J+nK%k z89TFEZ$ie>V7Fv=Z1nf>xJARy*m26;@moBbUgv_{FoU7vt;*<68qMfyX5`#>b#3M8 z;n9T#hRox=3{DTvG=#MUD(~6P^O5TpH;MJ8M*}b;6Am-_`nGx0f;^oTY&u4a_$Y*J z`y!@SBkpqA&OS5cCqp-XVqfnN4FmXwXU2zXmPu z!feGc#yC27?Q8QiVZA=VPvU(AG`jHk9-9TpF9L^9O9QP{FT}k; zcUeFBke_TOqbIqc^sjgnPe281*A zFssd3`$LW)e5|7w*6IdwHN_X5jrrqPcmnZpTkzer)@`lCBnX4$XgIb+=IsZ1(JbUh zwf?xxJ265990zqR8n+G}a|Ccl`POf-BuHZjo_vZSAB`Wdgi`9rC<2Nsnfr%ib7s^s zBhO`-x0a)qk-1A;f(^R^mO2Ni4Y0Hr!RipU8g%NDqp&@Vszw!J|EZ8w$%TNvi#i`i zn0(h%Jj1k_$K(&A?&V_JC0Rss)n`Jw%9@y?9{8#z%QfmFdt%gH-VwIEt&@k z#>cnOto7&7zg|M~yMKf(@UMVB1M#O=qWrt_zxxqIQW^Waop}pZZvP6Giav~p;tqFk zrzYy87RKGpcdDpowJp1gIs-TcXu0cbuW1rO2;A1+zRQJ>ZOl}-Ut3HPcyzbIYU4|+ z*^b;<(w?of>sXt7g+K#^4ug?t`Ctv%X*&EKhC(a3=JLFPag9t;H)|Y)>Q;D($qatE zY)_tpRx3uZS!{r2K{HAvhPlbOfX4TMqY&I%sov;S#R%AsVe)lo*BJ1Ip3*Rdpz&h_ z8Bc1XkE%_o1#1z1_X|=8Wq~|O9J{r;ezkyzkO1XcI0@&k* z|A45ECg?`c3O2T5uWoR7z_}BmjI1Hxlq_-7x zQ9NSnFVbkbz7&fPU+jxmlJ({JVga`=wyD?`TW^?yD`#L1@x`i4Uu;#i8T(?L>8v~f z4VM|~YcgY1?Y>x-W*(o&@kMX-MMHUJw8mvdvDSu6p)a~s^F>?SzUancGg@Bii`E#v z=vvbkEw47CJL}A7sL713MGMqGc4sdP^qbLDkb7bu>cneyU-Ys4$orxP4iYIEImFly zt;u}R7|o+*bZCG8mlzpl%Fz)9PoH5BJIi2b4*_};@I{Y~BJYbnZ83O4Ac!a`4*=%I zS&k}jfELXtwUGHk8iSadL8O>@N2vkK=+g#+n8{#hg6$rq1ujadWAH>TgU9+w#CGGr z0Og~RJ{=aU%F#m%o<7VVc7(xDI{{g%VdPQX2!kg^89Zi@Ky>H~ z0XBDFoGFnB<`2W>G7RL5yD4VB#z*94!WhQfQ5hwxT6EVpqrD zKobCagIcvSX{eV$te-(-fCQpP_b?bT2*4>6wT~&W{Qzj6gAATN#Ka+!fL+HYhMDu& z2!jJ>SRiti!O&p>T*skN=Ep1sk#Xi9onY`ZcK_f*ERVs^5f(Y>0)|=@GI*jGpfdVP zRIHQ<2Mhpn@Blwc(ee>9MhlndP7A&I%rS$Td+k|t?NM~=adhhmboqnm+J~&Se-n@U z25)y`HBuRUj$ha-qo>Zhur8>KJl|Uxc`mQ=mS2XKlzc$%fzjV#yTFiq+j= z%!4Jvyb@I6)-S+@PTvc@SQu^$V%24yUR4S&1O|@WSD*q}BeCACjNPWwI~7eod6kh< zdDiz}f$Bg*F|UbSCI+zj5e%AD$Q01cWnvJtNyrpb;pQ@%6bYGvD%@NqMrB)yhUY5W zTxPo>AyZI=o6D>-V@9c&wW_r0miH7F!&*UAo%8+%tbWOxLhKYwcgDWF219)MG5K8-d6vi13)~%D)Y4>+}V(kEtA5m@x97ho!S? zC)v!OYZuC^i^emcQ1O_%@~nNVhIMa3%@v|`$D82uG}K_(v)ZB@Sj3tdQ>x4Q2Xs=P z2oadHWZa4JXqAHnOd%K}AeFn@oOkDrW7iF2ULn>`)2-3-X}m5jp&>vJ$1 z%c1#S31Q+vlop-A_y7_dXdvUwjZjX@rC}L@=fNw_OW3kQ_#L~@=dH)zlub-_v0zWAaqFSO z6j}xBK82T~_|}JKVHqwo=DwZB4Z%*iwo)18byN*E`A99b+O7((uBfG!*`@8G(9};{ zQX1&iWA+nnzj;yb<;dhe$wk?H%jTN+!fLxt_G+9>N$zY)dAZa~h>*R3ME zF8rjhfd<6ApoZ2QrL^Wqyq{XwCloL^XDbRG6L<%i()na z@R*T1n@e$BP7!8iBi<$5F!H%!s1EPIu2TI8T8D@mtZ42s*hP>E(N!Qn#|aeD)L^r9 z>)X=gacmTUJDUbw7;41g`ExJ|V+$ynuQ@ew{yWkis4e8cLj3$gM6|8|e*R~?zKzCd ziR&9I`qoShn>T|Vf;E-V4=STC`EGcf+Q&TpagO!(zs8hs|65_LIqgmTz4iT)u62>+-4lYxvCC5)huP zY%Lt@*cuQu3=}6woM2l}tm_DE^|S>80WC-$Zav$G(b3i0*%4^qE_30?RdgL-ugkg4#ypsU)x0yJ@DFxuLnUkBeqMms69> zyiA*tc4;eXw6gBz&h6oj7LBp0o^I5?ygAs}qwRvc=TAwH-&MQ47jD^UmsV6#9MWL9 zsN^PsBtR`aMZmkbO^Vn#5?aL(w#A^$Hei!8Y=pZ-f?rac&Pbw@K#pC3P*IWXjm(lQ z)kik;bS}><_NTmlW9FLFO!jsJGC8r<^(7^pt#&8)(}GFgPDSbK z@wjpB|Lx_5%{*LIlHDUo`8`Q_RrY|SwL`Bi$tM$e@{^PCmxi6GH&z9Mc&t0RHT!ob z8voP;k11Em7Q%gW1!YUG{8HK6Em_O{{x8~Ac*^IWe{I>^74NkF=bryHaqhFv{>#7r z{MB7A-@bG9Q)_;;V>ip=S9B5%OPDY?pmKPfpmeXoe{}1;ZGU(0gB5#s-u`Xl!+%@h zd362C-M=4Saf>hO?)k=tEAIZ)_tww<{s${MX5aQg$bXgdQCYoq!al{fN;6*vl6y z9j?F3Ug;=&FlUWJ8=SV%;oh5D;V6D!dYPj%GNZ~dIxS~I)=WofnWMPO;a=&`APb$9 zj=Zv2IeFQRGr8HHIQHab*E{y*u5|3jbuf23v}AeY#|2z&_z@vmg~Q1Hk|Xa%WT&Bi z2SHy-e!%|+vdbKW5%{q$E9a`*nT|rx${cxX@B$}%xM&OiFy7hDlJQBu;gj?mK1#oR zj;5S{oR-0DXbUQTH|!bj#N%J3HcT$RI_I98MDc5>c#iioRQ`MM_{&7#c;DgBvVY7@ zQa%3-{NDHDac&^f;i^YtP&pSs-vc_g=VUpEa<-Kyri_c>Hl2^Yb?Ae5JV514)^k;& zo+j1PwA;rBrfVC!{bA<}>;U{%N{N70VAvD|CI7vJHvQ)7Y`9XwyCiIouuZ}~2_Ka3 zQ3<~*;foTUlkj5+g>KuwMnYXeuY{!%R!WHPPa<8)lEhTlmqLG3;+IQkTxM`i{nqQ; zLK|1Vg;Kw#rq@eKa##`gO#!E3d`6{2;}9jqfB%zs58?Z>4FdS(o}Jve24|*A{7ANq zt9gi@4e;!z0AsI|!zaBdNe;L80bLW*Ro|v@o01w=@w&uG{T8fghQYX^7fW3EU2Kcv zckp&n<>Q5#>vMRz!3<0~j4MCJCEhRjQvLrMP`_hObzqxp?*}A&Si)~f_+1H~m+)s2 z{#wEhB%D6eVAEGg_~#NXlW?_!8zgL#aGQh=NcgaX-;yxZ-%R-L78=Y_{awk0WX8NM zJ%6j@Z_dCEO8(9a{B4r|KQi!JCI4&&en9dUWO$BSB!5W;ey`-;m4V+b`F{wkDKB5H zxz}&*>kjv6OTA0H#hzt-jFo(;WSO^kiFe5jHeFj>T(YcqS@A7@$RzggvvBUixI``o z@8-2>={X{tmOd>pZX_F{Ukj`8Vk&*QP~*x}`V5iodCb8mrJm!d@|OuU9!#ar6l&a< zN}nav_&Jq+xoDEl$y9p2IGm=R=U}xuoR;ns=N1~tCODsiUonrTr5E6QNjmu}ME?!x z=vOAr%dla2%faZW#`UT6If8yRlbUkGRl-P1zZ&Oj(#aPJ^?U1NTR8%=jvUXY(&vid zwDfs`ejb#XauT!ABqs~mY2uyuB*o6rJeVaetryLI*=UymmthOaJI#YcA5NirC0!I4 zQql$$09j(vPx6CO4X&&-aozzs*-xxXNEqn>Tv_7M_WCC1>FV`QEI-*Uhk;Z2M_gH$ zy+>s{4e8J^(9_u&$v{7wfj$a4)z^^iG7UJT^SFp!D(QJl#ZPJ_y*P#bdr5bv&@;7T zHW*nr5u)8_NXs^GG5yl^C2qR<(m5T0IH&f158Ju4KQEK=YMn&dlq#8i>GRmYb}sGb zLC~*2yN@n3NF9B^PWLfgB1z!yK-ZFRmHitiYG~io=jD4D?EH}F4slTSTeaSK33M0i zq&{D}SpL#+=@%L7(--Y4lygb20Dh*UU(a-hsJ_BrX?`a}?q*4MX*T_3=Hm4$gPnC5 z=q(xO_hq2}HRu$F)Odaa^aANaGWagrafsgewx9e?34!l{t|be~{13=Z_FOR{pGPI~ zGqyiD&a3BW4%=5!lkjz>quhlC6V*E7{S5N-6T5Wrr+pF^o>NmkcdCQ~(!M%Bs`fCh z&0wd5=@=(vzlumh^wFN|r}isf20Javj+`HPuL8E{FRZD2Kw9F zE|;!DB21rZo3NYMjzjFb+F&N{p-`?R7!HN|+S3$FywFU>lZCO_{1YwnHTe^FuN`MRf8j1H7aoYkv8yL2TLFf`v9Um zusBs=ThwP1?sJr_${6 zkW*>Y<0c~k)0;yf>1pC@=2Q(nLFrFA#5u{P^OWkq<|LJx!47aQ1=!xX_tUA+sWRzK zqi$*L3)v?_`Ov7JKj8WOIMk{-IGuJ)dt8-{s7@_F9U+}cMFfQKhPHQwn>Pc7gEnke zIh<7u1bcIqX>Hd}bn0fZN0U>C+U9$Wu!ZuFjksW`C?RPWWL z7}qJO{Wcr3WmTTwb+~AcONuAnzt#UO(7;PhYJH(-CCDV}tM~MJv(S zD*q)}(0d@oROzdIiDJ2NsrD&Tq+I9G?E(6AAs(_MSYW!dcRfw zPb5`76@LjjPFzY~y-yc=$l7Fov$0F@Ux7jXD}A-^RQgBi|2joq?N1p}|F9}pLM;V< z7r1&hiKX_j68|rToI_I0sOqoUaX)y;{;U12(a*5jCGD;B75pegU#R!PVq5=+4H9>y zr(iA$PcC1*zYa_NCh5O2ps9?6v%n`?D*o#IMO$nOxKrd+xr%J>yI?y{5hPUlYW!4e z<&J^{V5qW{48bjija{PzZItUOvkZux(#4rxC;dMw$DswF-hxZ{uZ9I;rz^ksHZ~(} LPI=%`+!6l=#qfwA diff --git a/src/gbm_mc.c b/src/gbm_mc.c index 131fdac..be052b7 100644 --- a/src/gbm_mc.c +++ b/src/gbm_mc.c @@ -28,14 +28,15 @@ double gbm_simulation(double spot, double rfr, double vol, double tte, double ra void *run_simulations(void *opt_ptr) { - int i; + int i; double tte, theta_tte, expiry_date, value_date, level, rand, df; double delta_shift = 0, vega_shift = 0, theta_shift = 0, rho_shift = 0; double gamma_shift = 0, base_gamma = 0, upper_gamma = 0, lower_gamma = 0; double price, delta, gamma, vega, theta, rho; double base = 0; - - struct Option *opt = (struct Option*) opt_ptr; + double max_rand = 0; + + struct Option *opt = (struct Option*) opt_ptr; if (opt->sims < 1) opt->sims = 1; @@ -45,7 +46,8 @@ void *run_simulations(void *opt_ptr) theta_tte = tte - 1. / 365; for (i=0; isims; i++) { - rand = gaussrand(); + rand = opt->randoms[i]; + max_rand = rand > max_rand ? rand : max_rand; /* Base scenario */ level = gbm_simulation(opt->spot, opt->rfr, opt->vol, tte, rand); base += max((level - opt->strike) * opt->type, 0); @@ -59,8 +61,8 @@ void *run_simulations(void *opt_ptr) base_gamma = gbm_simulation(opt->spot, opt->rfr, opt->vol, tte, rand); lower_gamma = gbm_simulation(opt->spot - 0.00001, opt->rfr, opt->vol, tte, rand); gamma_shift += (max((upper_gamma - opt->strike) * opt->type, 0) - - 2 * max((base_gamma - opt->strike) * opt->type, 0) + - max((lower_gamma - opt->strike) * opt->type, 0)) / + 2 * max((base_gamma - opt->strike) * opt->type, 0) + + max((lower_gamma - opt->strike) * opt->type, 0)) / pow(0.00001, 2); /* Vega scenario */ @@ -91,45 +93,67 @@ void *run_simulations(void *opt_ptr) opt->theta = (theta - price) / (tte - theta_tte); opt->rho = (rho - price); - return (void *) opt; + return (void *) opt; } void gbm(struct Option *opt) { - int i; - pthread_t *threads; - struct Option *options; - options = malloc(sizeof(struct Option) * NUM_THREADS); - opt->sims = opt->sims / NUM_THREADS; - for(i=0; iexpiry_date; - options[i].value_date = opt->value_date; - } + int i = 0, j = 0; + pthread_t *threads; + struct Option *options; + double **randoms; + options = malloc(sizeof(struct Option) * NUM_THREADS); + randoms = malloc(sizeof(double*) * NUM_THREADS); + for(i=0; isims / NUM_THREADS); + } - threads = malloc(sizeof(pthread_t) * NUM_THREADS); + /* generate array of normal randoms */ + for(i=0;;) { + if (j == (opt->sims / NUM_THREADS)) { + j = 0; + i += 1; + } - for(i=0; isims = 0; + if (i == NUM_THREADS) { + break; + } - for(i=0; ifv += result->fv / NUM_THREADS; - opt->delta += result->delta / NUM_THREADS; - opt->gamma += result->gamma / NUM_THREADS; - opt->vega += result->vega / NUM_THREADS; - opt->theta += result->theta / NUM_THREADS; - opt->rho += result->rho / NUM_THREADS; - opt->sims += result->sims; - } + randoms[i][j] = gaussrand(); + j++; + } + + opt->sims = opt->sims / NUM_THREADS; + for(i=0; iexpiry_date; + options[i].value_date = opt->value_date; + options[i].randoms = randoms[i]; + } + + threads = malloc(sizeof(pthread_t) * NUM_THREADS); + + for(i=0; isims = 0; + + for(i=0; ifv += result->fv / NUM_THREADS; + opt->delta += result->delta / NUM_THREADS; + opt->gamma += result->gamma / NUM_THREADS; + opt->vega += result->vega / NUM_THREADS; + opt->theta += result->theta / NUM_THREADS; + opt->rho += result->rho / NUM_THREADS; + opt->sims += result->sims; + } } diff --git a/src/utils.h b/src/utils.h index 71cbe2a..1297eb9 100644 --- a/src/utils.h +++ b/src/utils.h @@ -21,6 +21,7 @@ struct Option { double rfr; double vol; long sims; + double *randoms; /* fv and greeks */ double fv;