From 9adcecd3d03ec9317f5fd4870a371fb6df368ff2 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Fri, 27 Sep 2019 11:55:51 +0200 Subject: [PATCH] corrected typo in NN slides --- doc/pub/How2ReadData/ipynb/How2ReadData.ipynb | 2 +- doc/pub/NeuralNet/html/._NeuralNet-bs000.html | 2 +- doc/pub/NeuralNet/html/._NeuralNet-bs029.html | 2 +- doc/pub/NeuralNet/html/NeuralNet-bs.html | 2 +- doc/pub/NeuralNet/html/NeuralNet-reveal.html | 4 +- .../NeuralNet/html/NeuralNet-solarized.html | 4 +- doc/pub/NeuralNet/html/NeuralNet.html | 4 +- doc/pub/NeuralNet/ipynb/NeuralNet.ipynb | 4 +- .../ipynb/ipynb-NeuralNet-src.tar.gz | Bin 88051 -> 88051 bytes doc/pub/NeuralNet/pdf/NeuralNet-minted.pdf | Bin 539810 -> 539817 bytes doc/pub/Splines/ipynb/Splines.ipynb | 394 +++++++++++++----- doc/src/NeuralNet/NeuralNet.do.txt | 2 +- 12 files changed, 304 insertions(+), 116 deletions(-) diff --git a/doc/pub/How2ReadData/ipynb/How2ReadData.ipynb b/doc/pub/How2ReadData/ipynb/How2ReadData.ipynb index d1042e0d3..a141115c9 100644 --- a/doc/pub/How2ReadData/ipynb/How2ReadData.ipynb +++ b/doc/pub/How2ReadData/ipynb/How2ReadData.ipynb @@ -2986,7 +2986,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs000.html b/doc/pub/NeuralNet/html/._NeuralNet-bs000.html index cd4cca246..a630850af 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs000.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs000.html @@ -375,7 +375,7 @@ MathJax.Hub.Config({
[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Sep 18, 2019

+

Sep 27, 2019


diff --git a/doc/pub/NeuralNet/html/._NeuralNet-bs029.html b/doc/pub/NeuralNet/html/._NeuralNet-bs029.html index 83351440b..d4d743b53 100644 --- a/doc/pub/NeuralNet/html/._NeuralNet-bs029.html +++ b/doc/pub/NeuralNet/html/._NeuralNet-bs029.html @@ -372,7 +372,7 @@ $$ and recalling that $$ -z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_j^{l}+b_j^{l+1}, +z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, $$ with \( M_l \) being the number of nodes in layer \( l \), we obtain diff --git a/doc/pub/NeuralNet/html/NeuralNet-bs.html b/doc/pub/NeuralNet/html/NeuralNet-bs.html index cd4cca246..a630850af 100644 --- a/doc/pub/NeuralNet/html/NeuralNet-bs.html +++ b/doc/pub/NeuralNet/html/NeuralNet-bs.html @@ -375,7 +375,7 @@ MathJax.Hub.Config({

[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Sep 18, 2019

+

Sep 27, 2019


diff --git a/doc/pub/NeuralNet/html/NeuralNet-reveal.html b/doc/pub/NeuralNet/html/NeuralNet-reveal.html index ea9d4665a..f02cf456b 100644 --- a/doc/pub/NeuralNet/html/NeuralNet-reveal.html +++ b/doc/pub/NeuralNet/html/NeuralNet-reveal.html @@ -148,7 +148,7 @@ MathJax.Hub.Config({

[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

 
-

Sep 18, 2019

+

Sep 27, 2019


@@ -1119,7 +1119,7 @@ $$ and recalling that

 
$$ -z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_j^{l}+b_j^{l+1}, +z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, $$

 
diff --git a/doc/pub/NeuralNet/html/NeuralNet-solarized.html b/doc/pub/NeuralNet/html/NeuralNet-solarized.html index f0a37cebb..bf649ab94 100644 --- a/doc/pub/NeuralNet/html/NeuralNet-solarized.html +++ b/doc/pub/NeuralNet/html/NeuralNet-solarized.html @@ -261,7 +261,7 @@ MathJax.Hub.Config({

[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Sep 18, 2019

+

Sep 27, 2019












@@ -1143,7 +1143,7 @@ $$ and recalling that $$ -z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_j^{l}+b_j^{l+1}, +z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, $$ with \( M_l \) being the number of nodes in layer \( l \), we obtain diff --git a/doc/pub/NeuralNet/html/NeuralNet.html b/doc/pub/NeuralNet/html/NeuralNet.html index fc7153615..99e3c4d63 100644 --- a/doc/pub/NeuralNet/html/NeuralNet.html +++ b/doc/pub/NeuralNet/html/NeuralNet.html @@ -266,7 +266,7 @@ MathJax.Hub.Config({

[2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

-

Sep 18, 2019

+

Sep 27, 2019












@@ -1148,7 +1148,7 @@ $$ and recalling that $$ -z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_j^{l}+b_j^{l+1}, +z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, $$ with \( M_l \) being the number of nodes in layer \( l \), we obtain diff --git a/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb b/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb index 965df71c2..cb077d392 100644 --- a/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb +++ b/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb @@ -10,7 +10,7 @@ " \n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", "\n", - "Date: **Sep 18, 2019**\n", + "Date: **Sep 27, 2019**\n", "\n", "Copyright 1999-2019, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", @@ -1201,7 +1201,7 @@ "metadata": {}, "source": [ "$$\n", - "z_j^{l+1} = \\sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_j^{l}+b_j^{l+1},\n", + "z_j^{l+1} = \\sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1},\n", "$$" ] }, diff --git a/doc/pub/NeuralNet/ipynb/ipynb-NeuralNet-src.tar.gz b/doc/pub/NeuralNet/ipynb/ipynb-NeuralNet-src.tar.gz index 1b24f3576fc30cc6b2409c8d74d03a58fb988af2..b857d2225d17e8611671ba86d94452f9ca45524b 100644 GIT binary patch delta 21 dcmeyop7ry3R(APr4u;-4y^ZW!*%{x20{~;p2!;Rv delta 21 dcmeyop7ry3R(APr4u+?FO^xhZ*%{x20{~ zp2c&_*ObA+7eKF!$g(h!BaAwJ2wr>1LpXHpF^JfWUp_4_dgQaP8Cuvj(rgvBP~d#d zJLzRXxm;rQ812{JADD9aVY;M8>L#ujZfClbUq?F%5SK;4j-z3w>dzAO3a=s+oq6n^ zPYBwf63mm)U)gVoXT9aO`?}h$H(#gN)phcTayT)DWmc8*6elZ=ne-J*7)F3lM<7Nws+E4bg0Fj~q zku34Zb3z_J5=7tksih_gOMa$m8NxP%epUGuwq#jELI7)7L6I1MQC3T&G-0yU?@}|V z;!~~qbtaEX>giV&D`H)=I$DRSF0{WiE8BeZg+6_BvT`=1=3<+1gZ_NgWv zLYq95T4M&rlelG*_R{bvuc@pyS}BnlfyOJ6cx9zy233j(4x+sRTo9=X=h$J zkf)Ssm4z32iS4F%N5EX)?2cg7ZnsSHP^n1BlJ&+enew2_%q&*Q|Mj`p%A;qv5|&)? z9?L?IGs8!%_Y=N|!zlYyjPa@C_{*UGE29C!?N zm1b4pa-)nfpqGi47b$k!28LHI3$@AIpwkfV-t-&MM4?}ja^zO$A$U(oS^M#QNnxc^ zwuBX^Pj5eT5YWrHIK?5DEEq($6k*>flbWVT@uXS>)6FZ|v_Mm+H$>hA zI?cRpP|=4O^YGsPF~*J6mAno)4qj(xxaIpc1NWr3&_hX=(8-+fa^c~f_8ra2dLF}r zdn$kp752taVCGu}t@onWQ5C+K&-mbA{eLY zZSlOD16$^f9pIOR8~3?P=x{_(e=ttzeGwxbLLj!+T6Qd57h`_rD%ts=_z$?(AEegq zc~VDXDQVp`)J8+T0O}Sds0Qsl(0Z(|dDB<$LH82Do-uVn_r7YROZKgjh0v(wTt4lm0|)M5zqQa9T^~BO)*H<> zL}p-*u*mWK*h%7-CxX$g)e(=A)IhD@VVxk(%yAYC{ohdv>~a{;l)Vu)%o@ADyRXYM zB(y@f0|--0lU(j>#2 zmkaWw010h%bterYK@M`m;hpr9`%fji-GM)YiSL19gHM+0e&)O7L)G6Ss&Zl)CgZ zXX`OHc9r>n7taR;R9EG+Guq?gS`1*7lUYs^!Xkh9GSL#tvT!1|HHEdmC0A9iA4m1i zT8c@mlm5OqmtL@x+Buvg9QW{bVovj6z|e2?ldRV_csopy8Jrj2;}=u+3-T0n`ytC_ zfuV~g=n9I`TO6r&t5&!}c#;-Im_M~#zEUdIuHBVhFfAS>U_c8}pq(T}Yu0JI@fDQ( zWiPV#tMFIlO!$VK*PaIG;#EVgrJLd1Gr~3XO{FqLF+{Afx-6gcki!ZQ8(&=DzQjs? zGk8;=(_9@5J1I63xpmx-eX7>y<64D!;!7zpzPNW2>+Ae5u$+y=3B zvS1Gi3WK;ZYFuI&TK`V4s#gnqW6ZYdE+qW)a?A&pJ-I_oV`uQPWycGk2govJ(?4YY z&GU5g*V^g&=Mz2*WNsMittYFeQ z?%pv)SsxngEqv>;L7Ej5p`K)L*3p1%l};6NRGW>Hq}#bIAy*yWZ+z~HiA)Qd^ayU> zp@X7AHpSBgOL@2&bua&jYoUz?w5BM~9utZdXmcf|o5eZ1I*c%cWoY1oh`_(2&EIh` zFXUr638wP=rcZc2O7?(jG$g$+8KGy)-h$_jNd*2gW}z{Q=m5k7cIT z$t$6dNL5v3q&z}N7J-n3u_>Aa+{CztctGSZ8cGNx8iD@*N=q1$rH9Eh_>Yix?f9=E+hydg*>CG~$FLgi91b6!I6VDT22T)VYtGj3F(PLR;)uC}IikGRgoRLpzR?NG^WLj9N$hzF zQ%5XGVnWx1*Lw5iE%+pFFNWwkX9$PBs(xhlZshmb-tVi2KO+N*f_J<64Y{$99Q8c> z>bZ{XCyb4&&J8ifkb%}ULLi5yJH6*JV=6)cB=RjfOtfl+Keaa^{{|Mh-oLTb!n{MI zpJPujXFP3Plb)88SiO9I|dTSzj5I&Tfc{G?nP)!}?oNRo$hA8y{i z293o12$9IJf&=KQ8BJLq^QuDwaTO{Ot@XtVjQ<-vi}S^Q%vrFptj1UmWz3|Uu9&oI zZ8h^0hDQn7CS|{TaJoSTN#4TEG&5`TU%A_-5JFFIuxhMY#~G#_BvT!lCHsw&3V4;F z)f$Yl_oiTN6Ylu2g>BA%4i4p{C0CTpB_JVzxYq1I*otLuB}Pk@h=n;!$|Inb&R%@R z4F81jMyz?Ht3`>!wZsql8QBn6#CxX9h}r*zZH)VwhrQOwQN;%jcNf50*~>WicgUp4HpNlGal&S`#f zXw`n|@a4tQv3??T7I$+&JFQ2G^c_eheMQBbtyzY0+Obj~KFqx@ zRVvssG<#MdtQziRaA|!-8Ce*NvEN(vPH^83fP?8sx@Wme#_#g0q*T79-b9YD{08N-&s~E` zWaJ>$6W+M?Odl?Z^HqpR(u&o~K*uulTKlUzU$Ak1;6nJaN2hU!F*6|rgWM4P{H)UA zHoN4d7hgFKssit92e=K;MTyqff7bN(9mw#!T5M0Jr0Y8wVdoS6B^CHb_X-b(NN3Yc zCF)ANRzzZ}1N!$P;k>6j1r{B0Olg$(^@+9RSfSwR7{3M1y!^$)UIQ`$3b!)yQ0hMB zS%47%!ODPMA}UyjJ}?m49l8ilo0?x7lg0&R{$u$D7yM+T zo4Xg^l*-ZY^HJMwDXDdWN2p@ov$R8re<8m0y_o-7U zDVA4weOA*D@s;Pi$UAG2Xc+kVm} z2|*a5sV&aumF}4GCtAU5^GpXBhvH#V+Yg^!rmtE5+_D-0oqv7n?N@dk+hwSo18vb@ z?+u6EsQv8IT&i)a^W8+c%M_scXZ2NL$E9OoH8&y56*%-&RN?FB@Q($lWEU6EVDY`w zi5tTB@7)Wtx-E@m;SJ_8Wi^!)f_kGDiCWR0srl6z`n})=-C}p9;sEtQ@^^nD8nLfbzY8e#?VgAj<^@yPhw=3Rz^h9R z%@Ha_-(W zLKvq*;b4EF301=6U%btGeG~E34RN+Pvj%M{?6L4HBSyF*YU`N{7N0 zOu8$j&eU8J9o51X1P1;yft|hjvwN=B4-wFf({Tc8CHM86`F@y_s{h7N-XNW=@Z&>; z8MHVn@@7)D-zvJuEu3Ksj~3gtq2FAVtxQjGiaBjsHb_7vg+J_$rFPJBBGe#Er{-O1 zX;=&^Lz5M_3emGMcQ^I>ao4MBTc^U3?Dhx*Y9yVo^rQXaA4TZqp#*@kVBm>iu< z$sN%T=+!LfNI!HJ(O38PZkKc17|i9kWck+iy&O&)v)O#3AWmNLtnIMnqmMk3gqZj9 z@d&bY6bw>HC+v)^EDUiAt`tuk{umngZ4|EQ8q(5~Df^2jmlxC9^dp+$Samf=YFDxL z2mg9duz3KYJ?D7_{`l3w*D$Ih@vmV4{%>(LJ<4tNoGp7}3wW&iPo|<0b?kgMjaA=j+mwzY)zI@W1~R>|hxx}~C^^0j^rW=EN8wQA zs)QeJ)C_8O$aBzIu(9*eVA%ld_Nm>*N*0FDGHpR}_%khz-(uCF0H5$G?#fp53+FRi zkc@$&JNcz&aAs6p`Km227=7%%`8=S8C^Aq~g<}R)c7_@P4A*hbl^d$o1&Q1gbeF?Sq zB84g1zO?u?(U(!ni-V;|=* zAztX}NQg0FV2@k~M{5c;<=l*JZ>3)z!1djw=rtTyLIq&|sftjEkbV^HZRNX1zXa5Y9Hl&bh zBk+42;D{h%vmEU_wQ9{3h2PKZhUA92ja3pe1M(*|z6LyC5y>_=y-BV=EE>r zEOFX(zl<4Nt+=(O%H&O%&SYh@SRLHcglK1%YVP|oY~*h)+o+%rzjDnkmz`oF7u;?$ z4c_^Eje05;<*+|}d(R|pgVlL?w=@3oS_~e1W$^Ome&Op!KVuk*)?aK|lXfSjDK@+% zE?d(x48#D<8xnmzbDsl7Jm|+ z>Ca_+`HS<`b%qm7=J0{>npOH8Xgg@*CVokx z@b&#B9p6ns#1YPx{6{x%z`jAaV&m*!>AHIF>}Cyl4o674(tt~jWg3mspB5JU)jk`v zrTj%NGlrtzJbRE7CE9zqci)}6D0*NP)0fqHCXz|q~ zhW+6Ss)arwYog^_j>x!(*tiJ5Ux0t1{tL}tX#YZ27Z*X__f}F)MP6POC8sDUD=#i9 zD~B%D%RZvJBEu~p({B77cjF3O<-vkIf>)AUqBz0!nJO+&;udx-sdhYf0R*4gjY#8u7qpy50T|tW>ixE5xmb&4j|i6ObovZ`AUVE>EB z#@V0Fth1zk(AW=r1qntoZMS6bz}8;h+6C@*n)`^T<$2H-_R zQ9Bk^#qss@Leu)jQe{OhR*ab;n5PBkA?-_jS!t5etj9rfZ`svhA$OQpZH}qJt%1cf zW{f%PDln@CfqHlR49)+?ifAv)NaD6cskI2n#o&8a*g*>#f}Npy(xlE*rfZbleSR_+ zlcET_Kf|)U{J8l(k1C-Yfw!}M@CK?M+SQy@C){Nc|AHL}D^_LbC5$7;6k!Zrc}C#h z>uHh#Y=*7xm|klxru!q7tUBIA8OIaMs8X$Jig=u?3JX7qJqP~#$e77~6^2)(KPV5M z(@RN*Ac8;9rY7_%4ald6!Ay;0pEYfe3|4xTqBb`9SP^r{`1IQ~KVuC1GHq9l`k(n4 zkmAvrYO|Rm+I+gJ<35dT$(z<9lIAa=fi3TLLBgW)ziPt<+poe2b5%SE(BKu*D;*hY z#*X0D2jL{eIC0Pq3OiS(4omW^1y-#YXRPJYoX49p8Bl! zD(Eo1)4uW!f1v%^X6sgqb=ty3RXf_BHv}5Ywbkgb5vel@rj}*M;mWn{tVNy(8~%}a zHyaZ^)>a#Ky5jhB_4yvoOUeqO>R&6)+>>TP}bP~|!v@%_KE;S{E zO#8U=1p`ILgMakGP0X!n9DIOo9WV+t0AFlY=7Rw z8XO%J*uG3_ZbSxTy6n!?lI&|<#oMZ" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "%matplotlib inline\n", "\n", @@ -783,11 +802,27 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[4.]\n", + " [3.]]\n", + "[3.86998544] [3.11177547]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/sklearn/linear_model/stochastic_gradient.py:130: DeprecationWarning: n_iter parameter is deprecated in 0.19 and will be removed in 0.21. Use max_iter and tol instead.\n", + " DeprecationWarning)\n" + ] + } + ], "source": [ "# Importing various packages\n", "from random import random, seed\n", @@ -796,12 +831,12 @@ "from sklearn.linear_model import SGDRegressor\n", "\n", "x = 2*np.random.rand(100,1)\n", - "y = 4+3*x+np.random.randn(100,1)\n", + "y = 4+3*x#+np.random.randn(100,1)\n", "\n", "xb = np.c_[np.ones((100,1)), x]\n", "beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)\n", "print(beta_linreg)\n", - "sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1)\n", + "sgdreg = SGDRegressor(n_iter = 100, penalty=None, eta0=0.01)\n", "sgdreg.fit(x,y.ravel())\n", "print(sgdreg.intercept_, sgdreg.coef_)" ] @@ -868,11 +903,30 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[4.26950679]\n", + " [2.93950818]]\n", + "[[4.16449871]\n", + " [3.01998132]]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "from random import random, seed\n", "import numpy as np\n", @@ -1048,10 +1102,8 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "import numpy as np \n", @@ -1112,11 +1164,17 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gamma_j after 500 epochs: 9.97108e-05\n" + ] + } + ], "source": [ "import numpy as np \n", "\n", @@ -1153,11 +1211,37 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[4.13137049]\n", + " [2.85144795]]\n", + "sgdreg from scikit\n", + "[4.16307568] [2.89603874]\n", + "theta frm own gd\n", + "[[4.13137049]\n", + " [2.85144795]]\n", + "theta from own sdg\n", + "[[4.12146611]\n", + " [2.87377643]]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEWCAYAAAB1xKBvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzt3XmcHHWd//HXZ5LJMSQkZBKSEJhJAiEcbiAwCwrIBFHAyOmyu2LkdhFcWXU9fiKKKKKuroKiPjACIiSCLt7uegAmE64EhiPhSgiBHIQjk5uQe+bz+6NqQqfTR3VPdVd3z/v5ePRjuqurqz9V3VOf/h71/Zq7IyIikk9d0gGIiEh1UMIQEZFIlDBERCQSJQwREYlECUNERCJRwhARkUiUMKRmmdkUM3sl6TjiZmZuZgclHYf0PkoYUlZmttTMtpjZJjN73cxuN7NBScclIvkpYUgSznD3QcCRwGTgqoTj6ZXMrG/SMUh1UcKQxLj768BfCRIHAGb2ATN70sw2mtkKM7s25bmxYXXMhWa23MxWm9nVKc8PDEss68zsOeAfU9/PzA41s9lmtt7MnjWzM1Oeu93Mfmxmfw5LPw+Z2SgzuzHc3kIzm5xtX8K4LjezxeH2f2RmFj53rZnNyLAffcPHs83s62b2cPjefzSzRjObGR6Hx8xsbNpbTjWzl8Jj8B0zq0vZ/iVm9nwY91/NrDktzn83s8XAYgvcYGarwvd62szeke+zk95JCUMSY2b7A+8HXkxZ/BZwATAU+ABwhZmdnfbSE4CJwMnANWZ2aLj8K8CB4e1U4MKU96oH/gj8DdgXuBKYaWYTU7b7L8CXgOHANuAR4Inw8T3A9/Ls0ukESWpSuK1T86yf6kPA+cCYMP5HgJ8Bw4Dnw31LdQ7QAhwFnAVcEu7nWcAXgQ8CI4AHgLvSXns2cCxwGHAKcCJwMDAkjHtNAXFLL6KEIUn4nZm9CawAVpFyMnT32e7+tLt3ufsCgpNda9rrv+ruW9x9PjAfOCJc/i/A9e6+1t1XAD9Iec07gUHAt9x9u7v/HfgTcF7KOr9198fdfSvwW2Cru9/h7p3ALwmqz3L5lruvd/flwCxSSk4R/Mzdl7j7BuDPwBJ3v8/ddwL/k+G9/yvcz+XAjSn7cTnwTXd/PnztN4AjU0sZ4fNr3X0LsAMYDBwCWPi61wqIW3oRJQxJwtnuPhiYQnCiGt79hJkda2azzKzDzDYQnACHp73+9ZT7mwkSAcB+BEmo27KU+/sBK9y9K+35MSmP30i5vyXD43yN89niiqLQ907fz/3C+83A98NqsfXAWsDYfT93vTZMnD8EfgSsMrPpZrZ3AXFLL6KEIYlx9zbgduC/Uxb/AvgDcIC7DwFuJjjhRfEacEDK46aU+68CB6TW9YfPryww7GK8BTSkPB4VwzbT9/PV8P4K4GPuPjTlNtDdH05Zf7chqt39B+5+NEEV1cHA52KIT2qQEoYk7UbgfWbWXa00GFjr7lvN7BjgwwVs61fAVWa2T9g+cmXKc/MIfvV/3szqzWwKcAZwd4/3IL+ngBPNrMnMhhBPr7DPhft5APBJgiozCBLsVWZ2OICZDTGzf862ETP7x7BUV0+Q2LYCXdnWl95NCUMS5e4dwB3ANeGijwNfC9s4riFIAlF9laB65mWCxu07U95nO0GCeD+wGvgxcIG7L+zpPuTj7vcSnNAXAI8TtJ301O/DbT0F/C9wa/hevwX+C7jbzDYCzxDsczZ7Az8F1hEcuzXAd2KIT2qQaQIlERGJQiUMERGJRAlDREQiUcIQEZFIlDBERCSSqhp8bPjw4T527NikwxARqSqPP/74ancf0dPtVFXCGDt2LO3t7UmHISJSVcxsWf618lOVlIiIRKKEISIikShhiIhIJEoYIiISiRKGiIhEooQhIiKRKGGIiEgkShgiIhKJEoaIiESihCEiIpGUPGGY2W1mtsrMnsnw3GfMzM1seKnjEBGRnilHCeN24LT0heFcxKcAy8sQg4iI9FDJE4a7zwHWZnjqBuDzgOaIFRGpAom0YZjZWcBKd58fYd3LzKzdzNo7OjrKEJ2IiGRS9oRhZg3AF4Froqzv7tPdvcXdW0aM6PFw7iIiUqQkShgHAuOA+Wa2FNgfeMLMRiUQi4iIRFT2CZTc/Wlg3+7HYdJocffV5Y5FRESiK0e32ruAR4CJZvaKmV1a6vcUEZH4lbyE4e7n5Xl+bKljEBGRntOV3iIiEokShoiIRKKEISIikShhiIhIJEoYIiISiRKGiIhEooQhIiKRKGGIiEgkShgiIhKJEoaIiESihCEiIpEoYYiISCRKGCIiEokShoiIRKKEISIikShhiIhIJEoYIiISiRKGiIhEooQhIiKRKGGIiEgkJU8YZnabma0ys2dSln3HzBaa2QIz+62ZDS11HCIi0jPlKGHcDpyWtuxe4B3uPgl4AbiqDHGIiEgPlDxhuPscYG3asr+5+87w4Vxg/1LHISIiPVMJbRiXAH/O9qSZXWZm7WbW3tHRUcawREQkVaIJw8yuBnYCM7Ot4+7T3b3F3VtGjBhRvuBERGQ3fZN6YzO7CDgdONndPak4REQkmkQShpmdBnweaHX3zUnEICIihSlHt9q7gEeAiWb2ipldCvwQGAzca2ZPmdnNpY5DRER6puQlDHc/L8PiW0v9viIiEq9K6CUlIiJVQAlDREQiUcIQEZFIlDBERCQSJQwREYlECUNERCJRwhCR6jZzJowdC3V1wd+ZWUcaSmZ7NSSxoUFERHps5ky47DLYHA4YsWxZ8Bhg2rTkt1djrJqGcWppafH29vakwxCRSjF2bHBST9fcDEuXJr+9CmFmj7t7S0+3oyopEaley5cXtrzc26sxShgiUr2amgpbXu7t1RglDBGpXtdfDw0Nuy9raAiWV8L2aowShohUr2nTYPr0oI3BLPg7fXrxDdRxb6/GqNFbRKTGqdFbRETKSglDREQiUcIQEZFIlDBERCQSJQwRkXKr0vGqNJaUiEg5VfF4VSUvYZjZbWa2ysyeSVk2zMzuNbPF4d99Sh2HiJRIlf5ajlUhx+Dqq99OFt02bw6WV7hyVEndDpyWtuwLwP3uPgG4P3wsItWm+9fysmXg/vav5WpOGoUmwEKPQRWPV1XyhOHuc4C1aYvPAn4e3v85cHap4xCREqjiX8sZFZMAsx2DCy/MnHSyjUtVV1fxiTapRu+R7v5aeP91YGS2Fc3sMjNrN7P2jo6O8kQnUi2Srg6qpF/LcRyLYhJgtn3t7MycdDKNV9W9fqWXzty95DdgLPBMyuP1ac+vi7Kdo48+2kUkNGOGe0ODe3BaCm4NDcHycmlu3v39u2/NzeWLwT2+Y2GWeX/Msr8m2zHIdUxmzHDv06ekx277W9v94Z8s8G+eOsuBdo/hXJ5UCeMNMxsNEP5dlVAcItWrEqqDKmV017iORTHDm0+dGgxUmE9qSWTaNOjqyr9eAaWmbRu38eCPF/D1987mfY2PM3Sv7Rz3sX/gqr9OyR9bVHFknXw39ixhfAf4Qnj/C8C3o2xHJQyRFMX8Gi6FGTOCX8Vmwd9ylnC6xXUsCi2pZFo/SgnDPXvJpLExUixb1m3xWTc86ddOmeUnDX3CB7B512qTBiz0KyfN9ns++7Cveq4jthJGOZLFXcBrwA7gFeBSoJGgd9Ri4D5gWJRtKWGIpKiU6qBKEOexKCQBZnvf9ASWKenMmOHer9+er62vfzuGDNte13+knzjkSe/PluCt6PTJA5/zT02e7b+7aq6veXHtHmHGlTA0vLlItUq/AAyC6qDeOH9DUseiri44jWfS3BxULzU1BVV0meIYPhzWrMn4Wl++HMuw7S6MYxueYcphq2h9fwMnXDqRoc1DcoYZ1/DmutJbpFp1n4Cuvjr/ianWJXUsmpqCXlDpmpth6dL8r1+bfsVBoGvZclZwAM1k6IE1Zn8ee+Uw4LCCQo2DxpISqWbTpgUnpq6u4G8tJ4t8DcBRjkXc3ZB70Oi/ftkGNu+d+YqCVTaKeRPOp7N+wO5PmFG3ckVyV9THUa9VrpvaMKTiVUIDcC2Ko9tspm3U1weNzD35vCJ+5mteXOu/u2quf2rybJ888Dk3Ov08Zvgmdo+pa+DAt7eR2pYRpV0kC9SGIVJh1KZQOmPH9qzqJ9c2UsX4eXU8v5o5ty2m7W/baXthFE9vnYBTxwC28K6hC2k9cgOtZw3luIYn6feNr+auSuvh/sfVhqGEIRKXOE5qSZs5szLbRLI1Lptlv54h6jbSFfl5vfFMB223Lqbtvh20Ld6PZ7dNAKCBtzhu2EJaJ79J69n7cMwFh9B/7/6FbbyH+69Gb5FKU0nDZBSjkofdzta4nOuCuqjbSBfx83r1iddp+9lLtN2/k7YlY1i4/UBgBIN4k+MbFzGtdTZT/qmRoz88kX6Djo4eZyGxF7L/cYijXqtcN7VhSEWr9usiosafRDtNqdowCvi8ls9d6Xde/qB/dGKbT6h/adfqe7Pep4541L89dZbPu+0Z37FlRzz7nC/29P3P8blQLRfuxXlTwpCKVgljO/VElKulk9zHOBJV6jYaG/e8cC5lX15+YIXf/tEH/OIJc3xc32W7Vhlq6/zMUXP9u2fO8vY7n/Od23bGuZfRYk/f/zyfixKGSCWq5l5SUUoY1V6KShd+Xl1mvn3fMT7r3V/288c/4E19VuzatWG2xs8Z/YjfeM5sf/LuheVLEDni3eP7ledzUcIQkXhFKT1kK4VAZSfHtBNt150zfNFfXvLp57f5h5sf9DF1r+7ajRG2ys8d87DfdO5sX3DPIu/c0Zl09IFcn0+uz8XMJ8E2j+EcrF5SIvK2fL2kcnVNrdQuxDNn4pddhqV0d97MQD7KT7mLaYyqe4PWMUtoPX4nreftx6GnH4jVRRh9ttxy9cKDnA36LUC7e893Ko6sU66bShgiCcvXcNyTqqkYq/M6d3T6gnsW+U3nzvZVfUZmjHVjw0hf9JeXvKuzq/iY45Rv/3O1MeX5XI4G9xjOwYkngUJuShjSa1VS28gVV2RPGMUOrd7DxvTOHZ3+5N0L/cZzZvs5ox/xRlu9azOdVMgw8LlE2f987Uep3xElDCUM6aUqrfdVrhnmii1hFNiYvnPbTm+/8zn/7pmz/MxRc32ordv1knF9l/lFB83x2z/6gL/8wIrqaKiPEmMh34O07SlhiPQWlXbCK0XDd54uvTu27PB5tz3j3546y6eOeNT3Zv2uVQ6qf9k/OrHN77z8QV8+d2WwvQK6z1aEqBNARS1ppiWXuBKGrvQWqXSVdgV5tquOGxuLb/DOss0N/fflX4e389CaiWzicAAO6beE8w6dT+vJfWm9eDz7HTWWYFLPUPoV62vWQH19EN/atZU15Em3qFdyT5sWPe6BA3cdg07Y2cMIAQ0NIlL5KmVYiG7XX595kMXvf7/oTe740lep+/jl9Nmxddeyt2jgiq3f5RUfwgXveILW99Zz4sUHMWrSgcCB2TeWaX7vHTtg0CBYvbroGEsq2zEtZm70DINg1sU1lUUcxZRy3VQlJTWlyOqFiqhS6WEjfKb5qM9jhr9Ms3divqZ+pM+d+hVf9VxH4bFVylznhYqrY0OGKkxVSYlUs0IG+quBmfU2r97MIz9bSNsfN9K2YCjzNhzCNo7E6OLIgYu4fPKjtJ56EIMveYK6CcMYBhxb7JtVWoksqkKqm3IpZVVlHFmnXDeVMKRmVFpDdiEilHjefO1N/+s32v2Lx83y4wfP93q2ObjXsdNbGp71zxw9y//45Xm+bun6ROKLtI1K6cZcqBKWMBJNAMCngWeBZ4C7gAG51lfCkKr+R06V7yKsJEaDjfqeWZLd5iGj/P8dO8uP3etp78t2B/dp3OGv2mjvwnzzkFH+1g9+Wvp9KXR/Mr220qoAC5Eh/qOg06s5YQBjgJeBgeHjXwEX5XqNEkYvV+3/yKmylTAaG8u/j4Ue1yzJrgv8I9zuxw2e7188bpbP/+frgulGM2231EmxJ9uv5tJft7T9Hw4veQ0kjBXAMILeWn8CTsn1GiWMXq4W/pG7ZTtJNzaWfx8jHNfU+ahX2ujM65M2H3VSSbGnPyyqtdE8B2phtFrgk8AmoAOYmWWdy4B2oL2pqSnWgyhVptb+kTP9Ck5iH7OWGMyvnDTbJw1Y6Eang/sANvt1A7/u2+r6Z00auxJNrgv8SpkUe/rDopZ+mITiShjx9M0tgpntA5wFjAP2A/Yys4+kr+fu0929xd1bRowYUe4wpZJk6+VS6b1fspk2LZg7uqsr+DttWjL7mGXby2ji1gUt7Nuwia+dPIc5N81n/YY6vrT5avrdcWv27XX30ik05rh69+S70HHmzGDk17q64O/Mmbuvd/31wTUQqYq9JqLWxJF1irkB/wzcmvL4AuDHuV6jKqlerpbaMLLJNupoY2Os+7ny8df8F594yD92aJt/ps/3fBO7v+e2uv6+6JJv+rY3t2XfSJTB8JKodssVV9TvUK10rghR7VVSBN2snwUaAAN+DlyZ6zVKGFJr/8juvuc+XXFF5pNq1OSY4Rilzkd9UP3LuzbZPR/1HyZd7VsbR3tXagz5jnOx80yXOvHn2n4NVjdFUfUJI9gHvgosJOhWeyfQP9f6ShiSmFIlqrh/hWfY3lsM9POY4RDMR33GyDzzURdyQi/2uCTVS6oW2sGKOHY1kTAKvSlhSGwK+acr5S/iXEOFZ7ulxdzV2eUv3r/Ub71ojnf0zTxZ0IaBI6PPR13Lv8Krfd+K/C6WLWEA9wJHxPFmPb0pYUgsCv2nK+VJptCeRCm37X36+w8br9ltPupYJguqhV/h2VR7O1iR38W4EkaUXlL/D7jRzH5mZqNjaWkXiVu+ni+pMo1munlzsDyTUg4vnq0nUWPjnj110tR3buPMNbdxwpiX+fGH5vDs71/Emg4o7H0KWTfXNgo5/kmaNi2Yd7y5GcyCv5U4D3k2SQ91HzWzAP8EzAe+Qnh1drlvKmHUiLjrr2O6UjnrL+hSljAyxN7V0ODL/uO//S/HXO2r+oz0Tsy7spQyujJNsBPHOEqFbKPaf7VXk4RLGFGThQHvAC4HVgOvAOfHEUAhNyWMGlCKk0uh/0SFrl/iE2LnHXf6tuH7eRfmb9SN8n/j5l1v09RnhZ8//gHfuFfmtomMMceRkGMYW6pq2gWqSRW0YTwEvErQlnEdcDpwEHATMD2OIKLelDBqQClOLoWWGIr5p4uxVBRlPuqfXRrOR92TmMulXG0etdiluhiV3EsKOBywLM89H0cQUW9KGDWgFCeXQpJQal/8Pn12/1uik1C++agvPXjO7vNRZ1OpJ8xylDAqOWFWgbJWSWV9MYyPI4ioNyWMGlCKk0shV+9muoo65pPQ9re2+8M/WeDfOGWWn9r4mA9i467NT+y3xD92aJv/4hMP+SuPvZp9fyoxMWRTjpO5qr16pCISRrlvShg1oFQnlygn2ajXPBR4Etq6Yas/8KP5ft3Js/y9w9q9gU27NnV4/xf84++Y7b/81EP+2vw3ou1HNf6SLnWSq+WuvmUQV8KwYFvVoaWlxdvb25MOQ3pq5sziphst9nXd6uqC00w+ZsGAgFlsXb+VubcvpO3362l7agiPrD+ErQwEYNKARbQe/Dqtp/TjxEsmMOLQ4dHjg6BLaqbpRZubgwEKeysdlx4xs8fdvaXH21HCkKqQPgc2BNcpFNKHPttJJ13aSSjzfNQDds1H3XrIKlpPHcC7L5lA44RhBe3WHrIltTxJrObF8fn3YnEljMSrmQq5qUqqQiRRxx5HHfaMGe719bmroxoafMuPbs07H/UfvjTP1760rjL3s1ZVW9tOBSGmKqm+Pc9d0quk/9Jbtix4DKX9pRfXFa5muz/u25euQXtj69exvt++3LDz03zz389nJ/X0YSctey3k08c8zJQP7MXxl0xk7/0PAw4rahciuf76zL+kNRdD8P1SaSJRqpKSwiRVlxzH+2bZxjKaGMsy6tnOPw5eyJR/WEvr6YM57uKJDBo1qCdRF6enbTUiaeKqkkpsxj2pUkmNZZNpFjQzmDo170vXLlnH7784D1+WOcYmVnDft59gfcdOHto4iesfmsIpVx2dTLKAzDPxlVLc40BVy7hSUrg46rXKdVMbRgUoZx17ep31ySfv2b0yQ5fTVc91+D2ffXiP+aiXcoDaB9LF3Y23WrsF1zjUrVYSUa7eKpnexyxjD6LO0fvz63/9JW337aBt8X48u21CEBZvcdywhbROfpPWs/fhnQOeov6TH1dPm1RxVzGq+2tFUi8pSU45eqsUMLFQJ+bgPoiNfmrjY/6NU2b5QzcvyDwfdSX2tEkyprgviNMFdhUJlTCkpkW9yA7YMGAki358P0edN5G+A6qs41/S1xeohNErqNFbatbSB19h0177ZnxujxTS0MCQW77LMRcfXn3JAgqfzClumToTFNqNN7WRe9MmqK/v2fakYilhlJp6jOTkXc6Svy/jtosf4IIDH6S57yuMe/f+XLbpu2wOh9vYtW5DA3bFFcnNllaKzzLpGdR6OgNddwlp2bKgRLhmTbCdxsbqnNFOcoujXqvYGzAUuAdYCDwPvCvX+nu0YVRifXQq9RjZQ1dnly/6y0v+k2lt/uHmB3ebj3qErfJzxzzsN5072xfcs8g777izcj7fUn2W1X5ld7XH30tQC20YZvZz4AF3v8XM+gEN7r4+2/q7tWEkXfcbhepz8S7n+T8toe2uV2l7qC9tKw/k9a6RAIysW8WUMS/SevxOWs/bj0NPPxCrszxbTEipPstq+B7norGvqkLV95IChgAvk2Vypky33UoY1fDLphf2GOnc0ekL7lnkN507288d87Dva6t27faYulf9w80P+k+mtfnC/1viXZ1d5Q+w2FJpKT/LnpaUkyxpV8P/ocRWwkgyYRwJPArcDjwJ3ALslWG9y4B2oL2pqentI5DEybjQf8xa/2eaMcO7mpq8y8w3DBzp3xtyrTfa6l272T0f9S0XzvHF9y0NEkSSJ7eeVCtV6meZdLVn0u8vkdRCwmgBdgLHho+/D1yX6zWJljCKnQe6xv6Zuuej/tNRV/sWBuy2b28x0G/e98t7zkfdLenj0ZPvTNKxZ1MJiazS2xKlJhLGKGBpyuN3A/+b6zW7JYxy/wMX+49Z5f9M2eajfpnm6McjdR7tJE9uPS2VVuJn2QurPaVwVZ8wgn3gAWBieP9a4Du51i95L6lc26uGKrAYZJqP+jxm+Ms0eyfmq/uO9Ife9xXvynY8YM99yDePdpzHMNcxq4Rf43GrxX2S2NVKwjgybJ9YAPwO2CfX+iUdGiRfiaUaqsCKsHXDVp9z01MZ56M+rP9iv3XMl3xH3/57xtHYmP3kH+UkXYpjmO+YVWq1Uk/U4j5J7GoiYRR6K2nCyJcQqqUKLI8t67b4rBue9GunzPKThj7hA9i8a9OTBiz0KyfN9ns++7Cveq4jdxyNjdlLXakx5iqJxH0MoxyzSqxW6qla3CeJlRJG3KJUOZXzHzOmeN7qeMvv+/bj/uV3z/IThzzp/dgabIZOnzzwOf/U5Nn+2y/M9dUvrCk8jihVTPnaLuI8hqrPF8koroRRhYPvlEhTU+YLs5qa3r5fziki88WTZarUrRu2MWfDEbT96U3anh7Go28ewg6Ooo5OjmpYxJVHP0Lr+xs44ZKD2WfcocChPYsj3zHLNuVoKS5Mi/IZikjx4sg65bol2oZRbkW2qSylycG9Dzv82L2e9s8fM8v/99pHff2y9fHHEfWYlatkVmmfoUiFQFVSJVBpdcEZ4lm3dL3/8cvzvIvM1S9dmP/l64/5xpUbSxpHpOeSUGnxiFSAuBJGbc+HMXNmMEz08uVBtcT111fH+Dwp1i5Zx5xbXqDtr1tpW7gvT22ZiFPHUpppJsOIpkmOU1UDx1ukFmk+jHzSh10O6/gTH148zxDZHc+v5tefe4T/OKKNIwYuYvhBQzjnW8dy85PH8EF+w9r++9FFHQfsswn69dt920nOO1Cpx1tEYlO7JYxKHCk2w8ikXQMGMm/K55nxykm7zUc9kM0ct89Cphy1Mft81PX1sPfesHZtMr/oU0sUdXXQ2bnnOr1oZF6RShVXCaN2E0YlDrucJYktpZl38AwnNC6k9ehNtH6wkZZpE+k3qF/e1yZ2Qs40LHcmGuZaJHFxJYza7VZbIV0sV8x7lbbbX6ZtVic/WbY8Yx1gM8tZ91Z/6htyfJ5Jz8yWLtPUopmoS6tIzajdNow45iouwtIHX+Hn//YgF094gPH1y2l6536cf/Px3PPCJFbXjcz4GutTR/2g/rmn/cx24k3qhBwlUWkuZ5GaUrsJo6dzFUfQPR/1rRftPh/1RbecwB+WHM4RI17lhrPbeOIXC1m9dTD73vHfeyYxCOr+8zUUJ5QAs8qWqPr00VzOIjWqdtswSsC7nMX3LmX2nStoe7APbSvGs7JrNAAjrIMT93uR1nduZ8p5ozn8rIOo65shH3c3FGeqLuuWrV2ikrqtVvvUoiK9iBq9yyDffNStY15kSjHzUedrMK6WhuJKSmAikpUSRgl07ezi2d+/SNvdr9H2SD/mvHoQq3wEAGPqXqP1gJdoPaGT1mn7c/Cp46IniHTZejx1U1dUEYmRekllUuAv3q6dXSz49WLafvk6bXP7M+f1Cazxg4GDOaDPSk4dt4jWdy+k9fwmDjypCasbHU+cuRqM1VAsIhWqdhJGltFbgV1Jo3N7J0/96gXa/ucNZs8byAOrJrLeJwITGdd3OWcc+BytrUbrBc2MPWF/rG5MaWLN1uW3Tx+1AYhIxaqdKqks1TzbGkfz/WN+QVv7XjzYcTAbGQLAQfVLaR23gtaTjNYLx9H0rhIlh0zUYCwiZaQ2jHRZruzuwuhDFxP7vUTr+FdofU8fWi8ez5iWmKqXiqUGYxEpE7VhANs2buPROxbS9rt1/JuNZKS/vsc6Wwbvy2sPrmLUpPHA+PIHmU05J2MSEYlBVV24553O7Buf4qsnzeY9+zzJ0CFdnHjlEXz5/in83U9ij/KFGXt95IOMmrRv9o3mGT224lRbvCJSMxKvkjKzPkA7sNLdT8+1bp0d7c7jGF0cMfBdEDEsAAAKRklEQVQFphzyBq2nDuDk4fMZfM2nM1/XkKttoNraEqotXhGpCDXThmFm/wm0AHvnSxij9proP/3PO8P5qIe+/USx1zVU2giw+VRbvCJSEWpiAiUz2x/4AHBLlPX3P3QwZ1x3zO7JAvIPhJfp+ZkzsyeZXMknSZU2Yq2I9CpJt2HcCHweyDoOhpldZmbtZtbe0dGReaV8I7amP99dtZP9TSuzbaDSRqwVkV4lsYRhZqcDq9z98Vzruft0d29x95YRI0ZkXinTSK7dMl05nW8uB/dgnUpTaSPWikivkmQJ43jgTDNbCtwNvMfMZuR8xdq1mXsIpQ5lDsEV05B9iO0oVTilquYptpdT93Ubmzfn3z8RkRJIvNEbwMymAJ/N1+jd0qePt6eO4lpsD6F8jeRQmobkYns5qXeUiPRATTR6Fyx9yO/Nm4urOspVhQWlq+bJVBUWZR+KfZ2ISIwqooQRVYuZ7zEwSLFzR6QOzTFsWLBs7drSDtORZfiSvPtQ7OtERNDQIG8rtodQEkNzZBulNkovr2JeJyISo+qqkqpLCzfJHkLFNF4X28tJvaNEpAJUV8Jobg5uZsn2EOpuhF62LKgq6p57I1/SSO3NVcg+FPs6EZEYVVcbRkuLt3/608kPC64hOkSkitTMWFKFaBk/3tvfeCP57qVqhBaRKtI7u9WuXFkZ3Us1RIeI9ELVlTC2b8+8vNyD76kRWkR6oepKGP36ZV5e7l/2aoQWkV6ouq7DGDMGMrVhJPHLXlOsikgvU10ljGHD9MteRCQh1VXCAP2yFxFJSHWVMEREJDFKGCIiEokShoiIRKKEISIikShhiIhIJEoYIiISiRKGiIhEooQhIiKRKGGIiEgkiSUMMzvAzGaZ2XNm9qyZfTKpWEREJL8khwbZCXzG3Z8ws8HA42Z2r7s/l2BMIiKSRWIlDHd/zd2fCO+/CTwPjEkqHhERya0i2jDMbCwwGZiX4bnLzKzdzNo7OjrKHZqIiIQSTxhmNgj4NfApd9+Y/ry7T3f3FndvGTFiRPkDFBERIOGEYWb1BMliprv/JslYREQktyR7SRlwK/C8u38vqThERCSaJEsYxwPnA+8xs6fC29QE4xERkRwS61br7g8CltT7i4hIYRJv9BYRkeqghCEiIpEoYYiISCRKGCIiEokShoiIRKKEISIikShhiIhIJEoYIiISiRKGiIhEooQhIiKRKGGIiEgkShgiIhKJEoaIiESihCEiIpEoYYiISCRKGCIiEokShoiIRKKEISIikShhiIhIJEoYIiISSaIJw8xOM7NFZvaimX0hyVhERCS3xBKGmfUBfgS8HzgMOM/MDksqHhERyS3JEsYxwIvu/pK7bwfuBs5KMB4REcmhb4LvPQZYkfL4FeDY9JXM7DLgsvDhNjN7pgyx9dRwYHXSQUSgOONTDTGC4oxbtcQ5MY6NJJkwInH36cB0ADNrd/eWhEPKS3HGqxrirIYYQXHGrZrijGM7SVZJrQQOSHm8f7hMREQqUJIJ4zFggpmNM7N+wIeAPyQYj4iI5JBYlZS77zSzTwB/BfoAt7n7s3leNr30kcVCccarGuKshhhBccatV8Vp7h7HdkREpMbpSm8REYlECUNERCKpmISRb5gQM+tvZr8Mn59nZmNTnrsqXL7IzE5NMMb/NLPnzGyBmd1vZs0pz3Wa2VPhraSN+xHivMjMOlLi+WjKcxea2eLwdmHCcd6QEuMLZrY+5bmyHE8zu83MVmW7/scCPwj3YYGZHZXyXDmPZb44p4XxPW1mD5vZESnPLQ2XPxVX98sexDnFzDakfLbXpDxXtqGEIsT5uZQYnwm/j8PC58pyPM3sADObFZ5znjWzT2ZYJ97vp7snfiNo9F4CjAf6AfOBw9LW+Thwc3j/Q8Avw/uHhev3B8aF2+mTUIwnAQ3h/Su6Ywwfb6qgY3kR8MMMrx0GvBT+3Se8v09ScaatfyVBx4hyH88TgaOAZ7I8PxX4M2DAO4F55T6WEeM8rvv9CYbjmZfy3FJgeIUczynAn3r6fSl1nGnrngH8vdzHExgNHBXeHwy8kOF/PdbvZ6WUMKIME3IW8PPw/j3AyWZm4fK73X2bu78MvBhur+wxuvssd98cPpxLcG1JufVkyJVTgXvdfa27rwPuBU6rkDjPA+4qUSxZufscYG2OVc4C7vDAXGComY2mvMcyb5zu/nAYByT33YxyPLMp61BCBcaZ1HfzNXd/Irz/JvA8wQgaqWL9flZKwsg0TEj6ju9ax913AhuAxoivLVeMqS4lyOzdBphZu5nNNbOzSxBft6hx/lNYRL3HzLovoCzXsSzovcKqvXHA31MWl+t45pNtP8p5LAuV/t104G9m9rgFQ/Ek7V1mNt/M/mxmh4fLKvJ4mlkDwYn21ymLy348LaiinwzMS3sq1u9nxQ8NUo3M7CNAC9CasrjZ3Vea2Xjg72b2tLsvSSZC/gjc5e7bzOxjBCW39yQUSxQfAu5x986UZZV0PKuGmZ1EkDBOSFl8Qngs9wXuNbOF4S/sJDxB8NluMrOpwO+ACQnFEsUZwEPunloaKevxNLNBBAnrU+6+sVTvA5VTwogyTMiudcysLzAEWBPxteWKETN7L3A1cKa7b+te7u4rw78vAbMJfg2UQt443X1NSmy3AEdHfW0540zxIdKK/GU8nvlk24+KG/rGzCYRfN5nufua7uUpx3IV8FtKU6UbibtvdPdN4f3/A+rNbDgVeDxDub6bJT+eZlZPkCxmuvtvMqwS7/ez1A0zERtv+hI0uozj7Qatw9PW+Xd2b/T+VXj/cHZv9H6J0jR6R4lxMkHD3IS05fsA/cP7w4HFlKjBLmKco1PunwPM9bcbwl4O490nvD8sqTjD9Q4haES0JI5n+B5jyd5I+wF2b1R8tNzHMmKcTQTte8elLd8LGJxy/2HgtATjHNX9WROcaJeHxzbS96VccYbPDyFo59grieMZHpc7gBtzrBPr97NkB7uInZ9K0Mq/BLg6XPY1gl/qAAOA/wm/9I8C41Nee3X4ukXA+xOM8T7gDeCp8PaHcPlxwNPhl/xp4NKEj+U3gWfDeGYBh6S89pLwGL8IXJxknOHja4Fvpb2ubMeT4Nfja8AOgnreS4HLgcvD541gIrAlYSwtCR3LfHHeAqxL+W62h8vHh8dxfviduDrhOD+R8t2cS0qCy/R9SSrOcJ2LCDrcpL6ubMeToFrRgQUpn+vUUn4/NTSIiIhEUiltGCIiUuGUMEREJBIlDBERiUQJQ0REIlHCEBGRSJQwREQkEiUMERGJRAlDpAfC+QjeF97/upndlHRMIqWiwQdFeuYrwNfCgeYmA2cmHI9IyehKb5EeMrM2YBAwxYN5CURqkqqkRHrAzP6BYOaz7UoWUuuUMESKFM5cNpNgVrNNZlayGfVEKoEShkgRwpnWfgN8xt2fB64jaM8QqVlqwxARkUhUwhARkUiUMEREJBIlDBERiUQJQ0REIlHCEBGRSJQwREQkEiUMERGJ5P8DY8IBC9SCZV8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Importing various packages\n", "from math import exp, sqrt\n", @@ -1641,11 +1725,27 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAd0AAAEWCAYAAAAjEk0ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3Xd8FHX+x/HXZ1MIgUBC7wnSayAECBbkrKgo6qmoWLAhVu7On56np2Kvd/besKCIFBty2MFCgACBUKVLqKGHElL2+/tjBlxjKkn2u+XzfDz28djdmZ15T/1M2xkxxqCUUkqpmuexHUAppZQKF1p0lVJKKT/RoquUUkr5iRZdpZRSyk+06CqllFJ+okVXKaWU8hMrRVdEThCRFTXU7btE5I2a6HaoE5GxIvJQGc0fEpHtIrLFn7lClYgYEWlvO4ctIjJGRN6vYjeGi8hXZTQfJCLZVexHwE+nqozL6lofi8g6ETmlgu2OEJGfqtCvV0TknqP9fTndXiIig2qi21CBouuOyIMikisiu0XkFxEZJSJHXbCNMT8aYzod7e99sv1pgTLGPGKMubaq3Q5GNblyEJE2wG1AV2NMs5roRwVztBURr4i8XMnfVWkhV4HJGDPOGHPa4c9VXQZE5AcRCen1R/FxVF3rY38yxowyxjxY1e6UtKNhjOlmjPmhqt0uTUUL59nGmDggEXgM+Cfw5tH0UEQij+Z3yro2wA5jzLaSGvpxul4B7AKGiUgtP/WzTOII61M1ulwrfxGRCNsZqsQYU+YLWAecUuy7foAX6O5+rgU8BfwGbAVeAWq7zQYB2TiFegvw3uHv3Ob/BCYW6/6zwHPu+6uAZUAusAa43v2+DnDQzbHPfbUAxgDvu+1MA24u1u2FwPnu+87A18BOYAVwURnjoQHwNrAJZ6X/iU+z64BVbnc+A1r4NDPAjcBKdxgeBNoBvwB7gQlAdLFxdRew3R33w3269QNwrc/nEcBP7vuZbr/2u+NimPv9ECAT2O32s6fP73sD891cHwHjgYdKGPZTio3rsUCS279r3Ok+0233HGCJ278fgC7F5qXbgUVuzjeBpu50ygW+ARLKmAYCrAZuwJnPLvBpdjhPZPHxBXQB8oAiN/9ut3l94F0gB1gP/BvwuM0igP+402EtcLNv991uPwz87I6b9pQyr/rkuR3YjDMPXe12r30Az29nAQvc320AxpQwvotP/zS3X7txlrVBPr9pC8xwc30NvIC7rJYw/DOAv7rvj3P7dZb7+WQgsyLLgM8w3gZsc8f/VaX082F3Hslzf/+Czzgd5Y7T3cCLgPj87mp3uu8CpgOJZczDH+OsB/e4ebv5NBvrdnuqO45mA+2KrRc3uNNjHnCCT7Mx/L7emwrcUqy/i4DzyhpHPu22BibjLBc7fMZDO+A797vtwDggvqxa4dOsIc68uheYgzNf/uTTvNR1sTteXga+dHOf4n73kNt8GTDEp/1IN3tKWeMcGAkUAPnuuPjcdzhw6slBoEGxdeZ2IKqy0/5IN8ptoZQRibOg3eC+f9odoQ2AOOBz4FGfBbsQeBynONfmj0U3ETgAxPms7DYDaT4LfjucFe6JbrspPt3OLpZrDL/PfFcAP/s064qz0NTCKdobcFaUkT4js2sp42EqTmFKAKKAE93vT3J/l+J293ncFZDPAvspUA/oBhwCvgWOwVnpLwWuLDau/ut260ScmayTbxHx6fYI/jjj/mEl7g7TNqC/O16vdKdnLSAap9D83R2eC3BmwD8V3ZLGNb+vdN91x2VtoKOb91S3m3fgFIfDK/l1QDpOoW3pZpvv5ozBWaDvK2NePMEdfwnueP68hDx/KroljSv3u3fdaRPn/v5X4Bq32Sh32rRy+/cNfy66v7nTNNId3rLm1cE4Gwrd3fH1QfHpFYDz2yCgB84RsZ5u/nPLmP4tcVbIZ7q/OdX93Nj9zSyffg3EKSylFd0HgOfd93fhbGw97tPs2QouA4eH8QF3PJ7pTpcSN+4otoz5dPMLIB7niE8OMNhtNhRnHu/izgf/Bn4pYx6+Gmd+qwU8g7vxYH4vLjtwdmoicYraeJ/ml+EUr0icjYgtQEwJ672LgNk+v0t2uxtdxjg6vD6OwNlYetqdrjHA8W6z9u40rQU0xilgz5RXK9xm43E2+OrgLAMb+X1jqcx1sTte9uBsfHncTGP5vejeC4zz6ddZwLJKjPOHimU9Mhw466TrfJo9CbxyNNP+SDfKbaH0opsO3I2zgtnPH7fIBgBrfSZo/uGZo5QV+E/AFe77U4HVZeT5BBhdUndKmPni3GyJ7ueHgbfc98OAH4v99lVKWOkDzXH28v60oOLsrT3h87kuTvFK8pnBj/NpPg/4p8/n/+DOuPy+gqjj03wCcE9JKwTKX+G8DDxYLO8KnJXrQJy9KN8t9l+Kz4BlTLMkt3/H+Hx3DzDB57MHZ+Ea5DMv+e5JTQJe9vl8Cz57dCVkeONwc3ceKwCaFMtToaKLs3LJx2cjC7ge+MFnYbvep9kp/LnoPlDOsuM7r74FPObTrGPx6RVo81sJ/X4GeLqM6f9P4L1iv5mOs7HXpoR+fUDpRfdkYJH7/n84RyzS3c8z+P1oVfHpWlJBOVhsvtiGu1FfQn+PzDPFunl8sXF0p/t+Gu6Gms88f4CK7PE4RdwA9d3PY4E3fJqfCSwv4/e7gGT3/Rh+X+/FuM06uJ+fAl4qZxwdLroDcDYqIiuQ/1xggc/ndZRcKyLcebSzz3eP8HvRLXNd7I6Xd4s1H8vvRbc9zgZcrPt5HHBvJcZ5WUX3WuA7973gbBwMrMq0r8p5qJY4hwIaA7HAPPdCq904C0ljn3ZzjDF5ZXTrA+AS9/2l7mcAROQMEUkXkZ1ut88EGlUkoDEmF2eP4WL3q0twJgg4e9j9D2d2uz0cKOkiodbATmPMrhKatcDZYzzcz304W5UtfdrZ6vP+YAmf6/p83mWM2e/zeb3bj6ORCNxWbBhbu91rAWw07tzi06/K2uDzvvi48LrNj3ZcHCEitYELcaefMWYWzp7mpUeRGZx5KIo/DvN6n6wt+OOw+b4v8bty5tXi3StrXAfE/CYi/UXkexHJEZE9OHv/xZc932FKBC4sNr8dj7MR0aKUfpVmFtBRRJoCvXD2qFuLSCOcPcGZZfy2uB3GmEKfzwcoZT4rg+8V+76/TwSe9RnenTgr55bFfo+IRIjIYyKyWkT24qzc4Y/jtLT+ICL/JyLLRGSP26/6lLAudNe1HwGXudcaXIJzWq8iWgPri42vw/1vKiLjRWSjm//9kvpfgsY4e4Klzf8VWReXtPwBYIxZhXOI92wRicU5xfWBm7ki47wsk4ABItIcZ0fFC/zok7tC097XURVdEenrdvgnnMMAB3GOk8e7r/rGGN+Z2pTUHR8fA4NEpBXOeYfDI6wWzkA/BTQ1xsTjHNeXCnYX4EPgEhEZgLMF+L37/QZghk/meGNMXWPMDSV0YwPQQETiS2i2CWfk42aug3MIaGMFspUkwe3GYW3cfoCz1x7r06y8q4g3AA8XG8ZYY8yHOIfwW4qI+LTf5ijy+k6D4uNCcBbiox0Xvs7DOWT6kohscf+21BJnLwqccQOlj5/i88p2nK3vRJ/v2vhk3YxzaPmw1iVkOtLNCsyrm4t1o6xxHSjz2wc4p41aG2Pq41yrIcV+7zteN+Ds6frOb3WMMY/hDH9J/SqRMeYAzl76aGCxMSYf50jMP3COhG2v9JBWTEXWKb424BwR8R3m2saYX0po91KcQ5Kn4BTMJPf74uP0T0TkBJzTNRfhHAGJxznkWtpv38EpXCcDB9yN1IoOT5tSLox7BGf89DDG1MM53F1udpw950JKn/8rsi4ub7p8iLNxMRRY6hZiKH+cl9ldd8P3K5y98UtxDvcf/k1lpv0RlSq6IlJPRIbgHJ9/3xiT5e7NvA48LSJN3PZaisjpFe2uMSYH57DO2ziHpZe5jaJxjsPnAIUicgZwms9PtwINRaR+GZ3/Emcl9QDwkZsXnHM0HUXkchGJcl99RaRLCfk24xxKeElEEtx2B7qNPwSuEpFe7or3EZzzKesqOvwluF9Eot0FbQjORgk4F0SdLyKx7iX/1xT73Vacc3eHvQ6McvdYRETqiMhZIhKHsydRCNzqDs/5OHsQVTEBOEtEThaRKJzzTodwVpZVdSXOIdoeOHs+vXDO8SSLSA93HtqIs3UfISJX45xfPWwr0EpEogGMMUVu3odFJE5EEnFW6If/6zgBGO3Oy/E4h07LUt68OgEYISJd3a3x+0rrUADNb3E4e9x5ItKP8o8qvI+zt3G6Ow1ixPlbXytjzHogw6dfxwNnl9O9GTgXsM1wP/9Q7HNJii8DlVXZ378C/EtEugGISH0RubCUduNwlocdOBuHj1SiP3E4y2sOECki9+JshJbILbJenNMJxfdyyxrGOTgbSI+564sYETnOJ8M+YI+ItMS5MLBc7rI2GRjjrru68vvGMlRiXVyG8TjL2w34HCml/HFeken9Ac71QRcU63Zlpv0RFS26n4tILk5lvxvnYoirfJr/E+eEcrq7C/8NUNn/fX2AszVyZKDcw8O34qywduEs9J/5NF+OsxJa4+7i/+kwrDHmEM4EL6nbp+Ecet6Ec1jn8MVeJbkcZ89oOc45ob+53fkG51zmJJyZtR2/H84+GltwhnUTzqHUUe5wgnNxQz7OjPIOvx8qP2wM8I47Li4yxmTgXOn6gtvNVTjnwHD3HM53P+/E2ZKbXIXcGGNW4Gz9Po+zJ3k2zt/N8qvSXXcBPxnnXOQWn9c8nFMZhxfg63BWBDtwLiLyLfbf4VxVvUVEDu8l3YKzh7wG56jNBziFHZwNlq9wrvpcgLPxVohzdWtJw17evDoN55zodzjT4btyBjsQ5rcbgQfcZf9ed9hKZYzZgLNXcRdOcdiAMz0Or2cuxbmobyfORse75WSbgbPSnFnK55KMwWcZKKf7JXkWuEBEdonIc+W1bIyZgrPeGO+u+xYDZ5TS+rs4h1U34lzQll6JXNNx5vVf3W7kUcYhV5/+9eD3DcnDxlDKOHIL5Nk450l/w7nye5jb+H6cC/j24Jy2q8z64macQ+VbcM6jvu3Tz8qui//E3VCdBRyLc2j9sPLG+ZtAV3dcfFJK5z8DOgBbjDELffpZmWl/hPzxlJ6ySZy7oLxvjGlVXrvKv9w911eMMYnlthwkdH4LbSJyBTDSGHO87Szqd2H9h36lSiMitUXkTBGJdPe07wOm2M6lVEW4pzBuBF6znUX9kRZdpUomOIfTduEcXl6Gc4hVqYDmXk+Tg3Ma6oNyWld+poeXlVJKKT/RPV2llFLKT/Qm5WVo1KiRSUpKsh1DKaWCyrx587YbYxqX32b40aJbhqSkJDIyMmzHUEqpoCIiR3N3u7Cgh5eVUkopP9Giq5RSSvmJFl2llFLKT7ToKqWUUn6iRVcppZTyEy26SimllJ+EXdEVkb+LyBIRWSwiH4pIjO1MSimlwkNY/U/XvXH9rUBXY8xBEZmA8zipsVaDKaXCivF62bRuBVtXpJO/ayMmby8SFYOnbiPiE5Np0yWVmNp1bMdUNSCsiq4rEqgtIgU4DzXeZDmPUipMrFk8m20/vkXbrV/Tkh20LKmlhXDw02jm1+2P9LyQnicPJyIyHFfVoSmspqQxZqOIPIXzcOaDwFfGmK982xGRkcBIgDZt2vg/pFIq5KzM/JED0x8g+eAcWplIltTpx7qkv9Cg4wAat+pA3foNOJR3gF1bs9m2KoOCVTNot/07Gs36kez0R9nc61ZSzx6FeMLujGDICaunDIlIAjAJGAbsBj4GJhpj3i+p/dTUVKO3gVRKHa09u7azfNzt9M2Zwh6JY3nScLqe/XfqN2xa7m+LCgtZ+PV71Mt4nvZFq1kW1ZXYv75IYucUPySvGhGZZ4xJtZ0jEIXbZtMpwFpjTI4xpgCYDBxrOZNSKgQtz/iWg8/2JzVnCnOaXEDE3zIZMOKxChVcgIjISFLOuIpj7prL3J4P0KxgA40/HMycSc9gvN4aTq9qSrgV3d+ANBGJFREBTsZ5OLlSSlWb9A8fpt3nF+KVCFYP/ZS0m96gXnzDo+qWJyKCvuePpmjkz6yJ6UK/rPuY89I1FBbkV3Nq5Q9hVXSNMbOBicB8IAtn+F+zGkopFTK8RUWkvzSStBVPsLhOf+rc+gsdU06slm43apFIl9u/Jb3ZcPpvn8zi/57NgX17qqXbyn/CqugCGGPuM8Z0NsZ0N8Zcbow5ZDuTUir4FRbks+CZC0jb9hHpTS4i+bYvqJ/QqFr7EREZSdqol5jd9W56HJjN2ufOJu/Avmrth6pZYVd0lVKquhUVFpL5/CX0yf2OWcfcSv9Rr+KJiKix/vW/6A4W9HmMLocW8etzQzmUd6DG+qWqlxZdpZSqAm9REfNevJLUvd+QnnQTA6540C9/7Uk9ZxTzku+nZ14GS164GG9RUY33U1WdFl2llKqC2W/9g367vmBWq6tJG/GIX/vd9/zRpLf/Gyn7ZjD77f/za7/V0dGiq5RSR2nupy8xYONY5jQ4m7Sr/2MlQ/9L72NOwhAGZL9FxmcvW8mgKk6LrlJKHYXls78ief49LK7Vi96j3rR2tyjxeOh9w1ssie5Jt3n3snbpXCs5VMVo0VVKqUravuU3Gk27jq2eJrQeOYGo6FpW80RF16Lp1ePYL7F4Jo5gf+5uq3lU6bToKqVUJRQVFrLl7cupYw5QeOG7Fb7DVE1r1KwNW055ntZFG1n6xkjbcVQptOgqpVQlzHnvbrofyiSr59207drXdpw/6H78OcxufRV990xnwVcl3lJeWaZFVymlKmjprGn0W/cqGfVOoe95t9qOU6I+lz/K6oi2tPnlLnblbLYdRxWjRVcppSpgf+5u4r+6lc2epnS+9o2AfcxedK0YOPcV6pl9rHn3RttxVDGBOdcopVSAWfzO32nmzSF38HPUrZdgO06Z2vVIIyPpOvrkfkfm1x/YjqN8aNFVSqlyLP7pM/pvn8ycphfRpf/ptuNUSOrwB1jnaUPTn+/l4P5c23GUS4uuUkqVYX/ubhp8exsbpAXJV9q5AcbRiIquxf5THqc5OWR+cI/tOMqlRVcppcqQ9f6dtDDb2Df4GWrXibMdp1K6HXsmGfVOpU/2e2xYudB2HIUWXaWUKtXapXNJ3fIRcxKGBM1h5eKSLv0vh4hi56TbbEdRQKTtAKFoeca3FH79AFFFeUR58zDiId8TQ35kHHl1WmLi21CnTS8Sew6kXnxD23GVUiUwXi8HP/k7+ySWDpc+ZTvOUWvUrA3pHUaRtuppFv/4Kd1PGGo7UljTolsTvF4iiw6RH1GbA9ENEOMlquggdfNzaHtwMfW274dV4P1WWBuRyJbmg2jQeygdUwYF7N8QlAo3GZ+/Qt/8LOb0GEO/xs1tx6mSXn+9nc2Pv0/MD/fjPXZIjT7rV5VNjDG2M/iViMQDbwDdAQNcbYyZVVK7qampJiMjo9oz7Nmxld+WpLNv9S/U2/wLnQ4tJlK8ZEtzNrS9kI6nX0/Dpq2qvb9KqYrZs2s7hc+msD2yOR3+9UtIFKmMz18ldd4dzO39KH2H1uz/d0VknjEmtUZ7EqTCsei+A/xojHlDRKKBWGNMiXcHr6miW9yeHVtZMXMCdZeOp2vBYvJMFAubDCXxnH/RrHX7Gu+/UuqP0l+5kX6bP2DN+VNpn3yc7TjVwltUxOpH+hFXtJv4OxYSE1u3xvqlRbd0YXUsU0TqAwOBNwGMMfmlFVx/qt+wKf3Ou4Wud//M+ktmsKjBaaRsm0KDN/qR/tJ17Nm13XZEpcLGprXLSdn8ERkJZ4RMwQXwRESQf9IDNGM7mZOftB0nbIVV0QXaAjnA2yKyQETeEJE6vi2IyEgRyRCRjJycHL8HTOzUi36jP2D71bPIbHgm/bZ+jPfZ3syZ9DTeoiK/51Eq3Gye/C8KiSDpwkdsR6l23Y47i6xaKXRc9RYH9u2xHScshVvRjQRSgJeNMb2B/cCdvi0YY14zxqQaY1IbN25sIyMAzRM70e/W91lz/lS2RLWmX9YYlj0+iE3rVljLpFSoW5HxHX1yv2NR68to0rKt7Tg1IuqUu2nAXhZNDt4rsoNZuBXdbCDbGDPb/TwRpwgHrPbJx9H5Xz8xt+cDJB5aSb23T2Tu5GcxXq/taEqFFOP14p1+N9uJp/tFoXsHp859T2FRTCqd1ozVh91bEFZF1xizBdggIp3cr04GllqMVCHi8dD3/NHsvWoG62t1oO+ie8l49hLyDuyzHU2pkJH59Xt0KVjK6m63BvwDDaoq+pS7SGAvi/Tcrt+FVdF13QKME5FFQC8gaE7ctEjqRJd//sCsNiPps3s6G/9zAhvXLLMdS6mgV1RYSIPZT7De05o+595iO06N65x6Moti+tJl7Vj27d1lO05YCbuia4zJdM/Z9jTGnGuMCao5zhMRwYCrnyTrxNdoXLSV2HdPZfncb2zHUiqozZ/6GonebHb0+z8io6Jtx/GL6FP+RTz7WPz5c7ajhJWwK7qhIvmki9h72Vfsl7okfXEx86e/ZzuSUkGpIP8QzTOfZXXEMfQ69XLbcfymc+rJLInuwTErx5J/KM92nLChRTeItWrfndgbvmV9VDt6/XILsyc8YTuSUkFnwecv0cpsIXfAHSFx56nKKBwwmibsZOG0N2xHCRtadINcgyYtSfzHtyyqk0b/pQ+T/sGDtiMpFTQO5R2gTdaL/BrZkeSThtmO43c9T/wraz1JNF70it4HwE+06IaAmNi6dB39CfPrnEDar0+R/t69tiMpFRQyP32eZuSQd/ydYfmwEfF42NFrFEneDSz6foLtOGEh/OayEBVdK4YeoycxL+4vpK1+lvR3Q/d/hkpVh7yD+2m77BWWRXWlx8DzbMexJnnw1WyhMbVm6wVV/qBFN4RERdci+dYJzIs7ibQ1zzFn4n9tR1IqYC384mWasJPCE8JzL/ewqOharOt0FV0Kluo/IfwgfOe0EBUZFU3PW8azMKYvfbIeYP60t21HUirgFBbk03rpa/wa2ZHux59tO451PYbcRK6pzf6ZL9qOEvK06IagqOhadLxlCr9Gd6F7+m1kzfzUdiSlAkrmtDdpYbZyoP/fw3ov97A6cfEsaTaUnntnsG3jWttxQprObSGqdp04Wtz4ORsjWpP07fWsXzbPdiSlAoK3qIhGmS+y1pNIzzC8Yrk0rU+/lQi8rJ6m53ZrkhbdEFY/oRG1r5rEIalF1IRL2Llto+1ISlm38NsPSfJuYEfvm8Luf7llaXlMNxbVSaNT9kTyDu63HSdkadENcc1at2fnOe/QwLuTba9foAuTCmvG66XOnGfJlmb0GnyV7TgBJ3LADTRgL1nT9VqQmqJFNwx0TBnEkv5P0rlgKYtfvlIfC6jC1uKfPqVj4a9s6nZ92NxjuTK6HXc26zytSch6S9cTNUSLbpjoc+ZVzEocRerer5n90aO24yhlheen/7KNBiQPGWU7SkASj4etXUbQvmg1K/TvQzVCi24YSbvyURbEHkuf5f9h+eyvbMdRyq9+nT+DbvmLWNNhBLViYm3HCVg9zriOvdQh95c3bUcJSVp0w4h4PBxz3Xts9TSmwbTr2b5lg+1ISvlN7vdPk2tq021I6D8vtypi69Znyzkf0H2kPgShJmjRDTP1ExqR/9d3iTP72PrWpRQW5NuOpFSN27x+Bcl7Z7Ck+fnE1W9gO07A65gyiNp14mzHCElhV3RFJEJEFojIF7az2HJM9/4s7j2GbvmLmPvOP23HUarGrf/yvxiEpLP+YTuKCnNhV3SB0cAy2yFs63vuTcyNP4N+G95m6axptuMoVWP27t5B9y2fsrD+X2jWur3tOCrMhVXRFZFWwFmAnqwAulz9Mps9zWgw/Wb27MyxHUepGrH0i+eoKweJP/nvtqMoFV5FF3gGuAPQP6ABdeslcODsV2lodrH6rav1f3kq5BTkH6LtqvdYEt2T9snH246jVPgUXREZAmwzxpR5E2IRGSkiGSKSkZMT+nt/HVNOJKPdTaTsm0nGJ8/bjqNUtVo4fSxN2UFB/5tsR1EKCKOiCxwHnCMi64DxwEki8n7xlowxrxljUo0xqY0bN/Z3Riv6Dx/D4lq96LbwYTauCfvT3SpEGK+X+MxX+c3Tkp6DLrQdRykgjIquMeZfxphWxpgk4GLgO2PMZZZjBQRPRASNLnuTIjzsHn8d3qIi25GUqrJls6fTvmg1m7tcow82UAEjbIquKluz1u1Z1vNOuuVnMffjJ2zHUarK8n56iT3UoeeZI21HUeqIsCy6xpgfjDFDbOcINH3Pu5VFMX3psexpNq5ZYjuOUkdty4ZV9Nz3E8uanas3eVABJSyLriqZeDw0vexVivCwZ/z1ephZBa21/3sewdBm8GjbUZT6Ay266g+atmrH8uR/0TU/izkTHrcdR6lKyzu4n84bJ7OozgBaJHWyHUepP9Ciq/4k9dxbWBjTl57Ln2Hz+hW24yhVKVnT3yaBvUQN0Mf3qcCjRVf9iXg8NL30ZQC2jb9Fb5qhgobxeonPept1ntZ0O+5s23GU+hMtuqpEzdp0YFHHm0k+OJsF09+xHUepClkx7zs6FK1ia+crEI+u3lTg0blSlSr1ojtZFdGO1rPvZ+/uHbbjKFWufTNfYi+xdD9D/yakApMWXVWqyKhozJBnaGB2s+z9/7MdR6kybd+0nuS9P7C0ydnUiYu3HUepEmnRVWXq0Hsgc5tcQN+cKazI+M52HKVKtfJ/LxCBl1an3Wo7ilKl0qKrytX98ifZLglEffl3CgvybcdR6k/yD+XR4bcJZMX2pVX77rbjKFUqLbqqXHXrJZCddh/HeNcxb9J/bMdR6k8Wff0ujdgN/fRcrgpsWnRVhfQ+7QoW1+pFl+XPs3PbRttxlPqDOgvfJlua02Pg+bajKFUmLbqqQsTjIe7c/1Lb5LFq/D9tx1HqiLVLZtOlYCnZ7S/RpwmpgKdFV1VYYpc+zGt2Iak7vmDlgpm24ygFwLbvX+GQiaLz6dfbjqJUubToqkrpeskj7JT6eKferg9EUNYd2LeHrjnTyKo/iPhGzWzHUar4KFM+AAAgAElEQVRcWnRVpdSLb8ia5P+jU+Fy5n3+su04Kswtnv42cXKQusfpBVQqOGjRVZWWes6NrIjsTNvMJ/VOVcqqhGXvs9aTSKe+p9iOolSFaNFVleaJiMBz1pM0MHtYOv4e23FUmFqZ+SMdCleyreMlep9lFTTCak4VkdYi8r2ILBWRJSKiT7g+Sh16D2RewmBSNn/EprXLbcdRYWjXzFc5YGrRZbAeWlbBI6yKLlAI3GaM6QqkATeJSFfLmYJW4oWPUkgEmyfpX4iUf+Xu2Un3HV+xOOFk6sU3tB1HqQoLq6JrjNlsjJnvvs8FlgEt7aYKXk1atmVhmyvos+8Hls/52nYcFUaWTn+DWDlE/EB9UL0KLmFVdH2JSBLQG5htN0lwSx52DzkkIF/drQ+7V35hvF6aLB/Hqoh2dOh1gu04SlVKWBZdEakLTAL+ZozZW6zZSBHJEJGMnJwcOwGDSGzd+qxN/gedClcwb9qbtuOoMLBi3ne09a5jR+fhegGVCjphN8eKSBROwR1njJlcvLkx5jVjTKoxJrVx48b+DxiE+px9I6sj2tJy7uPkHdxvO44Kcbk/vc4+U5tup19tO4pSlRZWRVdEBHgTWGaM+a/tPKEiIjKSg4Pupzk5ZH78mO04KoTt2bGVHru/ZUmj06lbL8F2HKUqLayKLnAccDlwkohkuq8zbYcKBd1PGMrC2v3ptvp1dmzNth1Hhahl018jRgpoNOgG21GUOiphVXSNMT8ZY8QY09MY08t9fWk7V6iIH/oYtTnEqon32Y6iQpDxemm+ajwrIjvTrkea7ThKHZWwKrqqZiV2TmF+w7PovW0KG9cssx1HhZil6f8j0ZvN3u6X246i1FHToquqVdJfH8SLh82f/Nt2FBVi8ma9zl7q0OO0EbajKHXUtOiqatWkZVsWtLiElD3fsjor3XYcFSJ2bM2mx94ZLG1yFjGxdW3HUeqoadFV1a7rhfeyT2LZN1X3dlX1WDn9VaKliOYn6QVUKrhp0VXVrn6Dxiw95hqS8+ay5Be9Tk1VjbeoiNZrP2JpdA8SO6fYjqNUlWjRVTWi1wX/ZBsNiPxujN4eUlXJkp8/o6XZyoGeV9iOolSVadFVNSImti7retxKp8IVLPh6nO04KogVzH6TXdSjxymX2Y6iVJVp0VU1JuWcm1jvaUXD2Y9RWJBvO44KQjmb1tFz38+saHY2tWJibcdRqsq06KoaExkVzY7+d5LozWb+Zy/ZjqOC0KrpLxMpXlqdcqPtKEpVCy26qkb1PnU4KyI7k5T1LHkH9tmOo4JIUWEhbddPJKtWb1q17247jlLVQouuqlHi8VD4l3tpwk4yp+gzJlTFZc2YSDO2U9B7hO0oSlUbLbqqxnU77iyyavWm48rX2Z+723YcFSwy3mY78fQ46RLbSZSqNlp0lV9En3ovDdjLoslP2I6igsDm9SvoeWA2K1ueR1R0LdtxlKo2WnSVX3RKPYnM2AF0WzuWPbu2246jAty6r18BIOk0vQOVCi0BWXRF5BYR0SdUh5i4wfdSj/0sm/SI7SgqgBXkH6J99hSyYvvSPLGT7ThKVauALLpAU2CuiEwQkcEiIrYDqapr1/NY5tc9kR4bxrErZ7PtOCpALf5+PI3Zhelzte0oSlW7gCy6xph/Ax2AN4ERwEoReURE2lkNpqqs4ZAxxHCIFZMetB1FBajI+WPZQiN6DLrQdhSlql1AFl0AY4wBtrivQiABmCgiVboSx91zXiEiq0TkzmqIqiohsXMK8+NPo9fmCWzftN52HBVgNq5ZQo9D81mbeAERkZG24yhV7QKy6IrIaBGZBzwB/Az0MMbcAPQB/lqF7kYALwJnAF2BS0SkazVEVpXQYuj9ROBl9eT7bUdRAea3r1+i0Hhof7peQKVCU0AWXaABcL4x5nRjzMfGmAIAY4wXGFKF7vYDVhlj1hhj8oHxwNCqx1WV0fKYLsxvNITeOZ+wef0K23FUgDiUd4DOmz8jq+6xNG6RZDuOUjUiIIuuMeY+Y0yJxx6NMcuq0OmWwAafz9nud0eIyEgRyRCRjJycnCr0SpUl6bz7MHjY8Inu7SpH1jfvk8BeIvtdYzuKUjUmIIuuTcaY14wxqcaY1MaNG9uOE7KatmrHgqbnkbJzGhtWZdmOowJA7KJ32ShN6Xa8HnxSoSvciu5GoLXP51bud8qC9uffSz5RbP1sjO0oyrL1y+fTNT+LDW2H4YmIsB1HqRoTbkV3LtBBRNqKSDRwMfCZ5Uxhq1Gz1ixsOYyUPd+ydulc23GURZu/e5l8E0GH06+3HUWpGhVWRdcYUwjcDEwHlgETjDFL7KYKb13/+m/2E8PuqWNsR1GWHNyfS9dtU8mqdyINm7ayHUepGhVWRRfAGPOlMaajMaadMeZh23nCXf2GTVmceDm99//EyswfbcdRFmR9NZZ67CdmwHW2oyhV48Ku6KrA0+38O9lNXQ5Mf8B2FGVB/SXvs97Tiq5pg21HUarGadFV1tWLb8iytiNIPjiH5XO/sR1H+dHqRb/QqXA5m9tfjHh0daRCn87lKiAk//UOdlCfwm/0nszhZPuMV8kzUXQ5faTtKEr5hRZdFRBi69ZnZcfr6H4okyU/T7UdR/nBvr276L79f2TFn0z9hk1tx1HKL7ToqoDR67x/sI0GeH54GOP12o6jatiS6W9RR/KIO14voFLhQ4uuChgxteuwtusNdClYQtbMKbbjqBpkvF4aLh/HGk8SnfqcZDuOUn6jRVcFlN5Db2Uzjan906O6txvCVmbOpH3RanI6D9cLqFRY0bldBZToWjFsSL6VDoUryfzmA9txVA3ZM/MVDphadD39WttRlPIrLboq4KQMGcUGaUH99CfxFhXZjqOq2a6czfTc9Q1Zjc4grn4D23GU8istuirgREZFszXlbxzjXceC6WNtx1HVbMW0l6glBTQ5+WbbUZTyOy26KiD1PuMa1nna0CjjvxQVFtqOo6pJUWEhiWs+ZEl0T9p27Ws7jlJ+p0VXBaSIyEh29ruNRG8286e+ZjuOqiZZP3xMc3I41Ptq21GUskKLrgpYvU69nFUR7WiR+QwF+Ydsx1HVwJPxOttoQI+TL7UdRSkrtOiqgOWJiGD/cXfQ0mxlwWcv2o6jqmjDyoX0zJvH6sSLiIquZTuOUlZo0VUBreegi1gR2Zk2i1/kUN4B23FUFWz8+gXnQfVn3GQ7ilLWaNFVAU08HvIH3kUztpP5ybO246ijtD93N922fs6ieoNo1KyN7ThKWaNFVwW87sefzZLoHrRb/goH9+fajqOOwuL/vUGcHKTuCTfYjqKUVWFTdEXkSRFZLiKLRGSKiMTbzqQqRjwe5KR/04jdLJzylO04qpKM10uTZe+yOuIYOqWebDuOUlaFTdEFvga6G2N6Ar8C/7KcR1VC17TBLIrpQ6dVb7Jv7y7bcVQlLJs9nbbe9ezoeqXeZ1mFvbBZAowxXxljDt9lIR1oZTOPqryY0+4lgVyyJj9uO4qqhLyfX2YPdegx+BrbUZSyLmyKbjFXA9NKaiAiI0UkQ0QycnJy/BxLlaVjyiAWxB5Lt3XvsGenTptgsDV7NT1zf2RZ03OoXSfOdhylrAupoisi34jI4hJeQ33auRsoBMaV1A1jzGvGmFRjTGrjxo39FV1VUL0z7qMeB1g6+RHbUVQFrJn6DIKhzRl/tx1FqYAQaTtAdTLGnFJWcxEZAQwBTjbGGL+EUtWqXY805k8/kZ4bPmBXzh0kNG5uO5IqxYF9e+i6eRIL655ASlIn23GUCgghtadbFhEZDNwBnGOM0bssBLGGQ8YQwyFWTHrQdhRVhqwvX6U++4kdeIvtKEoFjLApusALQBzwtYhkisgrtgOpo5PYOYX58aeSvPljtm9abzuOKoG3qIgWy95mZWQHOvUt8wCUUmElbIquMaa9Maa1MaaX+xplO5M6es3Pvo8oClk95QHbUVQJsmZ8TGuziT3J1+nfhJTyoUuDCkqt2ndnfoMz6b3tE7ZsWGU7jiomYvbLbKMByaePsB1FqYCiRVcFrTbnjQFg/ZT77QZRf7B2yWy6H8pkddtL9WlCShWjRVcFrWZtOrCg8Tmk7JjKxjXLbMdRrpyvn+GgiabrkFttR1Eq4GjRVUHtmPPvowgPmz+5x3YUBezYmk3yrq9Z1OhM6jdsajuOUgFHi64Kao1bJLGgxTBS9nzD6qx023HC3q9Tn6WWFNDsNL0ZhlIl0aKrgl7XC8eQK7Hsn3q37Shh7eD+XDr/Np6FtfuT2KmX7ThKBSQtuiro1W/QmGXtR9IzL4PFP35qO07YWvT5CySwl6gT/2E7ilIBS4uuCgm9/no7W2hMzA/34y0qsh0n7BTkH6LN8jdZHtmFLv1Osx1HqYClRVeFhJjaddjQ+x+0L1rN/Glv2o4Tdhb+722ak0Ne/1v1ZhhKlUGXDhUyUs4ayRpPEi3mPcWhPL29tr8Yr5cGmS+zztOanicNsx1HqYCmRVeFjIjISPadcA8tzFYWTHnadpywsWjGJI7xrmNbj+vxRETYjqNUQNOiq0JKjxPPZ3GtXnRa8Qq5e3bajhMWImc9y1Ya0uvM62xHUSrgadFVIUU8Hmqd8RAJ7GXxBH0YQk1bkfEd3fKzWNvhSqJrxdiOo1TA06KrQk6HXicwL+4kemWPI2fTOttxQtqB755kL3Xofrbe8lGpitCiq0JSs/MeIYIi1k74l+0oIWvVwp/pfeAXlrS5jLr1EmzHUSooaNFVIanlMV2Y3/xiUndNY2Xmj7bjhKS9Xz3KXmLpet4dtqMoFTS06KqQ1fXiB9ktcRRO/SfG67UdJ6SsXTKblP0/sqT1pdRPaGQ7jlJBI+yKrojcJiJGRHRNEeLqxTdkZbe/0aVgCfP/947tOCFl57RH2Gdq0/Vc3ctVqjLCquiKSGvgNOA321mUf6SeN9q5Ycach8k7uN92nJCwftk8eufOIKvVMH18n1KVFFZFF3gauAMwtoMo/4iIjOTAyQ/RnBwyP3rYdpyQkPPlw+QRTZfz9CI1pSorbIquiAwFNhpjFpbT3kgRyRCRjJycHD+lUzWp+3Fns6DO8fRc+wbbN623HSeorV8+n5S937GwxTDiGzWzHUepoBNSRVdEvhGRxSW8hgJ3AfeW1w1jzGvGmFRjTGrjxo1rPrTyiyZ/fYJIilg74Z+2owS1HZ/fx0Fq0em8O21HUSoohVTRNcacYozpXvwFrAHaAgtFZB3QCpgvIrqpHiZaHtONeS0upu/uaSzP+NZ2nKC0csFMUvbPZFGby2nQpKXtOEoFpZAquqUxxmQZY5oYY5KMMUlANpBijNliOZryo56XPsw2GhA17f8oLMi3HSfo5P3vPnYRR/cL7rIdRamgFRZFVymAOnHxZPe/l3ZFa8iY+JTtOEFl8c+f0+PQfFZ0uI64+g1sx1EqaIVl0XX3eLfbzqH8r/fpV7IoJpVuy5/Ti6oqyHi9RH3/oPMkofP/z3YcpYJaWBZdFb7E4yHhgmeoRQHrxv/DdpygkPnNB3QqXMH6HrcQU7uO7ThKBTUtuirstG7fg/mtryR17zcs/vlz23ECWkH+IRrNepjfPC1JOecm23GUCnpadFVY6nXpA2ySpsR9eyf5h/JsxwlY8yY+SWuziZ3H3UtkVLTtOEoFPS26KizFxNYl54SHSPRmM29cuX/fDkt7dmyly68vkVUrheS/XGQ7jlIhQYuuClvJJ13EvLiT6LP+DdYunWs7TsBZNv5u6poD1B36BOLRVYVS1UGXJBXW2l7+AvulDgWTb6SosNB2nIDx26+Z9Nk2mYxG59C2a1/bcZQKGVp0VVhr0KQlq1PvoWPhr8zVByIcsWvKHeQRTfuLHrEdRamQokVXhb0+Z15LZuwAkn99gexVi23HsW7BV++TfHA2SzpcT8OmrWzHUSqkRNoOEGwKCgrIzs4mL0+veD1aMTExtGrViqioKNtRAOe/uy2Gv0zhawPYM2EULf45A09EhO1YVuzP3U3zX+5jrSeRPhfp7R6Vqm5adCspOzubuLg4kpKSEBHbcYKOMYYdO3aQnZ1N27Ztbcc5oknLtsxN/hd9F91L+viHSBt+n+1IVmSNu4s0trP89JeJiq5lO45SIUcPL1dSXl4eDRs21IJ7lESEhg0bBuSRgtRzb2FB7HGk/PocaxbPth3H79YumU3q5g+ZkzCEzv1Psx1HqZCkRfcoaMGtmkAdf+LxkDjidfZKXWTySPIO7rcdyW+8RUUc+uRv5EpdOg7/j+04SoUsLbpK+WjQpCUbBz5JW+86MsfeZjuO38z56BE6FyxlVa87iW+kj5lWqqZo0Q0Dn3zyCUuXLvV7f8eMGcNTTwXfI/SST7qI2Q3PJW3rh2TNmGw7To3bsHIhySueI7N2Gqnn3GA7jlIhTYtuGKjOolsYJjeQ6Hn1C6z1JNLq+9FszV5tO06NKSosZP+EURRIFC0vf1XvPKVUDdOrl6vg/s+XsHTT3mrtZtcW9bjv7G7ltnfuueeyYcMG8vLyGD16NCNHjqRu3brs27cPgIkTJ/LFF18wcuRIPvvsM2bMmMFDDz3EpEmTyM3NZdSoURw4cIB27drx1ltvkZCQwNy5c7nmmmvweDyceuqpTJs2jcWLFzN27FgmT57Mvn37KCoqYurUqQwdOpRdu3ZRUFDAQw89xNChQwF4+OGHeeedd2jSpAmtW7emT58+1Tp+/KV2nTgiLn6X6HGns/Wdy2hw+w8heTXv3PEPkVawlIyUx0htkWQ7jlIhTzdrg9Rbb73FvHnzyMjI4LnnnmPHjh0ltnfsscdyzjnn8OSTT5KZmUm7du244oorePzxx1m0aBE9evTg/vvvB+Cqq67i1VdfJTMzk4hi/1OdP38+EydOZMaMGcTExDBlyhTmz5/P999/z2233YYxhnnz5jF+/HgyMzP58ssvmTs3uO9n3KZjL5b3e5jOBUuZ9+Zo23Gq3crMH0lZ+RwLYo+jz5DrbcdRKiyE1Z6uiNwC3AQUAVONMXdUpXsV2SOtKc899xxTpkwBYMOGDaxcubJCv9uzZw+7d+/mxBNPBODKK6/kwgsvZPfu3eTm5jJgwAAALr30Ur744osjvzv11FNp0KAB4PzX9q677mLmzJl4PB42btzI1q1b+fHHHznvvPOIjY0F4Jxzzqm24bWlz1nXMnvtz6Rt/ZAF0wfQ+/QrbUeqFvv27qL2p9exS+Jpe/VbelhZKT8Jm6IrIn8BhgLJxphDItLEdqaj9cMPP/DNN98wa9YsYmNjGTRoEHl5eX/4K051/w+2Tp06R96PGzeOnJwc5s2bR1RUFElJSQH5v9vq0uvaF/n1qcV0+uV2VjfvQLuex9qOVCXG62X5G9fS27uFFWeMp6terayU34TT5u0NwGPGmEMAxphtlvMctT179pCQkEBsbCzLly8nPT0dgKZNm7Js2TK8Xu+RvWCAuLg4cnNzAahfvz4JCQn8+OOPALz33nuceOKJxMfHExcXx+zZzk0hxo8fX2b/mzRpQlRUFN9//z3r168HYODAgXzyySccPHiQ3NxcPv/88xoZfn+rFRNLg6snkit1qTP5crZv+c12pCqZO+U5Uvd+w5zEkXRNG2w7jlJhJZyKbkfgBBGZLSIzRKTE55WJyEgRyRCRjJycHD9HrJjBgwdTWFhIly5duPPOO0lLSwPgscceY8iQIRx77LE0b978SPsXX3wxTz75JL1792b16tW888473H777fTs2ZPMzEzuvdd5iPubb77JddddR69evdi/fz/169cvsf/Dhw8nIyODHj168O6779K5c2cAUlJSGDZsGMnJyZxxxhn07Rs6j4Rr1CKR3PPeo57JZccbF5B3YJ/tSEdl+Zyv6bXoAbJqpdDvCn2CkFL+JsYY2xmqjYh8A5R0rOxu4GHge+BWoC/wEXCMKWMEpKammoyMjD98t2zZMrp06VJtmQPJvn37qFu3LuAU8M2bN/Pss8/WSL+CdTzOn/4eKbNuZn7dgST/bQoRkcFzhmZr9moi3jiJPIkh7uaZ1G/Y1HYkFaJEZJ4xJtV2jkAUPGuMCjDGnFJaMxG5AZjsFtk5IuIFGgGBuTtrwdSpU3n00UcpLCwkMTGRsWPH2o4UcFJOv5z07WtIW/lf5rw0gr43vxsUFyEd3J/L3rHDaG4OsX/YZC24SlkS+GuL6vMJ8BcAEekIRAPbrSYKMMOGDSMzM5PFixczdepUGjdubDtSQEobfh+zWo6g387PSX8j8P9KVJB/iF9fOJ9jClax6oSnSewSnP+dVioUhFPRfQs4RkQWA+OBK8s6tKxUWdKueZrZDYcyYNO7zHrrDozXaztSibxFRWS+eBnJB+eQ0f0eep1yie1ISoW1sCm6xph8Y8xlxpjuxpgUY8x3tjOp4CUeD6k3vMXc+oMZ8NurpL8xOuAKr/F6mfvKSPru+YpZiaPof2H4PMBBqUAVNkVXqeoWERlJn1s/YHbDcxmw6V1mvzwSb1GR7ViAs4c758UR9M+ZSHrTS0i78lHbkZRSaNFVqko8ERH0u+lt0psMIy3nYzKfPpeD+3OtZirIP8S854fTf8enzGpxBf2vfykoLvZSKhzokhjGxo4dy80331xuO5s2bTry+dprr7XymMBAJh4P/Ue9QnqHf9Ar90c2PH0S2zett5Jlz67tLP/P6fTdPY1ZbUaSdu2zWnCVCiC6NKoyFS+6b7zxBl27drWYKDCJx0Pa8PtYeNwLtCpYD68NJGvmlPJ/WI02rFzI7udPpFPeIuYkP8iAq5/UgqtUgAmp/+n63bQ7YUtW9XazWQ8447FyWyvt0X6jR4/miy++oHbt2nz66ac0bdqUzz//nIceeoj8/HwaNmzIuHHjaNr09/9p5ubm0rNnT3799VeioqLYu3cvycnJPPHEE2RkZDB8+HBq167NrFmzOOOMM3jqqadITU3lf//7H3fddRdFRUU0atSIb7/9tnrHRRDqfdplrGvdGT4eQbdvr2LW8u/offljxNSuU/6Pj5Lxepn76Qt0z3yIQxLNqsHj6DfgjBrrn1Lq6OlmcJAq6dF++/fvJy0tjYULFzJw4EBef/11AI4//njS09NZsGABF198MU888cQfuhUXF8egQYOYOnUq4Nx3+fzzz+fCCy8kNTWVcePGkZmZSe3atY/8Jicnh+uuu45JkyaxcOFCPv74Y/8NfIBL6pJK09tmkdHgLAZsepecJ1JZ/NNnNdKvzetXkPnUWfRbeA9ra3Ui/9oZdNWCq1TA0j3dqqjAHmlNKenRftHR0QwZMgSAPn368PXXXwOQnZ3NsGHD2Lx5M/n5+bRt2/ZP3bv22mt54oknOPfcc3n77bePFOzSpKenM3DgwCPdOvzYP+WoXSeOfqPHkTVzCgnf30n3by5nwS/HEX/WfbTt1r/K3d+7ewdLJj9O8vqxxGNIb3crfS+9L6huS6lUONI93SDk+2i/hQsX0rt3b/Ly8oiKijryeL+IiAgKCwsBuOWWW7j55pvJysri1VdfLfExfMcddxzr1q3jhx9+oKioiO7du/t1mEJVj4Hn0ej2ecxqcz3t988nccLpZD4xmIXfTaDInT6VsXHNMma9Phqe6c6A315lRd2+7L76J9KueFALrlJBQJfSIFTao/3Kar9ly5YAvPPOO6W2d8UVV3DppZdyzz33HPnO97GAvtLS0rjxxhtZu3Ytbdu2ZefOnbq3W4qY2LoMuPoJ9uy4jTlTHqd99iQazbyOHTP/j9Xxx+Fp/xcad+hHq3bd/1Q4d2/fwqaVC9iz7HviN/9Il4KlNDfCwjrHEnf6XfROPt7SUCmljoYW3SA0ePBgXnnlFbp06UKnTp2OPNqvNGPGjOHCCy8kISGBk046ibVr15bY3vDhw/n3v//NJZf8fqvAESNGMGrUqCMXUh3WuHFjXnvtNc4//3y8Xi9NmjQ5cjhblax+w6akXftf8g89wvzvPsQs/ZTOu3+gXsaXkAGFxsMOieOgxBJpCojlAPEcIB7wGmFN5DGkJ91E21OuoXerdrYHRyl1FELq0X7VLdwe7Tdx4kQ+/fRT3nvvvRrvVyiPx8ooyD/EbysWsGPVXIq2r8JzcCeRBfvwRtTCGxmLSUiidvOOJPYcRHyjkp5aqVTg0Uf7lU73dBXgnPedNm0aX375pe0oYSUquhbteqTRrkfZRyuUUqFBi64C4Pnnn7cdQSmlQp5evXwU9JB81ej4U0qFKy26lRQTE8OOHTu0cBwlYww7duwgJibGdhSllPI7PbxcSa1atSI7O5ucnBzbUYJWTEwMrVq1sh1DKaX8TotuJUVFRZV4RyellFKqPGFzeFlEeolIuohkikiGiPSznUkppVR4CZuiCzwB3G+M6QXc635WSiml/Caciq4B6rnv6wObymhXKaWUqnZhc0cqEekCTAcEZ2PjWGPM+hLaGwmMdD92AlYcZS8bAduP8rfBSoc5POgwh4eqDHOiMaZxdYYJFSFVdEXkG6Cke+XdDZwMzDDGTBKRi4CRxphTajBLRrjdBk2HOTzoMIeHcBxmfwipq5fLKqIi8i4w2v34MfCGX0IppZRSrnA6p7sJONF9fxKw0mIWpZRSYSik9nTLcR3wrIhEAnn8ft62prxWw90PRDrM4UGHOTyE4zDXuJA6p6uUUkoFsnA6vKyUUkpZpUVXKaWU8hMtulUkIoNFZIWIrBKRO0toXktEPnKbzxaRJP+nrF4VGOZ/iMhSEVkkIt+KSKKNnNWpvGH2ae+vImJEJOj/alGRYRaRi9xpvUREPvB3xupWgXm7jYh8LyIL3Pn7TBs5q4uIvCUi20RkcSnNRUSec8fHIhFJ8XfGkGOM0ddRvoAIYDVwDBANLAS6FmvnRuAV9/3FwEe2c/thmP8CxLrvbwiHYXbbiwNmAulAqu3cfpjOHYAFQIL7uYnt3H4Y5teAG9z3XYF1tnNXcZgHAoccVloAAAOHSURBVCnA4lKanwlMw7mpUBow23bmYH/pnm7V9ANWGWPWGGPygfHA0GLtDAXecd9PBE4WEfFjxupW7jAbY743xhxwP6YDwf4cv4pMZ4AHgcdxro4PdhUZ5uuAF40xuwCMMdv8nLG6VWSYQ+p2ssaYmcDOMloZCrxrHOlAvIg090+60KRFt2paAht8Pme735XYjjGmENgDNPRLuppRkWH2dQ3OlnIwK3eY3cNurY0xU/0ZrAZVZDp3BDqKyM/uE7wG+y1dzajIMI8BLhORbOBL4Bb/RLOmssu7Kkc4/U9X+ZmIXAak8vtNSUKSiHiA/wIjLEfxt0icQ8yDcI5mzBSRHsaY3VZT1axLgLHGmP+IyADgPRHpbozx2g6mgoPu6VbNRqC1z+dW7ncltuPemKM+sMMv6WpGRYYZETkF557X5xhjDvkpW00pb5jjgO7ADyKyDufc12dBfjFVRaZzNvCZMabAGLMW+BWnCAerigzzNcAEAGPMLCAG58EAoapCy7uqOC26VTMX6CAibUUkGudCqc+KtfMZcKX7/gLgO+NeoRCkyh1mEekNvIpTcIP9PB+UM8zGmD3GmEbGmCRjTBLOeexzjDEZduJWi4rM25/g7OUiIo1wDjev8WfIalaRYf4N5+Eph59cFgPk+DWlf30GXOFexZwG7DHGbLYdKpjp4eUqMMYUisjNOI8MjADeMsYsEZEHgAxjzGfAmziHoFbhXLBwsb3EVVfBYX4SqAt87F4z9psx5hxroauogsMcUio4zNOB00RkKVAE3G6MCdqjOBUc5tuA10Xk7zgXVY0I5o1oEfkQZ8OpkXue+j4gCsAY8wrOeeszgVXAAeAqO0lDh94GUimllPITPbyslFJK+YkWXaWUUspPtOgqpZRSfqJFVymllPITLbpKKaWUn2jRVUoppf6/vTu0qSgIogB6JxgIQaGQeCwGSSFU8MsgoROCpgAkhjbogpBBvOd5ajebnFPBdTezm8wMonQBYBClCwupqvv9rul5VV3ud2zvZucCjrEcAxZTVc/Z1g9eJPnu7pfJkYCDlC4sZt8L/JXtbu9Dd/9OjgQc5HkZ1nOdbbf1VbaJF1iESRcWU1XvSd6S3Ca56e7T5EjAQa4MwUKq6inJT3e/VtVZks+qeuzuj9nZgP+ZdAFgEH+6ADCI0gWAQZQuAAyidAFgEKULAIMoXQAYROkCwCB/RA0LwsxVL1sAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The max absolute difference is: 1.77636e-15\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "\n", @@ -1699,11 +1799,18 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The gradient of f1 evaluated at a = 1 using autograd is: 3\n", + "The gradient of f1 evaluated at a = 1 by finding the analytic expression is: 3\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -1737,11 +1844,23 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Evaluating at x1 = 1, x2 = 3\n", + "------------------------------\n", + "The derivative of f2 w.r.t x1: 12\n", + "The analytical derivative of f2 w.r.t x1: 12\n", + "\n", + "The derivative of f2 w.r.t x2: -4\n", + "The analytical derivative of f2 w.r.t x2: -4\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -1790,11 +1909,18 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The computed gradient of f3 is: [ 2. 3. 5. 7. 88.]\n", + "The analytical gradient of f3 is: [ 2. 3. 5. 7. 88.]\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -1832,11 +1958,18 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The computed derivative of f4 at x = 2.7 is: 13.8759\n", + "The analytical gradient of f4 at x = 2.7 is: 13.8759\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -1866,11 +1999,17 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The computed derivative of f5 at x = 2.7 is: 5.4\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -1928,11 +2067,17 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The analytical derivative of f6 at x = 2.7 is: 37732.5\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -1954,11 +2099,18 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The computed derivative of f7 at n = 2 is: 1\n", + "The analytical derivative of f7 at n = 2 is: 1\n" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -2003,11 +2155,27 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'ArrayBox' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m8.4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"The derivative of f8 is:\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf8_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36mnary_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0munary_operator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munary_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mnary_op_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mnary_op_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_f\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_operator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/differential_operators.py\u001b[0m in \u001b[0;36mgrad\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0marguments\u001b[0m \u001b[0;32mas\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbut\u001b[0m \u001b[0mreturns\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgradient\u001b[0m \u001b[0minstead\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mThe\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m should be scalar-valued. The gradient has the same type as the argument.\"\"\"\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mvjp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_make_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mans\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m raise TypeError(\"Grad only applies to real scalar-output functions. \"\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/core.py\u001b[0m in \u001b[0;36mmake_vjp\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmake_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVJPNode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_root\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_node\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/tracer.py\u001b[0m in \u001b[0;36mtrace\u001b[0;34m(start_node, fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace_stack\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_trace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_box\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart_node\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_box\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misbox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mend_box\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mstart_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_node\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36munary_f\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0msubargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msubvals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0msubargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mf8\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mautograd\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf8\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Assume x is an array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: 'ArrayBox' object does not support item assignment" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -2033,11 +2201,27 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'ArrayBox' object has no attribute 'dot'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"The derivative of f9 is:\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf9_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36mnary_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0munary_operator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munary_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mnary_op_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mnary_op_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_f\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_operator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/differential_operators.py\u001b[0m in \u001b[0;36mgrad\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0marguments\u001b[0m \u001b[0;32mas\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbut\u001b[0m \u001b[0mreturns\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgradient\u001b[0m \u001b[0minstead\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mThe\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m should be scalar-valued. The gradient has the same type as the argument.\"\"\"\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mvjp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_make_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mans\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m raise TypeError(\"Grad only applies to real scalar-output functions. \"\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/core.py\u001b[0m in \u001b[0;36mmake_vjp\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmake_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVJPNode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_root\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_node\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/tracer.py\u001b[0m in \u001b[0;36mtrace\u001b[0;34m(start_node, fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace_stack\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_trace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_box\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart_node\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_box\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misbox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mend_box\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mstart_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_node\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.7/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36munary_f\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0msubargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msubvals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0msubargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mf9\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf9\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Assume a is an array with 2 elements\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mf9_grad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf9\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: 'ArrayBox' object has no attribute 'dot'" + ] + } + ], "source": [ "import autograd.numpy as np\n", "from autograd import grad\n", @@ -2064,9 +2248,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -2096,9 +2278,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "a += b\n", @@ -2419,9 +2599,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -2456,9 +2634,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -2476,9 +2652,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "x = guesses[-1]\n", @@ -2495,9 +2669,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "def f1d(alpha):\n", @@ -2519,9 +2691,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -2960,7 +3130,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, "nbformat": 4, "nbformat_minor": 2 } diff --git a/doc/src/NeuralNet/NeuralNet.do.txt b/doc/src/NeuralNet/NeuralNet.do.txt index e090937ab..0267f7d80 100644 --- a/doc/src/NeuralNet/NeuralNet.do.txt +++ b/doc/src/NeuralNet/NeuralNet.do.txt @@ -792,7 +792,7 @@ We want to express this in terms of the equations for layer $l+1$. Using the cha and recalling that !bt \[ -z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_j^{l}+b_j^{l+1}, +z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, \] !et with $M_l$ being the number of nodes in layer $l$, we obtain