From 9b5bb2f20fb589ca5d887538a2a7552bec8fd9d0 Mon Sep 17 00:00:00 2001 From: miaobin Date: Tue, 17 Nov 2020 16:57:14 +0800 Subject: [PATCH 1/8] [Sample] Add RNNoise sample --- rnnoise/eat_44100.wav | Bin 0 -> 224106 bytes rnnoise/feature/rnnoise.js | 2174 +++++++++++++++++++++ rnnoise/feature/rnnoise.wasm | Bin 0 -> 230653 bytes rnnoise/index.html | 15 + rnnoise/main.js | 44 + rnnoise/model/denoise_gru_B.bin | Bin 0 -> 2304 bytes rnnoise/model/denoise_gru_R.bin | Bin 0 -> 110592 bytes rnnoise/model/denoise_gru_W.bin | Bin 0 -> 131328 bytes rnnoise/model/denoise_output_bias_0.bin | Bin 0 -> 88 bytes rnnoise/model/denoise_output_kernel_0.bin | Bin 0 -> 8448 bytes rnnoise/model/input_dense_bias_0.bin | Bin 0 -> 96 bytes rnnoise/model/input_dense_kernel_0.bin | Bin 0 -> 4032 bytes rnnoise/model/noise_gru_B.bin | Bin 0 -> 1152 bytes rnnoise/model/noise_gru_R.bin | Bin 0 -> 27648 bytes rnnoise/model/noise_gru_W.bin | Bin 0 -> 51840 bytes rnnoise/model/vad_gru_B.bin | Bin 0 -> 576 bytes rnnoise/model/vad_gru_R.bin | Bin 0 -> 6912 bytes rnnoise/model/vad_gru_W.bin | Bin 0 -> 6912 bytes rnnoise/processer.js | 37 + rnnoise/rnnoise.js | 104 + 20 files changed, 2374 insertions(+) create mode 100644 rnnoise/eat_44100.wav create mode 100644 rnnoise/feature/rnnoise.js create mode 100755 rnnoise/feature/rnnoise.wasm create mode 100644 rnnoise/index.html create mode 100644 rnnoise/main.js create mode 100644 rnnoise/model/denoise_gru_B.bin create mode 100644 rnnoise/model/denoise_gru_R.bin create mode 100644 rnnoise/model/denoise_gru_W.bin create mode 100644 rnnoise/model/denoise_output_bias_0.bin create mode 100644 rnnoise/model/denoise_output_kernel_0.bin create mode 100644 rnnoise/model/input_dense_bias_0.bin create mode 100644 rnnoise/model/input_dense_kernel_0.bin create mode 100644 rnnoise/model/noise_gru_B.bin create mode 100644 rnnoise/model/noise_gru_R.bin create mode 100644 rnnoise/model/noise_gru_W.bin create mode 100644 rnnoise/model/vad_gru_B.bin create mode 100644 rnnoise/model/vad_gru_R.bin create mode 100644 rnnoise/model/vad_gru_W.bin create mode 100644 rnnoise/processer.js create mode 100644 rnnoise/rnnoise.js diff --git a/rnnoise/eat_44100.wav b/rnnoise/eat_44100.wav new file mode 100644 index 0000000000000000000000000000000000000000..a6d360f90de1d364db6d5f8123441b4870b4fa2a GIT binary patch literal 224106 zcmYhj1y~i&_dmY7w=dl-64EIcC@P>Jc8e`YiQV1Z-GN|%3Zfz^*olRSL5N6qU*N{> z{$6|Epa1vyKl9A&%$YN1&YU@O=Iq{?J9bD&$gH_MA}nxXaLoK=U3Ce9AQ1+o5X7!Y zBta3nL{!AGi2lH-W=q&=wi59lTgn!y<6k`gu;pw8TZOa$`QNB5M*PR-0Y4vDd1~k% z_Aj1)*dJ^z!Y|KWFI4aj_{0q$fhIQU^Cb>Hj}-r&R=7bSuUm`CbLOw0(%+Z5}U#% z0v?atCH5lV7m%JsOa#_dge%BjQP*;Hm(}$g>>8lg)HD)-%i w@zSBvgg<{fF+>S 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

xueN))wR= z?On}NY=>!9?HAKiaU!)6tFw!y_4E`nK($lm%zGF|8a6N-Axg$zQdYt^p(V2K%4msB z?9EOVk4xI9T$N@rUL3?f5>~)I55+CW6h4w3X}iT_;KS55U4$&bdcU-!u%gb1*yFH6 z`wY?O!>UylA5x=Pq`Zg>vK%u?nRH6-5arUyK_X#kiLt3A3m@Wg%lClGOulvTvww># z#*-?^Pg^$>!D0&xYtn5rUu&;%yb=0&#`=aLl?XR1Fo7wq0Az%DrqPRRYyO<EHSaG^!w^pa*1lrb-89GQ&sW4q7U;!bKR{@{g8F7 z-)Ve<_R&OX*O33&?;9g+vB+LY2iZ?aB!!cmulf-F}9^qsh?$=jPVi; z@q@`Shuhr6OkxCniJNabYriNQ!@cqSLUXpBJBWo#+DS&^abQPoi>)ENh!nIQPFah< zDjXuBViR;Bkwmt~TM3hxV~m0CiYhTFdJFNvit#J>4D^?{5_Kb^sTk}vyTi_Mf5>+7 zjzqDoTCcN@l&y3IB@6rHqP>Nobb;&dMmbKe%^&j)mb61|xgYY}M~J*r zqWQwKtqnFTLR~bWnrOVoa=yi+`I)atw z1o9Ndgokao9Y-`WPh~5LXUAC=GXu#I6`|^Z549gNOPS4h6IlnzaAY4dpNSS1leLm? zvRb%gw^~@c6g?yl(^jj@xU+qlG2WI;9&>!_s?u16CkEI0skX=X3Pp2y3Hsgs-h9;d zNC+aoP`9uH>`Ln(o14&;(#fi@Y1T*8*;V^32zf`1EB}cKv)S;6iI6l>EtlH(@wPvV z12s~+PIps!k?UkFrRNYH>M`1MS)4G!Qe?<7_hl_eJ@yCr#RW4N%uwM9c*(WmcD9 z-qsGi zFKr65P8FBRB=emygivAcg-Lv!kcbY)r-QfP4?mV)3fd_lxJzRTJJ_>1Oue5<4vdpGBB@N==n{thlnNN6ENeGs2 zk1`cnhoC`<_Nocg5U$p$V2ZI=`9Y;pRz&EC>6BJ_jr<_)040{a{3o;>)>Po_b=I|X zFX0SO4&B5A&Vzjo{VdK}VWT(~^gY;1Ibk#ps~yoqGM-$5WOJqb1I$i!kvzkVVwJE0 zIgM^cwtyXaF}_-QT8g1jmb0}_>Sr>AWW8(y;lzHkEVn0#FNkVv0e9OLLwlnArOjl8 z*dC_HDrL*?65!GP5nJFq>MYD40;Fpw4SE?gVd9WqL|2kVw?GR##Cl3Rz}`4OILCSm z0r(e^#SU|;Y@cjR_-Onuc@t~Pt+TE-@3Ug;G4U8i;my%D!f>uV{~ftY6p^9$E@3;n zmfMAlCN$(H@J~62%a8$>0lS9jv0KCy>I!AU7a&=}QaE#TCIob;@P~^L)}ceOUE(&D zrsKKGXbj%gP^ zn2%(}(|ur_E90ZtxAqjfKi3PXKuP2f_mR=F3Bp;hlokplLPvBmkx2FbQpAunS$K~GA8rXUBv(|KC(L(ZZXQBLe4D1=zCBf1DlaD4b)lz-PszWMwZs)+1iOR}#N8#G$r%D- zkF>qx{PDR2FKn>In)}mN(5+NDF5y&GrR_iAI>}3J5#?eJVGFVw&%(pd1HwmP8~O=< zhPjLLxm$c=ES1!fC1QW(ygikzK~~})(2G3Hq_N$^me_afJ~|2Aim#Q#$eYNO)I8(_ zcothDABeG%+0-L!J$MCTxRv13suuSMgZNQE1WW{`qYH0hW4I>b1k8p@@d3ymemd_h z9!1|_htO2v1eeZz6*uCI$(DGfkjM($Kn#B*n(alWW-e=#fDnC(Vp0F*;Sbo-@?qb zuBSVroCK3S!sFQw)~w5biz-59QbyuSR-NrHeKk; zRoM6tu>C&d$BF_UV0ezyW2p{is-}StFs%=i~F7sx}(TUOdVsVD9b+_m^S()~-EQj$h z+%g%3nbPIb2S^H?&S3Z~`9Il7R6#efmxyCzFBD3Gw$&3Ic#f?Os0>RW8jQ}mb6QHs87}oks{*#!Etp<+*%TtUW z^Gdi%ERYc7Y*EHKurA_q{0lJ~D}WU;Pe?!*UdB`K zai~;i$2I5kMK|Es=831d_v}vo8uA4@h8;sd%S*Td3`uX~F<9Sw2`>>8?}`sVYlTUI zJF*uWhMz$TgxCB$@jX^U_`*zR%bNq7frNINtIIJ6DoBH@D&hP*`EV|##8`U~7z4Dtl@`rd-}VwJcA2pE6lIOMX> zAsI*@dKdWw=N~sX3td7AKuz*4WCS?@1dAtlXLbMqG#b2iZDDl_Mb?Q*u?LVeUy*#E zJU2lelZWDFL;wQJ8Ce6AO|m!v=z*ocSlK`^v_ZpG0Cw*eWPqp#rN=Mu?FP-ndeD2U z1l`God=g*ab5?8vbY~yXUwsHf*k^ck5U8@wz}oqMw{RjTbY6fxV1FPd3xy0}F%V0y zpw9?E*<2UHfCu{q3WLMNbRfUJLEAh870q`*cC>^XA$ejKAbom+isd~Z*Q&)~phwsi zxdL@q4vftOVC5c*|9}h~2;|ov;DI*5Rh&R+@ilP3e?^Os2fpP4NFC@O9sz&+2w>Tc zKs)GxJDdllj{w!iMxfzm6WhUG4SeW0`1ch^x-LitFm-|e1SC+OPoU*Ci6M~J#05Eu zY(uO-K#hd5u0|dq1Ciaptwz8T`iN8lf4oa{hR-DMy;DFB>;{tV0bFl3Xg)p#j&&il zqI6eF$2!YIv3sxaS+l zE0PXMyPm*c=D{cTLA%oz_C*NLY-1s&BMsVd5@=Q)2bOpdXoxmE{ne1iCK}2%7JAHO zu^ebV3FvS(WD&R_x&Uq45Bh)-`3|*ngM2vmKzot~UC-{&UK4C{{qB3!2;xCL%y|XAi&Oo^DMqpE;fMOjF-t)(x zSUOd71bVR#v}HW>(+=?4LC^+upm6F6BmA8(0Q$8raMi)$ci@R<1Lu7Z{CcH8&mDpi zn&4^_a5KTcvz~!GIwsgl_Jfu{fTsNm)bbYSElr>g)JZ*z{kvi*60MR??@=~c=)^FSBv0|GoWvJ0K?Z97~i!} z_c3AJ z!Z#qa)j(f#+2!NTEjzh7xe_j0~_Z83i>81Dd%Um|zXmq!pC8 zR`>_>p$E(~WB)hSe+Vhiui8V44S;#e1b;WMbq!?>fto2G*Hj;<`>6l*Gf$w2+Cm?j z4gbc$l>?!LLLuu?L)N4*&~}k<)d;wYFWjp=wB#sg%ZB`L4SC-h@||^qt4@Pw5(U5U zhyA$^yff>6&!aDV+K`uSG+d<@e0Kztd?I|iH(YlmJi+5IhqQs#c81cdhipYV;L`zc z^|g?7@D#i=4DQnhdd+HRqe<{;1U&J}kag$|JpYCae4Aj@9EX{8Hq>k>jHUz759Y#i z-VbBz7cg7<;J4%9PO@YyFA z!~5Z?%izAN;cAQFTlfFBa$JMDH{{mZ4rTZTcOD9@*#T;L4T#QT@Xbm8zYp(+QuKgK zT3w-j4N)HFp%39fM;=DZ(J!X;4VEl|UBV3G4+ zp1cQbu>*Sb5h!~s%thPb*Zbg#SD}nc;Ho>}DjAUbsDVsB3iY%DMVkay7z1PIAj}94 zpk`B`?WRLrcES65pvE6yZu|)|#|C(J8q~BQ3)OnK!!uY3S>Whi!VJ6$O8x}akA`_; zDctk?|Jv{lygCgnR08W}Jd}P9e78YQ*#pUiRy+c8avjj^qWR z7IK0aq8-$5K8z>3KtfAd#l=vn>&Q+}c^(Ox#_eHM-G@|wKf4oZgZeaN$k+xE8%eN& zABO!vHjwZqfZsg{y35-jBI5-Z~Db;^wfvs9*&ijJ89S$TgvwcM&pSO=V%nunKa*D3LbeHer)6 zOzZ`(?uwIy8@yI%4CRjzR{<{-0TzvK&~jnoIo_Y=_$b&{EEKy6U-?sDt=osjLfpVh zcsdaX4yVxrNGj|i{EORbK=Ygnh192^_!0PUZ z{06n_wGh2f05c&DD?)3S`9k4aU0^0DE^AXz}T=KYIdE1CN1E zzl#h+Ef4`RiQmVfEC~#u8&U=lIbDRy+(hmh-yMm@dg3E7$R7lZC@#DdFQFf>CD=P; zrSO}}6(leZ}qWv15C1e=HqZ zZ?SM2;%?Gm#P)?5=r&?OS3`urRTytGVJv&XxImFVK>06*sEM=a8;CVKjbyBANwZY zsZK~S*%e}fKrrR>P5vdOrsPyNyZ{)`D?m9{LnO*-q?wo^FyM_k$Cc9I_AvSZcM2Ja z$%luAy?_&!IpD_ro@zH82CuM2b-#ED>1?>*iLVXA#7UTg(g+4pV1U(^XdBN;1rE z=nmu?^?c15$tb?1-GezUE`VsD8xSo*i9YNEQ=jU$mC43K*bX(Sis!?sCl-IKAg|W+pRL z^dq(@mZvZ}%+Z~p{ORLH)P9u&!caF$;?DFnhco}EiQ3zm#?%@%$tK}9QOA{nygxpH zy=-5_t;Cy2e^W`~8CzqsHyucp>5jU7)G-)lUQ(yA{w41?EO6{5;jQ!Q9L#z62!}GK zO4&J@(El~Xp&c~Q4!dOY*gi%V^G9Kyyh3wX*^{`PUQQ<1)S&MjLB}Hdhylbf z#A@%O&#Y3`J!N*tvmLam-CS&~XN`r{s)oC6(>+D14ZrGFu}R8k_i>(?4iwSH{GnoV zSwg)Abfqc z<{d8>Z1^LY?DozBRj;$pC~ch|T2+X2bJ^kj!=a7PzOKAxjQt>yMM6|S?X#+5*2U6% zU6%ZUy??z&~Z?a`tVr>wN;ly2xt&c_-6FcCA<2$~H$Ght^87{EGMThn-jZY;*6ey(?3Y zF+!d7tmQSb!0DQQta}kVDeLTauflfH#=*Y=H)ET!-M$wU1*wvnOPiI;5(?Y=Ovx)D zOPelj-^st;y64A`celQk>EF1PHkss|!T9}a`NO~9H`3QF)#V5hTj^A~-*R11;`mvz zz*JBbW}oaZu+dAOSHy_Q+WghEU8yT>b3H#eB*>0P@?@uF3-Nlk5!;_QtvlkD;SfTc zvDI6bV~@45&OMZ;7^Zf(!9)!7)-(V=oGh`E&*b6+4_P7`W_Oy zZndnxEuhAzUy8&l$0@&~JMG2v2I7cnm%N<0T=})6wb3ry=sDm0IPOyM`d_1BtvJzh ze$Yji{Dl6dPn(WfNwS-(hwmwepOzh2d;d1A`ldP&oF5QJJ}7n0uB^4G@kS=k zwcM24mg$w%FI2$+H6ET~eMwG!Cu3jbI`_lcO4_FasqD)3)_S`=P)V7&HJ9pgc@Om$ z#|_FDQ33i1d-zCHCx$Uk=qw~iaZwW>o50nX-?Fz<6TF(cpTr)P|H-x1?b56c8sJrK zz5UbSOVh$4&9mlTeDK;uuSehY`*BR_(Dp#FY6a)x+7s9;^W6ILwrTU0&iaQhS&z zv_H_V(Lc9s#+oa9Rfi>MKq$@>GG(aKJ4d-hZ`oMe%F<4n<;uF`5}9?@(&Yx7bdl>} zhrisc^1a1}%$RDDd$PvCeyCJd0lox}lR>pE#nwgtPW{?m@Pt3^T;;J_)q^(GY}U6x z-e^WUR!c@%d@JwQoE7vA`#ilJ>NtIsqOvKyT|3P8o@Z~Vt1+OwRqZjMsmAQIRc*n# zaP5&qt&bzO6Kc*~U4Fe!?e`A4xVww4JW``5!BwCTzKoWAifa zu%-yzWeM7^x&*}+^pO3oImb2#sgQP8o|lZ}^`>FQL`ExX;q=t0MD~|CV`y!5L3%0w zXnsh$@Z+tG>DSnM`FeQ}_T27h-Ov4|!j#)2|gsiuRTU)Ukh*;GThi|&0N(HqBeTqbbwtlR9r<|pBqdDAiwuexSD`hR^$4QPm zY0lU0GED#iYCm=rVgXWVe;&sJBtFy;WFWKOwt>FFo5X=aOJn+3PYIkng$0RaTpQj8BHNGi!)-nF88xK7)NY0pw}+(B z_&+{|{lYoHnKPJIG1YcE^IBMp&O|4RM&3<~#ayT|sxwh3Ug7@ZoWYwE0E!zEVSl@t zOpu1l&XT>v-Sk4+Bf7CL3w1;f^XuqCwr%#qOf$9-?P{$u&$ms3$b@g=DfWu3#9oKA zQ`R}wI{cEo5E{|_K-+bO{DZ`Sml~c|SLnm|1nEU!+&=T`tTmS5Y&T3n@q`Th!k6+p z(T!A<43od2-l2{7GO>w5zHnnh>@Rx0pbJCZjfPNAlbG^Bh{8@1g z8VnJ|0vbWwk?vM~*OaOfrGIfx3?&jMJGBGv2l3QnNnfqa?Y#Rz?S5>H4Yy=5LAXW| zgLh-S%>~9-+j?OXR);(Rs_3OD#Wc>0m=@O)HKo--28byk_o+H*gVY(ay;KnyCh08w zL#1P*g{j;FA(U7pE0#BwOhfK7{pnfU59AQ`P)w)QmVEOSItnR)EIntDGmh2}D9RLwn;Z z$%j+}e?AYHBIF7W(Tk82#Tkua#+bJm8OwUkjz-{Jk!SEcaE9S9@jHK&rYw|6XX(M1 z#pn1u;tRGB2?ZMv4!d_pOo2?~!?^dtWYSAL(0R4%J4dZ@7ZHvmi8P#NGx^bU6KkyX zIs>+6P-Y;-OY9uj4V@9g@T=q=Y8Lg7d_|nX&tooF3*gM9*kYud-^Na7{xLMWnmf&U zF!$+eY@*nUsHSYxX7Vxdh5RX*EZs$Bic6R{dnG#pG_reP$634io#{M%8ULzit(qli zA>>%+n44Pb?cNZ{)1CHVC6My%4zVAfg#Jc`;+!NzxlT1pabEJA*g$-sHpTv|%0n$v44~2=dVC)qMHsLt;x#rNcJ9yECfph3 zyX}l+u4N;TTRjCwh%w0|o{@XWkw8rKM7JV8L<_HAI-8yA?p1!MxL6%v@UYEdlezQk zak|{zkNu4>lG*BDheU^&y33k}>KJtowOKhs-dYk(WMRqJFFb;zsLte6ESGOeceF0C z9-$3<2>200kb6AFont?P4$M!w#+GeeVB1H}<0gV3cp5R7nk|_niKos|m6C1p$I7HJd-qlvf zW|r8FT7s=h?LV09Y%?aw*37!oT3|0`dx4+mj&L3#YwOtstd_mQG-HO-z3c~V1MDGe zhWLcIFG-e|$g_l*^p}h3mbyfB59wxP19Q;!1ft2-nIiR}pm?!l~OWE9BE%=`fTWGvRXH>L&Za=3=2me zif{N{tlHkgJV`&h_P?41wUZ2jO@%&E3~)K&Gb7-FpR-3>U0d07A_hM|?vOr`cUP>F z_mnM>4v>zPE|P2|lwzSRPd~SYthrvl$)aG#gZe@V|AgDjwFUKnc)lO!#SFIx+B-30 zg|)a&nj-I^2$v6l=*S|ax2}ovJ=djfTDRSclENzKq zz9N@;Nt`135HHXUFiS6k-nN5KL!PS@*i5F4d7^Q-8MB8n&*{dt{$|$L*=)3R$3yVNTe6=%HLK@|+;38-yJc37UZ~Y#`bU+l2kVGVrHlv1FXA zw``syjEF@J@-x^vI>sJronqc^>~0J;f3U@|pM?;xP1Yj8SRPK0H;8vw7$OlSaXpyF z*4u`{8hzF4+KcAP+#d8eqG6^OCRgvPo@6v}DO49_Gi7h-J3Jhs0p{Z-;tf%S{Xh~S z_WU_|7Sw?vk)dF3>@9$O21a!O)>W8k)9DvgNh%^LoofFYaxBsI7xZSPC+h_?%`UD0 z>|o;Z5Bg;S14uXKV#@k`FJa7AHJftr-6k0wpQn3_m4fc}R5Vg0Jzs*M?cEVXMR~s~Kwc9nz z)z6e4Wsk|F=nTQ1SMYDSaJJOGz}DaXiVZ+|;Ct{$G*FOnMeI_(QoM-0Bs6OcC zIz55hTkdL!Y#RZqJLq#HU^{RJJQ=kk|Io+82iqfH>*l0 zjPGEYSo5hept@K6K=Ud_Q z^#S>6+|0;KUuwEk^e;t9UX(*|q^xDu&enUDC)PZA zk&uDiAU9A0A*NI%JuE+^Jf?J&ccKchnP@2*imQm9Kx7fH12i)67B@XzJ*awW-FQ=f zP?k)DEMNisbAW#fAxFM=xq zuKN7(;9UE+=p16_$FWDskIq{~Nf%dzNdkn+dZ=^9zB9 zCr}^ZJKKb9#9imR3B7oKb~-4~9p?G-LpYp|3DAgeano;+wXaQ>=55%U1UQpR<8^joUPt(zqlr z-|vAh=J%i9Odo}ZuhS3pV}(+&L{TA+lAa}=qBST=-B-4B>;T&HdtGg=fu1RTH-ep- zZf$Zk=(t~^*AUO2o{zi^d%g6S>^i_PRI^*LPFhOd!SADxg%UUfEq0GMOf8~tqBA0L zH-WjT;I9aUpm;HYTP!TZ1_3YIm>PyX0YYYo7>{iuFOcW3J^UPdrun+5pZSm_)Vj{H z+r;Xl>I$lf%4MbV3*GXHbMEK8FKS$Vw34pyFPl)DRuoiPUvad0TyNd$Q%3ip&n#5&72&|0~SR ztIau|yRuMMZm$ljdr*ti?5KWIyWS|X&*v@)Uf{_h(fKR{QCpwDUCOfZst#x%s)KzL%>Hawl z_iPa;X?ncH{1z9Qj%(Z{=zOE`jTC{ozUw@gO)cr z-Rx?!_D%nUSVE9yvX*l~pN76@IjLE@kS@W?gYGwq4*2Hn=W5bSme)#ZqwRv(-G+Cn^m|<5vpJ&>k>;XNikJAN3%;n%&273}Sm>Jf)W!|FinBw}dkA zn!V)PaDSL?w9Y0skJ1mUnOq?$-BMIlpwAzZPv%d~Hy4P-Mdhuld)CaX3NBkwxGJw_ z-nxPT#dk_B6kjVio4YCJzr2#dNu_c^>+>LjB|`zVF$9vWVFs_+H%?KH0B7s9CF?q5W9l1Q4MIsO%oCDpr3&V za1SC96b`Bs?y61dJgv!*cJXlE;W5T5(bp>|q*+0$8?8HpUT=OsWNpyYz$*VMev^F1 z`uy;I>ix<4w6~}CB(K|^<2)aG=6F5wx$Z{>v=3$I-RtFDW?Jm@&6 zUC&mZL)`plxE@se6Goa!sshW}lx!>hRFqiQt57U-F8Nh9u5x{~Z{0TIaXJCpt*n96 z_I|#{1NsG1O~aeFXyzE4>ix{ANEsus;}4NO+rUgGz}T}eZdbCRcj8=WG4AN=b?>VUt2X{*ze>2ovQ{@aq{nO|3c z72PPBUA(WPwp3Eyth}_eV{tthU3Wu!8Ul9Sb{l@01i#-t~RYnSGx1e%6f$ zyVBxVpuuCJ<7dTmd_5Cx{8YWA{CmmmqL~Gw^7`a@5j;kUzYuV3eXEc-s~d&Q5;-$`k8M|=WpM>`K9=$4E;7JNu4k&?(2s)AH3rqCxxW`$?`9nU4E_VM2)m= zZ+#C#4(M3#F#j-bu}rb;Wv&P(u$klnDxReA+h_-IHP@M5Y*}fL)TLHCRxhZQ)i~A! zRxho5R(`WAu1r-iw(4eWH{(nDW^|9Ti~F45)HZWEpX$AA;PfFKhOZqtbM&4ulgI2F zb#(aCAwwc7BELe8iFL!eN3QMf)B8b>Lp^l8g8QuQ*Jj|I$gtr9N2U+|JSeKi!gg01 zm$~OFj&Mh-&;GlT_~Z5SN5}7Nx@UZ_;>n;F%ii4lSn^epx+uT8{tL#tbZgeCON&UC z@!`|dGtbNjpSE^Vv$2sw+x4z&e=7Ksb0)dUmQZyd|9jfZ@68i#epvSE_7m#C=es}d z^?y9!Rm`W6Nnd}i`@1lsHnYROyP4NA#-&^Sp8B&WwfJ{f>efG+G>7y>X%(qyKL#bw zPRNYE7PlzwTAWY3HGbKb4`1gbUq~7BJ^S09#E+l*$Gwh=O6Zvqle#-2HOnb?XTGt> zx7?*Vzjj9b8hw;eZ5_n6M0Zf{6w!EQTHn28T~x__3RI;;-`PTmGa|n_ku=s9=w;bspplZ4?2z>U>@^gS{&pM z;b-_v9ywYv_*jpn9aPQl_=P*4lzrf7!}T)1oV}@H(xbG$}lmB$fe4YI?*Dr5n?);ov*{8Gn<#fvh zj6L_iTv?7iOOy2~vn;Lnmmz6hT+6p-U#7i4U**0odOQ6?`}iM;4}YFdACEo#qp(slFimE12pvhT>7*%{bFAYES z@TkX8@wn`)=JJsnjUS+|Mkj2`kk{P9YTVa_j_#c}rcG4nvhM2!ZyK=a$hwcqW9FZj zI&|dkKAvI2LUe9jrF!~JZCvq=?3sTnzYAYYaXmk*eD~+w^p9sgpG{KzNd6W0yUov< zZyOSk1mov^UydfMNqm~z=ezb-P3q({Q~JP+73o-7$)DiA6VqpAMda@+R+mjF%PWa0 z`j8)-+c7I9{p0U>DZ{@WjDPUy`6u^y#TPE&dE%1f<0%t55Vh1x>ZZ~01zn#cir+FW)keZ$^~ zPGF}ZSEvK3LdRsczFxh2^8@}ie$rxd+mNu=ojP{y)$8KGpChr!vuEk%y7_?+9nLs1^2FD( zkyn@8JNR1mZF}AdbBtn0K$8w>{VtC_Hq}3>Y~J7n!{+BleVFDsu5;wo?l0RK8ohD; zMHSjV)g%@bWbOQ`|M5KO)#uG0PrRG|w&?AY_p*;3pPEB9g8uJg-%NXX;_3c}@po%) z9lzP>R?VF&4|OkozHjz*$j^!C+1dH|LB$u#oT{JdJ!}X0LHKJ)M|n$mCiO#XZIM^l z|0Sf{`PAZ7*5jc2<8ODl@%@_D)&5r&UP-$8<+}OKy(iXpy^?QdG%vLq9`PfkN(YOF zHQ;=cNiCm;jtbq=tCXW5;|Ft;b$QS20@@?J|;?B^kqc6CgKYP(7cJkf! zPfOke#rr3F{T`V~=l88xVOY#=AP1{EI}LML=ai(`C5y)X592@_zfSsc@R;O`*9^+16={O|+Y3Rw{N6Rs8C z75x;E6T}hf4?+$y4fYI24Wtb&4VMc52|@-!1fBy_1Of&`2pS8y4rUX)81)_fAweV$ zC2S>}CR!<$Evz#8H(fnILo7;5QVm;NVPct8SjnmYI_mlwg;ooLZw|s~fc#!3)q!;@J1@4+<&&Kt@&cVb=}?(XPlE!X&+exjDCZwo12oxsbde zz|+G!$MeZ|%Y4fV%6rEb#P+}Sx+b+dual~ws70zAugSH`ygkEP$qvvI*nZ)3>(unc z{OkgF2bBsk3=9ma3DN|A{Sov&=@Z_t)9cD0#Pz=2x?Hz&w0g3+u_v-!vktX{w|cwQ z!M@5})gs_=>2~l(^_}=K`)&PV{~`hL0wx6r2!abn59SgO7H1f}8Oa&881@!X6>k)A z6!sKu6|NNz7DN||8E_o!9t9w`AEh1*9)unTAPyo@BtIvnD*`eCI%+}&N{#GbXIrec-?q`b--*tT}el_ENu`Y^}O8K$6~g?r_Y;#l0u9`iExR5j1`h_ znoFklwi?ZD=)DHdBo#j(N`r_#J z*=)`>#udSwzDB;Kzb3*w#c0Ss%c{-6&$Q8`(^J)5)*;qY)a=k+%uvT)!u7p3x(K&a zwEnS0u!pa9u&lFtxs<`}$|ThB+sWYv=8fqo4ZJ;78jK z)?m>(&2Y(=#c;tYy?VK4w*Z6o@bu7opqj!qdl(;!f4t^^?wh$CfPa7ND)*~TsvZ1X7*^^X_9D4 zWV>9!QT9XoGk_vk5I_E4?XKSN(p}1|#F4?tz+l2M#>dMY(m2>k-Bsa{6mbILjW?-=x|`3(P715XB$ z2o($04kZ+w8jvASDB3P>HIO_nMBGcNQrlNQTS{HzUff`aW4&hCX=`i{ZnJIzZZ~Th zWm#GdN^CT(8uk9P$dF*?%eA_=W5{M*J94Y#Pz$Xw0y5btedK{sS&BmsFJButf8@WxfsK} z&A`~d<6Z8(_n`ix0TTc)`dsl_=g!@t)dSDH$!NvR!Lz;!yxh4?xZ<}MxsANC!kNn+ z*OBDg@{Irs3^x>_7}pu~7(N$Q6=4(R5P=OO2?+#`{_yxU^PKIb=vn1~i6#e z^=kRM{Qv{%2{aOs8et)eB@!p}CVeKgCi^E)jK zV=!ssZ9Z{yb6<2tbG>eEWs+8RLO3d`4~F!i+G4{3uqdJMmcx+qjm?cgkkOSspI5D1 zz}(lf^6U;iDq}*gRik6!Y}In=cFK7vdk=b_b%$+6VxCk)MVBbgB-*D8h z%N@mmz)Zd!zazuW$-~iq*#Y1lIwXL}+!0O0T)5YG?>YMgH0eT764to)J66_LI6I>JT5nc|O2(1Cx`aJa& z@iguj?3L=t>Hg_%>pbph@(%bC{~ia64|^9_9_}N3C~_eumy_z?aq0jmHO{MYkg>6P9b z)yB`X=^0?~LaB+a z${xgWztz00y9B%Wxed5qwW_ihu>rDbw#dGa%5vC)<}CAE{XhkD3-1v76-F8Y9e*92 z8}S!P6LJo?2`B}^0IK{t`Lp&k^`i6(^_cdp`G5Yx1nLU|6LlHw9$q8)CfF%cEaxsn zGVwMJJv2nsONCQnTa052Y!Y;ddVqfWfA)XLfBb)|e~x?zba-UtP4_V>6W;SX)(^ZV zrw^Gil7W#;3YD`pp4K2Sy2> z26X@L^tP z0QdUT^mFdG=bhj#*<#TM$q&HCwhOK!r$M7AqvNLHtxUHy!u8GX+1}-1@kRU_25b(H z6d4%N7z`I&6MYWQ2&DoJ{CxF@@8;_1=VIo+<$>k0<@n}0>iF;Z_bmZQ3Oy2^7@{4? zA(f?5#M`o&rktOnoD!V3oI;*Sp$MnLuwlOe)6wb@1zR69H@-?MS;u0ZXyt3FZLn^E zZ*Fiiam#R#ZM$W0SSCibFmf7k1<3OG;vLqi%>2el#R_p}W;LzEw)0fR*$1A~yyJNR)wbQl9w}rZjy=%c*$1>2t+hyq2^CJ9i z03ZPu|6BV>_B-%O>DA!|+U?O%$r!+!ww0|xrlFyUphTmhsp+!hy$Hz^(~aBu;+g7U z^GN;v2Dc6d6WkL@63Gu)4fhHc2qgqF|Ht{3^!x80>>lZR=lAC|>oM^r`N09v36>Bd z7S|eaA88~EDpoKCH>o|$LqJIcPJmL~RxDc@UtwbQWIkuPX@hL!ZbxshYkFepQiwgz zBmD

^;+BzWAjrrW5Bs`ji&viQ7A&JpG}0+Ap5I_yzJW1en!bbWQ@ zayV`=X)R@lVs>CKUFTL*Oh!F{Dq|I*{|oCy*|y6M!#2Nxzu>}e$ZXFc*T3F%<;LpH z?k4hU^`H0%`fa)UGHN+Y6EZ5aWiunbPjb=b?9`rBoM4>zp3$b`wX)1;>5T{nCa6C2P)c1rWru2t zZnbgpbE|Yxb4qVEXz*Q`P`5x5FNPfa2?+Qb=VaF^$>F?rvk0!ftq-$oy&21**{bHo z@T>O>{KWo50CNE5{+9da_MY(u?APT2-qF)?$BDX^uK=mwr^~Arv-rDU#U;E+TEHEh2Amtap4!j1r0HOSy`DOM)@@nk`>51n2=40v) z@Z$Cl{yGI^48aq98^j~REPOV{Ko(1@RLfipV@_w`X(nshYs759ZW40ubxwFYb_H!x zTiZbMq{u=ve_Ra7@>Y(C(*}%?{!d15FtEr{>qzS5Yvj)GK%FEO)-RR>^ z>5uKX@bU6#^dR-$^tSTc?WpBx+C0s`zlO7^shy&Bo*A8Po^Yb{sI9T~yAQ`B(xTjD z=C$t-`O^Za467A$9OfUPA66V!7X}hB4dDoc1g`%W`djoM?`P}i=`ibn@2mC<09Xp} z6DAw*9ylKr9dH_s8Alw4BkwNwJVHx&SGZqWW7}f8U;kU3SshvsUJGSDZRK-_b^dOP zUSUK=BV_-s-R8kRu8N`+ohO?>nvs~Lm0^Z&G!s zc6oIHbG>gSY(Qw@V;?n6Z z@3iuv^cnSH^vv>(@Mi76=>n{tx~FPr)H(qrA(@Mv*5r9(J|tq z@=5_x4Sp7)94a8BAr~T2BH|*7BZwoiAvGQJ6|)Q%1JU|o^-A+d^l$gB`#1oU1fmFV z3>gs46WJGi9PA+sD2FZvHDo*UK|4veQAS%NW&CZTbZ>aIc|v&ycqVq&a${`sU^`Dl zH*gwM`vKii!d9&Vp9Giuli8D!l-ZQllr@&Jn-ZwEy!_Y=`obFqI^R(sVnS=zZqaW3 zY_w{JXlG_%V?JKNRZK}VIe;d%5;y-C?GoLs&rHQDzE!%AxvRT>!2ieV(Q@4|>2mYb z`riKg|49GK{RjNq`N{S(^4aT~I&`u z?&a`=@+I>k^5gDu=~v=?+Q8D3%MQiwzAU-qvx={`tn;hdt;Mq9y6MIJ(gfkr?w$KO z2b>Yq8i^uFD8efeEyOH(E0HPMCha0X9ljO34C?}G`9txZ>oDm=>SFGq^ve6#0tyKg z4&V{R6mJ&+8=oK?DKRv_K;2CBR{vcCVvJ*DV{&4PVU%GlW9MZiXyaxZU!G2+HG~#K z^%T}rywj=Qo^P6-n*5w#pGu(OpTD1}qHU|4yZX{C@2?EgC*wW9P3>3BT?JvcVoYPr zVi;jcUT<1yRgg{xMH@KKC*u^V09fo1*{R1yxhJoXs`IOyvXZ=K$L7!i*uLET-_zm< z=Edob?P%~O@#*e@>8|18*uKz=%Gbtx#plIk$4kj8%jL}A&J5Ca*RJ0p>e2Kj{iXm^ z{=xR)>kHs8)n?4u#Sp1IY;?51td> z7lR!5A#o@NFyuJeLVHcGS4v45D) z@J;dY?3TF0u;+W6}!p*nXvaYiUx@g2(&>!2t;?d?q=+fxS>5=Ps?O*Of?W^h0 z<8$1|)H%)*$}P!P%ZShO)A!bp*Y(w3)4$OR(|OqO;oR+4`AGp}11tXv_NnT!-_F)i z(2L7`$6~|IzNonww5+ajs?ewltFN&byyM7P)>Y$w?;HDv2DlOZ8$Kj|DJm`Re}T0}u!o3o{KW5AG3L76BdoB`Yz~ zJ>E*TR=r=+WYJ}?V>e(eUFutlTsU68UW8kLQQkgKBSHZR-6gyWqXm>%jv|kMl0B82 zmD7``kp+?nm^7wcy$;;g{`eq8J`_|GVzg;kZ4qxma6fUqarAKSZOLcrU0hJjKV~g> z8tMmQ_95n~*UHP6!y&-A!R^N~(U#jW<&^AA@n7>{^WX71@6qeL=PTn6-ecGs(z(kM z#*M-s!urG!%3IIt(#F$@(l^l}(gW8H;0WxD_!R?N2{Q_H1vLCZ@Y3U-*s9OQ$P~k1 zz2>%{uY{-_qc5S_qhYJOwkO2G(LvsG>FV=m{uc>z6ILAQBI+j6D10ewDZ3~aCln;H z9}gPB6G;tR2c-hw|8M_20eb`!2<8fg3?L1w4JHqy5|S7OAzUkyHd8@cO5{+{RH{~0 zSC>~2SQA<5TE1OSVT5E|Wg%gkRm(xqCYlE#=se7#wpXalpdX&#ouQrfo6(r*l_!>w zoI9%*!X@9>{(&7BI3Z0~T%=}2ZLo3fbdq;Xc|3Ulc8+d!VnR|pKjkW)7CHkw@$%ry z(r?F~zYe?vy)wdd${W-y-4Emf=tSwU=y2!$<$vUO;*H;&+uzpE(GATy$t=fm$4$yB z&#=^7+5Fp>+(X>0+)>}a+PJ19Ju40%`m2?>pj@)aJ+_zzVv1wN|nFthlJP zr8uQxsFAN(y0gbw)*t0#^TPlp4LlfvA$}6GX(>LKpP^OyP-0u~C05``O3B{48=JfBJVR@7p%YkF`Nah7hMY9VK5 zW#eU;XKrX>Wr|xRNk%Si4WH_h$}q8|pc|RTn8%#Wp)94Rr3s|*qB^D|u};N-;XVS^ zA_+f5RPA99X^(4nYl>bgXngcG`H|d7X9gXpK_iGi?yU z?A*+jvlya6n9P)mJ=E(+thN$p*+c$AHI)$;r*o({sIjT@nr9* z=%3zy($~c)x^1v+sY#_Fq{F2Os)(?&xW>T@%l6Yq+zjN7>l*X>`aJ`c3w;wS8vh=q zAweQlAyprJ9G@6*6Zs6s1q1)&`BnEw_aFJE`~3Z!|Cazu0Sp2)0}cf<2xJX#6{#ST zF4;Y;Ok7#zVjF2|Y?^IPZE0+vYanb~ZXt4pb$4}mZYEw$L|r3{|DxS=!6mKmpog2S zn#G%joSmCEnPZninN_05w3*Ob^R*brJ78D^Y-@Htd2n|?bR}{qa;kIbbgpwOZc}3n zQ~EuXCFKi;^97+&bRu^FdYgI?cC%?hRJt}`6y5Qt)5W~jt%;>Tp?RKnoAsCNlx38u zn9!rRw&lYx8X`a0YWhc5-;KcYAUpXhT^TM_@CgA1e*X{PFIF z<0je$(!$D6#D~9az3{#X#J$Tl)QQ_V;F;m5-`3iw)8oou!GO5OvAwQgu&=hHz(34N z*UjJ55}aO@&NTj^#Jk(>(bza)N#k$x~#78}8hImvDON1bD}^WrBib8t6I%*+0kQeW^9b-d z?&9rw?yB!D@#*rJ^da_&_ci$w{5=8c37Qt%CJ#BoN|RaNV`^y`Yi(-MXkKUCW*TUo zYaVgNb|rZbbY^6INdPA1{s!9nyEdn!n{St#mnfNtnWUE>lz@?HlTV!ivHr~`@gNo< zIF?hQW^r-rbbjob{HrlZcZ#m(ZS?shPIH#6Z(+ z;m__$```xP5hWZiCGjhKFM2P6EY~NiB90wF7yuGY3OWI*_t@?i=u_kq1lUb3ckIaoZjBSjskYt-RuK&oR=`svAEFeZ5SjS>eXq#&U zZ*p@fcs+Y~dOCD5XfjviLK!Vy7uEu1@Vnqo)JDru#nHh!z$(DD!SclC$s*9=)-~Nr z;&tU$=8fbV;49gj(5uH2z)ibnx>~(P!+gp!(FxXX*u>Zv*tgf&*ecx1;VbDD@$2{L z`?mYj_SEec;!@Sz$a%d~vxur$qhFp-oT!~^qCl!owBo<)%i7lvi_f7(z4VD=; zB?2#JHF-BYHIXmjCtDxW7FrJE1w#Gv^rG!j=z!%f<+J8N={f9H?~U@i^|kns`wjo6 z1RV}h9HuV7LV#5>WTR~va`SSgae{A$ZHa6IZC7rXZk1{UUpz|QENTja=hVn9v1*}D zn7flTkp_=sj2(*giIMh;pEX6|bzZX9oca7J=kbG>mEY_4Gp zQ#C<)Eh`y{183;Zx&i;|JmT+nUth%R0j& zyuG)iwg9=JV`NjFF`ziij0I~r&0%igM1E&Ni2rUkJ7d9lXGbcn(Q%qk* zXU%IQZnkeqaZz)vbs~7udE`_nO%X203Bu*f#saYJq0^eQmw1&1lGltThoFO! zh4+s-q_@F+6Yn<=3L?O+Evtw&Nj-w#}vme$g|2j&I;0E z)yvmk+3?z#-7Vt9=y&kX_a^;3|8)KA_h9e%~pppUjyOmcf*< zmZF@^ri-)?#5&V4;GODh^HKbS2I~pb$$ z`so8348#$O6TJ{E303_d?%Lcg%gMS4t+1kmo79%Glgg2jk?@n*nIxmTuA90U#k0*z z)zaO|=%DuW1$Pw3A8jU5C^jaDA(yYDq+=kYO(sI!O)EL@w;??T9@DTDA?k?rj z*u=`#yoRtQr+%T)pP`}XrG2ZGu@JaNzq`kk(Qw?G=Q;An`vnB>3XKq%6p|LK6%i3A z2Cx6@!_2X}qeGgJl}MGTnEjr$r%AFKzC+5|)imIC>3;H!{Cf!a6W5LY7K0mZZC1FaaC=IVX;h+FE$Nt>dMP>wE3j)o8p#$ zlZ24pjg5>$H)lK&s8iF|+QdMFJYqf4wa4B-?bgp--c;j^`ZeL-eP`y3J zDsLIb3jF?+^{nlA=8oS%*-g~P(Mi&%)velC->Tsu;CI?w(Lctby4J7GredHXoo}5C zp;@PKueP}S!e`Ft+UDmb^n3mk1{Vtl4tEcc4-XE#3W5cK{;l<_>KolJ&HlTVtMi?O zl#7p%j{J~umc5>3sW`RZz&Oh#)Pvk)<*n~4`z{Bm61*JcB%>L%(q?K<+q_d5Iv{w@3$_G#>U;3?GY$S}WTwr#D-qXC-Hkwc9Sj>MGbpb@cH!@$*M z<{0#6{@n$73r-NM6j>N&8r2!H6;Ta&0F>|k+u_H@wU(zOp2(P7mcf<0mb;lupQEQj zvSz+c%Zb>^<<{~p|6U5}6N(!SA#x<+CC??_B%32-A{imKA4eWp9bO%E9t9vSA%Y=B zA(J5{Bg`cxC`l+eC1M}N7`PMm5%UvB87CntE9o}ZL*h`6T%KisYjAEmZ@_MAZBuK& zXRBd=&vpW~K5k+qD*h?9mJh?|e0o^`dZ(pK|=6HYHLM1@h$ zShQTmUtwcDXQ^qLXk%iwR(D40GmjzV5gi6Z{sj4%^ttaE>fhw0;p*WT=3edJ^ksv86_IT z8UPwy7l9Mr4~h;d5#1PPC73lWN0nEXWVvh_aMy1tZW?XpZ4GcWalUQ!VZ%$;E6@d7 z-w?jXr7)Lhkk^e&jPr>Phm?g(h~bgTquIU2-2ebkAYeOKPi9>AV=QR5YJzNiZJKO+ zXt!VVQ7J&xEEgMy4Gaa$0I2@F{0aKW_RaIj@dxp5@#OL!^@{iJ_>A}Q@nq+n*i*-* zwUec4nEj5uiOq;SjMI}vpBt{9zthq{=1%x{2ig)Q8ps`B9>pA;8F>|b5MByW0(JL2 z=_J^4#WS-iqnnl(j_rwnibRk=n~|z3ynD?P+|1^??K|?}^*s6k09XfW59<~s9K;=T z8zC0K4{Hjd2jU0N3fB)$7OWi;C4?*RFZnUzF{UsRFODt9D+npsBpDxr7+4Zu4qFa% z6WbkfEJi&APM=(kXBTcsa7%9qZH;ThYlv)|Y93-UP{K5C5{d1)%7Lv2n5~LOghYa? zfrfwpfNX$6h?tp2v_RFt_gfb&F(*WGP%l?DTH#wMUZ-KLWFchkTmeqzI9(x%3#|HA z@L%k9?NjlR^+@>T_+a>e_^|rm{+9#42IvNj1IPS@@^R$8($>DKt3;enk{69hir|L< zh6INyjsu-wvYX1C;oS7l185IX7!l7fKg@7U~sk6>1a}64ec_2bus(`pNd4 z_ci^%28a@x9!x2gF%&oVIrlpCI@3DKI&M0`IOR0ME=wmpAbT5a8oV7+C5tdMKB7#V zSw>@7XlQ9ZXqjhAX=iOgRL{L<|b+r!3UvlF8XmtK!kivWu5ieQfRl#8D@u9d)E z)d1_j{{RwPAl@knE-Wn-Cl*utJ@*j{k)ZgW`lnih`1$oy@D$ zysgia;^seup@M`y>0t^sQ9TzF1 zGSE3`K65}IKu$jPJMTF%I3+goGH@Y2azz zY0hdXY;0?#WFb_6IJ*=3>c7O8rX-WziLr+siF1p!jc$-2m7<;8s~N$Q-JJh%Bkw~y zT%BpFY~^V5Vy#{=T}55^Te((NOmsaTEV>$b3$gzM_-FJw^q=-_`kDSb0`&x&26+dS z2cZVg1HAoD^Z4V9&_KH=r(>7sjRA`+jTVxCmzSLDp;)Q4wB*EF*$D7d2Co@%DBm$S zHd;1DGXXBXCMF$H5M=+D>Q>WWys4;fno5#sj|h;Gk}a0?nx>)ss%f`O#&p)Y|3MUJy3S9}v2Y&`%27m~?4K)@jAq*`)I9ow#N8L$mNPI&i zJRCFvEqN!+BEcP57kUs;3&jeI5LF!1E5187NqJH|S6En$R~A?FSPxzpWt(cVX)<11 zMlK|q{5ICIwsfJfmc^5zlslDalckU4jBSs|nrX21&e-yB7acfEQL|tcW*uX3TQ*bA zP4-LLOAJb@Ln%0DDb5-<5Ag>~1keKJ0nz|q|MdM0{d@h-|4an=3I7hT5a0}90=)62 z+`q-auTY&`km-qWiCc|SlggP_paQ5nvbVqM&o|-3@p=Hm415+29h)D49SIkQ4blQ9 z_@?b?;+)k$$E~>JtDd5=S887bWu|D&YHn=FZUS;lbg*%>WuHw@Dt7?&)>E{x zoVSo1j^&W*luDOAmvxp~nB<_tvQ5qv@wyfbI)GO9XmxN+ZqH?NTL4pMPMu8BO4>zB zJOVGlAaoRE40Q>y3sMrH8~Y?HE5<9KCi5Lt6>bky41)=o16cU;=Wo<$z~8Moo{^F& zjIxWVkO`S)qGzklwDZ8h(JAL#{#6r?BC;xRETSn4B+wk66xj=)0*&~>?3~_o&Pl!q zv2dxksPL_;w)(%E$Dqtw&nVHq)1}x?;LqvV^1b+x`A+rH?K9?0;oacjIxOh8FYLj*g(F?K0zBn%`h zC>k#&HX%C?JzhNQIcGMLF$pVFB6Sx>3R?Oi=i1P8xi6%SlthfKicF1=k#3f5oVujW zuM)kR%kA1W>tg&C4c;0+BV{GQBD@_h7`zdU2=w|g>7><{!&0?%t4E~@qL-l=q)w?0 zumrbfy`aN!$}-Z{+120q;&bDG;!@#8;OE{H-ND=N+$Z8R>+|($|LXK;E~JkwkxIRmt&8mX z;`H-{2Jsg5Ar~e>B-S4E7jqDi2mJf`>^R%v$kDi}t-`3$sSU5nwXeHSzqG*mz^%a! z#J0#x&)3$`-H_tW;~e2%+o9BU&-l&%(BIef;ArXy^NRX<0jLPg5D^*&B(g2SH7`3a zJ=!~|H;OTIDn=ui9I_U55r7PS2W*B`oH})1mg{08Y(G0IVwpJSC?U8Xg+L+ zZW(YCaRPD9Z{}^5Yv5axln{~$kEV|HlB=9zt5v>b z)FkX11F#m=Br`2iG08LMHorUPLH|d6OjAxTO`S>BM2$dQK2JYzL%&I%P!(2ASh-b` zO&CD8E_+#Ekrk&Kg>nDNrp?BOI1o$NK-~2MM6d5Mzu*iP3BO>Q_oa+Qjklm zKW#6U93BaL_GRUw)#1kTxHPO%p&yw6lpT`Gl311Rm{^?{qc^LnwuQxq)^g{(^~3)i z1*`_W1wsRl|4;f|^A_uz;%VEg)}_>l)YjA?)Wgw1&b!K|$cxBI%HGUN&&$v~(Z6-54^Gf+l{&xb%1v&`G2|Wtg2~`OL3e*g*5f&HR z8fF`N7={y24mt{82T28;1JMHS1Jeg+4$Ky|AABe-`cgCmRfmx`$3aR9 z4y_!%Cv7mPH)TFGMHEaoQY==BR*h2UN~S^SId3-iI5k;%A`Xv1B z`Hb`}?u+PRrd!@;1SlM%N@fi zy=b{ox5>6KxY@g{!R5%2(B0R9-lOD->T>W|_96U-0e=Sg3O5go6E7GP9i<@=C8Z`x zCcq>fBX=U+BFZBmBs(KmAz~k+9?&2CBAX{5EoC#YI&(viO+Z-gVc}@$YXNJfXE$U( zW7TE%YAbKaZK+}+O#3Sa2V~=G#?Z2HsJx_cq`RbKq@<%8q{gR+urs~5Jj6XSMBYvlTkK>jX=`SIU9(U<)o{ zB(D^m0}t_p-RsGyw>qfpoNShWlu4G~nzW(Gs^qmD!lliH*1y}c-T2+s-ICoi+@;v^ z(wxkw$56%l#QMbR!vw-5!AZkA$&JzJ*+<}FbvaV?a1rc|^)56Qb#UjDn zyt=rTwIa2sxLCj&%L&&~;_BonpHroPu9CTA#B$6r(7n&N%t^`k#v{g8#v#XJ z$Y09U%mvTV&(h8U&6vy&(4p97<$d!d|A_^l1-Jk>`KR$T>#*hG-`LoU&^*X_!IQnG zyfnU4!J5U*%GJ;k*XZ2&;n3!f>;m-Q{A~q(3v>-+3$F%b0S*0=`Z4-F{K^2L2ip(( z7s(#BBLFA$D0?ZtCrcxO95ofX54#O$51bR<7=IqsB(f}sHq}99P19E&V6$a`Xy<6k zXMSe*W$|TCWQ1K|PQ^9h6@>Fa)Hb}$tm33JqP3!brMarmvIxHH%Z}T=>q7e!30@R^ z91kHQB2OUg9Jm=&7?&9m9cv*9B{e5$C>$!&EjKjHJY7bJPf1t3T-;t(T<23OMISK- z8rTBh?PA;$&Jn^*w}h=Dr68YXoL!y8q2H*TvHH5q!|%!^&$iFQ%&f8eYsjs(Z$2Zr7<;L+q{AdLb z4L%YG6lW5b4si-=2k-@x1;+)V2EhpK41g0y9K2CN_A&K{@?`E4>G9&t+^yH@)P&XX+2i4J?4bB` z1w9f-9?K~CFe^4cICwXPGy^boDm^5y9a$I85w;DU3kVE&4|Wz=A?Gh7K_gS7V})>; zc;b7IdyIL)cdB=Mc_n=Oe2jQ}Ycy2AGdK=d>9NX{wL_|urlY5BtCX>#x&_B3)@0`E z^<4uD4w@Bw83Y*?6wM2~0ulUa`m6rP2Z0k$ACW1%F-wz~aArz#GF~$m`Dy*{b5~>o@c$`(*%U1B?S<0MPk_@UG>>+6K`) z$(6$pz=OW$zWBgW#4O0r%iGRU(a6)h){ELN-(uvQ=~V8f@$2%b@loy{>fz=o=Ah`v z?UMBQ``iPP46_#FAq6cqHtsugJuf>QHh?cTC@Uc@8#)&t77!S895EteDA+D|HcmkD zOoLm{X)<-Ld;ENTdZc!hb8K>GjcnUK}JTYN|sMD zRf<|NUawvRTdGo4MKv=t9gGEV?=#-p(^}BK(P-5~*_hl}-<;u?;y>Y?-2Bw4%a_7h zyRo*Dw3W0%wo$oCy{^H_#VN^~%XQ5+&z#Xd)rQ)R;o9kX@(ub_|2+YA|NHqo@#p2* z*mlcfzht%!vJtaFxnRR?&qdo2<=5+t@4WC4@W$=g=|1G5-9Xos(qYg?&(TdS1UC`(9cL*HGL$y5HbFC`EfyzAAh{V(6iN}h5w8`<8!jTIC!;Ls zGBiBMNZeMJV`FTFaK3QuZkKGtYW``IjKDDJhMC) zK7&FjN{Li&U^{GUyf?jhzRkgW$cNIf-Z1Mm_I&;@1KtC8 z0D$>D@T}&v-jCTc*NoPV*1Xo&*9qGM;b7@k^4$4I{u=+){Au{d@|o;b=6>K<+Yr}T z)8fx{%v#Ai$Kl5R$o|bS)}-M+@D2fv5}YD7FDExHI>?3w;8o{crtW z0Za&-5I7lcAwnq&F;qFJLKICXSdwDfYN~IhaD8sDYU^fpWb0!yWrb&NY1L?fW2;v$ zMQ$x<6FB-*&{);H*$Ce8G| z6XzYvBxWfzEh8~7HS9PZJYhe_LljB?Qsr4xU(sLdS&~gIJSQk36lDTI^b6`i;~d|} z+@0Im+JV_|*4WUh$nL&DwJohvr*@;qpwyn+ouQt#q3fnRtyQyNxI4UaznQ}C#cs(l z&7#qC*Yw_(=k@O+_PzK=_j>Zf>)+%+-!vM^A7Dc<%-;- z)1AwJ#W=$K!7RkJ$2!Xp&KA)9(Vx_a*sa}IH_WD(MSB?WEH?!I!luuQ#nQu$s7s#ro55;F##l>_6`S z@96*X2Phf2DLFVFMCnYaQcqT@S+8ChX8dk^c1wAnbdG07 zQ@%R-A;S#D{gw69^1kwh@>B4x>lfuY-HOyt%TL0hx{0;>vYoNeuED5&pQM%hjyaB< zlWd$Ur5dXluHvuCvI@8}zt+Zk&6m z_(1jH@rmz6@7C~1^Ah#O^m_3r>!{*^*?G|%%vQ=Q%+=5)*W%qt`* z0Nw(g1bYRw1+xV*2JHu83vCcc7Q`FjA6X)tBdsKUCVMH2EekR`HfK32JB>R~JHwuX|HmscLR6;b(3&fY(QzlXY*%oY42*QX-HzLQARhC6$SFU(pZ<7+>elRZ@OSbA@rLZe=RW3g>RI&J0VEJe9sMZnGwwdx zNzGHHTh3r~V-{ouW6NKwS=~>8LaQ=SB9IgQ2P6Pl`&Rhh^-uHp@ICJ(?wRbW=&0ZV z)bPX5vIL|0l@E+Ng$IIrgM^B2md2#Vv2eQiy%WC6y_&xu#CXac(OlO=-3sFw=;i7T z>UZTO-!3rah)yGR)?%MD=^n~}w`9k{3_?q>g@ha}u?C0*^^e6sM38@s;9uy}) zEp9RNGfy=;HgY#fIdD5VJvTlQKU+cbMw?JxUA=1hby9u*fBt{&e1CU)a8YR>WSL?% zWSwQPVJlQpJeeIW9GzuYn_bhjarffx?(XjHPJs&4U8s9|*Il2wdke+g-2x#Y?(Pa9 z$a{U?!9V!Jv9mLKX3fkx*XIeZKzl|G5BLr`kLk}HMTseWtk=v}q(8_sNH3TT$%C~n z)`BI|&nJ1aQlvj8PvM}+LHF0;7gOlDmy4g529?^DtQ6;$+LklRl!|_(JrBL&NZZt` z6acVMPOC&}J=Qs>Nm8&}R-{?L+Q!;CKz}ZM{`#i=#qlTV4}5O_{V(w9&1(m5TR&BM zkNU3u2mdShTl&YM_e~#feLqrf(bC$k-8J4r8%Q4$PRD?Mz|LbwXnbMkhNp6@YP?d6 zjMvI9(Ey*sImVC@Q&1_8k0AfqFCYr|^Glrlm)(v zR6z-+aLE2tE2cA_yu7;ZrBJ8pqk}S@wXJgZ_XmZ{MXW`?ii=E0PZ*1X#Ms7E#093L z=B8C#*b#Hc7xtX5gj`__xD`wPa4*o!Y`6(U29UE1?z|I@c}L2 zlW`8IhcdeWucF&&HYs0|%o9^%bwio%56rJ>Jd?4KN~LdPjwx3R-zbuNOuOXwR z!aFj)u09#N?sQS+{O9w2mkO?i-S~93_sP@OW}hm*-uN>0q4iDD>x6gbzY^;|wBPEr zANVy8KKOLFc!CBhgrTuls7JXcmVa!#Q#hworwEaA2MClOr9`m~8;msvMfLZ$4F1b$ ze&4k;+&5zc359vXXpok9b5O}F9rSMj4&R5pL^?v_GaOh1))Nj>0G7@vjqA;ux7xY_ z4tl$77wt{lNPe^74RJ@44ke#Y`d>n7oG7|5YI{^oEH(LPu3yEK8pLjuJ-=%GtKXCv z129E&`Jc+@YNaiwxBjojY}fN$16w2VRzuF2*T`7VwGhd3ZqwG&Lvy)EPnwQMMq0nr z$GC$KPlgW0_M-=t#$u=T&SBu*)E|;UjdJr4C$xL9*G-@N07|G&OmCuNT1RGOu3F)V z;@qM;*^P0Nz9(!(H-Xi&RsU1XRsE*4Tb8wwA>6`xKr~!DH3DQq@BcosxuyPJ+*PkD zW0!Yb-F&n5;pUfBAC7)D{XF>b@~4e&x9dS|hkI`ghK`hvm(0)?ej#1(p5zhQ7j~{l zX6>PTvhtX6s?ueJB6+-Q!1`;kDdQQ+8WcBbH0U{)GEy|zI){d#utDULR7Z*f;S%~k z#6v_q8bWwXQ{^B9`TJ!UyH4Y zlne3yVwYHh?Lh9<-)p+lt3oNc%!;k&jb2BWi8x4|9(9ALHljq=-KYvcYW;b{5A9!>S1oBC}=r;<=krhItQSD ziB~;WzAfLB>;Sw5zse}B2P|c<(($hs?dDu&U(a(5ptWRW}xL22V9Dj^> ze7J7UQH`DIIh9_iY9DCv^X;SWM%E@C%n@L&I2+1!+HtZXnmSiGc6#vLVCqQ9n8BEI z#B!`)CLZC!kVs9`?Tsi_=N*!r$DJ=bA9gwBf$&E~xFqByor%>Cy5Qtz6sn5YfJx_8 z!(>O4Ow|iD`c?boYorsruM~5X{#@m-TzmMhpKtd)*1Tgxy$qq$V_B-gGVyOjwq=6VOfTr}GNX9K;^13i$`!pQ%B6jw@MwGJAJ2WpaMXe+D(P7jy#B zfW61rCey0zZWd&#?3n5t?^@-4-?P(u$oIIvT!4#TpGTJcZzGKA-8DB6pZ83lzPxqy z%bLZ?AkT$-4c0YPKd`Oiexu!=v>#gE_+J9QZ2xTb`S+J|KMyqi>RKP18L1h1)N{Ix z(1dR4X?5+&=r0)s&%9aOi%X-bGu2qdtU^w>uuQr~&Q1B0ii~oV!W!V#DzkoIMNjma z{e^mp_zJ%be;;3fuf`q0dSGE#A?^_V7H$oF8lkb+zQ6*X2VA!%7y0l9C^6QRG)dD0 zkQQQ|7B7ht$Nt9IDYRX!RjknZW?*G@$%<@;bl&i|f93rw1O=Ks|EPtnF_b9durQv?$~9yD`e-s+K6qO%9gSdCGMrP@-v%< zOP^-G2^q5l=H8j(NL$DpZtHNjyaQ zO-tb^NFfRYjiY+w2A_?78w-q&85bCZ7zz!*hOWlI6oSEkmb&8imAm|J>llKs$RHFP-G`eZ?WC`=RRx#C_a#*T9SGnpuJcwbMG5S8 zlyrPOx(DfvyoanqC84*Y&!FlNBd}MC@Wm?ledK$zBQ_m(4WCP#Bu~+7SWmh7LcgVx zlJb=$iIyZl(ks0vD^P9QN8aC&fM zNLlzyG(O>0s&b}dc0tbN+}rt}B2w9hN@=mcg_aWsYS_PU4lAp>RQy#_)R1R`R z)#hO6dn~!t9V$(_&y9ANE}E*Et{Ar&Z!vjo8e+C#Vq^GK`+{=N#*yVW!Xn|tCCciM z98T$~a=*OX>K$G#c?HohkC@6GzcAV~;xe*p_~;OQaBc`Wsyt1fKfCxF_6}k&YdC7r z$LRFxyx$!;ux~7N76QQ{e9)&*_u=oMTF@)-4%`BLgm1ERM?As%Oy5CJL7zd$A!%qA z!U@VxI-8-(*iT(0{>CL@^w7g725J$NjmkilBdib^NGHri!da>z%a-fG%i*42bD1J$ zH78IAS|Q6CsBF_Xr6twU(O%NNsQ2FRiPPX-u@MONIq1#vyA{?N|1*7C&hOmcIV)LzGdE?TGQ=6rGcB^uZi4Lh9fcnrfc{gWkd72oOdtZ-Xz#U**)Y!7Mwr z5+{|5b+2_?g_tth54zqw6%}uSsUCp(lebmU$S~*Cw8iL zxAh70R|`1p2N(`|)VL>j+W1LAs$;}SL+J;yT(duC@iVovK4;&|V-!9u881CsdbH$i z@%3WY635cyvgY#Y&83xRD|iK86Iouf`rB8&lAgfwARt&2u7W-)C|bQQcUxgj=Gam` z{V7rvWIVQSklZ)YTh=!`$e4HzsUpO3uSriT7^}b6cG5ep*Q3*-NmBc$N>($~!t46! zKil+A`>^V;+~k_#>hzkw+)3qj^+rvC#%0x2`6sKN1z%|$m_TR>C}cWi%54fUnK79- z**687eF!#!jzO&FXC@B}UFz0ryWZs4=-)KgI?%l_WI6SEPPp(0+O;?WFGQOYw5bxt z8jHiqVG3wW3W;1niJ*Bg+c`%CHcJmz>ek8u)~s+Xb;Vnh$2mx25v(u=5Z7R{+&KT{Xhca({LPYHx`1CLF*xl5yQy;VKc}^tYbpgRi1pZdW>$kL6DKB@p}`j zd8)0ai<>tpU}wm)&`%*jK??p}K7YNoc*prY4zdaFiBgRXkK@HP#@|fXmzbQCo%}B) zE$v1+Iel-sOuAOa(QHNmx-6!OUJbAE-u$x^U*MBD6I1AY!t9=sqDY?h6_3CM;whx3 zjK}<4671T>nx|wh*NNPKe6wH!x-o4yb!?IgbScfilL#yFW`68Or23FP%+%H*&|KXF zssC2TTXS74S?#x4m3n}BzG|D|5!vANJ!{7{qU4p8g(^8Jk&4YSTci&~rW_n48*2vh znD3hYH&HY8W29*~W`rsT--BfIBwe4)OM~Zt!cUy)2%ryofOXzp-YHE zm|XleVms+PIfb%=+D{v&57AH44p5+^MbbK@pMl~C`B6fmpq1aqJHV6jMEn_nmGD0S zndif4V8~Lr#6&_VfkP~&{G(McjG0u1Ap=f(M*T&3MtM*DN6%z^;{@_#`1kli!GgF> zS|a;Qxkyt(uhpR5_?p>Y%N*MnN2JS1_w631-Nh~qjvwu&ZCEzD?2B9qysrh{kJd

yv7m)LO5;$_f9r7BoYoQHPH_` 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 SeW%9`)IDI-i8K88fG$bn&ZV_0ma4SsQJNgh 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 literal 0 HcmV?d00001 diff --git a/rnnoise/feature/rnnoise.js b/rnnoise/feature/rnnoise.js new file mode 100644 index 00000000..1dc335af --- /dev/null +++ b/rnnoise/feature/rnnoise.js @@ -0,0 +1,2174 @@ + + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module !== 'undefined' ? Module : {}; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = {}; +var key; +for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = function(status, toThrow) { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +var ENVIRONMENT_IS_WEB = false; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; +ENVIRONMENT_IS_WEB = typeof window === 'object'; +ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; +ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +var nodeFS; +var nodePath; + +if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js + + +read_ = function shell_read(filename, binary) { + if (!nodeFS) nodeFS = require('fs'); + if (!nodePath) nodePath = require('path'); + filename = nodePath['normalize'](filename); + return nodeFS['readFileSync'](filename, binary ? null : 'utf8'); +}; + +readBinary = function readBinary(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +// end include: node_shell_read.js + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + if (typeof module !== 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + process['on']('unhandledRejection', abort); + + quit_ = function(status) { + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + var data; + if (typeof readbuffer === 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data === 'object'); + return data; + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit === 'function') { + quit_ = function(status) { + quit(status); + }; + } + + if (typeof print !== 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console === 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document !== 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { + +// include: web_or_worker_shell_read.js + + + read_ = function shell_read(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; + + if (ENVIRONMENT_IS_WORKER) { + readBinary = function readBinary(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = function readAsync(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = function xhr_onload() { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = function(title) { document.title = title }; +} else +{ + throw new Error('environment detection error'); +} + +// Set up the out() and err() hooks, which are how we can print to stdout or +// stderr, respectively. +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. +if (Module['arguments']) arguments_ = Module['arguments'];if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) Object.defineProperty(Module, 'arguments', { configurable: true, get: function() { abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +if (Module['thisProgram']) thisProgram = Module['thisProgram'];if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) Object.defineProperty(Module, 'thisProgram', { configurable: true, get: function() { abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +if (Module['quit']) quit_ = Module['quit'];if (!Object.getOwnPropertyDescriptor(Module, 'quit')) Object.defineProperty(Module, 'quit', { configurable: true, get: function() { abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +if (!Object.getOwnPropertyDescriptor(Module, 'read')) Object.defineProperty(Module, 'read', { configurable: true, get: function() { abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) Object.defineProperty(Module, 'readAsync', { configurable: true, get: function() { abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) Object.defineProperty(Module, 'readBinary', { configurable: true, get: function() { abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) Object.defineProperty(Module, 'setWindowTitle', { configurable: true, get: function() { abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + + + + +var STACK_ALIGN = 16; + +function alignMemory(size, factor) { + if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default + return Math.ceil(size / factor) * factor; +} + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length-1] === '*') { + return 4; // A pointer + } else if (type[0] === 'i') { + var bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +// include: runtime_functions.js + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function === "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +function getEmptyTableSlot() { + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + // Grow the table + try { + wasmTable.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + return wasmTable.length - 1; +} + +// Add a wasm function to the table. +function addFunctionWasm(func, sig) { + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + for (var i = 0; i < wasmTable.length; i++) { + var item = wasmTable.get(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + var ret = getEmptyTableSlot(); + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + wasmTable.set(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction: ' + func); + var wrapped = convertJsFunctionToWasm(func, sig); + wasmTable.set(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunction(index) { + functionsInTableMap.delete(wasmTable.get(index)); + freeTableIndexes.push(index); +} + +// 'sig' parameter is required for the llvm backend but only when func is not +// already a WebAssembly function. +function addFunction(func, sig) { + assert(typeof func !== 'undefined'); + + return addFunctionWasm(func, sig); +} + +// end include: runtime_functions.js +// include: runtime_debug.js + + +// end include: runtime_debug.js +function makeBigInt(low, high, unsigned) { + return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); +} + +var tempRet0 = 0; + +var setTempRet0 = function(value) { + tempRet0 = value; +}; + +var getTempRet0 = function() { + return tempRet0; +}; + +function getCompilerSetting(name) { + throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for getCompilerSetting or emscripten_get_compiler_setting to work'; +} + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary;if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) Object.defineProperty(Module, 'wasmBinary', { configurable: true, get: function() { abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); +var noExitRuntime;if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime'];if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) Object.defineProperty(Module, 'noExitRuntime', { configurable: true, get: function() { abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); + +if (typeof WebAssembly !== 'object') { + abort('no native wasm support detected'); +} + +// include: runtime_safe_heap.js + + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': HEAP8[((ptr)>>0)]=value; break; + case 'i8': HEAP8[((ptr)>>0)]=value; break; + case 'i16': HEAP16[((ptr)>>1)]=value; break; + case 'i32': HEAP32[((ptr)>>2)]=value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)]=value; break; + case 'double': HEAPF64[((ptr)>>3)]=value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for getValue: ' + type); + } + return null; +} + +// end include: runtime_safe_heap.js +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS = 0; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed: ' + text); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + + ret = convertReturnValue(ret); + if (stack !== 0) stackRestore(stack); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call + +// allocate(): This is for internal use. You can use it yourself as well, but the interface +// is a little tricky (see docs right below). The reason is that it is optimized +// for multiple syntaxes to save space in generated code. So you should +// normally not use allocate(), and instead allocate memory using _malloc(), +// initialize it with setValue(), and so forth. +// @slab: An array of data. +// @allocator: How to allocate memory, see ALLOC_* +/** @type {function((Uint8Array|Array), number)} */ +function allocate(slab, allocator) { + var ret; + assert(typeof allocator === 'number', 'allocate no longer takes a type argument') + assert(typeof slab !== 'number', 'allocate no longer takes a number as arg0') + + if (allocator == ALLOC_STACK) { + ret = stackAlloc(slab.length); + } else { + ret = _malloc(slab.length); + } + + if (slab.subarray || slab.slice) { + HEAPU8.set(/** @type {!Uint8Array} */(slab), ret); + } else { + HEAPU8.set(new Uint8Array(slab), ret); + } + return ret; +} + +// include: runtime_strings.js + + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + +// end include: runtime_strings.js +// include: runtime_strings_extra.js + + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var i = 0; + + var str = ''; + while (1) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0 || i == maxBytesToRead / 2) return str; + ++i; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)]=codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)]=codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff); + HEAP8[((buffer++)>>0)]=str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)]=0; +} + +// end include: runtime_strings_extra.js +// Memory management + +var PAGE_SIZE = 16384; +var WASM_PAGE_SIZE = 65536; + +function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - (x % multiple); + } + return x; +} + +var HEAP, +/** @type {ArrayBuffer} */ + buffer, +/** @type {Int8Array} */ + HEAP8, +/** @type {Uint8Array} */ + HEAPU8, +/** @type {Int16Array} */ + HEAP16, +/** @type {Uint16Array} */ + HEAPU16, +/** @type {Int32Array} */ + HEAP32, +/** @type {Uint32Array} */ + HEAPU32, +/** @type {Float32Array} */ + HEAPF32, +/** @type {Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var STACK_BASE = 5339008, + STACKTOP = STACK_BASE, + STACK_MAX = 96128; + +assert(STACK_BASE % 16 === 0, 'stack must start aligned'); + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) Object.defineProperty(Module, 'INITIAL_MEMORY', { configurable: true, get: function() { abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)') } }); + +assert(INITIAL_INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, + 'JS engine does not provide full typed array support'); + +// In non-standalone/normal mode, we create the memory here. +// include: runtime_init_memory.js + + +// Create the main memory. (Note: this isn't used in STANDALONE_WASM mode since the wasm +// memory is created in the wasm, not in JS.) + + if (Module['wasmMemory']) { + wasmMemory = Module['wasmMemory']; + } else + { + wasmMemory = new WebAssembly.Memory({ + 'initial': INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE + , + 'maximum': 2147483648 / WASM_PAGE_SIZE + }); + } + +if (wasmMemory) { + buffer = wasmMemory.buffer; +} + +// If the user provides an incorrect length, just use that length instead rather than providing the user to +// specifically provide the memory length with Module['INITIAL_MEMORY']. +INITIAL_INITIAL_MEMORY = buffer.byteLength; +assert(INITIAL_INITIAL_MEMORY % WASM_PAGE_SIZE === 0); +assert(65536 % WASM_PAGE_SIZE === 0); +updateGlobalBufferAndViews(buffer); + +// end include: runtime_init_memory.js + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js + + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + assert((STACK_MAX & 3) == 0); + // The stack grows downwards + HEAPU32[(STACK_MAX >> 2)+1] = 0x2135467; + HEAPU32[(STACK_MAX >> 2)+2] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + if (ABORT) return; + var cookie1 = HEAPU32[(STACK_MAX >> 2)+1]; + var cookie2 = HEAPU32[(STACK_MAX >> 2)+2]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' ' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +// end include: runtime_stack_check.js +// include: runtime_assertions.js + + +// Endianness check (note: assumes compiler arch was little-endian) +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian!'; +})(); + +function abortFnPtrError(ptr, sig) { + abort("Invalid function pointer " + ptr + " called with signature '" + sig + "'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this). Build with ASSERTIONS=2 for more info."); +} + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js + + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what += ''; + err(what); + + ABORT = true; + EXITSTATUS = 1; + + var output = 'abort(' + what + ') at ' + stackTrace(); + what = output; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// {{MEM_INITIALIZER}} + +// include: memoryprofiler.js + + +// end include: memoryprofiler.js +// show errors on likely calls to FS when it was not included +var FS = { + error: function() { + abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -s FORCE_FILESYSTEM=1'); + }, + init: function() { FS.error() }, + createDataFile: function() { FS.error() }, + createPreloadedFile: function() { FS.error() }, + createLazyFile: function() { FS.error() }, + open: function() { FS.error() }, + mkdev: function() { FS.error() }, + registerDevice: function() { FS.error() }, + analyzePath: function() { FS.error() }, + loadFilesFromDB: function() { FS.error() }, + + ErrnoError: function ErrnoError() { FS.error() }, +}; +Module['FS_createDataFile'] = FS.createDataFile; +Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + +// include: URIUtils.js + + +function hasPrefix(str, prefix) { + return String.prototype.startsWith ? + str.startsWith(prefix) : + str.indexOf(prefix) === 0; +} + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); +} + +var fileURIPrefix = "file://"; + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); +} + +// end include: URIUtils.js +function createExportWrapper(name, fixedasm) { + return function() { + var displayName = name; + var asm = fixedasm; + if (!fixedasm) { + asm = Module['asm']; + } + assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); + assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + if (!asm[name]) { + assert(asm[name], 'exported native function `' + displayName + '` not found'); + } + return asm[name].apply(null, arguments); + }; +} + +var wasmBinaryFile = 'rnnoise.wasm'; +if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); +} + +function getBinary() { + try { + if (wasmBinary) { + return new Uint8Array(wasmBinary); + } + + if (readBinary) { + return readBinary(wasmBinaryFile); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, and have the Fetch api, use that; + // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function' + // Let's not use fetch to get objects over file:// as it's most likely Cordova which doesn't support fetch for file:// + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(); + }); + } + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(getBinary); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmTable = Module['asm']['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); + + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiatedSource(output) { + // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(output['instance']); + } + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + + abort(reason); + }); + } + + // Prefer streaming instantiation if available. + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming === 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch === 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { + var result = WebAssembly.instantiateStreaming(response, info); + return result.then(receiveInstantiatedSource, function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + instantiateAsync(); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + + + + function abortStackOverflow(allocSize) { + abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!'); + } + Module["abortStackOverflow"] = abortStackOverflow; + + function callRuntimeCallbacks(callbacks) { + while(callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func === 'number') { + if (callback.arg === undefined) { + wasmTable.get(func)(); + } else { + wasmTable.get(func)(callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } + } + Module["callRuntimeCallbacks"] = callRuntimeCallbacks; + + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + Module["demangle"] = demangle; + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + Module["demangleAll"] = demangleAll; + + function dynCallLegacy(sig, ptr, args) { + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + if (args && args.length) { + // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. + assert(args.length === sig.substring(1).replace(/j/g, '--').length); + } else { + assert(sig.length == 1); + } + if (args && args.length) { + return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); + } + return Module['dynCall_' + sig].call(null, ptr); + } + Module["dynCallLegacy"] = dynCallLegacy; + function dynCall(sig, ptr, args) { + // Without WASM_BIGINT support we cannot directly call function with i64 as + // part of thier signature, so we rely the dynCall functions generated by + // wasm-emscripten-finalize + if (sig.indexOf('j') != -1) { + return dynCallLegacy(sig, ptr, args); + } + assert(wasmTable.get(ptr), 'missing table entry in dynCall: ' + ptr); + return wasmTable.get(ptr).apply(null, args) + } + Module["dynCall"] = dynCall; + + function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + error = e; + } + if (!error.stack) { + return '(no stack trace available)'; + } + } + return error.stack.toString(); + } + Module["jsStackTrace"] = jsStackTrace; + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + Module["stackTrace"] = stackTrace; + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + Module["_emscripten_memcpy_big"] = _emscripten_memcpy_big; + + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + Module["_emscripten_get_heap_size"] = _emscripten_get_heap_size; + + function emscripten_realloc_buffer(size) { + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1 /*success*/; + } catch(e) { + console.error('emscripten_realloc_buffer: Attempted to grow heap from ' + buffer.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e); + } + // implicit 0 return to save code size (caller will cast "undefined" into 0 + // anyhow) + } + Module["emscripten_realloc_buffer"] = emscripten_realloc_buffer; + function _emscripten_resize_heap(requestedSize) { + requestedSize = requestedSize >>> 0; + var oldSize = _emscripten_get_heap_size(); + // With pthreads, races can happen (another thread might increase the size in between), so return a failure, and let the caller retry. + assert(requestedSize > oldSize); + + // Memory resize rules: + // 1. When resizing, always produce a resized heap that is at least 16MB (to avoid tiny heap sizes receiving lots of repeated resizes at startup) + // 2. Always increase heap size to at least the requested size, rounded up to next page multiple. + // 3a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), + // At most overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 3b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap linearly: increase the heap size by at least MEMORY_GROWTH_LINEAR_STEP bytes. + // 4. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 5. If we were unable to allocate as much memory, it may be due to over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess growth, in an attempt to succeed to perform a smaller allocation. + + // A limit was set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + err('Cannot enlarge memory, asked to go up to ' + requestedSize + ' bytes, but the limit is ' + maxHeapSize + ' bytes!'); + return false; + } + + var minHeapSize = 16777216; + + // Loop through potential heap size increases. If we attempt a too eager reservation that fails, cut down on the + // attempted size and reserve a smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for(var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); + + var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), 65536)); + + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + + return true; + } + } + err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!'); + return false; + } + Module["_emscripten_resize_heap"] = _emscripten_resize_heap; +var ASSERTIONS = true; + + + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + + +__ATINIT__.push({ func: function() { ___wasm_call_ctors() } }); +var asmLibraryArg = { + "emscripten_memcpy_big": _emscripten_memcpy_big, + "emscripten_resize_heap": _emscripten_resize_heap, + "memory": wasmMemory +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = createExportWrapper("malloc"); + +/** @type {function(...*):?} */ +var _free = Module["_free"] = createExportWrapper("free"); + +/** @type {function(...*):?} */ +var _get_features = Module["_get_features"] = createExportWrapper("get_features"); + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); + +/** @type {function(...*):?} */ +var _fflush = Module["_fflush"] = createExportWrapper("fflush"); + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); + + + + + +// === Auto-generated postamble setup entry stuff === + +if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +Module["ccall"] = ccall; +Module["cwrap"] = cwrap; +if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "makeBigInt")) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = function() { abort("'callMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function() { abort("'abort' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function() { abort("'stringToNewUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function() { abort("'emscripten_realloc_buffer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function() { abort("'ERRNO_CODES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function() { abort("'ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function() { abort("'setErrNo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function() { abort("'DNS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = function() { abort("'getHostByName' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = function() { abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function() { abort("'Protocols' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function() { abort("'Sockets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = function() { abort("'getRandomDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = function() { abort("'traverseStack' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function() { abort("'UNWIND_CACHE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "withBuiltinMalloc")) Module["withBuiltinMalloc"] = function() { abort("'withBuiltinMalloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = function() { abort("'readAsmConstArgsArray' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function() { abort("'readAsmConstArgs' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = function() { abort("'mainThreadEM_ASM' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function() { abort("'jstoi_q' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function() { abort("'jstoi_s' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = function() { abort("'getExecutableName' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = function() { abort("'listenOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = function() { abort("'autoResumeAudioContext' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = function() { abort("'dynCallLegacy' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = function() { abort("'getDynCaller' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = function() { abort("'callRuntimeCallbacks' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "abortStackOverflow")) Module["abortStackOverflow"] = function() { abort("'abortStackOverflow' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function() { abort("'reallyNegative' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = function() { abort("'unSign' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = function() { abort("'reSign' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function() { abort("'formatString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function() { abort("'PATH' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function() { abort("'PATH_FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function() { abort("'SYSCALLS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = function() { abort("'syscallMmap2' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = function() { abort("'syscallMunmap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "flush_NO_FILESYSTEM")) Module["flush_NO_FILESYSTEM"] = function() { abort("'flush_NO_FILESYSTEM' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function() { abort("'JSEvents' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function() { abort("'specialHTMLTargets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = function() { abort("'maybeCStringToJsString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = function() { abort("'findEventTarget' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = function() { abort("'findCanvasEventTarget' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = function() { abort("'polyfillSetImmediate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function() { abort("'demangle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function() { abort("'demangleAll' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function() { abort("'jsStackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function() { abort("'getEnvStrings' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = function() { abort("'checkWasiClock' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function() { abort("'writeI53ToI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function() { abort("'writeI53ToI64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function() { abort("'writeI53ToI64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function() { abort("'writeI53ToU64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function() { abort("'writeI53ToU64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function() { abort("'readI53FromI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function() { abort("'readI53FromU64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function() { abort("'convertI32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function() { abort("'convertU32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = function() { abort("'exceptionLast' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = function() { abort("'exceptionCaught' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfoAttrs")) Module["ExceptionInfoAttrs"] = function() { abort("'ExceptionInfoAttrs' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = function() { abort("'ExceptionInfo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = function() { abort("'CatchInfo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = function() { abort("'exception_addRef' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = function() { abort("'exception_decRef' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function() { abort("'Browser' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = function() { abort("'funcWrappers' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = function() { abort("'setMainLoop' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = function() { abort("'mmapAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function() { abort("'MEMFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function() { abort("'TTY' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function() { abort("'PIPEFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function() { abort("'SOCKFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = function() { abort("'tempFixedLengthArray' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = function() { abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = function() { abort("'heapObjectForWebGLType' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = function() { abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function() { abort("'emscriptenWebGLGet' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = function() { abort("'computeUnpackAlignedImageSize' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function() { abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function() { abort("'emscriptenWebGLGetUniform' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function() { abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = function() { abort("'writeGLArray' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function() { abort("'AL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function() { abort("'SDL_unicode' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function() { abort("'SDL_ttfContext' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function() { abort("'SDL_audio' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function() { abort("'SDL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function() { abort("'SDL_gfx' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function() { abort("'GLUT' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function() { abort("'EGL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function() { abort("'GLFW_Window' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function() { abort("'GLFW' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function() { abort("'GLEW' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function() { abort("'IDBStore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function() { abort("'runAndAbortIfError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function() { abort("'allocateUTF8OnStack' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + writeStackCookie(); + + preRun(); + + if (runDependencies > 0) return; // a preRun added a dependency, run will be called later + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var print = out; + var printErr = err; + var has = false; + out = err = function(x) { + has = true; + } + try { // it doesn't matter if it fails + var flush = null; + if (flush) flush(); + } catch(e) {} + out = print; + err = printErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + warnOnce('(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + checkUnflushedContent(); + + // if this is just main exit-ing implicitly, and the status is 0, then we + // don't need to do anything here and can just leave. if the status is + // non-zero, though, then we need to report it. + // (we may have warned about this earlier, if a situation justifies doing so) + if (implicit && noExitRuntime && status === 0) { + return; + } + + if (noExitRuntime) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + err(msg); + } + } else { + + EXITSTATUS = status; + + exitRuntime(); + + if (Module['onExit']) Module['onExit'](status); + + ABORT = true; + } + + quit_(status, new ExitStatus(status)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + + noExitRuntime = true; + +run(); + + + + + diff --git a/rnnoise/feature/rnnoise.wasm b/rnnoise/feature/rnnoise.wasm new file mode 100755 index 0000000000000000000000000000000000000000..6fa08706b39e0a5df009fd513fba44cc1a2e607a GIT binary patch literal 230653 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

v7~B!dcl?(Ilsj_J#cs}esBl9^nb2 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ⅈ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 literal 0 HcmV?d00001 diff --git a/rnnoise/index.html b/rnnoise/index.html new file mode 100644 index 00000000..a2cfd326 --- /dev/null +++ b/rnnoise/index.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/rnnoise/main.js b/rnnoise/main.js new file mode 100644 index 00000000..fd811292 --- /dev/null +++ b/rnnoise/main.js @@ -0,0 +1,44 @@ +import {Processer} from './processer.js'; +import {RNNoise} from './rnnoise.js'; + +let runtime = false; +let rnnoise = new RNNoise('./model/', 1); + +Module.onRuntimeInitialized = function() { + runtime = true; + console.log('WASM Runtime Ready.'); +}; + +window.onload = async function () { + await rnnoise.load(); + console.log("Model loaded!"); + await rnnoise.compile(); + console.log("Model compiled!"); +} + +async function play() { + let audioContext = new AudioContext(); + let audioElement = document.getElementById("audio"); + + if(audioContext.state != "running") { + audioContext.resume().then(function() { + console.log('audioContext resumed.') + }); + } + audioElement.play(); + if(runtime) { + let analyser = new Processer(audioContext, audioElement); + let pcm = await analyser.getAudioPCMData(); + console.log("Audio PCM:", pcm); + let features = analyser.getRNNoiseFeatures(pcm); + console.log("RNNoise features:", features); + + let outputTensor = await rnnoise.compute(features); + console.log("RNNoise Output:", outputTensor); + } else { + console.log('WASM Runtime ERROR!'); + } +} + +let buttonElement = document.getElementById("play"); +buttonElement.addEventListener("click", play, false); diff --git a/rnnoise/model/denoise_gru_B.bin b/rnnoise/model/denoise_gru_B.bin new file mode 100644 index 0000000000000000000000000000000000000000..5baf8a3c5714dc0ed23663f254db94d72b70891c GIT binary patch literal 2304 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 z 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 ToIMV-k*|l{daU1?Hv9hz6FzID literal 0 HcmV?d00001 diff --git a/rnnoise/model/denoise_gru_W.bin b/rnnoise/model/denoise_gru_W.bin new file mode 100644 index 0000000000000000000000000000000000000000..07b0178548c95046aad924960bbf4c5d82d7b1d8 GIT binary patch literal 131328 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

5#AUTGqqoRI>}~A6 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 Z0P5J?J4c>^4ssK8)!_!Q+Uy~|_#dcrI4%GH literal 0 HcmV?d00001 diff --git a/rnnoise/model/denoise_output_bias_0.bin b/rnnoise/model/denoise_output_bias_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..043ee13b79cd471e0e4138881d09883cd1138797 GIT binary patch literal 88 zcmZQzShA0Sp#_M40r5T{{)Ywc0g63>iZ1}tO+b7L%KrnTF9C4~5W4{JguM(50($}3 CO(4Yp literal 0 HcmV?d00001 diff --git a/rnnoise/model/denoise_output_kernel_0.bin b/rnnoise/model/denoise_output_kernel_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..79b94b9bcc6b3fa0dc71afd8dfcdad5c7b20c6a3 GIT binary patch literal 8448 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 literal 0 HcmV?d00001 diff --git a/rnnoise/model/input_dense_bias_0.bin b/rnnoise/model/input_dense_bias_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..1fe4a3cbfaba2f9869ed132e4519e54a9e016cc1 GIT binary patch literal 96 zcmZQzkg#K5IIxF-;UAEOVV!+IHW1H&iY>5#$bCan!?2%$VFpmmA0U2U3z7c?l>e|7 L!rlZFU$7SdB?%oJ literal 0 HcmV?d00001 diff --git a/rnnoise/model/input_dense_kernel_0.bin b/rnnoise/model/input_dense_kernel_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..ff874eacb4d22989f1cc6e564adff831dff2283a GIT binary patch literal 4032 zcmYL~F-V(R6vyx2;E*AMgM&i`M~4g!!b`(9I5;?D=-}Xx!NK7T85|rsd=x36I0PvY z%Ao_fZ~2L`nuJB9F&Mks?J(kRm}u-tXs^@&bSU=lt)v=bm%#NfJWo zFg$#sgAn51F!59Ds1iaA`$0o?Jp+krAg!?WXC7;U6fG8LK_-{TutOz;okt;*K!Trm z26hLGRauAKGlHGMyZE)CHaA??H(%p0gg&-)%YLji0cZFR=VC|XnPhJr6wHA?3)@qf zIP*r!#ntGIKgjYo5znmxn2YVpgu_+>x(OSFD>*4EoHCz zD*4UZ!mfjebq>c(QT*FVOBgOVzt=%&`v+;Jv`xOYB706@V=KE+|HScK= z-U3bZCG>A#4Bz-u>=`hrPc1uWWqj8*;AJoYMyu2gy4cqB9qz-fJ8w7G&Pc#N2mgQu zn)hSPFM#*EkLE0T&IPu0ZL?g(&F9tMu@bg-vjblN`(Fg+ z^L*_(`)^=#TBpAK7Vu*@1$XGybpfjQw+ZaSD;O7rpDc`;h*8J!hT+qeC1W6!}S zZ~%)S#rOB&C+ywZt2LT`6~B)?gWbh;wp;K=U_bTYz6`!6W(C}_W^YBbChVQf!VP#2 zj_AQ!U0VR7pma#>#5-dt_Chy5%ibgWEn@s0`2SS|o)sSDZ`2{i&pJE;Zdh9bm*53{ z%)S@cE$m(PR@Ar;zn9iD82Ue}`ESbRE=( zvFRFYzXk9a-9DP220T9;|eAN>1yW1kT$8+8Hqiuytl|1l+$2>co%3&TkAhu)hQE@}URzrrdqN zzw73+=pA2!5^D>v@B1G1?ViI&=)TVs_FL9Qfpyuh@A(@46R`Fe^gxX@^ZFl}z|LL` zT;qFZPhoplXU+GsmM+-E9|0+FPWI5O;R5`D?R@Tm3bwFLzXRrs?2A2pkZ1#E$r(?v zvxEHoVt9sq-eZXzyTqqxP5fzedn;mh;5z(-7<=-JC2ae4mKTX_<6FlL{wTh+_pqD5 QxA5E|tmYo?QnU{L1OFHPEdT%j literal 0 HcmV?d00001 diff --git a/rnnoise/model/noise_gru_B.bin b/rnnoise/model/noise_gru_B.bin new file mode 100644 index 0000000000000000000000000000000000000000..ff2493c876e20ea330a6112070b2a7225a14ea18 GIT binary patch literal 1152 zcmeH^txf}B5Jm3;R8$}kh!u#63Iw7_*-ZrkQBi@YK=ct-R3JY=$cBmlgY6^N#3 zfL%67LP!-su0&Q=a&FouK)1=s%-os%=BH9WkpxeWLMWvLHb0S?_@_`3e_AWZzeuB) zZ{Pu3lffnV4n$}v@fUA@mt{8YuBLr-7#7OOY|W&XO=a2&)i4bg9_~t+q6cFXArko z7VJ%YK+fN}r{{7H&l0Hd?GC~Hy~7Co9vi_0`WPDEz1L_xcqXo~NAae2huFIJO3^&i zH=J3ghv)VzQ)0h=MLfjchgw88&Rp0FGK Z47`WyeWxk9=kPt;ug30vy9@mP0)Km-j7R_g literal 0 HcmV?d00001 diff --git a/rnnoise/model/noise_gru_R.bin b/rnnoise/model/noise_gru_R.bin new file mode 100644 index 0000000000000000000000000000000000000000..218c38b1af3f36770da134e3e836889fd097b34c GIT binary patch literal 27648 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 jam^TMW z7L)e}@-1NOHQa_vuy>;tvNy87X9MJfczgXj|8;!UG+>Q6B65zA=drcW|AqCt&u7@) zeu3Y>8Eu8EaX(-$=Cz&~*!!g4-tB3K-7`^tfPRW>J$>Xm_^#nI_#1FP*DM3q2zBf0 zA$vyK=mER}oaGbrGFU+W4&2{$+Lq9d;5xAWCD?gp_*=;KoFczNwx$#`u+@pF!O9|+_5 z*vB5B+fxfYhBvWwusPdxFhF*WJ$%>b?T|A=x4zftuhC=ln}72XYridge!sVXbGbyX z;S>UqU|x&asMZ7U&P)6#G6%@!9JXatFDFFJ8>&>MYyn|A8(1 z&cT|!m$Ef_UlP`PruG@ZEl?uX^;2QK&U5adr@%A*0m{H{Sr6OoFkkZ$+h_0x-S{(j zjD8o6(0?Kaa2Kwf=WO5h=Ke9Y?4Y~v8tkl`gYz)&h_%-63fa27D-qb&H?eu1&b^5~ z3ob!M%nCMRXW&z8_kne~M+JLnG5;<)gBPF(tosviZG)JE7;|}kP2^{Ash{61=W4C; z0N)I93%Q0|B`#Knhv-{y18(B?T-@LNtha;DGfl8rlRSm}5pXZx4ev{aTnE3w%{uJL z=B~mW)_P8t=*Rd5=nKdVu#SBTbg(a@Zv*qK!aJ~Q_mS<E0mJkBj#}?F`YN!d$6?-QO0AxoT*Ge739>brdkx=rVn@gi zkzJdC3O4tj!!`q~tp&V4f5LoU**v{-e5~;s)Pe26TD|-B-vj|jz%a~fw5Ae}r?9zy z6J+PSH|QngGQK-t4}1eXY}VvijEGCo+i(DTE_=X!+*{vMbZZz8vk$vZM(+W77d*iB z6jYF7xCor1@z%8w=Ih=fFMtR=Snr(y5AbMQ>H?;$&n2z|WBIe-qjerMLhzfar> zI0Mf84+!v^?-2M+$k1JT8s;-JZWegX1Mm*n{MT@W{PyMi8~Ds&U6=4nU|-&M=Nlt? zr>pQ7Jt9ZUUcb@3%kKRXtODzJsPO*ab1R?{EXWM?MCJGBIWN8rZkz zw9?PN6K(XMp1()`VLJlOB*1Z5ZS)%a4c&as(>Z-Wc5NMB4;0Y%fahES?&Y4|FZcTmQf%`f`;cQ9 zy{?Sy5MDvQ2m8KxAMAM`6FY<5J#XqmZW22SAHnt(5aUcf1K))heh;RBXZr*;Pkf%& z+JfzEIn3|yA#xwsPt3k2$j07-OJVLCE#~{LqG#+G;nUwB?otNcjo)G3o3&3PH^6%^ zLND~WFJMbX_iU`sJpydTI2&hh8{HW!!4Y=*)$aOZV7zs^*0Z!OXHi9d4*o&6ml)f3 z^bUGTo+kM}pxgf^P{8h83E(pP81_B&47_iCOIENw0oLsPP2@T77Wo?Nfpzpc@P0ZA z^V@@Sc!&KFvUkDtzDpJ2c94C4UE^Ju2AiObZ3<4P-FdW-?_-P5k6EkF99wWnT_3Pc z?@0%nvvNL5U=#Z+tgnmj53;F7i5d=V;H*L4z3Ip@hBmvA2-V z;QOEkX22L!SnqjgA0eBsjO=$Xz#c6Evxf15zfd}v|aVuZ|0(@=aipciv_r)H% zz_X9R!!V!aHtalo&pPM%Y@C66nA5tf**uprb*zN>oxesm_e0n^{hn3ffIeTtyXdR% zzi^B7&e^yv*mcIXkXK;)4S@GHK)2Uf_&ff;KF_rT*1>?-2%qQDhSjZmjBdO!1?-?!w0X1O5QtZSR-+?jYOGUD!SSMtIg` z*!Q9Z%z1>b1dq|Dk)Po|f%W}@FTozR8F&neV0j{2d(1lD_fy!s`^Xu5x|nk%%>Qli z6+Qu9@$bMbcoVJ>YYxwU9^H7qKl@;#pWm?t`~q0dMmYJK3)wZ!VF+jReL}5~| zpTTOF&&hlDcg7KR@0zw6Jcphj55a)=D`0)voWnKpTWr&ygRKGV^C$WtSOcr*bFjTz zzZ?M1Bf#g`T9ftot?eTR*sRfdGUOBZ_QdX<_T?RU8s@WUz+-R=-_`^>@GdrcKSZ`K zZO3rNTI;X|^SI9twDEP|6n+a|hj|a?9;4p}DR>U7J7s+fcE--k{kk9k*Tn1r`|om_6y7m1;_Ka%Cdte>?6RgdC&6k)1 z**r(EdVu|RNL|R*S5O-}<-LUTf{W zkGY>GimJy^lpO)M3y$I_I+%~5P98-A^w;nSdLKE1BXCH}8Tt)4g%^n_kX`c|EP*HJ zLt>}lb@UhD7uW=|aTJ}yyP!kNL-bQ*_ZT3X_W^nZUl-Xry2u5*itawIfVDJ14O<(Z zbxebg=zoEETA&J=_@BeZ4dM4-2^{A5!4RC{Gxk059()8U*h=*1{|Wi5ln#{mr9(LY(vU3`*oGvi(@g5a{cJNBHe~0^H1_Xc?RUe;M2&#yj#a z-g7O$y_hy?W zJ_KXfotyjL#b*uUu>D1#k8Ul-9Uy^l>ePr*5^OP&_GvGJHeZ7n7uJ3{eAfX4p0}=iO*!y#}7WU2B zZy)$eVCQlI8|S_Ud6?fQT*a4w9zM_P4{$yWP(ywOhS&HGe+KSt4R>IBy;_6aGp=EK zitId6d|%Lgho8``!J0RbOV$sOt#b$e7B*{NfE!>Nn|+&e4t@*V*IX@-VHfu8*;Mmz zpCZ_v6MRwqf8QKuX;0p*S=hJ~E{N-3TS4w&Yq8e*_8XkI2Hm*7=uLEMGMBRbMXXQR z$G8ledV%gtBWxF}`-J=rtROq%OXL>pUe;soJz)Qj;6WVrw1x)$W%L~RDSQiL$p69i zd4|7@ZXWlsuRHKZ*g95`2l%X~fo%u22iKT)4b+f*Z&PrO*vH7}{|&WNkvpIcYWPz6 zb8Q`D$LQMdIg`FRdltwM+$E-s?*ufkxle(70meWV^nrJzg8u+)AUmI#JbX(_@;Ijf zKIfUBXGdWl+4cIoO9R)kPTM=!GyM;?AMd@ndgy-7tY-@QDY`ZG;o32I1##|gzER-M zbt9n3x-)DwGLF6%hj+S!d=reLdw$M(4Bh(u zuFfGx@E>K+!M+Kb$Ns#pCGcJvW3N4QYx7K;%?oV)>}3_%_%(1sj{E34-~m{~RwX{A z$NR_|z`l=S>e9}gOz6vd;%wexH~%5HItOgtt9QU0TX2NU-V4Fn?VPhfZsJRj50K57 zse>E9JzoO9<%{Unr@c1M-&ELreXA>Z=;5I{at{{f{R}UID*3I+bJJ&z6W|?m-i@5^ z5m>-C0M5=n?a7&Hn~|{(!AG!%Zk{>h#2mo0ckLnYuCKtaz$vf?@53*61YGUS`n$*< zfbTCwZv%TyV9&uCmhr8C@7SH`5c%vFnS6WLtY-?_U-)WfzQa!dJ(oS z^Hz`tpaGifH3X;N2;KYDio?IBH{sV{8~ZN!2JGRGm`B)M<9T@pM1k)4ICJZ4pqoEJ z|4rO4a1*S?;qPi@9I|Kp7hHlv;{VO3fo{%+dAQ$xhmA9@cjpfFHoCLPKoxxzSf_Kj zLLAm!{oQ9xg54UdFT$6}N7%_(1>IxvV}DG{8t@J|JLh1$y<3NK$bjcmDs&ygfRve>3pTHql*g?sfeB zCeWS50Jc|ab^a}4s^A2>^LqhX!z}VS$nY(~3G92chDo@IzJ`1T>^~ys2=)rHxrZR7 zf9tx7?UZ=W(r<<}nm@rWjIFtjm>bx|GWt{a1Y1OmzBzRFb)QB2g?9LCKCCz1**3A& z;U2N>-$A$5KVS%60^jPZJj}y)G79`1!rlSD4OQe>;5~c>euEnJ3K)P0-8>QUVIE@b z@gw#UI7i>wF1`$$qA$bdFs?wpgU!6|yMXR}>mr}xw~jSzGw9Ci-(F4RHgO49LiR3P zf``C*UDtx|qC4+T+K^p;1iOC&oA1Hdj>6;M0GqxI62;qdeS?8Q8a2V!!HPo;{H5(|H&4WzF6h z^Sht#!J4f<0e|9fKR+OQZYi+`$bKh!z<%T*Yfh1^_ZIvW^ss$JpFp;*H}FlkdK}KG z1y5o-$L5(^zvria6?+x5(0l0an-Q~uZ3Nr~DZV?`vU9JYuK??70P}k%JyIg5ciUpk6;ts z9J0Msu^qzJ-oXBEw#GZ3f<02Ogx-NmVrH@X&YaT{P_Lldt9P~!Tf<%K*3n^2fo!aO z`MXQpH{k5HuqWDy^)7g)HuPcJg>Qqa`$}vH3Su&R)*LBgOThwqleOk>?Rw6g1|_yN z8QT~!n_vJs*q+1grOmbDa1Ji6q2Ia43F~jb<9RsG3T!>@?fiS7kN*+&I&7UUVEb_f zqu7_w+puyI+YI^)av$0G`S-)x7qHENS>PVN{XJy&tRkNh>lvLO>wAmr-Cu>*!8k}* z_Z*wK{C?@10?x9ItqNM`_klA@v2P*ke+KUW=jIxHi^%TVo)5F?Ay@Eu4s8&jTT6qu zNp$PauytU+aU0m2k+T}XX8-yI_{{$w{sx%9W=-}fjGYDJz&-xJr*U{IHT2);_PV5> zf2XORflE-k#u5BE4trROGj$JZ?V~s5IV)sm)xqvL{6sE@vo_Dj?}xKEK(2!^s*nnRtgG=B%D)0fA1)b~o31sJ*QP*tF{X{O2oq>DE33`NY3V1&6;2w6@P6KPU z=S}2Kpq~G)KKFc$zNwA427D7tfQ0}elu z{I0Vv@5e2C+ScHb_0Hil&_4;^h2Oy`>(Ai~j)42MKyn=3(#S3|KWl6w-^0EO zK7fMRtimne{2l{m;Owl)UY4$H1J>4%Gq9}<%*ElGm0t5xY!NxlA%?6O!M1`w0X1yD z;c;wFfM>D}H?S`wXT;ax1#Iu&UEp0P>=|2&xEa{_?BlDT`*YUL!u~qoBR*@Hgx%u{ zxCKt}oy*7JZhS>9uziCMbLIvP@lC-gedxQucc#vsHDtfp&c(i7gBREm;2mobe}XT9 zC-J?;_8k5MSFxGTnzXAA;ofnG$@B2_Z~xc?>_M7d+L!- zUj;b@HRSC$oYzZq=eUNx2MY89{Px^}y+2iC@697%ANEiJ^Vpx?mY1-x)5y-p_h3z1 zAVa@_y#@Y)OYjHW0_OBy_AK@p!cVS)LpAL5K<}2*hw}`w7c0m{TE+XQq zu={wA&XG%y>WjmEd&o=3DSqKuZ(~bfYbdc@ogZx9zER@`=mq(gk)5@B+=V?C=PcfV zpVxAqb?rR#IRfX{i=%M13+Si#Jqzda3%GU%{WEYL_VqO8+XcJ-XJAf$RrX#)Z{eGQ zC*kkl3-ITBE5ul(x1|#qx+{nYdah?;{7C;8h!9*Uu<-S+%>@)N^?EA3$dyg9E z&S@FBgY16h^^B}_Q$M{r(+r!x_rxAy@53$Z&cgTUJ{=GtYd<*-_0@^<4F6((iENzp zKS3UXpW5`pm%zJx2F&pw4)@6TF>D8L6|Uj)eyt4hnSTJ*z*0;OzE27974(d_6*vLztL|O${x4B(ky4ZSOY#@MSx%$B z0_H!23*da!BVs)B0$7uCv;QG{b_^mAC@gvuh$R z6Ss;#0^YAWNQg_&E6CP3fE&a+%USFNe(ly}9nLYsX8sgie*`ktmEewGoqNr}J#r1; zPe9$doB`kd0}$c2ChH%`!`(kXPRZFl4)4Eaocq=xlAU~bRUnY;E3IPVqo0$#&sj!|H~MYvCl-@1~$?IR+tiOqd7>qYMab6bmc zb9ruGSoa)szyP~5e+{hd1)PG1ap-Xm{)F!So@EL$;ws=7HfQUMhM>TIAul1H zVE69rfJ5*HY=g@@oWHf6%`-=AyVzWNfb5w#ueZRpCHhhx_H#}NaW(eHv5kNYY#A|^ zu=ny2{0`KB_rp7}1%|Adg{|Lp-i0%L$cMlf`?(F5#N0-9P7P%9R2cnVaJ6LKElcTLKgX?O>pb#>rfP{DtQ@87IO z^w-1PT0rjOYvk+$e5bCjfK4z1_P{|N?%FbPNp5FqPJdPM_kibXEg62#z_?%764v&B z`!B&Cz-%1u(-yMl-U1~xHHmqMuMc}3->^SHKL8cvOLzo$kME(6fg$oK++dA;nImCu zXMYEnw`;y*?6AG95pS*fHqf0>1Doq2xQQ*nm%zq&UMJu=x_Ru~*ePPY6Z$js4)y`^ z1~zk+ppER^8IMDb2zd!x|2k$0yWcJMbZ$NTt}&l)UO(!l22s$d4a2fPFJvWIN| z>fjOfD(k#c&anZTYZYG&xrXgOZ~;2#cj0MZt=8WI&G~TN9k_yCgZ*CHvvgTXMK8eFjo!=1r z0KdR}&|3(-3?4BCl;~%$@5$QjcNaM8 zKXLf}*We-gKI~ohd-V%kVzZ_T*xX&#zrWTWz|+_x=9B_wFbSNM`6|Gf>1(mheZPSg zwk_E6bPh|}kR#ao+{4+mv6ZZyKptYN0rx78@Xd#Rcc<9Allo3z>+~Ji^Cqz71h$t8 z&;5cdLo1HFXL!8GuUoLd)I>$VK+^>G|}8p0Fc5dREz`}3R=>O915 z|Ko5KUmgApd)GbZDcHTudkCJz;osW>Y>UWi!1+6u->`FO0pHjgun6)v+@n3@P2^>8 z6Buh()H@t#9OT@R6+m9rQjW*pSO2{^=NO$&MWyY2e>*c;gGZx^`&v}g1-!0vgB zUEu-_tQs6E2g zX5B;V&TS1i5BunXgc#3Hegao1S1K-F7y7ztpeGa79ya!ccuQe?I=W3j9{W(5kOKcPPs_+5&)ojUMLC?@5;z$y3%{D!pg8)M#mbmLa>og@E+>##HK!cFuZJPCG??K=nl zCSYr^=i7Ox*}3(x-9g_5ee@I}e_v=X(!+k6vTX3FIodmSNXeSAjkWXTaL* zYcA(bVc$cpBYV~raPyi|Z2soZQ+l-qW1PLY?8Unx%yS2uGkHp!`;Wl|y0g>2jei1L ziR}bigw4C``FJ+o|0Vp+({+(Hd(cz&fh{lz?K7hIVHy#7~o$-Z^9j5E!LWVQRDG>Htt)&=1h#Y&L!BHZQ*+j4zT@% zo!<>$?rfeI_z3$Uwhge1Y>frJ_sBb70=s?bOY!}NjV+O#{|b5=bkXOq_laGH8=wd5 zYXF+~o$G(d)_8%uhkOQ`V-{Y6jU5Gj^l5MdS^GA!u|x9TMbF5w3Of_OLGGu&hQ0~= zzWguLzrkCu z3YNf~JnWqzx5@bzJwmR5Es!xk>#=V0Im@yud$#V+hiWj=@$AjxQXuFokmW8adpsTj|8l0$A6KB^R$)= zY}Qd>{|x>O9)T}$m}w9D9{OMOE>K@ZuOeH+5%Ll80(=gvw+XLcn}q#VeTVJeJLSF4 zSm!<1L|y^TtU=ry`~i3eM&TN4Uj;tpU1Z;*v$Bs7^qMw&d$8XfXHdoOo(*gpu;3^G=aZu$!X+oA(ub4x0E}vkO-9@a9wGC&=E(lKoO@x`kdv ze+>_TwjYPzcbGKKjap2A;`6feh)ZzW5ASsZGsB4^Z~UA9i|PM>(^ zeL$T3--N$|l)N>3b!@x9J6&Q+SbG^wV;=(R{Dyu5_M7RsFTwU!5_^PP0d3Y+@GT-Y zkv(VYu@2AQxp;nA9@Z@&r`RLx5wYgBU++{(jD01@_LZPd0oM%ConaGS2c*=H0r#_> z8Zq0zy6m}!-S1W(oaNy=>o@&%u6rAO%lANvv}>kF`hWzK;}r7X3A{ z?=1swk?r{pxI}Kj-kCalaEuIlCO_d0`aO6&CM7%y#=s;v!Pg*vGYaqXIkkQ)KNAKtfy>o&}9Oy!iybG4|s-u}|~Ko>K)_ud{Dqvj*={8`j>$-vAYK zeKR@sqwtOf#8rWD&haJqnuos=zKPq&bJ%*wBgnsyjrY5k!gY8Veh8c2H=ZJI!QWx$ z{u~~Fzt~)ViR_*5ZKU|UyN{9G&---~{{jBLurnP1^)77Pr?5Glz5O^F?E~0zT8!DZ z9^R65xz{Qj!BcP*|0~Luqd!a;0D+Ri6EDEwgWEFJsWC=GJGAZR7zk$8Jnc);>X=0F&t6Kj+y2&d~Q^eSWti@}8k*}vrO3EwFBe`n=^i*Gmvi&p4)J;R2Vf6h%3dk5XKZcO?Hs%-4eZWx8r^=q zkN4q%y}VP_RU&(DcJ$AOzX|568;8CLZxUyHo>K&@M>em&44-@Tj1$P~_@03$z5mMozW1a;1WdSTF66w|Bc+ob^=`E zx4;>l=i%>nM*a-BV2$5~E&Q&34mEVqzb$ZhOx*tuBaDDYg~qdQB_ zrG@TYYQQPFXYXv?dl&l!=mYg3{@=){I_qbZsn>IKpE0;boVkpjio^V8VEtYEJD@Gl zs~}^2LhKSTr68|&$yt5N!?)1**XZ8klK5Zf`rPj>u*Sb22hLRZCR^y9i|4n3T*9t* zjeWT96WF`r?02Y2w?&YcI*+zVEO(GxwT89s_rP>%9;5>+cq_wLXW9se;CQ zSi2Gjy@TJgaaQ{5#XDx+5zqv+IMlufZvpG8VV?l5caIZrfzR(^16h9;p22o9AO0rQ z(9f>ryVx`8pM-nZ657ud|ZfV~Sp1ATA_UV};SA`WZDkv*S9;8}Tw5i=Ub;eNRP zDe(O|D|>OyoB03j`5D{QxvRRmfVEr}New~p$r^F7BoA5dD-r*7C zDsYze*ia|NzNSD2y#>6})@|HAe2H%DFM;>P-bRt{gM>US;!coVw++0@H}mlQu(oq; z=oi4A{XV=w_KmprB}mA-f^Khf!1}HI2J!=7uLmF_&b~_awRi8nb?a{dXEuUOp2Y5~ z{pqV<_e`qT)#VC)=Q03mdH7~IzY6{~*u&lfW8f6s{yMO;&^HHCYPkm+a|2joaf}^g z#D2tPP0Ju6w#4t5o5z`XZyLm&V6%Vso`tu-Bd`EcY&}pCH?7Xw&EY>WwPUl-Kj_}8 zg8bf3>vjJwF;n0zDA<1$pEaAqeC8JJ6TuPdcaYu3^J^H7eJTFm->WvV_8GX3Zw&b{ z_=fIGoPR0E)kJ>=GW3!Bf9GW_*)e&r+rtGhEx3hl?H!=aIUWMfp$~fxB4qE0_943c zSJ4--`)?!9@C^9~46(bH_V?(1kMF|~G4^E*71%S(h%3>#nZla5YIGnfptRq`r3;%t5-sf$&2aA-L8oG10e)nqw?|gC` z{u^n4eu%ySJF`c~ZD73x$Uql;5+tArPLG)_aOM-}%U}U~2j2M?uxDv4Yrq=Pqj1Js zF@3SlJ93Hq3*Ri9V%vj%E90w@$6kj(zcqPRJ-XUo<+W!jMH1ZTY4zI(`=L2$uJtN{Xkf6Iy z3ZCSluL!vYW`K2$<>9~STt9&xvEFlEMBW6(j)6`dX0;Cwh_&AqxQ(xYEoHwQI0E+R zowXO=rS>kd#@UPOA0qp`@SQ(`x8MQnIXK&jAkMpSh?{f}g)V=C-P_*wfi-Uf`{}?Xxmv)QQ}hnpf-iw}nPU{${MM8aTVlJq zE6C=_^bxxOyS|Bi1Kk=1$Xm$eQMfPWt72clrtdzS;4}Y#wYT8{JtZ!Kr}blN;`@Z0 zfe3v9jDZob?*iSL9-!Oz*>R}v0{b7}UK7~8|E^y|)@F_8;4Qe7(+AvO?FGDx z?!D-PcVG^9w_S4+OagOk!%N^UC|GNL>m32hz%?ngJ10dus8ufneJy|iGzH-})77~k?kV13TRy6zy)0J#tRhWD|1<`Z%F?*-3e3V43@ z6d|X;p4-4Z@5g+LSY!RZFXz)k|F_1xRrCX3oHdSvO<<17eCXGE=lVJ}b9I30cH(f~ z-l5l#7eUD$-W%hrVH94%o*+L$o(3!ERk%T%d-}IRyRjvE&0|{Y~-4_PFZ6Mn=`f#^CrZ3_dE~(-g>|P;?I!Xe;IuguEXZ_tgKnv zPi^Qm;Q9i)HB_+|=znGO_rwnH4blGtO=NwO*gaqCJOjQFXTAdVz(O4Eq-zJrp34XL z6^MYdDzQcE@fO|LSIB4lA!vXaXwG9J&Kk#wxsPlO3G6)g;dRhKHn)AH#5y16`VL!3 z{4VUQwy@0s^UuQeI*o4%I16X%d0wCoiFpR=H~yh9IWqyqc&FEphrnE(jXiXT&A=SG z`67JIa^~8vZv;63&h0b&8`$R;VEifiGTa5z;14iIB@X}Fg!OsW?lB3Tf+gV0+`q-X zOF5~q-Gn=E9rpa~c@a4SJ#_c)!+s0e$SM0|^md3`B9Fr(IX2iDr@#TYkKQC#6WP4l z6X5;>>|&3Y2p-4o9_#2Sy1ysLf4~6jg6F_G4}dj41n-b%L4&n3=;rhs>)86pQ?P3< zz!?|^Rq#9y{~JvY`GB|!bnn<6umf=C8nE@%@Hg`? z%L@7!vcC-e1`_7ihn;z!So5{x@NerA*!ow2^GfE!`?5c0)kkmT;a+*h3*a3%Acwte z-Nw$>(jx3Kk)y$jP|8#KTfz6Uu#whzx{6S&73JPMp)#J<|?qlW$v z80$RE{{!yAeeec(0X)mY|8KK|?7Y9BkANLeMW2A3LlfCEvi}NP!cBaW$os&#S+lu4 zkJrcz% zyze3-*I)QHI6$_?(K!4&-MY>53FvoCg6tWX+xzwy+dA?LTqEA|_Zzl-?Kg+@R^b-# zOg2Ch*|V3;6R}R8x`^`dj;qKM$erWx{tDt|(Ov7F33`gp*`&ZZj>CR4N_-jU;dlPZ zP2>n)g6?e1Uq>DV*5?fT6?H&-g3UGRC-6$lHx%3g-Vc2Vah{p+5ph*=C2)tB&&V%9 z%N+POkPFs1`x{^k7~8;~;*aG26Kb~?f99`YUnaI0hqw9*_MY#-*0zA`JGVY#+|Qm* zkyGq`^PJHLe04VXGh}P^%}gWTL3R%R0r%U7Blh-wyaLW=09SzfEW#ym&TN3*hwZV7 zTvAhs?0kmAnZJtcI`3zOzXn@dirx3>owDay*#1i3?7T1M@K@koljwd!egnTt);NRw z2m35+j}dX6m$h_=S;B4|&cmE@@FDgR`H?bs0ut6Z&wsTq;J0@BsSX3Hai}B3K92qfIQIikV~sr(zb>GM4+>}pYe-m&UjOO9aX3S#` zS$!6KkHhz}f^4r%^l8|A?IR+W`eBc_S&&z|)A9WL10 z^DtLR%z*d`c4yMZrfiNDY;9ez0bb$roQLoL_^#~R`+1K15m?u4^Z~Np^g3K&%@}N* z?KpgUw~!miIWX>&m<(8d6|4ehumnbso!3+3hH=QBwXyE%%(44(UBv#Y=qJQ&qSuJ= z9KIpXVs~Elwt_qfZh{hj1^xu=)fyvWcHt5}1IyUg(5uLvZ^=I6u=n*R_8v%&!yQ^c zKEh|;<~{)a{jpa2_KlCm;hnXyeL#=UGvM4j%SXr$;S%_s-Pdo&XYJrV7yxJY0A2*1 zX_NzOCGtmX)^-Utv76ts@nrR_ zOtiVCB*t0Yz%I|gllZLdJt)w>!|v5Uu7M$O341IeFW~e3w6IN~r^HRly!i?~=U`tM zn8tn!tN~}W0gu5|pg%!3M}svf`X=`0-~jzD_8Rg}b>v^_*q5$t=J^7g_lrE7`w-c_ zJv;sS#*v+!>+Q7z-U0hBj>C*L;_$ztrbl50fARSpI>YX}xdEKJvnZ^ab>rCFD?xt< zTi2<2PA}Xyd%B7K3jG`Cv!;jceD0t}teb;(Ko`4r^Jo*ZauECEx)z>(~DY{6SxYyKqDg0~y^MDfy?7ow@UPfow14nF8vQU?UIn zG^cS*5V1!Jk72tD&%mC`2l(n8U~`6VVe6?Qk0Lwc2FTbmg+0>}Zkx|DgZH(=&V3Ep zz3kl?Hqn=n^=Y@>D)KD$68$~Aiarke9x`e&rVG}w*NFLxZwI*qL*yQCE<@nVf5Z0v z12$HD9kv$#c6k?_Z98Y~;48QV+|zZ=w#7bAkjIc;!U_5s@+I;f=z=M9?c4AUdWP)x zp$V$MSxw_}&kl%yv-y>W*$;^E`;wr~0^fmbO;>v|;|Fp0cGTdKSm%5P*}L!Bl-O0^ z+5_wfYqsH0P@NBbdv7MMb^G$W`}KCtJKm_|%}*xhFayFEnkIq-Y=9leUY0{4jNVY6m?z65=A>s&shJME1FrE@Ag`{~D}*20Nplz?uD0 zhP}&QVdLH3I#Tw~{`cBG0o$86z}`dm+(1m42$xzB;_ak#gx&yZa+fL&iuLqg0w zeCO~sya1Z`A~1ve4ZFR2|E7>5*1FyrtHfOO3p?`yyWd}DyAIyOA-DPe&DJ+*oU?Sk z&dG0rGxIK6{|<=QvqxNs{UK<8W$d1n^DICYyavwHyq9q}cXOE2`u}|^e<1$>#`Id!l(>#x{)uxB%N4bSWln>DqL!~MV=xQG@-TxO zZjq-BF9Z8A#+nlJbJ)61!EG78x$D?B(Ov%&RM0YwkXQ5pxfzEyQ^D>YkI+ZpfBDTV`oJ1{_@{vTc#b#0C>X~!m}dsq=g?oG zYqy6AY)|&G1?;U&to6IU=h(x(1elL4E-|;{sa^n``XLS@wXl z)*c~m!P{UQ)Z%bIjIDwrY_r%F-~qblUPqUkz?t4bcTanrLvLVzk1VvEfr47LWPJDY zP+KOWKZ5)45R4IXfPMjteFHxLEoAqzo(k;QdX@)qxJUN2hR@vIi+k`kzLK~a`W&+H z39_7`ckm_DWn6;14mb0#&jj)~uO<0XonpHz+2vK!WWnHs|0v@7`P3I-K1JTm{ph3zk8| z8tYpF7wFbs!WZZT>r;3G-I}fE9ePBr8tl6`00nF8S>FWcp;v&lxo!+BflolYvb8pl z?aBN71KU`Po!l*C&&i&v_%;B z`$xnMVEej+wOLO=F8ef>Gc?BB1N0R8F0%R)(81>1p^ z?<|+#SzzqdjIoWOm(2ELKHQO#I^1IfG>KaS)~LLkhrfjpv5V+^^h>x4tV8|-&Vl!; z0yn@#j*m4P@Dw-)lb`_3{}S$jBjn6=#IB-Woh!C!V4gK>&VB?a7sT$s5txg^cT?Lo zdJQ}TNj}VYNTY}xsw`_ks^bFlSGwN(& zyMb&TYqd^iHij+1)&h@_3v3TydyZJ=J9Cy#^YBe+qc=c??IAb>pTSrjdM@!Z3%u=Ot>zf=YT)?Cd1xrOXqeG`X$^f{vn zFt@dvzeK+e?*Y$5TY}&3zBv1sG2Se@LBQZdBb~Es}_Bh-X>#4Gzb?kvU`Z#PJ?f;=K zpj(HtwD*G9y~Vx@eCMm!c93U5ihc$%_I!ced+g6S{QD-hh&uy)un0C{^5gF!_kjDZ zV4DHX(6h6bSD=qRH9qYY#hEBo>ev<{+r?!{y)GO-vqxv z8gtJ0_hHZc>I}4j7BI&A1vzWr5?i0RyV!eh58E?jf7Wt>{1wP!z*#lGW8@}mjRW|h z`aJd4!#BmcGZ10_8HYD9K&~Lq!Oq#Ub{@;XcVu6W;1V`&4>XWRvE4-W4lcod6Qbkr zZ@viKS+?NU`gkwaV^0J0gnFFG4KTp=5Vp@2G1fbSz6u_Jt39w=gZ(+zk6nE9ed6 z6=Y}XopG-!@tfH7AHgU13uM1B1^!WN9d!G${s^1>jwAo;-##Lc;`1I2i1&>3--<); zYv|TtT`gdZH^ELE{st)<{~q>twI1Ibcmq!Gc_xea?a|sMu{)RYDE!;^6y3R=6Z0E3 zpM9kGE7%UOd1sg4UFG92WAENm^b7bN?98m|HTn#AhU^)da}Rbu`^i|Z&HDDyzrosj z*geauy{TEfV9f-!DKH0~fnFTGg;nF{`8Nr=^;xGg_Lrh7za@Sa8~|%7S<{8TfhZ1d zu#c@qtoPfyld-ly9%47o3GBSyu*RHgtXlw{%QSof%6jO_bM{^sU&ZfSy?dA76S&%! z_wozb8C-xL;19UGhHLb{1moZoc+SH(oRPI2fDLS0*j|BA*Kv?n;VwAE9?`RXIv3A)AG_a&Pq1%JdmsN0`3#PLZ+91c99{sIAG833-T;*4|{uy z%^Kam2@lMN?+@4n-$6SLe`A`*;ro!n_PP!{6Zcz1uEX{>0xINj_UG7F(W~gLnFK>* z-(tr8)^fGCcH*zj0AGz5{b$(j;#Po(HgZ)c7@!q1R#OYA-1ana8u8!9Rj; z6ZSrLK^=V&Okcy9*_Y=$j@&>NOZd$hVLL(g?j_(5cz$vXpZp5{FXU6;yY_x9z|Lj> z>uG&N*-!Yu=zVB);^k` z#BXesm<7;69)mlus35Oi+oxgQqrFz=gPg=6r)$jr1pOJf`u8HU@y$EChroHy!uA${ zN66>c&VX@W(9Q7!c?;Ng4ZV*137>hqqt=+RK9Z?_61%gjpsyn@g73tA1=ox!1$KlO9f;T`H-yA%EBiP#aV9(5NmFHesEA|`ci{K`(z5>|C zEV^}f;Eeq`ap-XreH^*Or(Dd3Z(kFeb@j1ZXBD=;3FH*`ZMBA3V84BE3HE_=`iCL1 zZ~jY;4R}wQ!25X#-U9EK`o%TQ(3LB3_%;lYPmja5!rt9~10>gdc?MhP=JpN^h;`pL zz&mM;`lj;h^T5B2ZGg>wbL_53VE1<3&aQ>NN}Tg_{w-`P$VcEIu@;vo$7OwM*9>l@Fi|&2!E>*BM;3}N5XOo!E;2Zb}4)Ty|4}OaN9DW2_ z|1Gcv?&aYd;;b&v`|x+*Ts^BZ_>?`m*i!UU^a9y^Cy^JCuWG`#jNG}l>+fT;-wN1{ z!@YTdY@RCq2-$j;;BAm$x92*x9H<);A+N&kVehzi(wb_(Ib6+*{yjr$%CH^kI}UXg z*qx7eb_RbRt^ngxID!lOS3h*~EfCkbj^xmt zJr3XXIdu0nhw+!_U%_W&&(b~pme}WQ;C*QjKM8N5zXT=uAEO)V8qetm`Wf;Ra(YA! z$nN7^_6(Kp;9Dhb32p#$DJS?p=GW_3J0Nx(y@hWS+(dp14~RR#=l;&i{X7eEr`W8; z{d_}zSQB9@u{DrSSZ__0KIGv(`K|bX{uC})<5?x>nd`v}`e$@=wSjX+BNO#P%c) z_r*QNK?{3<-TrF8`n^NmW#=+Y{0MQ{8}p&QWp!lF%X9F&N5NcJaaN3eOXtg!-ozo%y2t3E<%*MiF3`WjPA^* zK@ELK+$r2dKZlL;4tq|@=IdVP8b$a1_t8u2?yaqh?ESw7ia5;9J8**TSy{WWHRN$% zj~myr>sOGS^&hwn7Qj#&eVo9vIWlXk-T5|vbDTv_@ZE%c?*p)e>|V~^8Q5PFB zYus}ej38h2Lakfq)?mI0m;r0bG3$WmQ^DT@#?|IS9p3j8G>B;d&wT(AVt(e-U>)EY z@>k%D-B&0_`jCxJkzIQmyY)C1zkl}Z9h|`C**OQ#zrd$#OdEE#uJde+wTB*P<99Zm zNfWjnZ4GdM?hLH|A+h$pjQk#60nYsZc8<>3-vf9Y+Yva#@60B_6sW{ukH^=#?>u5( zXLgCLWbZnhp<9bTXZnP7-Xs01_`d`9oWSnd1$5c|3*dSCt6+PBZjJV{4!=ZqE)jB{ zIBlo!Ikr#W3-|`SZ@yd4$@5%7AA%R4ppF^XdNSa?zrjdOUSiE{OzSwzz%#H<>zo9K zAi;LkBk|7p3`B9r>zO(`=U@+~!2U{5u-3C`&4*dsz0P&S+MCGEWec|MeNZ9p0^Yrr zSKthrwM`*=1_}HZSkG)6>TovR5&N0OHh^pB?)?${7qT(l@j3Ku*n5%T_dY%W&g3cZ zKKdI&wx=$f!q)X2+51o<*T0$nz}ClRzs|RgK7np6zmVk?@J@JE&dWL2%Otvexz;sn z+L0%Mtqh_z2^TnAPBFR;A>p3yz{5Z;HU zfjKT^?vQ(H)0YwBeG$ccn4vwUpa9mFfse#$`wwmdbEuo|YW{KP`w={b?=v_Dt6(+` zXKCGg$oIir;Mz(a{x;ZGg6%!9{%yF9uM6a|PCWJ&c!w{-=Gj{F47$B~FRj(*rA7h!v>5m$xnBf{<-kDV|L$r^jU)IYJ^pIZ@ zYd(AQd}L?Q1Pl1=*Ei>!8_4$Bf@|~0pn-3IUSN-qQ*55u)epUi?73Z?Bl;}x3}k23 zhV5kmF3GW_o%lIylOQ8jSW^VtCxKV-xo;EPW6d_02F{~`&Hk+Q9NoO{;3r^!-8g6F zdh!-Ns3k-9zTC#P0X`!y0sTFECESO-yT7qFVSP>HGwc=EnKxi_ z@4%kX9JUL%z-B+==q2(P{2JXEEFvfNKTkj41-1jYMO;E(E9fPD`|-T>cVTNbrUO#^ zBiN0tppV1JeCTxun_t~L>KPmzhwoKC#s?wdTXOF2iQ768=Gs4SW&$Q}_Zn`vc$}9bz)r zJT+{SU^xzTPQW)o4@B(IB*yvMpKJY=JIf{5c^xA6k-hH)vNhOy0<7B})m_sB)#FgN z_uT#U`|UEu*{=Z4^bEV_wu#&Yo7kt}7Pbgq3rt}vfWH=OZtJgt2L1+m7ewf_Yu_RK z8hr+sZxM_j59Y7$4c~HS>^=Jc8X%&NTg0TuL)f~eW!7B6d)TLdwYESOhj%^-*N91g zf48028~mr}1?-vJ1@7Z{eE~~gI}UU897fR-@CcNwb6-YOI4xYy0-_;rNeQ+C`k=MDnr*qnk!(BdroAcp}?8!N$!1_El_rH>faSvyc zf|F}r!ZsO)9L}tY9ATS-&DAGvAGst?DzJGbLwE*zpEW~b8tBeZpR=68=bXl{c`sep z1qJdM?99x$4coV|=5HgnKqE%yj##UIk39E3a1H(oe*)I+UHg?^&mMN~A-0UTCVCIO zkM0b;Tjn(83Hm7Tw}ijMR-F&CayHBOO7InA)Mf1paro9`_&1TQ^=d6W_0ac$_iYb* zL`(f`7s`?@}w4|O-O zJD&!81}5-%=c~x>@dDjBCag1;wXDW4NRhw7m%#bHxMpP$ffj3C=i&Z(W-0g#K7zHF z81{IIe2#1{XXM;~2dwjMT4w{;+e5H`&38}{==vTaTSF6h3b~Zg&0)_I$gZ=Wj6R&# z8oGNqqYAuDOa~bA|8`;iAaQJ89G}9%!eR>x3yUo*EG)LLuyB_tEG#Uhut;ICg@uL1 z7AY(&h7iIMBrGCf5eY*GK|%;i2tk4lLkK}0AuJ)t@_2+Hgdjn}5+p1l;rIFMtna~Z z;mh~@yXT&B?!9B)3xPdu;9G$c;@zu4oHZx-y`u}jvx~5;AqV94n~@W54)56%_89pg za)Qq~%5WPtZW4QpoMAI=c-N3aY&)QVTqnjlexf&l_u?9;{{Y7B)`~Zx?PmUUP7NdvF`%)#5z7lhYu=*1_g~_jHg$ z5V5X>ObE8!o57r`2ECiZm&TbKRo9{_F6OS|vEnSF%UYDKT+)_;Z`fe^pz z?*ixf9XPKp`4?)%x6iZAf%oVTdmaA_avOXC3A!~VwW2@QTSp7szMaQ?CugSJKJ7)$L5zJ1`x2-S=UlVJV$W%8 z5&k1`Od)$GC*{$45VvTgYYD`P;K+*@wMz&cnHy+xhuMHi&nIE%Y)N&YAtK zQTuanK}-cbfMeLV;(V9UBVgSnu#gsa)ARSc>Abv0-sAm|@0@kopP{dVGf)BcG7hY3 z6+W+#6WO_JqUR^0Z!x-cThAY4;rlRV05aBefi-r}&E=agulw59er@zlkOyEF{{%Py z3ALMZcz@x@80_*QdL7x^^T>0^r`Y?zb(14s1>Jk$o}Q&}UJc+Gct4%dI63SuG!DIf zQp_qOkLTG#H{SWWUkTgJ2$$$h;J4r>&}Z+?+L&u#ju#*!kLQuI$HQ9D?-9I&?KgZ3 z8{2X}^a}De>^(|YvjWcnYb>$HB)%qWZ3$~K?A!RQ*IJA{LUx7$zD4vwwdi5E2Xch1 z0>6iI*!qHFzO}HkGq-0mTPtS1iCruMW2~h|OoNy<+=1;=_Ktav%@d+43+JD+#~ACa z(H=Y(_YH^(@IN5 zF>&_m4EosY$v*n<1lYvp`VBb7o)O=L#U-{Ce6DxDd+2TK5$FT!KEvkhU%}2~9R8Rx zZ@7crL0(4Q0-kX+(%s9mFvi(Ampbe@OcQ%XTm#u(1y&YQ*k^$CM8sKJ2fH!O%Dwdc zduGV%#N5O+@jD;q_zl?O2C!ylCw?Qp0nWD#7C@=S9R{BNQ#b>k(&C$AOt{Ft)G&^{ zg?$Vo z!7KC@alV0^e6DE|=PaFp_cbSO3%w6Jk8NxZz+L2+czZTi8Jq8841ET8Hyb7ID^IUCQxvv-yOwi#`38T%1P@YUfu zeslET4BIp@&UXr2f)4iE*xK+e9KrVg7W@VmwPOCCkz2@hcoi5whyE1VGj7AyVtwP- zb8Hdp3`7Oo{GIjQUxP}u_}h4muZ#W>Yy$hS&KQ`xLf!@lj;S3^VC|>)J)f973vdQ^ z@UJ0zmsdfIJ_J7FoZCKrH6?7;Veg(#AGrbF z#qPUWMlP{NIB)B{26gPtU>>;xGS&yg3`TJoHvJKCuaTF*H}DwUnJysz1~0%dXkfF( zkTrMG;(T**E+DtS1nA*&7S`b`PLZ9vdyiuqC}Z=S^t;BGDR>@OvpEycsgg%vb6#a| zfNVWiu>1Z3_Rt;qAK`P2b^JlTg?}5oM7D3&Um<639la0qH-R&_gj?92A)9HjogCG`wXA`J;W9uA7OV+ z=4c~dV|U;0=-!!_*cIf2dYZ^}l@H+TM z9sBQ;c;t}$)39^SK_9z0{Z?NhAAobaYtI%tUJawjqGff z@l7E+FVCot&3z-}1=##;FoC>UL)QnKYXkQF^zpxieQ)MXi!vXpk_yzjtefU1?T`LjeJj`XhK6`!(dq=Hz75N%&5brr= z=;*oSWx+fQuvyapd(-%bnv5jOP$?9-ry-h$`xyY>j#J?q%J$oA`uBji4^ zwT=-xj6v3yu($m$5@U`wHt%g2y#$=yENp#Am3IMGl))41J$M~%!v36n$Qtd&DrfLi zIyxKlN#cE9-nkgImocyd^x3EN?1LU~cK^V)fOq^IoDpMPKfna=?buHrc;;zZoMB5J zwn=pN^PMaL>-YQMx|{xb$T{`BH>SqifwS6#Jum0cC1yAW>@#UG+W^_zuC<59%HSM) z1-=z?D<{O1;3jbWEQn9Y3!M8*jeCJ?ZT8~~JK#2U-)zSEKsy{`TL$J?0{4*J{|Wd5 zDz2>-|DLx0F8GYy9`w8R5_|(=z?|P<^S6lcO**>>cFh$&-R zNA_&ZSFRQRP2v1D&_4oa>VCsMN3wgFCw8X%+%G>aYFHshWE{5l$mS{`KR^zUg)^{* z9{3x07q4KE;P*X!Kz8jj*m<0S^J;Nd9@fZ@?78-keLL510;Yg#w_#^)-QR%sHKa!G z(?0eo;CwFe*}HMpE$Se{=lzU90vg0@0sR4Nu3gr|#5s>(k#Ovb*j#^#Z5e$Ay@fmv zm(ktFeM4aG7PfJ4ep1B6a0%a2Y<>$Os*}&UFV^>pOk?oZAXE`_GZftXs!-2U{Oh(2dXVy~5r>pT=(Pb7XV&;XW||+yK_) zoJ#N^aoVlp2w3+fYn=5t`WU)-&Ewm$e&<;M7s&3DFa9_G3cB~vnw)oXQut@E*O8r- z_zF^R4Hkj5)>*Sz<2weX!8RCRGnaZBK2GcmSVq>?s1|j3&Zp=(@niTW!3uCD=I}f{d*|ie6R>+{`0B8> z1UbZBL7#_PthKHVdVt>(ov>>4p|-~o7zya#^) zuGO{(`rs4r9In9`$XNdYc7Bt!BK8GrU*28id%$>S)WDt)JByrPw^z@-fxLw5Ec4?c z?f}`mdfvwX#N7Z5v=N16j_h~OpP(k*0A2}wU^EyIyeT1)t+=5rpL*!*J1rD*r z>}kG^GPMQhGx%iZ=Q{gK&|O;@=^=WK?6-7SOSPDpLIAg7ysQIVs}2?x1V4Y z`vdqGehmD!nClYwZZq;fsr?u4OwAdS$2m61E&Awk9X3bE8u#~34uJ9zw)^;uwZ}{! zvNd&qdIoP2V_nWEqxT5AHQvIu0-gZZ&0;IT8|atF-q99(GoPH=wKeGlG;Phs=^`~Q%T6KrMnoIs9|to6gUxq8iEJNbFg$nl5favSv9F^0b3glQ zVslP8`fOU9g>&@GeFyHj4)22;Tda>*=bV6P?C016!!`~?IcB0hw@pYCO>XHgp2 z_0MBJJYny&_}+LH&fVA;+4%d!w2)iXqQf|H{@cjb>6z6} ziW(=dbJkyU~I-rwvc_x=5P=5X`jUA+&lwk z=UrGq509D8C@#eAoSl_Eb1QeM#X7lxEx;D(t8qrG8GirqJw*3jnXiOC^zrTWoO{@N s@F(~=9Kp`v39_-D;e>S=`4*AOz@D6M8+cA#*j#7G+py=m1aGJR1D`zyJOBUy literal 0 HcmV?d00001 diff --git a/rnnoise/model/vad_gru_B.bin b/rnnoise/model/vad_gru_B.bin new file mode 100644 index 0000000000000000000000000000000000000000..1368cce7c5554ef688b5739e3596dfdde6ab1afa GIT binary patch literal 576 zcmeH@Ar8V&5JX2HI7S5r-~f~$H~@kJAUH$?q5{zn6avKwI0O735fubQsv1-!iV)He z-UMnn0Y7<}-Tm_?+e(kV^n_`UY8X@B;RS2@49!71sY31dUGuJ{wm;oV1JqfbZD0%C z_|xCGH)+5}))}qnGg#o8fqK9^VwRv+W+Svji?5b=BI*@0@0!5D@5pS7gaW*Szo!lJAPrIHUhq5ne}4UeH;c+hLjV8( literal 0 HcmV?d00001 diff --git a/rnnoise/model/vad_gru_R.bin b/rnnoise/model/vad_gru_R.bin new file mode 100644 index 0000000000000000000000000000000000000000..35326a4234e8557e72db46ceb570db5effb8cf86 GIT binary patch literal 6912 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 2) + i]; + } + Module._free(pcmPtr, featuresPtr); + + return features; + } +} \ No newline at end of file diff --git a/rnnoise/rnnoise.js b/rnnoise/rnnoise.js new file mode 100644 index 00000000..6c49ea3a --- /dev/null +++ b/rnnoise/rnnoise.js @@ -0,0 +1,104 @@ +'use strict'; + +const nn = navigator.ml.getNeuralNetworkContext(); + +export class RNNoise { + constructor(url, batchSize) { + this.url_ = url; + this.batchSize_ = batchSize; + this.frames_ = 100; + this.model_ = null; + this.compilation_ = null; + } + + async fetchData(fileName) { + const response = await fetch(this.url_ + fileName); + return new Float32Array(await response.arrayBuffer()); + } + + async load() { + const inputDenseKernel0Data = await this.fetchData('input_dense_kernel_0.bin'); + const inputDenseBias0Data = await this.fetchData('input_dense_bias_0.bin'); + const vadGruWData = await this.fetchData('vad_gru_W.bin'); + const vadGruRData = await this.fetchData('vad_gru_R.bin'); + const vadGruBData = await this.fetchData('vad_gru_B.bin'); + const noiseGruWData = await this.fetchData('noise_gru_W.bin'); + const noiseGruRData = await this.fetchData('noise_gru_R.bin'); + const noiseGruBData = await this.fetchData('noise_gru_B.bin'); + const denoiseGruWData = await this.fetchData('denoise_gru_W.bin'); + const denoiseGruRData = await this.fetchData('denoise_gru_R.bin'); + const denoiseGruBData = await this.fetchData('denoise_gru_B.bin'); + const denoiseOutputKernel0Data = await this.fetchData('denoise_output_kernel_0.bin'); + const denoiseOutputBias0Data = await this.fetchData('denoise_output_bias_0.bin'); + + const builder = nn.createModelBuilder(); + + const input = builder.input('input', {type: 'float32', dimensions: [this.batchSize_, 100, 42]}); + const inputDenseKernel0 = builder.constant({type: 'float32', dimensions: [42, 24]}, inputDenseKernel0Data); + const inputDense0 = builder.matmul(input, inputDenseKernel0); + + const inputDenseBias = builder.constant({type: 'float32', dimensions: [24]}, inputDenseBias0Data); + const biasedTensorName2 = builder.add(inputDense0, inputDenseBias); + + const inputDenseTanh0 = builder.tanh(biasedTensorName2); + + const vadGruX = builder.transpose(inputDenseTanh0, {permutation: [1, 0, 2]}); + const vadGruW = builder.constant({type: 'float32', dimensions: [1, 72, 24]}, vadGruWData); + const vadGruR = builder.constant({type: 'float32', dimensions: [1, 72, 24]}, vadGruRData); + const vadGruB = builder.constant({type: 'float32', dimensions: [1, 72]}, vadGruBData.subarray(0, 72)); + const vadGruRB = builder.constant({type: 'float32', dimensions: [1, 72]}, vadGruBData.subarray(72, 144)); + const [, vadGruY] = builder.gru(vadGruX, vadGruW, vadGruR, this.frames_, 24, {bias: vadGruB, recurrentBias: vadGruRB, returnSequence: true, resetAfter: false, activations: ["sigmoid", "relu"]}); + + const vadGruYTransposed = builder.transpose(vadGruY, {permutation: [2, 0, 1, 3]}); + + const vadGruTranspose1 = builder.reshape(vadGruYTransposed, [-1, 100, 24]); + + const concatenate1 = builder.concat([inputDenseTanh0, vadGruTranspose1, input], 2); + + const noiseGruX = builder.transpose(concatenate1, {permutation: [1, 0, 2]}); + const noiseGruW = builder.constant({type: 'float32', dimensions: [1, 144, 90]}, noiseGruWData); + const noiseGruR = builder.constant({type: 'float32', dimensions: [1, 144, 48]}, noiseGruRData); + const noiseGruB = builder.constant({type: 'float32', dimensions: [1, 144]}, noiseGruBData.subarray(0, 144)); + const noiseGruRB = builder.constant({type: 'float32', dimensions: [1, 144]}, noiseGruBData.subarray(144, 288)); + const [, noiseGruY] = builder.gru(noiseGruX, noiseGruW, noiseGruR, this.frames_, 48, {bias: noiseGruB, recurrentBias: noiseGruRB, returnSequence: true, resetAfter: false, activations: ["sigmoid", "relu"]}); + const noiseGruYTransposed = builder.transpose(noiseGruY, {permutation: [2, 0, 1, 3]}); + + const noiseGruTranspose1 = builder.reshape(noiseGruYTransposed, [-1, 100, 48]); + + const concatenate2 = builder.concat([vadGruTranspose1, noiseGruTranspose1, input], 2); + + const denoiseGruX = builder.transpose(concatenate2, {permutation: [1, 0, 2]}); + const denoiseGruW = builder.constant({type: 'float32', dimensions: [1, 288, 114]}, denoiseGruWData); + const denoiseGruR = builder.constant({type: 'float32', dimensions: [1, 288, 96]}, denoiseGruRData); + const denoiseGruB = builder.constant({type: 'float32', dimensions: [1, 288]}, denoiseGruBData.subarray(0, 288)); + const denoiseGruRB = builder.constant({type: 'float32', dimensions: [1, 288]}, denoiseGruBData.subarray(288, 576)); + const [, denoiseGruY] = builder.gru(denoiseGruX, denoiseGruW, denoiseGruR, this.frames_, 96, {bias: denoiseGruB, recurrentBias: denoiseGruRB, returnSequence: true, resetAfter: false, activations: ["sigmoid", "relu"]}); + const denoiseGruYTransposed = builder.transpose(denoiseGruY, {permutation: [2, 0, 1, 3]}); + + const denoiseGruTranspose1 = builder.reshape(denoiseGruYTransposed, [-1, 100, 96]); + + const denoiseOutputKernel0 = builder.constant({type: 'float32', dimensions: [96, 22]}, denoiseOutputKernel0Data); + const denoiseOutput0 = builder.matmul(denoiseGruTranspose1, denoiseOutputKernel0); + + const denoiseOutputBias0 = builder.constant({type: 'float32', dimensions: [22]}, denoiseOutputBias0Data); + const biasedTensorName = builder.add(denoiseOutput0, denoiseOutputBias0) + + const denoiseOutput = builder.sigmoid(biasedTensorName); + + this.model_ = builder.createModel({'output': denoiseOutput}); + } + + async compile(options) { + this.compilation_ = await this.model_.compile(options); + } + + async compute(inputBuffer) { + const inputs = {input: {buffer: inputBuffer}}; + const outputs = await this.compilation_.compute(inputs); + return outputs.output; + } + + dispose() { + this.compilation_.dispose(); + } +} From 252b303eae98c69231a7d388780a3a63a91857d7 Mon Sep 17 00:00:00 2001 From: miaobin Date: Mon, 7 Dec 2020 15:58:05 +0800 Subject: [PATCH 2/8] Enable RNNoise example --- rnnoise/audio/airconditioner.wav | Bin 0 -> 320044 bytes rnnoise/dist/webnn-polyfill.js | 77362 +++++++++++++++++++++++++++++ rnnoise/eat_44100.wav | Bin 224106 -> 0 bytes rnnoise/feature/rnnoise.js | 2174 - rnnoise/feature/rnnoise.wasm | Bin 230653 -> 0 bytes rnnoise/index.html | 13 +- rnnoise/main.js | 79 +- rnnoise/processer.js | 33 +- rnnoise/signal/signal.js | 1 + rnnoise/signal/signal.wasm | Bin 0 -> 120344 bytes 10 files changed, 77464 insertions(+), 2198 deletions(-) create mode 100644 rnnoise/audio/airconditioner.wav create mode 100644 rnnoise/dist/webnn-polyfill.js delete mode 100644 rnnoise/eat_44100.wav delete mode 100644 rnnoise/feature/rnnoise.js delete mode 100755 rnnoise/feature/rnnoise.wasm create mode 100644 rnnoise/signal/signal.js create mode 100755 rnnoise/signal/signal.wasm diff --git a/rnnoise/audio/airconditioner.wav b/rnnoise/audio/airconditioner.wav new file mode 100644 index 0000000000000000000000000000000000000000..5a63ffbd697d91fa0c2d4f8c63a4be960f2cd79d GIT binary patch literal 320044 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⁣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 0 && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].isString(values[0])) { + const encodedValues = values.map(d => _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].encodeString(d)); + outId = this.write(encodedValues, shape, dtype); + } + else { + outId = this.write(values, shape, dtype); + } + return { dataId: outId, shape, dtype }; + } + /** Increase refCount of a `TensorData`. */ + incRef(dataId) { + const tensorData = this.data.get(dataId); + tensorData.refCount++; + } + /** Decrease refCount of a `TensorData`. */ + decRef(dataId) { + if (this.data.has(dataId)) { + const tensorData = this.data.get(dataId); + tensorData.refCount--; + } + } + move(dataId, values, shape, dtype) { + this.data.set(dataId, { values, dtype, refCount: 1 }); + } + numDataIds() { + return this.data.numDataIds(); + } + async read(dataId) { + return this.readSync(dataId); + } + readSync(dataId) { + const { dtype, complexTensorInfos } = this.data.get(dataId); + if (dtype === 'complex64') { + const realValues = this.readSync(complexTensorInfos.real.dataId); + const imagValues = this.readSync(complexTensorInfos.imag.dataId); + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].mergeRealAndImagArrays(realValues, imagValues); + } + return this.data.get(dataId).values; + } + bufferSync(t) { + const data = this.readSync(t.dataId); + let decodedData = data; + if (t.dtype === 'string') { + try { + // Decode the bytes into string. + decodedData = data.map(d => _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].decodeString(d)); + } + catch (_a) { + throw new Error('Failed to decode encoded string bytes into utf-8'); + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](t.shape, t.dtype, decodedData); + } + makeOutput(values, shape, dtype) { + const dataId = this.write(values, shape, dtype); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["engine"])().makeTensorFromDataId(dataId, shape, dtype, this); + } + disposeData(dataId) { + if (this.data.has(dataId)) { + const { complexTensorInfos } = this.data.get(dataId); + if (complexTensorInfos != null) { + this.disposeData(complexTensorInfos.real.dataId); + this.disposeData(complexTensorInfos.imag.dataId); + } + this.data.delete(dataId); + } + } + disposeIntermediateTensorInfo(tensorInfo) { + const dataId = tensorInfo.dataId; + if (this.data.has(dataId)) { + const tensorData = this.data.get(dataId); + tensorData.refCount--; + if (tensorData.refCount < 1) { + this.disposeData(dataId); + } + } + } + async time(f) { + const start = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].now(); + f(); + const kernelMs = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].now() - start; + return { kernelMs }; + } + memory() { + return { + // Unreliable due to automatic gc. The numbers above are cumulative. + unreliable: true, + reasons: ['The reported memory is an upper bound. Due to automatic garbage ' + + 'collection, the true allocated memory may be less.'] + }; + } + stridedSlice(x, begin, end, strides) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'stridedSlice'); + const outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["slice_util"].computeOutShape(begin, end, strides); + if (outShape.some(axis => axis === 0)) { + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor"]([], outShape); + } + const buffer = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](outShape, x.dtype); + const xBuf = this.bufferSync(x); + for (let i = 0; i < buffer.size; i++) { + const loc = buffer.indexToLoc(i); + const newLoc = new Array(loc.length); + for (let j = 0; j < newLoc.length; j++) { + newLoc[j] = loc[j] * strides[j] + begin[j]; + } + buffer.set(xBuf.get(...newLoc), ...loc); + } + return buffer.toTensor(); + } + diag(x) { + const xVals = this.readSync(x.dataId); + const buffer = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"]([x.size, x.size], x.dtype); + const vals = buffer.values; + for (let i = 0; i < xVals.length; i++) { + vals[i * x.size + i] = xVals[i]; + } + return buffer.toTensor(); + } + unstack(x, axis) { + const num = x.shape[axis]; + const outShape = new Array(x.rank - 1); + let outIndex = 0; + for (let i = 0; i < x.rank; i++) { + if (i !== axis) { + outShape[outIndex++] = x.shape[i]; + } + } + const begin = new Array(x.rank).fill(0); + const size = x.shape.slice(); + size[axis] = 1; + const res = new Array(num); + for (let i = 0; i < res.length; i++) { + begin[axis] = i; + res[i] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["slice"](x, begin, size).reshape(outShape); + } + return res; + } + reverse(x, axis) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'reverse'); + const buffer = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](x.shape, x.dtype); + const xBuf = this.bufferSync(x); + for (let i = 0; i < buffer.size; i++) { + const outLoc = buffer.indexToLoc(i); + const inLoc = outLoc.slice(); + axis.forEach(ax => inLoc[ax] = x.shape[ax] - 1 - inLoc[ax]); + buffer.set(xBuf.get(...inLoc), ...outLoc); + } + return buffer.toTensor(); + } + neg(x) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'neg'); + // TODO(lina128): Use mul directly once neg is modularized. + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["mul"](_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["scalar"](-1), x); + } + addN(tensors) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(tensors, 'addN'); + const vals = tensors.map(t => this.readSync(t.dataId)); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](tensors[0].shape, tensors[0].dtype); + const resultVals = result.values; + for (let i = 0; i < tensors.length; i++) { + const currVals = vals[i]; + for (let j = 0; j < resultVals.length; j++) { + resultVals[j] += currVals[j]; + } + } + return result.toTensor(); + } + softmax(logits, dim) { + const axes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam([dim], logits.shape); + // TODO(annxingyuan): Call maxImpl rather than op as part of softmax kernel + // modularization. + const maxLogit = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["max"])(logits, axes); + const expandedShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].expandShapeToKeepDim(maxLogit.shape, axes); + // TODO(lina128): Use sub directly once softmax is modularized. + const a = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["sub"](logits, maxLogit.reshape(expandedShape)); + const b = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["exp"](a); + const sumExp = this.sum(b, axes).reshape(expandedShape); + // TODO(annxingyuan): Call divImpl rather than op as part of softmax + // kernel modularization. + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["div"](b, sumExp); + } + pow(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'pow'); + return this.broadcastedBinaryOp(a, b, a.dtype, (aValue, bValue) => Math.pow(aValue, bValue)); + } + floorDiv(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'floorDiv'); + const op = (a, b) => Math.floor(a / b); + const outputDtype = 'int32'; + return this.broadcastedBinaryOp(a, b, outputDtype, op); + } + sum(x, axes) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'sum'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('sum', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const resultDtype = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["upcastType"])(x.dtype, 'int32'); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, resultDtype); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let sum = 0; + for (let j = 0; j < reduceSize; ++j) { + sum += aVals[offset + j]; + } + vals[i] = sum; + } + return result; + } + prod(x, axes) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'sum'); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const resultDtype = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["upcastType"])(x.dtype, 'int32'); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, resultDtype); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let prod = 1; + for (let j = 0; j < reduceSize; ++j) { + prod *= aVals[offset + j]; + } + vals[i] = prod; + } + return result; + } + unsortedSegmentSum(x, segmentIds, numSegments) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'unsortedSegmentSum'); + const res = []; + // Reshape the segment id's so that they can be broadcast with + // x. The new shape should be [segmentIds.shape, 1, ..., 1] + const numIters = x.rank - segmentIds.rank; + for (let i = 0; i < numIters; ++i) { + segmentIds = segmentIds.expandDims(i + 1); + } + for (let i = 0; i < numSegments; ++i) { + const segmentId = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["scalar"](i, 'int32'); + const mask = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["equal"](segmentId, segmentIds).asType('float32'); + const sum = mask.mul(x).sum(0); + res.push(sum); + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["stack"](res); + } + argMin(x, axis) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'argMin'); + const axes = [axis]; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('argMin', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, 'int32'); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let min = aVals[offset]; + let minIndex = 0; + for (let j = 0; j < reduceSize; ++j) { + const value = aVals[offset + j]; + if (value < min) { + min = value; + minIndex = j; + } + } + vals[i] = minIndex; + } + return result; + } + argMax(x, axis) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'argMax'); + const axes = [axis]; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('argMax', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, 'int32'); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let max = aVals[offset]; + let maxIndex = 0; + for (let j = 0; j < reduceSize; ++j) { + const value = aVals[offset + j]; + if (value > max) { + max = value; + maxIndex = j; + } + } + vals[i] = maxIndex; + } + return result; + } + cumsum(x, axis, exclusive, reverse) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'cumsum'); + if (axis !== x.rank - 1) { + throw new Error(`backend.cumsum in CPU expects an inner-most axis=${x.rank - 1} ` + + `but got axis=${axis}`); + } + const resultDtype = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["upcastType"])(x.dtype, 'int32'); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](x.shape, resultDtype); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + const finalDim = x.shape[x.rank - 1]; + const indexAdjuster = reverse ? + (i, j) => i + finalDim - j - 1 : + (i, j) => i + j; + for (let i = 0; i < aVals.length; i += finalDim) { + for (let j = 0; j < finalDim; j++) { + const idx = indexAdjuster(i, j); + if (j === 0) { + vals[idx] = exclusive ? 0 : aVals[idx]; + } + else { + const prevIdx = indexAdjuster(i, j - 1); + vals[idx] = exclusive ? aVals[prevIdx] + vals[prevIdx] : + aVals[idx] + vals[prevIdx]; + } + } + } + return result; + } + equal(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'equal'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return (aVal === bVal) ? 1 : 0; + }); + } + notEqual(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'notEqual'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return (aVal !== bVal) ? 1 : 0; + }); + } + less(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'less'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return (aVal < bVal) ? 1 : 0; + }); + } + lessEqual(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'lessEqual'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return (aVal <= bVal) ? 1 : 0; + }); + } + greater(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'greater'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return (aVal > bVal) ? 1 : 0; + }); + } + greaterEqual(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'greaterEqual'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return (aVal >= bVal) ? 1 : 0; + }); + } + logicalAnd(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'logicalAnd'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return aVal && bVal; + }); + } + logicalOr(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'logicalOr'); + return this.broadcastedBinaryOp(a, b, 'bool', (aVal, bVal) => { + return aVal || bVal; + }); + } + select(condition, a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([condition, a, b], 'select'); + const values = this.readSync(condition.dataId); + const aValues = this.readSync(a.dataId); + const bValues = this.readSync(b.dataId); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](a.shape, Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["upcastType"])(a.dtype, b.dtype)); + const newValues = this.readSync(result.dataId); + let index = 0; + const offset = condition.rank === 0 || condition.rank > 1 || a.rank === 1 ? + 1 : + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(a.shape.slice(1)); + for (let i = 0; i < values.length; i++) { + for (let j = 0; j < offset; j++) { + if (values[i] === 1) { + newValues[index++] = aValues[i]; + } + else { + newValues[index++] = bValues[i]; + } + } + } + return result; + } + where(condition) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([condition], 'where'); + const condVals = this.readSync(condition.dataId); + return whereImpl(condition.shape, condVals); + } + topk(x, k, sorted) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'topk'); + const xVals = this.readSync(x.dataId); + return topkImpl(xVals, x.shape, x.dtype, k, sorted); + } + min(x, axes) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'min'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('min', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, x.dtype); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let min = aVals[offset]; + for (let j = 0; j < reduceSize; ++j) { + const value = aVals[offset + j]; + if (value < min) { + min = value; + } + } + vals[i] = min; + } + return result; + } + minimum(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'minimum'); + return this.broadcastedBinaryOp(a, b, a.dtype, (aVal, bVal) => Math.min(aVal, bVal)); + } + mod(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'mod'); + return this.broadcastedBinaryOp(a, b, a.dtype, (aVal, bVal) => { + const rem = aVal % bVal; + if ((aVal < 0 && bVal < 0) || (aVal >= 0 && bVal >= 0)) { + return rem; + } + else { + return (rem + bVal) % bVal; + } + }); + } + maximum(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'maximum'); + return this.broadcastedBinaryOp(a, b, a.dtype, (aVal, bVal) => Math.max(aVal, bVal)); + } + all(x, axes) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'all'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('all', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, x.dtype); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let all = aVals[offset]; + for (let j = 0; j < reduceSize; ++j) { + const value = aVals[offset + j]; + all = all && value; + } + vals[i] = all; + } + return result; + } + any(x, axes) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'any'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('any', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](outShape, x.dtype); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const vals = this.readSync(result.dataId); + const aVals = this.readSync(x.dataId); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let anyVal = aVals[offset]; + for (let j = 0; j < reduceSize; ++j) { + const value = aVals[offset + j]; + anyVal = anyVal || value; + } + vals[i] = anyVal; + } + return result; + } + squaredDifference(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'squaredDifference'); + return this.broadcastedBinaryOp(a, b, a.dtype, (aVal, bVal) => { + const diff = aVal - bVal; + return diff * diff; + }); + } + eluDer(dy, y) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([dy, y], 'eluDer'); + const resultValues = new Float32Array(y.size); + const values = this.readSync(y.dataId); + const dyValues = this.readSync(dy.dataId); + for (let i = 0; i < values.length; ++i) { + const v = values[i]; + if (v >= 1) { + resultValues[i] = dyValues[i]; + } + else { + resultValues[i] = dyValues[i] * (v + 1); + } + } + return this.makeOutput(resultValues, y.shape, 'float32'); + } + atan2(a, b) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([a, b], 'atan2'); + return this.broadcastedBinaryOp(a, b, a.dtype, (aValue, bValue) => Math.atan2(aValue, bValue)); + } + tile(x, reps) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'tile'); + return tile(this.bufferSync(x), reps); + } + gather(x, indices, axis) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([x, indices], 'gather'); + const newShape = x.shape.slice(); + const indicesValues = this.readSync(indices.dataId); + newShape[axis] = indicesValues.length; + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](newShape, x.dtype); + const xBuf = this.bufferSync(x); + for (let i = 0; i < result.size; ++i) { + const newLoc = result.indexToLoc(i); + const originalLoc = newLoc.slice(); + originalLoc[axis] = indicesValues[newLoc[axis]]; + const originalIndex = xBuf.locToIndex(originalLoc); + result.values[i] = xBuf.values[originalIndex]; + } + return result.toTensor(); + } + batchToSpaceND(x, blockShape, crops) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([x], 'batchToSpaceND'); + const prod = blockShape.reduce((a, b) => a * b); + const reshaped = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getReshaped(x.shape, blockShape, prod); + const permuted = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getPermuted(reshaped.length, blockShape.length); + const reshapedPermuted = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getReshapedPermuted(x.shape, blockShape, prod); + const sliceBeginCoords = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getSliceBeginCoords(crops, blockShape.length); + const sliceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getSliceSize(reshapedPermuted, crops, blockShape.length); + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["transpose"](x.reshape(reshaped), permuted) + .reshape(reshapedPermuted) + .slice(sliceBeginCoords, sliceSize); + } + pool3d(x, convInfo, poolType) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'pool3d'); + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = convInfo.padInfo.front; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const initialValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY : + Number.POSITIVE_INFINITY); + const xValues = this.readSync(x.dataId); + const output = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](convInfo.outShape, x.dtype); + const outputVals = output.values; + const outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] * + convInfo.outShape[3] * convInfo.outShape[4]; + const outputDepthStrides = convInfo.outShape[2] * convInfo.outShape[3] * convInfo.outShape[4]; + const outputRowStrides = convInfo.outShape[3] * convInfo.outShape[4]; + const outputColStrides = convInfo.outShape[4]; + for (let batch = 0; batch < convInfo.batchSize; ++batch) { + const outputBatchOffset = batch * outputBatchStrides; + const inputBatchOffset = batch * x.strides[0]; + for (let channel = 0; channel < convInfo.inChannels; ++channel) { + for (let yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) { + const xDepthCorner = yDepth * strideDepth - padFront; + let xDepthMin = xDepthCorner; + while (xDepthMin < 0) { + xDepthMin += dilationDepth; + } + const xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner); + const outputDepthOffset = outputBatchOffset + yDepth * outputDepthStrides; + for (let yRow = 0; yRow < convInfo.outHeight; ++yRow) { + const xRowCorner = yRow * strideHeight - padTop; + let xRowMin = xRowCorner; + while (xRowMin < 0) { + xRowMin += dilationHeight; + } + const xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner); + const outputRowOffset = outputDepthOffset + yRow * outputRowStrides; + for (let yCol = 0; yCol < convInfo.outWidth; ++yCol) { + const xColCorner = yCol * strideWidth - padLeft; + let xColMin = xColCorner; + while (xColMin < 0) { + xColMin += dilationWidth; + } + const xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner); + // Shader code begins + const outputColOffset = outputRowOffset + yCol * outputColStrides; + let minMaxValue = initialValue; + let avgValue = 0; + let count = 0; + for (let xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) { + const xDepthOffset = inputBatchOffset + xDepth * x.strides[1]; + for (let xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) { + const xRowOffset = xDepthOffset + xRow * x.strides[2]; + for (let xCol = xColMin; xCol < xColMax; xCol += dilationWidth) { + const xColOffset = xRowOffset + xCol * x.strides[3]; + const pixel = xValues[xColOffset + channel]; + if ((poolType === 'max' && pixel > minMaxValue)) { + minMaxValue = pixel; + } + else if (poolType === 'avg') { + avgValue += pixel; + count++; + } + if (isNaN(minMaxValue)) { + break; + } + } + if (isNaN(minMaxValue)) { + break; + } + } + if (isNaN(minMaxValue)) { + break; + } + } + const outputOffset = outputColOffset + channel; + outputVals[outputOffset] = + poolType === 'avg' ? avgValue / count : minMaxValue; + } + } + } + } + } + return output.toTensor(); + } + avgPool3d(x, convInfo) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'avgPool3d'); + return this.pool3d(x, convInfo, 'avg').toFloat(); + } + avgPool3dBackprop(dy, x, convInfo) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([dy, x], 'avgPool3dBackprop'); + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const filterDepth = convInfo.filterDepth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const dx = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](x.shape, 'float32'); + const avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth); + const dyBuf = this.bufferSync(dy); + for (let batch = 0; batch < convInfo.batchSize; ++batch) { + for (let channel = 0; channel < convInfo.inChannels; ++channel) { + for (let dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) { + for (let dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) { + for (let dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) { + // Shader code begins. + const dyDepthCorner = dxDepth - padFront; + const dyRowCorner = dxRow - padTop; + const dyColCorner = dxCol - padLeft; + let dotProd = 0; + for (let wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) { + const dyDepth = (dyDepthCorner + wDepth) / strideDepth; + if (dyDepth < 0 || dyDepth >= convInfo.outDepth || + Math.floor(dyDepth) !== dyDepth) { + continue; + } + for (let wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) { + const dyRow = (dyRowCorner + wRow) / strideHeight; + if (dyRow < 0 || dyRow >= convInfo.outHeight || + Math.floor(dyRow) !== dyRow) { + continue; + } + for (let wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) { + const dyCol = (dyColCorner + wCol) / strideWidth; + if (dyCol < 0 || dyCol >= convInfo.outWidth || + Math.floor(dyCol) !== dyCol) { + continue; + } + const pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel); + dotProd += pixel; + } + } + } + dx.set(dotProd * avgMultiplier, batch, dxDepth, dxRow, dxCol, channel); + } + } + } + } + } + return dx.toTensor(); + } + maxPool3d(x, convInfo) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'maxPool3d'); + return this.pool3d(x, convInfo, 'max').toFloat(); + } + maxPool3dPositions(x, convInfo) { + const maxPositions = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](convInfo.outShape, 'int32'); + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = convInfo.padInfo.front; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const xBuf = this.bufferSync(x); + for (let batch = 0; batch < convInfo.batchSize; ++batch) { + for (let channel = 0; channel < convInfo.inChannels; ++channel) { + for (let yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) { + const xDepthCorner = yDepth * strideDepth - padFront; + let xDepthMin = xDepthCorner; + while (xDepthMin < 0) { + xDepthMin += dilationDepth; + } + const xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner); + for (let yRow = 0; yRow < convInfo.outHeight; ++yRow) { + const xRowCorner = yRow * strideHeight - padTop; + let xRowMin = xRowCorner; + while (xRowMin < 0) { + xRowMin += dilationHeight; + } + const xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner); + for (let yCol = 0; yCol < convInfo.outWidth; ++yCol) { + const xColCorner = yCol * strideWidth - padLeft; + let xColMin = xColCorner; + while (xColMin < 0) { + xColMin += dilationWidth; + } + const xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner); + // Shader code begins + let maxValue = Number.NEGATIVE_INFINITY; + let maxPosition = -1; + for (let xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) { + const wDepth = xDepth - xDepthCorner; + for (let xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) { + const wRow = xRow - xRowCorner; + for (let xCol = xColMin; xCol < xColMax; xCol += dilationWidth) { + const wCol = xCol - xColCorner; + const pixel = xBuf.get(batch, xDepth, xRow, xCol, channel); + if (pixel >= maxValue) { + maxValue = pixel; + maxPosition = wDepth * effectiveFilterHeight * + effectiveFilterWidth + + wRow * effectiveFilterHeight + wCol; + } + } + } + } + maxPositions.set(maxPosition, batch, yDepth, yRow, yCol, channel); + } + } + } + } + } + return maxPositions.toTensor(); + } + maxPool3dBackprop(dy, x, y, convInfo) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([x, y], 'maxPool3dBackprop'); + const maxPositions = this.maxPool3dPositions(x, convInfo); + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const dx = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](x.shape, 'float32'); + const maxPosBuf = this.bufferSync(maxPositions); + const dyBuf = this.bufferSync(dy); + for (let batch = 0; batch < convInfo.batchSize; ++batch) { + for (let channel = 0; channel < convInfo.inChannels; ++channel) { + for (let dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) { + for (let dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) { + for (let dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) { + // Shader code begins + const dyDepthCorner = dxDepth - padFront; + const dyRowCorner = dxRow - padTop; + const dyColCorner = dxCol - padLeft; + let dotProd = 0; + for (let wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) { + const dyDepth = (dyDepthCorner + wDepth) / strideDepth; + if (dyDepth < 0 || dyDepth >= convInfo.outDepth || + Math.floor(dyDepth) !== dyDepth) { + continue; + } + for (let wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) { + const dyRow = (dyRowCorner + wRow) / strideHeight; + if (dyRow < 0 || dyRow >= convInfo.outHeight || + Math.floor(dyRow) !== dyRow) { + continue; + } + for (let wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) { + const dyCol = (dyColCorner + wCol) / strideWidth; + if (dyCol < 0 || dyCol >= convInfo.outWidth || + Math.floor(dyCol) !== dyCol) { + continue; + } + const maxPos = effectiveFilterDepth * + effectiveFilterHeight * effectiveFilterWidth - + 1 - + maxPosBuf.get(batch, dyDepth, dyRow, dyCol, channel); + const curPos = wDepth * effectiveFilterHeight * effectiveFilterWidth + + wRow * effectiveFilterWidth + wCol; + const mask = maxPos === curPos ? 1 : 0; + if (mask === 0) { + continue; + } + const pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel); + dotProd += pixel * mask; + } + } + } + dx.set(dotProd, batch, dxDepth, dxRow, dxCol, channel); + } + } + } + } + } + return dx.toTensor(); + } + resizeBilinear(x, newHeight, newWidth, alignCorners) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'resizeBilinear'); + const [batch, oldHeight, oldWidth, numChannels] = x.shape; + const xValues = this.readSync(x.dataId); + const result = new Float32Array(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape([batch, newHeight, newWidth, numChannels])); + const effectiveInputSize = [ + (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, + (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth + ]; + const effectiveOutputSize = [ + (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, + (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth + ]; + let outputIdx = 0; + const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0]; + const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1]; + for (let b = 0; b < batch; b++) { + for (let r = 0; r < newHeight; r++) { + const sourceFracRow = effectiveRowSizeRatio * r; + const sourceRowFloor = Math.floor(sourceFracRow); + const rowFrac = sourceFracRow - sourceRowFloor; + const sourceRowCeil = Math.min(oldHeight - 1, Math.ceil(sourceFracRow)); + const topRowOffset = b * x.strides[0] + sourceRowFloor * x.strides[1]; + const botRowOffset = b * x.strides[0] + sourceRowCeil * x.strides[1]; + for (let c = 0; c < newWidth; c++) { + const sourceFracCol = effectiveColSizeRatio * c; + const sourceColFloor = Math.floor(sourceFracCol); + const colFrac = sourceFracCol - sourceColFloor; + const sourceColCeil = Math.min(oldWidth - 1, Math.ceil(sourceFracCol)); + const topLeftOffest = topRowOffset + sourceColFloor * x.strides[2]; + const botLeftOffset = botRowOffset + sourceColFloor * x.strides[2]; + const topRightOffset = topRowOffset + sourceColCeil * x.strides[2]; + const botRightOffest = botRowOffset + sourceColCeil * x.strides[2]; + for (let d = 0; d < numChannels; d++) { + // Begin shader. + // Compute the fractional index of the source. + const topLeft = xValues[topLeftOffest + d]; + const bottomLeft = xValues[botLeftOffset + d]; + const topRight = xValues[topRightOffset + d]; + const bottomRight = xValues[botRightOffest + d]; + const top = topLeft + (topRight - topLeft) * colFrac; + const bottom = bottomLeft + (bottomRight - bottomLeft) * colFrac; + const newValue = top + (bottom - top) * rowFrac; + result[outputIdx++] = newValue; + } + } + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor"](result, [batch, newHeight, newWidth, numChannels]); + } + resizeBilinearBackprop(dy, x, alignCorners) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([dy, x], 'resizeBilinearBackprop'); + const [batch, xHeight, xWidth, depth] = x.shape; + const [, yHeight, yWidth] = dy.shape; + const output = new Float32Array(batch * xHeight * xWidth * depth); + // In the backwards pass, we want to find the pixels that were generated + // for each pixel in the input image the forward pass and add the + // corresponding coefficient from dy to the gradient (with some + // interpolation). + const effectiveXSize = [ + (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight, + (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth + ]; + const effectiveYSize = [ + (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight, + (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth + ]; + const heightScale = effectiveXSize[0] / effectiveYSize[0]; + const widthScale = effectiveXSize[1] / effectiveYSize[1]; + // Reference implementation + // tslint:disable-next-line:max-line-length + // https://github.com/tensorflow/tensorflow/blob/3039375c86a5bbc9610c7725dcaa95d635f87ba2/tensorflow/core/kernels/resize_bilinear_op.cc#L275 + const dyValues = this.readSync(dy.dataId); + let offset = 0; + for (let b = 0; b < batch; b++) { + const bOffset = b * x.strides[0]; + for (let r = 0; r < yHeight; r++) { + const dxR = r * heightScale; + const topDxRIndex = Math.floor(dxR); + const bottomDxRIndex = Math.min(Math.ceil(dxR), xHeight - 1); + const topDxROffset = bOffset + topDxRIndex * x.strides[1]; + const bottomDxROffset = bOffset + bottomDxRIndex * x.strides[1]; + const dxRLerp = dxR - topDxRIndex; + const inverseDxRLerp = 1.0 - dxRLerp; + for (let c = 0; c < yWidth; c++) { + const dxC = c * widthScale; + const leftDxCIndex = Math.floor(dxC); + const rightDxCIndex = Math.min(Math.ceil(dxC), xWidth - 1); + const dxCLerp = dxC - leftDxCIndex; + const inverseDxCLerp = 1.0 - dxCLerp; + const topLeftRCOffset = topDxROffset + leftDxCIndex * x.strides[2]; + const topRightRCOffset = topDxROffset + rightDxCIndex * x.strides[2]; + const bottomLeftRCOffset = bottomDxROffset + leftDxCIndex * x.strides[2]; + const bottomRightRCOffset = bottomDxROffset + rightDxCIndex * x.strides[2]; + const inverseDxRLerpTimesInverseDxCLerp = inverseDxRLerp * inverseDxCLerp; + const inverseDxRLerpTimesDxCLerp = inverseDxRLerp * dxCLerp; + const dxRLerpTimesInverseDxCLerp = dxRLerp * inverseDxCLerp; + const dxRLerpTimesDxCLerp = dxRLerp * dxCLerp; + for (let d = 0; d < depth; d++) { + const dyVal = dyValues[offset++]; + output[topLeftRCOffset + d] += + dyVal * inverseDxRLerpTimesInverseDxCLerp; + output[topRightRCOffset + d] += dyVal * inverseDxRLerpTimesDxCLerp; + output[bottomLeftRCOffset + d] += + dyVal * dxRLerpTimesInverseDxCLerp; + output[bottomRightRCOffset + d] += dyVal * dxRLerpTimesDxCLerp; + } + } + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor4d"](output, [batch, xWidth, xHeight, depth], x.dtype); + } + resizeNearestNeighbor(x, newHeight, newWidth, alignCorners) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'resizeNearestNeighbor'); + const [batch, oldHeight, oldWidth, numChannels] = x.shape; + const xValues = this.readSync(x.dataId); + const output = new Float32Array(batch * newHeight * newWidth * numChannels); + const effectiveInputSize = [ + (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, + (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth + ]; + const effectiveOutputSize = [ + (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, + (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth + ]; + const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0]; + const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1]; + let outputOffset = 0; + for (let b = 0; b < batch; b++) { + const batchOffset = b * x.strides[0]; + for (let r = 0; r < newHeight; r++) { + const sourceFracRow = effectiveRowSizeRatio * r; + const sourceNearestRow = Math.min(oldHeight - 1, alignCorners ? Math.round(sourceFracRow) : + Math.floor(sourceFracRow)); + const rowOffset = batchOffset + sourceNearestRow * x.strides[1]; + for (let c = 0; c < newWidth; c++) { + const sourceFracCol = effectiveColSizeRatio * c; + const sourceNearestCol = Math.min(oldWidth - 1, alignCorners ? Math.round(sourceFracCol) : + Math.floor(sourceFracCol)); + const colOffset = rowOffset + sourceNearestCol * x.strides[2]; + for (let d = 0; d < numChannels; d++) { + // Begin shader. + // Compute the fractional index of the source. + const newVal = xValues[colOffset + d]; + output[outputOffset++] = newVal; + } + } + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor"](output, [batch, newHeight, newWidth, numChannels], x.dtype); + } + resizeNearestNeighborBackprop(dy, x, alignCorners) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([dy, x], 'resizeNearestNeighborBackprop'); + const [batch, xHeight, xWidth, depth] = x.shape; + const [, yHeight, yWidth] = dy.shape; + const output = new Float32Array(batch * xHeight * xWidth * depth); + const dyValues = this.readSync(dy.dataId); + // In the backwards pass, we want to find the pixels that were generated + // for each pixel in the input image the forward pass + const effectiveXSize = [ + (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight, + (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth + ]; + const effectiveYSize = [ + (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight, + (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth + ]; + const heightScale = effectiveXSize[0] / effectiveYSize[0]; + const widthScale = effectiveXSize[1] / effectiveYSize[1]; + const invHeightScale = 1 / heightScale; + const invWidthScale = 1 / widthScale; + // This defines the size of the window of values around a particular + // index in dy that we want to search for contributions to dx. + const winHeight = (Math.ceil(invHeightScale) * 2) + 2; + const winWidth = (Math.ceil(invWidthScale) * 2) + 2; + // Loop over the output space. + for (let b = 0; b < batch; b++) { + const batchOffset = b * x.strides[0]; + for (let r = 0; r < xHeight; r++) { + const rowOffset = batchOffset + r * x.strides[1]; + // Compute bounds for where in dy we will look + const startRLerp = Math.floor(r * invHeightScale); + const startDyR = Math.floor(startRLerp - (winHeight / 2)); + for (let c = 0; c < xWidth; c++) { + const colOffset = rowOffset + c * x.strides[2]; + // Compute bounds for where in dy we will look + const startCLerp = Math.floor(c * invWidthScale); + const startDyC = Math.floor(startCLerp - (winWidth / 2)); + for (let d = 0; d < depth; d++) { + let accum = 0; + // loop over dy + for (let dyRIndex = 0; dyRIndex < winHeight; dyRIndex++) { + const dyR = dyRIndex + startDyR; + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= yHeight) { + continue; + } + const dyROffset = batchOffset + dyR * dy.strides[1]; + const sourceFracRow = dyR * heightScale; + const sourceNearestRow = Math.min(xHeight - 1, alignCorners ? Math.round(sourceFracRow) : + Math.floor(sourceFracRow)); + if (r !== sourceNearestRow) { + continue; + } + for (let dyCIndex = 0; dyCIndex < winWidth; dyCIndex++) { + const dyC = dyCIndex + startDyC; + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= yWidth) { + continue; + } + const dyCOffset = dyROffset + dyC * dy.strides[2]; + const sourceFracCol = dyC * widthScale; + const sourceNearestCol = Math.min(xWidth - 1, alignCorners ? Math.round(sourceFracCol) : + Math.floor(sourceFracCol)); + if (c === sourceNearestCol) { + accum += dyValues[dyCOffset + d]; + } + } + } + output[colOffset + d] = accum; + } + } + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor4d"](output, x.shape, x.dtype); + } + localResponseNormalization4D(x, depthRadius, bias, alpha, beta) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'localResponseNormalization4D'); + const channels = x.shape[3]; + const maxD = channels - 1; + const xValues = this.readSync(x.dataId); + const size = x.size; + const result = new Float32Array(size); + function sumAcrossChannels(offset) { + const currentChannel = offset % channels; + let beginSumOffset = offset - currentChannel + Math.max(0, currentChannel - depthRadius); + const endSumOffset = offset - currentChannel + + Math.min(currentChannel + depthRadius, maxD); + let sum = 0.0; + for (; beginSumOffset <= endSumOffset; beginSumOffset++) { + const z = xValues[beginSumOffset]; + sum += z * z; + } + return sum; + } + for (let offset = 0; offset < size; offset++) { + const sum = sumAcrossChannels(offset); + const val = xValues[offset] * Math.pow(bias + alpha * sum, -beta); + result[offset] = val; + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor4d"](result, x.shape); + } + LRNGrad(dy, inputImage, outputImage, depthRadius, bias, alpha, beta) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(dy, 'LRNGrad'); + const channels = dy.shape[3]; + const dyValues = this.readSync(dy.dataId); + const inputImageValues = this.readSync(inputImage.dataId); + const outputImageValues = this.readSync(outputImage.dataId); + const result = new Float32Array(dy.size); + const size = dy.size; + for (let offset = 0; offset < size; offset++) { + const currentChannel = offset % channels; + const depthBegin = (offset - currentChannel) + Math.max(0, currentChannel - depthRadius); + const depthEnd = (offset - currentChannel) + + Math.min(channels, currentChannel + depthRadius + 1); + let norm = 0; + for (let k = depthBegin; k < depthEnd; k++) { + norm += Math.pow(inputImageValues[k], 2); + } + norm = alpha * norm + bias; + for (let k = depthBegin; k < depthEnd; k++) { + let dyi = -2 * alpha * beta * inputImageValues[k] * + outputImageValues[offset] / norm; + if (offset === k) { + dyi += Math.pow(norm, -beta); + } + dyi *= dyValues[offset]; + result[k] += dyi; + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor4d"](result, dy.shape); + } + multinomial(logits, normalized, numSamples, seed) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(logits, 'multinomial'); + const probabilities = normalized ? logits : _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["softmax"](logits); + const batchSize = probabilities.shape[0]; + const numEvents = probabilities.shape[1]; + const res = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"]([batchSize, numSamples], 'int32'); + const resVals = this.readSync(res.dataId); + const probVals = this.readSync(probabilities.dataId); + for (let b = 0; b < batchSize; ++b) { + const offset = b * numEvents; + // The cdf won't include the last event. It will be implicit if no other + // event happened. + const cdf = new Float32Array(numEvents - 1); + cdf[0] = probVals[offset]; + for (let event = 1; event < cdf.length; ++event) { + cdf[event] = cdf[event - 1] + probVals[offset + event]; + } + const random = seedrandom__WEBPACK_IMPORTED_MODULE_1__["alea"](seed.toString()); + const outOffset = b * numSamples; + for (let sampleId = 0; sampleId < numSamples; ++sampleId) { + const r = random(); + // Assume last event happened by default. + resVals[outOffset + sampleId] = cdf.length; + for (let event = 0; event < cdf.length; event++) { + if (r < cdf[event]) { + resVals[outOffset + sampleId] = event; + break; + } + } + } + } + return res; + } + oneHot(indices, depth, onValue, offValue) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(indices, 'oneHot'); + const res = new Float32Array(indices.size * depth); + res.fill(offValue); + const indicesVal = this.readSync(indices.dataId); + for (let event = 0; event < indices.size; ++event) { + if (indicesVal[event] >= 0 && indicesVal[event] < depth) { + res[event * depth + indicesVal[event]] = onValue; + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor2d"](res, [indices.size, depth], 'int32'); + } + nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(boxes, 'nonMaxSuppression'); + const boxesVals = this.readSync(boxes.dataId); + const scoresVals = this.readSync(scores.dataId); + return nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold); + } + depthToSpace(x, blockSize, dataFormat) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(dataFormat === 'NHWC', () => `Only NHWC dataFormat supported on CPU for depthToSpace. Got ${dataFormat}`); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(blockSize > 1, () => `blockSize should be > 1 for depthToSpace, but was: ${blockSize}`); + const batchSize = x.shape[0]; + const inputHeight = x.shape[1]; + const inputWidth = x.shape[2]; + const inputDepth = x.shape[3]; + const outputHeight = inputHeight * blockSize; + const outputWidth = inputWidth * blockSize; + const outputDepth = inputDepth / (blockSize * blockSize); + const xValues = this.readSync(x.dataId); + const result = new Float32Array(batchSize * outputHeight * outputWidth * outputDepth); + let outputIdx = 0; + for (let b = 0; b < batchSize; ++b) { + for (let h = 0; h < outputHeight; ++h) { + const inH = Math.floor(h / blockSize); + const offsetH = (h % blockSize); + for (let w = 0; w < outputWidth; ++w) { + const inW = Math.floor(w / blockSize); + const offsetW = (w % blockSize); + const offsetD = (offsetH * blockSize + offsetW) * outputDepth; + for (let d = 0; d < outputDepth; ++d) { + const inD = d + offsetD; + const inputIdx = inD + inputDepth * (inW + inputWidth * (inH + inputHeight * b)); + result[outputIdx++] = xValues[inputIdx]; + } + } + } + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor4d"](result, [batchSize, outputHeight, outputWidth, outputDepth]); + } + broadcastedBinaryOp(a, b, dtype, op) { + const newShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(a.shape, b.shape); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"](newShape, dtype); + const aVals = this.readSync(a.dataId); + const bVals = this.readSync(b.dataId); + const aBroadcastDims = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getBroadcastDims(a.shape, newShape); + const bBroadcastDims = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getBroadcastDims(b.shape, newShape); + const resVals = result.values; + if (aBroadcastDims.length + bBroadcastDims.length === 0) { + for (let i = 0; i < resVals.length; ++i) { + resVals[i] = op(aVals[i % aVals.length], bVals[i % bVals.length]); + } + } + else { + const aBuf = this.bufferSync(a); + const bBuf = this.bufferSync(b); + for (let i = 0; i < resVals.length; ++i) { + const loc = result.indexToLoc(i); + const aLoc = loc.slice(-a.rank); + aBroadcastDims.forEach(d => aLoc[d] = 0); + const aIndex = aBuf.locToIndex(aLoc); + const bLoc = loc.slice(-b.rank); + bBroadcastDims.forEach(d => bLoc[d] = 0); + const bIndex = bBuf.locToIndex(bLoc); + resVals[i] = op(aVals[aIndex], bVals[bIndex]); + } + } + return result.toTensor(); + } + split(x, sizeSplits, axis) { + return split(x, sizeSplits, axis); + } + dispose() { } + floatPrecision() { + return 32; + } + /** Returns the smallest representable number. */ + epsilon() { + return super.epsilon(); + } + cropAndResize(images, boxes, boxIndex, cropSize, method, extrapolationValue) { + const [batch, imageHeight, imageWidth, numChannels] = images.shape; + const numBoxes = boxes.shape[0]; + const [cropHeight, cropWidth] = cropSize; + const output = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"]([numBoxes, cropHeight, cropWidth, numChannels], 'float32'); + const boxVals = this.readSync(boxes.dataId); + const boxIndVals = this.readSync(boxIndex.dataId); + const imageVals = this.readSync(images.dataId); + const inStride = images.strides; // to calculate flat indexes into image + const outStride = output.strides; // to calculate flat indexes into output + // Reference implementation + // tslint:disable-next-line:max-line-length + // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op.cc + for (let b = 0; b < numBoxes; b++) { + const startInd = b * 4; + const y1 = boxVals[startInd]; + const x1 = boxVals[startInd + 1]; + const y2 = boxVals[startInd + 2]; + const x2 = boxVals[startInd + 3]; + const bInd = boxIndVals[b]; + if (bInd >= batch) { + continue; + } + const heightScale = (cropHeight > 1) ? + (y2 - y1) * (imageHeight - 1) / (cropHeight - 1) : + 0; + const widthScale = (cropWidth > 1) ? (x2 - x1) * (imageWidth - 1) / (cropWidth - 1) : 0; + for (let y = 0; y < cropHeight; y++) { + const yInd = (cropHeight > 1) ? + y1 * (imageHeight - 1) + y * (heightScale) : + 0.5 * (y1 + y2) * (imageHeight - 1); + if (yInd < 0 || yInd > imageHeight - 1) { + for (let x = 0; x < cropWidth; x++) { + for (let c = 0; c < numChannels; c++) { + const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0]; + output.values[ind] = extrapolationValue; + } + } + continue; + } + if (method === 'bilinear') { + const topInd = Math.floor(yInd); + const bottomInd = Math.ceil(yInd); + const yLerp = yInd - topInd; + for (let x = 0; x < cropWidth; x++) { + const xInd = (cropWidth > 1) ? + x1 * (imageWidth - 1) + x * widthScale : + 0.5 * (x1 + x2) * (imageWidth - 1); + if (xInd < 0 || xInd > imageWidth - 1) { + for (let c = 0; c < numChannels; c++) { + const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0]; + output.values[ind] = extrapolationValue; + } + continue; + } + const leftInd = Math.floor(xInd); + const rightInd = Math.ceil(xInd); + const xLerp = xInd - leftInd; + for (let c = 0; c < numChannels; c++) { + let ind = c + leftInd * inStride[2] + topInd * inStride[1] + + bInd * inStride[0]; + const topLeft = imageVals[ind]; + ind = c + rightInd * inStride[2] + topInd * inStride[1] + + bInd * inStride[0]; + const topRight = imageVals[ind]; + ind = c + leftInd * inStride[2] + bottomInd * inStride[1] + + bInd * inStride[0]; + const bottomLeft = imageVals[ind]; + ind = c + rightInd * inStride[2] + bottomInd * inStride[1] + + bInd * inStride[0]; + const bottomRight = imageVals[ind]; + const top = topLeft + (topRight - topLeft) * xLerp; + const bottom = bottomLeft + (bottomRight - bottomLeft) * xLerp; + ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0]; + output.values[ind] = top + ((bottom - top) * yLerp); + } + } + } + else { // method == "nearest" + for (let x = 0; x < cropWidth; ++x) { + const xInd = (cropWidth > 1) ? + x1 * (imageWidth - 1) + x * widthScale : + 0.5 * (x1 + x2) * (imageWidth - 1); + if (xInd < 0 || xInd > imageWidth - 1) { + for (let c = 0; c < numChannels; c++) { + const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0]; + output.values[ind] = extrapolationValue; + } + continue; + } + const closestX = Math.round(xInd); + const closestY = Math.round(yInd); + for (let c = 0; c < numChannels; c++) { + const inInd = c + closestX * inStride[2] + + closestY * inStride[1] + bInd * inStride[0]; + const outInd = c + x * outStride[2] + y * outStride[1] + b * outStride[0]; + output.values[outInd] = imageVals[inInd]; + } + } + } + } + } + return output.toTensor(); + } + sparseToDense(sparseIndices, sparseValues, outputShape, defaultValue) { + const { sliceRank, numUpdates, sliceSize, strides, outputSize } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].calculateShapes(sparseValues, sparseIndices, outputShape); + const sumDupeIndices = false; + return this.scatter(sparseIndices, sparseValues, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, defaultValue, sumDupeIndices); + } + gatherND(x, indices) { + const indicesShape = indices.shape; + const sliceRank = indicesShape[indicesShape.length - 1]; + const [resultShape, numSlices, sliceSize, strides] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].prepareAndValidate(x, indices); + if (numSlices === 0) { + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor"]([], resultShape, x.dtype); + } + const buffer = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"]([numSlices, sliceSize], x.dtype); + const indicesData = this.readSync(indices.dataId); + const xData = this.readSync(x.dataId); + for (let i = 0; i < numSlices; i++) { + const index = []; + let flattenIndex = 0; + for (let j = 0; j < sliceRank; j++) { + const dim = indicesData[i * sliceRank + j]; + flattenIndex += dim * strides[j]; + index.push(dim); + } + if (flattenIndex < 0 || flattenIndex >= x.size / sliceSize) { + throw new Error(`Invalid indices: ${index} does not index into ${x.shape}`); + } + for (let k = 0; k < sliceSize; k++) { + buffer.values[i * sliceSize + k] = xData[flattenIndex * sliceSize + k]; + } + } + return buffer.toTensor().reshape(resultShape); + } + scatterND(indices, updates, shape) { + const { sliceRank, numUpdates, sliceSize, strides, outputSize } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].calculateShapes(updates, indices, shape); + const defaultValue = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["scalar"](0); + const sumDupeIndices = true; + return this.scatter(indices, updates, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, defaultValue, sumDupeIndices); + } + onesLike(x) { + if (x.dtype === 'string') { + throw new Error('onesLike is not supported for string tensors'); + } + else { + // TODO(lina128): Use fill kernel directly once this kernel is + // modularized. + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["fill"](x.shape, 1, x.dtype); + } + } + zerosLike(x) { + const values = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getArrayFromDType(x.dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape)); + return this.makeOutput(values, x.shape, x.dtype); + } + linspace(start, stop, num) { + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].linspaceImpl(start, stop, num); + } + scatter(indices, updates, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, defaultValue, sumDupeIndices) { + const flattenShape = [outputSize / sliceSize, sliceSize]; + const indicesData = this.readSync(indices.dataId); + const updatesData = this.readSync(updates.dataId); + if (outputSize === 0) { + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["tensor"]([], shape, updates.dtype); + } + const buffer = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](flattenShape, updates.dtype); + buffer.values.fill(this.readSync(defaultValue.dataId)[0]); + for (let i = 0; i < numUpdates; i++) { + const index = []; + let flattenIndex = 0; + for (let j = 0; j < sliceRank; j++) { + const dim = indicesData[i * sliceRank + j]; + index.push(dim); + flattenIndex += dim * strides[j]; + } + if (flattenIndex < 0 || flattenIndex >= outputSize / sliceSize) { + throw new Error(`Invalid indices: ${index} does not index into ${shape}`); + } + for (let k = 0; k < sliceSize; k++) { + if (sumDupeIndices) { + buffer.values[flattenIndex * sliceSize + k] += + updatesData[i * sliceSize + k]; + } + else { + buffer.values[flattenIndex * sliceSize + k] = updates.rank === 0 ? + updatesData[0] : + updatesData[i * sliceSize + k]; + } + } + } + return buffer.toTensor().reshape(shape); + } +} +//# sourceMappingURL=backend_cpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js ***! + \****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _backend_cpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./backend_cpu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js"); +/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "shared", function() { return _shared__WEBPACK_IMPORTED_MODULE_2__; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MathBackendCPU", function() { return _backend_cpu__WEBPACK_IMPORTED_MODULE_1__["MathBackendCPU"]; }); + +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./version */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version_cpu", function() { return _version__WEBPACK_IMPORTED_MODULE_3__["version"]; }); + +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/* + * base.ts contains all the exports from tfjs-backend-cpu + * without auto-kernel registration + */ + + + + + + +// Side effects for default initialization of MathBackendCPU +Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["registerBackend"])('cpu', () => new _backend_cpu__WEBPACK_IMPORTED_MODULE_1__["MathBackendCPU"](), 1 /* priority */); +//# sourceMappingURL=base.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js ***! + \********************************************************************/ +/*! exports provided: assertNotComplex */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assertNotComplex", function() { return assertNotComplex; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function assertNotComplex(tensor, opName) { + if (!Array.isArray(tensor)) { + tensor = [tensor]; + } + tensor.forEach(t => { + if (t != null) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(t.dtype !== 'complex64', () => `${opName} does not support complex64 tensors in the CPU backend.`); + } + }); +} +//# sourceMappingURL=cpu_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/index.js ***! + \*****************************************************************/ +/*! exports provided: MathBackendCPU, version_cpu, shared */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MathBackendCPU", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["MathBackendCPU"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version_cpu", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["version_cpu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shared", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["shared"]; }); + +/* harmony import */ var _register_all_kernels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./register_all_kernels */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// All exports from this package should be in base. + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js ***! + \***********************************************************************/ +/*! exports provided: simpleAbsImpl, abs, absConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "simpleAbsImpl", function() { return simpleAbsImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return abs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "absConfig", function() { return absConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function simpleAbsImpl(vals) { + const resultValues = new Float32Array(vals.length); + for (let i = 0; i < vals.length; ++i) { + resultValues[i] = Math.abs(vals[i]); + } + return resultValues; +} +const abs = (args) => { + const { x } = args.inputs; + const cpuBackend = args.backend; + let resultValues = new Float32Array(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape)); + if (x.dtype !== 'complex64') { + const values = cpuBackend.data.get(x.dataId).values; + resultValues = simpleAbsImpl(values); + } + else { + const complexVals = cpuBackend.data.get(x.dataId); + const real = complexVals.complexTensorInfos.real; + const imag = complexVals.complexTensorInfos.imag; + const realVals = cpuBackend.data.get(real.dataId).values; + const imagVals = cpuBackend.data.get(imag.dataId).values; + for (let i = 0; i < realVals.length; i++) { + const real = realVals[i]; + const imag = imagVals[i]; + resultValues[i] = Math.hypot(real, imag); + } + } + return cpuBackend.makeOutput(resultValues, x.shape, 'float32'); +}; +const absConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Abs"], + backendName: 'cpu', + kernelFunc: abs, +}; +//# sourceMappingURL=Abs.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js ***! + \************************************************************************/ +/*! exports provided: acos, acosConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return acos; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acosConfig", function() { return acosConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const acos = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Acos"], (xi) => Math.acos(xi)); +const acosConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Acos"], + backendName: 'cpu', + kernelFunc: acos, +}; +//# sourceMappingURL=Acos.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js ***! + \*************************************************************************/ +/*! exports provided: acosh, acoshConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acosh", function() { return acosh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acoshConfig", function() { return acoshConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const acosh = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Acosh"], (xi) => Math.acosh(xi)); +const acoshConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Acosh"], + backendName: 'cpu', + kernelFunc: acosh, +}; +//# sourceMappingURL=Acosh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js ***! + \***********************************************************************/ +/*! exports provided: addImpl, addComplexImpl, add, addConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addImpl", function() { return addImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addComplexImpl", function() { return addComplexImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add", function() { return add; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addConfig", function() { return addConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/kernel_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const addImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])(((a, b) => a + b)); +const addComplexImpl = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["createComplexBinaryKernelImpl"])(((aReal, aImag, bReal, bImag) => { + return { real: aReal + bReal, imag: aImag + bImag }; +})); +const add = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["binaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Add"], addImpl, addComplexImpl); +const addConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Add"], + backendName: 'cpu', + kernelFunc: add +}; +//# sourceMappingURL=Add.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js ***! + \************************************************************************/ +/*! exports provided: asin, asinConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return asin; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinConfig", function() { return asinConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const asin = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Asin"], (xi) => Math.asin(xi)); +const asinConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Asin"], + backendName: 'cpu', + kernelFunc: asin, +}; +//# sourceMappingURL=Asin.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js ***! + \*************************************************************************/ +/*! exports provided: asinh, asinhConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinh", function() { return asinh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinhConfig", function() { return asinhConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const asinh = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Asinh"], (xi) => Math.asinh(xi)); +const asinhConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Asinh"], + backendName: 'cpu', + kernelFunc: asinh, +}; +//# sourceMappingURL=Asinh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js ***! + \************************************************************************/ +/*! exports provided: atan, atanConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan", function() { return atan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanConfig", function() { return atanConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const atan = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Atan"], (xi) => Math.atan(xi)); +const atanConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Atan"], + backendName: 'cpu', + kernelFunc: atan, +}; +//# sourceMappingURL=Atan.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js ***! + \*************************************************************************/ +/*! exports provided: atanh, atanhConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanh", function() { return atanh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanhConfig", function() { return atanhConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const atanh = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Atanh"], (xi) => Math.atanh(xi)); +const atanhConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Atanh"], + backendName: 'cpu', + kernelFunc: atanh, +}; +//# sourceMappingURL=Atanh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js ***! + \***************************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool", function() { return avgPool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolConfig", function() { return avgPoolConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _utils_pool_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/pool_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function avgPool(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'avgPool'); + const { filterSize, strides, pad, dimRoundingMode } = attrs; + const dilations = 1; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode); + let res; + if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(convInfo.inShape, convInfo.outShape)) { + res = Object(_Identity__WEBPACK_IMPORTED_MODULE_3__["identity"])({ inputs: { x }, backend }); + } + else { + const xValues = backend.data.get(x.dataId).values; + const strides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const buffer = Object(_utils_pool_utils__WEBPACK_IMPORTED_MODULE_2__["pool"])(xValues, x.shape, x.dtype, strides, convInfo, 'avg'); + res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values); + } + return res; +} +const avgPoolConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["AvgPool"], + backendName: 'cpu', + kernelFunc: avgPool +}; +//# sourceMappingURL=AvgPool.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolBackprop.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolBackprop.js ***! + \***********************************************************************************/ +/*! exports provided: avgPoolBackprop, avgPoolBackpropConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolBackprop", function() { return avgPoolBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolBackpropConfig", function() { return avgPoolBackpropConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function avgPoolBackprop(args) { + const { inputs, backend, attrs } = args; + const { dy, input } = inputs; + const x = input; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([dy, input], 'avgPoolBackprop'); + const { filterSize, strides, pad } = attrs; + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad); + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const dx = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(x.shape, 'float32'); + const avgMultiplier = 1 / (filterHeight * filterWidth); + const dyData = backend.data.get(dy.dataId).values; + const dyBuf = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(dy.shape, 'float32', dyData); + for (let b = 0; b < convInfo.batchSize; ++b) { + for (let d = 0; d < convInfo.inChannels; ++d) { + for (let dxR = 0; dxR < convInfo.inHeight; ++dxR) { + for (let dxC = 0; dxC < convInfo.inWidth; ++dxC) { + // Shader code begins. + const dyRCorner = dxR - padTop; + const dyCCorner = dxC - padLeft; + let dotProd = 0; + for (let wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) { + const dyR = (dyRCorner + wR) / strideHeight; + if (dyR < 0 || dyR >= convInfo.outHeight || + Math.floor(dyR) !== dyR) { + continue; + } + for (let wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) { + const dyC = (dyCCorner + wC) / strideWidth; + if (dyC < 0 || dyC >= convInfo.outWidth || + Math.floor(dyC) !== dyC) { + continue; + } + const pixel = dyBuf.get(b, dyR, dyC, d); + dotProd += pixel; + } + } + dx.set(dotProd * avgMultiplier, b, dxR, dxC, d); + } + } + } + } + return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values); +} +const avgPoolBackpropConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["AvgPoolBackprop"], + backendName: 'cpu', + kernelFunc: avgPoolBackprop +}; +//# sourceMappingURL=AvgPoolBackprop.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js ***! + \*******************************************************************************/ +/*! exports provided: batchMatMul, batchMatMulConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchMatMul", function() { return batchMatMul; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchMatMulConfig", function() { return batchMatMulConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function batchMatMul(args) { + const { inputs, backend, attrs } = args; + const { a, b } = inputs; + const { transposeA, transposeB } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([a, b], 'matMul'); + const aRank = a.shape.length; + const bRank = b.shape.length; + const innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1]; + const innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2]; + const outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2]; + const outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1]; + const outerDimsA = a.shape.slice(0, -2); + const outerDimsB = b.shape.slice(0, -2); + const batchDimA = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outerDimsA); + const batchDimB = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outerDimsB); + const batchDimsCompatible = batchDimA === batchDimB || batchDimA === 1 || batchDimB === 1; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(aRank >= 2 && bRank >= 2 && batchDimsCompatible, () => `Error in matMul: the input batch dimensions must either be the ` + + `same or at least one input batch dimension must be 1. Got input ` + + `batch dimensions of (${outerDimsA}) and (${outerDimsB}).`); + const outShapeOuterDims = batchDimA > batchDimB ? a.shape.slice(0, -2) : b.shape.slice(0, -2); + const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(innerShapeA === innerShapeB, () => `Error in matMul: inner shapes (${innerShapeA}) and (` + + `${innerShapeB}) of Tensors with shapes ${a.shape} and ` + + `${b.shape} and transposeA=${transposeA}` + + ` and transposeB=${transposeB} must match.`); + const a3dShape = transposeA ? [batchDimA, innerShapeA, outerShapeA] : + [batchDimA, outerShapeA, innerShapeA]; + const b3dShape = transposeB ? [batchDimB, outerShapeB, innerShapeB] : + [batchDimB, innerShapeB, outerShapeB]; + // The rest of the implementation is designed to operate on rank-3 tensors + const a3d = Object(_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x: a }, backend, attrs: { shape: a3dShape } }); + const b3d = Object(_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x: b }, backend, attrs: { shape: b3dShape } }); + const sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2]; + const leftDim = transposeA ? a3d.shape[2] : a3d.shape[1]; + const rightDim = transposeB ? b3d.shape[1] : b3d.shape[2]; + const batchDim = Math.max(batchDimA, batchDimB); + const a3dValues = backend.data.get(a3d.dataId).values; + const b3dValues = backend.data.get(b3d.dataId).values; + const a3dStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(a3d.shape); + const b3dStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(b3d.shape); + const [aBatch, aOuterStep, aInnerStep] = transposeA ? + [a3dStrides[0], 1, a3dStrides[1]] : + [a3dStrides[0], a3dStrides[1], 1]; + const [bInnerStep, bOuterStep, bBatch] = transposeB ? + [1, b3dStrides[1], b3dStrides[0]] : + [b3dStrides[1], 1, b3dStrides[0]]; + const size = leftDim * rightDim; + const result = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])([batchDim, leftDim, rightDim], a3d.dtype); + const resVals = result.values; + const blockSize = backend.blockSize; + for (let bi = 0; bi < batchDim; bi++) { + for (let i0 = 0; i0 < leftDim; i0 += blockSize) { + for (let j0 = 0; j0 < rightDim; j0 += blockSize) { + for (let k0 = 0; k0 < sharedDim; k0 += blockSize) { + // for when blockSize doesn't evenly divide the input + const iBlock = Math.min(i0 + blockSize, leftDim); + const jBlock = Math.min(j0 + blockSize, rightDim); + const kBlock = Math.min(k0 + blockSize, sharedDim); + for (let i = i0; i < iBlock; i++) { + for (let j = j0; j < jBlock; j++) { + let sum = 0.0; + for (let k = k0; k < kBlock; k++) { + const batchOffsetA = Math.min(bi, batchDimA - 1) * aBatch; + const batchOffsetB = Math.min(bi, batchDimB - 1) * bBatch; + const aVal = a3dValues[batchOffsetA + i * aOuterStep + k * aInnerStep]; + const bVal = b3dValues[k * bInnerStep + j * bOuterStep + batchOffsetB]; + sum += aVal * bVal; + } + resVals[bi * size + (i * rightDim + j)] += sum; + } + } + } + } + } + } + backend.disposeIntermediateTensorInfo(a3d); + backend.disposeIntermediateTensorInfo(b3d); + // set correct shape on output. + return backend.makeTensorInfo(outShape, result.dtype, result.values); +} +const batchMatMulConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["BatchMatMul"], + backendName: 'cpu', + kernelFunc: batchMatMul, +}; +//# sourceMappingURL=BatchMatMul.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js ***! + \*****************************************************************************/ +/*! exports provided: batchNorm, batchNormConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNorm", function() { return batchNorm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNormConfig", function() { return batchNormConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function batchNorm(args) { + const { inputs, backend, attrs } = args; + const { x, scale, offset, mean, variance } = inputs; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(mean.shape.length === variance.shape.length, () => 'Batch normalization gradient requires mean and variance to have ' + + 'equal ranks.'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(offset == null || mean.shape.length === offset.shape.length, () => 'Batch normalization gradient requires mean and offset to have ' + + 'equal ranks.'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(scale == null || mean.shape.length === scale.shape.length, () => 'Batch normalization gradient requires mean and scale to have ' + + 'equal ranks.'); + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, mean, variance, scale, offset], 'batchNorm'); + let { varianceEpsilon } = attrs; + if (varianceEpsilon == null) { + varianceEpsilon = 0.001; + } + const xVals = backend.data.get(x.dataId).values; + const mVals = backend.data.get(mean.dataId).values; + const varVals = backend.data.get(variance.dataId).values; + const sVals = scale ? backend.data.get(scale.dataId).values : + new Float32Array([1]); + const offVals = offset ? + backend.data.get(offset.dataId).values : + new Float32Array([0]); + const outVals = new Float32Array(xVals.length); + const offValsLength = offVals.length; + const sValsLength = sVals.length; + const varValsLength = varVals.length; + const mValsLength = mVals.length; + let offi = 0; + let mi = 0; + let si = 0; + let vi = 0; + for (let i = 0; i < xVals.length; ++i) { + outVals[i] = offVals[offi++] + + (xVals[i] - mVals[mi++]) * sVals[si++] / + Math.sqrt(varVals[vi++] + varianceEpsilon); + if (offi >= offValsLength) { + offi = 0; + } + if (mi >= mValsLength) { + mi = 0; + } + if (si >= sValsLength) { + si = 0; + } + if (vi >= varValsLength) { + vi = 0; + } + } + return backend.makeTensorInfo(x.shape, x.dtype, outVals); +} +const batchNormConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FusedBatchNorm"], + backendName: 'cpu', + kernelFunc: batchNorm, +}; +//# sourceMappingURL=BatchNorm.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js ***! + \************************************************************************/ +/*! exports provided: cast, castConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cast", function() { return cast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "castConfig", function() { return castConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _Complex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Complex */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/* harmony import */ var _Real__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Real */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +function cast(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { dtype } = attrs; + // Casting to complex64. + if (dtype === 'complex64') { + if (x.dtype === 'complex64') { + return Object(_Identity__WEBPACK_IMPORTED_MODULE_3__["identity"])({ inputs: { x }, backend }); + } + // TODO(lina128): Import kernel function once zeros is modularized. + const zerosTensor = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](x.shape); + const floatX = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } }); + const result = Object(_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: floatX, imag: zerosTensor }, backend }); + zerosTensor.dispose(); + backend.disposeIntermediateTensorInfo(floatX); + return result; + } + // Casting from complex64 + if (x.dtype === 'complex64') { + const realPart = Object(_Real__WEBPACK_IMPORTED_MODULE_4__["real"])({ inputs: { input: x }, backend }); + const result = cast({ inputs: { x: realPart }, backend, attrs: { dtype } }); + backend.disposeIntermediateTensorInfo(realPart); + return result; + } + if (!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].hasEncodingLoss(x.dtype, dtype)) { + // We don't change the underlying data, since we cast to higher + // precision. + const result = Object(_Identity__WEBPACK_IMPORTED_MODULE_3__["identity"])({ inputs: { x }, backend }); + return { dataId: result.dataId, shape: result.shape, dtype }; + } + if (dtype === 'int32') { + const values = backend.data.get(x.dataId).values; + const resultValues = Int32Array.from(values); + return backend.makeTensorInfo(x.shape, 'int32', resultValues); + } + if (dtype === 'bool') { + // This is essentially the result of notEqual(x, 0). We avoid using + // kernel notEqual to avoid circular dependency, i.e. binary_utils -> + // cast -> notEqual -> binary_utils. + const xVals = backend.data.get(x.dataId).values; + const zero = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toTypedArray([0], x.dtype); + const [resultData, resultShape] = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])((a, b) => (a !== b) ? 1 : 0)(x.shape, [], xVals, zero, 'bool'); + return backend.makeTensorInfo(resultShape, 'bool', resultData); + } + throw new Error(`Error in Cast: failed to cast ${x.dtype} to ${dtype}`); +} +const castConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cast"], + backendName: 'cpu', + kernelFunc: cast +}; +//# sourceMappingURL=Cast.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js ***! + \************************************************************************/ +/*! exports provided: ceilImpl, ceil, ceilConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceilImpl", function() { return ceilImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return ceil; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceilConfig", function() { return ceilConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const ceilImpl = Object(_utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleUnaryImpl"])((xi) => Math.ceil(xi)); +const ceil = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__["unaryKernelFuncFromImpl"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Ceil"], ceilImpl); +const ceilConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Ceil"], + backendName: 'cpu', + kernelFunc: ceil, +}; +//# sourceMappingURL=Ceil.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js ***! + \************************************************************************/ +/*! exports provided: clip, clipConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clip", function() { return clip; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipConfig", function() { return clipConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const clip = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["ClipByValue"], (xi, attrs) => { + const clipAttrs = attrs; + if (xi > clipAttrs.clipValueMax) { + return clipAttrs.clipValueMax; + } + return xi < clipAttrs.clipValueMin ? clipAttrs.clipValueMin : xi; +}); +const clipConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["ClipByValue"], + backendName: 'cpu', + kernelFunc: clip, +}; +//# sourceMappingURL=Clip.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js ***! + \***************************************************************************/ +/*! exports provided: complex, complexConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complex", function() { return complex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complexConfig", function() { return complexConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function complex(args) { + const { inputs, backend } = args; + const { real, imag } = inputs; + const realVals = backend.data.get(real.dataId).values; + const imagVals = backend.data.get(imag.dataId).values; + const complexInfo = backend.makeTensorInfo(real.shape, 'complex64'); + const complex = backend.data.get(complexInfo.dataId); + // The complex tensor owns the underlying real and imag tensorInfos, only the + // complex tensor tracks refCount, when complexData is disposed the + // underlying tensorData will be disposed. + complex.complexTensorInfos = { + real: backend.makeTensorInfo(real.shape, 'float32', realVals), + imag: backend.makeTensorInfo(imag.shape, 'float32', imagVals) + }; + return complexInfo; +} +const complexConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Complex"], + backendName: 'cpu', + kernelFunc: complex +}; +//# sourceMappingURL=Complex.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js ***! + \**************************************************************************/ +/*! exports provided: concat, concatConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatConfig", function() { return concatConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Complex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Complex */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/* harmony import */ var _Imag__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Imag */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"); +/* harmony import */ var _Real__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Real */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +function concat(args) { + const { inputs, backend, attrs } = args; + const { axis } = attrs; + const $axis = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam(axis, inputs[0].shape)[0]; + let outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape(inputs.map(t => t.shape), $axis); + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape) === 0) { + return backend.makeTensorInfo(outShape, inputs[0].dtype, []); + } + // Keep only non-empty tensors (ignore tensors with 0 in their shape). + const $inputs = inputs.filter(t => _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(t.shape) > 0); + if ($inputs.length === 1) { + return $inputs[0]; + } + const shapes = $inputs.map(t => t.shape); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertParamsConsistent(shapes, $axis); + if ($inputs[0].dtype === 'complex64') { + const reals = $inputs.map((t) => Object(_Real__WEBPACK_IMPORTED_MODULE_3__["real"])({ inputs: { input: t }, backend })); + const imags = $inputs.map((t) => Object(_Imag__WEBPACK_IMPORTED_MODULE_2__["imag"])({ inputs: { input: t }, backend })); + const realConcated = concat({ inputs: reals, backend, attrs: { axis: $axis } }); + const imagConcated = concat({ inputs: imags, backend, attrs: { axis: $axis } }); + const result = Object(_Complex__WEBPACK_IMPORTED_MODULE_1__["complex"])({ inputs: { real: realConcated, imag: imagConcated }, backend }); + reals.forEach(r => backend.disposeIntermediateTensorInfo(r)); + imags.forEach(i => backend.disposeIntermediateTensorInfo(i)); + backend.disposeIntermediateTensorInfo(realConcated); + backend.disposeIntermediateTensorInfo(imagConcated); + return result; + } + // Any concat of n-dimensional tensors across any axis can be reduced to + // a concatenation of two-dimensional tensors across the axis 1 by first + // partitioning the axes of the original tensors into those less than the + // axis to be concatenated and the rest. Then reshape the tensors + // into a two-dimensional tensor by collapsing these two sets of axes and + // concatenate the resulting matrices across the axis 1, finally reshaping + // the result to have the proper shape. + const inputs2D = $inputs.map(t => { + const innerSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(t.shape.slice($axis)); + const shape = [-1, innerSize]; + return Object(_Reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])({ inputs: { x: t }, backend, attrs: { shape } }); + }); + // Concats 2d tensors along axis=1. + outShape = + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape(inputs2D.map(t => t.shape), 1 /* axis */); + const outVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType($inputs[0].dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape)); + if (inputs2D[0].shape[0] === 1) { + // Use built-in TypedArray.set() method for speed. + let offset = 0; + inputs2D.forEach(t => { + const val = backend.data.get(t.dataId).values; + const size = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(t.shape); + outVals.set(val, offset); + offset += size; + }); + } + else { + let colOffset = 0; + inputs2D.forEach(t => { + const tVals = backend.data.get(t.dataId).values; + let tIdx = 0; + for (let row = 0; row < t.shape[0]; ++row) { + const resIdx = row * outShape[1] + colOffset; + for (let col = 0; col < t.shape[1]; ++col) { + outVals[resIdx + col] = tVals[tIdx++]; + } + } + colOffset += t.shape[1]; + }); + } + const finalOutShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape($inputs.map(t => t.shape), $axis); + const outInfo = backend.makeTensorInfo(finalOutShape, inputs[0].dtype, outVals); + inputs2D.forEach(t => backend.disposeIntermediateTensorInfo(t)); + return outInfo; +} +const concatConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Concat"], + backendName: 'cpu', + kernelFunc: concat +}; +//# sourceMappingURL=Concat.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js ***! + \**************************************************************************/ +/*! exports provided: conv2D, conv2DConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2D", function() { return conv2D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DConfig", function() { return conv2DConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function conv2D(args) { + const { inputs, backend, attrs } = args; + const { x, filter } = inputs; + const { strides, pad, dataFormat, dilations, dimRoundingMode } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, filter], 'conv2d'); + const $dataFormat = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].convertConv2DDataFormat(dataFormat); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat); + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const padLeft = convInfo.padInfo.left; + const padTop = convInfo.padInfo.top; + const isChannelsLast = convInfo.dataFormat === 'channelsLast'; + const y = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.outShape, x.dtype); + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const filterStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape); + const xBatchStride = xStrides[0]; + const xRowStride = isChannelsLast ? xStrides[1] : xStrides[2]; + const xColStride = isChannelsLast ? xStrides[2] : 1; + const xChannelStride = isChannelsLast ? 1 : xStrides[1]; + const yBatchStride = y.strides[0]; + const yRowStride = isChannelsLast ? y.strides[1] : y.strides[2]; + const yColStride = isChannelsLast ? y.strides[2] : 1; + const yChannelStride = isChannelsLast ? 1 : y.strides[1]; + const xVals = backend.data.get(x.dataId).values; + const wVals = backend.data.get(filter.dataId).values; + const yVals = y.values; + for (let b = 0; b < convInfo.batchSize; ++b) { + const xOffset1 = b * xBatchStride; + const yOffset1 = b * yBatchStride; + for (let yR = 0; yR < convInfo.outHeight; ++yR) { + const yOffset2 = yOffset1 + yR * yRowStride; + const xRCorner = yR * convInfo.strideHeight - padTop; + for (let wR = 0; wR < filterHeight; ++wR) { + const xR = xRCorner + wR * dilationHeight; + if (xR < 0 || xR >= convInfo.inHeight) { + continue; + } + const wOffset1 = wR * filterStrides[0]; + const xOffset2 = xOffset1 + xR * xRowStride; + for (let yC = 0; yC < convInfo.outWidth; ++yC) { + const yOffset3 = yOffset2 + yC * yColStride; + const xCCorner = yC * convInfo.strideWidth - padLeft; + for (let wC = 0; wC < filterWidth; ++wC) { + const xC = xCCorner + wC * dilationWidth; + if (xC < 0 || xC >= convInfo.inWidth) { + continue; + } + const wOffset2 = wOffset1 + wC * filterStrides[1]; + const xOffset3 = xOffset2 + xC * xColStride; + let wOffset3 = wOffset2; + for (let d1 = 0; d1 < convInfo.inChannels; ++d1) { + const xVal = xVals[xOffset3 + d1 * xChannelStride]; + for (let d2 = 0; d2 < convInfo.outChannels; ++d2) { + yVals[yOffset3 + d2 * yChannelStride] += + xVal * wVals[wOffset3 + d2]; + } + wOffset3 += convInfo.outChannels; + } + } + } + } + } + } + return backend.makeTensorInfo(y.shape, y.dtype, yVals); +} +const conv2DConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Conv2D"], + backendName: 'cpu', + kernelFunc: conv2D +}; +//# sourceMappingURL=Conv2D.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js ***! + \****************************************************************************************/ +/*! exports provided: conv2DBackpropFilter, conv2DBackpropFilterConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DBackpropFilter", function() { return conv2DBackpropFilter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DBackpropFilterConfig", function() { return conv2DBackpropFilterConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function conv2DBackpropFilter(args) { + const { inputs, backend, attrs } = args; + const { x, dy } = inputs; + const { strides, pad, dataFormat, dimRoundingMode, filterShape } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, dy], 'conv2dBackpropFilter'); + const $dataFormat = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].convertConv2DDataFormat(dataFormat); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv2DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad, dimRoundingMode, false /* depthwise */, $dataFormat); + const { strideHeight, strideWidth, filterHeight, filterWidth } = convInfo; + const isChannelsLast = convInfo.dataFormat === 'channelsLast'; + const dW = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.filterShape, 'float32'); + const leftPad = convInfo.padInfo.left; + const topPad = convInfo.padInfo.top; + const xVals = backend.data.get(x.dataId).values; + const dyVals = backend.data.get(dy.dataId).values; + const xBuf = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](x.shape, x.dtype, xVals); + const dyBuf = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](dy.shape, dy.dtype, dyVals); + for (let wR = 0; wR < filterHeight; ++wR) { + const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight)); + const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight); + for (let wC = 0; wC < filterWidth; ++wC) { + const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth)); + const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth); + for (let d1 = 0; d1 < convInfo.inChannels; ++d1) { + for (let d2 = 0; d2 < convInfo.outChannels; ++d2) { + let dotProd = 0; + for (let b = 0; b < convInfo.batchSize; ++b) { + for (let yR = yRMin; yR < yRMax; ++yR) { + const xR = wR + yR * strideHeight - topPad; + for (let yC = yCMin; yC < yCMax; ++yC) { + const xC = wC + yC * strideWidth - leftPad; + if (isChannelsLast) { + dotProd += xBuf.get(b, xR, xC, d1) * + dyBuf.get(b, yR, yC, d2); + } + else { + dotProd += xBuf.get(b, d1, xR, xC) * + dyBuf.get(b, d2, yR, yC); + } + } + } + } + dW.set(dotProd, wR, wC, d1, d2); + } + } + } + } + return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values); +} +const conv2DBackpropFilterConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Conv2DBackpropFilter"], + backendName: 'cpu', + kernelFunc: conv2DBackpropFilter +}; +//# sourceMappingURL=Conv2DBackpropFilter.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js ***! + \***************************************************************************************/ +/*! exports provided: conv2DBackpropInput, conv2DBackpropInputConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DBackpropInput", function() { return conv2DBackpropInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DBackpropInputConfig", function() { return conv2DBackpropInputConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function conv2DBackpropInput(args) { + const { inputs, backend, attrs } = args; + const { dy, filter } = inputs; + const { inputShape, strides, pad, dataFormat, dimRoundingMode } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([dy, filter], 'conv2dBackpropInput'); + const filterStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape); + const dyStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(dy.shape); + let $dataFormat = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].convertConv2DDataFormat(dataFormat); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv2DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad, dimRoundingMode, false, $dataFormat); + const dx = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.inShape, 'float32'); + const dxValues = dx.values; + const dyValues = backend.data.get(dy.dataId).values; + const fltValues = backend.data.get(filter.dataId).values; + const [fltS0, fltS1, fltS2] = filterStrides; + const { batchSize, filterHeight, filterWidth, inChannels, inHeight, inWidth, outChannels, outHeight, outWidth, strideHeight, strideWidth } = convInfo; + $dataFormat = convInfo.dataFormat; + const topPad = filterHeight - 1 - convInfo.padInfo.top; + const leftPad = filterWidth - 1 - convInfo.padInfo.left; + const isChannelsLast = $dataFormat === 'channelsLast'; + const xBatchStride = dx.strides[0]; + const xRowStride = isChannelsLast ? dx.strides[1] : dx.strides[2]; + const xColStride = isChannelsLast ? dx.strides[2] : 1; + const xChannelStride = isChannelsLast ? 1 : dx.strides[1]; + const yBatchStride = dyStrides[0]; + const yRowStride = isChannelsLast ? dyStrides[1] : dyStrides[2]; + const yColStride = isChannelsLast ? dyStrides[2] : 1; + const yChannelStride = isChannelsLast ? 1 : dyStrides[1]; + for (let b = 0; b < batchSize; ++b) { + for (let d1 = 0; d1 < inChannels; ++d1) { + for (let xR = 0; xR < inHeight; ++xR) { + const xRCorner = xR - topPad; + const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight)); + const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight); + for (let xC = 0; xC < inWidth; ++xC) { + const xCCorner = xC - leftPad; + const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth)); + const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth); + let dotProd = 0; + for (let yR = xRMin; yR < yRMax; ++yR) { + const wR = yR * strideHeight - xRCorner; + for (let yC = xCMin; yC < yCMax; ++yC) { + const wC = yC * strideWidth - xCCorner; + const dyOffset = yBatchStride * b + yRowStride * yR + yColStride * yC; + const fltOffset = fltS0 * (filterHeight - 1 - wR) + + fltS1 * (filterWidth - 1 - wC) + fltS2 * d1; + for (let d2 = 0; d2 < outChannels; ++d2) { + const pixel = dyValues[dyOffset + yChannelStride * d2]; + const weight = fltValues[fltOffset + d2]; + dotProd += pixel * weight; + } + } + } + const dxOffset = xBatchStride * b + xRowStride * xR + + xColStride * xC + xChannelStride * d1; + dxValues[dxOffset] = dotProd; + } + } + } + } + return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values); +} +const conv2DBackpropInputConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Conv2DBackpropInput"], + backendName: 'cpu', + kernelFunc: conv2DBackpropInput +}; +//# sourceMappingURL=Conv2DBackpropInput.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js ***! + \**************************************************************************/ +/*! exports provided: conv3D, conv3DConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3D", function() { return conv3D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3DConfig", function() { return conv3DConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function conv3D(args) { + const { inputs, backend, attrs } = args; + const { x, filter } = inputs; + const { strides, pad, dilations } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, filter], 'conv3d'); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad); + const { filterDepth, filterHeight, filterWidth, dilationDepth, dilationHeight, dilationWidth, padInfo } = convInfo; + const padFront = padInfo.front; + const padLeft = padInfo.left; + const padTop = padInfo.top; + const y = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.outShape, x.dtype); + const xVals = backend.data.get(x.dataId).values; + const wVals = backend.data.get(filter.dataId).values; + const yVals = y.values; + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const filterStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape); + for (let b = 0; b < convInfo.batchSize; ++b) { + const xOffset1 = b * xStrides[0]; + const yOffset1 = b * y.strides[0]; + for (let yF = 0; yF < convInfo.outDepth; ++yF) { + const yOffset2 = yOffset1 + yF * y.strides[1]; + const xFCorner = yF * convInfo.strideDepth - padFront; + for (let wF = 0; wF < filterDepth; ++wF) { + const xF = xFCorner + wF * dilationDepth; + if (xF < 0 || xF >= convInfo.inDepth) { + continue; + } + const wOffset1 = wF * filterStrides[0]; + const xOffset2 = xOffset1 + xF * xStrides[1]; + for (let yR = 0; yR < convInfo.outHeight; ++yR) { + const yOffset3 = yOffset2 + yR * y.strides[2]; + const xRCorner = yR * convInfo.strideHeight - padTop; + for (let wR = 0; wR < filterHeight; ++wR) { + const xR = xRCorner + wR * dilationHeight; + if (xR < 0 || xR >= convInfo.inHeight) { + continue; + } + const wOffset2 = wOffset1 + wR * filterStrides[1]; + const xOffset3 = xOffset2 + xR * xStrides[2]; + for (let yC = 0; yC < convInfo.outWidth; ++yC) { + const yOffset4 = yOffset3 + yC * convInfo.outChannels; + const xCCorner = yC * convInfo.strideWidth - padLeft; + for (let wC = 0; wC < filterWidth; ++wC) { + const xC = xCCorner + wC * dilationWidth; + if (xC < 0 || xC >= convInfo.inWidth) { + continue; + } + const wOffset3 = wOffset2 + wC * filterStrides[2]; + const xOffset4 = xOffset3 + xC * convInfo.inChannels; + let wOffset4 = wOffset3; + for (let d1 = 0; d1 < convInfo.inChannels; ++d1) { + const xVal = xVals[xOffset4 + d1]; + for (let d2 = 0; d2 < convInfo.outChannels; ++d2) { + yVals[yOffset4 + d2] += xVal * wVals[wOffset4 + d2]; + } + wOffset4 += convInfo.outChannels; + } + } + } + } + } + } + } + } + return backend.makeTensorInfo(y.shape, y.dtype, y.values); +} +const conv3DConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Conv3D"], + backendName: 'cpu', + kernelFunc: conv3D +}; +//# sourceMappingURL=Conv3D.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js ***! + \******************************************************************************************/ +/*! exports provided: conv3DBackpropFilterV2, conv3DBackpropFilterV2Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3DBackpropFilterV2", function() { return conv3DBackpropFilterV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3DBackpropFilterV2Config", function() { return conv3DBackpropFilterV2Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function conv3DBackpropFilterV2(args) { + const { inputs, backend, attrs } = args; + const { x, dy } = inputs; + const { strides, pad, filterShape } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, dy], 'conv3dBackpropFilterV2'); + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const dyStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(dy.shape); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv3DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad); + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const filterDepth = convInfo.filterDepth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const dw = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.filterShape, 'float32'); + const dwValues = dw.values; + const [dwS0, dwS1, dwS2, dwS3] = dw.strides; + const dyValues = backend.data.get(dy.dataId).values; + const [dyS0, dyS1, dyS2, dyS3] = dyStrides; + const xValues = backend.data.get(x.dataId).values; + const [xS0, xS1, xS2, xS3] = xStrides; + const frontPad = convInfo.padInfo.front; + const leftPad = convInfo.padInfo.left; + const topPad = convInfo.padInfo.top; + for (let wF = 0; wF < filterDepth; ++wF) { + const yFMin = Math.max(0, Math.ceil((frontPad - wF) / strideDepth)); + const yFMax = Math.min(convInfo.outDepth, (convInfo.inDepth + frontPad - wF) / strideDepth); + const wOffset1 = wF * dwS0; + for (let wR = 0; wR < filterHeight; ++wR) { + const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight)); + const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight); + const wOffset2 = wR * dwS1 + wOffset1; + for (let wC = 0; wC < filterWidth; ++wC) { + const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth)); + const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth); + const wOffset3 = wC * dwS2 + wOffset2; + for (let d1 = 0; d1 < convInfo.inChannels; ++d1) { + const wOffset4 = d1 * dwS3 + wOffset3; + for (let d2 = 0; d2 < convInfo.outChannels; ++d2) { + let dotProd = 0; + for (let b = 0; b < convInfo.batchSize; ++b) { + const xOffset1 = b * xS0; + const yOffset1 = b * dyS0; + for (let yF = yFMin; yF < yFMax; ++yF) { + const xF = wF + yF * strideDepth - frontPad; + const xOffset2 = xF * xS1 + xOffset1; + const yOffset2 = yF * dyS1 + yOffset1; + for (let yR = yRMin; yR < yRMax; ++yR) { + const xR = wR + yR * strideHeight - topPad; + const xOffset3 = xR * xS2 + xOffset2; + const yOffset3 = yR * dyS2 + yOffset2; + for (let yC = yCMin; yC < yCMax; ++yC) { + const xC = wC + yC * strideWidth - leftPad; + const xOffset4 = xC * xS3 + xOffset3; + const yOffset4 = yC * dyS3 + yOffset3; + dotProd += xValues[xOffset4 + d1] * dyValues[yOffset4 + d2]; + } + } + } + } + dwValues[wOffset4 + d2] = dotProd; + } + } + } + } + } + return backend.makeTensorInfo(dw.shape, dw.dtype, dw.values); +} +const conv3DBackpropFilterV2Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Conv3DBackpropFilterV2"], + backendName: 'cpu', + kernelFunc: conv3DBackpropFilterV2 +}; +//# sourceMappingURL=Conv3DBackpropFilterV2.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js ***! + \*****************************************************************************************/ +/*! exports provided: conv3DBackpropInputV2, conv3DBackpropInputV2Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3DBackpropInputV2", function() { return conv3DBackpropInputV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3DBackpropInputV2Config", function() { return conv3DBackpropInputV2Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function conv3DBackpropInputV2(args) { + const { inputs, backend, attrs } = args; + const { dy, filter } = inputs; + const { pad, strides, inputShape } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([dy], 'conv3dBackpropInputV2'); + const dyStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(dy.shape); + const filterStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv3DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad); + const dx = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.inShape, 'float32'); + const dxValues = dx.values; + const [dxS0, dxS1, dxS2, dxS3] = dx.strides; + const dyValues = backend.data.get(dy.dataId).values; + const [dyS0, dyS1, dyS2, dyS3] = dyStrides; + const fltValues = backend.data.get(filter.dataId).values; + const [fltS0, fltS1, fltS2, fltS3] = filterStrides; + const { batchSize, filterDepth, filterHeight, filterWidth, inChannels, inDepth, inHeight, inWidth, outChannels, outDepth, outHeight, outWidth, strideDepth, strideHeight, strideWidth } = convInfo; + const frontPad = filterDepth - 1 - convInfo.padInfo.front; + const topPad = filterHeight - 1 - convInfo.padInfo.top; + const leftPad = filterWidth - 1 - convInfo.padInfo.left; + for (let b = 0; b < batchSize; ++b) { + for (let d1 = 0; d1 < inChannels; ++d1) { + // Frames of depth + for (let xF = 0; xF < inDepth; ++xF) { + const xFCorner = xF - frontPad; + const xFMin = Math.max(0, Math.ceil(xFCorner / strideDepth)); + const yFMax = Math.min(outDepth, (filterDepth + xFCorner) / strideDepth); + // Rows as per standard 2d matrix notation + for (let xR = 0; xR < inHeight; ++xR) { + const xRCorner = xR - topPad; + const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight)); + const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight); + // Columns as per standard 2d matrix notation + for (let xC = 0; xC < inWidth; ++xC) { + const xCCorner = xC - leftPad; + const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth)); + const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth); + let dotProd = 0; + for (let yF = xFMin; yF < yFMax; ++yF) { + const wF = yF * strideDepth - xFCorner; + for (let yR = xRMin; yR < yRMax; ++yR) { + const wR = yR * strideHeight - xRCorner; + for (let yC = xCMin; yC < yCMax; ++yC) { + const wC = yC * strideWidth - xCCorner; + const dyOffset = dyS0 * b + dyS1 * yF + dyS2 * yR + dyS3 * yC; + const fltOffset = fltS0 * (filterDepth - 1 - wF) + + fltS1 * (filterHeight - 1 - wR) + + fltS2 * (filterWidth - 1 - wC) + fltS3 * d1; + for (let d2 = 0; d2 < outChannels; ++d2) { + const pixel = dyValues[dyOffset + d2]; + const weight = fltValues[fltOffset + d2]; + dotProd += pixel * weight; + } + } + } + } + dxValues[dxS0 * b + dxS1 * xF + dxS2 * xR + dxS3 * xC + d1] = + dotProd; + } + } + } + } + } + return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values); +} +const conv3DBackpropInputV2Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Conv3DBackpropInputV2"], + backendName: 'cpu', + kernelFunc: conv3DBackpropInputV2 +}; +//# sourceMappingURL=Conv3DBackpropInputV2.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js ***! + \***********************************************************************/ +/*! exports provided: cos, cosConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cosConfig", function() { return cosConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const cos = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cos"], (xi) => Math.cos(xi)); +const cosConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cos"], + backendName: 'cpu', + kernelFunc: cos, +}; +//# sourceMappingURL=Cos.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js ***! + \************************************************************************/ +/*! exports provided: cosh, coshConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cosh", function() { return cosh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coshConfig", function() { return coshConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const cosh = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cosh"], (xi) => Math.cosh(xi)); +const coshConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cosh"], + backendName: 'cpu', + kernelFunc: cosh, +}; +//# sourceMappingURL=Cosh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js ***! + \*****************************************************************************************/ +/*! exports provided: depthwiseConv2dNative, depthwiseConv2dNativeConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNative", function() { return depthwiseConv2dNative; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNativeConfig", function() { return depthwiseConv2dNativeConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function depthwiseConv2dNative(args) { + const { inputs, backend, attrs } = args; + const { x, filter } = inputs; + const { strides, pad, dilations, dimRoundingMode } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, filter], 'depthwiseConv2DNative'); + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const filterStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape); + let $dilations = dilations; + if ($dilations == null) { + $dilations = [1, 1]; + } + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' + + `1. Got strides ${strides} and dilations '${$dilations}'`); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */); + const { filterHeight, filterWidth, dilationHeight, dilationWidth, padInfo } = convInfo; + const padLeft = padInfo.left; + const padTop = padInfo.top; + const chMul = convInfo.outChannels / convInfo.inChannels; + const y = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.outShape, x.dtype); + const xVals = backend.data.get(x.dataId).values; + const wVals = backend.data.get(filter.dataId).values; + const yVals = y.values; + for (let b = 0; b < convInfo.batchSize; ++b) { + const xOffset1 = b * xStrides[0]; + const yOffset1 = b * y.strides[0]; + for (let yR = 0; yR < convInfo.outHeight; ++yR) { + const yOffset2 = yOffset1 + yR * y.strides[1]; + const xRCorner = yR * convInfo.strideHeight - padLeft; + for (let wR = 0; wR < filterHeight; ++wR) { + const xR = xRCorner + wR * dilationHeight; + if (xR < 0 || xR >= convInfo.inHeight) { + continue; + } + const wOffset1 = wR * filterStrides[0]; + const xOffset2 = xOffset1 + xR * xStrides[1]; + for (let yC = 0; yC < convInfo.outWidth; ++yC) { + const yOffset3 = yOffset2 + yC * y.strides[2]; + const xCCorner = yC * convInfo.strideWidth - padTop; + for (let wC = 0; wC < filterWidth; ++wC) { + const xC = xCCorner + wC * dilationWidth; + if (xC < 0 || xC >= convInfo.inWidth) { + continue; + } + const wOffset2 = wOffset1 + wC * filterStrides[1]; + const xOffset3 = xOffset2 + xC * convInfo.inChannels; + let yOffset4 = yOffset3; + let wOffset3 = wOffset2; + for (let d1 = 0; d1 < convInfo.inChannels; ++d1) { + const xVal = xVals[xOffset3 + d1]; + for (let q = 0; q < chMul; ++q) { + yVals[yOffset4 + q] += xVal * wVals[wOffset3 + q]; + } + yOffset4 += chMul; + wOffset3 += chMul; + } + } + } + } + } + } + return backend.makeTensorInfo(y.shape, y.dtype, y.values); +} +const depthwiseConv2dNativeConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["DepthwiseConv2dNative"], + backendName: 'cpu', + kernelFunc: depthwiseConv2dNative +}; +//# sourceMappingURL=DepthwiseConv2dNative.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js ***! + \*******************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropFilter, depthwiseConv2dNativeBackpropFilterConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNativeBackpropFilter", function() { return depthwiseConv2dNativeBackpropFilter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNativeBackpropFilterConfig", function() { return depthwiseConv2dNativeBackpropFilterConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function depthwiseConv2dNativeBackpropFilter(args) { + const { inputs, backend, attrs } = args; + const { x, dy } = inputs; + const { strides, dilations, pad, dimRoundingMode, filterShape } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, dy], 'depthwiseConv2dNativeBackpropFilter'); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true /* depthwise */); + const { strideHeight, strideWidth, filterHeight, filterWidth } = convInfo; + const dW = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.filterShape, 'float32'); + const leftPad = convInfo.padInfo.left; + const topPad = convInfo.padInfo.top; + const chMul = convInfo.outChannels / convInfo.inChannels; + const xVals = backend.data.get(x.dataId).values; + const xBuf = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](x.shape, x.dtype, xVals); + const dyVals = backend.data.get(dy.dataId).values; + const dyBuf = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](dy.shape, dy.dtype, dyVals); + for (let wR = 0; wR < filterHeight; ++wR) { + const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight)); + const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight); + for (let wC = 0; wC < filterWidth; ++wC) { + const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth)); + const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth); + for (let d2 = 0; d2 < convInfo.outChannels; ++d2) { + const d1 = Math.trunc(d2 / chMul); + const dm = d2 % chMul; + let dotProd = 0; + for (let b = 0; b < convInfo.batchSize; ++b) { + for (let yR = yRMin; yR < yRMax; ++yR) { + const xR = wR + yR * strideHeight - topPad; + for (let yC = yCMin; yC < yCMax; ++yC) { + const xC = wC + yC * strideWidth - leftPad; + dotProd += xBuf.get(b, xR, xC, d1) * + dyBuf.get(b, yR, yC, d2); + } + } + } + dW.set(dotProd, wR, wC, d1, dm); + } + } + } + return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values); +} +const depthwiseConv2dNativeBackpropFilterConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["DepthwiseConv2dNativeBackpropFilter"], + backendName: 'cpu', + kernelFunc: depthwiseConv2dNativeBackpropFilter +}; +//# sourceMappingURL=DepthwiseConv2dNativeBackpropFilter.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js ***! + \******************************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeBackpropInput, depthwiseConv2dNativeBackpropInputConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNativeBackpropInput", function() { return depthwiseConv2dNativeBackpropInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNativeBackpropInputConfig", function() { return depthwiseConv2dNativeBackpropInputConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function depthwiseConv2dNativeBackpropInput(args) { + const { inputs, backend, attrs } = args; + const { dy, filter } = inputs; + const { strides, dilations, pad, dimRoundingMode, inputShape } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([dy, filter], 'depthwiseConv2DNativeBackpropInput'); + const dyStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(dy.shape); + const filterStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */); + const dx = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](convInfo.inShape, 'float32'); + const dxValues = dx.values; + const [dxS0, dxS1, dxS2] = dx.strides; + const dyValues = backend.data.get(dy.dataId).values; + const [dyS0, dyS1, dyS2] = dyStrides; + const fltValues = backend.data.get(filter.dataId).values; + const [fltS0, fltS1, fltS2] = filterStrides; + const { batchSize, filterHeight, filterWidth, inChannels, inHeight, inWidth, outChannels, outHeight, outWidth, strideHeight, strideWidth } = convInfo; + const topPad = filterHeight - 1 - convInfo.padInfo.top; + const leftPad = filterWidth - 1 - convInfo.padInfo.left; + const chMul = outChannels / inChannels; + for (let b = 0; b < batchSize; ++b) { + for (let d1 = 0; d1 < inChannels; ++d1) { + for (let xR = 0; xR < inHeight; ++xR) { + const xRCorner = xR - topPad; + const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight)); + const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight); + for (let xC = 0; xC < inWidth; ++xC) { + const xCCorner = xC - leftPad; + const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth)); + const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth); + let dotProd = 0; + for (let yR = xRMin; yR < yRMax; ++yR) { + const wR = yR * strideHeight - xRCorner; + for (let yC = xCMin; yC < yCMax; ++yC) { + const wC = yC * strideWidth - xCCorner; + const dyOffset = dyS0 * b + dyS1 * yR + dyS2 * yC; + const fltOffset = fltS0 * (filterHeight - 1 - wR) + + fltS1 * (filterWidth - 1 - wC) + fltS2 * d1; + for (let dm = 0; dm < chMul; ++dm) { + const d2 = d1 * chMul + dm; + const pixel = dyValues[dyOffset + d2]; + const weight = fltValues[fltOffset + dm]; + dotProd += pixel * weight; + } + } + } + dxValues[dxS0 * b + dxS1 * xR + dxS2 * xC + d1] = dotProd; + } + } + } + } + return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values); +} +const depthwiseConv2dNativeBackpropInputConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["DepthwiseConv2dNativeBackpropInput"], + backendName: 'cpu', + kernelFunc: depthwiseConv2dNativeBackpropInput +}; +//# sourceMappingURL=DepthwiseConv2dNativeBackpropInput.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js ***! + \******************************************************************************/ +/*! exports provided: dilation2dConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dilation2dConfig", function() { return dilation2dConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const dilation2dConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Dilation2D"], + backendName: 'cpu', + kernelFunc: ({ inputs, backend, attrs }) => { + const { x, filter } = inputs; + const { strides, pad, dilations } = attrs; + const cpuBackend = backend; + const xVals = cpuBackend.data.get(x.dataId).values; + const xRank = x.shape.length; + const filterVals = cpuBackend.data.get(filter.dataId).values; + const filterRank = filter.shape.length; + const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations); + const outSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape); + const outRank = outShape.length; + const outputVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getArrayFromDType(x.dtype, outSize); + // Upsampling the input by fill in `dilation size - 1` values between each + // input value. + // This implementation follows the TF c++ implementation: + // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc + for (let b = 0; b < batchSize; ++b) { + for (let hOut = 0; hOut < outHeight; ++hOut) { + const hBeg = hOut * strideHeight - padInfo.top; + for (let wOut = 0; wOut < outWidth; ++wOut) { + const wBeg = wOut * strideWidth - padInfo.left; + for (let d = 0; d < inChannels; ++d) { + let curVal = Number.MIN_SAFE_INTEGER; + for (let h = 0; h < filterHeight; ++h) { + const hIn = hBeg + h * dilationHeight; + if (hIn >= 0 && hIn < inHeight) { + for (let w = 0; w < filterWidth; ++w) { + const wIn = wBeg + w * dilationWidth; + if (wIn >= 0 && wIn < inWidth) { + const xIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex([b, hIn, wIn, d], xRank, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape)); + const filterIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex([h, w, d], filterRank, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(filter.shape)); + const val = xVals[xIndex] + filterVals[filterIndex]; + if (val > curVal) { + curVal = val; + } + } + } + } + } + const outputIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex([b, hOut, wOut, d], outRank, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(outShape)); + outputVals[outputIndex] = curVal; + } + } + } + } + const dataId = cpuBackend.write(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toTypedArray(outputVals, x.dtype), outShape, x.dtype); + return { dataId, shape: outShape, dtype: x.dtype }; + } +}; +//# sourceMappingURL=Dilation2D.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js ***! + \********************************************************************************************/ +/*! exports provided: dilation2dBackpropFilterConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dilation2dBackpropFilterConfig", function() { return dilation2dBackpropFilterConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const dilation2dBackpropFilterConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Dilation2DBackpropFilter"], + backendName: 'cpu', + kernelFunc: ({ inputs, backend, attrs }) => { + const { x, filter, dy } = inputs; + const { strides, pad, dilations } = attrs; + const cpuBackend = backend; + const $x = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values); + const $filter = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values); + const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(dy.rank === outShape.length, () => `Error in ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Dilation2DBackpropFilter"]}, dy ` + + `must have the same rank as output ${outShape.length}, but got ` + + `${dy.rank}`); + const $dy = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values); + // The computed filter gradients has the same dimensions as the filter: + // [filterHeight, filterWidth, depth] + const gradients = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].makeZerosNestedTypedArray(filter.shape, filter.dtype); + // In the case of multiple argmax branches, we only back-propagate along the + // last branch, i.e., the one with largest value of `h * filter_cols + w`, + // similarly to the max-pooling backward routines. + // This implementation follows the TF c++ implementation: + // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc + for (let b = 0; b < batchSize; ++b) { + for (let hOut = 0; hOut < outHeight; ++hOut) { + const hBeg = hOut * strideHeight - padInfo.top; + for (let wOut = 0; wOut < outWidth; ++wOut) { + const wBeg = wOut * strideWidth - padInfo.left; + for (let d = 0; d < inChannels; ++d) { + let curVal = Number.MIN_SAFE_INTEGER; + let hMax = 0; + let wMax = 0; + for (let h = 0; h < filterHeight; ++h) { + const hIn = hBeg + h * dilationHeight; + if (hIn >= 0 && hIn < inHeight) { + for (let w = 0; w < filterWidth; ++w) { + const wIn = wBeg + w * dilationWidth; + if (wIn >= 0 && wIn < inWidth) { + const val = $x[b][hIn][wIn][d] + $filter[h][w][d]; + if (val > curVal) { + curVal = val; + hMax = h; + wMax = w; + } + } + } + } + } + gradients[hMax][wMax][d] += $dy[b][hOut][wOut][d]; + } + } + } + } + const dataId = cpuBackend.write(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toTypedArray(gradients, x.dtype), filter.shape, filter.dtype); + return { dataId, shape: filter.shape, dtype: filter.dtype }; + } +}; +//# sourceMappingURL=Dilation2DBackpropFilter.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js ***! + \*******************************************************************************************/ +/*! exports provided: dilation2dBackpropInputConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dilation2dBackpropInputConfig", function() { return dilation2dBackpropInputConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const dilation2dBackpropInputConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Dilation2DBackpropInput"], + backendName: 'cpu', + kernelFunc: ({ inputs, backend, attrs }) => { + const { x, filter, dy } = inputs; + const { strides, pad, dilations } = attrs; + const cpuBackend = backend; + const $x = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values); + const $filter = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values); + const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(dy.rank === outShape.length, () => `Error in ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Dilation2DBackpropInput"]}, dy ` + + `must have the same rank as output ${outShape.length}, but got ` + + `${dy.rank}`); + const $dy = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values); + // The computed gradients has the same dimensions as the input: + // [batch, inputHeight, inputCols, inChannel] + const gradients = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].makeZerosNestedTypedArray(x.shape, x.dtype); + // In the case of multiple argmax branches, we only back-propagate along the + // last branch, i.e., the one with largest value of `h * filter_cols + w`, + // similarly to the max-pooling backward routines. + // This implementation follows the TF c++ implementation: + // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc + for (let b = 0; b < batchSize; ++b) { + for (let hOut = 0; hOut < outHeight; ++hOut) { + const hBeg = hOut * strideHeight - padInfo.top; + for (let wOut = 0; wOut < outWidth; ++wOut) { + const wBeg = wOut * strideWidth - padInfo.left; + for (let d = 0; d < inChannels; ++d) { + let curVal = Number.MIN_SAFE_INTEGER; + let hInMax = (hBeg < 0) ? 0 : hBeg; + let wInMax = (wBeg < 0) ? 0 : wBeg; + for (let h = 0; h < filterHeight; ++h) { + const hIn = hBeg + h * dilationHeight; + if (hIn >= 0 && hIn < inHeight) { + for (let w = 0; w < filterWidth; ++w) { + const wIn = wBeg + w * dilationWidth; + if (wIn >= 0 && wIn < inWidth) { + const val = $x[b][hIn][wIn][d] + $filter[h][w][d]; + if (val > curVal) { + curVal = val; + hInMax = hIn; + wInMax = wIn; + } + } + } + } + } + gradients[b][hInMax][wInMax][d] += $dy[b][hOut][wOut][d]; + } + } + } + } + const dataId = cpuBackend.write(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].toTypedArray(gradients, x.dtype), x.shape, x.dtype); + return { dataId, shape: x.shape, dtype: x.dtype }; + } +}; +//# sourceMappingURL=Dilation2DBackpropInput.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Div.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Div.js ***! + \***********************************************************************/ +/*! exports provided: divImpl, div, divConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divImpl", function() { return divImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "div", function() { return div; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divConfig", function() { return divConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/kernel_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const divImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])((a, b) => a / b); +const div = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["binaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Div"], divImpl); +const divConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Div"], + backendName: 'cpu', + kernelFunc: div +}; +//# sourceMappingURL=Div.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js ***! + \***********************************************************************/ +/*! exports provided: elu, eluConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elu", function() { return elu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eluConfig", function() { return eluConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const elu = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Elu"], (xi) => xi >= 0 ? xi : (Math.exp(xi) - 1)); +const eluConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Elu"], + backendName: 'cpu', + kernelFunc: elu, +}; +//# sourceMappingURL=Elu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js ***! + \***********************************************************************/ +/*! exports provided: erf, erfConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "erf", function() { return erf; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "erfConfig", function() { return erfConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const p = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_P; +const a1 = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A1; +const a2 = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A2; +const a3 = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A3; +const a4 = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A4; +const a5 = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A5; +const erf = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Erf"], (xi) => { + const sign = Math.sign(xi); + const v = Math.abs(xi); + const t = 1.0 / (1.0 + p * v); + return sign * + (1.0 - + (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * + Math.exp(-v * v)); +}); +const erfConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Erf"], + backendName: 'cpu', + kernelFunc: erf, +}; +//# sourceMappingURL=Erf.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js ***! + \***********************************************************************/ +/*! exports provided: expImpl, exp, expConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expImpl", function() { return expImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exp", function() { return exp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expConfig", function() { return expConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const expImpl = Object(_utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleUnaryImpl"])((xi) => Math.exp(xi)); +const exp = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__["unaryKernelFuncFromImpl"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Exp"], expImpl); +const expConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Exp"], + backendName: 'cpu', + kernelFunc: exp, +}; +//# sourceMappingURL=Exp.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js ***! + \*************************************************************************/ +/*! exports provided: expm1Impl, expm1, expm1Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expm1Impl", function() { return expm1Impl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expm1", function() { return expm1; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expm1Config", function() { return expm1Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const expm1Impl = Object(_utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleUnaryImpl"])((xi) => Math.expm1(xi)); +const expm1 = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__["unaryKernelFuncFromImpl"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Expm1"], expm1Impl); +const expm1Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Expm1"], + backendName: 'cpu', + kernelFunc: expm1, +}; +//# sourceMappingURL=Expm1.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js ***! + \***********************************************************************/ +/*! exports provided: fft, fftConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fft", function() { return fft; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fftConfig", function() { return fftConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_fft_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/fft_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function fft(args) { + const { inputs, backend } = args; + const { input } = inputs; + const inputSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(input.shape); + // Collapse all outer dimensions to a single batch dimension. + const innerDimensionSize = input.shape[input.shape.length - 1]; + const batch = inputSize / innerDimensionSize; + const input2D = Object(_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ + inputs: { x: input }, + backend, + attrs: { shape: [batch, innerDimensionSize] } + }); + const result = Object(_utils_fft_utils__WEBPACK_IMPORTED_MODULE_1__["fftBatch"])(input2D, false, backend); + const resultReshaped = Object(_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x: result }, backend, attrs: { shape: input.shape } }); + backend.disposeIntermediateTensorInfo(input2D); + backend.disposeIntermediateTensorInfo(result); + return resultReshaped; +} +const fftConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FFT"], + backendName: 'cpu', + kernelFunc: fft +}; +//# sourceMappingURL=FFT.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js ***! + \************************************************************************/ +/*! exports provided: fill, fillConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return fill; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillConfig", function() { return fillConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function fill(args) { + const { backend, attrs } = args; + const { shape, value, dtype } = attrs; + const $dtype = dtype || _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].inferDtype(value); + const values = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getArrayFromDType($dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(shape)); + fillValues(values, value, $dtype); + return backend.makeTensorInfo(shape, $dtype, values); +} +const fillConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Fill"], + backendName: 'cpu', + kernelFunc: fill +}; +function fillValues(values, value, dtype) { + if (dtype === 'string') { + values.fill(value); + } + else { + values.fill(value); + } +} +//# sourceMappingURL=Fill.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js ***! + \*********************************************************************************/ +/*! exports provided: flipLeftRightConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flipLeftRightConfig", function() { return flipLeftRightConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const flipLeftRightConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FlipLeftRight"], + backendName: 'cpu', + kernelFunc: ({ inputs, attrs, backend }) => { + const { image } = inputs; + const cpuBackend = backend; + const output = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(image.dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(image.shape)); + const [batch, imageHeight, imageWidth, numChannels] = image.shape; + const imageVals = cpuBackend.data.get(image.dataId).values; + for (let batchIdx = 0; batchIdx < batch; batchIdx++) { + const batchOffset = batchIdx * imageWidth * imageHeight * numChannels; + for (let row = 0; row < imageHeight; row++) { + const rowOffset = row * (imageWidth * numChannels); + for (let col = 0; col < imageWidth; col++) { + const colOffset = col * numChannels; + for (let channel = 0; channel < numChannels; channel++) { + const coords = [batch, row, col, channel]; + const x = coords[2]; + const coordX = Math.round(imageWidth - x); + const outIdx = batchOffset + rowOffset + colOffset + channel; + let outputValue = imageVals[outIdx]; + // If the coordinate position falls within the image boundaries... + if (coordX >= 0 && coordX < imageWidth) { + // set the output to the image value at the coordinate position. + const rotatedColOffset = coordX * numChannels; + const imageIdx = batchOffset + rowOffset + rotatedColOffset + channel; + outputValue = imageVals[imageIdx]; + } + output[outIdx] = outputValue; + } + } + } + } + const dataId = cpuBackend.write(output, image.shape, image.dtype); + return { dataId, shape: image.shape, dtype: image.dtype }; + } +}; +//# sourceMappingURL=FlipLeftRight.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js ***! + \*************************************************************************/ +/*! exports provided: floorImpl, floor, floorConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floorImpl", function() { return floorImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return floor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floorConfig", function() { return floorConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const floorImpl = Object(_utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleUnaryImpl"])((xi) => Math.floor(xi)); +const floor = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__["unaryKernelFuncFromImpl"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Floor"], floorImpl); +const floorConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Floor"], + backendName: 'cpu', + kernelFunc: floor, +}; +//# sourceMappingURL=Floor.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js ***! + \*******************************************************************************/ +/*! exports provided: fusedConv2D, fusedConv2DConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fusedConv2D", function() { return fusedConv2D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fusedConv2DConfig", function() { return fusedConv2DConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_fused_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/fused_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"); +/* harmony import */ var _Add__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Add */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"); +/* harmony import */ var _Conv2D__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Conv2D */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function fusedConv2D(args) { + const { inputs, backend, attrs } = args; + const { x, filter, bias, preluActivationWeights } = inputs; + const { strides, pad, dataFormat, dilations, dimRoundingMode, activation } = attrs; + let result = Object(_Conv2D__WEBPACK_IMPORTED_MODULE_3__["conv2D"])({ + inputs: { x, filter }, + backend, + attrs: { strides, pad, dataFormat, dilations, dimRoundingMode } + }); + if (bias) { + const resultOld = result; + result = Object(_Add__WEBPACK_IMPORTED_MODULE_2__["add"])({ inputs: { a: result, b: bias }, backend }); + backend.disposeIntermediateTensorInfo(resultOld); + } + if (activation) { + const resultOld = result; + result = + Object(_utils_fused_utils__WEBPACK_IMPORTED_MODULE_1__["applyActivation"])(backend, result, activation, preluActivationWeights); + backend.disposeIntermediateTensorInfo(resultOld); + } + return result; +} +const fusedConv2DConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FusedConv2D"], + backendName: 'cpu', + kernelFunc: fusedConv2D +}; +//# sourceMappingURL=FusedConv2D.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js ***! + \****************************************************************************************/ +/*! exports provided: fusedDepthwiseConv2D, fusedDepthwiseConv2DConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fusedDepthwiseConv2D", function() { return fusedDepthwiseConv2D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fusedDepthwiseConv2DConfig", function() { return fusedDepthwiseConv2DConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_fused_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/fused_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"); +/* harmony import */ var _Add__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Add */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"); +/* harmony import */ var _DepthwiseConv2dNative__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DepthwiseConv2dNative */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function fusedDepthwiseConv2D(args) { + const { inputs, backend, attrs } = args; + const { x, filter, bias, preluActivationWeights } = inputs; + const { strides, pad, dataFormat, dilations, dimRoundingMode, activation } = attrs; + let result = Object(_DepthwiseConv2dNative__WEBPACK_IMPORTED_MODULE_3__["depthwiseConv2dNative"])({ + inputs: { x, filter }, + backend, + attrs: { strides, pad, dataFormat, dilations, dimRoundingMode } + }); + if (bias) { + const oldResult = result; + result = Object(_Add__WEBPACK_IMPORTED_MODULE_2__["add"])({ inputs: { a: result, b: bias }, backend }); + backend.disposeIntermediateTensorInfo(oldResult); + } + if (activation) { + const oldResult = result; + result = + Object(_utils_fused_utils__WEBPACK_IMPORTED_MODULE_1__["applyActivation"])(backend, result, activation, preluActivationWeights); + backend.disposeIntermediateTensorInfo(oldResult); + } + return result; +} +const fusedDepthwiseConv2DConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FusedDepthwiseConv2D"], + backendName: 'cpu', + kernelFunc: fusedDepthwiseConv2D +}; +//# sourceMappingURL=FusedDepthwiseConv2D.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js ***! + \************************************************************************/ +/*! exports provided: ifft, ifftConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ifft", function() { return ifft; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ifftConfig", function() { return ifftConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_fft_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/fft_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function ifft(args) { + const { inputs, backend } = args; + const { input } = inputs; + const inputSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(input.shape); + // Collapse all outer dimensions to a single batch dimension. + const innerDimensionSize = input.shape[input.shape.length - 1]; + const batch = inputSize / innerDimensionSize; + const input2D = Object(_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ + inputs: { x: input }, + backend, + attrs: { shape: [batch, innerDimensionSize] } + }); + const result = Object(_utils_fft_utils__WEBPACK_IMPORTED_MODULE_1__["fftBatch"])(input2D, true, backend); + const resultReshaped = Object(_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x: result }, backend, attrs: { shape: input.shape } }); + backend.disposeIntermediateTensorInfo(input2D); + backend.disposeIntermediateTensorInfo(result); + return resultReshaped; +} +const ifftConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IFFT"], + backendName: 'cpu', + kernelFunc: ifft +}; +//# sourceMappingURL=IFFT.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js ***! + \****************************************************************************/ +/*! exports provided: identity, identityConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identityConfig", function() { return identityConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function identity(args) { + const { inputs, backend } = args; + const { x } = inputs; + backend.incRef(x.dataId); + return { dataId: x.dataId, shape: x.shape, dtype: x.dtype }; +} +const identityConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Identity"], + backendName: 'cpu', + kernelFunc: identity +}; +//# sourceMappingURL=Identity.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js ***! + \************************************************************************/ +/*! exports provided: imag, imagConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imag", function() { return imag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imagConfig", function() { return imagConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function imag(args) { + const { inputs, backend } = args; + const { input } = inputs; + const imag = backend.data.get(input.dataId).complexTensorInfos.imag; + const imagVal = backend.data.get(imag.dataId).values; + // When complex tensor is disposed, its underlying parts will be disposed too. + // Make new tensor out of the imag value of the complex. This makes sure the + // value is still accessible even if complex tensor is disposed. + return backend.makeTensorInfo(imag.shape, imag.dtype, imagVal); +} +const imagConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Imag"], + backendName: 'cpu', + kernelFunc: imag +}; +//# sourceMappingURL=Imag.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js ***! + \****************************************************************************/ +/*! exports provided: isFinite, isFiniteConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFinite", function() { return isFinite; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFiniteConfig", function() { return isFiniteConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const isFinite = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IsFinite"], (xi) => Number.isFinite(xi) ? 1 : 0, 'bool'); +const isFiniteConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IsFinite"], + backendName: 'cpu', + kernelFunc: isFinite, +}; +//# sourceMappingURL=IsFinite.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js ***! + \*************************************************************************/ +/*! exports provided: isInf, isInfConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInf", function() { return isInf; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInfConfig", function() { return isInfConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const isInf = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IsInf"], (xi) => Math.abs(xi) === Infinity ? 1 : 0, 'bool'); +const isInfConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IsInf"], + backendName: 'cpu', + kernelFunc: isInf, +}; +//# sourceMappingURL=IsInf.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js ***! + \*************************************************************************/ +/*! exports provided: isNaN, isNaNConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNaN", function() { return isNaN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNaNConfig", function() { return isNaNConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const isNaN = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IsNan"], (xi) => Number.isNaN(xi) ? 1 : 0, 'bool'); +const isNaNConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IsNan"], + backendName: 'cpu', + kernelFunc: isNaN, +}; +//# sourceMappingURL=IsNaN.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js ***! + \***********************************************************************/ +/*! exports provided: logImpl, log, logConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logImpl", function() { return logImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logConfig", function() { return logConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const logImpl = Object(_utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleUnaryImpl"])((xi) => Math.log(xi)); +const log = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__["unaryKernelFuncFromImpl"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Log"], logImpl); +const logConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Log"], + backendName: 'cpu', + kernelFunc: log, +}; +//# sourceMappingURL=Log.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js ***! + \*************************************************************************/ +/*! exports provided: log1p, log1pConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log1p", function() { return log1p; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log1pConfig", function() { return log1pConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const log1p = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Log1p"], (xi) => Math.log1p(xi)); +const log1pConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Log1p"], + backendName: 'cpu', + kernelFunc: log1p, +}; +//# sourceMappingURL=Log1p.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js ***! + \******************************************************************************/ +/*! exports provided: logicalNot, logicalNotConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logicalNot", function() { return logicalNot; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logicalNotConfig", function() { return logicalNotConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const logicalNot = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["LogicalNot"], (xi) => xi ? 0 : 1, 'bool'); +const logicalNotConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["LogicalNot"], + backendName: 'cpu', + kernelFunc: logicalNot, +}; +//# sourceMappingURL=LogicalNot.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js ***! + \***********************************************************************/ +/*! exports provided: maxConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxConfig", function() { return maxConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _Max_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Max_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js"); +/* harmony import */ var _Transpose_impl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Transpose_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +const maxConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Max"], + backendName: 'cpu', + kernelFunc: ({ inputs, attrs, backend }) => { + const { x } = inputs; + const { reductionIndices, keepDims } = attrs; + const cpuBackend = backend; + let xShape = x.shape; + const xRank = xShape.length; + const origAxes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam(reductionIndices, xShape); + let axes = origAxes; + const permutedAxes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getAxesPermutation(axes, xRank); + let xVals = cpuBackend.data.get(x.dataId).values; + if (permutedAxes != null) { + const newShape = new Array(xRank); + for (let i = 0; i < newShape.length; i++) { + newShape[i] = xShape[permutedAxes[i]]; + } + xVals = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_3__["transposeImpl"])(xVals, xShape, x.dtype, permutedAxes, newShape); + axes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getInnerMostAxes(axes.length, xRank); + xShape = newShape; + } + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'max'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('max', axes, xRank); + const [maxOutShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(xShape, axes); + const reduceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const result = Object(_Max_impl__WEBPACK_IMPORTED_MODULE_2__["maxImpl"])(xVals, reduceSize, maxOutShape, x.dtype); + const dataId = cpuBackend.write(result, maxOutShape, x.dtype); + let outShape = maxOutShape; + if (keepDims) { + // reshape + const newShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].expandShapeToKeepDim(maxOutShape, origAxes); + outShape = newShape; + } + return { dataId, shape: outShape, dtype: x.dtype }; + } +}; +//# sourceMappingURL=Max.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js ***! + \***************************************************************************/ +/*! exports provided: maxPool, maxPoolConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPool", function() { return maxPool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolConfig", function() { return maxPoolConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _utils_pool_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/pool_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function maxPool(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'maxPool'); + const { filterSize, strides, pad, dimRoundingMode } = attrs; + const dilations = 1; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode); + let res; + if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(convInfo.inShape, convInfo.outShape)) { + res = Object(_Identity__WEBPACK_IMPORTED_MODULE_3__["identity"])({ inputs: { x }, backend }); + } + else { + const xValues = backend.data.get(x.dataId).values; + const strides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const buffer = Object(_utils_pool_utils__WEBPACK_IMPORTED_MODULE_2__["pool"])(xValues, x.shape, x.dtype, strides, convInfo, 'max'); + res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values); + } + return res; +} +const maxPoolConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MaxPool"], + backendName: 'cpu', + kernelFunc: maxPool +}; +//# sourceMappingURL=MaxPool.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolBackprop.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolBackprop.js ***! + \***********************************************************************************/ +/*! exports provided: maxPoolBackprop, maxPoolBackpropConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolBackprop", function() { return maxPoolBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolBackpropConfig", function() { return maxPoolBackpropConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _utils_pool_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/pool_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function maxPoolBackprop(args) { + const { inputs, backend, attrs } = args; + const { dy, input, output } = inputs; + const x = input; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([input, output], 'maxPoolBackprop'); + const { filterSize, strides, pad, dimRoundingMode } = attrs; + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode); + const xValues = backend.data.get(x.dataId).values; + const maxPosBuf = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(convInfo.outShape, x.dtype, Object(_utils_pool_utils__WEBPACK_IMPORTED_MODULE_2__["maxPoolPositions"])(xValues, x.shape, x.dtype, convInfo).values); + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const dx = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(x.shape, 'float32'); + const dyData = backend.data.get(dy.dataId).values; + const dyBuf = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(dy.shape, 'float32', dyData); + for (let b = 0; b < convInfo.batchSize; ++b) { + for (let d = 0; d < convInfo.inChannels; ++d) { + for (let dxR = 0; dxR < convInfo.inHeight; ++dxR) { + for (let dxC = 0; dxC < convInfo.inWidth; ++dxC) { + // Shader code begins. + const dyRCorner = dxR - padTop; + const dyCCorner = dxC - padLeft; + let dotProd = 0; + for (let wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) { + const dyR = (dyRCorner + wR) / strideHeight; + if (dyR < 0 || dyR >= convInfo.outHeight || + Math.floor(dyR) !== dyR) { + continue; + } + for (let wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) { + const dyC = (dyCCorner + wC) / strideWidth; + if (dyC < 0 || dyC >= convInfo.outWidth || + Math.floor(dyC) !== dyC) { + continue; + } + const maxPos = effectiveFilterHeight * effectiveFilterWidth - 1 - + maxPosBuf.get(b, dyR, dyC, d); + const curPos = wR * effectiveFilterWidth + wC; + const mask = maxPos === curPos ? 1 : 0; + if (mask === 0) { + continue; + } + const pixel = dyBuf.get(b, dyR, dyC, d); + dotProd += pixel * mask; + } + } + dx.set(dotProd, b, dxR, dxC, d); + } + } + } + } + return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values); +} +const maxPoolBackpropConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MaxPoolBackprop"], + backendName: 'cpu', + kernelFunc: maxPoolBackprop +}; +//# sourceMappingURL=MaxPoolBackprop.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolWithArgmaxConfig", function() { return maxPoolWithArgmaxConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _MaxPoolWithArgmax_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MaxPoolWithArgmax_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const maxPoolWithArgmaxConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MaxPoolWithArgmax"], + backendName: 'cpu', + kernelFunc: ({ inputs, attrs, backend }) => { + const { x } = inputs; + const { filterSize, strides, pad, includeBatchInIndex } = attrs; + const cpuBackend = backend; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'MaxPoolWithArgmax'); + const values = cpuBackend.data.get(x.dataId).values; + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, [1, 1], pad); + const [pooled, indexes] = Object(_MaxPoolWithArgmax_impl__WEBPACK_IMPORTED_MODULE_2__["maxPoolWithArgmaxImpl"])(values, x.shape, x.dtype, includeBatchInIndex, convInfo); + const pooledDataId = cpuBackend.write(pooled, convInfo.outShape, x.dtype); + const indexesDataId = cpuBackend.write(indexes, convInfo.outShape, x.dtype); + return [ + { dataId: pooledDataId, shape: convInfo.outShape, dtype: x.dtype }, + { dataId: indexesDataId, shape: convInfo.outShape, dtype: 'int32' } + ]; + } +}; +//# sourceMappingURL=MaxPoolWithArgmax.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \******************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolWithArgmaxImpl", function() { return maxPoolWithArgmaxImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_pool_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/pool_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function maxPoolWithArgmaxImpl(xValues, xShape, dtype, includeBatchInIndex, convInfo) { + const strides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(xShape); + const maxPools = Object(_utils_pool_utils__WEBPACK_IMPORTED_MODULE_1__["pool"])(xValues, xShape, dtype, strides, convInfo, 'max'); + const maxPositions = Object(_utils_pool_utils__WEBPACK_IMPORTED_MODULE_1__["maxPoolPositions"])(xValues, xShape, dtype, convInfo, true, includeBatchInIndex); + return [maxPools.values, maxPositions.values]; +} +//# sourceMappingURL=MaxPoolWithArgmax_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js ***! + \****************************************************************************/ +/*! exports provided: maxImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxImpl", function() { return maxImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function maxImpl(aVals, reduceSize, outShape, dtype) { + const vals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape)); + for (let i = 0; i < vals.length; ++i) { + const offset = i * reduceSize; + let max = aVals[offset]; + for (let j = 0; j < reduceSize; ++j) { + const value = aVals[offset + j]; + if (value > max) { + max = value; + } + } + vals[i] = max; + } + return vals; +} +//# sourceMappingURL=Max_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js ***! + \*****************************************************************************/ +/*! exports provided: mirrorPad, mirrorPadConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mirrorPad", function() { return mirrorPad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mirrorPadConfig", function() { return mirrorPadConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function mirrorPad(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { paddings, mode } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'mirrorPad'); + const outShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */); + const start = paddings.map(p => p[0]); + const end = paddings.map((p, i) => p[0] + x.shape[i]); + const offset = mode === 'reflect' ? 0 : 1; + const xVals = backend.data.get(x.dataId).values; + const xRank = x.shape.length; + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const resultSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape); + const resultRank = outShape.length; + const resultStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(outShape); + const resVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(x.dtype, resultSize); + for (let i = 0; i < resultSize; i++) { + let coords = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].indexToLoc(i, resultRank, resultStrides); + for (let i = 0; i < resultRank; i++) { + if (coords[i] < start[i]) { + coords[i] = start[i] * 2 - coords[i] - offset; + } + else if (coords[i] >= end[i]) { + coords[i] = (end[i] - 1) * 2 - coords[i] + offset; + } + } + coords = coords.map((c, i) => c - start[i]); + const inIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(coords, xRank, xStrides); + resVals[i] = xVals[inIndex]; + } + const outId = backend.write(resVals, outShape, x.dtype); + return { dataId: outId, shape: outShape, dtype: x.dtype }; +} +const mirrorPadConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MirrorPad"], + backendName: 'cpu', + kernelFunc: mirrorPad +}; +//# sourceMappingURL=MirrorPad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js ***! + \****************************************************************************/ +/*! exports provided: multiplyImpl, multiplyComplexImpl, multiply, multiplyConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiplyImpl", function() { return multiplyImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiplyComplexImpl", function() { return multiplyComplexImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiply", function() { return multiply; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiplyConfig", function() { return multiplyConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/kernel_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const multiplyImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])(((aValue, bValue) => aValue * bValue)); +const multiplyComplexImpl = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["createComplexBinaryKernelImpl"])(((aReal, aImag, bReal, bImag) => { + return { + real: aReal * bReal - aImag * bImag, + imag: aReal * bImag + aImag * bReal + }; +})); +const multiply = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["binaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Multiply"], multiplyImpl, multiplyComplexImpl); +const multiplyConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Multiply"], + backendName: 'cpu', + kernelFunc: multiply +}; +//# sourceMappingURL=Multiply.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV4Config", function() { return nonMaxSuppressionV4Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const nonMaxSuppressionV4Impl = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["kernel_impls"].nonMaxSuppressionV4Impl; + +const nonMaxSuppressionV4Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NonMaxSuppressionV4"], + backendName: 'cpu', + kernelFunc: ({ inputs, backend, attrs }) => { + const { boxes, scores } = inputs; + const { maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize } = attrs; + const cpuBackend = backend; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(boxes, 'NonMaxSuppressionPadded'); + const boxesVals = cpuBackend.data.get(boxes.dataId).values; + const scoresVals = cpuBackend.data.get(scores.dataId).values; + const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize); + return [selectedIndices, validOutputs]; + } +}; +//# sourceMappingURL=NonMaxSuppressionV4.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js ***! + \***************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV5Config", function() { return nonMaxSuppressionV5Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const nonMaxSuppressionV5Impl = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["kernel_impls"].nonMaxSuppressionV5Impl; + +const nonMaxSuppressionV5Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NonMaxSuppressionV5"], + backendName: 'cpu', + kernelFunc: ({ inputs, backend, attrs }) => { + const { boxes, scores } = inputs; + const { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = attrs; + const cpuBackend = backend; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(boxes, 'NonMaxSuppressionWithScore'); + const boxesVals = cpuBackend.data.get(boxes.dataId).values; + const scoresVals = cpuBackend.data.get(scores.dataId).values; + const maxOutputSizeVal = maxOutputSize; + const iouThresholdVal = iouThreshold; + const scoreThresholdVal = scoreThreshold; + const softNmsSigmaVal = softNmsSigma; + const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal); + return [selectedIndices, selectedScores]; + } +}; +//# sourceMappingURL=NonMaxSuppressionV5.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js ***! + \****************************************************************************/ +/*! exports provided: notEqualImpl, notEqual, notEqualConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqualImpl", function() { return notEqualImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqual", function() { return notEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqualConfig", function() { return notEqualConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/kernel_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const notEqualImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])(((a, b) => (a !== b) ? 1 : 0)); +const notEqual = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["binaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NotEqual"], notEqualImpl, null /* complexOp */, 'bool'); +const notEqualConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NotEqual"], + backendName: 'cpu', + kernelFunc: notEqual +}; +//# sourceMappingURL=NotEqual.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js ***! + \*************************************************************************/ +/*! exports provided: padV2, padV2Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "padV2", function() { return padV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "padV2Config", function() { return padV2Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function padV2(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { paddings, constantValue } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'pad'); + const outShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */); + const start = paddings.map(p => p[0]); + const xVals = backend.data.get(x.dataId).values; + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + const xRank = x.shape.length; + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(x.shape); + const resultSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape); + const resultRank = outShape.length; + const resultStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(outShape); + const resVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(x.dtype, resultSize); + if (constantValue !== 0) { + resVals.fill(constantValue); + } + for (let i = 0; i < xSize; i++) { + const coords = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].indexToLoc(i, xRank, xStrides); + const outCoords = coords.map((c, i) => c + start[i]); + const outIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(outCoords, resultRank, resultStrides); + resVals[outIndex] = xVals[i]; + } + const outId = backend.write(resVals, outShape, x.dtype); + return { dataId: outId, shape: outShape, dtype: x.dtype }; +} +const padV2Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["PadV2"], + backendName: 'cpu', + kernelFunc: padV2 +}; +//# sourceMappingURL=PadV2.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js ***! + \*************************************************************************/ +/*! exports provided: prelu, preluConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prelu", function() { return prelu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "preluConfig", function() { return preluConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const preluImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_2__["createSimpleBinaryKernelImpl"])((xValue, aValue) => xValue < 0 ? aValue * xValue : xValue); +function prelu(args) { + const { inputs, backend } = args; + const { x, alpha } = inputs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x, alpha], 'prelu'); + const aVals = backend.data.get(x.dataId).values; + const bVals = backend.data.get(alpha.dataId).values; + const [resultData, resultShape] = preluImpl(x.shape, alpha.shape, aVals, bVals, x.dtype); + return backend.makeTensorInfo(resultShape, x.dtype, resultData); +} +const preluConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Prelu"], + backendName: 'cpu', + kernelFunc: prelu, +}; +//# sourceMappingURL=Prelu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js ***! + \************************************************************************/ +/*! exports provided: real, realConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "real", function() { return real; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "realConfig", function() { return realConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function real(args) { + const { inputs, backend } = args; + const { input } = inputs; + const real = backend.data.get(input.dataId).complexTensorInfos.real; + const realVal = backend.data.get(real.dataId).values; + // When complex tensor is disposed, its underlying parts will be disposed too. + // Make new tensor out of the real value of the complex. This makes sure the + // value is still accessible even if complex tensor is disposed. + return backend.makeTensorInfo(real.shape, real.dtype, realVal); +} +const realConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Real"], + backendName: 'cpu', + kernelFunc: real +}; +//# sourceMappingURL=Real.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js ***! + \******************************************************************************/ +/*! exports provided: reciprocal, reciprocalConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reciprocal", function() { return reciprocal; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reciprocalConfig", function() { return reciprocalConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const reciprocal = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Reciprocal"], (xi) => 1 / xi); +const reciprocalConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Reciprocal"], + backendName: 'cpu', + kernelFunc: reciprocal, +}; +//# sourceMappingURL=Reciprocal.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js ***! + \************************************************************************/ +/*! exports provided: relu, reluConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relu", function() { return relu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reluConfig", function() { return reluConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const relu = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Relu"], (xi) => Math.max(0, xi)); +const reluConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Relu"], + backendName: 'cpu', + kernelFunc: relu, +}; +//# sourceMappingURL=Relu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js ***! + \*************************************************************************/ +/*! exports provided: relu6, relu6Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relu6", function() { return relu6; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relu6Config", function() { return relu6Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const relu6 = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Relu6"], (xi) => Math.min(Math.max(0, xi), 6)); +const relu6Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Relu6"], + backendName: 'cpu', + kernelFunc: relu6, +}; +//# sourceMappingURL=Relu6.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js ***! + \***************************************************************************/ +/*! exports provided: reshape, reshapeConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshape", function() { return reshape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshapeConfig", function() { return reshapeConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function reshape(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { shape } = attrs; + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + const $shape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].inferFromImplicitShape(shape, xSize); + const $xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape($shape); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(xSize === $xSize, () => `The new shape (${$shape}) has ${$xSize} elements and the old ` + + `shape (${x.shape}) has ${xSize} elements. The new shape and old ` + + `shape must have the same number of elements.`); + backend.incRef(x.dataId); + const xData = backend.data.get(x.dataId); + if (xData.complexTensorInfos != null) { + const real = xData.complexTensorInfos.real; + const imag = xData.complexTensorInfos.imag; + real.shape = $shape; + imag.shape = $shape; + } + return { dataId: x.dataId, shape: $shape, dtype: x.dtype }; +} +const reshapeConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Reshape"], + backendName: 'cpu', + kernelFunc: reshape +}; +//# sourceMappingURL=Reshape.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js ***! + \************************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateWithOffsetConfig", function() { return rotateWithOffsetConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const rotateWithOffsetConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["RotateWithOffset"], + backendName: 'cpu', + kernelFunc: ({ inputs, attrs, backend }) => { + const { image } = inputs; + const { radians, fillValue, center } = attrs; + const cpuBackend = backend; + const output = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(image.dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(image.shape)); + const [batch, imageHeight, imageWidth, numChannels] = image.shape; + const [centerX, centerY] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getImageCenter(center, imageHeight, imageWidth); + const fullOpacityValue = 255; + const sinFactor = Math.sin(radians); + const cosFactor = Math.cos(radians); + const imageVals = cpuBackend.data.get(image.dataId).values; + for (let batchIdx = 0; batchIdx < batch; batchIdx++) { + const batchOffset = batchIdx * imageWidth * imageHeight * numChannels; + for (let row = 0; row < imageHeight; row++) { + const rowOffset = row * (imageWidth * numChannels); + for (let col = 0; col < imageWidth; col++) { + const colOffset = col * numChannels; + for (let channel = 0; channel < numChannels; channel++) { + const coords = [batch, row, col, channel]; + const x = coords[2]; + const y = coords[1]; + // coordX/coordY are the result of rotating and translating x/y. + let coordX = (x - centerX) * cosFactor - (y - centerY) * sinFactor; + let coordY = (x - centerX) * sinFactor + (y - centerY) * cosFactor; + coordX = Math.round(coordX + centerX); + coordY = Math.round(coordY + centerY); + let outputValue = fillValue; + if (typeof fillValue !== 'number') { + if (channel === 3) { + outputValue = fullOpacityValue; + } + else { + outputValue = fillValue[channel]; + } + } + // If the coordinate position falls within the image boundaries... + if (coordX >= 0 && coordX < imageWidth && coordY >= 0 && + coordY < imageHeight) { + // set the output to the image value at the coordinate position. + const rotatedRowOffset = coordY * (imageWidth * numChannels); + const rotatedColOffset = coordX * numChannels; + const imageIdx = batchOffset + rotatedRowOffset + rotatedColOffset + channel; + outputValue = imageVals[imageIdx]; + } + const outIdx = batchOffset + rowOffset + colOffset + channel; + output[outIdx] = outputValue; + } + } + } + } + const dataId = cpuBackend.write(output, image.shape, image.dtype); + return { dataId, shape: image.shape, dtype: image.dtype }; + } +}; +//# sourceMappingURL=RotateWithOffset.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js ***! + \*************************************************************************/ +/*! exports provided: round, roundConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "round", function() { return round; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "roundConfig", function() { return roundConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const round = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Round"], (xi) => { + // The algorithm is based on banker's rounding. + const base = Math.floor(xi); + if (xi - base < 0.5) { + return Math.floor(xi); + } + else if (xi - base > 0.5) { + return Math.ceil(xi); + } + else { + if (base % 2.0 === 0.0) { + return base; + } + else { + return base + 1.0; + } + } +}); +const roundConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Round"], + backendName: 'cpu', + kernelFunc: round, +}; +//# sourceMappingURL=Round.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js ***! + \*************************************************************************/ +/*! exports provided: rsqrtImpl, rsqrt, rsqrtConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rsqrtImpl", function() { return rsqrtImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rsqrt", function() { return rsqrt; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rsqrtConfig", function() { return rsqrtConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const rsqrtImpl = Object(_utils_unary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleUnaryImpl"])((xi) => 1 / Math.sqrt(xi)); +const rsqrt = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_2__["unaryKernelFuncFromImpl"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Rsqrt"], rsqrtImpl); +const rsqrtConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Rsqrt"], + backendName: 'cpu', + kernelFunc: rsqrt, +}; +//# sourceMappingURL=Rsqrt.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js ***! + \************************************************************************/ +/*! exports provided: selu, seluConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "selu", function() { return selu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "seluConfig", function() { return seluConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const scaleAlpha = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].SELU_SCALEALPHA; +const scale = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].SELU_SCALE; +const selu = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Selu"], (xi) => { + if (xi >= 0) { + return scale * xi; + } + else { + return scaleAlpha * (Math.exp(xi) - 1); + } +}); +const seluConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Selu"], + backendName: 'cpu', + kernelFunc: selu, +}; +//# sourceMappingURL=Selu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js ***! + \***************************************************************************/ +/*! exports provided: sigmoid, sigmoidConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sigmoid", function() { return sigmoid; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sigmoidConfig", function() { return sigmoidConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const sigmoid = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sigmoid"], (xi) => 1 / (1 + Math.exp(-xi))); +const sigmoidConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sigmoid"], + backendName: 'cpu', + kernelFunc: sigmoid, +}; +//# sourceMappingURL=Sigmoid.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js ***! + \************************************************************************/ +/*! exports provided: sign, signConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sign", function() { return sign; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "signConfig", function() { return signConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const sign = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sign"], (xi) => { + if (xi < 0) { + return -1; + } + else if (xi > 0) { + return 1; + } + else { + return 0; + } +}); +const signConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sign"], + backendName: 'cpu', + kernelFunc: sign, +}; +//# sourceMappingURL=Sign.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js ***! + \***********************************************************************/ +/*! exports provided: sin, sinConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinConfig", function() { return sinConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const sin = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sin"], (xi) => Math.sin(xi)); +const sinConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sin"], + backendName: 'cpu', + kernelFunc: sin, +}; +//# sourceMappingURL=Sin.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js ***! + \************************************************************************/ +/*! exports provided: sinh, sinhConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinh", function() { return sinh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinhConfig", function() { return sinhConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const sinh = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sinh"], (xi) => Math.sinh(xi)); +const sinhConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sinh"], + backendName: 'cpu', + kernelFunc: sinh, +}; +//# sourceMappingURL=Sinh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js ***! + \*************************************************************************/ +/*! exports provided: sliceImpl, slice, sliceConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sliceImpl", function() { return sliceImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sliceConfig", function() { return sliceConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function sliceImpl(vals, begin, size, shape, dtype) { + const isContinous = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["slice_util"].isSliceContinous(shape, begin, size); + const length = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(size); + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(shape); + if (isContinous) { + const flatOffset = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["slice_util"].computeFlatOffset(begin, xStrides); + return vals.subarray(flatOffset, flatOffset + length); + } + const outVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(dtype, length); + for (let i = 0; i < length; ++i) { + const rank = size.length; + const strides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(size); + const loc = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].indexToLoc(i, rank, strides); + const xLoc = loc.map((idx, j) => idx + begin[j]); + const xIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(xLoc, shape.length, xStrides); + outVals[i] = vals[xIndex]; + } + return outVals; +} +function slice(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { begin, size } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'slice'); + const [$begin, $size] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["slice_util"].parseSliceParams(x, begin, size); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["slice_util"].assertParamsValid(x, $begin, $size); + const vals = backend.data.get(x.dataId).values; + const outVals = sliceImpl(vals, $begin, $size, x.shape, x.dtype); + return backend.makeTensorInfo($size, x.dtype, outVals); +} +const sliceConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Slice"], + backendName: 'cpu', + kernelFunc: slice +}; +//# sourceMappingURL=Slice.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js ***! + \****************************************************************************/ +/*! exports provided: softplus, softplusConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "softplus", function() { return softplus; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "softplusConfig", function() { return softplusConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +// mirrors the implementation of tf.nn.softplus: https://goo.gl/vkcvwX +// epsilon is the difference between 1.0 and the next representable float. +// For a single precision 32 bit float this should be 2^-23, see: +// https://math.byu.edu/~schow/work/IEEEFloatingPoint.htm +const epsilon = 1.1920928955078125e-7; +const threshold = Math.log(epsilon) + 2.0; +const softplus = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Softplus"], (xi) => { + // Value above which exp(x) may overflow, but softplus(x) == x + // is within machine epsilon. + const tooLarge = xi > -threshold; + // Value below which exp(x) may underflow, but softplus(x) == exp(x) + // is within machine epsilon. + const tooSmall = xi < threshold; + const expX = Math.exp(xi); + let result; + if (tooSmall) { + result = expX; + } + else if (tooLarge) { + result = xi; + } + else { + result = Math.log(1.0 + expX); + } + return result; +}); +const softplusConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Softplus"], + backendName: 'cpu', + kernelFunc: softplus, +}; +//# sourceMappingURL=Softplus.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js ***! + \**********************************************************************************/ +/*! exports provided: spaceToBatchND, spaceToBatchNDConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spaceToBatchND", function() { return spaceToBatchND; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spaceToBatchNDConfig", function() { return spaceToBatchNDConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _PadV2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./PadV2 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/* harmony import */ var _Transpose__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Transpose */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +function spaceToBatchND(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { blockShape, paddings } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([x], 'spaceToBatchND'); + const prod = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(blockShape); + const completePaddings = [[0, 0]]; + completePaddings.push(...paddings); + for (let i = 1 + blockShape.length; i < x.shape.length; ++i) { + completePaddings.push([0, 0]); + } + const paddedX = _PadV2__WEBPACK_IMPORTED_MODULE_2__["padV2Config"].kernelFunc({ + inputs: { x }, + backend, + attrs: { paddings: completePaddings, constantValue: 0 } + }); + const reshapedPaddedShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getReshaped(paddedX.shape, blockShape, prod, false); + const permutedReshapedPaddedPermutation = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getPermuted(reshapedPaddedShape.length, blockShape.length, false); + const flattenShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getReshapedPermuted(paddedX.shape, blockShape, prod, false); + const reshapeInputs = { x: paddedX }; + const reshapeAttrs = { shape: reshapedPaddedShape }; + const paddedXReshaped = Object(_Reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])({ inputs: reshapeInputs, backend, attrs: reshapeAttrs }); + const transposeInputs = { x: paddedXReshaped }; + const transposeAttrs = { perm: permutedReshapedPaddedPermutation }; + const paddedXT = Object(_Transpose__WEBPACK_IMPORTED_MODULE_4__["transpose"])({ inputs: transposeInputs, backend, attrs: transposeAttrs }); + const resultReshapeInputs = { x: paddedXT }; + const resultReshapeAttrs = { shape: flattenShape }; + const result = Object(_Reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])({ inputs: resultReshapeInputs, backend, attrs: resultReshapeAttrs }); + backend.disposeIntermediateTensorInfo(paddedX); + backend.disposeIntermediateTensorInfo(paddedXReshaped); + backend.disposeIntermediateTensorInfo(paddedXT); + return result; +} +const spaceToBatchNDConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["SpaceToBatchND"], + backendName: 'cpu', + kernelFunc: spaceToBatchND +}; +//# sourceMappingURL=SpaceToBatchND.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js ***! + \************************************************************************/ +/*! exports provided: sqrt, sqrtConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return sqrt; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrtConfig", function() { return sqrtConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const sqrt = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sqrt"], (xi) => Math.sqrt(xi)); +const sqrtConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sqrt"], + backendName: 'cpu', + kernelFunc: sqrt, +}; +//# sourceMappingURL=Sqrt.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js ***! + \**************************************************************************/ +/*! exports provided: squareConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squareConfig", function() { return squareConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const squareConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Square"], + backendName: 'cpu', + kernelFunc: ({ inputs, backend }) => { + const { x } = inputs; + const cpuBackend = backend; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'square'); + const values = cpuBackend.data.get(x.dataId).values; + const newValues = new Float32Array(values.length); + for (let i = 0; i < values.length; ++i) { + const value = values[i]; + newValues[i] = value * value; + } + const dataId = cpuBackend.write(newValues, x.shape, x.dtype); + return { dataId, shape: x.shape, dtype: x.dtype }; + } +}; +//# sourceMappingURL=Square.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js ***! + \*************************************************************************************/ +/*! exports provided: squaredDifferenceImpl, squaredDifference, squaredDifferenceConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceImpl", function() { return squaredDifferenceImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifference", function() { return squaredDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceConfig", function() { return squaredDifferenceConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/kernel_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const squaredDifferenceImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])(((a, b) => { + const diff = a - b; + return diff * diff; +})); +const squaredDifference = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["binaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["SquaredDifference"], squaredDifferenceImpl); +const squaredDifferenceConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["SquaredDifference"], + backendName: 'cpu', + kernelFunc: squaredDifference +}; +//# sourceMappingURL=SquaredDifference.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js ***! + \************************************************************************/ +/*! exports provided: step, stepConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "step", function() { return step; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stepConfig", function() { return stepConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const step = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Step"], (xi, attrs) => { + const stepAttrs = attrs; + if (isNaN(xi)) { + return NaN; + } + else { + return xi > 0 ? 1 : stepAttrs.alpha; + } +}); +const stepConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Step"], + backendName: 'cpu', + kernelFunc: step, +}; +//# sourceMappingURL=Step.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js ***! + \***********************************************************************/ +/*! exports provided: subImpl, subComplexImpl, sub, subConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subImpl", function() { return subImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subComplexImpl", function() { return subComplexImpl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sub", function() { return sub; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subConfig", function() { return subConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/binary_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js"); +/* harmony import */ var _utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/kernel_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const subImpl = Object(_utils_binary_impl__WEBPACK_IMPORTED_MODULE_1__["createSimpleBinaryKernelImpl"])(((aValue, bValue) => aValue - bValue)); +const subComplexImpl = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["createComplexBinaryKernelImpl"])(((aReal, aImag, bReal, bImag) => { + return { real: aReal - bReal, imag: aImag - bImag }; +})); +const sub = Object(_utils_kernel_utils__WEBPACK_IMPORTED_MODULE_2__["binaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sub"], subImpl, subComplexImpl); +const subConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sub"], + backendName: 'cpu', + kernelFunc: sub +}; +//# sourceMappingURL=Sub.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js ***! + \***********************************************************************/ +/*! exports provided: tan, tanConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tan", function() { return tan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanConfig", function() { return tanConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const tan = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tan"], (xi) => Math.tan(xi)); +const tanConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tan"], + backendName: 'cpu', + kernelFunc: tan, +}; +//# sourceMappingURL=Tan.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js ***! + \************************************************************************/ +/*! exports provided: tanh, tanhConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanh", function() { return tanh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanhConfig", function() { return tanhConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/unary_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const tanh = Object(_utils_unary_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tanh"], (xi) => Math.tanh(xi)); +const tanhConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tanh"], + backendName: 'cpu', + kernelFunc: tanh, +}; +//# sourceMappingURL=Tanh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js ***! + \*****************************************************************************/ +/*! exports provided: transpose, transposeConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return transpose; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transposeConfig", function() { return transposeConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _Transpose_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Transpose_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function transpose(args) { + const { inputs, attrs, backend } = args; + const { x } = inputs; + const { perm } = attrs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'transpose'); + const xRank = x.shape.length; + const newShape = new Array(xRank); + for (let i = 0; i < newShape.length; i++) { + newShape[i] = x.shape[perm[i]]; + } + const values = backend.data.get(x.dataId).values; + const result = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_2__["transposeImpl"])(values, x.shape, x.dtype, perm, newShape); + const dataId = backend.write(result, newShape, x.dtype); + return { dataId, shape: newShape, dtype: x.dtype }; +} +const transposeConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Transpose"], + backendName: 'cpu', + kernelFunc: transpose +}; +//# sourceMappingURL=Transpose.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js ***! + \**********************************************************************************/ +/*! exports provided: transposeImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transposeImpl", function() { return transposeImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function transposeImpl(xVals, xShape, dtype, perm, newShape) { + const xRank = xShape.length; + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(xShape); + const xStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(xShape); + const newStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(newShape); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(newShape)); + for (let i = 0; i < xSize; ++i) { + const loc = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].indexToLoc(i, xRank, xStrides); + // Permute location. + const newLoc = new Array(loc.length); + for (let i = 0; i < newLoc.length; i++) { + newLoc[i] = loc[perm[i]]; + } + const newIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(newLoc, xRank, newStrides); + result[newIndex] = xVals[i]; + } + return result; +} +//# sourceMappingURL=Transpose_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js ***! + \**************************************************************************/ +/*! exports provided: unique, uniqueConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unique", function() { return unique; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uniqueConfig", function() { return uniqueConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _Unique_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Unique_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function unique(args) { + const { inputs, attrs, backend } = args; + const { axis } = attrs; + const { x } = inputs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, 'unique'); + const values = backend.data.get(x.dataId).values; + const { outputValues, outputShape, indices } = Object(_Unique_impl__WEBPACK_IMPORTED_MODULE_2__["uniqueImpl"])(values, axis, x.shape, x.dtype); + return [ + backend.makeTensorInfo(outputShape, x.dtype, outputValues), + backend.makeTensorInfo([indices.length], 'int32', indices), + ]; +} +const uniqueConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Unique"], + backendName: 'cpu', + kernelFunc: unique, +}; +//# sourceMappingURL=Unique.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js ***! + \*******************************************************************************/ +/*! exports provided: uniqueImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uniqueImpl", function() { return uniqueImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function uniqueImpl(values, axis, shape, dtype) { + // Normalize and validate axis. + const $axis = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam(axis, shape)[0]; + // Calculate the new shape that is suitable for extracting data along the + // given axis. + // + // The rank is 3. + // The size of the 1st dimension is the size of all the axes < the given axis. + // The size of the 2nd dimension is the same as the size of the given axis. + // The size of the 3rd dimension is the size of all the axes > the given axis. + // + // For example, for a 4D tensor with shape=[2, 3, 5, 4] and axis=2, the + // newShape would be: [2*3, 5, 4]. + // + // Note that this is not the final output shape. This will be the shape for an + // intermediate TensorBuffer (see inputBuffer below) to allow us to extract + // values along the given axis. To demonstrate how it works, consider the + // following example: + // + // Input: a 3D tensor, with shape [1, 2, 3] + // [ + // [ + // [1,2,3], + // [4,5,6] + // ] + // ] + // Axis: 2 (the last axis). + // Along axis 2, we expect to extract 3 tensors: [1,4], [2,5], [3,6]. + // + // For this example, newShape would be: [2, 3, 1], where 2 is calculated from + // 1*2. The re-shaped data would look like: + // + // [ + // [ + // [1], [2], [3] + // ], + // [ + // [4], [5], [6] + // ] + // ] + // + // Then, we can construct a 3-level nested loop by the following dimension + // order to extract the values along the axis (dimension1): + // i: dimension1 // 0,1,2 (newShape[1]) + // m: dimension0 // 0,1 (newShape[0]) + // n: dimension2 // 0 (newShape[2]) + // + // m, i, n + // --------- + // Iteration 0: data at [0, 0, 0] => "1" + // Iteration 1: data at [1, 0, 0] => "4" + // We got [1,4]. + // Iteration 2: data at [0, 1, 0] => "2" + // Iteration 3: data at [1, 1, 0] => "5" + // We got [2,5]. + // Iteration 4: data at [0, 2, 0] => "3" + // Iteration 5: data at [1, 2, 0] => "6" + // We got [3,6]. + const newShape = [1, shape[0], 1]; + for (let i = 0; i < $axis; i++) { + newShape[0] *= shape[i]; + } + newShape[1] = shape[$axis]; + for (let i = $axis + 1; i < shape.length; i++) { + newShape[2] *= shape[i]; + } + // A map from unique elements (their string representations) to their values + // in "indices" (below). + const uniqueElements = {}; + // The indices of each unique element in the original tensor along the given + // axis. It is 1D and has the same size as the given axis. + const indices = new Int32Array(shape[$axis]); + // Create a buffer so we can easily extract value at a given location. + const inputBuffer = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](newShape, dtype, values); + // The indices along the given axis that have unique elements. This is a + // de-duped version of "indices" above. + const uniqueIndices = []; + const is1DTensor = newShape[0] === 1 && newShape[2] === 1; + for (let i = 0; i < shape[$axis]; i++) { + // Extract values along the axis. + let element; + if (is1DTensor) { + // Fast path for 1D tensor input. + element = values[i].toString(); + } + else { + const axisValues = []; + for (let m = 0; m < newShape[0]; m++) { + for (let n = 0; n < newShape[2]; n++) { + axisValues.push(inputBuffer.get(m, i, n)); + } + } + element = axisValues.join(','); + } + // Dedup and update various indices. + if (uniqueElements[element] !== undefined) { + indices[i] = uniqueElements[element]; + } + else { + const uniqueIndex = Object.keys(uniqueElements).length; + uniqueElements[element] = uniqueIndex; + indices[i] = uniqueIndex; + uniqueIndices.push(i); + } + } + // Now we know where each of the unique elements are located along the axis + // (uniqueIndices). Extract them from input buffer and store them in the + // output buffer. + const outputTmpShape = newShape.slice(); + outputTmpShape[1] = Object.keys(uniqueElements).length; + const outputBuffer = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["TensorBuffer"](outputTmpShape, dtype); + uniqueIndices.forEach((uniqueElementIndex, i) => { + for (let m = 0; m < newShape[0]; m++) { + for (let n = 0; n < newShape[2]; n++) { + outputBuffer.set(inputBuffer.get(m, uniqueElementIndex, n), m, i, n); + } + } + }); + // The output shape can be calculated from the input shape with the size of + // the given axis replaced by the number of unique elements along that axis. + const outputShape = shape.slice(); + outputShape[$axis] = outputTmpShape[1]; + return { + outputValues: outputBuffer.values, + outputShape, + indices, + }; +} +//# sourceMappingURL=Unique_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js ***! + \********************************************************************************/ +/*! exports provided: _fusedMatMul, _fusedMatMulConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_fusedMatMul", function() { return _fusedMatMul; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_fusedMatMulConfig", function() { return _fusedMatMulConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _utils_fused_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/fused_utils */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js"); +/* harmony import */ var _Add__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Add */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"); +/* harmony import */ var _BatchMatMul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BatchMatMul */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function _fusedMatMul(args) { + const { inputs, backend, attrs } = args; + const { a, b, bias, preluActivationWeights } = inputs; + const { transposeA, transposeB, activation } = attrs; + let current; + let addRes; + let activationRes; + const intermediates = []; + const matMulRes = Object(_BatchMatMul__WEBPACK_IMPORTED_MODULE_3__["batchMatMul"])({ inputs: { a, b }, attrs: { transposeA, transposeB }, backend }); + current = matMulRes; + if (bias) { + addRes = Object(_Add__WEBPACK_IMPORTED_MODULE_2__["add"])({ inputs: { a: current, b: bias }, backend }); + intermediates.push(current); + current = addRes; + } + if (activation) { + activationRes = + Object(_utils_fused_utils__WEBPACK_IMPORTED_MODULE_1__["applyActivation"])(backend, current, activation, preluActivationWeights); + intermediates.push(current); + current = activationRes; + } + for (const i of intermediates) { + backend.disposeIntermediateTensorInfo(i); + } + return current; +} +const _fusedMatMulConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["_FusedMatMul"], + backendName: 'cpu', + kernelFunc: _fusedMatMul, +}; +//# sourceMappingURL=_FusedMatMul.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js ***! + \********************************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernels_FusedMatMul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./kernels/_FusedMatMul */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js"); +/* harmony import */ var _kernels_Abs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kernels/Abs */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js"); +/* harmony import */ var _kernels_Acos__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./kernels/Acos */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js"); +/* harmony import */ var _kernels_Acosh__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kernels/Acosh */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js"); +/* harmony import */ var _kernels_Add__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kernels/Add */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"); +/* harmony import */ var _kernels_Asin__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./kernels/Asin */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js"); +/* harmony import */ var _kernels_Asinh__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./kernels/Asinh */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js"); +/* harmony import */ var _kernels_Atan__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./kernels/Atan */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js"); +/* harmony import */ var _kernels_Atanh__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./kernels/Atanh */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js"); +/* harmony import */ var _kernels_AvgPool__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./kernels/AvgPool */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js"); +/* harmony import */ var _kernels_AvgPoolBackprop__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./kernels/AvgPoolBackprop */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolBackprop.js"); +/* harmony import */ var _kernels_BatchMatMul__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./kernels/BatchMatMul */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js"); +/* harmony import */ var _kernels_BatchNorm__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./kernels/BatchNorm */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js"); +/* harmony import */ var _kernels_Cast__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./kernels/Cast */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"); +/* harmony import */ var _kernels_Ceil__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./kernels/Ceil */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js"); +/* harmony import */ var _kernels_Clip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./kernels/Clip */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Clip.js"); +/* harmony import */ var _kernels_Complex__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./kernels/Complex */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/* harmony import */ var _kernels_Concat__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./kernels/Concat */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"); +/* harmony import */ var _kernels_Conv2D__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./kernels/Conv2D */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js"); +/* harmony import */ var _kernels_Conv2DBackpropFilter__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./kernels/Conv2DBackpropFilter */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js"); +/* harmony import */ var _kernels_Conv2DBackpropInput__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./kernels/Conv2DBackpropInput */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js"); +/* harmony import */ var _kernels_Conv3D__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./kernels/Conv3D */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js"); +/* harmony import */ var _kernels_Conv3DBackpropFilterV2__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./kernels/Conv3DBackpropFilterV2 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js"); +/* harmony import */ var _kernels_Conv3DBackpropInputV2__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./kernels/Conv3DBackpropInputV2 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js"); +/* harmony import */ var _kernels_Cos__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./kernels/Cos */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js"); +/* harmony import */ var _kernels_Cosh__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./kernels/Cosh */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js"); +/* harmony import */ var _kernels_DepthwiseConv2dNative__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./kernels/DepthwiseConv2dNative */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js"); +/* harmony import */ var _kernels_DepthwiseConv2dNativeBackpropFilter__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./kernels/DepthwiseConv2dNativeBackpropFilter */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js"); +/* harmony import */ var _kernels_DepthwiseConv2dNativeBackpropInput__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./kernels/DepthwiseConv2dNativeBackpropInput */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js"); +/* harmony import */ var _kernels_Dilation2D__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./kernels/Dilation2D */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js"); +/* harmony import */ var _kernels_Dilation2DBackpropFilter__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./kernels/Dilation2DBackpropFilter */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js"); +/* harmony import */ var _kernels_Dilation2DBackpropInput__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./kernels/Dilation2DBackpropInput */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js"); +/* harmony import */ var _kernels_Div__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./kernels/Div */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Div.js"); +/* harmony import */ var _kernels_Elu__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./kernels/Elu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js"); +/* harmony import */ var _kernels_Erf__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./kernels/Erf */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js"); +/* harmony import */ var _kernels_Exp__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./kernels/Exp */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"); +/* harmony import */ var _kernels_Expm1__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./kernels/Expm1 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js"); +/* harmony import */ var _kernels_FFT__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./kernels/FFT */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js"); +/* harmony import */ var _kernels_Fill__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./kernels/Fill */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js"); +/* harmony import */ var _kernels_FlipLeftRight__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./kernels/FlipLeftRight */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js"); +/* harmony import */ var _kernels_Floor__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./kernels/Floor */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js"); +/* harmony import */ var _kernels_FusedConv2D__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./kernels/FusedConv2D */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js"); +/* harmony import */ var _kernels_FusedDepthwiseConv2D__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./kernels/FusedDepthwiseConv2D */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js"); +/* harmony import */ var _kernels_Identity__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./kernels/Identity */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/* harmony import */ var _kernels_IFFT__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./kernels/IFFT */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js"); +/* harmony import */ var _kernels_Imag__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./kernels/Imag */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"); +/* harmony import */ var _kernels_IsFinite__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./kernels/IsFinite */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js"); +/* harmony import */ var _kernels_IsInf__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./kernels/IsInf */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js"); +/* harmony import */ var _kernels_IsNaN__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./kernels/IsNaN */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js"); +/* harmony import */ var _kernels_Log__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./kernels/Log */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js"); +/* harmony import */ var _kernels_Log1p__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./kernels/Log1p */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js"); +/* harmony import */ var _kernels_LogicalNot__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./kernels/LogicalNot */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js"); +/* harmony import */ var _kernels_Max__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./kernels/Max */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js"); +/* harmony import */ var _kernels_MaxPool__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./kernels/MaxPool */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js"); +/* harmony import */ var _kernels_MaxPoolBackprop__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./kernels/MaxPoolBackprop */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolBackprop.js"); +/* harmony import */ var _kernels_MaxPoolWithArgmax__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./kernels/MaxPoolWithArgmax */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js"); +/* harmony import */ var _kernels_MirrorPad__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./kernels/MirrorPad */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js"); +/* harmony import */ var _kernels_Multiply__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./kernels/Multiply */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); +/* harmony import */ var _kernels_NonMaxSuppressionV4__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./kernels/NonMaxSuppressionV4 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js"); +/* harmony import */ var _kernels_NonMaxSuppressionV5__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./kernels/NonMaxSuppressionV5 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js"); +/* harmony import */ var _kernels_NotEqual__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./kernels/NotEqual */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js"); +/* harmony import */ var _kernels_PadV2__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./kernels/PadV2 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js"); +/* harmony import */ var _kernels_Prelu__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./kernels/Prelu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js"); +/* harmony import */ var _kernels_Real__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./kernels/Real */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/* harmony import */ var _kernels_Reciprocal__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./kernels/Reciprocal */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js"); +/* harmony import */ var _kernels_Relu__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./kernels/Relu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js"); +/* harmony import */ var _kernels_Relu6__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./kernels/Relu6 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js"); +/* harmony import */ var _kernels_Reshape__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./kernels/Reshape */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js"); +/* harmony import */ var _kernels_RotateWithOffset__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./kernels/RotateWithOffset */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js"); +/* harmony import */ var _kernels_Round__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./kernels/Round */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js"); +/* harmony import */ var _kernels_Rsqrt__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./kernels/Rsqrt */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js"); +/* harmony import */ var _kernels_Selu__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./kernels/Selu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js"); +/* harmony import */ var _kernels_Sigmoid__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./kernels/Sigmoid */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js"); +/* harmony import */ var _kernels_Sign__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./kernels/Sign */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js"); +/* harmony import */ var _kernels_Sin__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./kernels/Sin */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js"); +/* harmony import */ var _kernels_Sinh__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./kernels/Sinh */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js"); +/* harmony import */ var _kernels_Slice__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./kernels/Slice */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"); +/* harmony import */ var _kernels_Softplus__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./kernels/Softplus */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js"); +/* harmony import */ var _kernels_SpaceToBatchND__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./kernels/SpaceToBatchND */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js"); +/* harmony import */ var _kernels_Sqrt__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./kernels/Sqrt */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js"); +/* harmony import */ var _kernels_Square__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./kernels/Square */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js"); +/* harmony import */ var _kernels_SquaredDifference__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./kernels/SquaredDifference */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js"); +/* harmony import */ var _kernels_Step__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./kernels/Step */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js"); +/* harmony import */ var _kernels_Sub__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./kernels/Sub */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); +/* harmony import */ var _kernels_Tan__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./kernels/Tan */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js"); +/* harmony import */ var _kernels_Tanh__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./kernels/Tanh */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js"); +/* harmony import */ var _kernels_Transpose__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./kernels/Transpose */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js"); +/* harmony import */ var _kernels_Unique__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./kernels/Unique */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// We explicitly import the modular kernels so they get registered in the +// global registry when we compile the library. A modular build would replace +// the contents of this file and import only the kernels that are needed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// List all kernel configs here +const kernelConfigs = [ + _kernels_FusedMatMul__WEBPACK_IMPORTED_MODULE_1__["_fusedMatMulConfig"], + _kernels_Abs__WEBPACK_IMPORTED_MODULE_2__["absConfig"], + _kernels_Acos__WEBPACK_IMPORTED_MODULE_3__["acosConfig"], + _kernels_Acosh__WEBPACK_IMPORTED_MODULE_4__["acoshConfig"], + _kernels_Add__WEBPACK_IMPORTED_MODULE_5__["addConfig"], + _kernels_Asin__WEBPACK_IMPORTED_MODULE_6__["asinConfig"], + _kernels_Asinh__WEBPACK_IMPORTED_MODULE_7__["asinhConfig"], + _kernels_Atan__WEBPACK_IMPORTED_MODULE_8__["atanConfig"], + _kernels_Atanh__WEBPACK_IMPORTED_MODULE_9__["atanhConfig"], + _kernels_AvgPool__WEBPACK_IMPORTED_MODULE_10__["avgPoolConfig"], + _kernels_AvgPoolBackprop__WEBPACK_IMPORTED_MODULE_11__["avgPoolBackpropConfig"], + _kernels_BatchMatMul__WEBPACK_IMPORTED_MODULE_12__["batchMatMulConfig"], + _kernels_BatchNorm__WEBPACK_IMPORTED_MODULE_13__["batchNormConfig"], + _kernels_Cast__WEBPACK_IMPORTED_MODULE_14__["castConfig"], + _kernels_Ceil__WEBPACK_IMPORTED_MODULE_15__["ceilConfig"], + _kernels_Clip__WEBPACK_IMPORTED_MODULE_16__["clipConfig"], + _kernels_Complex__WEBPACK_IMPORTED_MODULE_17__["complexConfig"], + _kernels_Concat__WEBPACK_IMPORTED_MODULE_18__["concatConfig"], + _kernels_Conv2DBackpropFilter__WEBPACK_IMPORTED_MODULE_20__["conv2DBackpropFilterConfig"], + _kernels_Conv2DBackpropInput__WEBPACK_IMPORTED_MODULE_21__["conv2DBackpropInputConfig"], + _kernels_Conv2D__WEBPACK_IMPORTED_MODULE_19__["conv2DConfig"], + _kernels_Conv3DBackpropFilterV2__WEBPACK_IMPORTED_MODULE_23__["conv3DBackpropFilterV2Config"], + _kernels_Conv3DBackpropInputV2__WEBPACK_IMPORTED_MODULE_24__["conv3DBackpropInputV2Config"], + _kernels_Conv3D__WEBPACK_IMPORTED_MODULE_22__["conv3DConfig"], + _kernels_Cos__WEBPACK_IMPORTED_MODULE_25__["cosConfig"], + _kernels_Cosh__WEBPACK_IMPORTED_MODULE_26__["coshConfig"], + _kernels_DepthwiseConv2dNative__WEBPACK_IMPORTED_MODULE_27__["depthwiseConv2dNativeConfig"], + _kernels_DepthwiseConv2dNativeBackpropFilter__WEBPACK_IMPORTED_MODULE_28__["depthwiseConv2dNativeBackpropFilterConfig"], + _kernels_DepthwiseConv2dNativeBackpropInput__WEBPACK_IMPORTED_MODULE_29__["depthwiseConv2dNativeBackpropInputConfig"], + _kernels_Dilation2D__WEBPACK_IMPORTED_MODULE_30__["dilation2dConfig"], + _kernels_Dilation2DBackpropInput__WEBPACK_IMPORTED_MODULE_32__["dilation2dBackpropInputConfig"], + _kernels_Dilation2DBackpropFilter__WEBPACK_IMPORTED_MODULE_31__["dilation2dBackpropFilterConfig"], + _kernels_Div__WEBPACK_IMPORTED_MODULE_33__["divConfig"], + _kernels_Elu__WEBPACK_IMPORTED_MODULE_34__["eluConfig"], + _kernels_Erf__WEBPACK_IMPORTED_MODULE_35__["erfConfig"], + _kernels_Exp__WEBPACK_IMPORTED_MODULE_36__["expConfig"], + _kernels_Expm1__WEBPACK_IMPORTED_MODULE_37__["expm1Config"], + _kernels_FFT__WEBPACK_IMPORTED_MODULE_38__["fftConfig"], + _kernels_Fill__WEBPACK_IMPORTED_MODULE_39__["fillConfig"], + _kernels_FlipLeftRight__WEBPACK_IMPORTED_MODULE_40__["flipLeftRightConfig"], + _kernels_Floor__WEBPACK_IMPORTED_MODULE_41__["floorConfig"], + _kernels_FusedConv2D__WEBPACK_IMPORTED_MODULE_42__["fusedConv2DConfig"], + _kernels_FusedDepthwiseConv2D__WEBPACK_IMPORTED_MODULE_43__["fusedDepthwiseConv2DConfig"], + _kernels_Identity__WEBPACK_IMPORTED_MODULE_44__["identityConfig"], + _kernels_IFFT__WEBPACK_IMPORTED_MODULE_45__["ifftConfig"], + _kernels_Imag__WEBPACK_IMPORTED_MODULE_46__["imagConfig"], + _kernels_IsFinite__WEBPACK_IMPORTED_MODULE_47__["isFiniteConfig"], + _kernels_IsInf__WEBPACK_IMPORTED_MODULE_48__["isInfConfig"], + _kernels_IsNaN__WEBPACK_IMPORTED_MODULE_49__["isNaNConfig"], + _kernels_Log__WEBPACK_IMPORTED_MODULE_50__["logConfig"], + _kernels_Log1p__WEBPACK_IMPORTED_MODULE_51__["log1pConfig"], + _kernels_LogicalNot__WEBPACK_IMPORTED_MODULE_52__["logicalNotConfig"], + _kernels_MaxPool__WEBPACK_IMPORTED_MODULE_54__["maxPoolConfig"], + _kernels_MaxPoolBackprop__WEBPACK_IMPORTED_MODULE_55__["maxPoolBackpropConfig"], + _kernels_MaxPoolWithArgmax__WEBPACK_IMPORTED_MODULE_56__["maxPoolWithArgmaxConfig"], + _kernels_Max__WEBPACK_IMPORTED_MODULE_53__["maxConfig"], + _kernels_MirrorPad__WEBPACK_IMPORTED_MODULE_57__["mirrorPadConfig"], + _kernels_Multiply__WEBPACK_IMPORTED_MODULE_58__["multiplyConfig"], + _kernels_NonMaxSuppressionV4__WEBPACK_IMPORTED_MODULE_59__["nonMaxSuppressionV4Config"], + _kernels_NonMaxSuppressionV5__WEBPACK_IMPORTED_MODULE_60__["nonMaxSuppressionV5Config"], + _kernels_NotEqual__WEBPACK_IMPORTED_MODULE_61__["notEqualConfig"], + _kernels_PadV2__WEBPACK_IMPORTED_MODULE_62__["padV2Config"], + _kernels_Prelu__WEBPACK_IMPORTED_MODULE_63__["preluConfig"], + _kernels_Real__WEBPACK_IMPORTED_MODULE_64__["realConfig"], + _kernels_Reciprocal__WEBPACK_IMPORTED_MODULE_65__["reciprocalConfig"], + _kernels_Relu__WEBPACK_IMPORTED_MODULE_66__["reluConfig"], + _kernels_Relu6__WEBPACK_IMPORTED_MODULE_67__["relu6Config"], + _kernels_Reshape__WEBPACK_IMPORTED_MODULE_68__["reshapeConfig"], + _kernels_RotateWithOffset__WEBPACK_IMPORTED_MODULE_69__["rotateWithOffsetConfig"], + _kernels_Round__WEBPACK_IMPORTED_MODULE_70__["roundConfig"], + _kernels_Rsqrt__WEBPACK_IMPORTED_MODULE_71__["rsqrtConfig"], + _kernels_Selu__WEBPACK_IMPORTED_MODULE_72__["seluConfig"], + _kernels_Sigmoid__WEBPACK_IMPORTED_MODULE_73__["sigmoidConfig"], + _kernels_Sign__WEBPACK_IMPORTED_MODULE_74__["signConfig"], + _kernels_Sin__WEBPACK_IMPORTED_MODULE_75__["sinConfig"], + _kernels_Sinh__WEBPACK_IMPORTED_MODULE_76__["sinhConfig"], + _kernels_Slice__WEBPACK_IMPORTED_MODULE_77__["sliceConfig"], + _kernels_Softplus__WEBPACK_IMPORTED_MODULE_78__["softplusConfig"], + _kernels_SpaceToBatchND__WEBPACK_IMPORTED_MODULE_79__["spaceToBatchNDConfig"], + _kernels_Sqrt__WEBPACK_IMPORTED_MODULE_80__["sqrtConfig"], + _kernels_Square__WEBPACK_IMPORTED_MODULE_81__["squareConfig"], + _kernels_SquaredDifference__WEBPACK_IMPORTED_MODULE_82__["squaredDifferenceConfig"], + _kernels_Step__WEBPACK_IMPORTED_MODULE_83__["stepConfig"], + _kernels_Sub__WEBPACK_IMPORTED_MODULE_84__["subConfig"], + _kernels_Tan__WEBPACK_IMPORTED_MODULE_85__["tanConfig"], + _kernels_Tanh__WEBPACK_IMPORTED_MODULE_86__["tanhConfig"], + _kernels_Transpose__WEBPACK_IMPORTED_MODULE_87__["transposeConfig"], + _kernels_Unique__WEBPACK_IMPORTED_MODULE_88__["uniqueConfig"], +]; +for (const kernelConfig of kernelConfigs) { + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["registerKernel"])(kernelConfig); +} +//# sourceMappingURL=register_all_kernels.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js ***! + \******************************************************************/ +/*! exports provided: simpleAbsImpl, addImpl, ceilImpl, expImpl, expm1Impl, floorImpl, logImpl, maxImpl, multiplyImpl, notEqualImpl, rsqrtImpl, sliceImpl, squaredDifferenceImpl, subImpl, transposeImpl, uniqueImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _kernels_Abs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./kernels/Abs */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "simpleAbsImpl", function() { return _kernels_Abs__WEBPACK_IMPORTED_MODULE_0__["simpleAbsImpl"]; }); + +/* harmony import */ var _kernels_Add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./kernels/Add */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addImpl", function() { return _kernels_Add__WEBPACK_IMPORTED_MODULE_1__["addImpl"]; }); + +/* harmony import */ var _kernels_Ceil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kernels/Ceil */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ceilImpl", function() { return _kernels_Ceil__WEBPACK_IMPORTED_MODULE_2__["ceilImpl"]; }); + +/* harmony import */ var _kernels_Exp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./kernels/Exp */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expImpl", function() { return _kernels_Exp__WEBPACK_IMPORTED_MODULE_3__["expImpl"]; }); + +/* harmony import */ var _kernels_Expm1__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kernels/Expm1 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expm1Impl", function() { return _kernels_Expm1__WEBPACK_IMPORTED_MODULE_4__["expm1Impl"]; }); + +/* harmony import */ var _kernels_Floor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kernels/Floor */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "floorImpl", function() { return _kernels_Floor__WEBPACK_IMPORTED_MODULE_5__["floorImpl"]; }); + +/* harmony import */ var _kernels_Log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./kernels/Log */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logImpl", function() { return _kernels_Log__WEBPACK_IMPORTED_MODULE_6__["logImpl"]; }); + +/* harmony import */ var _kernels_Max_impl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./kernels/Max_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxImpl", function() { return _kernels_Max_impl__WEBPACK_IMPORTED_MODULE_7__["maxImpl"]; }); + +/* harmony import */ var _kernels_Multiply__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./kernels/Multiply */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiplyImpl", function() { return _kernels_Multiply__WEBPACK_IMPORTED_MODULE_8__["multiplyImpl"]; }); + +/* harmony import */ var _kernels_NotEqual__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./kernels/NotEqual */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "notEqualImpl", function() { return _kernels_NotEqual__WEBPACK_IMPORTED_MODULE_9__["notEqualImpl"]; }); + +/* harmony import */ var _kernels_Rsqrt__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./kernels/Rsqrt */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rsqrtImpl", function() { return _kernels_Rsqrt__WEBPACK_IMPORTED_MODULE_10__["rsqrtImpl"]; }); + +/* harmony import */ var _kernels_Slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./kernels/Slice */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sliceImpl", function() { return _kernels_Slice__WEBPACK_IMPORTED_MODULE_11__["sliceImpl"]; }); + +/* harmony import */ var _kernels_SquaredDifference__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./kernels/SquaredDifference */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceImpl", function() { return _kernels_SquaredDifference__WEBPACK_IMPORTED_MODULE_12__["squaredDifferenceImpl"]; }); + +/* harmony import */ var _kernels_Sub__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./kernels/Sub */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subImpl", function() { return _kernels_Sub__WEBPACK_IMPORTED_MODULE_13__["subImpl"]; }); + +/* harmony import */ var _kernels_Transpose_impl__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./kernels/Transpose_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transposeImpl", function() { return _kernels_Transpose_impl__WEBPACK_IMPORTED_MODULE_14__["transposeImpl"]; }); + +/* harmony import */ var _kernels_Unique_impl__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./kernels/Unique_impl */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "uniqueImpl", function() { return _kernels_Unique_impl__WEBPACK_IMPORTED_MODULE_15__["uniqueImpl"]; }); + +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Shared functionality among backends. + + + + + + + + + + + + + + + + +//# sourceMappingURL=shared.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js ***! + \*****************************************************************************/ +/*! exports provided: createSimpleBinaryKernelImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSimpleBinaryKernelImpl", function() { return createSimpleBinaryKernelImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Template that creates implementation for binary ops. Supports broadcast. + */ +function createSimpleBinaryKernelImpl(op) { + return (aShape, bShape, aVals, bVals, dtype) => { + const newShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(aShape, bShape); + const resultRank = newShape.length; + const resultStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(newShape); + const resultSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(newShape); + const result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(dtype, resultSize); + const aRank = aShape.length; + const bRank = bShape.length; + const aStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(aShape); + const bStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(bShape); + const aBroadcastDims = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getBroadcastDims(aShape, newShape); + const bBroadcastDims = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getBroadcastDims(bShape, newShape); + if (aBroadcastDims.length + bBroadcastDims.length === 0) { + for (let i = 0; i < result.length; ++i) { + result[i] = op(aVals[i % aVals.length], bVals[i % bVals.length]); + } + } + else { + for (let i = 0; i < result.length; ++i) { + const loc = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].indexToLoc(i, resultRank, resultStrides); + const aLoc = loc.slice(-aRank); + aBroadcastDims.forEach(d => aLoc[d] = 0); + const aIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(aLoc, aRank, aStrides); + const bLoc = loc.slice(-bRank); + bBroadcastDims.forEach(d => bLoc[d] = 0); + const bIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(bLoc, bRank, bStrides); + result[i] = op(aVals[aIndex], bVals[bIndex]); + } + } + return [result, newShape]; + }; +} +//# sourceMappingURL=binary_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js ***! + \***************************************************************************/ +/*! exports provided: fftBatch, fftImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fftBatch", function() { return fftBatch; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fftImpl", function() { return fftImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernels_Add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernels/Add */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js"); +/* harmony import */ var _kernels_Complex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernels/Complex */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/* harmony import */ var _kernels_Concat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../kernels/Concat */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js"); +/* harmony import */ var _kernels_Div__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../kernels/Div */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Div.js"); +/* harmony import */ var _kernels_Identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../kernels/Identity */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/* harmony import */ var _kernels_Imag__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../kernels/Imag */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js"); +/* harmony import */ var _kernels_Multiply__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../kernels/Multiply */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js"); +/* harmony import */ var _kernels_Real__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../kernels/Real */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js"); +/* harmony import */ var _kernels_Slice__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../kernels/Slice */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js"); +/* harmony import */ var _kernels_Sub__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../kernels/Sub */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + + +/** + * Calculate FFT of inner most elements of batch tensor. + */ +function fftBatch(input, inverse, cpuBackend) { + const inputShape = input.shape; + const batch = inputShape[0]; + const innerDim = inputShape[1]; + const inputVals = cpuBackend.data.get(input.dataId); + const real2D = inputVals.complexTensorInfos.real; + const imag2D = inputVals.complexTensorInfos.imag; + // Collects real and imaginary values separately. + const resultShape = [batch, innerDim]; + const resultSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(resultShape); + const resultReal = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType('float32', resultSize); + const resultImag = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType('float32', resultSize); + for (let b = 0; b < batch; b++) { + // TODO: Support slice ops for complex type. + const r = Object(_kernels_Slice__WEBPACK_IMPORTED_MODULE_9__["slice"])({ + inputs: { x: real2D }, + backend: cpuBackend, + attrs: { begin: [b, 0], size: [1, innerDim] } + }); + const i = Object(_kernels_Slice__WEBPACK_IMPORTED_MODULE_9__["slice"])({ + inputs: { x: imag2D }, + backend: cpuBackend, + attrs: { begin: [b, 0], size: [1, innerDim] } + }); + const input = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: r, imag: i }, backend: cpuBackend }); + // Run FFT by batch element. + const { real, imag } = fftImpl(input, inverse, cpuBackend); + const res = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].mergeRealAndImagArrays(real, imag); + for (let d = 0; d < innerDim; d++) { + const c = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getComplexWithIndex(res, d); + resultReal[b * innerDim + d] = c.real; + resultImag[b * innerDim + d] = c.imag; + } + cpuBackend.disposeIntermediateTensorInfo(r); + cpuBackend.disposeIntermediateTensorInfo(i); + cpuBackend.disposeIntermediateTensorInfo(input); + } + const $realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultReal); + const $imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImag); + const result = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: $realInfo, imag: $imagInfo }, backend: cpuBackend }); + cpuBackend.disposeIntermediateTensorInfo($realInfo); + cpuBackend.disposeIntermediateTensorInfo($imagInfo); + return result; +} +function fftImpl(input, inverse, cpuBackend) { + const inputSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(input.shape); + const inputVals = cpuBackend.data.get(input.dataId); + const realVals = cpuBackend.data.get(inputVals.complexTensorInfos.real.dataId).values; + const imagVals = cpuBackend.data.get(inputVals.complexTensorInfos.imag.dataId).values; + if (isExponentOf2(inputSize)) { + const result = fftRadix2(realVals, imagVals, inputSize, inverse, cpuBackend); + const resultShape = [input.shape[0], input.shape[1]]; + if (inverse) { + const realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.real); + const imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.imag); + const sizeInfo = cpuBackend.makeTensorInfo([], 'float32', _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].createScalarValue(inputSize, 'float32')); + const sizeInfoCopy = Object(_kernels_Identity__WEBPACK_IMPORTED_MODULE_5__["identity"])({ inputs: { x: sizeInfo }, backend: cpuBackend }); + const divRealInfo = _kernels_Div__WEBPACK_IMPORTED_MODULE_4__["divConfig"].kernelFunc({ inputs: { a: realInfo, b: sizeInfo }, backend: cpuBackend }); + const divImagInfo = _kernels_Div__WEBPACK_IMPORTED_MODULE_4__["divConfig"].kernelFunc({ inputs: { a: imagInfo, b: sizeInfoCopy }, backend: cpuBackend }); + const divRealVals = cpuBackend.data.get(divRealInfo.dataId).values; + const divImagVals = cpuBackend.data.get(divImagInfo.dataId).values; + cpuBackend.disposeIntermediateTensorInfo(realInfo); + cpuBackend.disposeIntermediateTensorInfo(imagInfo); + cpuBackend.disposeIntermediateTensorInfo(sizeInfo); + cpuBackend.disposeIntermediateTensorInfo(sizeInfoCopy); + cpuBackend.disposeIntermediateTensorInfo(divRealInfo); + cpuBackend.disposeIntermediateTensorInfo(divImagInfo); + return { real: divRealVals, imag: divImagVals }; + } + return result; + } + else { + const data = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].mergeRealAndImagArrays(realVals, imagVals); + const rawOutput = fourierTransformByMatmul(data, inputSize, inverse); + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].splitRealAndImagArrays(rawOutput); + } +} +function isExponentOf2(size) { + return (size & size - 1) === 0; +} +// FFT using Cooley-Tukey algorithm on radix 2 dimensional input. +function fftRadix2(realVals, imagVals, size, inverse, cpuBackend) { + if (size === 1) { + return { real: realVals, imag: imagVals }; + } + const data = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].mergeRealAndImagArrays(realVals, imagVals); + const half = size / 2; + const evenComplex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].complexWithEvenIndex(data); + const evenRealVals = evenComplex.real; + const evenImagVals = evenComplex.imag; + const evenShape = [evenRealVals.length]; + const evenRealInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenRealVals); + const evenImagInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenImagVals); + const evenTensorInfo = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: evenRealInfo, imag: evenImagInfo }, backend: cpuBackend }); + const oddComplex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].complexWithOddIndex(data); + const oddRealVals = oddComplex.real; + const oddImagVals = oddComplex.imag; + const oddShape = [oddRealVals.length]; + const oddRealInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddRealVals); + const oddImagInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddImagVals); + const oddTensorInfo = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: oddRealInfo, imag: oddImagInfo }, backend: cpuBackend }); + // Recursive call for half part of original input. + const $evenComplex = fftRadix2(evenRealVals, evenImagVals, half, inverse, cpuBackend); + const $evenRealVals = $evenComplex.real; + const $evenImagVals = $evenComplex.imag; + const $evenShape = [$evenRealVals.length]; + const $evenRealInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenRealVals); + const $evenImagInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenImagVals); + const $evenTensorInfo = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ + inputs: { real: $evenRealInfo, imag: $evenImagInfo }, + backend: cpuBackend + }); + const $oddComplex = fftRadix2(oddRealVals, oddImagVals, half, inverse, cpuBackend); + const $oddRealVals = $oddComplex.real; + const $oddImagVals = $oddComplex.imag; + const $oddShape = [$oddRealVals.length]; + const $oddRealInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddRealVals); + const $oddImagInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddImagVals); + const $oddTensorInfo = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: $oddRealInfo, imag: $oddImagInfo }, backend: cpuBackend }); + const e = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].exponents(size, inverse); + const eShape = [e.real.length]; + const eRealInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.real); + const eImagInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.imag); + const complexInfo = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: eRealInfo, imag: eImagInfo }, backend: cpuBackend }); + const exponentInfo = Object(_kernels_Multiply__WEBPACK_IMPORTED_MODULE_7__["multiply"])({ inputs: { a: complexInfo, b: $oddTensorInfo }, backend: cpuBackend }); + const addPart = Object(_kernels_Add__WEBPACK_IMPORTED_MODULE_1__["add"])({ + inputs: { a: $evenTensorInfo, b: exponentInfo }, + backend: cpuBackend + }); + const subPart = Object(_kernels_Sub__WEBPACK_IMPORTED_MODULE_10__["sub"])({ + inputs: { a: $evenTensorInfo, b: exponentInfo }, + backend: cpuBackend + }); + const addPartReal = Object(_kernels_Real__WEBPACK_IMPORTED_MODULE_8__["real"])({ inputs: { input: addPart }, backend: cpuBackend }); + const subPartReal = Object(_kernels_Real__WEBPACK_IMPORTED_MODULE_8__["real"])({ inputs: { input: subPart }, backend: cpuBackend }); + const addPartImag = Object(_kernels_Imag__WEBPACK_IMPORTED_MODULE_6__["imag"])({ inputs: { input: addPart }, backend: cpuBackend }); + const subPartImag = Object(_kernels_Imag__WEBPACK_IMPORTED_MODULE_6__["imag"])({ inputs: { input: subPart }, backend: cpuBackend }); + const $real = Object(_kernels_Concat__WEBPACK_IMPORTED_MODULE_3__["concat"])({ + inputs: [addPartReal, subPartReal], + backend: cpuBackend, + attrs: { axis: 0 } + }); + const $imag = Object(_kernels_Concat__WEBPACK_IMPORTED_MODULE_3__["concat"])({ + inputs: [addPartImag, subPartImag], + backend: cpuBackend, + attrs: { axis: 0 } + }); + const $realVals = cpuBackend.data.get($real.dataId).values; + const $imagVals = cpuBackend.data.get($imag.dataId).values; + cpuBackend.disposeIntermediateTensorInfo(evenRealInfo); + cpuBackend.disposeIntermediateTensorInfo(evenImagInfo); + cpuBackend.disposeIntermediateTensorInfo(evenTensorInfo); + cpuBackend.disposeIntermediateTensorInfo(oddRealInfo); + cpuBackend.disposeIntermediateTensorInfo(oddImagInfo); + cpuBackend.disposeIntermediateTensorInfo(oddTensorInfo); + cpuBackend.disposeIntermediateTensorInfo($evenRealInfo); + cpuBackend.disposeIntermediateTensorInfo($evenImagInfo); + cpuBackend.disposeIntermediateTensorInfo($evenTensorInfo); + cpuBackend.disposeIntermediateTensorInfo($oddRealInfo); + cpuBackend.disposeIntermediateTensorInfo($oddImagInfo); + cpuBackend.disposeIntermediateTensorInfo($oddTensorInfo); + cpuBackend.disposeIntermediateTensorInfo(eRealInfo); + cpuBackend.disposeIntermediateTensorInfo(eImagInfo); + cpuBackend.disposeIntermediateTensorInfo(complexInfo); + cpuBackend.disposeIntermediateTensorInfo(exponentInfo); + cpuBackend.disposeIntermediateTensorInfo(addPart); + cpuBackend.disposeIntermediateTensorInfo(subPart); + cpuBackend.disposeIntermediateTensorInfo(addPartReal); + cpuBackend.disposeIntermediateTensorInfo(addPartImag); + cpuBackend.disposeIntermediateTensorInfo(subPartReal); + cpuBackend.disposeIntermediateTensorInfo(subPartImag); + cpuBackend.disposeIntermediateTensorInfo($real); + cpuBackend.disposeIntermediateTensorInfo($imag); + return { real: $realVals, imag: $imagVals }; +} +// Calculate fourier transform by multplying sinusoid matrix. +function fourierTransformByMatmul(data, size, inverse) { + const ret = new Float32Array(size * 2); + // TODO: Use matmul instead once it supports complex64 type. + for (let r = 0; r < size; r++) { + let real = 0.0; + let imag = 0.0; + for (let c = 0; c < size; c++) { + const e = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].exponent(r * c, size, inverse); + const term = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getComplexWithIndex(data, c); + real += term.real * e.real - term.imag * e.imag; + imag += term.real * e.imag + term.imag * e.real; + } + if (inverse) { + real /= size; + imag /= size; + } + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assignToTypedArray(ret, real, imag, r); + } + return ret; +} +//# sourceMappingURL=fft_utils.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js ***! + \*****************************************************************************/ +/*! exports provided: applyActivation */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyActivation", function() { return applyActivation; }); +/* harmony import */ var _kernels_Elu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernels/Elu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js"); +/* harmony import */ var _kernels_Identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernels/Identity */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js"); +/* harmony import */ var _kernels_Prelu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernels/Prelu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js"); +/* harmony import */ var _kernels_Relu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../kernels/Relu */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js"); +/* harmony import */ var _kernels_Relu6__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../kernels/Relu6 */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +function applyActivation(backend, x, activation, preluActivationWeights) { + if (activation === 'linear') { + return Object(_kernels_Identity__WEBPACK_IMPORTED_MODULE_1__["identity"])({ inputs: { x }, backend }); + } + else if (activation === 'relu') { + return Object(_kernels_Relu__WEBPACK_IMPORTED_MODULE_3__["relu"])({ inputs: { x }, backend }); + } + else if (activation === 'elu') { + return Object(_kernels_Elu__WEBPACK_IMPORTED_MODULE_0__["elu"])({ inputs: { x }, backend }); + } + else if (activation === 'relu6') { + return Object(_kernels_Relu6__WEBPACK_IMPORTED_MODULE_4__["relu6"])({ inputs: { x }, backend }); + } + else if (activation === 'prelu') { + return Object(_kernels_Prelu__WEBPACK_IMPORTED_MODULE_2__["prelu"])({ inputs: { x, alpha: preluActivationWeights }, backend }); + } + throw new Error(`Activation ${activation} has not been implemented for the CPU backend.`); +} +//# sourceMappingURL=fused_utils.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/kernel_utils.js ***! + \******************************************************************************/ +/*! exports provided: binaryKernelFunc, createComplexBinaryKernelImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "binaryKernelFunc", function() { return binaryKernelFunc; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createComplexBinaryKernelImpl", function() { return createComplexBinaryKernelImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/* harmony import */ var _kernels_Cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernels/Cast */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js"); +/* harmony import */ var _kernels_Complex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../kernels/Complex */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Template that creates a `KernelFunc` for binary ops. + * @param name Kernel name. + * @param binaryKernelImpl A `SimpleBinaryKernelImpl` for the kernel. + * @param binaryKernelComplexImpl Optional. If exists, represents a + * `ComplexBinaryKernelImpl` for the kernel, will be used when input dtype + * is `complex64`. + * @param dtype Optional. If set, the result has this dtype. Otherwise, the + * result has the same dtype as the first input. This is mainly used in + * comparison kernels, such as Equal, Less, Greater, etc. + */ +function binaryKernelFunc(name, simpleImpl, complexImpl, dtype) { + if (complexImpl == null) { + return ({ inputs, backend }) => { + const { a, b } = inputs; + const cpuBackend = backend; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])([a, b], name); + const aVals = cpuBackend.data.get(a.dataId).values; + const bVals = cpuBackend.data.get(b.dataId).values; + const $dtype = dtype || a.dtype; + const [resultData, resultShape] = simpleImpl(a.shape, b.shape, aVals, bVals, $dtype); + return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData); + }; + } + return ({ inputs, backend }) => { + const { a, b } = inputs; + const cpuBackend = backend; + if (a.dtype === 'complex64' || b.dtype === 'complex64') { + const $aComplex = Object(_kernels_Cast__WEBPACK_IMPORTED_MODULE_2__["cast"])({ inputs: { x: a }, backend: cpuBackend, attrs: { dtype: 'complex64' } }); + const $aComplexVals = cpuBackend.data.get($aComplex.dataId); + const aReal = $aComplexVals.complexTensorInfos.real; + const aImag = $aComplexVals.complexTensorInfos.imag; + const aRealVals = cpuBackend.data.get(aReal.dataId).values; + const aImagVals = cpuBackend.data.get(aImag.dataId).values; + const $bComplex = Object(_kernels_Cast__WEBPACK_IMPORTED_MODULE_2__["cast"])({ inputs: { x: b }, backend: cpuBackend, attrs: { dtype: 'complex64' } }); + const $bComplexVals = cpuBackend.data.get($bComplex.dataId); + const bReal = $bComplexVals.complexTensorInfos.real; + const bImag = $bComplexVals.complexTensorInfos.imag; + const bRealVals = cpuBackend.data.get(bReal.dataId).values; + const bImagVals = cpuBackend.data.get(bImag.dataId).values; + const [resultRealData, resultImagData, resultShape] = complexImpl(a.shape, b.shape, aRealVals, aImagVals, bRealVals, bImagVals); + const resultReal = cpuBackend.makeTensorInfo(resultShape, 'float32', resultRealData); + const resultImag = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImagData); + const result = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_3__["complex"])({ inputs: { real: resultReal, imag: resultImag }, backend: cpuBackend }); + cpuBackend.disposeIntermediateTensorInfo($aComplex); + cpuBackend.disposeIntermediateTensorInfo($bComplex); + cpuBackend.disposeIntermediateTensorInfo(resultReal); + cpuBackend.disposeIntermediateTensorInfo(resultImag); + return result; + } + else { + const aVals = cpuBackend.data.get(a.dataId).values; + const bVals = cpuBackend.data.get(b.dataId).values; + const $dtype = dtype || a.dtype; + const [resultData, resultShape] = simpleImpl(a.shape, b.shape, aVals, bVals, $dtype); + return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData); + } + }; +} +/** + * Template that creates the complex type implementation for binary ops. + * Supports broadcast. + */ +function createComplexBinaryKernelImpl(op) { + return (aShape, bShape, aRealVals, aImagVals, bRealVals, bImagVals) => { + const resultShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(aShape, bShape); + const resultSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(resultShape); + const resultRank = resultShape.length; + const resultStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(resultShape); + const resultRealVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType('float32', resultSize); + const resultImagVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType('float32', resultSize); + const aBroadcastDims = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getBroadcastDims(aShape, resultShape); + const bBroadcastDims = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getBroadcastDims(bShape, resultShape); + const aVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].mergeRealAndImagArrays(aRealVals, aImagVals); + const bVals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].mergeRealAndImagArrays(bRealVals, bImagVals); + const aRank = aShape.length; + const aStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(aShape); + const bRank = bShape.length; + const bStrides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(bShape); + if (aBroadcastDims.length + bBroadcastDims.length === 0) { + for (let i = 0; i < resultRealVals.length; i++) { + const aIdx = i % aVals.length; + const bIdx = i % bVals.length; + const result = op(aVals[aIdx * 2], aVals[aIdx * 2 + 1], bVals[bIdx * 2], bVals[bIdx * 2 + 1]); + resultRealVals[i] = result.real; + resultImagVals[i] = result.imag; + } + } + else { + for (let i = 0; i < resultRealVals.length; i++) { + const loc = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].indexToLoc(i, resultRank, resultStrides); + const aLoc = loc.slice(-aRank); + aBroadcastDims.forEach(d => aLoc[d] = 0); + const aIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(aLoc, aRank, aStrides); + const bLoc = loc.slice(-bRank); + bBroadcastDims.forEach(d => bLoc[d] = 0); + const bIndex = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].locToIndex(bLoc, bRank, bStrides); + const opResult = op(aVals[aIndex * 2], aVals[aIndex * 2 + 1], bVals[bIndex * 2], bVals[bIndex * 2 + 1]); + resultRealVals[i] = opResult.real; + resultImagVals[i] = opResult.imag; + } + } + return [resultRealVals, resultImagVals, resultShape]; + }; +} +//# sourceMappingURL=kernel_utils.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js ***! + \****************************************************************************/ +/*! exports provided: pool, maxPoolPositions */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pool", function() { return pool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolPositions", function() { return maxPoolPositions; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function pool(xValues, xShape, dtype, strides, convInfo, poolType) { + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const initialValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY : + Number.POSITIVE_INFINITY); + const output = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(convInfo.outShape, dtype); + const outputVals = output.values; + const outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] * convInfo.outShape[3]; + const outputRowStrides = convInfo.outShape[2] * convInfo.outShape[3]; + const outputColStrides = convInfo.outShape[3]; + for (let b = 0; b < convInfo.batchSize; ++b) { + const outputBatchOffset = b * outputBatchStrides; + const inputBatchOffset = b * strides[0]; + for (let d = 0; d < convInfo.inChannels; ++d) { + for (let yR = 0; yR < convInfo.outHeight; ++yR) { + const xRCorner = yR * strideHeight - padTop; + const xRMin = Math.max(0, xRCorner); + const xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner); + const outputRowOffset = outputBatchOffset + yR * outputRowStrides; + for (let yC = 0; yC < convInfo.outWidth; ++yC) { + const xCCorner = yC * strideWidth - padLeft; + const xCMin = Math.max(0, xCCorner); + const xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner); + let minMaxValue = initialValue; + let avgValue = 0; + let count = 0; + for (let xR = xRMin; xR < xRMax; xR += dilationHeight) { + const xROffset = inputBatchOffset + xR * strides[1]; + for (let xC = xCMin; xC < xCMax; xC += dilationWidth) { + const xCOffset = xROffset + xC * strides[2]; + const pixel = xValues[xCOffset + d]; + if ((poolType === 'max' && pixel > minMaxValue)) { + minMaxValue = pixel; + } + else if (poolType === 'avg') { + avgValue += pixel; + count++; + } + } + if (isNaN(minMaxValue)) { + break; + } + } + const outputOffset = outputRowOffset + yC * outputColStrides + d; + outputVals[outputOffset] = + poolType === 'avg' ? avgValue / count : minMaxValue; + } + } + } + } + return output; +} +function maxPoolPositions(xValues, xShape, dtype, convInfo, flattenPositions = false, includeBatchInIndex = false) { + const maxPositions = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(convInfo.outShape, 'int32'); + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const xBuf = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["buffer"])(xShape, dtype, xValues); + for (let b = 0; b < convInfo.batchSize; ++b) { + for (let d = 0; d < convInfo.inChannels; ++d) { + for (let yR = 0; yR < convInfo.outHeight; ++yR) { + const xRCorner = yR * strideHeight - padTop; + let xRMin = xRCorner; + while (xRMin < 0) { + xRMin += dilationHeight; + } + // const xRMin = Math.max(0, xRCorner); + const xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner); + for (let yC = 0; yC < convInfo.outWidth; ++yC) { + const xCCorner = yC * strideWidth - padLeft; + let xCMin = xCCorner; + while (xCMin < 0) { + xCMin += dilationWidth; + } + const xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner); + let maxValue = Number.NEGATIVE_INFINITY; + let maxPosition = -1; + for (let xR = xRMin; xR < xRMax; xR += dilationHeight) { + const wR = xR - xRCorner; + for (let xC = xCMin; xC < xCMax; xC += dilationWidth) { + const wC = xC - xCCorner; + const pixel = xBuf.get(b, xR, xC, d); + if (pixel > maxValue) { + maxValue = pixel; + if (flattenPositions) { + maxPosition = includeBatchInIndex ? + ((b * convInfo.inHeight + xR) * convInfo.inWidth + xC) * + convInfo.inChannels + + d : + (xR * convInfo.inWidth + xC) * convInfo.inChannels + d; + } + else { + maxPosition = wR * effectiveFilterWidth + wC; + } + } + } + } + maxPositions.set(maxPosition, b, yR, yC, d); + } + } + } + } + return maxPositions; +} +//# sourceMappingURL=pool_utils.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js ***! + \****************************************************************************/ +/*! exports provided: createSimpleUnaryImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSimpleUnaryImpl", function() { return createSimpleUnaryImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Template that creates implementation for unary op. + */ +function createSimpleUnaryImpl(op) { + return (values, dtype, attrs) => { + const newValues = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType(dtype, values.length); + for (let i = 0; i < values.length; ++i) { + newValues[i] = op(values[i], attrs); + } + return newValues; + }; +} +//# sourceMappingURL=unary_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js ***! + \*****************************************************************************/ +/*! exports provided: unaryKernelFunc, unaryKernelFuncFromImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unaryKernelFunc", function() { return unaryKernelFunc; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unaryKernelFuncFromImpl", function() { return unaryKernelFuncFromImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _cpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../cpu_util */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +/** + * Template that creates a `KernelFunc` for unary ops. + * @param name Kernel name. + * @param op A `SimpleUnaryOperation` for the kernel. + * @param dtype Optional. If set, the result has this dtype. Otherwise, the + * result has the same dtype as the input. This is mainly used in certain + * kernels that return bool type, such as isFinite, isInf, etc. + */ +function unaryKernelFunc(name, op, dtype) { + return ({ inputs, attrs, backend }) => { + const { x } = inputs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, name); + if (x.dtype === 'string' || dtype === 'string') { + throw new Error('unaryKernelFunc does not support string input/output'); + } + const cpuBackend = backend; + const values = cpuBackend.data.get(x.dataId).values; + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + const $dtype = dtype || x.dtype; + const newValues = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getArrayFromDType($dtype, xSize); + for (let i = 0; i < xSize; ++i) { + newValues[i] = op(values[i], attrs); + } + return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues); + }; +} +/** + * Template that creates a `KernelFunc` for unary ops from the given + * `SimpleUnaryImpl`.. + * @param name Kernel name. + * @param unaryImpl A `SimpleUnaryImpl` that implements the op. + * @param dtype Optional. If set, the result has this dtype. Otherwise, the + * result has the same dtype as the input. This is mainly used in certain + * kernels that return bool type, such as isFinite, isInf, etc. + */ +function unaryKernelFuncFromImpl(name, unaryImpl, dtype) { + return ({ inputs, attrs, backend }) => { + const { x } = inputs; + Object(_cpu_util__WEBPACK_IMPORTED_MODULE_1__["assertNotComplex"])(x, name); + if (x.dtype === 'string' || dtype === 'string') { + throw new Error('unaryKernelFunc does not support string input/output'); + } + const cpuBackend = backend; + const values = cpuBackend.data.get(x.dataId).values; + const $dtype = dtype || x.dtype; + const newValues = unaryImpl(values, $dtype, attrs); + return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues); + }; +} +//# sourceMappingURL=unary_utils.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js ***! + \*******************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +/** @license See the LICENSE file. */ +// This code is auto-generated, do not modify this file! +const version = '2.7.0'; + +//# sourceMappingURL=version.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js ***! + \**********************************************************************/ +/*! exports provided: AddNProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddNProgram", function() { return AddNProgram; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class AddNProgram { + constructor(outputShape, shapes) { + this.outputShape = []; + this.outputShape = outputShape; + this.variableNames = shapes.map((_, i) => `T${i}`); + const snippets = []; + // Get target elements from every input tensor. + this.variableNames.forEach(variable => { + snippets.push(`float v${variable} = get${variable}AtOutCoords();`); + }); + // Calculate the sum of all elements. + const operation = this.variableNames + .map(variable => { + return `v${variable}`; + }) + .join(' + '); + this.userCode = ` + void main() { + ${snippets.join('\n ')} + + float result = ${operation}; + setOutput(result); + } + `; + } +} +//# sourceMappingURL=addn_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: AddNPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddNPackedProgram", function() { return AddNPackedProgram; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class AddNPackedProgram { + constructor(outputShape, shapes) { + this.outputShape = []; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = outputShape; + this.variableNames = shapes.map((_, i) => `T${i}`); + const snippets = []; + // Get target elements from every input tensor. + this.variableNames.forEach(variable => { + snippets.push(`vec4 v${variable} = get${variable}AtOutCoords();`); + }); + // Calculate the sum of all elements. + const operation = this.variableNames + .map(variable => { + return `v${variable}`; + }) + .join(' + '); + this.userCode = ` + void main() { + ${snippets.join('\n ')} + + vec4 result = ${operation}; + setOutput(result); + } + `; + } +} +//# sourceMappingURL=addn_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js ***! + \***************************************************************************/ +/*! exports provided: ArgMinMaxProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgMinMaxProgram", function() { return ArgMinMaxProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ArgMinMaxProgram { + constructor(reduceInfo, op, firstPass) { + this.variableNames = ['A']; + const { windowSize, batchSize, outSize } = reduceInfo; + if (!firstPass) { + this.variableNames.push('bestIndicesA'); + } + this.outputShape = [batchSize, outSize]; + const compOp = (op === 'max') ? '>' : '<'; + const indexSnippet = firstPass ? + 'inOffset + i;' : + 'round(getBestIndicesA(batch, inOffset + i));'; + this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${windowSize}; + + int bestIndex = inOffset; + float bestValue = getA(batch, bestIndex); + + for (int i = 0; i < ${windowSize}; i++) { + int inIdx = ${indexSnippet}; + float candidate = getA(batch, inIdx); + if (candidate ${compOp} bestValue) { + bestValue = candidate; + bestIndex = inIdx; + } + } + setOutput(float(bestIndex)); + } + `; + } +} +//# sourceMappingURL=argminmax_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: ArgMinMaxPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgMinMaxPackedProgram", function() { return ArgMinMaxPackedProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class ArgMinMaxPackedProgram { + constructor(shape, windowSize, op, firstPass) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(shape.length > 2, () => `Packed arg${op.charAt(0).toUpperCase() + + op.slice(1)} supports only inputs with rank above 2.`); + const inSize = shape[shape.length - 1]; + const outSize = Math.ceil(inSize / windowSize); + this.outputShape = shape.slice(0, -1); + if (outSize > 1) { + this.outputShape.push(outSize); + } + if (!firstPass) { + this.variableNames.push('bestIndicesA'); + } + const outShape = this.outputShape; + const rank = outShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_2__["getCoordsDataType"])(rank); + const coords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('coords', rank); + let sourceLocSetup; + let sourceRank; + if (outSize === 1) { + sourceRank = rank + 1; + const sourceLocDType = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_2__["getCoordsDataType"])(sourceRank); + sourceLocSetup = ` + ${sourceLocDType} sourceLocR = ${sourceLocDType}(${coords.join()}, 0); + ++${coords[rank - 1]}; + ${sourceLocDType} sourceLocG = ${sourceLocDType}(${coords.join()}, 0); + ++${coords[rank - 2]}; + ${sourceLocDType} sourceLocA = ${sourceLocDType}(${coords.join()}, 0); + --${coords[rank - 1]}; + ${sourceLocDType} sourceLocB = ${sourceLocDType}(${coords.join()}, 0); + --${coords[rank - 2]};`; + } + else { + sourceRank = rank; + sourceLocSetup = ` + ${dtype} sourceLocR = coords; + ++${coords[rank - 1]}; + ${dtype} sourceLocG = coords; + ++${coords[rank - 2]}; + ${dtype} sourceLocA = coords; + --${coords[rank - 1]}; + ${dtype} sourceLocB = coords; + --${coords[rank - 2]};`; + } + const channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, sourceRank); + const inChannel = '.' + channels[sourceRank - 1]; // e.g. ".b" for rank 3. + const intChannels = channels.map(x => 'int ' + x); + const srcRCoords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('sourceLocR', sourceRank - 1).concat('inIdx.r'); + const srcGCoords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('sourceLocG', sourceRank - 1).concat('inIdx.g'); + const srcBCoords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('sourceLocB', sourceRank - 1).concat('inIdx.b'); + const srcACoords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('sourceLocA', sourceRank - 1).concat('inIdx.a'); + const compOp = (op === 'max') ? 'greaterThan' : 'lessThan'; + const fetchCandidateIdx = firstPass ? '' : ` + inIdx = round(vec4(getBestIndicesAChannel(${srcRCoords.join()}), + getBestIndicesAChannel(${srcGCoords.join()}), + getBestIndicesAChannel(${srcBCoords.join()}), + getBestIndicesAChannel(${srcACoords.join()})));`; + const fetchValue = `vec4( + getAChannel(${srcRCoords.join()}), + hasNextCol ? getAChannel(${srcGCoords.join()}) : 0., + hasNextRow ? getAChannel(${srcBCoords.join()}) : 0., + hasNextRow && hasNextCol ? getAChannel(${srcACoords.join()}) : 0.)`; + const getBestIndicesAChannelSnippet = firstPass ? '' : ` + float getBestIndicesAChannel(${intChannels.join()}) { + return getChannel(getBestIndicesA(${channels.join()}), + vec2(${channels.slice(-2).join()})); + }`; + this.userCode = ` + float getAChannel(${intChannels.join()}) { + return getChannel(getA(${channels.join()}), + vec2(${channels.slice(-2).join()})); + } + ${getBestIndicesAChannelSnippet} + void main() { + ${dtype} coords = getOutputCoords(); + bool hasNextCol = ${coords[rank - 1]} < ${outShape[rank - 1] - 1}; + bool hasNextRow = ${coords[rank - 2]} < ${outShape[rank - 2] - 1}; + ${sourceLocSetup} + ivec4 srcIdx = ivec4(sourceLocR${inChannel}, sourceLocG${inChannel}, + sourceLocB${inChannel}, sourceLocA${inChannel}) * ${windowSize}; + ivec4 inIdx = srcIdx; + vec4 bestIndex = vec4(inIdx); + vec4 bestValue = ${fetchValue}; + + for (int i = 0; i < ${windowSize}; i++) { + inIdx = srcIdx; + ${fetchCandidateIdx} + vec4 candidate = ${fetchValue}; + bvec4 nan = isnan(candidate); + bvec4 replace = bvec4( + vec4(${compOp}(candidate, bestValue)) * (vec4(1.0) - vec4(nan))); + + bestValue = vec4(replace.x ? candidate.x : bestValue.x, + replace.y ? candidate.y : bestValue.y, + replace.z ? candidate.z : bestValue.z, + replace.w ? candidate.w : bestValue.w); + bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace)); + srcIdx++; + } + setOutput(bestIndex); + } + `; + } +} +//# sourceMappingURL=argminmax_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: AvgPool2DBackpropProgram, AvgPool3DBackpropProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvgPool2DBackpropProgram", function() { return AvgPool2DBackpropProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvgPool3DBackpropProgram", function() { return AvgPool3DBackpropProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class AvgPool2DBackpropProgram { + constructor(convInfo) { + this.variableNames = ['dy']; + this.outputShape = convInfo.inShape; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const avgMultiplier = 1 / (filterHeight * filterWidth); + this.userCode = ` + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + const float avgMultiplier = float(${avgMultiplier}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${effectiveFilterWidth}; + wC+= ${dilationWidth}) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + + dotProd += dyValue * avgMultiplier; + } + } + setOutput(dotProd); + } + `; + } +} +class AvgPool3DBackpropProgram { + constructor(convInfo) { + this.variableNames = ['dy']; + this.outputShape = convInfo.inShape; + const filterDepth = convInfo.filterDepth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth); + this.userCode = ` + const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft}); + const float avgMultiplier = float(${avgMultiplier}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${effectiveFilterDepth}; + wD += ${dilationDepth}) { + float dyD = float(dyDCorner + wD) / ${strideDepth}.0; + + if (dyD < 0.0 || dyD >= ${convInfo.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${effectiveFilterWidth}; + wC += ${dilationWidth}) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + + dotProd += dyValue * avgMultiplier; + } + } + } + setOutput(dotProd); + } + `; + } +} +//# sourceMappingURL=avg_pool_backprop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js ***! + \***************************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, getBinaryCache, MATMUL_SHARED_DIM_THRESHOLD, MathBackendWebGL */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EPSILON_FLOAT32", function() { return EPSILON_FLOAT32; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EPSILON_FLOAT16", function() { return EPSILON_FLOAT16; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBinaryCache", function() { return getBinaryCache; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MATMUL_SHARED_DIM_THRESHOLD", function() { return MATMUL_SHARED_DIM_THRESHOLD; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MathBackendWebGL", function() { return MathBackendWebGL; }); +/* harmony import */ var _flags_webgl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./flags_webgl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js"); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/* harmony import */ var _addn_gpu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addn_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js"); +/* harmony import */ var _addn_packed_gpu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addn_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js"); +/* harmony import */ var _argminmax_gpu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./argminmax_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js"); +/* harmony import */ var _argminmax_packed_gpu__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./argminmax_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js"); +/* harmony import */ var _avg_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./avg_pool_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"); +/* harmony import */ var _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./binaryop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"); +/* harmony import */ var _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./binaryop_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/* harmony import */ var _canvas_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./canvas_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"); +/* harmony import */ var _clip_gpu__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./clip_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js"); +/* harmony import */ var _clip_packed_gpu__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./clip_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js"); +/* harmony import */ var _complex_abs_gpu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./complex_abs_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js"); +/* harmony import */ var _conv_backprop_gpu__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./conv_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js"); +/* harmony import */ var _conv_backprop_gpu_depthwise__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./conv_backprop_gpu_depthwise */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js"); +/* harmony import */ var _conv_gpu__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./conv_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js"); +/* harmony import */ var _conv_gpu_depthwise__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./conv_gpu_depthwise */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js"); +/* harmony import */ var _conv_packed_gpu_depthwise__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./conv_packed_gpu_depthwise */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js"); +/* harmony import */ var _crop_and_resize_gpu__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./crop_and_resize_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js"); +/* harmony import */ var _cumsum_gpu__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./cumsum_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js"); +/* harmony import */ var _decode_matrix_gpu__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./decode_matrix_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js"); +/* harmony import */ var _decode_matrix_packed_gpu__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./decode_matrix_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js"); +/* harmony import */ var _depth_to_space_gpu__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./depth_to_space_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js"); +/* harmony import */ var _diag_gpu__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./diag_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js"); +/* harmony import */ var _encode_float_gpu__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./encode_float_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js"); +/* harmony import */ var _encode_float_packed_gpu__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./encode_float_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js"); +/* harmony import */ var _encode_matrix_gpu__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./encode_matrix_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js"); +/* harmony import */ var _encode_matrix_packed_gpu__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./encode_matrix_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js"); +/* harmony import */ var _fill_gpu__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./fill_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js"); +/* harmony import */ var _gather_gpu__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./gather_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js"); +/* harmony import */ var _gather_nd_gpu__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./gather_nd_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js"); +/* harmony import */ var _gpgpu_context__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./gpgpu_context */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"); +/* harmony import */ var _gpgpu_math__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./gpgpu_math */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js"); +/* harmony import */ var _im2col_packed_gpu__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./im2col_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js"); +/* harmony import */ var _lrn_gpu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./lrn_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js"); +/* harmony import */ var _lrn_grad_gpu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./lrn_grad_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js"); +/* harmony import */ var _lrn_packed_gpu__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./lrn_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js"); +/* harmony import */ var _max_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./max_pool_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"); +/* harmony import */ var _mulmat_packed_gpu__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./mulmat_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js"); +/* harmony import */ var _multinomial_gpu__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./multinomial_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js"); +/* harmony import */ var _onehot_gpu__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./onehot_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js"); +/* harmony import */ var _pack_gpu__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./pack_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js"); +/* harmony import */ var _pad_gpu__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./pad_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js"); +/* harmony import */ var _pad_packed_gpu__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./pad_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js"); +/* harmony import */ var _pool_gpu__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./pool_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/* harmony import */ var _reduce_gpu__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./reduce_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js"); +/* harmony import */ var _reshape_packed_gpu__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./reshape_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js"); +/* harmony import */ var _resize_bilinear_backprop_gpu__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./resize_bilinear_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js"); +/* harmony import */ var _resize_bilinear_gpu__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./resize_bilinear_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js"); +/* harmony import */ var _resize_bilinear_packed_gpu__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./resize_bilinear_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js"); +/* harmony import */ var _resize_nearest_neighbor_backprop_gpu__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./resize_nearest_neighbor_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js"); +/* harmony import */ var _resize_nearest_neighbor_gpu__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./resize_nearest_neighbor_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js"); +/* harmony import */ var _reverse_gpu__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./reverse_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js"); +/* harmony import */ var _reverse_packed_gpu__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./reverse_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js"); +/* harmony import */ var _scatter_gpu__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./scatter_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js"); +/* harmony import */ var _segment_gpu__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./segment_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js"); +/* harmony import */ var _select_gpu__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./select_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js"); +/* harmony import */ var _slice_gpu__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./slice_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js"); +/* harmony import */ var _slice_packed_gpu__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./slice_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js"); +/* harmony import */ var _strided_slice_gpu__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./strided_slice_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/* harmony import */ var _texture_manager__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./texture_manager */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js"); +/* harmony import */ var _tile_gpu__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./tile_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js"); +/* harmony import */ var _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./unaryop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/* harmony import */ var _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./unaryop_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js"); +/* harmony import */ var _unpack_gpu__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./unpack_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Import webgl flags. + + + + + + +const { segment_util } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"]; +const split = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["kernel_impls"].split; +const tile = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["kernel_impls"].tile; +const topkImpl = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["kernel_impls"].topkImpl; +const whereImpl = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["kernel_impls"].whereImpl; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const EPSILON_FLOAT32 = 1e-7; +const EPSILON_FLOAT16 = 1e-4; +const binaryCaches = {}; +function getBinaryCache(webGLVersion) { + if (webGLVersion in binaryCaches) { + return binaryCaches[webGLVersion]; + } + binaryCaches[webGLVersion] = {}; + return binaryCaches[webGLVersion]; +} +function mapActivationToShaderProgram(activation, packed = false) { + if (activation === 'linear') { + if (packed) { + return _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["LINEAR"]; + } + return _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["LINEAR"]; + } + else if (activation === 'relu') { + if (packed) { + return _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["RELU"]; + } + return _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["RELU"]; + } + else if (activation === 'elu') { + if (packed) { + return _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["ELU"]; + } + return _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ELU"]; + } + else if (activation === 'relu6') { + if (packed) { + return _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["RELU6"]; + } + return _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["RELU6"]; + } + else if (activation === 'prelu') { + if (packed) { + return _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["PRELU"]; + } + return _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["PRELU"]; + } + throw new Error(`Activation ${activation} has not been implemented for the WebGL backend.`); +} +// Empirically determined constant used to determine size threshold for handing +// off execution to the CPU. +const CPU_HANDOFF_SIZE_THRESHOLD = 128; +// Empirically determined constant used to decide the number of MB on GPU +// before we warn about high memory use. The MB are this constant * screen area +// * dpi / 1024 / 1024. +const BEFORE_PAGING_CONSTANT = 600; +function numMBBeforeWarning() { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().global.screen == null) { + return 1024; // 1 GB. + } + return (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().global.screen.height * Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().global.screen.width * + window.devicePixelRatio) * + BEFORE_PAGING_CONSTANT / 1024 / 1024; +} +// Empirically determined minimal shared dimension in matmul before we forward +// to a.mul(b).sum() in order to take advantage of GPU parallelism. See +// https://github.com/tensorflow/tfjs-core/pull/1379 for benchmarks. +const MATMUL_SHARED_DIM_THRESHOLD = 1000; +class MathBackendWebGL extends _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["KernelBackend"] { + constructor(gpgpu) { + super(); + // Maps data ids that have a pending read operation, to list of subscribers. + this.pendingRead = new WeakMap(); + // List of data ids that are scheduled for disposal, but are waiting on a + // pending read operation. + this.pendingDisposal = new WeakSet(); + // Used to count the number of 'shallow' sliced tensors that point to the + // same data id. + this.dataRefCount = new WeakMap(); + this.numBytesInGPU = 0; + // Accumulated time spent (including blocking) in uploading data to webgl. + this.uploadWaitMs = 0; + // Accumulated time spent (including blocking in downloading data from webgl. + this.downloadWaitMs = 0; + this.warnedAboutMemory = false; + this.warnedAboutCPUBackend = false; + this.pendingDeletes = 0; + this.disposed = false; + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('HAS_WEBGL')) { + throw new Error('WebGL is not supported on this device'); + } + if (gpgpu == null) { + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_10__["getWebGLContext"])(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_VERSION')); + this.binaryCache = getBinaryCache(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_VERSION')); + this.gpgpu = new _gpgpu_context__WEBPACK_IMPORTED_MODULE_32__["GPGPUContext"](gl); + this.canvas = gl.canvas; + this.gpgpuCreatedLocally = true; + } + else { + this.gpgpu = gpgpu; + this.binaryCache = {}; + this.gpgpuCreatedLocally = false; + this.canvas = gpgpu.gl.canvas; + } + this.textureManager = new _texture_manager__WEBPACK_IMPORTED_MODULE_62__["TextureManager"](this.gpgpu); + this.numMBBeforeWarning = numMBBeforeWarning(); + this.texData = new _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["DataStorage"](this, Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["engine"])()); + } + numDataIds() { + return this.texData.numDataIds() + + (this.cpuBackend ? this.cpuBackend.numDataIds() : 0) - + this.pendingDeletes; + } + write(values, shape, dtype) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_CHECK_NUMERICAL_PROBLEMS') || + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('DEBUG')) { + this.checkNumericalProblems(values); + } + if (dtype === 'complex64' && values != null) { + throw new Error(`Cannot write to a complex64 dtype. ` + + `Please use tf.complex(real, imag).`); + } + const dataId = {}; + this.texData.set(dataId, { + shape, + dtype, + values, + usage: _tex_util__WEBPACK_IMPORTED_MODULE_61__["TextureUsage"].UPLOAD, + refCount: 1, + complexParentRefCount: 0 + }); + return dataId; + } + /** Increase refCount of a `TextureData`. */ + incRef(dataId) { + const texData = this.texData.get(dataId); + texData.refCount++; + } + /** Decrease refCount of a `TextureData`. */ + decRef(dataId) { + if (this.texData.has(dataId)) { + const texData = this.texData.get(dataId); + texData.refCount--; + } + } + move(dataId, values, shape, dtype) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('DEBUG')) { + this.checkNumericalProblems(values); + } + if (dtype === 'complex64') { + throw new Error(`Cannot write to a complex64 dtype. ` + + `Please use tf.complex(real, imag).`); + } + this.texData.set(dataId, { + shape, + dtype, + values, + usage: _tex_util__WEBPACK_IMPORTED_MODULE_61__["TextureUsage"].UPLOAD, + refCount: 1, + complexParentRefCount: 0 + }); + } + disposeIntermediateTensorInfo(tensorInfo) { + const dataId = tensorInfo.dataId; + if (this.texData.has(dataId)) { + const textureData = this.texData.get(dataId); + textureData.refCount--; + if (textureData.refCount < 1) { + this.disposeData(dataId); + } + } + } + readSync(dataId) { + const texData = this.texData.get(dataId); + const { values, dtype, complexTensorInfos, slice, shape, isPacked } = texData; + // The presence of `slice` indicates this tensor is a shallow slice of a + // different tensor, and is using that original tensor's texture. Run + // `clone` in order to copy that texture and read from it. + if (slice != null) { + let program; + if (isPacked) { + program = new _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["UnaryOpPackedProgram"](shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["CLONE"]); + } + else { + program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["CLONE"]); + } + const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype); + const data = this.readSync(res.dataId); + this.disposeIntermediateTensorInfo(res); + return data; + } + if (values != null) { + return this.convertAndCacheOnCPU(dataId); + } + if (dtype === 'string') { + return values; + } + const shouldTimeProgram = this.activeTimers != null; + let start; + if (shouldTimeProgram) { + start = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].now(); + } + let result; + if (dtype === 'complex64') { + const realValues = this.readSync(complexTensorInfos.real.dataId); + const imagValues = this.readSync(complexTensorInfos.imag.dataId); + result = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].mergeRealAndImagArrays(realValues, imagValues); + } + else { + result = this.getValuesFromTexture(dataId); + } + if (shouldTimeProgram) { + this.downloadWaitMs += _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].now() - start; + } + return this.convertAndCacheOnCPU(dataId, result); + } + async read(dataId) { + if (this.pendingRead.has(dataId)) { + const subscribers = this.pendingRead.get(dataId); + return new Promise(resolve => subscribers.push(resolve)); + } + const texData = this.texData.get(dataId); + const { values, shape, slice, dtype, complexTensorInfos, isPacked } = texData; + // The presence of `slice` indicates this tensor is a shallow slice of a + // different tensor, and is using that original tensor's texture. Run + // `clone` in order to copy that texture and read from it. + if (slice != null) { + let program; + if (isPacked) { + program = new _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["UnaryOpPackedProgram"](shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["CLONE"]); + } + else { + program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["CLONE"]); + } + const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype); + const data = this.read(res.dataId); + this.disposeIntermediateTensorInfo(res); + return data; + } + if (values != null) { + return this.convertAndCacheOnCPU(dataId); + } + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED') && + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_VERSION') === 2) { + throw new Error(`tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and ` + + `WEBGL_VERSION=2 not yet supported.`); + } + let buffer = null; + let tmpDownloadTarget; + if (dtype !== 'complex64' && Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().get('WEBGL_BUFFER_SUPPORTED')) { + // Possibly copy the texture into a buffer before inserting a fence. + tmpDownloadTarget = this.decode(dataId); + const tmpData = this.texData.get(tmpDownloadTarget.dataId); + buffer = this.gpgpu.createBufferFromTexture(tmpData.texture, ..._tex_util__WEBPACK_IMPORTED_MODULE_61__["getDenseTexShape"](shape)); + } + this.pendingRead.set(dataId, []); + if (dtype !== 'complex64') { + // Create a fence and wait for it to resolve. + await this.gpgpu.createAndWaitForFence(); + } + // Download the values from the GPU. + let vals; + if (dtype === 'complex64') { + const ps = await Promise.all([ + this.read(complexTensorInfos.real.dataId), + this.read(complexTensorInfos.imag.dataId) + ]); + const realValues = ps[0]; + const imagValues = ps[1]; + vals = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].mergeRealAndImagArrays(realValues, imagValues); + } + else if (buffer == null) { + vals = this.getValuesFromTexture(dataId); + } + else { + const size = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(shape); + vals = this.gpgpu.downloadFloat32MatrixFromBuffer(buffer, size); + } + if (tmpDownloadTarget != null) { + this.disposeIntermediateTensorInfo(tmpDownloadTarget); + } + const dTypeVals = this.convertAndCacheOnCPU(dataId, vals); + const subscribers = this.pendingRead.get(dataId); + this.pendingRead.delete(dataId); + // Notify all pending reads. + subscribers.forEach(resolve => resolve(dTypeVals)); + if (this.pendingDisposal.has(dataId)) { + this.pendingDisposal.delete(dataId); + this.disposeData(dataId); + this.pendingDeletes--; + } + return dTypeVals; + } + checkNumericalProblems(values) { + if (values == null) { + return; + } + for (let i = 0; i < values.length; i++) { + const num = values[i]; + if (!_webgl_util__WEBPACK_IMPORTED_MODULE_67__["canBeRepresented"](num)) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_RENDER_FLOAT32_CAPABLE')) { + throw Error(`The value ${num} cannot be represented with your ` + + `current settings. Consider enabling float32 rendering: ` + + `'tf.env().set('WEBGL_RENDER_FLOAT32_ENABLED', true);'`); + } + throw Error(`The value ${num} cannot be represented on this device.`); + } + } + } + getValuesFromTexture(dataId) { + const { shape, dtype, isPacked } = this.texData.get(dataId); + const size = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(shape); + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED')) { + const tmpTarget = this.decode(dataId); + const tmpData = this.texData.get(tmpTarget.dataId); + const vals = this.gpgpu + .downloadMatrixFromPackedTexture(tmpData.texture, ..._tex_util__WEBPACK_IMPORTED_MODULE_61__["getDenseTexShape"](shape)) + .subarray(0, size); + this.disposeIntermediateTensorInfo(tmpTarget); + return vals; + } + const shouldUsePackedProgram = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK') && isPacked === true; + const outputShape = shouldUsePackedProgram ? _webgl_util__WEBPACK_IMPORTED_MODULE_67__["getShapeAs3D"](shape) : shape; + const program = shouldUsePackedProgram ? + new _encode_float_packed_gpu__WEBPACK_IMPORTED_MODULE_26__["EncodeFloatPackedProgram"](outputShape) : + new _encode_float_gpu__WEBPACK_IMPORTED_MODULE_25__["EncodeFloatProgram"](outputShape); + const output = this.runWebGLProgram(program, [{ shape: outputShape, dtype, dataId }], 'float32'); + const tmpData = this.texData.get(output.dataId); + const vals = this.gpgpu + .downloadByteEncodedFloatMatrixFromOutputTexture(tmpData.texture, tmpData.texShape[0], tmpData.texShape[1]) + .subarray(0, size); + this.disposeIntermediateTensorInfo(output); + return vals; + } + async time(f) { + const oldActiveTimers = this.activeTimers; + const newActiveTimers = []; + let outerMostTime = false; + if (this.programTimersStack == null) { + this.programTimersStack = newActiveTimers; + outerMostTime = true; + } + else { + this.activeTimers.push(newActiveTimers); + } + this.activeTimers = newActiveTimers; + f(); + // needing to split these up because util.flatten only accepts certain types + const flattenedActiveTimerQueries = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].flatten(this.activeTimers.map((d) => d.query)) + .filter(d => d != null); + const flattenedActiveTimerNames = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].flatten(this.activeTimers.map((d) => d.name)) + .filter(d => d != null); + this.activeTimers = oldActiveTimers; + if (outerMostTime) { + this.programTimersStack = null; + } + const res = { + uploadWaitMs: this.uploadWaitMs, + downloadWaitMs: this.downloadWaitMs, + kernelMs: null, + wallMs: null // will be filled by the engine + }; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) { + const kernelMs = await Promise.all(flattenedActiveTimerQueries); + res['kernelMs'] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sum(kernelMs); + res['getExtraProfileInfo'] = () => kernelMs.map((d, i) => ({ name: flattenedActiveTimerNames[i], ms: d })) + .map(d => `${d.name}: ${d.ms}`) + .join(', '); + } + else { + res['kernelMs'] = { + error: 'WebGL query timers are not supported in this environment.' + }; + } + this.uploadWaitMs = 0; + this.downloadWaitMs = 0; + return res; + } + memory() { + return { + unreliable: false, + numBytesInGPU: this.numBytesInGPU, + numBytesInGPUAllocated: this.textureManager.numBytesAllocated, + numBytesInGPUFree: this.textureManager.numBytesFree + }; + } + startTimer() { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) { + return this.gpgpu.beginQuery(); + } + return { startMs: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].now(), endMs: null }; + } + endTimer(query) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) { + this.gpgpu.endQuery(); + return query; + } + query.endMs = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].now(); + return query; + } + async getQueryTime(query) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) { + return this.gpgpu.waitForQueryAndGetTime(query); + } + const timerQuery = query; + return timerQuery.endMs - timerQuery.startMs; + } + disposeData(dataId) { + if (this.pendingDisposal.has(dataId)) { + return; + } + if (this.pendingRead.has(dataId)) { + this.pendingDisposal.add(dataId); + this.pendingDeletes++; + return; + } + // No-op if already disposed. + if (!this.texData.has(dataId)) { + return; + } + // Trying to dispose a textureData that has a 'kept' refCount, e.g. trying + // to dispose a tensor whose data bucket is shared with a complex tensor. In + // this case we are removing a reference to the textureData, but we + // shouldn't actually dispose the texture. + if (this.texData.get(dataId).complexParentRefCount > 0) { + this.texData.get(dataId).refCount--; + return; + } + this.releaseGPUData(dataId); + const { complexTensorInfos } = this.texData.get(dataId); + if (complexTensorInfos != null) { + this.texData.get(complexTensorInfos.real.dataId).complexParentRefCount--; + this.disposeIntermediateTensorInfo(complexTensorInfos.real); + this.texData.get(complexTensorInfos.imag.dataId).complexParentRefCount--; + this.disposeIntermediateTensorInfo(complexTensorInfos.imag); + } + this.texData.delete(dataId); + } + releaseGPUData(dataId) { + const { texture, dtype, texShape, usage, isPacked, slice } = this.texData.get(dataId); + const key = slice && slice.origDataId || dataId; + const refCount = this.dataRefCount.get(key); + if (refCount > 1) { + this.dataRefCount.set(key, refCount - 1); + } + else { + this.dataRefCount.delete(key); + if (texture != null) { + this.numBytesInGPU -= this.computeBytes(texShape, dtype); + this.textureManager.releaseTexture(texture, texShape, usage, isPacked); + } + } + const texData = this.texData.get(dataId); + texData.texture = null; + texData.texShape = null; + texData.isPacked = false; + texData.slice = null; + } + getTexture(dataId) { + this.uploadToGPU(dataId); + return this.texData.get(dataId).texture; + } + /** + * Returns internal information for the specific data bucket. Used in unit + * tests. + */ + getDataInfo(dataId) { + return this.texData.get(dataId); + } + getCPUBackend() { + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_CPU_FORWARD')) { + return null; + } + if (this.cpuBackend == null) { + this.cpuBackend = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["engine"])().findBackend('cpu'); + } + return this.cpuBackend; + } + /* + Tests whether all the inputs to an op are small and on the CPU. This heuristic + determines when it would be faster to execute a kernel on the CPU. WebGL + kernels opt into running this check and forwarding when appropriate. + TODO(https://github.com/tensorflow/tfjs/issues/872): Develop a more + sustainable strategy for optimizing backend execution of ops. + */ + shouldExecuteOnCPU(inputs, sizeThreshold = CPU_HANDOFF_SIZE_THRESHOLD) { + const cpuBackend = this.getCPUBackend(); + if (!this.warnedAboutCPUBackend && cpuBackend == null) { + console.warn('Your application contains ops that are small enough to be ' + + 'executed on the CPU backend, however the CPU backend cannot ' + + 'be found. Consider importing the CPU backend ' + + '(@tensorflow/tfjs-backend-cpu) for better performance.'); + this.warnedAboutCPUBackend = true; + } + return cpuBackend != null && + inputs.every(input => this.texData.get(input.dataId).texture == null && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(input.shape) < sizeThreshold); + } + getGPGPUContext() { + return this.gpgpu; + } + slice(x, begin, size) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["sliceImplCPU"])(this.texData.get(x.dataId).values, begin, size, x.shape, x.dtype); + return this.makeOutput(size, x.dtype, outValues); + } + // Short-circuit computation if the slice is zero-sized. + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(size) === 0) { + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["tensor"])([], size, x.dtype); + } + const { isPacked } = this.texData.get(x.dataId); + const isContinous = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["slice_util"].isSliceContinous(x.shape, begin, size); + if (isPacked || !isContinous) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? + new _slice_packed_gpu__WEBPACK_IMPORTED_MODULE_59__["SlicePackedProgram"](size) : + new _slice_gpu__WEBPACK_IMPORTED_MODULE_58__["SliceProgram"](size); + const customSetup = program.getCustomSetupFunc(begin); + return this.compileAndRun(program, [x], null, customSetup); + } + this.uploadToGPU(x.dataId); + return this.shallowSlice(x, begin, size); + } + shallowSlice(x, begin, size) { + const xTexData = this.texData.get(x.dataId); + const t = this.makeOutput(size, x.dtype); + const newTexData = this.texData.get(t.dataId); + // Copy texture data from the original tensor. + Object.assign(newTexData, xTexData); + newTexData.shape = size; + newTexData.dtype = x.dtype; + let flatOffset = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["slice_util"].computeFlatOffset(begin, x.strides); + if (xTexData.slice) { + // We are slicing an already sliced tensor, so we have to accumulate + // the offset. + flatOffset += xTexData.slice.flatOffset; + } + newTexData.slice = { + flatOffset, + // Point to the original dataId, which is used to do ref counting. + origDataId: xTexData.slice && xTexData.slice.origDataId || x.dataId + }; + // Increase the ref count for that data bucket. + const refCount = this.dataRefCount.get(newTexData.slice.origDataId) || 1; + this.dataRefCount.set(newTexData.slice.origDataId, refCount + 1); + return t; + } + stridedSlice(x, begin, end, strides) { + const cpuRes = this.tryRunOnCpuOrThrow([x], () => this.cpuBackend.stridedSlice(x, begin, end, strides)); + if (cpuRes) { + return cpuRes; + } + const outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["slice_util"].computeOutShape(begin, end, strides); + if (outShape.some(axis => axis === 0)) { + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["tensor"])([], outShape); + } + const program = new _strided_slice_gpu__WEBPACK_IMPORTED_MODULE_60__["StridedSliceProgram"](begin, strides, outShape); + return this.compileAndRun(program, [x]); + } + reverse(x, axis) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? + new _reverse_packed_gpu__WEBPACK_IMPORTED_MODULE_54__["ReversePackedProgram"](x.shape, axis) : + new _reverse_gpu__WEBPACK_IMPORTED_MODULE_53__["ReverseProgram"](x.shape, axis); + return this.compileAndRun(program, [x]); + } + neg(x) { + const cpuRes = this.tryRunOnCpuOrThrow([x], () => this.cpuBackend.neg(x)); + if (cpuRes) { + return cpuRes; + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["NEG"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["NEG"]); + return this.compileAndRun(program, [x]); + } + batchMatMul(a, b, transposeA, transposeB) { + const outerShapeA = transposeA ? a.shape[2] : a.shape[1]; + const outerShapeB = transposeB ? b.shape[1] : b.shape[2]; + const sharedDim = transposeA ? a.shape[1] : a.shape[2]; + const batch = Math.max(a.shape[0], b.shape[0]); + // Since the matrices are vectors, it is faster to call mul().sum() + // because sum() is O(sqrt(N)) due to divide-and-conquer. + if ((outerShapeA === 1 || outerShapeB === 1) && + sharedDim > MATMUL_SHARED_DIM_THRESHOLD) { + if (transposeA) { + a = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["transpose"])(a, [0, 2, 1]); + } + if (transposeB) { + b = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["transpose"])(b, [0, 2, 1]); + } + const a3D = outerShapeB === 1 ? a : a.as3D(batch, sharedDim, 1); + const axis = outerShapeB === 1 ? 2 : 1; + const b3D = outerShapeB === 1 ? b.as3D(batch, 1, sharedDim) : b; + // TODO(annxingyuan): Call multiply directly as part of batchMatMul + // modularization. + const product = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["mul"](a3D, b3D); + return product.sum(axis, true /* keepDims */); + } + const dtype = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["upcastType"])(a.dtype, b.dtype); + const program = new _mulmat_packed_gpu__WEBPACK_IMPORTED_MODULE_39__["MatMulPackedProgram"](a.shape, b.shape, [batch, outerShapeA, outerShapeB], transposeA, transposeB); + return this.compileAndRun(program, [a, b], dtype); + } + fusedBatchMatMul({ a, b, transposeA, transposeB, bias, activation, preluActivationWeights }) { + const outerShapeA = transposeA ? a.shape[2] : a.shape[1]; + const outerShapeB = transposeB ? b.shape[1] : b.shape[2]; + const batch = Math.max(a.shape[0], b.shape[0]); + const dtype = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["upcastType"])(a.dtype, b.dtype); + const hasBias = bias != null; + const hasPreluActivationWeights = preluActivationWeights != null; + const fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null; + const program = new _mulmat_packed_gpu__WEBPACK_IMPORTED_MODULE_39__["MatMulPackedProgram"](a.shape, b.shape, [batch, outerShapeA, outerShapeB], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights); + const inputs = [a, b]; + if (bias) { + inputs.push(bias); + } + if (preluActivationWeights) { + inputs.push(preluActivationWeights); + } + return this.compileAndRun(program, inputs, dtype); + } + localResponseNormalization4D(x, radius, bias, alpha, beta) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_NORMALIZATION') ? + new _lrn_packed_gpu__WEBPACK_IMPORTED_MODULE_37__["LRNPackedProgram"](x.shape, radius, bias, alpha, beta) : + new _lrn_gpu__WEBPACK_IMPORTED_MODULE_35__["LRNProgram"](x.shape, radius, bias, alpha, beta); + return this.compileAndRun(program, [x]); + } + LRNGrad(dy, inputImage, outputImage, depthRadius, bias, alpha, beta) { + const program = new _lrn_grad_gpu__WEBPACK_IMPORTED_MODULE_36__["LRNGradProgram"](inputImage.shape, depthRadius, bias, alpha, beta); + return this.compileAndRun(program, [inputImage, outputImage, dy]); + } + tile(x, reps) { + if (x.dtype === 'string') { + const data = this.readSync(x.dataId); + const decodedData = data.map(d => _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].decodeString(d)); + const buf = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["buffer"])(x.shape, x.dtype, decodedData); + return tile(buf, reps); + } + const program = new _tile_gpu__WEBPACK_IMPORTED_MODULE_63__["TileProgram"](x.shape, reps); + return this.compileAndRun(program, [x]); + } + pad(x, paddings, constantValue) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? + new _pad_packed_gpu__WEBPACK_IMPORTED_MODULE_44__["PadPackedProgram"](x.shape, paddings, constantValue) : + new _pad_gpu__WEBPACK_IMPORTED_MODULE_43__["PadProgram"](x.shape, paddings, constantValue); + return this.compileAndRun(program, [x]); + } + gather(x, indices, axis) { + const cpuRes = this.tryRunOnCpuOrThrow([x, indices], () => this.cpuBackend.gather(x, indices, axis)); + if (cpuRes) { + return cpuRes; + } + const program = new _gather_gpu__WEBPACK_IMPORTED_MODULE_30__["GatherProgram"](x.shape, indices.size, axis); + return this.compileAndRun(program, [x, indices]); + } + batchToSpaceND(x, blockShape, crops) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].assert(x.rank <= 4, () => 'batchToSpaceND for rank > 4 with a WebGL backend not ' + + 'implemented yet'); + const prod = blockShape.reduce((a, b) => a * b); + const reshaped = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getReshaped(x.shape, blockShape, prod); + const permuted = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getPermuted(reshaped.length, blockShape.length); + const reshapedPermuted = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getReshapedPermuted(x.shape, blockShape, prod); + const sliceBeginCoords = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getSliceBeginCoords(crops, blockShape.length); + const sliceSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getSliceSize(reshapedPermuted, crops, blockShape.length); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["transpose"])(x.reshape(reshaped), permuted) + .reshape(reshapedPermuted) + .slice(sliceBeginCoords, sliceSize); + } + spaceToBatchND(x, blockShape, paddings) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].assert(x.rank <= 4, () => 'spaceToBatchND for rank > 4 with a WebGL backend not ' + + 'implemented yet'); + const prod = blockShape.reduce((a, b) => a * b); + const completePaddings = [[0, 0]]; + completePaddings.push(...paddings); + for (let i = 1 + blockShape.length; i < x.shape.length; ++i) { + completePaddings.push([0, 0]); + } + const paddedX = x.pad(completePaddings); + const reshapedPaddedShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getReshaped(paddedX.shape, blockShape, prod, false); + const permutedReshapedPaddedPermutation = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getPermuted(reshapedPaddedShape.length, blockShape.length, false); + const flattenShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getReshapedPermuted(paddedX.shape, blockShape, prod, false); + const paddedXT = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["transpose"])(paddedX.reshape(reshapedPaddedShape), permutedReshapedPaddedPermutation); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["reshape"])(paddedXT, flattenShape); + } + reduce(x, reduceType, dtype) { + const batchSize = x.shape[0]; + const inSize = x.shape[1]; + const windowSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOptimalWindowSize(inSize); + const outSize = Math.ceil(inSize / windowSize); + const reduceInfo = { windowSize, inSize, batchSize, outSize }; + const program = new _reduce_gpu__WEBPACK_IMPORTED_MODULE_46__["ReduceProgram"](reduceInfo, reduceType); + const output = this.compileAndRun(program, [x], dtype); + // No need to run another GPGPU program. + if (output.shape[1] === 1) { + return output; + } + return this.reduce(output, reduceType, dtype); + } + argReduce(x, reduceType, bestIndicesA = null) { + let batchSize = x.shape[0]; + let inSize = x.shape[1]; + if (bestIndicesA != null) { + batchSize = bestIndicesA.shape[0]; + inSize = bestIndicesA.shape[1]; + } + const windowSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOptimalWindowSize(inSize); + const reduceInfo = { + windowSize, + inSize, + batchSize, + outSize: Math.ceil(inSize / windowSize) + }; + const program = new _argminmax_gpu__WEBPACK_IMPORTED_MODULE_5__["ArgMinMaxProgram"](reduceInfo, reduceType, bestIndicesA == null); + const inputs = [x]; + if (bestIndicesA != null) { + inputs.push(bestIndicesA); + } + const output = this.compileAndRun(program, inputs, 'int32'); + // No need to run another GPGPU program. + if (output.shape[1] === 1) { + return output; + } + return this.argReduce(x, reduceType, output); + } + argReducePacked(x, reduceType, bestIndicesA = null) { + const inShape = bestIndicesA != null ? bestIndicesA.shape : x.shape; + const inSize = inShape[inShape.length - 1]; + const windowSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOptimalWindowSize(inSize); + const program = new _argminmax_packed_gpu__WEBPACK_IMPORTED_MODULE_6__["ArgMinMaxPackedProgram"](inShape, windowSize, reduceType, bestIndicesA == null); + const inputs = bestIndicesA == null ? [x] : [x, bestIndicesA]; + const output = this.compileAndRun(program, inputs, 'int32'); + if (output.rank === x.rank) { + return this.argReducePacked(x, reduceType, output); + } + return output; + } + sum(x, axes) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].assertAxesAreInnerMostDims('sum', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(reduceShape); + const a2D = x.as2D(-1, inSize); + const outputDType = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["sumOutType"](x.dtype); + return this.reduce(a2D, 'sum', outputDType).reshape(outShape); + } + prod(x, axes) { + const cpuRes = this.tryRunOnCpuOrThrow([x], () => this.cpuBackend.prod(x, axes)); + if (cpuRes) { + return cpuRes; + } + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(reduceShape); + const a2D = x.as2D(-1, inSize); + const outputDType = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["sumOutType"](x.dtype); + return this.reduce(a2D, 'prod', outputDType).reshape(outShape); + } + unsortedSegmentSum(x, segmentIds, numSegments) { + let axis = 0; + const permutation = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getAxesPermutation([axis], x.rank); + let permutedX = x; + if (permutation != null) { + permutedX = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["transpose"])(x, permutation); + axis = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getInnerMostAxes(1, x.rank)[0]; + } + const outShape = segment_util.computeOutShape(permutedX.shape, axis, numSegments); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape([permutedX.shape[axis]]); + const a2D = permutedX.as2D(-1, inSize); + const outputDType = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["sumOutType"](x.dtype); + let result = this.segOpCompute(a2D, 'unsortedSegmentSum', segmentIds, outputDType, numSegments) + .reshape(outShape); + if (permutation != null) { + result = + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["transpose"])(result, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].getUndoAxesPermutation(permutation)); + } + return result; + } + segOpCompute(x, segOpType, segmentIds, dtype, numSegments) { + const batchSize = x.shape[0]; + const inSize = x.shape[1]; + const windowSize = segment_util.segOpComputeOptimalWindowSize(inSize, numSegments); + const segOpInfo = { windowSize, inSize, batchSize, numSegments }; + const program = new _segment_gpu__WEBPACK_IMPORTED_MODULE_56__["SegmentOpProgram"](segOpInfo, segOpType); + const output = this.compileAndRun(program, [x, segmentIds], dtype); + // No need to run another GPGPU program. + if (output.shape[1] === numSegments) { + return output; + } + segmentIds = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["range"])(0, numSegments).tile([inSize / windowSize]); + return this.segOpCompute(output, segOpType, segmentIds, dtype, numSegments); + } + argMinMaxReduce(x, axis, reduceType) { + const axes = [axis]; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].assertAxesAreInnerMostDims('arg' + reduceType.charAt(0).toUpperCase() + reduceType.slice(1), axes, x.rank); + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_REDUCE') || x.rank <= 2) { + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(reduceShape); + const a2D = x.as2D(-1, inSize); + return this.argReduce(a2D, reduceType).reshape(outShape); + } + return this.argReducePacked(x, reduceType); + } + argMin(x, axis) { + return this.argMinMaxReduce(x, axis, 'min'); + } + argMax(x, axis) { + return this.argMinMaxReduce(x, axis, 'max'); + } + cumsum(x, axis, exclusive, reverse) { + if (axis !== x.rank - 1) { + throw new Error(`WebGL cumsum shader expects an inner-most axis=${x.rank - 1} ` + + `but got axis=${axis}`); + } + const size = x.shape[axis]; + let result = x; + // Use cumsum parallel algorithm, ref: + // https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda + for (let i = 0; i <= Math.ceil(Math.log2(size)) - 1; i++) { + const program = new _cumsum_gpu__WEBPACK_IMPORTED_MODULE_20__["CumSumProgram"](x.shape, false, reverse); + const customSetup = program.getCustomSetupFunc(i); + const prevResult = result; + result = this.compileAndRun(program, [result], result.dtype, customSetup); + prevResult.dispose(); + } + // For exclusive cumsum, shift the end result in the direction of sum and + // add 0 to the front index. + if (exclusive) { + const program = new _cumsum_gpu__WEBPACK_IMPORTED_MODULE_20__["CumSumProgram"](x.shape, exclusive, reverse); + const prevResult = result; + result = this.compileAndRun(program, [result]); + prevResult.dispose(); + } + return result; + } + equal(a, b) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["EQUAL"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["EQUAL"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + less(a, b) { + const cpuRes = this.tryRunOnCpuOrThrow([a, b], () => this.cpuBackend.less(a, b)); + if (cpuRes) { + return cpuRes; + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["LESS"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["LESS"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + lessEqual(a, b) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["LESS_EQUAL"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["LESS_EQUAL"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + greater(a, b) { + const cpuRes = this.tryRunOnCpuOrThrow([a, b], () => this.cpuBackend.greater(a, b)); + if (cpuRes) { + return cpuRes; + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["GREATER"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["GREATER"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + greaterEqual(a, b) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["GREATER_EQUAL"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["GREATER_EQUAL"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + logicalNot(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["LOGICAL_NOT"]); + return this.compileAndRun(program, [x]); + } + logicalAnd(a, b) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["LOGICAL_AND"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["LOGICAL_AND"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + logicalOr(a, b) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["LOGICAL_OR"], 'bool'); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["LOGICAL_OR"], a.shape, b.shape); + return this.compileAndRun(program, [a, b], 'bool'); + } + select(condition, a, b) { + const program = new _select_gpu__WEBPACK_IMPORTED_MODULE_57__["SelectProgram"](condition.rank, a.shape, a.rank); + return this.compileAndRun(program, [condition, a, b], Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["upcastType"])(a.dtype, b.dtype)); + } + where(condition) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].warn('tf.where() in webgl locks the UI thread. ' + + 'Call tf.whereAsync() instead'); + const condVals = condition.dataSync(); + return whereImpl(condition.shape, condVals); + } + topk(x, k, sorted) { + const xVals = x.dataSync(); + return topkImpl(xVals, x.shape, x.dtype, k, sorted); + } + min(x, axes) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].assertAxesAreInnerMostDims('min', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(reduceShape); + const a2D = x.as2D(-1, inSize); + return this.reduce(a2D, 'min', a2D.dtype).reshape(outShape); + } + minimum(a, b) { + const cpuRes = this.tryRunOnCpuOrThrow([a, b], () => this.cpuBackend.minimum(a, b)); + if (cpuRes) { + return cpuRes; + } + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? + new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](_binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["MIN"], a.shape, b.shape) : + new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["MIN"], a.shape, b.shape); + return this.compileAndRun(program, [a, b]); + } + mod(a, b) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? + new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](_binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["MOD"], a.shape, b.shape) : + new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["MOD"], a.shape, b.shape); + return this.compileAndRun(program, [a, b]); + } + maximum(a, b) { + const cpuRes = this.tryRunOnCpuOrThrow([a, b], () => this.cpuBackend.maximum(a, b)); + if (cpuRes) { + return cpuRes; + } + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? + new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](_binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["MAX"], a.shape, b.shape) : + new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["MAX"], a.shape, b.shape); + return this.compileAndRun(program, [a, b]); + } + all(x, axes) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].assertAxesAreInnerMostDims('all', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(reduceShape); + const a2D = x.as2D(-1, inSize); + return this.reduce(a2D, 'all', a2D.dtype).reshape(outShape); + } + any(x, axes) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].assertAxesAreInnerMostDims('any', axes, x.rank); + const [outShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].computeOutAndReduceShapes(x.shape, axes); + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(reduceShape); + const a2D = x.as2D(-1, inSize); + return this.reduce(a2D, 'any', a2D.dtype).reshape(outShape); + } + floorDiv(a, b) { + const op = _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["INT_DIV"]; + const outputDtype = 'int32'; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + return this.packedBinaryOp(a, b, _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["INT_DIV"], outputDtype); + } + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](op, a.shape, b.shape); + return this.compileAndRun(program, [a, b], outputDtype); + } + packedUnaryOp(x, op, dtype) { + const program = new _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["UnaryOpPackedProgram"](x.shape, op); + return this.compileAndRun(program, [x], dtype); + } + packedBinaryOp(a, b, op, dtype, checkOutOfBounds = false) { + const program = new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](op, a.shape, b.shape, checkOutOfBounds); + return this.compileAndRun(program, [a, b], dtype); + } + // Returns a TensorInfo with the complex shape and the dataId of the + // underlying part. We need to do this because a reshaped complex tensor is + // not reflected in its parts. + makeComplexComponentTensorInfo(complexTensor, complexPart) { + return { + dataId: complexPart.dataId, + dtype: complexPart.dtype, + shape: complexTensor.shape + }; + } + addN(tensors) { + if (tensors.length === 1) { + return tensors[0]; + } + // Limit the number of uploaded textures for optimization. + if (tensors.length > Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().get('WEBGL_MAX_TEXTURES_IN_SHADER')) { + const midIndex = Math.floor(tensors.length / 2); + const leftSide = this.addN(tensors.slice(0, midIndex)); + const rightSide = this.addN(tensors.slice(midIndex)); + return this.addN([leftSide, rightSide]); + } + const dtype = tensors.map(t => t.dtype).reduce((d1, d2) => Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["upcastType"])(d1, d2)); + const shapes = tensors.map(t => t.shape); + // We can make sure shapes are identical in op level. + const usePackedOp = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK'); + const program = usePackedOp ? + new _addn_packed_gpu__WEBPACK_IMPORTED_MODULE_4__["AddNPackedProgram"](tensors[0].shape, shapes) : + new _addn_gpu__WEBPACK_IMPORTED_MODULE_3__["AddNProgram"](tensors[0].shape, shapes); + return this.compileAndRun(program, tensors, dtype); + } + pow(a, b) { + const usePackedOp = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS'); + const program = usePackedOp ? + new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](_binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["POW"], a.shape, b.shape) : + new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["POW"], a.shape, b.shape); + const dtype = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["upcastType"])(a.dtype, b.dtype); + return this.compileAndRun(program, [a, b], dtype); + } + ceil(x) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["ceilImplCPU"])(this.texData.get(x.dataId).values, x.dtype); + return this.makeOutput(x.shape, x.dtype, outValues); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["CEIL"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["CEIL"]); + return this.compileAndRun(program, [x]); + } + floor(x) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["floorImplCPU"])(this.texData.get(x.dataId).values, x.dtype); + return this.makeOutput(x.shape, x.dtype, outValues); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["FLOOR"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["FLOOR"]); + return this.compileAndRun(program, [x]); + } + sign(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["SIGN"]); + return this.compileAndRun(program, [x]); + } + isNaN(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["IS_NAN"]); + return this.compileAndRun(program, [x], 'bool'); + } + isInf(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["IS_INF"]); + return this.compileAndRun(program, [x], 'bool'); + } + isFinite(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["IS_FINITE"]); + return this.compileAndRun(program, [x], 'bool'); + } + round(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ROUND"]); + return this.compileAndRun(program, [x]); + } + exp(x) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["expImplCPU"])(this.texData.get(x.dataId).values, x.dtype); + return this.makeOutput(x.shape, x.dtype, outValues); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["EXP"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["EXP"]); + return this.compileAndRun(program, [x]); + } + expm1(x) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["expm1ImplCPU"])(this.texData.get(x.dataId).values, x.dtype); + return this.makeOutput(x.shape, x.dtype, outValues); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["EXPM1"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["EXPM1"]); + return this.compileAndRun(program, [x]); + } + softmax(logits, dim) { + const axes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].parseAxisParam([dim], logits.shape); + // TODO(annxingyuan): Call maxImpl rather than op as part of softmax kernel + // modularization. + const maxLogit = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["max"])(logits, axes); + const expandedShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].expandShapeToKeepDim(maxLogit.shape, axes); + // TODO(annxingyuan): Call sub directly as part of softmax kernel + // modularization. + const a = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["sub"](logits, maxLogit.reshape(expandedShape)); + const b = this.exp(a); + const sumExp = this.sum(b, axes).reshape(expandedShape); + // TODO(annxingyuan): Call divImpl rather than op as part of softmax kernel + // modularization. + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["div"])(b, sumExp); + } + log(x) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["logImplCPU"])(this.texData.get(x.dataId).values, x.dtype); + return this.makeOutput(x.shape, x.dtype, outValues); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["LOG"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["LOG"]); + return this.compileAndRun(program, [x]); + } + log1p(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["LOG1P"]); + return this.compileAndRun(program, [x]); + } + sqrt(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["SQRT"]); + return this.compileAndRun(program, [x]); + } + rsqrt(x) { + if (this.shouldExecuteOnCPU([x])) { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["rsqrtImplCPU"])(this.texData.get(x.dataId).values, x.dtype); + return this.makeOutput(x.shape, x.dtype, outValues); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["RSQRT"]); + return this.compileAndRun(program, [x]); + } + reciprocal(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["RECIPROCAL"]); + return this.compileAndRun(program, [x]); + } + relu(x) { + let program; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK')) { + program = new _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["UnaryOpPackedProgram"](x.shape, _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["RELU"]); + } + else { + program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["RELU"]); + } + return this.compileAndRun(program, [x]); + } + relu6(x) { + let program; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK')) { + program = new _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["UnaryOpPackedProgram"](x.shape, _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["RELU6"]); + } + else { + program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["RELU6"]); + } + return this.compileAndRun(program, [x]); + } + prelu(x, alpha) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? + new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](_binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["PRELU"], x.shape, alpha.shape) : + new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["PRELU"], x.shape, alpha.shape); + return this.compileAndRun(program, [x, alpha]); + } + elu(x) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_65__["ELU"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ELU"]); + return this.compileAndRun(program, [x]); + } + eluDer(dy, y) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') ? + new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["BinaryOpPackedProgram"](_binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_9__["ELU_DER"], dy.shape, y.shape) : + new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["BinaryOpProgram"](_binaryop_gpu__WEBPACK_IMPORTED_MODULE_8__["ELU_DER"], dy.shape, y.shape); + return this.compileAndRun(program, [dy, y]); + } + selu(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["SELU"]); + return this.compileAndRun(program, [x]); + } + clip(x, min, max) { + let program; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_CLIP')) { + program = new _clip_packed_gpu__WEBPACK_IMPORTED_MODULE_12__["ClipPackedProgram"](x.shape); + } + else { + program = new _clip_gpu__WEBPACK_IMPORTED_MODULE_11__["ClipProgram"](x.shape); + } + const customSetup = program.getCustomSetupFunc(min, max); + return this.compileAndRun(program, [x], null, customSetup); + } + abs(x) { + // TODO: handle cases when x is complex. + if (this.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') { + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["simpleAbsImplCPU"])(this.texData.get(x.dataId).values); + return this.makeOutput(x.shape, x.dtype, outValues); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_UNARY_OPERATIONS')) { + return this.packedUnaryOp(x, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ABS"], x.dtype); + } + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ABS"]); + return this.compileAndRun(program, [x]); + } + complexAbs(x) { + const xData = this.texData.get(x.dataId); + const program = new _complex_abs_gpu__WEBPACK_IMPORTED_MODULE_13__["ComplexAbsProgram"](x.shape); + const inputs = [ + this.makeComplexComponentTensorInfo(x, xData.complexTensorInfos.real), + this.makeComplexComponentTensorInfo(x, xData.complexTensorInfos.imag), + ]; + return this.compileAndRun(program, inputs); + } + sigmoid(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["SIGMOID"]); + return this.compileAndRun(program, [x]); + } + softplus(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["SOFTPLUS"]); + return this.compileAndRun(program, [x]); + } + asin(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ASIN"]); + return this.compileAndRun(program, [x]); + } + acos(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ACOS"]); + return this.compileAndRun(program, [x]); + } + atan(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ATAN"]); + return this.compileAndRun(program, [x]); + } + sinh(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["SINH"]); + return this.compileAndRun(program, [x]); + } + cosh(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["COSH"]); + return this.compileAndRun(program, [x]); + } + tanh(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["TANH"]); + return this.compileAndRun(program, [x]); + } + asinh(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ASINH"]); + return this.compileAndRun(program, [x]); + } + acosh(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ACOSH"]); + return this.compileAndRun(program, [x]); + } + atanh(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ATANH"]); + return this.compileAndRun(program, [x]); + } + erf(x) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["ERF"]); + return this.compileAndRun(program, [x]); + } + step(x, alpha) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["UnaryOpProgram"](x.shape, _unaryop_gpu__WEBPACK_IMPORTED_MODULE_64__["STEP"](alpha)); + return this.compileAndRun(program, [x]); + } + conv2dByMatMul(x, filter, convInfo, bias, activation, preluActivationWeights) { + // Reshapes conv2D input to 2D tensors, uses matMul and then reshape the + // result from 2D to 4D. + const xShape = x.shape; + const xTexData = this.texData.get(x.dataId); + const sharedMatMulDim = convInfo.inChannels; + const outerShapeX = xShape[0] * xShape[1] * xShape[2]; + const outerShapeFilter = convInfo.outChannels; + const isChannelsLast = convInfo.dataFormat === 'channelsLast'; + const transposeA = false; + const transposeB = false; + // TODO: Once reduction ops are packed, batchMatMul will always be packed + // and we can remove this condition. + const batchMatMulWillBeUnpacked = (outerShapeX === 1 || outerShapeFilter === 1) && + sharedMatMulDim > MATMUL_SHARED_DIM_THRESHOLD; + const reshapeWillBeExpensive = xShape[2] % 2 !== 0 && !!xTexData.isPacked; + if (batchMatMulWillBeUnpacked || !Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_LAZILY_UNPACK') || + !Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') || + !reshapeWillBeExpensive) { + const targetShape = isChannelsLast ? xShape[0] * xShape[1] * xShape[2] : + xShape[0] * xShape[2] * xShape[3]; + const xReshaped = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["reshape"])(x, [1, targetShape, convInfo.inChannels]); + const filterReshaped = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["reshape"])(filter, [1, convInfo.inChannels, convInfo.outChannels]); + const result = this.fusedBatchMatMul({ + a: xReshaped, + b: filterReshaped, + transposeA, + transposeB, + bias, + activation, + preluActivationWeights + }); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["reshape"])(result, convInfo.outShape); + } + // Following optimization is specific to packed |x| with odd row count + // (For example, in channelLast mode, 'row count' refers to x.shape[2]): + // we avoid expensive packed 2x2 reshape by padding row count to next, + // even number. When x.shape[2] is odd, the result of packed batchMatMul is + // the same (has the same texture layout and and values in the texture) as + // it is for even x.shape[2] + 1. We make the odd-rows tensor to look like + // even-rows tensor before the operation and, after the batchMatMul, + // fix the even-rows result to have odd number of rows. + const targetShape = isChannelsLast ? + xShape[0] * xShape[1] * (xShape[2] + 1) : + xShape[0] * xShape[2] * (xShape[3] + 1); + const xReshaped = { + dataId: x.dataId, + shape: [1, targetShape, convInfo.inChannels], + dtype: x.dtype + }; + // xTexData.shape gets referenced from GPGPUBinary.inShapeInfos. + // Decrementing row count, after batchMatMul->...->compileProgram leads to + // invalid row count within the reference in GPGPUBinary.inShapeInfos. + // Alternative fix would be to provide a copy to GPGPUBinary.inShapeInfos + // in compileProgram method, but that would affect compilation of all + // programs - instead, provide a copy here, with even row count, before + // calling batchMatMul->...->compileProgram and after that, the original + // xTexData.shape is restored. + const originalXTexDataShape = xTexData.shape; + xTexData.shape = xTexData.shape.slice(); + xTexData.shape[xTexData.shape.length - 2]++; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].assert(_webgl_util__WEBPACK_IMPORTED_MODULE_67__["isReshapeFree"](xTexData.shape, xReshaped.shape), () => `packed reshape ${xTexData.shape} to ${xReshaped.shape} isn't free`); + const filterReshaped = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["reshape"])(filter, [1, convInfo.inChannels, convInfo.outChannels]); + const pointwiseConv = this.fusedBatchMatMul({ + a: xReshaped, + b: filterReshaped, + transposeA, + transposeB, + bias, + activation, + preluActivationWeights + }); + const pointwiseConvTexData = this.texData.get(pointwiseConv.dataId); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].assert(pointwiseConvTexData.isPacked, () => 'batchMatMul result is expected to be packed'); + // Restore the input shape to original. + xTexData.shape = originalXTexDataShape; + // Set the output shape - there is no need for expensive reshape as data + // layout is already correct. + pointwiseConvTexData.shape = convInfo.outShape; + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["engine"])().makeTensorFromDataId(pointwiseConv.dataId, convInfo.outShape, pointwiseConv.dtype); + } + conv2dWithIm2Row(x, filter, convInfo, bias, activation, preluActivationWeights) { + // Rearranges conv2d input so each block to be convolved over forms the + // column of a new matrix with shape [filterWidth * filterHeight * + // inChannels, outHeight * outWidth]. The filter is also rearranged so each + // output channel forms a row of a new matrix with shape [outChannels, + // filterWidth * filterHeight * inChannels]. The convolution is then + // computed by multiplying these matrices and reshaping the result. + const { filterWidth, filterHeight, inChannels, outWidth, outHeight, dataFormat } = convInfo; + const isChannelsLast = dataFormat === 'channelsLast'; + const sharedDim = filterWidth * filterHeight * inChannels; + const numCols = outHeight * outWidth; + const x2ColShape = [sharedDim, numCols]; + const transposeA = true; + const transposeB = false; + const xSqueezed = x.squeeze([0]); + const w2Row = filter.reshape([1, sharedDim, -1]); + const im2ColProgram = new _im2col_packed_gpu__WEBPACK_IMPORTED_MODULE_34__["Im2ColPackedProgram"](x2ColShape, xSqueezed.shape, convInfo); + const im2Col = this.compileAndRun(im2ColProgram, [xSqueezed]).reshape([ + 1, x2ColShape[0], x2ColShape[1] + ]); + const hasBias = bias != null; + const hasPreluActivationWeights = preluActivationWeights != null; + const fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null; + const matmulProgram = new _mulmat_packed_gpu__WEBPACK_IMPORTED_MODULE_39__["MatMulPackedProgram"](im2Col.shape, w2Row.shape, [1, numCols, convInfo.outChannels], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights); + const inputs = [im2Col, w2Row]; + if (bias) { + inputs.push(bias); + } + if (hasPreluActivationWeights) { + inputs.push(preluActivationWeights); + } + const product = this.compileAndRun(matmulProgram, inputs); + if (isChannelsLast) { + return product.reshape([1, outHeight, outWidth, convInfo.outChannels]); + } + else { + return product.reshape([1, convInfo.outChannels, outHeight, outWidth]); + } + } + fusedConv2d({ input, filter, convInfo, bias, activation, preluActivationWeights }) { + if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 && + convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 && + convInfo.strideHeight === 1 && convInfo.strideWidth === 1 && + (convInfo.padInfo.type === 'SAME' || + convInfo.padInfo.type === 'VALID')) { + return this.conv2dByMatMul(input, filter, convInfo, bias, activation, preluActivationWeights); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_CONV_IM2COL') && input.shape[0] === 1) { + return this.conv2dWithIm2Row(input, filter, convInfo, bias, activation, preluActivationWeights); + } + const hasBias = bias != null; + const hasPreluActivationWeights = preluActivationWeights != null; + const fusedActivation = activation ? mapActivationToShaderProgram(activation, false) : null; + const program = new _conv_gpu__WEBPACK_IMPORTED_MODULE_16__["Conv2DProgram"](convInfo, hasBias, fusedActivation, hasPreluActivationWeights); + const inputs = [input, filter]; + if (bias) { + inputs.push(bias); + } + if (preluActivationWeights) { + inputs.push(preluActivationWeights); + } + return this.compileAndRun(program, inputs); + } + conv2d(x, filter, convInfo) { + if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 && + convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 && + convInfo.strideHeight === 1 && convInfo.strideWidth === 1 && + (convInfo.padInfo.type === 'SAME' || + convInfo.padInfo.type === 'VALID')) { + return this.conv2dByMatMul(x, filter, convInfo); + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_CONV_IM2COL') && x.shape[0] === 1) { + return this.conv2dWithIm2Row(x, filter, convInfo); + } + const program = new _conv_gpu__WEBPACK_IMPORTED_MODULE_16__["Conv2DProgram"](convInfo); + return this.compileAndRun(program, [x, filter]); + } + conv2dDerInput(dy, filter, convInfo) { + const program = new _conv_backprop_gpu__WEBPACK_IMPORTED_MODULE_14__["Conv2DDerInputProgram"](convInfo); + return this.compileAndRun(program, [dy, filter]); + } + conv2dDerFilter(x, dy, convInfo) { + const program = new _conv_backprop_gpu__WEBPACK_IMPORTED_MODULE_14__["Conv2DDerFilterProgram"](convInfo); + return this.compileAndRun(program, [x, dy]); + } + fusedDepthwiseConv2D({ input, filter, convInfo, bias, activation, preluActivationWeights }) { + const shouldPackDepthwiseConv = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_DEPTHWISECONV') && + convInfo.strideWidth <= 2 && + convInfo.outChannels / convInfo.inChannels === 1; + const fusedActivation = activation ? + mapActivationToShaderProgram(activation, shouldPackDepthwiseConv) : + null; + const inputs = [input, filter]; + const hasBias = bias != null; + const hasPreluActivationWeights = preluActivationWeights != null; + if (hasBias) { + inputs.push(bias); + } + if (hasPreluActivationWeights) { + inputs.push(preluActivationWeights); + } + let program; + if (shouldPackDepthwiseConv) { + program = new _conv_packed_gpu_depthwise__WEBPACK_IMPORTED_MODULE_18__["DepthwiseConvPacked2DProgram"](convInfo, hasBias, fusedActivation, hasPreluActivationWeights); + return this.compileAndRun(program, inputs); + } + program = new _conv_gpu_depthwise__WEBPACK_IMPORTED_MODULE_17__["DepthwiseConv2DProgram"](convInfo, hasBias, fusedActivation, hasPreluActivationWeights); + return this.compileAndRun(program, inputs); + } + depthwiseConv2D(x, filter, convInfo) { + let program; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_DEPTHWISECONV') && + convInfo.strideWidth <= 2 && + convInfo.outChannels / convInfo.inChannels === 1) { + program = new _conv_packed_gpu_depthwise__WEBPACK_IMPORTED_MODULE_18__["DepthwiseConvPacked2DProgram"](convInfo); + return this.compileAndRun(program, [x, filter]); + } + program = new _conv_gpu_depthwise__WEBPACK_IMPORTED_MODULE_17__["DepthwiseConv2DProgram"](convInfo); + return this.compileAndRun(program, [x, filter]); + } + depthwiseConv2DDerInput(dy, filter, convInfo) { + const program = new _conv_backprop_gpu_depthwise__WEBPACK_IMPORTED_MODULE_15__["DepthwiseConv2DDerInputProgram"](convInfo); + return this.compileAndRun(program, [dy, filter]); + } + depthwiseConv2DDerFilter(x, dy, convInfo) { + const program = new _conv_backprop_gpu_depthwise__WEBPACK_IMPORTED_MODULE_15__["DepthwiseConv2DDerFilterProgram"](convInfo); + return this.compileAndRun(program, [x, dy]); + } + conv3d(x, filter, convInfo) { + const program = new _conv_gpu__WEBPACK_IMPORTED_MODULE_16__["Conv3DProgram"](convInfo); + return this.compileAndRun(program, [x, filter]); + } + conv3dDerInput(dy, filter, convInfo) { + const program = new _conv_backprop_gpu__WEBPACK_IMPORTED_MODULE_14__["Conv3DDerInputProgram"](convInfo); + return this.compileAndRun(program, [dy, filter]); + } + conv3dDerFilter(x, dy, convInfo) { + const program = new _conv_backprop_gpu__WEBPACK_IMPORTED_MODULE_14__["Conv3DDerFilterProgram"](convInfo); + return this.compileAndRun(program, [x, dy]); + } + unstack(x, axis) { + const num = x.shape[axis]; + const outShape = new Array(x.rank - 1); + let outIndex = 0; + for (let i = 0; i < x.rank; i++) { + if (i !== axis) { + outShape[outIndex++] = x.shape[i]; + } + } + const begin = new Array(x.rank).fill(0); + const size = x.shape.slice(); + size[axis] = 1; + const res = new Array(num); + for (let i = 0; i < res.length; i++) { + begin[axis] = i; + res[i] = this.slice(x, begin, size).reshape(outShape); + } + return res; + } + avgPool3d(x, convInfo) { + const program = new _pool_gpu__WEBPACK_IMPORTED_MODULE_45__["Pool3DProgram"](convInfo, 'avg', false); + return this.compileAndRun(program, [x], 'float32'); + } + avgPool3dBackprop(dy, x, convInfo) { + const avgPool3dBackpropProgram = new _avg_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_7__["AvgPool3DBackpropProgram"](convInfo); + return this.compileAndRun(avgPool3dBackpropProgram, [dy], x.dtype); + } + maxPool3d(x, convInfo) { + const program = new _pool_gpu__WEBPACK_IMPORTED_MODULE_45__["Pool3DProgram"](convInfo, 'max', false); + return this.compileAndRun(program, [x], 'float32'); + } + maxPool3dBackprop(dy, x, y, convInfo) { + const getPositions = true; + const maxPool3dPositionsProgram = new _pool_gpu__WEBPACK_IMPORTED_MODULE_45__["Pool3DProgram"](convInfo, 'max', getPositions); + const maxPool3dPositions = this.compileAndRun(maxPool3dPositionsProgram, [x]); + const maxPool3dBackPropProgram = new _max_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_38__["MaxPool3DBackpropProgram"](convInfo); + const result = this.compileAndRun(maxPool3dBackPropProgram, [dy, maxPool3dPositions], x.dtype); + maxPool3dPositions.dispose(); + return result; + } + resizeBilinear(x, newHeight, newWidth, alignCorners) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_PACK_IMAGE_OPERATIONS') ? + new _resize_bilinear_packed_gpu__WEBPACK_IMPORTED_MODULE_50__["ResizeBilinearPackedProgram"](x.shape, newHeight, newWidth, alignCorners) : + new _resize_bilinear_gpu__WEBPACK_IMPORTED_MODULE_49__["ResizeBilinearProgram"](x.shape, newHeight, newWidth, alignCorners); + return this.compileAndRun(program, [x], 'float32'); + } + resizeBilinearBackprop(dy, x, alignCorners) { + const program = new _resize_bilinear_backprop_gpu__WEBPACK_IMPORTED_MODULE_48__["ResizeBilinearBackpropProgram"](dy, x, alignCorners); + return this.compileAndRun(program, [dy]); + } + resizeNearestNeighbor(x, newHeight, newWidth, alignCorners) { + const program = new _resize_nearest_neighbor_gpu__WEBPACK_IMPORTED_MODULE_52__["ResizeNearestNeighborProgram"](x.shape, newHeight, newWidth, alignCorners); + return this.compileAndRun(program, [x]); + } + resizeNearestNeighborBackprop(dy, x, alignCorners) { + const program = new _resize_nearest_neighbor_backprop_gpu__WEBPACK_IMPORTED_MODULE_51__["ResizeNearestNeigborBackpropProgram"](dy, x, alignCorners); + return this.compileAndRun(program, [dy]); + } + multinomial(logits, normalized, numSamples, seed) { + const probs = normalized ? logits : Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["softmax"])(logits); + const batchSize = probs.shape[0]; + const numOutcomes = probs.shape[1]; + const program = new _multinomial_gpu__WEBPACK_IMPORTED_MODULE_40__["MultinomialProgram"](batchSize, numOutcomes, numSamples); + const customSetup = program.getCustomSetupFunc(seed); + return this.compileAndRun(program, [probs], 'int32', customSetup); + } + oneHot(indices, depth, onValue, offValue) { + const program = new _onehot_gpu__WEBPACK_IMPORTED_MODULE_41__["OneHotProgram"](indices.size, depth, onValue, offValue); + return this.compileAndRun(program, [indices]); + } + diag(x) { + const program = new _diag_gpu__WEBPACK_IMPORTED_MODULE_24__["DiagProgram"](x.size); + return this.compileAndRun(program, [x]); + } + cropAndResize(image, boxes, boxIndex, cropSize, method, extrapolationValue) { + const program = new _crop_and_resize_gpu__WEBPACK_IMPORTED_MODULE_19__["CropAndResizeProgram"](image.shape, boxes.shape, cropSize, method, extrapolationValue); + return this.compileAndRun(program, [image, boxes, boxIndex], 'float32'); + } + depthToSpace(x, blockSize, dataFormat) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].assert(blockSize > 1, () => `blockSize should be > 1 for depthToSpace, but was: ${blockSize}`); + const batchSize = x.shape[0]; + const inputHeight = (dataFormat === 'NHWC') ? x.shape[1] : x.shape[2]; + const inputWidth = (dataFormat === 'NHWC') ? x.shape[2] : x.shape[3]; + const inputDepth = (dataFormat === 'NHWC') ? x.shape[3] : x.shape[1]; + const outputHeight = inputHeight * blockSize; + const outputWidth = inputWidth * blockSize; + const outputDepth = inputDepth / (blockSize * blockSize); + const outputShape = (dataFormat === 'NHWC') ? + [batchSize, outputHeight, outputWidth, outputDepth] : + [batchSize, outputDepth, outputHeight, outputWidth]; + const program = new _depth_to_space_gpu__WEBPACK_IMPORTED_MODULE_23__["DepthToSpaceProgram"](outputShape, blockSize, dataFormat); + return this.compileAndRun(program, [x]); + } + split(x, sizeSplits, axis) { + return split(x, sizeSplits, axis); + } + scatterND(indices, updates, shape) { + const { sliceRank, numUpdates, sliceSize, strides, outputSize } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].calculateShapes(updates, indices, shape); + const flattenShape = [outputSize / sliceSize, sliceSize]; + const flattenIndices = indices.reshape([numUpdates, sliceRank]); + const flattenX = updates.reshape([numUpdates, sliceSize]); + if (outputSize === 0) { + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].reshapeTensor(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["tensor"])([]), shape); + } + const defaultValue = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["scalar"])(0); + const program = new _scatter_gpu__WEBPACK_IMPORTED_MODULE_55__["ScatterProgram"](numUpdates, sliceRank, flattenIndices.rank, flattenX.rank, strides, flattenShape); + const res = this.compileAndRun(program, [flattenX, flattenIndices, defaultValue]); + return res.reshape(shape); + } + sparseToDense(sparseIndices, sparseValues, outputShape, defaultValue) { + const { sliceRank, numUpdates, strides, outputSize } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].calculateShapes(sparseValues, sparseIndices, outputShape); + const sumDupeIndices = false; + const program = new _scatter_gpu__WEBPACK_IMPORTED_MODULE_55__["ScatterProgram"](numUpdates, sliceRank, sparseIndices.rank, sparseValues.rank, strides, [outputSize, 1], sumDupeIndices); + const res = this.compileAndRun(program, [sparseValues, sparseIndices, defaultValue]); + return res.reshape(outputShape); + } + gatherND(x, indices) { + const indicesShape = indices.shape; + const sliceRank = indicesShape[indicesShape.length - 1]; + const [resultShape, numSlices, sliceSize, strides] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].prepareAndValidate(x, indices); + const flattenIndices = indices.reshape([numSlices, sliceRank]); + const flattenX = x.reshape([x.size / sliceSize, sliceSize]); + const program = new _gather_nd_gpu__WEBPACK_IMPORTED_MODULE_31__["GatherNDProgram"](sliceRank, strides, [numSlices, sliceSize]); + const res = this.compileAndRun(program, [flattenX, flattenIndices]); + return res.reshape(resultShape); + } + fill(shape, value, dtype) { + dtype = dtype || _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].inferDtype(value); + if (dtype === 'string') { + // String type should be handled in CPU memory. + const values = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].getArrayFromDType(dtype, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(shape)); + values.fill(value); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["engine"])().makeTensor(values, shape, dtype, this); + } + else { + const program = new _fill_gpu__WEBPACK_IMPORTED_MODULE_29__["FillProgram"](shape, value); + const customSetup = program.getCustomSetupFunc(value); + return this.compileAndRun(program, [], dtype, customSetup); + } + } + onesLike(x) { + if (x.dtype === 'string') { + throw new Error('onesLike is not supported under string dtype'); + } + else { + // TODO(cais, smilkov): Add WebGL shader for onesLike: + // https://github.com/tensorflow/tfjs/issues/1293 + return this.fill(x.shape, 1, x.dtype); + } + } + zerosLike(x) { + return this.fill(x.shape, x.dtype === 'string' ? '' : 0, x.dtype); + } + linspace(start, stop, num) { + // TODO: Use CPU implementation due to the precision problem in Safari. + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["backend_util"].linspaceImpl(start, stop, num); + } + makeTensorInfo(shape, dtype, values) { + const dataId = this.write(values, shape, dtype); + this.texData.get(dataId).usage = null; + return { dataId, shape, dtype }; + } + makeOutput(shape, dtype, values) { + const { dataId } = this.makeTensorInfo(shape, dtype, values); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["engine"])().makeTensorFromDataId(dataId, shape, dtype, this); + } + unpackTensor(input) { + const program = new _unpack_gpu__WEBPACK_IMPORTED_MODULE_66__["UnpackProgram"](input.shape); + return this.runWebGLProgram(program, [input], input.dtype); + } + packTensor(input) { + const program = new _pack_gpu__WEBPACK_IMPORTED_MODULE_42__["PackProgram"](input.shape); + const preventEagerUnpackingOutput = true; + return this.runWebGLProgram(program, [input], input.dtype, null /* customSetup */, preventEagerUnpackingOutput); + } + packedReshape(input, afterShape) { + const input3DShape = [ + _webgl_util__WEBPACK_IMPORTED_MODULE_67__["getBatchDim"](input.shape), + ..._webgl_util__WEBPACK_IMPORTED_MODULE_67__["getRowsCols"](input.shape) + ]; + const input3D = { + dtype: input.dtype, + shape: input3DShape, + dataId: input.dataId + }; + const afterShapeAs3D = [ + _webgl_util__WEBPACK_IMPORTED_MODULE_67__["getBatchDim"](afterShape), ..._webgl_util__WEBPACK_IMPORTED_MODULE_67__["getRowsCols"](afterShape) + ]; + const program = new _reshape_packed_gpu__WEBPACK_IMPORTED_MODULE_47__["ReshapePackedProgram"](afterShapeAs3D, input3DShape); + const preventEagerUnpackingOfOutput = true; + const output = this.runWebGLProgram(program, [input3D], input.dtype, null /* customSetup */, preventEagerUnpackingOfOutput); + return { dataId: output.dataId, shape: afterShape, dtype: output.dtype }; + } + decode(dataId) { + const texData = this.texData.get(dataId); + const { isPacked, shape, dtype } = texData; + const shapeAs3D = _webgl_util__WEBPACK_IMPORTED_MODULE_67__["getShapeAs3D"](shape); + let program; + if (isPacked) { + program = new _decode_matrix_packed_gpu__WEBPACK_IMPORTED_MODULE_22__["DecodeMatrixPackedProgram"](shapeAs3D); + } + else { + program = new _decode_matrix_gpu__WEBPACK_IMPORTED_MODULE_21__["DecodeMatrixProgram"](shapeAs3D); + } + const preventEagerUnpackingOfOutput = true; + const out = this.runWebGLProgram(program, [{ shape: shapeAs3D, dtype, dataId }], dtype, null /* customSetup */, preventEagerUnpackingOfOutput); + return { dtype, shape, dataId: out.dataId }; + } + runWebGLProgram(program, inputs, outputDtype, customSetup, preventEagerUnpackingOfOutput = false) { + const output = this.makeTensorInfo(program.outputShape, outputDtype); + const outData = this.texData.get(output.dataId); + if (program.packedOutput) { + outData.isPacked = true; + } + if (program.outPackingScheme === _tex_util__WEBPACK_IMPORTED_MODULE_61__["PackingScheme"].DENSE) { + const texelShape = _tex_util__WEBPACK_IMPORTED_MODULE_61__["getDenseTexShape"](program.outputShape); + // For a densely packed output, we explicitly set texShape + // so it doesn't get assigned later according to our typical packing + // scheme wherein a single texel can only contain values from adjacent + // rows/cols. + outData.texShape = texelShape.map(d => d * 2); + } + if (program.outTexUsage != null) { + outData.usage = program.outTexUsage; + } + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(output.shape) === 0) { + // Short-circuit the computation since the result is empty (has 0 in its + // shape). + outData.values = + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].getTypedArrayFromDType(output.dtype, 0); + return output; + } + const dataToDispose = []; + const inputsData = inputs.map(input => { + if (input.dtype === 'complex64') { + throw new Error(`GPGPUProgram does not support complex64 input. For complex64 ` + + `dtypes, please separate the program into real and imaginary ` + + `parts.`); + } + let texData = this.texData.get(input.dataId); + if (texData.texture == null) { + if (!program.packedInputs && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].sizeFromShape(input.shape) <= + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getNumber('WEBGL_SIZE_UPLOAD_UNIFORM')) { + // Upload small tensors that live on the CPU as uniforms, not as + // textures. Do this only when the environment supports 32bit floats + // due to problems when comparing 16bit floats with 32bit floats. + // TODO(https://github.com/tensorflow/tfjs/issues/821): Make it + // possible for packed shaders to sample from uniforms. + return { + shape: input.shape, + texData: null, + isUniform: true, + uniformValues: texData.values + }; + } + // This ensures that if a packed program's inputs have not yet been + // uploaded to the GPU, they get uploaded as packed right off the bat. + if (program.packedInputs) { + texData.isPacked = true; + texData.shape = input.shape; + } + } + else if (!!texData.isPacked !== !!program.packedInputs) { + input = texData.isPacked ? this.unpackTensor(input) : + this.packTensor(input); + dataToDispose.push(input); + texData = this.texData.get(input.dataId); + } + else if (texData.isPacked && + !_webgl_util__WEBPACK_IMPORTED_MODULE_67__["isReshapeFree"](texData.shape, input.shape)) { + // This is a special case where a texture exists for a tensor + // but the shapes are incompatible (due to packing constraints) because + // the tensor did not have a chance to go through the packed reshape + // shader. This only happens when we reshape the *same* tensor to form + // *distinct* inputs to an op, e.g. dotting a vector with itself. This + // case will disappear once packed uploading is the default. + const savedInput = input; + const targetShape = input.shape; + input.shape = texData.shape; + input = this.packedReshape(input, targetShape); + dataToDispose.push(input); + texData = this.texData.get(input.dataId); + savedInput.shape = targetShape; + } + this.uploadToGPU(input.dataId); + return { shape: input.shape, texData, isUniform: false }; + }); + this.uploadToGPU(output.dataId); + const outputData = { shape: output.shape, texData: outData, isUniform: false }; + const key = _gpgpu_math__WEBPACK_IMPORTED_MODULE_33__["makeShaderKey"](program, inputsData, outputData); + const binary = this.getAndSaveBinary(key, () => { + return _gpgpu_math__WEBPACK_IMPORTED_MODULE_33__["compileProgram"](this.gpgpu, program, inputsData, outputData); + }); + const shouldTimeProgram = this.activeTimers != null; + let query; + if (shouldTimeProgram) { + query = this.startTimer(); + } + _gpgpu_math__WEBPACK_IMPORTED_MODULE_33__["runProgram"](this.gpgpu, binary, inputsData, outputData, customSetup); + dataToDispose.forEach(info => this.disposeIntermediateTensorInfo(info)); + if (shouldTimeProgram) { + query = this.endTimer(query); + this.activeTimers.push({ name: program.constructor.name, query: this.getQueryTime(query) }); + } + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('WEBGL_LAZILY_UNPACK') && outData.isPacked && + preventEagerUnpackingOfOutput === false) { + const unpacked = this.unpackTensor(output); + this.disposeIntermediateTensorInfo(output); + return unpacked; + } + return output; + } + compileAndRun(program, inputs, outputDtype, customSetup, preventEagerUnpackingOfOutput = false) { + outputDtype = outputDtype || inputs[0].dtype; + const outInfo = this.runWebGLProgram(program, inputs, outputDtype, customSetup, preventEagerUnpackingOfOutput); + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["engine"])().makeTensorFromDataId(outInfo.dataId, outInfo.shape, outInfo.dtype); + } + getAndSaveBinary(key, getBinary) { + if (!(key in this.binaryCache)) { + this.binaryCache[key] = getBinary(); + } + return this.binaryCache[key]; + } + getTextureManager() { + return this.textureManager; + } + dispose() { + if (this.disposed) { + return; + } + // Avoid disposing the compiled webgl programs during unit testing because + // it slows down test execution. + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_TEST')) { + const allKeys = Object.keys(this.binaryCache); + allKeys.forEach(key => { + this.gpgpu.deleteProgram(this.binaryCache[key].webGLProgram); + delete this.binaryCache[key]; + }); + } + this.textureManager.dispose(); + if (this.canvas != null && + (typeof (HTMLCanvasElement) !== 'undefined' && + this.canvas instanceof HTMLCanvasElement)) { + this.canvas.remove(); + } + else { + this.canvas = null; + } + if (this.gpgpuCreatedLocally) { + this.gpgpu.program = null; + this.gpgpu.dispose(); + } + this.disposed = true; + } + floatPrecision() { + if (this.floatPrecisionValue == null) { + this.floatPrecisionValue = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["tidy"])(() => { + if (!Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().get('WEBGL_RENDER_FLOAT32_ENABLED')) { + // Momentarily switching DEBUG flag to false so we don't throw an + // error trying to upload a small value. + const debugFlag = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('DEBUG'); + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().set('DEBUG', false); + const underflowCheckValue = this.abs(Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["scalar"])(1e-8)).dataSync()[0]; + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().set('DEBUG', debugFlag); + if (underflowCheckValue > 0) { + return 32; + } + } + return 16; + }); + } + return this.floatPrecisionValue; + } + /** Returns the smallest representable number. */ + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + uploadToGPU(dataId) { + const texData = this.texData.get(dataId); + const { shape, dtype, values, texture, usage, isPacked } = texData; + if (texture != null) { + // Array is already on GPU. No-op. + return; + } + const shouldTimeProgram = this.activeTimers != null; + let start; + if (shouldTimeProgram) { + start = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].now(); + } + let texShape = texData.texShape; + if (texShape == null) { + texShape = _webgl_util__WEBPACK_IMPORTED_MODULE_67__["getTextureShapeFromLogicalShape"](shape, isPacked); + texData.texShape = texShape; + } + if (values != null) { + const shapeAs3D = _webgl_util__WEBPACK_IMPORTED_MODULE_67__["getShapeAs3D"](shape); + let program; + let width = texShape[1], height = texShape[0]; + const isByteArray = values instanceof Uint8Array; + if (isPacked) { + [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_61__["getPackedMatrixTextureShapeWidthHeight"](texShape[0], texShape[1]); + program = new _encode_matrix_packed_gpu__WEBPACK_IMPORTED_MODULE_28__["EncodeMatrixPackedProgram"](shapeAs3D, [height, width], isByteArray); + } + else { + program = + new _encode_matrix_gpu__WEBPACK_IMPORTED_MODULE_27__["EncodeMatrixProgram"](shapeAs3D, [height, width], isByteArray); + } + const tempDenseInputHandle = this.makeTensorInfo([height, width], dtype); + if (isByteArray) { + this.texData.get(tempDenseInputHandle.dataId).usage = + _tex_util__WEBPACK_IMPORTED_MODULE_61__["TextureUsage"].PIXELS; + } + else { + this.texData.get(tempDenseInputHandle.dataId).usage = + _tex_util__WEBPACK_IMPORTED_MODULE_61__["TextureUsage"].UPLOAD; + } + this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(tempDenseInputHandle.dataId), width, height, values); + // We want the output to remain packed regardless of the value of + // WEBGL_PACK. + const preventEagerUnpacking = true; + const encodedOutputTarget = this.runWebGLProgram(program, [tempDenseInputHandle], dtype, null, preventEagerUnpacking); + // Have the original texture assume the identity of the encoded output. + const outputTexData = this.texData.get(encodedOutputTarget.dataId); + texData.texture = outputTexData.texture; + texData.texShape = outputTexData.texShape; + texData.isPacked = outputTexData.isPacked; + texData.usage = outputTexData.usage; + this.disposeIntermediateTensorInfo(tempDenseInputHandle); + this.texData.delete(encodedOutputTarget.dataId); + // Once uploaded, don't store the values on cpu. + texData.values = null; + if (shouldTimeProgram) { + this.uploadWaitMs += _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].now() - start; + } + } + else { + const newTexture = this.acquireTexture(texShape, usage, dtype, isPacked); + texData.texture = newTexture; + } + } + convertAndCacheOnCPU(dataId, float32Values) { + const texData = this.texData.get(dataId); + const { dtype } = texData; + this.releaseGPUData(dataId); + if (float32Values != null) { + texData.values = float32ToTypedArray(float32Values, dtype); + } + return texData.values; + } + acquireTexture(texShape, texType, dtype, isPacked) { + this.numBytesInGPU += this.computeBytes(texShape, dtype); + if (!this.warnedAboutMemory && + this.numBytesInGPU > this.numMBBeforeWarning * 1024 * 1024) { + const mb = (this.numBytesInGPU / 1024 / 1024).toFixed(2); + this.warnedAboutMemory = true; + console.warn(`High memory usage in GPU: ${mb} MB, ` + + `most likely due to a memory leak`); + } + return this.textureManager.acquireTexture(texShape, texType, isPacked); + } + computeBytes(shape, dtype) { + return shape[0] * shape[1] * _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["util"].bytesPerElement(dtype); + } + tryRunOnCpuOrThrow(inputs, fn) { + if (this.shouldExecuteOnCPU(inputs)) { + try { + return fn(); + } + catch (e) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_TEST')) { + throw new Error('CPU forwarding failed'); + } + } + } + return null; + } +} +function float32ToTypedArray(a, dtype) { + if (dtype === 'float32' || dtype === 'complex64') { + return a; + } + else if (dtype === 'int32' || dtype === 'bool') { + const result = (dtype === 'int32') ? new Int32Array(a.length) : + new Uint8Array(a.length); + for (let i = 0; i < result.length; ++i) { + result[i] = Math.round(a[i]); + } + return result; + } + else { + throw new Error(`Unknown dtype ${dtype}`); + } +} +//# sourceMappingURL=backend_webgl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js ***! + \******************************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "webgl", function() { return webgl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _backend_webgl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./backend_webgl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version_webgl", function() { return _version__WEBPACK_IMPORTED_MODULE_2__["version"]; }); + +/* harmony import */ var _webgl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./webgl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MathBackendWebGL", function() { return _webgl__WEBPACK_IMPORTED_MODULE_3__["MathBackendWebGL"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setWebGLContext", function() { return _webgl__WEBPACK_IMPORTED_MODULE_3__["setWebGLContext"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GPGPUContext", function() { return _webgl__WEBPACK_IMPORTED_MODULE_3__["GPGPUContext"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gpgpu_util", function() { return _webgl__WEBPACK_IMPORTED_MODULE_3__["gpgpu_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "webgl_util", function() { return _webgl__WEBPACK_IMPORTED_MODULE_3__["webgl_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceHalfFloat", function() { return _webgl__WEBPACK_IMPORTED_MODULE_3__["forceHalfFloat"]; }); + +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// base.ts is the webgl backend without auto kernel registration. + + + +if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["device_util"].isBrowser()) { + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["registerBackend"])('webgl', () => new _backend_webgl__WEBPACK_IMPORTED_MODULE_1__["MathBackendWebGL"](), 2 /* priority */); +} +// Export webgl utilities + +// Export forceHalfFlost under webgl namespace for the union bundle. + +const webgl = { forceHalfFloat: _webgl__WEBPACK_IMPORTED_MODULE_3__["forceHalfFloat"] }; +//# sourceMappingURL=base.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js ***! + \***************************************************************************/ +/*! exports provided: BatchNormProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BatchNormProgram", function() { return BatchNormProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class BatchNormProgram { + constructor(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) { + this.outputShape = []; + this.variableNames = ['x', 'mean', 'variance']; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, meanShape); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, varianceShape); + let offsetSnippet = '0.0'; + if (offsetShape != null) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, offsetShape); + this.variableNames.push('offset'); + offsetSnippet = 'getOffsetAtOutCoords()'; + } + let scaleSnippet = '1.0'; + if (scaleShape != null) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, scaleShape); + this.variableNames.push('scale'); + scaleSnippet = 'getScaleAtOutCoords()'; + } + this.outputShape = xShape; + this.userCode = ` + void main() { + float x = getXAtOutCoords(); + float mean = getMeanAtOutCoords(); + float variance = getVarianceAtOutCoords(); + float offset = ${offsetSnippet}; + float scale = ${scaleSnippet}; + float inv = scale * inversesqrt(variance + float(${varianceEpsilon})); + setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1))); + } + `; + } +} +//# sourceMappingURL=batchnorm_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: BatchNormPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BatchNormPackedProgram", function() { return BatchNormPackedProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class BatchNormPackedProgram { + constructor(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) { + this.packedInputs = true; + this.packedOutput = true; + this.variableNames = ['x', 'mean', 'variance']; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, meanShape); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, varianceShape); + let offsetSnippet = 'vec4(0.0)'; + if (offsetShape != null) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, offsetShape); + this.variableNames.push('offset'); + offsetSnippet = 'getOffsetAtOutCoords()'; + } + let scaleSnippet = 'vec4(1.0)'; + if (scaleShape != null) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(xShape, scaleShape); + this.variableNames.push('scale'); + scaleSnippet = 'getScaleAtOutCoords()'; + } + this.outputShape = xShape; + this.userCode = ` + void main() { + vec4 offset = ${offsetSnippet}; + vec4 scale = ${scaleSnippet}; + + vec4 x = getXAtOutCoords(); + vec4 mean = getMeanAtOutCoords(); + vec4 variance = getVarianceAtOutCoords(); + + vec4 inv = scale * inversesqrt(variance + vec4(${varianceEpsilon})); + + setOutput((x - mean) * inv + offset); + } + `; + } +} +//# sourceMappingURL=batchnorm_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: COMPLEX_MULTIPLY, BinaryOpComplexProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMPLEX_MULTIPLY", function() { return COMPLEX_MULTIPLY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BinaryOpComplexProgram", function() { return BinaryOpComplexProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +// (Ar + Ai)(Br + Bi) = +// ArBr + ArBi + AiBr + AiBi = ArBr - AB + ArBi + AiBr +// Yr = ArBr - AB +// Yi = ArBi + AiBr +const COMPLEX_MULTIPLY = { + REAL: 'return areal * breal - aimag * bimag;', + IMAG: 'return areal * bimag + aimag * breal;' +}; +class BinaryOpComplexProgram { + constructor(op, aShape, bShape) { + this.variableNames = ['AReal', 'AImag', 'BReal', 'BImag']; + this.outputShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(aShape, bShape); + this.userCode = ` + float binaryOpComplex( + float areal, float aimag, float breal, float bimag) { + ${op} + } + + void main() { + float areal = getARealAtOutCoords(); + float aimag = getAImagAtOutCoords(); + float breal = getBRealAtOutCoords(); + float bimag = getBImagAtOutCoords(); + setOutput(binaryOpComplex(areal, aimag, breal, bimag)); + } + `; + } +} +//# sourceMappingURL=binaryop_complex_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js ***! + \**************************************************************************/ +/*! exports provided: INT_DIV, POW, SQUARED_DIFFERENCE, EQUAL, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL, LOGICAL_AND, LOGICAL_OR, MAX, MIN, MOD, ELU_DER, PRELU, BinaryOpProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INT_DIV", function() { return INT_DIV; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "POW", function() { return POW; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SQUARED_DIFFERENCE", function() { return SQUARED_DIFFERENCE; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EQUAL", function() { return EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LESS", function() { return LESS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LESS_EQUAL", function() { return LESS_EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GREATER", function() { return GREATER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GREATER_EQUAL", function() { return GREATER_EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOGICAL_AND", function() { return LOGICAL_AND; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOGICAL_OR", function() { return LOGICAL_OR; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAX", function() { return MAX; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MIN", function() { return MIN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MOD", function() { return MOD; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ELU_DER", function() { return ELU_DER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PRELU", function() { return PRELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BinaryOpProgram", function() { return BinaryOpProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const CHECK_NAN_SNIPPET = ` + if (isnan(a)) return a; + if (isnan(b)) return b; +`; +// We use native integer division to deal with floating point imprecision. Since +// we implement floor division and glsl implements truncated division, we +// correct for this by subtracting 1 from result when the result is negative and +// there is a remainder. +const INT_DIV = ` + float s = sign(a) * sign(b); + int ia = round(a); + int ib = round(b); + if (ib != 0) { + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + return float(idiv(ia, ib, s)); + } else { + return NAN; + } +`; +const POW = ` +if(a < 0.0 && floor(b) < b){ + return NAN; +} +if (b == 0.0) { + return 1.0; +} +return (round(mod(b, 2.0)) != 1) ? + pow(abs(a), b) : sign(a) * pow(abs(a), b); +`; +const SQUARED_DIFFERENCE = 'return (a - b) * (a - b);'; +const EQUAL = `return float(a == b);`; +const LESS = `return float(a < b);`; +const LESS_EQUAL = `return float(a <= b);`; +const GREATER = `return float(a > b);`; +const GREATER_EQUAL = `return float(a >= b);`; +const LOGICAL_AND = `return float(a >= 1.0 && b >= 1.0);`; +const LOGICAL_OR = `return float(a >= 1.0 || b >= 1.0);`; +const MAX = CHECK_NAN_SNIPPET + ` + return max(a, b); +`; +const MIN = CHECK_NAN_SNIPPET + ` + return min(a, b); +`; +const MOD = `if (b == 0.0) return NAN; + return mod(a, b);`; +const ELU_DER = `return (b >= 1.0) ? a : a * (b + 1.0);`; +const PRELU = `return (a < 0.) ? b * a : a;`; +class BinaryOpProgram { + constructor(op, aShape, bShape) { + this.variableNames = ['A', 'B']; + this.outputShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(aShape, bShape); + this.userCode = ` + float binaryOperation(float a, float b) { + ${op} + } + + void main() { + float a = getAAtOutCoords(); + float b = getBAtOutCoords(); + setOutput(binaryOperation(a, b)); + } + `; + } +} +//# sourceMappingURL=binaryop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: INT_DIV, POW, PRELU, ELU_DER, EQUAL, NOT_EQUAL, LESS, LESS_EQUAL, GREATER, GREATER_EQUAL, LOGICAL_AND, LOGICAL_OR, MAX, MIN, MOD, BinaryOpPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INT_DIV", function() { return INT_DIV; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "POW", function() { return POW; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PRELU", function() { return PRELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ELU_DER", function() { return ELU_DER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EQUAL", function() { return EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NOT_EQUAL", function() { return NOT_EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LESS", function() { return LESS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LESS_EQUAL", function() { return LESS_EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GREATER", function() { return GREATER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GREATER_EQUAL", function() { return GREATER_EQUAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOGICAL_AND", function() { return LOGICAL_AND; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOGICAL_OR", function() { return LOGICAL_OR; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAX", function() { return MAX; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MIN", function() { return MIN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MOD", function() { return MOD; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BinaryOpPackedProgram", function() { return BinaryOpPackedProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const CHECK_NAN_SNIPPET = ` + result.r = isNaN.r > 0. ? NAN : result.r; + result.g = isNaN.g > 0. ? NAN : result.g; + result.b = isNaN.b > 0. ? NAN : result.b; + result.a = isNaN.a > 0. ? NAN : result.a; +`; +const INT_DIV = ` + ivec4 ia = round(a); + ivec4 ib = round(b); + bvec4 cond = notEqual(ib, ivec4(0)); + ivec4 result = ivec4(0); + vec4 s = sign(a) * sign(b); + + // Windows (D3D) wants guaranteed non-zero int division at compile-time. + if (cond[0]) { + result[0] = idiv(ia[0], ib[0], s[0]); + } + if (cond[1]) { + result[1] = idiv(ia[1], ib[1], s[1]); + } + if (cond[2]) { + result[2] = idiv(ia[2], ib[2], s[2]); + } + if (cond[3]) { + result[3] = idiv(ia[3], ib[3], s[3]); + } + return vec4(result); +`; +const POW = ` + // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise. + vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1))); + vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1); + vec4 result = multiplier * pow(abs(a), b); + + // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS + bvec4 isExpZero = equal(b, vec4(0.0)); + result.r = isExpZero.r ? 1.0 : result.r; + result.g = isExpZero.g ? 1.0 : result.g; + result.b = isExpZero.b ? 1.0 : result.b; + result.a = isExpZero.a ? 1.0 : result.a; + + vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b)); + ` + + CHECK_NAN_SNIPPET + ` + return result; +`; +const PRELU = ` + vec4 aLessThanZero = vec4(lessThan(a, vec4(0.))); + return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a); +`; +const ELU_DER = ` + vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.))); + return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0)))); +`; +const EQUAL = ` + return vec4(equal(a, b)); +`; +const NOT_EQUAL = ` + return vec4(notEqual(a, b)); +`; +const LESS = ` + return vec4(lessThan(a, b)); +`; +const LESS_EQUAL = ` + return vec4(lessThanEqual(a, b)); +`; +const GREATER = ` + return vec4(greaterThan(a, b)); +`; +const GREATER_EQUAL = ` + return vec4(greaterThanEqual(a, b)); +`; +const LOGICAL_AND = ` + return vec4( + vec4(greaterThanEqual(a, vec4(1.0))) * + vec4(greaterThanEqual(b, vec4(1.0)))); +`; +const LOGICAL_OR = ` + return min( + vec4(greaterThanEqual(a, vec4(1.0))) + + vec4(greaterThanEqual(b, vec4(1.0))), + vec4(1.0)); +`; +const MAX = ` + vec4 result = vec4(max(a, b)); + vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0)); + ` + + CHECK_NAN_SNIPPET + ` + return result; +`; +const MIN = ` + vec4 result = vec4(min(a, b)); + vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0)); + ` + + CHECK_NAN_SNIPPET + ` + return result; +`; +const MOD = ` + vec4 result = mod(a, b); + vec4 isNaN = vec4(equal(b, vec4(0.0))); + ` + + CHECK_NAN_SNIPPET + ` + return result; +`; +class BinaryOpPackedProgram { + constructor(op, aShape, bShape, checkOutOfBounds = false) { + this.variableNames = ['A', 'B']; + this.supportsBroadcasting = true; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAndGetBroadcastShape(aShape, bShape); + const rank = this.outputShape.length; + let checkOutOfBoundsString = ''; + if (checkOutOfBounds) { + if (rank === 0 || _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(this.outputShape) === 1) { + checkOutOfBoundsString = ` + result.y = 0.; + result.z = 0.; + result.w = 0.; + `; + } + else { + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_2__["getCoordsDataType"])(rank); + checkOutOfBoundsString = ` + ${dtype} coords = getOutputCoords(); + `; + if (rank === 1) { + checkOutOfBoundsString += ` + result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y; + result.z = 0.; + result.w = 0.; + `; + } + else { + const channels = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('coords', rank); + checkOutOfBoundsString += ` + bool nextRowOutOfBounds = + (${channels[rank - 2]} + 1) >= ${this.outputShape[rank - 2]}; + bool nextColOutOfBounds = + (${channels[rank - 1]} + 1) >= ${this.outputShape[rank - 1]}; + result.y = nextColOutOfBounds ? 0. : result.y; + result.z = nextRowOutOfBounds ? 0. : result.z; + result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w; + `; + } + } + } + this.userCode = ` + vec4 binaryOperation(vec4 a, vec4 b) { + ${op} + } + + void main() { + vec4 a = getAAtOutCoords(); + vec4 b = getBAtOutCoords(); + + vec4 result = binaryOperation(a, b); + ${checkOutOfBoundsString} + + setOutput(result); + } + `; + } +} +//# sourceMappingURL=binaryop_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js ***! + \*************************************************************************/ +/*! exports provided: clearWebGLContext, setWebGLContext, getWebGLContext */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearWebGLContext", function() { return clearWebGLContext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setWebGLContext", function() { return setWebGLContext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWebGLContext", function() { return getWebGLContext; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const contexts = {}; +const WEBGL_ATTRIBUTES = { + alpha: false, + antialias: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + depth: false, + stencil: false, + failIfMajorPerformanceCaveat: true +}; +function clearWebGLContext(webGLVersion) { + delete contexts[webGLVersion]; +} +function setWebGLContext(webGLVersion, gl) { + contexts[webGLVersion] = gl; +} +function getWebGLContext(webGLVersion) { + if (!(webGLVersion in contexts)) { + const newCtx = getWebGLRenderingContext(webGLVersion); + if (newCtx !== null) { + contexts[webGLVersion] = newCtx; + } + else { + console.log('Could not get context for WebGL version', webGLVersion); + return null; + } + } + const gl = contexts[webGLVersion]; + if (gl.isContextLost()) { + delete contexts[webGLVersion]; + return getWebGLContext(webGLVersion); + } + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.STENCIL_TEST); + gl.disable(gl.BLEND); + gl.disable(gl.DITHER); + gl.disable(gl.POLYGON_OFFSET_FILL); + gl.disable(gl.SAMPLE_COVERAGE); + gl.enable(gl.SCISSOR_TEST); + gl.enable(gl.CULL_FACE); + gl.cullFace(gl.BACK); + return contexts[webGLVersion]; +} +function createCanvas(webGLVersion) { + if (typeof OffscreenCanvas !== 'undefined' && webGLVersion === 2) { + return new OffscreenCanvas(300, 150); + } + else if (typeof document !== 'undefined') { + return document.createElement('canvas'); + } + else { + throw new Error('Cannot create a canvas in this context'); + } +} +function getWebGLRenderingContext(webGLVersion) { + if (webGLVersion !== 1 && webGLVersion !== 2) { + throw new Error('Cannot get WebGL rendering context, WebGL is disabled.'); + } + const canvas = createCanvas(webGLVersion); + canvas.addEventListener('webglcontextlost', (ev) => { + ev.preventDefault(); + delete contexts[webGLVersion]; + }, false); + if (webGLVersion === 1) { + return (canvas.getContext('webgl', WEBGL_ATTRIBUTES) || + canvas.getContext('experimental-webgl', WEBGL_ATTRIBUTES)); + } + return canvas.getContext('webgl2', WEBGL_ATTRIBUTES); +} +//# sourceMappingURL=canvas_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js ***! + \**********************************************************************/ +/*! exports provided: ClipProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ClipProgram", function() { return ClipProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ClipProgram { + constructor(aShape) { + this.variableNames = ['A']; + this.outputShape = aShape; + this.userCode = ` + uniform float minVal; + uniform float maxVal; + + void main() { + float value = getAAtOutCoords(); + if (isnan(value)) { + setOutput(value); + return; + } + + setOutput(clamp(value, minVal, maxVal)); + } + `; + } + getCustomSetupFunc(min, max) { + return (gpgpu, webGLProgram) => { + if (this.minLoc == null) { + this.minLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'minVal'); + this.maxLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'maxVal'); + } + gpgpu.gl.uniform1f(this.minLoc, min); + gpgpu.gl.uniform1f(this.maxLoc, max); + }; + } +} +//# sourceMappingURL=clip_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: ClipPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ClipPackedProgram", function() { return ClipPackedProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ClipPackedProgram { + constructor(aShape) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = aShape; + this.userCode = ` + uniform float minVal; + uniform float maxVal; + + void main() { + vec4 value = getAAtOutCoords(); + + if (any(isnan(value))) { + setOutput(value); + return; + } + + setOutput(clamp(value, vec4(minVal), vec4(maxVal))); + } + `; + } + getCustomSetupFunc(min, max) { + return (gpgpu, webGLProgram) => { + if (this.minLoc == null) { + this.minLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'minVal'); + this.maxLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'maxVal'); + } + gpgpu.gl.uniform1f(this.minLoc, min); + gpgpu.gl.uniform1f(this.maxLoc, max); + }; + } +} +//# sourceMappingURL=clip_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: ComplexAbsProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComplexAbsProgram", function() { return ComplexAbsProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ComplexAbsProgram { + constructor(shape) { + this.variableNames = ['real', 'imag']; + this.outputShape = shape; + this.userCode = ` + void main() { + float re = abs(getRealAtOutCoords()); + float im = abs(getImagAtOutCoords()); + float mx = max(re, im); + + // sadly the length function in glsl is not underflow-safe + // (at least not on Intel GPUs). So the safe solution is + // to ensure underflow-safety in all cases. + setOutput( + mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx)) + ); + } + `; + } +} +//# sourceMappingURL=complex_abs_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js ***! + \************************************************************************/ +/*! exports provided: ConcatProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConcatProgram", function() { return ConcatProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class ConcatProgram { + // Concats 2d tensors along axis=1. See comments in MathBackendWebGL.concat(). + constructor(shapes) { + this.outputShape = []; + this.outputShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape(shapes, 1 /* axis */); + this.variableNames = shapes.map((_, i) => `T${i}`); + const offsets = new Array(shapes.length - 1); + offsets[0] = shapes[0][1]; + for (let i = 1; i < offsets.length; i++) { + offsets[i] = offsets[i - 1] + shapes[i][1]; + } + const snippets = [`if (yC < ${offsets[0]}) setOutput(getT0(yR, yC));`]; + for (let i = 1; i < offsets.length; i++) { + const shift = offsets[i - 1]; + snippets.push(`else if (yC < ${offsets[i]}) ` + + `setOutput(getT${i}(yR, yC-${shift}));`); + } + const lastIndex = offsets.length; + const lastShift = offsets[offsets.length - 1]; + snippets.push(`else setOutput(getT${lastIndex}(yR, yC-${lastShift}));`); + this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int yR = coords.x; + int yC = coords.y; + + ${snippets.join('\n ')} + } + `; + } +} +//# sourceMappingURL=concat_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: ConcatPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConcatPackedProgram", function() { return ConcatPackedProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class ConcatPackedProgram { + constructor(shapes, axis) { + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = []; + this.outputShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape(shapes, axis); + const shape = this.outputShape; + const rank = shape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_2__["getCoordsDataType"])(rank); + const coords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_1__["getChannels"])('coords', rank); + const channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank); + this.variableNames = shapes.map((_, i) => `T${i}`); + const offsets = new Array(shapes.length - 1); + offsets[0] = shapes[0][axis]; + for (let i = 1; i < offsets.length; i++) { + offsets[i] = offsets[i - 1] + shapes[i][axis]; + } + const channel = channels[axis]; + const lastChannels = channels.slice(-2); + const allChannels = channels.join(); + let getValueSnippet = `if (${channel} < ${offsets[0]}) { + return getChannel( + getT0(${allChannels}), vec2(${lastChannels.join()})); + }`; + for (let i = 1; i < offsets.length; i++) { + const shift = offsets[i - 1]; + // Note: the >= comparison below may seem unnecessary given the check + // above but is needed to workaround branch execution issues on some + // devices. It makes all the conditions exclusive without relying on + // execution order. + getValueSnippet += ` + if (${channel} < ${offsets[i]} && ${channel} >= ${offsets[i - 1]}) { + return getChannel( + getT${i}(${shiftedChannels(channels, channel, shift)}), + vec2(${shiftedChannels(lastChannels, channel, shift)})); + }`; + } + const lastIndex = offsets.length; + const shift = offsets[offsets.length - 1]; + getValueSnippet += ` + return getChannel( + getT${lastIndex}(${shiftedChannels(channels, channel, shift)}), + vec2(${shiftedChannels(lastChannels, channel, shift)}));`; + this.userCode = ` + float getValue(${channels.map(x => 'int ' + x)}) { + ${getValueSnippet} + } + + void main() { + ${dtype} coords = getOutputCoords(); + vec4 result = vec4(getValue(${coords}), 0., 0., 0.); + + ${coords[rank - 1]} = ${coords[rank - 1]} + 1; + if (${coords[rank - 1]} < ${shape[rank - 1]}) { + result.g = getValue(${coords}); + } + + ${coords[rank - 2]} = ${coords[rank - 2]} + 1; + if (${coords[rank - 2]} < ${shape[rank - 2]}) { + result.a = getValue(${coords}); + } + + ${coords[rank - 1]} = ${coords[rank - 1]} - 1; + if (${coords[rank - 2]} < ${shape[rank - 2]} && + ${coords[rank - 1]} < ${shape[rank - 1]}) { + result.b = getValue(${coords}); + } + setOutput(result); + } + `; + } +} +/** + * Return an expression for coordinates into a vector where a given channel + * will be offset by [shift]. + * + * @param channels the channels to consider + * @param channel the channel we want shifted + * @param shift the amount to subtract from the channel. + * + * @returns a string of the form 'x, y-[shift], z' where any one channel can + * have the shift applied. + */ +function shiftedChannels(channels, channel, shift) { + const channelIdx = channels.indexOf(channel); + const res = channels.map((c, idx) => { + if (idx === channelIdx) { + return `${c} - ${shift}`; + } + else { + return c; + } + }); + return res.join(); +} +//# sourceMappingURL=concat_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: Conv2DDerFilterProgram, Conv2DDerInputProgram, Conv3DDerFilterProgram, Conv3DDerInputProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv2DDerFilterProgram", function() { return Conv2DDerFilterProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv2DDerInputProgram", function() { return Conv2DDerInputProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv3DDerFilterProgram", function() { return Conv3DDerFilterProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv3DDerInputProgram", function() { return Conv3DDerInputProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class Conv2DDerFilterProgram { + constructor(convInfo) { + this.variableNames = ['x', 'dy']; + this.outputShape = convInfo.filterShape; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const isChannelsLast = convInfo.dataFormat === 'channelsLast'; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int d2 = coords.w; + + // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int b = 0; b < ${convInfo.batchSize}; b++) { + for (int yR = 0; yR < ${convInfo.outHeight}; yR++) { + int xR = wR + yR * ${strideHeight} - ${padTop}; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${convInfo.outWidth}; yC++) { + int xC = wC + yC * ${strideWidth} - ${padLeft}; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + if (${isChannelsLast}) { + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } else { + float dyValue = getDy(b, d2, yR, yC); + float xValue = getX(b, d1, xR, xC); + dotProd += (xValue * dyValue); + } + + } + } + } + setOutput(dotProd); + } + `; + } +} +class Conv2DDerInputProgram { + constructor(convInfo) { + this.variableNames = ['dy', 'W']; + this.outputShape = convInfo.inShape; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const isChannelsLast = convInfo.dataFormat === 'channelsLast'; + const padTop = filterHeight - 1 - convInfo.padInfo.top; + const padLeft = filterWidth - 1 - convInfo.padInfo.left; + const rowDim = isChannelsLast ? 1 : 2; + const colDim = isChannelsLast ? 2 : 3; + const channelDim = isChannelsLast ? 3 : 1; + this.userCode = ` + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[${channelDim}]; + + ivec2 dyCorner = ivec2(coords[${rowDim}], coords[${colDim}]) - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${filterHeight}; wR++) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${filterHeight} - 1 - wR; + + for (int wC = 0; wC < ${filterWidth}; wC++) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${filterWidth} - 1 - wC; + + for (int d2 = 0; d2 < ${convInfo.outChannels}; d2++) { + + if (${isChannelsLast}) { + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } else { + float xValue = getDy(batch, d2, idyR, idyC); + float wValue = getW(wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + + } + } + } + setOutput(dotProd); + } + `; + } +} +class Conv3DDerFilterProgram { + constructor(convInfo) { + this.variableNames = ['x', 'dy']; + this.outputShape = convInfo.filterShape; + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const padFront = convInfo.padInfo.front; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + this.userCode = ` + void main() { + ivec5 coords = getOutputCoords(); + int wF = coords.x; + int wR = coords.y; + int wC = coords.z; + int d1 = coords.w; + int d2 = coords.u; + + float dotProd = 0.0; + + for (int b = 0; b < ${convInfo.batchSize}; b++) { + for (int yF = 0; yF < ${convInfo.outDepth}; yF++) { + int xF = wF + yF * ${strideDepth} - ${padFront}; + + if (xF < 0 || xF >= ${convInfo.inDepth}) { + continue; + } + + for (int yR = 0; yR < ${convInfo.outHeight}; yR++) { + int xR = wR + yR * ${strideHeight} - ${padTop}; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${convInfo.outWidth}; yC++) { + int xC = wC + yC * ${strideWidth} - ${padLeft}; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + float dyValue = getDy(b, yF, yR, yC, d2); + float xValue = getX(b, xF, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + } + setOutput(dotProd); + } + `; + } +} +class Conv3DDerInputProgram { + constructor(convInfo) { + this.variableNames = ['dy', 'W']; + this.outputShape = convInfo.inShape; + const filterDepth = convInfo.filterDepth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const padFront = filterDepth - 1 - convInfo.padInfo.front; + const padTop = filterHeight - 1 - convInfo.padInfo.top; + const padLeft = filterWidth - 1 - convInfo.padInfo.left; + this.userCode = ` + const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d1 = coords.u; + + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyFCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + float dotProd = 0.0; + for (int wF = 0; wF < ${filterDepth}; wF++) { + float dyF = float(dyFCorner + wF) / ${strideDepth}.0; + + if (dyF < 0.0 || dyF >= ${convInfo.outDepth}.0 || fract(dyF) > 0.0) { + continue; + } + int idyF = int(dyF); + + int wFPerm = ${filterDepth} - 1 - wF; + + for (int wR = 0; wR < ${filterHeight}; wR++) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${filterHeight} - 1 - wR; + + for (int wC = 0; wC < ${filterWidth}; wC++) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${filterWidth} - 1 - wC; + + for (int d2 = 0; d2 < ${convInfo.outChannels}; d2++) { + float xValue = getDy(batch, idyF, idyR, idyC, d2); + float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2); + dotProd += xValue * wValue; + } + } + } + } + setOutput(dotProd); + } + `; + } +} +//# sourceMappingURL=conv_backprop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js ***! + \*****************************************************************************************/ +/*! exports provided: DepthwiseConv2DDerFilterProgram, DepthwiseConv2DDerInputProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2DDerFilterProgram", function() { return DepthwiseConv2DDerFilterProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2DDerInputProgram", function() { return DepthwiseConv2DDerInputProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class DepthwiseConv2DDerFilterProgram { + constructor(convInfo) { + this.variableNames = ['x', 'dy']; + this.outputShape = convInfo.filterShape; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const channelMul = convInfo.outChannels / convInfo.inChannels; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int wR = coords.x; + int wC = coords.y; + int d1 = coords.z; + int dm = coords.w; + int d2 = d1 * ${channelMul} + dm; + + float dotProd = 0.0; + + // TO DO: Vec4 over the batch size + for (int b = 0; b < ${convInfo.batchSize}; b++) { + for (int yR = 0; yR < ${convInfo.outHeight}; yR++) { + int xR = wR + yR * ${strideHeight} - ${padTop}; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int yC = 0; yC < ${convInfo.outWidth}; yC++) { + int xC = wC + yC * ${strideWidth} - ${padLeft}; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + float dyValue = getDy(b, yR, yC, d2); + float xValue = getX(b, xR, xC, d1); + dotProd += (xValue * dyValue); + } + } + } + setOutput(dotProd); + } + `; + } +} +class DepthwiseConv2DDerInputProgram { + constructor(convInfo) { + this.variableNames = ['dy', 'W']; + this.outputShape = convInfo.inShape; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const padTop = filterHeight - 1 - convInfo.padInfo.top; + const padLeft = filterWidth - 1 - convInfo.padInfo.left; + const channelMul = convInfo.outChannels / convInfo.inChannels; + this.userCode = ` + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d1 = coords[3]; + ivec2 dyCorner = coords.yz - pads; + int dyRCorner = dyCorner.x; + int dyCCorner = dyCorner.y; + + float dotProd = 0.0; + + for (int wR = 0; wR < ${filterHeight}; wR++) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + int wRPerm = ${filterHeight} - 1 - wR; + + for (int wC = 0; wC < ${filterWidth}; wC++) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + int wCPerm = ${filterWidth} - 1 - wC; + + // TO DO: Vec4 over the channelMul + for (int dm = 0; dm < ${channelMul}; dm++) { + int d2 = d1 * ${channelMul} + dm; + float xValue = getDy(batch, idyR, idyC, d2); + float wValue = getW(wRPerm, wCPerm, d1, dm); + dotProd += xValue * wValue; + } + } + } + setOutput(dotProd); + } + `; + } +} +//# sourceMappingURL=conv_backprop_gpu_depthwise.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js ***! + \**********************************************************************/ +/*! exports provided: Conv2DProgram, Conv3DProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv2DProgram", function() { return Conv2DProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv3DProgram", function() { return Conv3DProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class Conv2DProgram { + constructor(convInfo, addBias = false, activation = null, hasPreluActivationWeights = false) { + this.variableNames = ['x', 'W']; + this.outputShape = convInfo.outShape; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4; + const inputDepthVec4Remainder = convInfo.inChannels % 4; + const isChannelsLast = convInfo.dataFormat === 'channelsLast'; + const rowDim = isChannelsLast ? 1 : 2; + const colDim = isChannelsLast ? 2 : 3; + const channelDim = isChannelsLast ? 3 : 1; + let activationSnippet = '', applyActivationSnippet = ''; + if (activation) { + if (hasPreluActivationWeights) { + activationSnippet = `float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${activation} + }`; + } + else { + activationSnippet = ` + float activation(float x) { + ${activation} + } + `; + } + applyActivationSnippet = `result = activation(result);`; + } + const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : ''; + if (addBias) { + this.variableNames.push('bias'); + } + if (hasPreluActivationWeights) { + this.variableNames.push('preluActivationWeights'); + } + this.userCode = ` + ${activationSnippet} + + const ivec2 strides = ivec2(${strideHeight}, ${strideWidth}); + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d2 = coords[${channelDim}]; + + ivec2 xRCCorner = + ivec2(coords[${rowDim}], coords[${colDim}]) * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${filterHeight}; wR++) { + int xR = xRCorner + wR * ${dilationHeight}; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${filterWidth}; wC++) { + int xC = xCCorner + wC * ${dilationWidth}; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${inputDepthNearestVec4}; d1 += 4) { + vec4 wValues = vec4( + getW(wR, wC, d1, d2), + getW(wR, wC, d1 + 1, d2), + getW(wR, wC, d1 + 2, d2), + getW(wR, wC, d1 + 3, d2) + ); + + if (${isChannelsLast}) { + vec4 xValues = vec4( + getX(batch, xR, xC, d1), + getX(batch, xR, xC, d1 + 1), + getX(batch, xR, xC, d1 + 2), + getX(batch, xR, xC, d1 + 3) + ); + dotProd += dot(xValues, wValues); + } else { + vec4 xValues = vec4( + getX(batch, d1, xR, xC), + getX(batch, d1 + 1, xR, xC), + getX(batch, d1 + 2, xR, xC), + getX(batch, d1 + 3, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + } + + if (${inputDepthVec4Remainder === 1}) { + + if (${isChannelsLast}) { + dotProd += + getX(batch, xR, xC, ${inputDepthNearestVec4}) * + getW(wR, wC, ${inputDepthNearestVec4}, d2); + } else { + dotProd += + getX(batch, ${inputDepthNearestVec4}, xR, xC) * + getW(wR, wC, ${inputDepthNearestVec4}, d2); + } + + } else if (${inputDepthVec4Remainder === 2}) { + vec2 wValues = vec2( + getW(wR, wC, ${inputDepthNearestVec4}, d2), + getW(wR, wC, ${inputDepthNearestVec4} + 1, d2) + ); + + if (${isChannelsLast}) { + vec2 xValues = vec2( + getX(batch, xR, xC, ${inputDepthNearestVec4}), + getX(batch, xR, xC, ${inputDepthNearestVec4} + 1) + ); + dotProd += dot(xValues, wValues); + } else { + vec2 xValues = vec2( + getX(batch, ${inputDepthNearestVec4}, xR, xC), + getX(batch, ${inputDepthNearestVec4} + 1, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } else if (${inputDepthVec4Remainder === 3}) { + vec3 wValues = vec3( + getW(wR, wC, ${inputDepthNearestVec4}, d2), + getW(wR, wC, ${inputDepthNearestVec4} + 1, d2), + getW(wR, wC, ${inputDepthNearestVec4} + 2, d2) + ); + + if (${isChannelsLast}) { + vec3 xValues = vec3( + getX(batch, xR, xC, ${inputDepthNearestVec4}), + getX(batch, xR, xC, ${inputDepthNearestVec4} + 1), + getX(batch, xR, xC, ${inputDepthNearestVec4} + 2) + ); + dotProd += dot(xValues, wValues); + } else { + vec3 xValues = vec3( + getX(batch, ${inputDepthNearestVec4}, xR, xC), + getX(batch, ${inputDepthNearestVec4} + 1, xR, xC), + getX(batch, ${inputDepthNearestVec4} + 2, xR, xC) + ); + dotProd += dot(xValues, wValues); + } + + } + } + } + + float result = dotProd; + ${addBiasSnippet} + ${applyActivationSnippet} + setOutput(result); + } + `; + } +} +class Conv3DProgram { + constructor(convInfo) { + this.variableNames = ['x', 'W']; + this.outputShape = convInfo.outShape; + const padFront = convInfo.padInfo.front; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const filterDepth = convInfo.filterDepth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4; + const inputDepthVec4Remainder = convInfo.inChannels % 4; + this.userCode = ` + const ivec3 strides = ivec3(${strideDepth}, ${strideHeight}, ${strideWidth}); + const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int d2 = coords.u; + + ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xFCorner = xFRCCorner.x; + int xRCorner = xFRCCorner.y; + int xCCorner = xFRCCorner.z; + + // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get + // y(yF, yR, yC, d2). ? = to be determined. : = across all + // values in that axis. + float dotProd = 0.0; + for (int wF = 0; wF < ${filterDepth}; wF++) { + int xF = xFCorner + wF * ${dilationDepth}; + + if (xF < 0 || xF >= ${convInfo.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${filterHeight}; wR++) { + int xR = xRCorner + wR * ${dilationHeight}; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${filterWidth}; wC++) { + int xC = xCCorner + wC * ${dilationWidth}; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + for (int d1 = 0; d1 < ${inputDepthNearestVec4}; d1 += 4) { + vec4 xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3) + ); + vec4 wValues = vec4( + getW(wF, wR, wC, d1, d2), + getW(wF, wR, wC, d1 + 1, d2), + getW(wF, wR, wC, d1 + 2, d2), + getW(wF, wR, wC, d1 + 3, d2) + ); + + dotProd += dot(xValues, wValues); + } + + if (${inputDepthVec4Remainder === 1}) { + dotProd += + getX(batch, xF, xR, xC, ${inputDepthNearestVec4}) * + getW(wF, wR, wC, ${inputDepthNearestVec4}, d2); + } else if (${inputDepthVec4Remainder === 2}) { + vec2 xValues = vec2( + getX(batch, xF, xR, xC, ${inputDepthNearestVec4}), + getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 1) + ); + vec2 wValues = vec2( + getW(wF, wR, wC, ${inputDepthNearestVec4}, d2), + getW(wF, wR, wC, ${inputDepthNearestVec4} + 1, d2) + ); + dotProd += dot(xValues, wValues); + } else if (${inputDepthVec4Remainder === 3}) { + vec3 xValues = vec3( + getX(batch, xF, xR, xC, ${inputDepthNearestVec4}), + getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 1), + getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 2) + ); + vec3 wValues = vec3( + getW(wF, wR, wC, ${inputDepthNearestVec4}, d2), + getW(wF, wR, wC, ${inputDepthNearestVec4} + 1, d2), + getW(wF, wR, wC, ${inputDepthNearestVec4} + 2, d2) + ); + dotProd += dot(xValues, wValues); + } + } + } + } + setOutput(dotProd); + } + `; + } +} +//# sourceMappingURL=conv_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js ***! + \********************************************************************************/ +/*! exports provided: DepthwiseConv2DProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2DProgram", function() { return DepthwiseConv2DProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class DepthwiseConv2DProgram { + constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false) { + this.variableNames = ['x', 'W']; + this.outputShape = convInfo.outShape; + const xNumRows = convInfo.inHeight; + const xNumCols = convInfo.inWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const channelMul = convInfo.outChannels / convInfo.inChannels; + let activationSnippet = '', applyActivationSnippet = ''; + if (activation) { + if (hasPreluActivation) { + activationSnippet = `float activation(float a) { + float b = getPreluActivationWeightsAtOutCoords(); + ${activation} + }`; + } + else { + activationSnippet = ` + float activation(float x) { + ${activation} + } + `; + } + applyActivationSnippet = `result = activation(result);`; + } + const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : ''; + if (addBias) { + this.variableNames.push('bias'); + } + if (hasPreluActivation) { + this.variableNames.push('preluActivationWeights'); + } + this.userCode = ` + ${activationSnippet} + + const ivec2 strides = ivec2(${strideHeight}, ${strideWidth}); + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int d1 = d2 / ${channelMul}; + int q = d2 - d1 * ${channelMul}; + + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations. + for (int wR = 0; wR < ${filterHeight}; wR++) { + int xR = xRCorner + wR * ${dilationHeight}; + + if (xR < 0 || xR >= ${xNumRows}) { + continue; + } + + for (int wC = 0; wC < ${filterWidth}; wC++) { + int xC = xCCorner + wC * ${dilationWidth}; + + if (xC < 0 || xC >= ${xNumCols}) { + continue; + } + + float xVal = getX(batch, xR, xC, d1); + float wVal = getW(wR, wC, d1, q); + dotProd += xVal * wVal; + } + } + + float result = dotProd; + ${addBiasSnippet} + ${applyActivationSnippet} + setOutput(result); + } + `; + } +} +//# sourceMappingURL=conv_gpu_depthwise.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js ***! + \***************************************************************************************/ +/*! exports provided: DepthwiseConvPacked2DProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConvPacked2DProgram", function() { return DepthwiseConvPacked2DProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class DepthwiseConvPacked2DProgram { + constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false) { + this.variableNames = ['x', 'W']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = convInfo.outShape; + const xNumRows = convInfo.inHeight; + const xNumCols = convInfo.inWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const filterHeight = convInfo.filterHeight; + const filterWidth = convInfo.filterWidth; + const texelsAcross = filterWidth; + let mainLoop = `int xR; int xC; int xCOffset;`; + for (let r = 0; r < filterHeight; r++) { + for (let c = 0; c < filterWidth; c++) { + mainLoop += ` + vec4 xTexelR${r}C${c * 2} = vec4(0.); + vec4 wR${r}C${c} = vec4(0.); + vec4 xR${r}C${c} = vec4(0.);`; + } + } + /** + * This vectorized implementation works by gathering the values needed for + * each output channel's dot product into vec4's and then multiplying them + * all together (this happens in the final double for-loop below). Most of + * the main loop consists of constructing these vec4's with the minimum + * number of texture2D calls, which means making use of all four returned + * values from a texture2D call at once. + */ + for (let r = 0; r < filterHeight; r++) { + for (let texelC = 0; texelC < texelsAcross; texelC++) { + const c = texelC * 2; + mainLoop += ` + xR = xRCorner + ${r * dilationHeight}; + xC = xCCorner + ${c * dilationWidth}; + `; + if (strideWidth === 1) { + if (c < filterWidth) { + // If padding is odd, the outer texels have to be composed. + if (padLeft % 2 === 1) { + // TODO: Ensure vec4 previous does not result in redundant sample, + // and avoid setting xTexelRC's that exceed the boundary in the + // first place rather than resetting them to vec4(0)). + // To compute xCOffset: + // - If padding is odd, we must add 1 to ensure we ask for an + // even-numbered row. + // - We subtract 2 to access the previous texel. + mainLoop += ` + xCOffset = xC + 1; + if(xR >= 0 && xR < ${xNumRows} && xCOffset >= 0 && xCOffset < ${xNumCols}) { + xTexelR${r}C${c} = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if(xCOffset + 1 >= ${xNumCols}) { + xTexelR${r}C${c}.zw = vec2(0.); + } + } else { + xTexelR${r}C${c} = vec4(0.); + } + + xCOffset = xC + 1 - 2; + if(xR >= 0 && xR < ${xNumRows} && xCOffset >= 0 && xCOffset < ${xNumCols}) { + vec4 previous = getX(batch, xR, xCOffset, d1); + + // Need to manually clear unused channels in case + // we're reading from recycled texture. + if(xCOffset + 1 >= ${xNumCols}) { + previous.zw = vec2(0.); + } + + xR${r}C${c} = vec4(previous.zw, xTexelR${r}C${c}.xy); + } else { + xR${r}C${c} = vec4(0, 0, xTexelR${r}C${c}.xy); + } + `; + } + else { + // Padding is even, so xRC corresponds to a single texel. + mainLoop += ` + if(xR >= 0 && xR < ${xNumRows} && xC >= 0 && xC < ${xNumCols}) { + xTexelR${r}C${c} = getX(batch, xR, xC, d1); + } else { + xTexelR${r}C${c} = vec4(0.); + } + + xR${r}C${c} = xTexelR${r}C${c}; + `; + } + if (c + 1 < filterWidth) { + // If dilation is even, the second entry should match the first + // (either both are composed or both are single samples). But if + // dilation is odd, then the second entry should be the opposite + // of the first (if the first is composed, the second is a single + // sample, and vice versa.) + const nextTexelOffset = padLeft % 2 === 0 ? + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].nearestLargerEven(dilationWidth) : + dilationWidth; + if ((dilationWidth % 2 === 0 && padLeft % 2 === 1) || + (dilationWidth % 2 !== 0 && padLeft % 2 !== 1)) { + mainLoop += ` + xCOffset = xC + ${padLeft % 2} + ${nextTexelOffset}; + + if(xR >= 0 && xR < ${xNumRows} && + xCOffset >= 0 && xCOffset < ${xNumCols}) { + xTexelR${r}C${c + 2} = getX(batch, xR, xCOffset, d1); + } + `; + // If dilation > 1 then the xRC's will not be able to share any + // values, so each xRC will require two unique calls to getX. + if (dilationWidth > 1) { + mainLoop += ` + xCOffset -= 2; + if(xR >= 0 && xR < ${xNumRows} && + xCOffset >= 0 && xCOffset < ${xNumCols}) { + xTexelR${r}C${c} = getX(batch, xR, xCOffset, d1); + } else { + xTexelR${r}C${c} = vec4(0.); + } + `; + } + mainLoop += ` + xR${r}C${c + 1} = vec4( + xTexelR${r}C${c}.zw, xTexelR${r}C${c + 2}.xy); + `; + } + else { + mainLoop += ` + xCOffset = xC + ${nextTexelOffset}; + + if(xR >= 0 && xR < ${xNumRows} && + xCOffset >= 0 && xCOffset < ${xNumCols}) { + xTexelR${r}C${c + 2} = getX(batch, xR, xCOffset, d1); + } + + xR${r}C${c + 1} = xTexelR${r}C${c + 2}; + `; + } + } + } + } + else { // stride > 1 + if (c < filterWidth) { + mainLoop += ` + if(xR >= 0 && xR < ${xNumRows}) { + `; + // Depending on whether padLeft is even or odd, we want either the + // xy or zw channels from X texels for xR${r}C${c}. If padLeft is + // even, xR${r}C${c + 1} is simply the zw channels of texels we've + // already sampled. But if padLeft is odd, xR${r}C{$c + 1}.zw will + // need to come from the xy channels of a new texel, hence the `vec4 + // final` initialized below. + if (padLeft % 2 === 1) { + mainLoop += ` + xCOffset = xC + 1 - ${strideWidth}; + if(xCOffset >= 0 && xCOffset < ${xNumCols}) { + xTexelR${r}C${c} = getX(batch, xR, xCOffset, d1); + } else { + xTexelR${r}C${c} = vec4(0.); + } + + if(xC + 1 >= 0 && xC + 1 < ${xNumCols}) { + xTexelR${r}C${c + 2} = getX(batch, xR, xC + 1, d1); + } else { + xTexelR${r}C${c + 2} = vec4(0.); + } + + xR${r}C${c} = vec4( + xTexelR${r}C${c}.zw, xTexelR${r}C${c + 2}.zw); + `; + if (c + 1 < filterWidth) { + mainLoop += ` + vec4 final = vec4(0.); + xCOffset = xC + 1 + ${strideWidth}; + if(xCOffset >= 0 && xCOffset < ${xNumCols}) { + final = getX(batch, xR, xCOffset, d1); + } + xR${r}C${c + 1} = vec4(xTexelR${r}C${c + 2}.xy, final.xy); + `; + } + } + else { + mainLoop += ` + if(xC >= 0 && xC < ${xNumCols}) { + xTexelR${r}C${c} = getX(batch, xR, xC, d1); + } else { + xTexelR${r}C${c} = vec4(0.); + } + + xCOffset = xC + ${strideWidth}; + if(xCOffset >= 0 && xCOffset < ${xNumCols}) { + xTexelR${r}C${c + 2} = getX(batch, xR, xCOffset, d1); + } else { + xTexelR${r}C${c + 2} = vec4(0.); + } + + xR${r}C${c} = vec4( + xTexelR${r}C${c}.xy, xTexelR${r}C${c + 2}.xy); + `; + if (c + 1 < filterWidth) { + mainLoop += ` + xR${r}C${c + 1} = vec4( + xTexelR${r}C${c}.zw, xTexelR${r}C${c + 2}.zw); + `; + } + } + mainLoop += `}`; + } + } + if (c < filterWidth) { + mainLoop += ` + vec4 wTexelR${r}C${c} = getW(${r}, ${c}, d1, q); + wR${r}C${c} = vec4(wTexelR${r}C${c}.xz, wTexelR${r}C${c}.xz); + `; + if (c + 1 < filterWidth) { + mainLoop += ` + vec4 wTexelR${r}C${c + 1} = getW(${r}, ${c + 1}, d1, q); + wR${r}C${c + 1} = + vec4(wTexelR${r}C${c + 1}.xz, wTexelR${r}C${c + 1}.xz);`; + } + } + } + } + for (let r = 0; r < filterHeight; r++) { + for (let c = 0; c < filterWidth; c++) { + mainLoop += `dotProd += xR${r}C${c} * wR${r}C${c};`; + } + } + let activationSnippet = '', applyActivationSnippet = ''; + if (activation) { + if (hasPreluActivation) { + activationSnippet = `vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${activation} + }`; + } + else { + activationSnippet = `vec4 activation(vec4 x) { + ${activation} + }`; + } + applyActivationSnippet = `result = activation(result);`; + } + const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : ''; + if (addBias) { + this.variableNames.push('bias'); + } + if (hasPreluActivation) { + this.variableNames.push('preluActivationWeights'); + } + this.userCode = ` + ${activationSnippet} + + const ivec2 strides = ivec2(${strideHeight}, ${strideWidth}); + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + + ivec4 coords = getOutputCoords(); + int batch = coords.x; + ivec2 xRCCorner = coords.yz * strides - pads; + int d2 = coords.w; + int d1 = d2; + int q = 0; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + vec4 dotProd = vec4(0.); + + ${mainLoop} + + vec4 result = dotProd; + ${addBiasSnippet} + ${applyActivationSnippet} + setOutput(result); + } + `; + } +} +//# sourceMappingURL=conv_packed_gpu_depthwise.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: CropAndResizeProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CropAndResizeProgram", function() { return CropAndResizeProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class CropAndResizeProgram { + constructor(imageShape, boxShape, cropSize, method, extrapolationValue) { + this.variableNames = ['Image', 'Boxes', 'BoxInd']; + this.outputShape = []; + const [batch, imageHeight, imageWidth, depth] = imageShape; + const [numBoxes,] = boxShape; + const [cropHeight, cropWidth] = cropSize; + this.outputShape = [numBoxes, cropHeight, cropWidth, depth]; + const methodId = method === 'bilinear' ? 1 : 0; + const [inputHeightFloat, inputWidthFloat] = [`${imageHeight - 1}.0`, `${imageWidth - 1}.0`]; + const [heightRatio, heightScale, inY] = cropHeight > 1 ? + [ + `${(imageHeight - 1) / (cropHeight - 1)}`, + '(y2-y1) * height_ratio', + `y1*${inputHeightFloat} + float(y)*(height_scale)`, + ] : + [ + '0.0', + '0.0', + `0.5 * (y1+y2) * ${inputHeightFloat}`, + ]; + const [widthRatio, widthScale, inX] = cropWidth > 1 ? + [ + `${(imageWidth - 1) / (cropWidth - 1)}`, + '(x2-x1) * width_ratio', + `x1*${inputWidthFloat} + float(x)*(width_scale)`, + ] : + [ + '0.0', + '0.0', + `0.5 * (x1+x2) * ${inputWidthFloat}`, + ]; + // Reference implementation + // tslint:disable-next-line:max-line-length + // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op_gpu.cu.cc + this.userCode = ` + const float height_ratio = float(${heightRatio}); + const float width_ratio = float(${widthRatio}); + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int y = coords[1]; + int x = coords[2]; + int d = coords[3]; + + // get box vals + float y1 = getBoxes(b,0); + float x1 = getBoxes(b,1); + float y2 = getBoxes(b,2); + float x2 = getBoxes(b,3); + + // get image in batch index + int bInd = round(getBoxInd(b)); + if(bInd < 0 || bInd >= ${batch}) { + return; + } + + float height_scale = ${heightScale}; + float width_scale = ${widthScale}; + + float in_y = ${inY}; + if( in_y < 0.0 || in_y > ${inputHeightFloat} ) { + setOutput(float(${extrapolationValue})); + return; + } + float in_x = ${inX}; + if( in_x < 0.0 || in_x > ${inputWidthFloat} ) { + setOutput(float(${extrapolationValue})); + return; + } + + vec2 sourceFracIndexCR = vec2(in_x,in_y); + if(${methodId} == 1) { + // Compute the four integer indices. + ivec2 sourceFloorCR = ivec2(sourceFracIndexCR); + ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR)); + + float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d); + float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d); + float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d); + float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d); + + vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR); + + float top = topLeft + (topRight - topLeft) * fracCR.x; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x; + float newValue = top + (bottom - top) * fracCR.y; + setOutput(newValue); + } else { + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestCR = ivec2(floor( + sourceFracIndexCR + vec2(0.5,0.5))); + float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d); + setOutput(newValue); + } + } + `; + } +} +//# sourceMappingURL=crop_and_resize_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/cumsum_gpu.js ***! + \************************************************************************/ +/*! exports provided: CumSumProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CumSumProgram", function() { return CumSumProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + +class CumSumProgram { + constructor(shape, exclusive, reverse) { + this.variableNames = ['x']; + this.outputShape = shape; + const rank = shape.length; + const val = exclusive ? '0.0' : `getX(${getCoords(rank, 'coords')})`; + const length = shape[shape.length - 1]; + let condition = ''; + let idxString = ''; + // When exclusive is set, the cumsum op becomes roll op that copies the + // value from the previous index based on the direction specified by the + // reverse flag. + if (exclusive) { + condition = reverse ? `end != ${length - 1}` : 'end != 0'; + idxString = reverse ? 'end + 1' : 'end - 1'; + } + else { + condition = reverse ? `end + pow2 < ${length}` : 'end >= pow2'; + idxString = (reverse ? 'end + pow2' : 'end - pow2'); + } + this.userCode = ` + uniform float index; + void main() { + ${Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(rank)} coords = getOutputCoords(); + int end = ${getFinalCoord(rank, 'coords')}; + float val = ${val}; + int pow2 = int(pow(2.0, index)); + if (${condition}) { + int idx = ${idxString}; + ${getFinalCoord(rank, 'coords')} = idx; + val += getX(${getCoords(rank, 'coords')}); + } + setOutput(val); + } + `; + } + getCustomSetupFunc(index) { + return (gpgpu, webGLProgram) => { + if (this.index == null) { + this.index = gpgpu.getUniformLocation(webGLProgram, 'index'); + } + gpgpu.gl.uniform1f(this.index, index); + }; + } +} +function getCoords(rank, name) { + if (rank === 1) { + return `${name}`; + } + else if (rank === 2) { + return `${name}.x, ${name}.y`; + } + else if (rank === 3) { + return `${name}.x, ${name}.y, ${name}.z`; + } + else if (rank === 4) { + return `${name}.x, ${name}.y, ${name}.z, ${name}.w`; + } + else { + throw Error(`Cumulative sum for rank ${rank} is not yet supported`); + } +} +function getFinalCoord(rank, name) { + if (rank === 1) { + return `${name}`; + } + else if (rank === 2) { + return `${name}.y`; + } + else if (rank === 3) { + return `${name}.z`; + } + else if (rank === 4) { + return `${name}.w`; + } + else { + throw Error(`Cumulative sum for rank ${rank} is not yet supported`); + } +} +//# sourceMappingURL=cumsum_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: DecodeMatrixProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DecodeMatrixProgram", function() { return DecodeMatrixProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class DecodeMatrixProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.packedInputs = false; + this.packedOutput = true; + this.outPackingScheme = _tex_util__WEBPACK_IMPORTED_MODULE_2__["PackingScheme"].DENSE; + const texShape = Object(_tex_util__WEBPACK_IMPORTED_MODULE_2__["getDenseTexShape"])(outputShape); + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + this.outputShape = outputShape; + this.userCode = ` + ivec3 outCoordsFromFlatIndex(int index) { + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd'], outputShape)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = 4 * (resTexRC.x * ${texShape[1]} + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getA(rc.x, rc.y, rc.z); + } + + ${glsl.output} = result; + } + `; + } +} +//# sourceMappingURL=decode_matrix_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js ***! + \**************************************************************************************/ +/*! exports provided: DecodeMatrixPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DecodeMatrixPackedProgram", function() { return DecodeMatrixPackedProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class DecodeMatrixPackedProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + this.outPackingScheme = _tex_util__WEBPACK_IMPORTED_MODULE_2__["PackingScheme"].DENSE; + const texShape = Object(_tex_util__WEBPACK_IMPORTED_MODULE_2__["getDenseTexShape"])(outputShape); + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + this.outputShape = outputShape; + this.userCode = ` + ivec3 outCoordsFromFlatIndex(int index) { + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd'], outputShape)} + return ivec3(r, c, d); + } + + void main() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = 4 * (resTexRC.x * ${texShape[1]} + resTexRC.y); + + vec4 result = vec4(0.); + + for (int i=0; i<4; i++) { + int flatIndex = index + i; + ivec3 rc = outCoordsFromFlatIndex(flatIndex); + result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z)); + } + + ${glsl.output} = result; + } + `; + } +} +//# sourceMappingURL=decode_matrix_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js ***! + \********************************************************************************/ +/*! exports provided: DepthToSpaceProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthToSpaceProgram", function() { return DepthToSpaceProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class DepthToSpaceProgram { + constructor(outputShape, blockSize, dataFormat) { + this.variableNames = ['x']; + this.outputShape = []; + this.outputShape = outputShape; + this.blockSize = blockSize; + this.dataFormat = dataFormat; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int h = ${this.getHeightCoordString()}; + int w = ${this.getWidthCoordString()}; + int d = ${this.getDepthCoordString()}; + + int in_h = h / ${blockSize}; + int offset_h = imod(h, ${blockSize}); + int in_w = w / ${blockSize}; + int offset_w = imod(w, ${blockSize}); + int offset_d = (offset_h * ${blockSize} + offset_w) * + ${this.getOutputDepthSize()}; + int in_d = d + offset_d; + + float result = ${this.getInputSamplingString()}; + setOutput(result); + } + `; + } + getHeightCoordString() { + if (this.dataFormat === 'NHWC') { + return `coords[1]`; + } + else { + return `coords[2]`; + } + } + getWidthCoordString() { + if (this.dataFormat === 'NHWC') { + return `coords[2]`; + } + else { + return `coords[3]`; + } + } + getDepthCoordString() { + if (this.dataFormat === 'NHWC') { + return `coords[3]`; + } + else { + return `coords[1]`; + } + } + getOutputDepthSize() { + if (this.dataFormat === 'NHWC') { + return this.outputShape[3]; + } + else { + return this.outputShape[1]; + } + } + getInputSamplingString() { + if (this.dataFormat === 'NHWC') { + return `getX(b, in_h, in_w, in_d)`; + } + else { + return `getX(b, in_d, in_h, in_w)`; + } + } +} +//# sourceMappingURL=depth_to_space_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js ***! + \**********************************************************************/ +/*! exports provided: DiagProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DiagProgram", function() { return DiagProgram; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class DiagProgram { + constructor(size) { + this.variableNames = ['X']; + this.outputShape = [size, size]; + this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0; + setOutput(val); + } + `; + } +} +//# sourceMappingURL=diag_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js ***! + \******************************************************************************/ +/*! exports provided: EncodeFloatProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncodeFloatProgram", function() { return EncodeFloatProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class EncodeFloatProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.outTexUsage = _tex_util__WEBPACK_IMPORTED_MODULE_2__["TextureUsage"].DOWNLOAD; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + this.outputShape = outputShape; + this.userCode = ` + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__["ENCODE_FLOAT_SNIPPET"]} + + void main() { + float x = getAAtOutCoords(); + ${glsl.output} = encode_float(x); + } + `; + } +} +//# sourceMappingURL=encode_float_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js ***! + \*************************************************************************************/ +/*! exports provided: EncodeFloatPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncodeFloatPackedProgram", function() { return EncodeFloatPackedProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class EncodeFloatPackedProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = false; + this.outTexUsage = _tex_util__WEBPACK_IMPORTED_MODULE_2__["TextureUsage"].DOWNLOAD; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + this.outputShape = outputShape; + this.userCode = ` + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__["ENCODE_FLOAT_SNIPPET"]} + + void main() { + ivec3 coords = getOutputCoords(); + float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z)); + ${glsl.output} = encode_float(x); + } + `; + } +} +//# sourceMappingURL=encode_float_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: EncodeMatrixProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncodeMatrixProgram", function() { return EncodeMatrixProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class EncodeMatrixProgram { + constructor(outputShape, texShape, inputIsUnsignedByte = false) { + this.variableNames = ['A']; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + const [height, width] = texShape; + this.outputShape = outputShape; + let output = `result`; + if (inputIsUnsignedByte) { + output = `floor(result * 255. + 0.5)`; + } + this.userCode = ` + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__["getFlatIndexFrom3D"](outputShape)} + + void main() { + ivec3 coords = getOutputCoords(); + + int flatIndex = getFlatIndex(coords); + int offset = imod(flatIndex, 4); + + flatIndex = idiv(flatIndex, 4, 1.); + + int r = flatIndex / ${width}; + int c = imod(flatIndex, ${width}); + vec2 uv = (vec2(c, r) + halfCR) / vec2(${width}.0, ${height}.0); + vec4 values = ${glsl.texture2D}(A, uv); + + float result; + + if(offset == 0) { + result = values[0]; + } else if(offset == 1) { + result = values[1]; + } else if(offset == 2) { + result = values[2]; + } else { + result = values[3]; + } + + ${glsl.output} = vec4(${output}, 0., 0., 0.); + } + `; + } +} +//# sourceMappingURL=encode_matrix_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js ***! + \**************************************************************************************/ +/*! exports provided: EncodeMatrixPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EncodeMatrixPackedProgram", function() { return EncodeMatrixPackedProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +/* +This is how the shader encodes a tensor with shape = [2, 3, 5] +(indices are [batch, row, col]). + +000|001 002|003 004|xxx 020|021 022|023 024|xxx +------- ------- ------- ------- ------- ------- +010|011 012|013 014|xxx xxx|xxx xxx|xxx xxx|xxx + +100|101 102|103 104|xxx 120|121 122|123 124|xxx +------- ------- ------- ------- ------- ------- +110|111 112|113 114|xxx xxx|xxx xxx|xxx xxx|xxx + +Single texels contain only values from the same batch, and from adjacent rows +and columns. + */ +class EncodeMatrixPackedProgram { + constructor(outputShape, texShape, inputIsUnsignedByte = false) { + this.variableNames = ['A']; + this.packedInputs = false; + this.packedOutput = true; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + const [height, width] = texShape; + this.outputShape = outputShape; + let mainLoop = ''; + let output = 'result'; + if (inputIsUnsignedByte) { + output = 'floor(result * 255. + 0.5)'; + } + for (let row = 0; row <= 1; row++) { + for (let col = 0; col <= 1; col++) { + const channel = row * 2 + col; + mainLoop += ` + localCoords = coords; + if(localCoords[2] + ${col} < ${outputShape[2]}) { + localCoords[2] += ${col}; + if(localCoords[1] + ${row} < ${outputShape[1]}) { + localCoords[1] += ${row}; + + flatIndex = getFlatIndex(localCoords); + offset = imod(flatIndex, 4); + + flatIndex = idiv(flatIndex, 4, 1.); + + r = flatIndex / ${width}; + c = imod(flatIndex, ${width}); + uv = (vec2(c, r) + halfCR) / vec2(${width}.0, ${height}.0); + values = ${glsl.texture2D}(A, uv); + + if(offset == 0) { + result[${channel}] = values[0]; + } else if(offset == 1) { + result[${channel}] = values[1]; + } else if(offset == 2) { + result[${channel}] = values[2]; + } else { + result[${channel}] = values[3]; + } + } + } + `; + } + } + this.userCode = ` + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_1__["getFlatIndexFrom3D"](outputShape)} + + void main() { + ivec3 coords = getOutputCoords(); + + vec4 result = vec4(0.); + int flatIndex, r, c, offset; + ivec3 localCoords; + vec2 uv; + vec4 values; + + ${mainLoop} + + ${glsl.output} = ${output}; + } + `; + } +} +//# sourceMappingURL=encode_matrix_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js ***! + \*********************************************************************/ +/*! exports provided: FFTProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FFTProgram", function() { return FFTProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class FFTProgram { + constructor(component, inputShape, inverse) { + this.variableNames = ['real', 'imag']; + const innerDim = inputShape[1]; + this.outputShape = inputShape; + const exponentMultiplierSnippet = inverse ? `2.0 * ${Math.PI}` : `-2.0 * ${Math.PI}`; + const resultDenominator = inverse ? `${innerDim}.0` : '1.0'; + let opString; + if (component === 'real') { + opString = 'return real * expR - imag * expI;'; + } + else if (component === 'imag') { + opString = 'return real * expI + imag * expR;'; + } + else { + throw new Error(`FFT component must be either "real" or "imag", got ${component}.`); + } + this.userCode = ` + const float exponentMultiplier = ${exponentMultiplierSnippet}; + + float unaryOpComplex(float real, float expR, float imag, float expI) { + ${opString} + } + + float mulMatDFT(int batch, int index) { + float indexRatio = float(index) / float(${innerDim}); + float exponentMultiplierTimesIndexRatio = + exponentMultiplier * indexRatio; + + float result = 0.0; + + for (int i = 0; i < ${innerDim}; i++) { + // x = (-2|2 * PI / N) * index * i; + float x = exponentMultiplierTimesIndexRatio * float(i); + float expR = cos(x); + float expI = sin(x); + float real = getReal(batch, i); + float imag = getImag(batch, i); + + result += + unaryOpComplex(real, expR, imag, expI) / ${resultDenominator}; + } + + return result; + } + + void main() { + ivec2 coords = getOutputCoords(); + setOutput(mulMatDFT(coords[0], coords[1])); + } + `; + } +} +//# sourceMappingURL=fft_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js ***! + \**********************************************************************/ +/*! exports provided: FillProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FillProgram", function() { return FillProgram; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class FillProgram { + constructor(shape, value) { + this.outputShape = []; + this.variableNames = ['x']; + this.outputShape = shape; + this.userCode = ` + uniform float value; + void main() { + // Input can be obtained from uniform value. + setOutput(value); + } + `; + } + getCustomSetupFunc(value) { + return (gpgpu, webGLProgram) => { + if (this.valueLoc == null) { + this.valueLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'value'); + } + gpgpu.gl.uniform1f(this.valueLoc, value); + }; + } +} +//# sourceMappingURL=fill_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js ***! + \*************************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const ENV = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])(); +/** + * This file contains WebGL-specific flag registrations. + */ +/** + * True if WebGL is supported. + */ +ENV.registerFlag('HAS_WEBGL', () => ENV.getNumber('WEBGL_VERSION') > 0); +/** 0: No WebGL, 1: WebGL 1.0, 2: WebGL 2.0. */ +ENV.registerFlag('WEBGL_VERSION', () => { + if (Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["isWebGLVersionEnabled"])(2)) { + return 2; + } + else if (Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["isWebGLVersionEnabled"])(1)) { + return 1; + } + return 0; +}); +/** Whether to check for numerical representation problems. */ +ENV.registerFlag('WEBGL_CHECK_NUMERICAL_PROBLEMS', () => false); +ENV.registerFlag('WEBGL_BUFFER_SUPPORTED', () => ENV.get('WEBGL_VERSION') === 2); +/** Whether the WebGL backend will sometimes forward ops to the CPU. */ +ENV.registerFlag('WEBGL_CPU_FORWARD', () => true); +/** Whether the WebGL backend will always use f16 textures for rendering. */ +ENV.registerFlag('WEBGL_FORCE_F16_TEXTURES', () => false); +/** Whether to turn all packing related flags on. */ +ENV.registerFlag('WEBGL_PACK', () => ENV.getBool('HAS_WEBGL')); +/** Whether we will pack the batchnormalization op. */ +ENV.registerFlag('WEBGL_PACK_NORMALIZATION', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will pack the clip op. */ +ENV.registerFlag('WEBGL_PACK_CLIP', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will pack the depthwise conv op. */ +// TODO: https://github.com/tensorflow/tfjs/issues/1679 +ENV.registerFlag('WEBGL_PACK_DEPTHWISECONV', () => false); +/** Whether we will pack binary ops. */ +ENV.registerFlag('WEBGL_PACK_BINARY_OPERATIONS', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will pack unary ops. */ +ENV.registerFlag('WEBGL_PACK_UNARY_OPERATIONS', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will pack array ops. */ +ENV.registerFlag('WEBGL_PACK_ARRAY_OPERATIONS', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will pack image ops. */ +ENV.registerFlag('WEBGL_PACK_IMAGE_OPERATIONS', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will pack reduce ops. */ +ENV.registerFlag('WEBGL_PACK_REDUCE', () => ENV.getBool('WEBGL_PACK')); +/** Whether packed WebGL kernels lazily unpack their outputs. */ +ENV.registerFlag('WEBGL_LAZILY_UNPACK', () => ENV.getBool('WEBGL_PACK')); +/** Whether we will use the im2col algorithm to speed up convolutions. */ +ENV.registerFlag('WEBGL_CONV_IM2COL', () => ENV.getBool('WEBGL_PACK')); +/** The maximum texture dimension. */ +ENV.registerFlag('WEBGL_MAX_TEXTURE_SIZE', () => Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLMaxTextureSize"])(ENV.getNumber('WEBGL_VERSION'))); +/** The maximum texture dimension. */ +ENV.registerFlag('WEBGL_MAX_TEXTURES_IN_SHADER', () => Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getMaxTexturesInShader"])(ENV.getNumber('WEBGL_VERSION'))); +/** + * The disjoint_query_timer extension version. + * 0: disabled, 1: EXT_disjoint_timer_query, 2: + * EXT_disjoint_timer_query_webgl2. + * In Firefox with WebGL 2.0, + * EXT_disjoint_timer_query_webgl2 is not available, so we must use the + * WebGL 1.0 extension. + */ +ENV.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION', () => { + const webGLVersion = ENV.getNumber('WEBGL_VERSION'); + if (webGLVersion === 0) { + return 0; + } + return Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLDisjointQueryTimerVersion"])(webGLVersion); +}); +/** + * Whether the timer object from the disjoint_query_timer extension gives + * timing information that is reliable. + */ +ENV.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE', () => ENV.getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0 && + !_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["device_util"].isMobile()); +/** + * Whether the device is physically capable of rendering to float32 textures. + */ +ENV.registerFlag('WEBGL_RENDER_FLOAT32_CAPABLE', () => Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["isCapableOfRenderingToFloatTexture"])(ENV.getNumber('WEBGL_VERSION'))); +/** + * Whether rendering to float32 textures is enabled. If disabled, renders to + * float16 textures. + */ +ENV.registerFlag('WEBGL_RENDER_FLOAT32_ENABLED', () => { + return ENV.getBool('WEBGL_FORCE_F16_TEXTURES') ? + false : + ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE'); +}); +/** + * Whether downloading float textures is enabled (16 or 32 bit). If disabled, + * uses IEEE 754 encoding of the float32 values to 4 uint8 when downloading. + */ +ENV.registerFlag('WEBGL_DOWNLOAD_FLOAT_ENABLED', () => Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["isDownloadFloatTextureEnabled"])(ENV.getNumber('WEBGL_VERSION'))); +/** Whether the fence API is available. */ +ENV.registerFlag('WEBGL_FENCE_API_ENABLED', () => Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["isWebGLFenceEnabled"])(ENV.getNumber('WEBGL_VERSION'))); +/** + * Tensors with size <= than this will be uploaded as uniforms, not textures. + */ +ENV.registerFlag('WEBGL_SIZE_UPLOAD_UNIFORM', () => { + // Use uniform uploads only when 32bit floats are supported. In + // 16bit + // environments there are problems with comparing a 16bit texture value + // with a 32bit uniform value. + const useUniforms = ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED'); + return useUniforms ? 4 : 0; +}); +/** + * If the total number of bytes allocated on the GPU is greater than this + * number, we will aggressively delete textures upon disposal with + * gl.deleteMatrixTexture, rather than making them available for reuse. + * + * Default value -1 indicates that we will never aggressively delete textures. + */ +ENV.registerFlag('WEBGL_DELETE_TEXTURE_THRESHOLD', () => { + return -1; +}, threshold => { + if (threshold < 0 && threshold !== -1) { + throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never ` + + `delete) or at least 0, but got ${threshold}.`); + } +}); +//# sourceMappingURL=flags_webgl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: FlipLeftRightProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FlipLeftRightProgram", function() { return FlipLeftRightProgram; }); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class FlipLeftRightProgram { + constructor(imageShape) { + this.variableNames = ['Image']; + this.outputShape = []; + const imageWidth = imageShape[2]; + this.outputShape = imageShape; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + + int coordX = ${imageWidth} - x; + float outputValue; + if(coordX >= 0 && coordX < ${imageWidth}) { + outputValue = getImage(coords[0], coords[1], coordX, coords[3]); + } else { + outputValue = getImage(coords[0], coords[1], coords[2], coords[3]); + } + setOutput(outputValue); + } + `; + } +} +//# sourceMappingURL=flip_left_right_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js ***! + \************************************************************************/ +/*! exports provided: GatherProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GatherProgram", function() { return GatherProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class GatherProgram { + constructor(aShape, indicesLength, axis) { + this.variableNames = ['A', 'indices']; + const outputShape = aShape.slice(); + outputShape[axis] = indicesLength; + this.outputShape = outputShape; + this.rank = outputShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(this.rank); + const sourceCoords = getSourceCoords(aShape, axis); + this.userCode = ` + void main() { + ${dtype} resRC = getOutputCoords(); + setOutput(getA(${sourceCoords})); + } + `; + } +} +function getSourceCoords(aShape, axis) { + const rank = aShape.length; + if (rank > 4) { + throw Error(`Gather for rank ${rank} is not yet supported`); + } + if (rank === 1) { + return `int(getIndices(resRC))`; + } + const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w']; + const sourceCoords = []; + for (let i = 0; i < aShape.length; i++) { + if (i === axis) { + sourceCoords.push(`int(getIndices(${currentCoords[i]}))`); + } + else { + sourceCoords.push(`${currentCoords[i]}`); + } + } + return sourceCoords.join(); +} +//# sourceMappingURL=gather_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js ***! + \***************************************************************************/ +/*! exports provided: GatherNDProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GatherNDProgram", function() { return GatherNDProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); + +class GatherNDProgram { + constructor(sliceDim, strides, shape) { + this.sliceDim = sliceDim; + this.strides = strides; + this.variableNames = ['x', 'indices']; + this.outputShape = shape; + const stridesType = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(strides.length); + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(shape.length); + const strideString = this.sliceDim > 1 ? 'strides[j]' : 'strides'; + this.userCode = ` + ${stridesType} strides = ${stridesType}(${this.strides}); + void main() { + ${dtype} coords = getOutputCoords(); + int flattenIndex = 0; + for (int j = 0; j < ${this.sliceDim}; j++) { + int index = round(getIndices(coords[0], j)); + flattenIndex += index * ${strideString}; + } + setOutput(getX(flattenIndex, coords[1])); + } + `; + } +} +//# sourceMappingURL=gather_nd_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js ***! + \**************************************************************************/ +/*! exports provided: getGlslDifferences */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGlslDifferences", function() { return getGlslDifferences; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function getGlslDifferences() { + let version; + let attribute; + let varyingVs; + let varyingFs; + let texture2D; + let output; + let defineOutput; + let defineSpecialNaN; + let defineSpecialInf; + let defineRound; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION') === 2) { + version = '#version 300 es'; + attribute = 'in'; + varyingVs = 'out'; + varyingFs = 'in'; + texture2D = 'texture'; + output = 'outputColor'; + defineOutput = 'out vec4 outputColor;'; + // Use custom isnan definition to work across differences between + // implementations on various platforms. While this should happen in ANGLE + // we still see differences between android and windows (on chrome) when + // using isnan directly. + defineSpecialNaN = ` + bool isnan_custom(float val) { + return (val > 0.0 || val < 0.0) ? false : val != 0.0; + } + + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan_custom(val.x), + isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w)); + } + + #define isnan(value) isnan_custom(value) + `; + // In webgl 2 we do not need to specify a custom isinf so there is no + // need for a special INFINITY constant. + defineSpecialInf = ``; + defineRound = ` + #define round(value) newRound(value) + int newRound(float value) { + return int(floor(value + 0.5)); + } + + ivec4 newRound(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `; + } + else { + version = ''; + attribute = 'attribute'; + varyingVs = 'varying'; + varyingFs = 'varying'; + texture2D = 'texture2D'; + output = 'gl_FragColor'; + defineOutput = ''; + // WebGL1 has no built in isnan so we define one here. + defineSpecialNaN = ` + #define isnan(value) isnan_custom(value) + bool isnan_custom(float val) { + return (val > 0. || val < 1. || val == 0.) ? false : true; + } + bvec4 isnan_custom(vec4 val) { + return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w)); + } + `; + defineSpecialInf = ` + uniform float INFINITY; + + bool isinf(float val) { + return abs(val) == INFINITY; + } + bvec4 isinf(vec4 val) { + return equal(abs(val), vec4(INFINITY)); + } + `; + defineRound = ` + int round(float value) { + return int(floor(value + 0.5)); + } + + ivec4 round(vec4 value) { + return ivec4(floor(value + vec4(0.5))); + } + `; + } + return { + version, + attribute, + varyingVs, + varyingFs, + texture2D, + output, + defineOutput, + defineSpecialNaN, + defineSpecialInf, + defineRound + }; +} +//# sourceMappingURL=glsl_version.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js ***! + \***************************************************************************/ +/*! exports provided: GPGPUContext, linearSearchLastTrue */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GPGPUContext", function() { return GPGPUContext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linearSearchLastTrue", function() { return linearSearchLastTrue; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _canvas_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./canvas_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"); +/* harmony import */ var _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gpgpu_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +class GPGPUContext { + constructor(gl) { + this.outputTexture = null; + this.program = null; + this.disposed = false; + this.vertexAttrsAreBound = false; + this.itemsToPoll = []; + const glVersion = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION'); + if (gl != null) { + this.gl = gl; + Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["setWebGLContext"])(glVersion, gl); + } + else { + this.gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(glVersion); + } + // WebGL 2.0 enables texture floats without an extension. + let COLOR_BUFFER_FLOAT = 'WEBGL_color_buffer_float'; + const COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float'; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION') === 1) { + const TEXTURE_FLOAT = 'OES_texture_float'; + const TEXTURE_HALF_FLOAT = 'OES_texture_half_float'; + this.textureFloatExtension = + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["getExtensionOrThrow"](this.gl, TEXTURE_FLOAT); + if (_webgl_util__WEBPACK_IMPORTED_MODULE_4__["hasExtension"](this.gl, TEXTURE_HALF_FLOAT)) { + this.textureHalfFloatExtension = + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["getExtensionOrThrow"](this.gl, TEXTURE_HALF_FLOAT); + } + else if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().get('WEBGL_FORCE_F16_TEXTURES')) { + throw new Error('GL context does not support half float textures, yet the ' + + 'environment flag WEBGL_FORCE_F16_TEXTURES is set to true.'); + } + this.colorBufferFloatExtension = this.gl.getExtension(COLOR_BUFFER_FLOAT); + if (_webgl_util__WEBPACK_IMPORTED_MODULE_4__["hasExtension"](this.gl, COLOR_BUFFER_HALF_FLOAT)) { + this.colorBufferHalfFloatExtension = + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["getExtensionOrThrow"](this.gl, COLOR_BUFFER_HALF_FLOAT); + } + else if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().get('WEBGL_FORCE_F16_TEXTURES')) { + throw new Error('GL context does not support color renderable half floats, yet ' + + 'the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.'); + } + } + else { + COLOR_BUFFER_FLOAT = 'EXT_color_buffer_float'; + if (_webgl_util__WEBPACK_IMPORTED_MODULE_4__["hasExtension"](this.gl, COLOR_BUFFER_FLOAT)) { + this.colorBufferFloatExtension = + this.gl.getExtension(COLOR_BUFFER_FLOAT); + } + else if (_webgl_util__WEBPACK_IMPORTED_MODULE_4__["hasExtension"](this.gl, COLOR_BUFFER_HALF_FLOAT)) { + this.colorBufferHalfFloatExtension = + this.gl.getExtension(COLOR_BUFFER_HALF_FLOAT); + } + else { + throw new Error('GL context does not support color renderable floats'); + } + } + this.vertexBuffer = _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createVertexBuffer"](this.gl); + this.indexBuffer = _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createIndexBuffer"](this.gl); + this.framebuffer = _webgl_util__WEBPACK_IMPORTED_MODULE_4__["createFramebuffer"](this.gl); + this.textureConfig = + _tex_util__WEBPACK_IMPORTED_MODULE_3__["getTextureConfig"](this.gl, this.textureHalfFloatExtension); + } + get debug() { + return Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('DEBUG'); + } + dispose() { + if (this.disposed) { + return; + } + if (this.program != null) { + console.warn('Disposing a GPGPUContext that still has a bound WebGLProgram.' + + ' This is probably a resource leak, delete the program with ' + + 'GPGPUContext.deleteProgram before disposing.'); + } + if (this.outputTexture != null) { + console.warn('Disposing a GPGPUContext that still has a bound output matrix ' + + 'texture. This is probably a resource leak, delete the output ' + + 'matrix texture with GPGPUContext.deleteMatrixTexture before ' + + 'disposing.'); + } + const gl = this.gl; + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.finish()); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, null)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.deleteFramebuffer(this.framebuffer)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, null)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.deleteBuffer(this.indexBuffer)); + this.disposed = true; + } + createFloat32MatrixTexture(rows, columns) { + this.throwIfDisposed(); + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createFloat32MatrixTexture"](this.gl, rows, columns, this.textureConfig); + } + createFloat16MatrixTexture(rows, columns) { + this.throwIfDisposed(); + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createFloat16MatrixTexture"](this.gl, rows, columns, this.textureConfig); + } + createUnsignedBytesMatrixTexture(rows, columns) { + this.throwIfDisposed(); + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createUnsignedBytesMatrixTexture"](this.gl, rows, columns, this.textureConfig); + } + uploadPixelDataToTexture(texture, pixels) { + this.throwIfDisposed(); + _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["uploadPixelDataToTexture"](this.gl, texture, pixels); + } + uploadDenseMatrixToTexture(texture, width, height, data) { + this.throwIfDisposed(); + _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["uploadDenseMatrixToTexture"](this.gl, texture, width, height, data, this.textureConfig); + } + createFloat16PackedMatrixTexture(rows, columns) { + this.throwIfDisposed(); + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createFloat16PackedMatrixTexture"](this.gl, rows, columns, this.textureConfig); + } + createPackedMatrixTexture(rows, columns) { + this.throwIfDisposed(); + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createPackedMatrixTexture"](this.gl, rows, columns, this.textureConfig); + } + deleteMatrixTexture(texture) { + this.throwIfDisposed(); + if (this.outputTexture === texture) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["unbindColorTextureFromFramebuffer"](this.gl, this.framebuffer); + this.outputTexture = null; + } + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](this.gl, () => this.gl.deleteTexture(texture)); + } + downloadByteEncodedFloatMatrixFromOutputTexture(texture, rows, columns) { + return this.downloadMatrixDriver(texture, () => _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["downloadByteEncodedFloatMatrixFromOutputTexture"](this.gl, rows, columns, this.textureConfig)); + } + downloadPackedMatrixFromBuffer(buffer, batch, rows, columns, physicalRows, physicalCols) { + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["downloadPackedMatrixFromBuffer"](this.gl, buffer, batch, rows, columns, physicalRows, physicalCols, this.textureConfig); + } + downloadFloat32MatrixFromBuffer(buffer, size) { + return _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["downloadFloat32MatrixFromBuffer"](this.gl, buffer, size); + } + createBufferFromTexture(texture, rows, columns) { + this.bindTextureToFrameBuffer(texture); + const result = _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createBufferFromOutputTexture"](this.gl, rows, columns, this.textureConfig); + this.unbindTextureToFrameBuffer(); + return result; + } + createAndWaitForFence() { + const fenceContext = this.createFence(this.gl); + return this.pollFence(fenceContext); + } + createFence(gl) { + let query; + let isFencePassed; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_FENCE_API_ENABLED')) { + const gl2 = gl; + const sync = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0); + gl.flush(); + isFencePassed = () => { + const status = gl2.clientWaitSync(sync, 0, 0); + return status === gl2.ALREADY_SIGNALED || + status === gl2.CONDITION_SATISFIED; + }; + query = sync; + } + else if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) { + query = this.beginQuery(); + this.endQuery(); + isFencePassed = () => this.isQueryAvailable(query, Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION')); + } + else { + // If we have no way to fence, return true immediately. This will fire in + // WebGL 1.0 when there is no disjoint query timer. In this case, because + // the fence passes immediately, we'll immediately ask for a download of + // the texture, which will cause the UI thread to hang. + isFencePassed = () => true; + } + return { query, isFencePassed }; + } + downloadMatrixFromPackedTexture(texture, physicalRows, physicalCols) { + return this.downloadMatrixDriver(texture, () => _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["downloadMatrixFromPackedOutputTexture"](this.gl, physicalRows, physicalCols)); + } + createProgram(fragmentShaderSource) { + this.throwIfDisposed(); + const gl = this.gl; + const fragmentShader = _webgl_util__WEBPACK_IMPORTED_MODULE_4__["createFragmentShader"](gl, fragmentShaderSource); + const vertexShader = _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["createVertexShader"](gl); + const program = _webgl_util__WEBPACK_IMPORTED_MODULE_4__["createProgram"](gl); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.attachShader(program, vertexShader)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.attachShader(program, fragmentShader)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["linkProgram"](gl, program); + if (this.debug) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateProgram"](gl, program); + } + if (!this.vertexAttrsAreBound) { + this.setProgram(program); + this.vertexAttrsAreBound = _gpgpu_util__WEBPACK_IMPORTED_MODULE_2__["bindVertexProgramAttributeStreams"](gl, this.program, this.vertexBuffer); + } + return program; + } + deleteProgram(program) { + this.throwIfDisposed(); + if (program === this.program) { + this.program = null; + } + if (program != null) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](this.gl, () => this.gl.deleteProgram(program)); + } + } + setProgram(program) { + this.throwIfDisposed(); + this.program = program; + if ((this.program != null) && this.debug) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateProgram"](this.gl, this.program); + } + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](this.gl, () => this.gl.useProgram(program)); + } + getUniformLocation(program, uniformName, shouldThrow = true) { + this.throwIfDisposed(); + if (shouldThrow) { + return _webgl_util__WEBPACK_IMPORTED_MODULE_4__["getProgramUniformLocationOrThrow"](this.gl, program, uniformName); + } + else { + return _webgl_util__WEBPACK_IMPORTED_MODULE_4__["getProgramUniformLocation"](this.gl, program, uniformName); + } + } + getAttributeLocation(program, attribute) { + this.throwIfDisposed(); + return _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](this.gl, () => this.gl.getAttribLocation(program, attribute)); + } + getUniformLocationNoThrow(program, uniformName) { + this.throwIfDisposed(); + return this.gl.getUniformLocation(program, uniformName); + } + setInputMatrixTexture(inputMatrixTexture, uniformLocation, textureUnit) { + this.throwIfDisposed(); + this.throwIfNoProgram(); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["bindTextureToProgramUniformSampler"](this.gl, inputMatrixTexture, uniformLocation, textureUnit); + } + setOutputMatrixTexture(outputMatrixTexture, rows, columns) { + this.setOutputMatrixTextureDriver(outputMatrixTexture, columns, rows); + } + setOutputPackedMatrixTexture(outputPackedMatrixTexture, rows, columns) { + this.throwIfDisposed(); + const [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_3__["getPackedMatrixTextureShapeWidthHeight"](rows, columns); + this.setOutputMatrixTextureDriver(outputPackedMatrixTexture, width, height); + } + setOutputMatrixWriteRegion(startRow, numRows, startColumn, numColumns) { + this.setOutputMatrixWriteRegionDriver(startColumn, startRow, numColumns, numRows); + } + setOutputPackedMatrixWriteRegion(startRow, numRows, startColumn, numColumns) { + throw new Error('setOutputPackedMatrixWriteRegion not implemented.'); + } + debugValidate() { + if (this.program != null) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateProgram"](this.gl, this.program); + } + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateFramebuffer"](this.gl); + } + executeProgram() { + this.throwIfDisposed(); + this.throwIfNoProgram(); + const gl = this.gl; + if (this.debug) { + this.debugValidate(); + } + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)); + } + blockUntilAllProgramsCompleted() { + this.throwIfDisposed(); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](this.gl, () => this.gl.finish()); + } + getQueryTimerExtension() { + if (this.disjointQueryTimerExtension == null) { + this.disjointQueryTimerExtension = + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["getExtensionOrThrow"](this.gl, Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2 ? + 'EXT_disjoint_timer_query_webgl2' : + 'EXT_disjoint_timer_query'); + } + return this.disjointQueryTimerExtension; + } + getQueryTimerExtensionWebGL2() { + return this.getQueryTimerExtension(); + } + getQueryTimerExtensionWebGL1() { + return this.getQueryTimerExtension(); + } + beginQuery() { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) { + const gl2 = this.gl; + const ext = this.getQueryTimerExtensionWebGL2(); + const query = gl2.createQuery(); + gl2.beginQuery(ext.TIME_ELAPSED_EXT, query); + return query; + } + const ext = this.getQueryTimerExtensionWebGL1(); + const query = ext.createQueryEXT(); + ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, query); + return query; + } + endQuery() { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) { + const gl2 = this.gl; + const ext = this.getQueryTimerExtensionWebGL2(); + gl2.endQuery(ext.TIME_ELAPSED_EXT); + return; + } + const ext = this.getQueryTimerExtensionWebGL1(); + ext.endQueryEXT(ext.TIME_ELAPSED_EXT); + } + async waitForQueryAndGetTime(query) { + await _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].repeatedTry(() => this.disposed || // while testing contexts are created / disposed + // in rapid succession, so without this check we + // may poll for the query timer indefinitely + this.isQueryAvailable(query, Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'))); + return this.getQueryTime(query, Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION')); + } + getQueryTime(query, queryTimerVersion) { + if (queryTimerVersion === 0) { + return null; + } + if (queryTimerVersion === 2) { + const gl2 = this.gl; + const timeElapsedNanos = gl2.getQueryParameter(query, gl2.QUERY_RESULT); + // Return milliseconds. + return timeElapsedNanos / 1000000; + } + else { + const ext = this.getQueryTimerExtensionWebGL1(); + const timeElapsedNanos = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_EXT); + // Return milliseconds. + return timeElapsedNanos / 1000000; + } + } + isQueryAvailable(query, queryTimerVersion) { + if (queryTimerVersion === 0) { + return true; + } + if (queryTimerVersion === 2) { + const gl2 = this.gl; + const ext = this.getQueryTimerExtensionWebGL2(); + const available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE); + if (this.disjoint == null) { + this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT); + } + return available && !this.disjoint; + } + else { + const ext = this.getQueryTimerExtensionWebGL1(); + const available = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_AVAILABLE_EXT); + if (this.disjoint == null) { + this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT); + } + return available && !this.disjoint; + } + } + pollFence(fenceContext) { + return new Promise(resolve => { + this.addItemToPoll(() => fenceContext.isFencePassed(), () => resolve()); + }); + } + pollItems() { + // Find the last query that has finished. + const index = linearSearchLastTrue(this.itemsToPoll.map(x => x.isDoneFn)); + for (let i = 0; i <= index; ++i) { + const { resolveFn } = this.itemsToPoll[i]; + resolveFn(); + } + this.itemsToPoll = this.itemsToPoll.slice(index + 1); + } + addItemToPoll(isDoneFn, resolveFn) { + this.itemsToPoll.push({ isDoneFn, resolveFn }); + if (this.itemsToPoll.length > 1) { + // We already have a running loop that polls. + return; + } + // Start a new loop that polls. + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].repeatedTry(() => { + this.pollItems(); + // End the loop if no more items to poll. + return this.itemsToPoll.length === 0; + }); + } + bindTextureToFrameBuffer(texture) { + this.throwIfDisposed(); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["bindColorTextureToFramebuffer"](this.gl, texture, this.framebuffer); + if (this.debug) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateFramebuffer"](this.gl); + } + } + unbindTextureToFrameBuffer() { + if (this.outputTexture != null) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["bindColorTextureToFramebuffer"](this.gl, this.outputTexture, this.framebuffer); + if (this.debug) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateFramebuffer"](this.gl); + } + } + else { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["unbindColorTextureFromFramebuffer"](this.gl, this.framebuffer); + } + } + downloadMatrixDriver(texture, downloadAndDecode) { + this.bindTextureToFrameBuffer(texture); + const result = downloadAndDecode(); + this.unbindTextureToFrameBuffer(); + return result; + } + setOutputMatrixTextureDriver(outputMatrixTextureMaybePacked, width, height) { + this.throwIfDisposed(); + const gl = this.gl; + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["bindColorTextureToFramebuffer"](gl, outputMatrixTextureMaybePacked, this.framebuffer); + if (this.debug) { + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["validateFramebuffer"](gl); + } + this.outputTexture = outputMatrixTextureMaybePacked; + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.viewport(0, 0, width, height)); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](gl, () => gl.scissor(0, 0, width, height)); + } + setOutputMatrixWriteRegionDriver(x, y, width, height) { + this.throwIfDisposed(); + _webgl_util__WEBPACK_IMPORTED_MODULE_4__["callAndCheck"](this.gl, () => this.gl.scissor(x, y, width, height)); + } + throwIfDisposed() { + if (this.disposed) { + throw new Error('Attempted to use disposed GPGPUContext.'); + } + } + throwIfNoProgram() { + if (this.program == null) { + throw new Error('No GPU program is currently set.'); + } + } +} +/** + * Finds the index of the last true element using linear search. + * Note: We can't do binary search because Chrome expects us to explicitly + * test all fences before download: + * https://github.com/tensorflow/tfjs/issues/1145 + */ +function linearSearchLastTrue(arr) { + let i = 0; + for (; i < arr.length; ++i) { + const isDone = arr[i](); + if (!isDone) { + break; + } + } + return i - 1; +} +//# sourceMappingURL=gpgpu_context.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js ***! + \************************************************************************/ +/*! exports provided: compileProgram, runProgram, makeShaderKey */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "compileProgram", function() { return compileProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runProgram", function() { return runProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeShaderKey", function() { return makeShaderKey; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function compileProgram(gpgpu, program, inputs, output) { + const userCode = program.userCode; + const inputInfos = inputs.map((input, i) => { + const shapeInfo = { + logicalShape: input.shape, + texShape: input.isUniform ? null : input.texData.texShape, + isUniform: input.isUniform, + isPacked: input.isUniform ? false : input.texData.isPacked, + flatOffset: null + }; + if (input.texData != null && input.texData.slice != null && + input.texData.slice.flatOffset > 0) { + shapeInfo.flatOffset = input.texData.slice.flatOffset; + } + return { name: program.variableNames[i], shapeInfo }; + }); + const inShapeInfos = inputInfos.map(x => x.shapeInfo); + const outShapeInfo = { + logicalShape: output.shape, + texShape: output.texData.texShape, + isUniform: false, + isPacked: output.texData.isPacked, + flatOffset: null + }; + const source = _shader_compiler__WEBPACK_IMPORTED_MODULE_1__["makeShader"](inputInfos, outShapeInfo, userCode, program.packedInputs); + const webGLProgram = gpgpu.createProgram(source); + // Add special uniforms (NAN, INFINITY) + let infLoc = null; + const nanLoc = gpgpu.getUniformLocation(webGLProgram, 'NAN', false); + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION') === 1) { + infLoc = gpgpu.getUniformLocation(webGLProgram, 'INFINITY', false); + } + // Add user-defined uniforms + const uniformLocations = {}; + for (let i = 0; i < program.variableNames.length; i++) { + const varName = program.variableNames[i]; + const shouldThrow = false; + uniformLocations[varName] = + gpgpu.getUniformLocation(webGLProgram, varName, shouldThrow); + uniformLocations[`offset${varName}`] = + gpgpu.getUniformLocation(webGLProgram, `offset${varName}`, shouldThrow); + } + return { + program, + source, + webGLProgram, + uniformLocations, + inShapeInfos, + outShapeInfo, + infLoc, + nanLoc, + }; +} +function validateBinaryAndProgram(shapeInfos, inputs) { + if (shapeInfos.length !== inputs.length) { + throw Error(`Binary was compiled with ${shapeInfos.length} inputs, but ` + + `was executed with ${inputs.length} inputs`); + } + shapeInfos.forEach((s, i) => { + const shapeA = s.logicalShape; + const input = inputs[i]; + const shapeB = input.shape; + if (!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(shapeA, shapeB)) { + throw Error(`Binary was compiled with different shapes than ` + + `the current args. Shapes ${shapeA} and ${shapeB} must match`); + } + // The input is uploaded as uniform. + if (s.isUniform && input.isUniform) { + return; + } + const texShapeA = s.texShape; + const texShapeB = input.isUniform ? null : input.texData.texShape; + if (!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(texShapeA, texShapeB)) { + throw Error(`Binary was compiled with different texture shapes than the` + + ` current args. Shape ${texShapeA} and ${texShapeB} must match`); + } + }); +} +function runProgram(gpgpu, binary, inputs, output, customSetup) { + validateBinaryAndProgram(binary.inShapeInfos, inputs); + validateBinaryAndProgram([binary.outShapeInfo], [output]); + const outTex = output.texData.texture; + const outTexShape = output.texData.texShape; + if (output.texData.isPacked) { + gpgpu.setOutputPackedMatrixTexture(outTex, outTexShape[0], outTexShape[1]); + } + else { + gpgpu.setOutputMatrixTexture(outTex, outTexShape[0], outTexShape[1]); + } + gpgpu.setProgram(binary.webGLProgram); + // Set special uniforms (NAN, INFINITY) + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION') === 1) { + if (binary.infLoc !== null) { + gpgpu.gl.uniform1f(binary.infLoc, Infinity); + } + } + if (binary.nanLoc !== null) { + gpgpu.gl.uniform1f(binary.nanLoc, NaN); + } + // Set user-defined inputs + inputs.forEach((input, i) => { + const varName = binary.program.variableNames[i]; + const varLoc = binary.uniformLocations[varName]; + const varOffsetLoc = binary.uniformLocations[`offset${varName}`]; + if (varLoc == null) { + // The compiler inferred that this variable is not used in this shader. + return; + } + if (input.isUniform) { + // Upload the values of the tensor as uniform. + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(input.shape) < 2) { + gpgpu.gl.uniform1f(varLoc, input.uniformValues[0]); + } + else { + let vals = input.uniformValues; + if (!(vals instanceof Float32Array)) { + vals = new Float32Array(vals); + } + gpgpu.gl.uniform1fv(varLoc, vals); + } + return; + } + // If the input was sliced, upload the flat offset index. + if (input.texData.slice != null && varOffsetLoc != null) { + gpgpu.gl.uniform1i(varOffsetLoc, input.texData.slice.flatOffset); + } + gpgpu.setInputMatrixTexture(input.texData.texture, varLoc, i); + }); + if (customSetup != null) { + customSetup(gpgpu, binary.webGLProgram); + } + gpgpu.executeProgram(); +} +function makeShaderKey(program, inputs, output) { + let keyInputs = ''; + inputs.concat(output).forEach(x => { + const hasOffset = x.texData != null && x.texData.slice != null && + x.texData.slice.flatOffset > 0; + const texShape = x.isUniform ? 'uniform' : x.texData.texShape; + keyInputs += `${x.shape}_${texShape}_${hasOffset}`; + }); + const keyUserCode = program.userCode; + let key = program.constructor.name; + // Fast string concat. See https://jsperf.com/string-concatenation/14. + key += '_' + keyInputs + '_' + keyUserCode; + return key; +} +//# sourceMappingURL=gpgpu_math.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js ***! + \************************************************************************/ +/*! exports provided: createVertexShader, createVertexBuffer, createIndexBuffer, getInternalFormatForFloat32MatrixTexture, createFloat32MatrixTexture, getInternalFormatForFloat16MatrixTexture, createFloat16MatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture, createUnsignedBytesMatrixTexture, getInternalFormatForPackedMatrixTexture, createPackedMatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, createFloat16PackedMatrixTexture, bindVertexProgramAttributeStreams, uploadDenseMatrixToTexture, uploadPixelDataToTexture, createBufferFromOutputTexture, downloadFloat32MatrixFromBuffer, downloadByteEncodedFloatMatrixFromOutputTexture, downloadPackedMatrixFromBuffer, downloadMatrixFromPackedOutputTexture */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createVertexShader", function() { return createVertexShader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createVertexBuffer", function() { return createVertexBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createIndexBuffer", function() { return createIndexBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInternalFormatForFloat32MatrixTexture", function() { return getInternalFormatForFloat32MatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFloat32MatrixTexture", function() { return createFloat32MatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInternalFormatForFloat16MatrixTexture", function() { return getInternalFormatForFloat16MatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFloat16MatrixTexture", function() { return createFloat16MatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInternalFormatForUnsignedBytesMatrixTexture", function() { return getInternalFormatForUnsignedBytesMatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createUnsignedBytesMatrixTexture", function() { return createUnsignedBytesMatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInternalFormatForPackedMatrixTexture", function() { return getInternalFormatForPackedMatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPackedMatrixTexture", function() { return createPackedMatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInternalFormatForFloat16PackedMatrixTexture", function() { return getInternalFormatForFloat16PackedMatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFloat16PackedMatrixTexture", function() { return createFloat16PackedMatrixTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindVertexProgramAttributeStreams", function() { return bindVertexProgramAttributeStreams; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uploadDenseMatrixToTexture", function() { return uploadDenseMatrixToTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uploadPixelDataToTexture", function() { return uploadPixelDataToTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createBufferFromOutputTexture", function() { return createBufferFromOutputTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "downloadFloat32MatrixFromBuffer", function() { return downloadFloat32MatrixFromBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "downloadByteEncodedFloatMatrixFromOutputTexture", function() { return downloadByteEncodedFloatMatrixFromOutputTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "downloadPackedMatrixFromBuffer", function() { return downloadPackedMatrixFromBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "downloadMatrixFromPackedOutputTexture", function() { return downloadMatrixFromPackedOutputTexture; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function createVertexShader(gl) { + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + const vertexShaderSource = `${glsl.version} + precision highp float; + ${glsl.attribute} vec3 clipSpacePos; + ${glsl.attribute} vec2 uv; + ${glsl.varyingVs} vec2 resultUV; + + void main() { + gl_Position = vec4(clipSpacePos, 1); + resultUV = uv; + }`; + return _webgl_util__WEBPACK_IMPORTED_MODULE_2__["createVertexShader"](gl, vertexShaderSource); +} +function createVertexBuffer(gl) { + // [x y z u v] * [upper-left, lower-left, upper-right, lower-right] + const vertexArray = new Float32Array([-1, 1, 0, 0, 1, -1, -1, 0, 0, 0, 1, 1, 0, 1, 1, 1, -1, 0, 1, 0]); + return _webgl_util__WEBPACK_IMPORTED_MODULE_2__["createStaticVertexBuffer"](gl, vertexArray); +} +function createIndexBuffer(gl) { + // OpenGL (and WebGL) have "CCW == front" winding + const triangleVertexIndices = new Uint16Array([0, 1, 2, 2, 1, 3]); + return _webgl_util__WEBPACK_IMPORTED_MODULE_2__["createStaticIndexBuffer"](gl, triangleVertexIndices); +} +function createAndConfigureTexture(gl, width, height, internalFormat, textureFormat, textureType) { + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["validateTextureSize"](width, height); + const texture = _webgl_util__WEBPACK_IMPORTED_MODULE_2__["createTexture"](gl); + const tex2d = gl.TEXTURE_2D; + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindTexture(tex2d, texture)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texParameteri(tex2d, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texParameteri(tex2d, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texParameteri(tex2d, gl.TEXTURE_MIN_FILTER, gl.NEAREST)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texParameteri(tex2d, gl.TEXTURE_MAG_FILTER, gl.NEAREST)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texImage2D(tex2d, 0, internalFormat, width, height, 0, textureFormat, textureType, null)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindTexture(gl.TEXTURE_2D, null)); + return texture; +} +function getInternalFormatForFloat32MatrixTexture(textureConfig) { + return textureConfig.internalFormatFloat; +} +function createFloat32MatrixTexture(gl, rows, columns, textureConfig) { + const [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_1__["getUnpackedMatrixTextureShapeWidthHeight"](rows, columns); + return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat32MatrixTexture(textureConfig), textureConfig.textureFormatFloat, gl.FLOAT); +} +function getInternalFormatForFloat16MatrixTexture(textureConfig) { + return textureConfig.internalFormatHalfFloat; +} +function createFloat16MatrixTexture(gl, rows, columns, textureConfig) { + const [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_1__["getUnpackedMatrixTextureShapeWidthHeight"](rows, columns); + return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16MatrixTexture(textureConfig), textureConfig.textureFormatFloat, textureConfig.textureTypeHalfFloat); +} +function getInternalFormatForUnsignedBytesMatrixTexture(textureConfig) { + return textureConfig.downloadTextureFormat; +} +function createUnsignedBytesMatrixTexture(gl, rows, columns, textureConfig) { + const [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_1__["getUnpackedMatrixTextureShapeWidthHeight"](rows, columns); + return createAndConfigureTexture(gl, width, height, getInternalFormatForUnsignedBytesMatrixTexture(textureConfig), gl.RGBA, gl.UNSIGNED_BYTE); +} +function getInternalFormatForPackedMatrixTexture(textureConfig) { + return textureConfig.internalFormatPackedFloat; +} +function createPackedMatrixTexture(gl, rows, columns, textureConfig) { + const [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_1__["getPackedMatrixTextureShapeWidthHeight"](rows, columns); + return createAndConfigureTexture(gl, width, height, getInternalFormatForPackedMatrixTexture(textureConfig), gl.RGBA, gl.FLOAT); +} +function getInternalFormatForFloat16PackedMatrixTexture(textureConfig) { + return textureConfig.internalFormatPackedHalfFloat; +} +function createFloat16PackedMatrixTexture(gl, rows, columns, textureConfig) { + const [width, height] = _tex_util__WEBPACK_IMPORTED_MODULE_1__["getPackedMatrixTextureShapeWidthHeight"](rows, columns); + return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16PackedMatrixTexture(textureConfig), gl.RGBA, textureConfig.textureTypeHalfFloat); +} +function bindVertexProgramAttributeStreams(gl, program, vertexBuffer) { + const posOffset = 0; // x is the first buffer element + const uvOffset = 3 * 4; // uv comes after [x y z] + const stride = (3 * 4) + (2 * 4); // xyz + uv, each entry is 4-byte float. + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)); + const success = _webgl_util__WEBPACK_IMPORTED_MODULE_2__["bindVertexBufferToProgramAttribute"](gl, program, 'clipSpacePos', vertexBuffer, 3, stride, posOffset); + return success && + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["bindVertexBufferToProgramAttribute"](gl, program, 'uv', vertexBuffer, 2, stride, uvOffset); +} +function uploadDenseMatrixToTexture(gl, texture, width, height, data, textureConfig) { + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindTexture(gl.TEXTURE_2D, texture)); + let dataForUpload, texelDataType, internalFormat; + if (data instanceof Uint8Array) { + dataForUpload = new Uint8Array(width * height * 4); + texelDataType = gl.UNSIGNED_BYTE; + internalFormat = gl.RGBA; + } + else { + dataForUpload = new Float32Array(width * height * 4); + texelDataType = gl.FLOAT; + internalFormat = textureConfig.internalFormatPackedFloat; + } + dataForUpload.set(data); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, gl.RGBA, texelDataType, dataForUpload)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindTexture(gl.TEXTURE_2D, null)); +} +function uploadPixelDataToTexture(gl, texture, pixels) { + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindTexture(gl.TEXTURE_2D, texture)); + if (pixels.data instanceof Uint8Array) { + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, pixels.width, pixels.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels.data)); + } + else { + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels)); + } + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.bindTexture(gl.TEXTURE_2D, null)); +} +function createBufferFromOutputTexture(gl2, rows, columns, textureConfig) { + // Create and bind the buffer. + const buffer = gl2.createBuffer(); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl2, () => gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer)); + // Initialize the buffer to the size of the texture in bytes. + const bytesPerFloat = 4; + const valuesPerTexel = 4; + const bufferSizeBytes = bytesPerFloat * valuesPerTexel * rows * columns; + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl2, () => gl2.bufferData(gl2.PIXEL_PACK_BUFFER, bufferSizeBytes, gl2.STREAM_READ)); + // Enqueue a command on the GPU command queue to copy of texture into the + // buffer. + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl2, () => gl2.readPixels(0, 0, columns, rows, gl2.RGBA, gl2.FLOAT, 0)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl2, () => gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null)); + return buffer; +} +function downloadFloat32MatrixFromBuffer(gl, buffer, size) { + const gl2 = gl; + const downloadTarget = new Float32Array(size); + gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer); + gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget); + gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null); + return downloadTarget; +} +function downloadByteEncodedFloatMatrixFromOutputTexture(gl, rows, columns, textureConfig) { + const [w, h] = _tex_util__WEBPACK_IMPORTED_MODULE_1__["getUnpackedMatrixTextureShapeWidthHeight"](rows, columns); + const numChannels = 4; + const downloadTarget = new Uint8Array(_tex_util__WEBPACK_IMPORTED_MODULE_1__["getUnpackedArraySizeFromMatrixSize"](rows * columns, numChannels)); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.readPixels(0, 0, w, h, textureConfig.downloadTextureFormat, gl.UNSIGNED_BYTE, downloadTarget)); + // By wrapping the buffer in a Float32Array, we use native browser IEEE 754 + // decoding of the 4 bytes that back each 32 bit float. + return new Float32Array(downloadTarget.buffer); +} +function downloadPackedMatrixFromBuffer(gl, buffer, batch, rows, cols, physicalRows, physicalCols, textureConfig) { + const gl2 = gl; + const downloadTarget = new Float32Array(_tex_util__WEBPACK_IMPORTED_MODULE_1__["getPackedRGBAArraySizeFromMatrixShape"](physicalRows, physicalCols)); + gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer); + gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget); + gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null); + return downloadTarget; +} +function downloadMatrixFromPackedOutputTexture(gl, physicalRows, physicalCols) { + const packedRGBA = new Float32Array(physicalRows * physicalCols * 4); + _webgl_util__WEBPACK_IMPORTED_MODULE_2__["callAndCheck"](gl, () => gl.readPixels(0, 0, physicalCols, physicalRows, gl.RGBA, gl.FLOAT, packedRGBA)); + return packedRGBA; +} +//# sourceMappingURL=gpgpu_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: Im2ColPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Im2ColPackedProgram", function() { return Im2ColPackedProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class Im2ColPackedProgram { + constructor(outputShape, inputShape, convInfo) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = outputShape; + const { filterWidth, inChannels, strideWidth, strideHeight, padInfo, outWidth, dilationWidth, dilationHeight, dataFormat } = convInfo; + const { left, top } = padInfo; + const itemsPerBlockRow = inChannels * filterWidth; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + const isChannelsLast = dataFormat === 'channelsLast'; + const rowDim = isChannelsLast ? 0 : 1; + const colDim = isChannelsLast ? 1 : 2; + let unrolled = ``; + for (let row = 0; row <= 1; row++) { + for (let col = 0; col <= 1; col++) { + unrolled += ` + blockIndex = rc.y + ${col}; + pos = rc.x + ${row}; + + if(blockIndex < ${outputShape[1]} && pos < ${outputShape[0]}) { + offsetY = int(blockIndex / (${outWidth})) * ${strideHeight} - ${top}; + d0 = offsetY + ${dilationHeight} * (pos / ${itemsPerBlockRow}); + + if(d0 < ${inputShape[rowDim]} && d0 >= 0) { + + offsetX = int(mod(float(blockIndex), ${outWidth}.) * ${strideWidth}. - ${left}.); + d1 = offsetX + ${dilationWidth} * (int(mod(float(pos), ${itemsPerBlockRow}.) / ${inChannels}.)); + + if(d1 < ${inputShape[colDim]} && d1 >= 0) { + + ch = int(mod(float(pos), ${inChannels}.)); + + if (${isChannelsLast}) { + innerDims = vec2(d1, ch); + result[${row * 2 + col}] = getChannel( + getA(d0, int(innerDims.x), + int(innerDims.y)), innerDims); + } else { + innerDims = vec2(d0, d1); + result[${row * 2 + col}] = getChannel( + getA(ch, int(innerDims.x), + int(innerDims.y)), innerDims); + } + } + } + } + `; + } + } + this.userCode = ` + void main() { + ivec2 rc = getOutputCoords(); + + vec4 result = vec4(0); + + int blockIndex, pos, offsetY, d0, offsetX, d1, ch; + vec2 innerDims; + + ${unrolled} + + ${glsl.output} = result; + } + `; + } +} +//# sourceMappingURL=im2col_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/index.js ***! + \*******************************************************************/ +/*! exports provided: version_webgl, MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat, webgl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version_webgl", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["version_webgl"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MathBackendWebGL", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["MathBackendWebGL"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setWebGLContext", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["setWebGLContext"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GPGPUContext", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["GPGPUContext"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gpgpu_util", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["gpgpu_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "webgl_util", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["webgl_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceHalfFloat", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["forceHalfFloat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "webgl", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["webgl"]; }); + +/* harmony import */ var _register_all_kernels__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./register_all_kernels */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// All exports from this package should be in base. + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js ***! + \******************************************************************************/ +/*! exports provided: int */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int", function() { return int; }); +/* harmony import */ var _unaryop_gpu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../unaryop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const TO_INT = `return float(int(x));`; +function int(input, backend) { + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_0__["UnaryOpProgram"](input.shape, TO_INT); + const output = backend.runWebGLProgram(program, [input], 'int32'); + return { dataId: output.dataId, shape: output.shape, dtype: output.dtype }; +} +//# sourceMappingURL=int.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js ***! + \*********************************************************************************************/ +/*! exports provided: CHECK_NAN_SNIPPET_UNARY, CHECK_NAN_SNIPPET_BINARY, CHECK_NAN_SNIPPET_BINARY_PACKED, unaryKernelFunc, binaryKernelFunc */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CHECK_NAN_SNIPPET_UNARY", function() { return CHECK_NAN_SNIPPET_UNARY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CHECK_NAN_SNIPPET_BINARY", function() { return CHECK_NAN_SNIPPET_BINARY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CHECK_NAN_SNIPPET_BINARY_PACKED", function() { return CHECK_NAN_SNIPPET_BINARY_PACKED; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unaryKernelFunc", function() { return unaryKernelFunc; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "binaryKernelFunc", function() { return binaryKernelFunc; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _binaryop_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../binaryop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"); +/* harmony import */ var _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../binaryop_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/* harmony import */ var _kernels_Complex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../kernels/Complex */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/* harmony import */ var _unaryop_gpu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../unaryop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const CHECK_NAN_SNIPPET_UNARY = `if (isnan(x)) return x;`; +const CHECK_NAN_SNIPPET_BINARY = ` + if (isnan(a)) return a; + if (isnan(b)) return b; +`; +const CHECK_NAN_SNIPPET_BINARY_PACKED = ` + result.r = isNaN.r > 0. ? NAN : result.r; + result.g = isNaN.g > 0. ? NAN : result.g; + result.b = isNaN.b > 0. ? NAN : result.b; + result.a = isNaN.a > 0. ? NAN : result.a; +`; +/** + * Template that creates a `KernelFunc` for unary ops. + * @param opSnippets Op snippet to create `UnaryOpProgram`. + */ +function unaryKernelFunc(opSnippet) { + return ({ inputs, backend }) => { + const { x } = inputs; + const webglBackend = backend; + const program = new _unaryop_gpu__WEBPACK_IMPORTED_MODULE_4__["UnaryOpProgram"](x.shape, opSnippet); + return webglBackend.runWebGLProgram(program, [x], x.dtype); + }; +} +/** + * Template that creates a `KernelFunc` for binary ops. + * @param opSnippet Op snippet to create `BinaryOpProgram`. + * @param packedOpSnippet Op snippet to create `BinaryOpPackedProgram`. + * @param checkOutOfBoundsForPackedProgram Whether to set checkOutOfBounds=true + * when creating BinaryOpPackedProgram. + * @param dtype Optional. If set, the result has this dtype. Otherwise, the + * result has the same dtype as the first input. This is mainly used in + * comparison kernels, such as Equal, Less, Greater, etc. + */ +function binaryKernelFunc({ opSnippet, packedOpSnippet, checkOutOfBounds = false, supportsComplex = false, cpuKernelImpl, dtype }) { + return ({ inputs, backend }) => { + const { a, b } = inputs; + const webglBackend = backend; + if (supportsComplex && a.dtype === 'complex64') { + const aData = webglBackend.texData.get(a.dataId); + const bData = webglBackend.texData.get(b.dataId); + const [real, imag] = [ + [aData.complexTensorInfos.real, bData.complexTensorInfos.real], + [aData.complexTensorInfos.imag, bData.complexTensorInfos.imag] + ].map(complexParts => { + const [aPart, bPart] = complexParts; + const aHandle = { + dataId: aPart.dataId, + dtype: aPart.dtype, + shape: a.shape + }; + const bHandle = { + dataId: bPart.dataId, + dtype: bPart.dtype, + shape: b.shape + }; + const program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_1__["BinaryOpProgram"](opSnippet, a.shape, b.shape); + return webglBackend.runWebGLProgram(program, [aHandle, bHandle], Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["upcastType"])(aPart.dtype, bPart.dtype)); + }); + const complexOutput = Object(_kernels_Complex__WEBPACK_IMPORTED_MODULE_3__["complex"])({ inputs: { real, imag }, backend: webglBackend }); + webglBackend.disposeIntermediateTensorInfo(real); + webglBackend.disposeIntermediateTensorInfo(imag); + // TODO(annxingyuan): Implement CPU forwarding for complex inputs. + return complexOutput; + } + const $dtype = dtype || Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["upcastType"])(a.dtype, b.dtype); + if (webglBackend.shouldExecuteOnCPU([a, b]) && cpuKernelImpl != null) { + const aData = webglBackend.texData.get(a.dataId); + const bData = webglBackend.texData.get(b.dataId); + const [outValues, outShape] = cpuKernelImpl(a.shape, b.shape, aData.values, bData.values, $dtype); + const out = webglBackend.makeTensorInfo(outShape, $dtype); + const outData = webglBackend.texData.get(out.dataId); + outData.values = outValues; + return out; + } + const shouldUsePackedProgram = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS') && + packedOpSnippet != null; + let program; + if (shouldUsePackedProgram) { + program = new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_2__["BinaryOpPackedProgram"](packedOpSnippet, a.shape, b.shape, checkOutOfBounds); + } + else { + program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_1__["BinaryOpProgram"](opSnippet, a.shape, b.shape); + } + return webglBackend.runWebGLProgram(program, [a, b], $dtype); + }; +} +//# sourceMappingURL=kernel_funcs_utils.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js ***! + \*********************************************************************************/ +/*! exports provided: reduce */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _mean_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mean_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js"); +/* harmony import */ var _reduce_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../reduce_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +// Returns an array of configuration objects that describe each stage of the +// reduction. +function getReductionStages(inShape) { + const stages = []; + while (stages.length === 0 || stages[stages.length - 1].outSize !== 1) { + const outSize = stages.length ? stages[stages.length - 1].outSize : inShape[1]; + const windowSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOptimalWindowSize(outSize); + stages.push({ + inSize: outSize, + windowSize, + outSize: Math.ceil(outSize / windowSize) + }); + } + return stages; +} +function reduce(x, dtype, reductionType, backend) { + const reductionStages = getReductionStages(x.shape); + let result = x; + for (let i = 0; i < reductionStages.length; i++) { + const { inSize, windowSize, outSize } = reductionStages[i]; + let program; + let previousResult; + if (reductionType === 'mean') { + program = i === 0 ? + new _mean_gpu__WEBPACK_IMPORTED_MODULE_1__["MeanProgram"]({ windowSize, inSize, batchSize: x.shape[0], outSize }, inSize) : + new _mean_gpu__WEBPACK_IMPORTED_MODULE_1__["MeanProgram"]({ windowSize, inSize, batchSize: x.shape[0], outSize }); + } + else { + program = new _reduce_gpu__WEBPACK_IMPORTED_MODULE_2__["ReduceProgram"]({ windowSize, inSize, batchSize: x.shape[0], outSize }, reductionType); + } + previousResult = result; + result = backend.runWebGLProgram(program, [result], dtype); + if (previousResult.dataId !== x.dataId) { + backend.disposeIntermediateTensorInfo(previousResult); + } + } + return result; +} +//# sourceMappingURL=reduce.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js ***! + \**********************************************************************************/ +/*! exports provided: packedReshape */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "packedReshape", function() { return packedReshape; }); +/* harmony import */ var _reshape_packed_gpu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../reshape_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function packedReshape(input, afterShape, backend) { + const input3DShape = [Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getBatchDim"])(input.shape), + ...Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getRowsCols"])(input.shape)]; + const input3D = { + dtype: input.dtype, + shape: input3DShape, + dataId: input.dataId + }; + const afterShapeAs3D = [Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getBatchDim"])(afterShape), + ...Object(_webgl_util__WEBPACK_IMPORTED_MODULE_1__["getRowsCols"])(afterShape)]; + const program = new _reshape_packed_gpu__WEBPACK_IMPORTED_MODULE_0__["ReshapePackedProgram"](afterShapeAs3D, input3DShape); + const preventEagerUnpackingOfOutput = true; + const output = backend.runWebGLProgram(program, [input3D], input.dtype, null /* customSetup */, preventEagerUnpackingOfOutput); + return { dataId: output.dataId, shape: afterShape, dtype: output.dtype }; +} +//# sourceMappingURL=reshape.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js ***! + \*********************************************************************************/ +/*! exports provided: simpleAbsImplCPU, addImplCPU, ceilImplCPU, expImplCPU, expm1ImplCPU, logImplCPU, multiplyImplCPU, sliceImplCPU, subImplCPU, floorImplCPU, maxImplCPU, rsqrtImplCPU, transposeImplCPU, uniqueImplCPU */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "simpleAbsImplCPU", function() { return simpleAbsImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addImplCPU", function() { return addImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceilImplCPU", function() { return ceilImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expImplCPU", function() { return expImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expm1ImplCPU", function() { return expm1ImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logImplCPU", function() { return logImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiplyImplCPU", function() { return multiplyImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sliceImplCPU", function() { return sliceImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subImplCPU", function() { return subImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floorImplCPU", function() { return floorImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxImplCPU", function() { return maxImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rsqrtImplCPU", function() { return rsqrtImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transposeImplCPU", function() { return transposeImplCPU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uniqueImplCPU", function() { return uniqueImplCPU; }); +/* harmony import */ var _tensorflow_tfjs_backend_cpu_dist_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-backend-cpu/dist/shared */ "./node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Import shared functionality from tfjs-backend-cpu without triggering +// side effects. +// tslint:disable-next-line: no-imports-from-dist + +const { simpleAbsImpl: simpleAbsImplCPU, addImpl: addImplCPU, ceilImpl: ceilImplCPU, expImpl: expImplCPU, expm1Impl: expm1ImplCPU, floorImpl: floorImplCPU, logImpl: logImplCPU, maxImpl: maxImplCPU, multiplyImpl: multiplyImplCPU, rsqrtImpl: rsqrtImplCPU, sliceImpl: sliceImplCPU, subImpl: subImplCPU, transposeImpl: transposeImplCPU, uniqueImpl: uniqueImplCPU, } = _tensorflow_tfjs_backend_cpu_dist_shared__WEBPACK_IMPORTED_MODULE_0__; + +//# sourceMappingURL=shared.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js ***! + \*************************************************************************/ +/*! exports provided: addKernelFunc, addConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addKernelFunc", function() { return addKernelFunc; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addConfig", function() { return addConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const ADD = 'return a + b;'; +const addKernelFunc = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["binaryKernelFunc"])({ + opSnippet: ADD, + packedOpSnippet: ADD, + supportsComplex: true, + cpuKernelImpl: _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["addImplCPU"] +}); +const addConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Add"], + backendName: 'webgl', + kernelFunc: addKernelFunc +}; +//# sourceMappingURL=Add.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js ***! + \***************************************************************************/ +/*! exports provided: atan2, atan2Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return atan2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2Config", function() { return atan2Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const ATAN2 = _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["CHECK_NAN_SNIPPET_BINARY"] + ` + return atan(a, b); +`; +const ATAN2_PACKED = ` + vec4 result = atan(a, b); + vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0)); + ` + + _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["CHECK_NAN_SNIPPET_BINARY_PACKED"] + ` + return result; +`; +const atan2 = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["binaryKernelFunc"])({ opSnippet: ATAN2, packedOpSnippet: ATAN2_PACKED }); +const atan2Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Atan2"], + backendName: 'webgl', + kernelFunc: atan2, +}; +//# sourceMappingURL=Atan2.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool, avgPoolConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool", function() { return avgPool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolConfig", function() { return avgPoolConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _pool_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pool_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function avgPool(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + Object(_webgl_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'avgPool'); + const { filterSize, strides, pad, dimRoundingMode } = attrs; + const dilations = 1; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode); + if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(convInfo.inShape, convInfo.outShape)) { + return Object(_Identity__WEBPACK_IMPORTED_MODULE_3__["identity"])({ inputs: { x }, backend }); + } + const avgPoolProgram = new _pool_gpu__WEBPACK_IMPORTED_MODULE_1__["Pool2DProgram"](convInfo, 'avg', false); + return backend.runWebGLProgram(avgPoolProgram, [x], 'float32'); +} +const avgPoolConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["AvgPool"], + backendName: 'webgl', + kernelFunc: avgPool +}; +//# sourceMappingURL=AvgPool.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolBackprop.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolBackprop.js ***! + \*************************************************************************************/ +/*! exports provided: avgPoolBackprop, avgPoolBackpropConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolBackprop", function() { return avgPoolBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolBackpropConfig", function() { return avgPoolBackpropConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _avg_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../avg_pool_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function avgPoolBackprop(args) { + const { inputs, backend, attrs } = args; + const { dy, input } = inputs; + const x = input; + Object(_webgl_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])([dy, input], 'avgPoolBackprop'); + const { filterSize, strides, pad } = attrs; + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad); + const avgPoolBackpropProgram = new _avg_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_1__["AvgPool2DBackpropProgram"](convInfo); + return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype); +} +const avgPoolBackpropConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["AvgPoolBackprop"], + backendName: 'webgl', + kernelFunc: avgPoolBackprop +}; +//# sourceMappingURL=AvgPoolBackprop.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js ***! + \*******************************************************************************/ +/*! exports provided: batchNorm, batchNormConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNorm", function() { return batchNorm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNormConfig", function() { return batchNormConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _batchnorm_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../batchnorm_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js"); +/* harmony import */ var _batchnorm_packed_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../batchnorm_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const batchNorm = ({ inputs, backend, attrs }) => { + const { x, mean, variance, offset, scale } = inputs; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(mean.shape.length === variance.shape.length, () => 'Batch normalization gradient requires mean and variance to have ' + + 'equal ranks.'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(offset == null || mean.shape.length === offset.shape.length, () => 'Batch normalization gradient requires mean and offset to have ' + + 'equal ranks.'); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(scale == null || mean.shape.length === scale.shape.length, () => 'Batch normalization gradient requires mean and scale to have ' + + 'equal ranks.'); + let { varianceEpsilon } = attrs; + if (varianceEpsilon == null) { + varianceEpsilon = 0.001; + } + const finalInputs = [x, mean, variance]; + let offsetShape = null; + if (offset != null) { + offsetShape = offset.shape; + finalInputs.push(offset); + } + let scaleShape = null; + if (scale != null) { + scaleShape = scale.shape; + finalInputs.push(scale); + } + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK_NORMALIZATION') ? + new _batchnorm_packed_gpu__WEBPACK_IMPORTED_MODULE_2__["BatchNormPackedProgram"](x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon) : + new _batchnorm_gpu__WEBPACK_IMPORTED_MODULE_1__["BatchNormProgram"](x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon); + const output = backend.runWebGLProgram(program, finalInputs, finalInputs[0].dtype); + return output; +}; +const batchNormConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FusedBatchNorm"], + backendName: 'webgl', + kernelFunc: batchNorm, +}; +//# sourceMappingURL=BatchNorm.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js ***! + \**************************************************************************/ +/*! exports provided: cast, castConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cast", function() { return cast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "castConfig", function() { return castConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Complex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Complex */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/* harmony import */ var _NotEqual__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./NotEqual */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"); +/* harmony import */ var _Real__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Real */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); +/* harmony import */ var _kernel_utils_int__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../kernel_utils/int */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +function cast(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { dtype } = attrs; + // Casting to complex64. + if (dtype === 'complex64') { + if (x.dtype === 'complex64') { + return Object(_Identity__WEBPACK_IMPORTED_MODULE_2__["identity"])({ inputs: { x }, backend }); + } + // TODO(annxingyuan): Import kernel function once zeros is modularized. + const zerosTensor = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["zeros"](x.shape); + const floatX = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } }); + const result = Object(_Complex__WEBPACK_IMPORTED_MODULE_1__["complex"])({ inputs: { real: floatX, imag: zerosTensor }, backend }); + zerosTensor.dispose(); + backend.disposeIntermediateTensorInfo(floatX); + return result; + } + // Casting from complex64 + if (x.dtype === 'complex64') { + const realPart = Object(_Real__WEBPACK_IMPORTED_MODULE_4__["real"])({ inputs: { input: x }, backend }); + const result = cast({ inputs: { x: realPart }, backend, attrs: { dtype } }); + backend.disposeIntermediateTensorInfo(realPart); + return result; + } + if (!_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].hasEncodingLoss(x.dtype, dtype)) { + // We don't change the underlying data, since we cast to higher + // precision. + const result = Object(_Identity__WEBPACK_IMPORTED_MODULE_2__["identity"])({ inputs: { x }, backend }); + return { dataId: result.dataId, shape: result.shape, dtype }; + } + if (dtype === 'int32') { + return Object(_kernel_utils_int__WEBPACK_IMPORTED_MODULE_5__["int"])(x, backend); + } + if (dtype === 'bool') { + const zerosTensorInfo = backend.makeTensorInfo([], 'bool', _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].getTypedArrayFromDType('bool', 1)); + const binaryInputs = { a: x, b: zerosTensorInfo }; + const result = Object(_NotEqual__WEBPACK_IMPORTED_MODULE_3__["notEqual"])({ inputs: binaryInputs, backend }); + backend.disposeIntermediateTensorInfo(zerosTensorInfo); + return result; + } + throw new Error(`Error in Cast: failed to cast ${x.dtype} to ${dtype}`); +} +const castConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cast"], + backendName: 'webgl', + kernelFunc: cast +}; +//# sourceMappingURL=Cast.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js ***! + \*****************************************************************************/ +/*! exports provided: complex, complexConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complex", function() { return complex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complexConfig", function() { return complexConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +/** + * In WebGL data is stored in GPU textures which can't be efficiently copied, so + * complex tensors share data with their real and imaginary components. Complex + * tensors increment the `complexParentRefCount` properties of the underlying + * data buckets to prevent them from being disposed, as the engine's disposal + * logic does not account for data sharing by complex tensors. + * + * When a complex tensor is disposed, it will explicitly decrease the + * `complexParentRefCount` properties of its underlying components. + */ +function complex(args) { + const { inputs, backend } = args; + const { real, imag } = inputs; + const complexInfo = backend.makeTensorInfo(real.shape, 'complex64'); + const complex = backend.texData.get(complexInfo.dataId); + const realTensorInfo = Object(_Identity__WEBPACK_IMPORTED_MODULE_1__["identity"])({ inputs: { x: real }, backend }); + const realData = backend.texData.get(realTensorInfo.dataId); + realData.complexParentRefCount++; + const imagTensorInfo = Object(_Identity__WEBPACK_IMPORTED_MODULE_1__["identity"])({ inputs: { x: imag }, backend }); + const imagData = backend.texData.get(imagTensorInfo.dataId); + imagData.complexParentRefCount++; + complex.complexTensorInfos = { real: realTensorInfo, imag: imagTensorInfo }; + return complexInfo; +} +const complexConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Complex"], + backendName: 'webgl', + kernelFunc: complex +}; +//# sourceMappingURL=Complex.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js ***! + \****************************************************************************/ +/*! exports provided: concat, concatConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatConfig", function() { return concatConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Concat_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Concat_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function concat(args) { + const { inputs, backend, attrs } = args; + const { axis } = attrs; + const $axis = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam(axis, inputs[0].shape)[0]; + const outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape(inputs.map(t => t.shape), $axis); + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShape) === 0) { + return backend.makeTensorInfo(outShape, inputs[0].dtype, []); + } + // Keep only non-empty tensors (ignore tensors with 0 in their shape). + const $inputs = inputs.filter(t => _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(t.shape) > 0); + if ($inputs.length === 1) { + return $inputs[0]; + } + const shapes = $inputs.map(t => t.shape); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertParamsConsistent(shapes, $axis); + return Object(_Concat_impl__WEBPACK_IMPORTED_MODULE_1__["concatImpl"])($inputs, $axis, backend); +} +const concatConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Concat"], + backendName: 'webgl', + kernelFunc: concat +}; +//# sourceMappingURL=Concat.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js ***! + \*********************************************************************************/ +/*! exports provided: concatImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatImpl", function() { return concatImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _concat_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../concat_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js"); +/* harmony import */ var _concat_packed_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../concat_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js"); +/* harmony import */ var _Complex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Complex */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/* harmony import */ var _Imag__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Imag */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"); +/* harmony import */ var _Real__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Real */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +function concatImpl(inputs, axis, backend) { + const dtype = inputs[0].dtype; + if (dtype === 'complex64') { + const reals = inputs.map((t) => Object(_Real__WEBPACK_IMPORTED_MODULE_5__["real"])({ inputs: { input: t }, backend })); + const imags = inputs.map((t) => Object(_Imag__WEBPACK_IMPORTED_MODULE_4__["imag"])({ inputs: { input: t }, backend })); + const realConcated = concatImpl(reals, axis, backend); + const imagConcated = concatImpl(imags, axis, backend); + const result = Object(_Complex__WEBPACK_IMPORTED_MODULE_3__["complex"])({ inputs: { real: realConcated, imag: imagConcated }, backend }); + reals.forEach(r => backend.disposeIntermediateTensorInfo(r)); + imags.forEach(i => backend.disposeIntermediateTensorInfo(i)); + backend.disposeIntermediateTensorInfo(realConcated); + backend.disposeIntermediateTensorInfo(imagConcated); + return result; + } + if (inputs.length > Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_MAX_TEXTURES_IN_SHADER')) { + const midIndex = Math.floor(inputs.length / 2); + const leftSide = concatImpl(inputs.slice(0, midIndex), axis, backend); + const rightSide = concatImpl(inputs.slice(midIndex), axis, backend); + const result = concatImpl([leftSide, rightSide], axis, backend); + backend.disposeIntermediateTensorInfo(leftSide); + backend.disposeIntermediateTensorInfo(rightSide); + return result; + } + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK_ARRAY_OPERATIONS') && + inputs[0].shape.length > 1) { + const program = new _concat_packed_gpu__WEBPACK_IMPORTED_MODULE_2__["ConcatPackedProgram"](inputs.map(t => t.shape), axis); + return backend.runWebGLProgram(program, inputs, dtype); + } + // Any concat of n-dimensional tensors across any axis can be reduced to + // a concatenation of two-dimensional tensors across the axis 1 by first + // partitioning the axes of the original tensors into those less than the + // axis to be concatenated and the rest. Then reshape the tensors + // into a two-dimensional tensor by collapsing these two sets of axes and + // concatenate the resulting matrices across the axis 1, finally reshaping + // the result to have the proper shape. + const outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutShape(inputs.map(t => t.shape), axis); + const tensors2D = inputs.map(x => Object(_Reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])({ + inputs: { x }, + attrs: { shape: [-1, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape.slice(axis))] }, + backend + })); + const program = new _concat_gpu__WEBPACK_IMPORTED_MODULE_1__["ConcatProgram"](tensors2D.map(t => t.shape)); + const result = backend.runWebGLProgram(program, tensors2D, dtype); + tensors2D.forEach(r => backend.disposeIntermediateTensorInfo(r)); + const reshapedResult = Object(_Reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])({ inputs: { x: result }, attrs: { shape: outShape }, backend }); + backend.disposeIntermediateTensorInfo(result); + return reshapedResult; +} +//# sourceMappingURL=Concat_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js ***! + \*************************************************************************/ +/*! exports provided: cos, cosConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cosConfig", function() { return cosConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const COS = _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["CHECK_NAN_SNIPPET_UNARY"] + ` + return cos(x); +`; +const cos = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(COS); +const cosConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Cos"], + backendName: 'webgl', + kernelFunc: cos, +}; +//# sourceMappingURL=Cos.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Div.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Div.js ***! + \*************************************************************************/ +/*! exports provided: div, divConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "div", function() { return div; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divConfig", function() { return divConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +// Without the equality check div produces 0.9999 for a = b, which when +// floored can cause errors. +const DIV = ` +if (a == b) { + return 1.0; +}; +return a / b;`; +// We do the same as in ./binaryop_gpu, with vec4 and ivec4. +// On Linux, the vectorized implementation produces NaNs when a and b are 0. +const DIV_PACKED = ` + // vec4 one = vec4(equal(a, b)); + // return one + (vec4(1.0) - one) * a / b; + vec4 result = a / b; + if(a.x == b.x) { + result.x = 1.; + } + if(a.y == b.y) { + result.y = 1.; + } + if(a.z == b.z) { + result.z = 1.; + } + if(a.w == b.w) { + result.w = 1.; + } + + return result; +`; +const div = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["binaryKernelFunc"])({ opSnippet: DIV, packedOpSnippet: DIV_PACKED, checkOutOfBounds: true }); +const divConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Div"], + backendName: 'webgl', + kernelFunc: div, +}; +//# sourceMappingURL=Div.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js ***! + \*************************************************************************/ +/*! exports provided: fft, fftConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fft", function() { return fft; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fftConfig", function() { return fftConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _FFT_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FFT_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function fft(args) { + const { inputs, backend } = args; + const { input } = inputs; + return Object(_FFT_impl__WEBPACK_IMPORTED_MODULE_1__["fftImpl"])(input, false /* inverse */, backend); +} +const fftConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FFT"], + backendName: 'webgl', + kernelFunc: fft +}; +//# sourceMappingURL=FFT.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js ***! + \******************************************************************************/ +/*! exports provided: fftImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fftImpl", function() { return fftImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _fft_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../fft_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js"); +/* harmony import */ var _Complex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Complex */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/* harmony import */ var _Reshape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Reshape */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function fftImpl(x, inverse, backend) { + const xData = backend.texData.get(x.dataId); + const inputSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + // Collapse all outer dimensions to a single batch dimension. + const innerDimensionSize = x.shape[x.shape.length - 1]; + const batch = inputSize / innerDimensionSize; + const input2D = Object(_Reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])({ inputs: { x }, backend, attrs: { shape: [batch, innerDimensionSize] } }); + const xShape = input2D.shape; + const realProgram = new _fft_gpu__WEBPACK_IMPORTED_MODULE_1__["FFTProgram"]('real', xShape, inverse); + const imagProgram = new _fft_gpu__WEBPACK_IMPORTED_MODULE_1__["FFTProgram"]('imag', xShape, inverse); + const inputs = [ + { + dataId: xData.complexTensorInfos.real.dataId, + dtype: xData.complexTensorInfos.real.dtype, + shape: xShape + }, + { + dataId: xData.complexTensorInfos.imag.dataId, + dtype: xData.complexTensorInfos.imag.dtype, + shape: xShape + } + ]; + const realPart = backend.runWebGLProgram(realProgram, inputs, 'float32'); + const imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32'); + const complexOutput = Object(_Complex__WEBPACK_IMPORTED_MODULE_2__["complex"])({ inputs: { real: realPart, imag: imagPart }, backend }); + backend.disposeIntermediateTensorInfo(realPart); + backend.disposeIntermediateTensorInfo(imagPart); + const complexOutputReshaped = Object(_Reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])({ inputs: { x: complexOutput }, backend, attrs: { shape: x.shape } }); + backend.disposeIntermediateTensorInfo(complexOutputReshaped); + return complexOutputReshaped; +} +//# sourceMappingURL=FFT_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js ***! + \***********************************************************************************/ +/*! exports provided: flipLeftRightConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flipLeftRightConfig", function() { return flipLeftRightConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _flip_left_right_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../flip_left_right_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const flipLeftRightConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FlipLeftRight"], + backendName: 'webgl', + kernelFunc: ({ inputs, backend }) => { + const { image } = inputs; + const webglBackend = backend; + const program = new _flip_left_right_gpu__WEBPACK_IMPORTED_MODULE_1__["FlipLeftRightProgram"](image.shape); + const output = webglBackend.runWebGLProgram(program, [image], image.dtype); + return output; + } +}; +//# sourceMappingURL=FlipLeftRight.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js ***! + \********************************************************************************/ +/*! exports provided: fromPixelsConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromPixelsConfig", function() { return fromPixelsConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/* harmony import */ var _FromPixels_utils_from_pixels_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FromPixels_utils/from_pixels_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js"); +/* harmony import */ var _FromPixels_utils_from_pixels_packed_gpu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FromPixels_utils/from_pixels_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const fromPixelsConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["FromPixels"], + backendName: 'webgl', + kernelFunc: fromPixels, +}; +let fromPixels2DContext; +function fromPixels(args) { + const { inputs, backend, attrs } = args; + let { pixels } = inputs; + const { numChannels } = attrs; + const isVideo = typeof (HTMLVideoElement) !== 'undefined' && + pixels instanceof HTMLVideoElement; + const isImage = typeof (HTMLImageElement) !== 'undefined' && + pixels instanceof HTMLImageElement; + const [width, height] = isVideo ? + [ + pixels.videoWidth, + pixels.videoHeight + ] : + [pixels.width, pixels.height]; + const texShape = [height, width]; + const outShape = [height, width, numChannels]; + if (isImage || isVideo) { + if (fromPixels2DContext == null) { + fromPixels2DContext = document.createElement('canvas').getContext('2d'); + } + fromPixels2DContext.canvas.width = width; + fromPixels2DContext.canvas.height = height; + fromPixels2DContext.drawImage(pixels, 0, 0, width, height); + pixels = fromPixels2DContext.canvas; + } + const tempPixelHandle = backend.makeTensorInfo(texShape, 'int32'); + // This is a byte texture with pixels. + backend.texData.get(tempPixelHandle.dataId).usage = _tex_util__WEBPACK_IMPORTED_MODULE_1__["TextureUsage"].PIXELS; + backend.gpgpu.uploadPixelDataToTexture(backend.getTexture(tempPixelHandle.dataId), pixels); + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK') ? + new _FromPixels_utils_from_pixels_packed_gpu__WEBPACK_IMPORTED_MODULE_3__["FromPixelsPackedProgram"](outShape) : + new _FromPixels_utils_from_pixels_gpu__WEBPACK_IMPORTED_MODULE_2__["FromPixelsProgram"](outShape); + const res = backend.runWebGLProgram(program, [tempPixelHandle], 'int32'); + backend.disposeData(tempPixelHandle.dataId); + return res; +} +//# sourceMappingURL=FromPixels.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js ***! + \******************************************************************************************************/ +/*! exports provided: FromPixelsProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FromPixelsProgram", function() { return FromPixelsProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class FromPixelsProgram { + constructor(outputShape) { + this.variableNames = ['A']; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + const [height, width,] = outputShape; + this.outputShape = outputShape; + this.userCode = ` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${width}.0, ${height}.0); + + vec4 values = ${glsl.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + setOutput(floor(value * 255.0 + 0.5)); + } + `; + } +} +//# sourceMappingURL=from_pixels_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js ***! + \*************************************************************************************************************/ +/*! exports provided: FromPixelsPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FromPixelsPackedProgram", function() { return FromPixelsPackedProgram; }); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class FromPixelsPackedProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.packedInputs = false; + this.packedOutput = true; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_0__["getGlslDifferences"])(); + const [height, width,] = outputShape; + this.outputShape = outputShape; + this.userCode = ` + void main() { + ivec3 coords = getOutputCoords(); + int texR = coords[0]; + int texC = coords[1]; + int depth = coords[2]; + + vec4 result = vec4(0.); + + for(int row=0; row<=1; row++) { + for(int col=0; col<=1; col++) { + texC = coords[1] + row; + depth = coords[2] + col; + + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${width}.0, ${height}.0); + vec4 values = ${glsl.texture2D}(A, uv); + float value; + if (depth == 0) { + value = values.r; + } else if (depth == 1) { + value = values.g; + } else if (depth == 2) { + value = values.b; + } else if (depth == 3) { + value = values.a; + } + + result[row * 2 + col] = floor(value * 255.0 + 0.5); + } + } + + ${glsl.output} = result; + } + `; + } +} +//# sourceMappingURL=from_pixels_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js ***! + \**************************************************************************/ +/*! exports provided: ifft, ifftConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ifft", function() { return ifft; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ifftConfig", function() { return ifftConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _FFT_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FFT_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function ifft(args) { + const { inputs, backend } = args; + const { input } = inputs; + return Object(_FFT_impl__WEBPACK_IMPORTED_MODULE_1__["fftImpl"])(input, true /* inverse */, backend); +} +const ifftConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["IFFT"], + backendName: 'webgl', + kernelFunc: ifft +}; +//# sourceMappingURL=IFFT.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js ***! + \******************************************************************************/ +/*! exports provided: identity, identityConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identityConfig", function() { return identityConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function identity(args) { + const { inputs, backend } = args; + const { x } = inputs; + backend.incRef(x.dataId); + return { dataId: x.dataId, shape: x.shape, dtype: x.dtype }; +} +const identityConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Identity"], + backendName: 'webgl', + kernelFunc: identity +}; +//# sourceMappingURL=Identity.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js ***! + \**************************************************************************/ +/*! exports provided: imag, imagConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imag", function() { return imag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imagConfig", function() { return imagConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function imag(args) { + const { inputs, backend } = args; + const { input } = inputs; + const inputData = backend.texData.get(input.dataId); + return Object(_Identity__WEBPACK_IMPORTED_MODULE_1__["identity"])({ inputs: { x: inputData.complexTensorInfos.imag }, backend }); +} +const imagConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Imag"], + backendName: 'webgl', + kernelFunc: imag +}; +//# sourceMappingURL=Imag.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js ***! + \*************************************************************************/ +/*! exports provided: maxConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxConfig", function() { return maxConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/* harmony import */ var _Max_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Max_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js"); +/* harmony import */ var _Transpose_impl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Transpose_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const maxConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Max"], + backendName: 'webgl', + kernelFunc: ({ inputs, attrs, backend }) => { + const { x } = inputs; + const { reductionIndices, keepDims } = attrs; + const webglBackend = backend; + const xRank = x.shape.length; + const origAxes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam(reductionIndices, x.shape); + let axes = origAxes; + const permutedAxes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getAxesPermutation(axes, xRank); + const maxInputIsTransposed = permutedAxes != null; + const shouldExecuteOnCPU = webglBackend.shouldExecuteOnCPU([x]); + let maxInput = x; + if (maxInputIsTransposed) { + if (shouldExecuteOnCPU) { + const xTexData = webglBackend.texData.get(maxInput.dataId); + const values = xTexData.values; + const newShape = new Array(xRank); + for (let i = 0; i < newShape.length; i++) { + newShape[i] = x.shape[permutedAxes[i]]; + } + const maxInputValues = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_3__["transposeImplCPU"])(values, x.shape, x.dtype, permutedAxes, newShape); + maxInput = webglBackend.makeTensorInfo(newShape, x.dtype); + const maxInputData = webglBackend.texData.get(maxInput.dataId); + maxInputData.values = maxInputValues; + } + else { + maxInput = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_3__["transposeImpl"])(x, permutedAxes, webglBackend); + } + axes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getInnerMostAxes(axes.length, xRank); + } + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('max', axes, xRank); + const [maxOutShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(maxInput.shape, axes); + let outShape = maxOutShape; + if (keepDims) { + // rather than reshape at the end, set the target shape here. + outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].expandShapeToKeepDim(maxOutShape, origAxes); + } + let out; + if (shouldExecuteOnCPU) { + const xTexData = webglBackend.texData.get(maxInput.dataId); + const values = xTexData.values; + const outValues = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_1__["maxImplCPU"])(values, _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape), outShape, x.dtype); + out = webglBackend.makeTensorInfo(outShape, x.dtype); + const outData = webglBackend.texData.get(out.dataId); + outData.values = outValues; + } + else { + out = Object(_Max_impl__WEBPACK_IMPORTED_MODULE_2__["maxImpl"])(maxInput, reduceShape, outShape, webglBackend); + } + if (maxInputIsTransposed) { + webglBackend.disposeIntermediateTensorInfo(maxInput); + } + return out; + } +}; +//# sourceMappingURL=Max.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js ***! + \*****************************************************************************/ +/*! exports provided: maxPool, maxPoolConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPool", function() { return maxPool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolConfig", function() { return maxPoolConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _pool_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pool_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function maxPool(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + Object(_webgl_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'maxPool'); + const { filterSize, strides, pad, dimRoundingMode } = attrs; + const dilations = 1; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode); + if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(convInfo.inShape, convInfo.outShape)) { + return Object(_Identity__WEBPACK_IMPORTED_MODULE_3__["identity"])({ inputs: { x }, backend }); + } + const maxPoolProgram = new _pool_gpu__WEBPACK_IMPORTED_MODULE_1__["Pool2DProgram"](convInfo, 'max', false); + return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype); +} +const maxPoolConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MaxPool"], + backendName: 'webgl', + kernelFunc: maxPool +}; +//# sourceMappingURL=MaxPool.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolBackprop.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolBackprop.js ***! + \*************************************************************************************/ +/*! exports provided: maxPoolBackprop, maxPoolBackpropConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolBackprop", function() { return maxPoolBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolBackpropConfig", function() { return maxPoolBackpropConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _max_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../max_pool_backprop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js"); +/* harmony import */ var _pool_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pool_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function maxPoolBackprop(args) { + const { inputs, backend, attrs } = args; + const { dy, input, output } = inputs; + const x = input; + Object(_webgl_util__WEBPACK_IMPORTED_MODULE_3__["assertNotComplex"])([input, output], 'maxPoolBackprop'); + const { filterSize, strides, pad, dimRoundingMode } = attrs; + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode); + const getPositions = true; + const maxPoolPositionsProgram = new _pool_gpu__WEBPACK_IMPORTED_MODULE_2__["Pool2DProgram"](convInfo, 'max', getPositions); + const maxPoolPositions = backend.runWebGLProgram(maxPoolPositionsProgram, [x], x.dtype); + const maxPoolBackPropProgram = new _max_pool_backprop_gpu__WEBPACK_IMPORTED_MODULE_1__["MaxPool2DBackpropProgram"](convInfo); + const result = backend.runWebGLProgram(maxPoolBackPropProgram, [dy, maxPoolPositions], x.dtype); + backend.disposeIntermediateTensorInfo(maxPoolPositions); + return result; +} +const maxPoolBackpropConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MaxPoolBackprop"], + backendName: 'webgl', + kernelFunc: maxPoolBackprop +}; +//# sourceMappingURL=MaxPoolBackprop.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js ***! + \***************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolWithArgmaxConfig", function() { return maxPoolWithArgmaxConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _MaxPoolWithArgmax_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MaxPoolWithArgmax_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const maxPoolWithArgmaxConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MaxPoolWithArgmax"], + backendName: 'webgl', + kernelFunc: ({ inputs, attrs, backend }) => { + const { x } = inputs; + const { filterSize, strides, pad, includeBatchInIndex } = attrs; + const webglBackend = backend; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(x.shape.length === 4, () => `Error in maxPool: input must be rank 4 but got rank ${x.shape.length}.`); + const dilations = [1, 1]; + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + const convInfo = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computePool2DInfo(x.shape, filterSize, strides, dilations, pad); + const [result, indexes] = Object(_MaxPoolWithArgmax_impl__WEBPACK_IMPORTED_MODULE_1__["maxPoolWithArgmaxImpl"])(x, includeBatchInIndex, convInfo, webglBackend); + return [result, indexes]; + } +}; +//# sourceMappingURL=MaxPoolWithArgmax.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js ***! + \********************************************************************************************/ +/*! exports provided: maxPoolWithArgmaxImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolWithArgmaxImpl", function() { return maxPoolWithArgmaxImpl; }); +/* harmony import */ var _pool_gpu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../pool_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function maxPoolWithArgmaxImpl(x, includeBatchInIndex, convInfo, backend) { + let program = new _pool_gpu__WEBPACK_IMPORTED_MODULE_0__["Pool2DProgram"](convInfo, 'max', false); + const poolOutput = backend.runWebGLProgram(program, [x], 'float32'); + program = new _pool_gpu__WEBPACK_IMPORTED_MODULE_0__["Pool2DProgram"](convInfo, 'max', true, true, includeBatchInIndex); + const indexOutput = backend.runWebGLProgram(program, [x], 'float32'); + return [poolOutput, indexOutput]; +} +//# sourceMappingURL=MaxPoolWithArgmax_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js ***! + \******************************************************************************/ +/*! exports provided: maxImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxImpl", function() { return maxImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_reduce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/reduce */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"); +/* harmony import */ var _kernels_Reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernels/Reshape */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function maxImpl(x, reduceShape, outShape, backend) { + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + const batchSize = xSize / inSize; + const reshapedInput = Object(_kernels_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x }, attrs: { shape: [batchSize, inSize] }, backend }); + const reduced = Object(_kernel_utils_reduce__WEBPACK_IMPORTED_MODULE_1__["reduce"])(reshapedInput, x.dtype, 'max', backend); + const reshapedOutput = Object(_kernels_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x: reduced }, attrs: { shape: outShape }, backend }); + backend.disposeIntermediateTensorInfo(reshapedInput); + backend.disposeIntermediateTensorInfo(reduced); + return reshapedOutput; +} +//# sourceMappingURL=Max_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js ***! + \**************************************************************************/ +/*! exports provided: meanConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "meanConfig", function() { return meanConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Mean_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Mean_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js"); +/* harmony import */ var _Transpose_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Transpose_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const meanConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Mean"], + backendName: 'webgl', + kernelFunc: ({ inputs, attrs, backend }) => { + const { x } = inputs; + const { keepDims, axis } = attrs; + const webglBackend = backend; + const xRank = x.shape.length; + const origAxes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].parseAxisParam(axis, x.shape); + let axes = origAxes; + const permutedAxes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getAxesPermutation(axes, xRank); + const meanInputIsTransposed = permutedAxes != null; + const shouldExecuteOnCPU = webglBackend.shouldExecuteOnCPU([x]); + const intermediates = []; + let meanInput = x; + if (meanInputIsTransposed) { + if (shouldExecuteOnCPU) { + const xTexData = webglBackend.texData.get(meanInput.dataId); + const values = xTexData.values; + const newShape = new Array(xRank); + for (let i = 0; i < newShape.length; i++) { + newShape[i] = x.shape[permutedAxes[i]]; + } + const meanInputValues = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_2__["transposeImplCPU"])(values, x.shape, x.dtype, permutedAxes, newShape); + meanInput = webglBackend.makeTensorInfo(newShape, x.dtype); + const meanInputData = webglBackend.texData.get(meanInput.dataId); + meanInputData.values = meanInputValues; + } + else { + meanInput = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_2__["transposeImpl"])(x, permutedAxes, webglBackend); + } + intermediates.push(meanInput); + axes = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getInnerMostAxes(axes.length, xRank); + } + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].assertAxesAreInnerMostDims('sum', axes, xRank); + const [meanOutShape, reduceShape] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].computeOutAndReduceShapes(meanInput.shape, axes); + let outShape = meanOutShape; + if (keepDims) { + // rather than reshape at the end, set the target shape here. + outShape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].expandShapeToKeepDim(meanOutShape, origAxes); + } + const out = Object(_Mean_impl__WEBPACK_IMPORTED_MODULE_1__["meanImpl"])(meanInput, reduceShape, outShape, webglBackend); + for (const i of intermediates) { + webglBackend.disposeIntermediateTensorInfo(i); + } + return out; + } +}; +//# sourceMappingURL=Mean.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js ***! + \*******************************************************************************/ +/*! exports provided: meanImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "meanImpl", function() { return meanImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_reduce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/reduce */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js"); +/* harmony import */ var _kernels_Reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernels/Reshape */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function meanImpl(x, reduceShape, outShape, backend) { + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(reduceShape); + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + const batchSize = xSize / inSize; + const reshapedInput = Object(_kernels_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x }, attrs: { shape: [batchSize, inSize] }, backend }); + const reduced = Object(_kernel_utils_reduce__WEBPACK_IMPORTED_MODULE_1__["reduce"])(reshapedInput, 'float32', 'mean', backend); + const reshapedOutput = Object(_kernels_Reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])({ inputs: { x: reduced }, attrs: { shape: outShape }, backend }); + backend.disposeIntermediateTensorInfo(reshapedInput); + backend.disposeIntermediateTensorInfo(reduced); + return reshapedOutput; +} +//# sourceMappingURL=Mean_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js ***! + \*******************************************************************************/ +/*! exports provided: mirrorPadKernelFunc, mirrorPadConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mirrorPadKernelFunc", function() { return mirrorPadKernelFunc; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mirrorPadConfig", function() { return mirrorPadConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _mirror_pad_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mirror_pad_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js"); +/* harmony import */ var _mirror_pad_packed_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mirror_pad_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const mirrorPadKernelFunc = ({ inputs, backend, attrs }) => { + const { x } = inputs; + const { paddings, mode } = attrs; + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? + new _mirror_pad_packed_gpu__WEBPACK_IMPORTED_MODULE_2__["MirrorPadPackedProgram"](x.shape, paddings, mode) : + new _mirror_pad_gpu__WEBPACK_IMPORTED_MODULE_1__["MirrorPadProgram"](x.shape, paddings, mode); + const output = backend.runWebGLProgram(program, [x], x.dtype); + return output; +}; +const mirrorPadConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["MirrorPad"], + backendName: 'webgl', + kernelFunc: mirrorPadKernelFunc, +}; +//# sourceMappingURL=MirrorPad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js ***! + \******************************************************************************/ +/*! exports provided: multiply, multiplyConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiply", function() { return multiply; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiplyConfig", function() { return multiplyConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _binaryop_complex_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../binaryop_complex_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js"); +/* harmony import */ var _binaryop_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../binaryop_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js"); +/* harmony import */ var _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../binaryop_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/* harmony import */ var _Complex__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Complex */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +const MUL = 'return a * b;'; +function multiply(args) { + const { inputs, backend } = args; + const { a, b } = inputs; + const dtype = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].upcastType(a.dtype, b.dtype); + if (a.dtype === 'complex64') { + const aData = backend.texData.get(a.dataId); + const bData = backend.texData.get(b.dataId); + const realProgram = new _binaryop_complex_gpu__WEBPACK_IMPORTED_MODULE_1__["BinaryOpComplexProgram"](_binaryop_complex_gpu__WEBPACK_IMPORTED_MODULE_1__["COMPLEX_MULTIPLY"].REAL, a.shape, b.shape); + const imagProgram = new _binaryop_complex_gpu__WEBPACK_IMPORTED_MODULE_1__["BinaryOpComplexProgram"](_binaryop_complex_gpu__WEBPACK_IMPORTED_MODULE_1__["COMPLEX_MULTIPLY"].IMAG, a.shape, b.shape); + const inputs = [ + { + dataId: aData.complexTensorInfos.real.dataId, + dtype: aData.complexTensorInfos.real.dtype, + shape: a.shape + }, + { + dataId: aData.complexTensorInfos.imag.dataId, + dtype: aData.complexTensorInfos.imag.dtype, + shape: a.shape + }, + { + dataId: bData.complexTensorInfos.real.dataId, + dtype: bData.complexTensorInfos.real.dtype, + shape: b.shape + }, + { + dataId: bData.complexTensorInfos.imag.dataId, + dtype: bData.complexTensorInfos.imag.dtype, + shape: b.shape + } + ]; + const realPart = backend.runWebGLProgram(realProgram, inputs, 'float32'); + const imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32'); + const complexOutput = Object(_Complex__WEBPACK_IMPORTED_MODULE_5__["complex"])({ inputs: { real: realPart, imag: imagPart }, backend }); + backend.disposeIntermediateTensorInfo(realPart); + backend.disposeIntermediateTensorInfo(imagPart); + // TODO(annxingyuan): CPU forwarding for complex inputs. + return complexOutput; + } + if (backend.shouldExecuteOnCPU([a, b])) { + const aData = backend.texData.get(a.dataId); + const bData = backend.texData.get(b.dataId); + const [outValues, outShape] = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_4__["multiplyImplCPU"])(a.shape, b.shape, aData.values, bData.values, dtype); + const out = backend.makeTensorInfo(outShape, dtype); + const outData = backend.texData.get(out.dataId); + outData.values = outValues; + return out; + } + let program; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK_BINARY_OPERATIONS')) { + program = new _binaryop_packed_gpu__WEBPACK_IMPORTED_MODULE_3__["BinaryOpPackedProgram"](MUL, a.shape, b.shape); + } + else { + program = new _binaryop_gpu__WEBPACK_IMPORTED_MODULE_2__["BinaryOpProgram"](MUL, a.shape, b.shape); + } + return backend.runWebGLProgram(program, [a, b], dtype); +} +const multiplyConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Multiply"], + backendName: 'webgl', + kernelFunc: multiply +}; +//# sourceMappingURL=Multiply.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV3Config", function() { return nonMaxSuppressionV3Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const nonMaxSuppressionV3Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NonMaxSuppressionV3"], + backendName: 'webgl', + kernelFunc: ({ inputs, backend, attrs }) => { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' + + 'Call tf.nonMaxSuppressionAsync() instead'); + const { boxes, scores } = inputs; + const { maxOutputSize, iouThreshold, scoreThreshold } = attrs; + const gpuBackend = backend; + const boxesVals = gpuBackend.readSync(boxes.dataId); + const scoresVals = gpuBackend.readSync(scores.dataId); + const maxOutputSizeVal = maxOutputSize; + const iouThresholdVal = iouThreshold; + const scoreThresholdVal = scoreThreshold; + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["kernel_impls"].nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal); + } +}; +//# sourceMappingURL=NonMaxSuppressionV3.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV4Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV4Config", function() { return nonMaxSuppressionV4Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const nonMaxSuppressionV4Impl = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["kernel_impls"].nonMaxSuppressionV4Impl; +const nonMaxSuppressionV4Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NonMaxSuppressionV4"], + backendName: 'webgl', + kernelFunc: ({ inputs, backend, attrs }) => { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' + + 'Call tf.nonMaxSuppressionAsync() instead'); + const { boxes, scores } = inputs; + const { maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize } = attrs; + const gpuBackend = backend; + const boxesVals = gpuBackend.readSync(boxes.dataId); + const scoresVals = gpuBackend.readSync(scores.dataId); + const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize); + return [selectedIndices, validOutputs]; + } +}; +//# sourceMappingURL=NonMaxSuppressionV4.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js ***! + \*****************************************************************************************/ +/*! exports provided: nonMaxSuppressionV5Config */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV5Config", function() { return nonMaxSuppressionV5Config; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const nonMaxSuppressionV5Impl = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["kernel_impls"].nonMaxSuppressionV5Impl; +const nonMaxSuppressionV5Config = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NonMaxSuppressionV5"], + backendName: 'webgl', + kernelFunc: ({ inputs, backend, attrs }) => { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' + + 'Call tf.nonMaxSuppressionAsync() instead'); + const { boxes, scores } = inputs; + const { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = attrs; + const gpuBackend = backend; + const boxesVals = gpuBackend.readSync(boxes.dataId); + const scoresVals = gpuBackend.readSync(scores.dataId); + const maxOutputSizeVal = maxOutputSize; + const iouThresholdVal = iouThreshold; + const scoreThresholdVal = scoreThreshold; + const softNmsSigmaVal = softNmsSigma; + const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal); + return [selectedIndices, selectedScores]; + } +}; +//# sourceMappingURL=NonMaxSuppressionV5.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js ***! + \******************************************************************************/ +/*! exports provided: notEqual, notEqualConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqual", function() { return notEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notEqualConfig", function() { return notEqualConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const NOT_EQUAL = `return float(a != b);`; +const notEqual = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["binaryKernelFunc"])({ opSnippet: NOT_EQUAL, dtype: 'bool' }); +const notEqualConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["NotEqual"], + backendName: 'webgl', + kernelFunc: notEqual, +}; +//# sourceMappingURL=NotEqual.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js ***! + \**************************************************************************/ +/*! exports provided: real, realConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "real", function() { return real; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "realConfig", function() { return realConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +function real(args) { + const { inputs, backend } = args; + const { input } = inputs; + const inputData = backend.texData.get(input.dataId); + return Object(_Identity__WEBPACK_IMPORTED_MODULE_1__["identity"])({ inputs: { x: inputData.complexTensorInfos.real }, backend }); +} +const realConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Real"], + backendName: 'webgl', + kernelFunc: real +}; +//# sourceMappingURL=Real.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js ***! + \*****************************************************************************/ +/*! exports provided: reshape, reshapeConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshape", function() { return reshape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshapeConfig", function() { return reshapeConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_reshape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/reshape */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function reshape(args) { + const { inputs, backend, attrs } = args; + const { x } = inputs; + const { shape } = attrs; + const webglBackend = backend; + const xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shape); + const $shape = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].inferFromImplicitShape(shape, xSize); + const $xSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape($shape); + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(xSize === $xSize, () => `The new shape (${$shape}) has ${$xSize} elements and the old ` + + `shape (${x.shape}) has ${xSize} elements. The new shape and old ` + + `shape must have the same number of elements.`); + const xTexData = webglBackend.texData.get(x.dataId); + if (xTexData.isPacked && !Object(_webgl_util__WEBPACK_IMPORTED_MODULE_2__["isReshapeFree"])(x.shape, $shape) && + !(xTexData.texture !== null && Object(_webgl_util__WEBPACK_IMPORTED_MODULE_2__["isReshapeFree"])(xTexData.shape, $shape))) { + return Object(_kernel_utils_reshape__WEBPACK_IMPORTED_MODULE_1__["packedReshape"])(x, $shape, webglBackend); + } + webglBackend.incRef(x.dataId); + return { dataId: x.dataId, shape: $shape, dtype: x.dtype }; +} +const reshapeConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Reshape"], + backendName: 'webgl', + kernelFunc: reshape +}; +//# sourceMappingURL=Reshape.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js ***! + \**************************************************************************************/ +/*! exports provided: rotateWithOffsetConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateWithOffsetConfig", function() { return rotateWithOffsetConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _rotate_gpu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../rotate_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const rotateWithOffsetConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["RotateWithOffset"], + backendName: 'webgl', + kernelFunc: ({ inputs, attrs, backend }) => { + const { image } = inputs; + const { radians, fillValue, center } = attrs; + const webglBackend = backend; + const program = new _rotate_gpu__WEBPACK_IMPORTED_MODULE_1__["RotateProgram"](image.shape, radians, fillValue, center); + const output = webglBackend.runWebGLProgram(program, [image], image.dtype); + return output; + } +}; +//# sourceMappingURL=RotateWithOffset.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js ***! + \*************************************************************************/ +/*! exports provided: sin, sinConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinConfig", function() { return sinConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const SIN = _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["CHECK_NAN_SNIPPET_UNARY"] + ` + return sin(x); +`; +const sin = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(SIN); +const sinConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sin"], + backendName: 'webgl', + kernelFunc: sin, +}; +//# sourceMappingURL=Sin.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js ***! + \****************************************************************************/ +/*! exports provided: square, squareConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "square", function() { return square; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squareConfig", function() { return squareConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const SQUARE = `return x * x;`; +const square = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(SQUARE); +const squareConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Square"], + backendName: 'webgl', + kernelFunc: square, +}; +//# sourceMappingURL=Square.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js ***! + \***************************************************************************************/ +/*! exports provided: squaredDifference, squaredDifferenceConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifference", function() { return squaredDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceConfig", function() { return squaredDifferenceConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const SQUARED_DIFFERENCE = 'return (a - b) * (a - b);'; +const squaredDifference = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["binaryKernelFunc"])({ opSnippet: SQUARED_DIFFERENCE, packedOpSnippet: SQUARED_DIFFERENCE }); +const squaredDifferenceConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["SquaredDifference"], + backendName: 'webgl', + kernelFunc: squaredDifference, +}; +//# sourceMappingURL=SquaredDifference.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js ***! + \*************************************************************************/ +/*! exports provided: subKernelFunc, subConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subKernelFunc", function() { return subKernelFunc; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subConfig", function() { return subConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const SUB = 'return a - b;'; +const subKernelFunc = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["binaryKernelFunc"])({ + opSnippet: SUB, + packedOpSnippet: SUB, + supportsComplex: true, + cpuKernelImpl: _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_2__["subImplCPU"] +}); +const subConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Sub"], + backendName: 'webgl', + kernelFunc: subKernelFunc +}; +//# sourceMappingURL=Sub.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js ***! + \*************************************************************************/ +/*! exports provided: tan, tanConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tan", function() { return tan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanConfig", function() { return tanConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/kernel_funcs_utils */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const TAN = `return tan(x);`; +const tan = Object(_kernel_utils_kernel_funcs_utils__WEBPACK_IMPORTED_MODULE_1__["unaryKernelFunc"])(TAN); +const tanConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Tan"], + backendName: 'webgl', + kernelFunc: tan, +}; +//# sourceMappingURL=Tan.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js ***! + \*******************************************************************************/ +/*! exports provided: transposeConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transposeConfig", function() { return transposeConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _Transpose_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Transpose_impl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const transposeConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Transpose"], + backendName: 'webgl', + kernelFunc: ({ inputs, attrs, backend }) => { + const { x } = inputs; + const { perm } = attrs; + const webglBackend = backend; + const xRank = x.shape.length; + const newShape = new Array(xRank); + for (let i = 0; i < newShape.length; i++) { + newShape[i] = x.shape[perm[i]]; + } + let out; + if (webglBackend.shouldExecuteOnCPU([x])) { + const xTexData = webglBackend.texData.get(x.dataId); + const values = xTexData.values; + const outValues = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_1__["transposeImplCPU"])(values, x.shape, x.dtype, perm, newShape); + out = webglBackend.makeTensorInfo(newShape, x.dtype); + const outData = webglBackend.texData.get(out.dataId); + outData.values = outValues; + } + else { + out = Object(_Transpose_impl__WEBPACK_IMPORTED_MODULE_1__["transposeImpl"])(x, perm, webglBackend); + } + return out; + } +}; +//# sourceMappingURL=Transpose.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js ***! + \************************************************************************************/ +/*! exports provided: transposeImpl, transposeImplCPU */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transposeImpl", function() { return transposeImpl; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transposeImplCPU", function() { return _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_1__["transposeImplCPU"]; }); + +/* harmony import */ var _transpose_gpu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../transpose_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js"); +/* harmony import */ var _transpose_packed_gpu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../transpose_packed_gpu */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_packed_gpu.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +function transposeImpl(x, perm, backend) { + const program = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ? + new _transpose_packed_gpu__WEBPACK_IMPORTED_MODULE_3__["TransposePackedProgram"](x.shape, perm) : + new _transpose_gpu__WEBPACK_IMPORTED_MODULE_2__["TransposeProgram"](x.shape, perm); + return backend.runWebGLProgram(program, [x], x.dtype); +} + +//# sourceMappingURL=Transpose_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js ***! + \****************************************************************************/ +/*! exports provided: unique, uniqueConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unique", function() { return unique; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uniqueConfig", function() { return uniqueConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernel_utils_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_utils/shared */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js"); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function unique(args) { + const { inputs, attrs, backend } = args; + const { axis } = attrs; + const { x } = inputs; + Object(_webgl_util__WEBPACK_IMPORTED_MODULE_2__["assertNotComplex"])(x, 'unique'); + // For now, always forward calculation to the CPU backend. + console.warn('WARNING: ', 'UI might be locked temporarily as data is being downloaded'); + const values = backend.readSync(x.dataId); + const { outputValues, outputShape, indices } = Object(_kernel_utils_shared__WEBPACK_IMPORTED_MODULE_1__["uniqueImplCPU"])(values, axis, x.shape, x.dtype); + return [ + backend.makeTensorInfo(outputShape, x.dtype, outputValues), + backend.makeTensorInfo([indices.length], 'int32', indices), + ]; +} +const uniqueConfig = { + kernelName: _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["Unique"], + backendName: 'webgl', + kernelFunc: unique, +}; +//# sourceMappingURL=Unique.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js ***! + \*********************************************************************/ +/*! exports provided: LRNProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LRNProgram", function() { return LRNProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class LRNProgram { + constructor(xShape, radius, bias, alpha, beta) { + this.variableNames = ['x']; + this.outputShape = []; + const rad = radius; + const maxD = xShape[3] - 1; + this.outputShape = xShape; + // optimize pow(bias + alpha * sum, -beta) + // src: https://github.com/tensorflow/tensorflow/.. + // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/.. + // tensorflow/core/kernels/mkl_lrn_op.cc#L320 + let powOperator; + const basis = `float(${bias}) + float(${alpha}) * sum`; + if (beta === 0.5) { + powOperator = `inversesqrt(${basis})`; + } + else if (beta === 1.0) { + powOperator = `1.0/(${basis})`; + } + else { + powOperator = `exp(log(${basis}) * float(-${beta}));`; + } + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + int d = coords[3]; + float x = getX(b, r, c, d); + float sum = 0.0; + for (int j = -${rad}; j <= ${rad}; j++) { + int idx = d + j; + if (idx >= 0 && idx <= ${maxD}) { + float z = getX(b, r, c, idx); + sum += z * z; + } + } + float val = x * ${powOperator}; + setOutput(val); + } + `; + } +} +//# sourceMappingURL=lrn_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js ***! + \**************************************************************************/ +/*! exports provided: LRNGradProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LRNGradProgram", function() { return LRNGradProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class LRNGradProgram { + constructor(inputShape, depthRadius, bias, alpha, beta) { + this.variableNames = ['inputImage', 'outputImage', 'dy']; + this.outputShape = []; + this.outputShape = inputShape; + this.depth = inputShape[3]; + this.depthRadius = depthRadius; + this.bias = bias; + this.alpha = alpha; + this.beta = beta; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int r = coords[1]; + int c = coords[2]; + + float result = 0.0; + for (int d = 0; d < ${this.depth}; ++d) { + int depthBegin = int(max(0.0, float(d - ${depthRadius}))); + int depthEnd = int(min(float(${this.depth}), + float(d + ${depthRadius} + 1))); + + const int MIN_DEPTH_BEGIN = 0; + const int MAX_DEPTH_END = ${this.depth}; + + float norm = 0.0; + for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) { + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd) { + norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k); + } + else { + break; + } + } + + norm = float(${alpha}) * norm + float(${bias}); + + for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){ + if (k < depthBegin){ + continue; + } + else if (k >= depthBegin && k < depthEnd){ + float dyi = -2.0 * float(${alpha}) + * float(${beta}) + * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d) + / norm; + if (k == d) { + dyi += pow(norm, -1.0 * ${beta}); + } + if (k == coords[3]) { + dyi *= getDy(b, r, c, d); + result += dyi; + } + } + else { + break; + } + } + } + setOutput(result); + } + `; + } +} +//# sourceMappingURL=lrn_grad_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js ***! + \****************************************************************************/ +/*! exports provided: LRNPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LRNPackedProgram", function() { return LRNPackedProgram; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class LRNPackedProgram { + constructor(xShape, radius, bias, alpha, beta) { + this.variableNames = ['x']; + this.outputShape = []; + this.packedInputs = true; + this.packedOutput = true; + const rad = radius; + const maxD = xShape[3] - 1; + this.outputShape = xShape; + // optimize pow(bias + alpha * sum, -beta) + // src: https://github.com/tensorflow/tensorflow/.. + // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/.. + // tensorflow/core/kernels/mkl_lrn_op.cc#L320 + let powOperator; + const basis = `float(${bias}) + float(${alpha}) * sum`; + if (beta === 0.5) { + powOperator = `inversesqrt(${basis})`; + } + else if (beta === 1.0) { + powOperator = `1.0/(${basis})`; + } + else { + powOperator = `exp(log(${basis}) * float(-${beta}));`; + } + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords.x; + int r = coords.y; + int c = coords.z; + int d = coords.w; + + bool hasNextCol = d < ${this.outputShape[3]}; + bool hasNextRow = c < ${this.outputShape[2]}; + + vec4 sum = vec4(0.); + vec4 xFragAtOutputCoords = getX(b, r, c, d); + + vec4 xAtOutputCoords = vec4( + getChannel(xFragAtOutputCoords, vec2(c, d)), + hasNextCol ? + getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0, + hasNextRow ? + getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0, + (hasNextRow && hasNextCol) ? + getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0 + ); + + int firstChannel = d - ${rad}; + vec2 cache = vec2(0.); + if(firstChannel >= 0){ + vec4 firstChannelFrag = getX(b, r, c, firstChannel); + cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel)); + if(hasNextRow){ + cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel)); + } + } + + ivec2 depth = ivec2(d, d + 1); + for (int j = - ${rad}; j <= ${rad}; j++) { + ivec2 idx = depth + j; + bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0)); + bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${maxD})); + + bool depthInRange = aboveLowerBound.x && belowUpperBound.x; + bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y; + + if(depthInRange || depthPlusOneInRange){ + vec4 z = vec4(0.); + vec4 xFragAtCurrentDepth; + z.xz = cache.xy; + if(depthPlusOneInRange && hasNextCol){ + xFragAtCurrentDepth = idx.y != d ? + getX(b, r, c, idx.y) : xFragAtOutputCoords; + z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y)); + if(hasNextRow){ + z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y)); + } + } + cache.xy = z.yw; + sum += z * z; + } + } + vec4 result = xAtOutputCoords * ${powOperator}; + setOutput(result); + } + `; + } +} +//# sourceMappingURL=lrn_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: MaxPool2DBackpropProgram, MaxPool3DBackpropProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPool2DBackpropProgram", function() { return MaxPool2DBackpropProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPool3DBackpropProgram", function() { return MaxPool3DBackpropProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class MaxPool2DBackpropProgram { + constructor(convInfo) { + this.variableNames = ['dy', 'maxPos']; + this.outputShape = convInfo.inShape; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const lastIndex = effectiveFilterHeight * effectiveFilterWidth - 1; + this.userCode = ` + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + + ivec2 dyRCCorner = coords.yz - pads; + int dyRCorner = dyRCCorner.x; + int dyCCorner = dyRCCorner.y; + + // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${effectiveFilterWidth}; wC++) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(b, idyR, idyC, d); + int maxPosValue = ${lastIndex} - int(getMaxPos(b, idyR, idyC, d)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = wR * ${effectiveFilterWidth} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + setOutput(dotProd); + } + `; + } +} +class MaxPool3DBackpropProgram { + constructor(convInfo) { + this.variableNames = ['dy', 'maxPos']; + this.outputShape = convInfo.inShape; + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front; + const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top; + const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left; + const lastIndex = effectiveFilterDepth * effectiveFilterHeight * effectiveFilterWidth - 1; + this.userCode = ` + const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads; + int dyDCorner = dyCorner.x; + int dyRCorner = dyCorner.y; + int dyCCorner = dyCorner.z; + + // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get + // dx(xD, xR, xC, ch). + // ? = to be determined. : = across all values in that axis. + float dotProd = 0.0; + + for (int wD = 0; wD < ${effectiveFilterDepth}; + wD += ${dilationDepth}) { + float dyD = float(dyDCorner + wD) / ${strideDepth}.0; + + if (dyD < 0.0 || dyD >= ${convInfo.outDepth}.0 || fract(dyD) > 0.0) { + continue; + } + int idyD = int(dyD); + + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + float dyR = float(dyRCorner + wR) / ${strideHeight}.0; + + if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || + fract(dyR) > 0.0) { + continue; + } + int idyR = int(dyR); + + for (int wC = 0; wC < ${effectiveFilterWidth}; + wC += ${dilationWidth}) { + float dyC = float(dyCCorner + wC) / ${strideWidth}.0; + + if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 || + fract(dyC) > 0.0) { + continue; + } + int idyC = int(dyC); + + float dyValue = getDy(batch, idyD, idyR, idyC, ch); + int maxPosValue = ${lastIndex} - + int(getMaxPos(batch, idyD, idyR, idyC, ch)); + + // Get the current value, check it against the value from the + // position matrix. + int curPosValue = + wD * ${effectiveFilterHeight} * ${effectiveFilterWidth} + + wR * ${effectiveFilterWidth} + wC; + float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0); + + dotProd += dyValue * mask; + } + } + } + setOutput(dotProd); + } + `; + } +} +//# sourceMappingURL=max_pool_backprop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js ***! + \**********************************************************************/ +/*! exports provided: MeanProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MeanProgram", function() { return MeanProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class MeanProgram { + constructor(reduceInfo, divisor) { + this.variableNames = ['x']; + const { windowSize, batchSize, inSize, outSize } = reduceInfo; + this.outputShape = [batchSize, outSize]; + const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4; + const windowSizeVec4Remainder = windowSize % 4; + let updateSnippet = `sumValue += dot(values, ones);`; + if (divisor != null) { + const denominator = 1 / divisor; + updateSnippet = `sumValue += dot(values * ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].isInt(denominator) ? denominator.toPrecision(2) : + denominator}, ones);`; + } + let checkOutOfBounds = ''; + if (inSize % windowSize > 0) { + checkOutOfBounds = ` + if (inIdx < 0 || inIdx >= ${inSize}) { + return 0.0; + } + `; + } + this.userCode = ` + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${checkOutOfBounds} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${windowSize}; + + float sumValue = 0.0; + + for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${updateSnippet} + } + + int inIdx = inOffset + ${windowSizeNearestVec4}; + if (${windowSizeVec4Remainder === 1}) { + vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0); + + ${updateSnippet} + } else if (${windowSizeVec4Remainder === 2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), 0.0, 0.0); + + ${updateSnippet} + } else if (${windowSizeVec4Remainder === 3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), 0.0); + + ${updateSnippet} + } + setOutput(sumValue); + } + `; + } +} +//# sourceMappingURL=mean_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js ***! + \****************************************************************************/ +/*! exports provided: MirrorPadProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MirrorPadProgram", function() { return MirrorPadProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class MirrorPadProgram { + constructor(xShape, paddings, mode) { + this.variableNames = ['x']; + this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */); + const rank = xShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(rank); + const start = paddings.map(p => p[0]).join(','); + const end = paddings.map((p, i) => p[0] + xShape[i]).join(','); + const unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank); + const offset = mode === 'reflect' ? 0 : 1; + if (rank === 1) { + this.userCode = ` + int start = ${start}; + int end = ${end}; + + void main() { + int outC = getOutputCoords(); + if (outC < start) { + outC = start * 2 - outC - ${offset}; + } else if(outC >= end) { + outC = (end - 1) * 2 - outC + ${offset}; + } + setOutput(getX(outC - start)); + } + `; + return; + } + this.userCode = ` + ${dtype} start = ${dtype}(${start}); + ${dtype} end = ${dtype}(${end}); + + void main() { + ${dtype} outC = getOutputCoords(); + for (int i = 0; i < ${rank}; i++) { + if (outC[i] < start[i]) { + outC[i] = start[i] * 2 - outC[i] - ${offset}; + } else if(outC[i] >= end[i]) { + outC[i] = (end[i] - 1) * 2 - outC[i] + ${offset}; + } + } + ${dtype} coords = outC - start; + setOutput(getX(${unpackedCoords})); + } + `; + } +} +//# sourceMappingURL=mirror_pad_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js ***! + \***********************************************************************************/ +/*! exports provided: MirrorPadPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MirrorPadPackedProgram", function() { return MirrorPadPackedProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +/** + * Example shader code for + * `mirrorPad(tf.tensor1d([1, 2, 3], 'int32'), [[2, 2]], 'reflect')` + * ``` + * const int start = int(2); + * const int end = int(5); + * + * void main() { + * int outputLoc = getOutputCoords(); + * vec4 result = vec4(0.); + * + * int rc = outputLoc; + * + * int source = rc; + * if (source < start) { + * source = start * 2 - source - 0; + * } else if (source >= end) { + * source = (end - 1) * 2 - source + 0; + * } + * source -= start; + * + * result[0] = getChannel(getX(source), source); + * rc += 1; + * if(rc < 6) { + * int source = rc; + * if (source < start) { + * source = start * 2 - source - 0; + * } else if (source >= end) { + * source = (end - 1) * 2 - source + 0; + * } + * source -= start; + * + * result[1] = getChannel(getX(source), source); + * } + * + * setOutput(result); + * } + * ``` + */ +class MirrorPadPackedProgram { + constructor(xShape, paddings, mode) { + this.variableNames = ['x']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */); + const rank = xShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(rank); + const start = paddings.map(p => p[0]).join(','); + const end = paddings.map((p, i) => p[0] + xShape[i]).join(','); + const coords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('rc', rank); + const source = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('source', rank); + const cLimit = `${coords[rank - 1]} < ${this.outputShape[rank - 1]}`; + const innerDims = rank === 1 ? 'source' : `vec2(${source.slice(-2).join()})`; + const offset = mode === 'reflect' ? 0 : 1; + let mainLoop = ''; + if (rank === 1) { + const padSetup = ` + ${dtype} source = rc; + if (source < start) { + source = start * 2 - source - ${offset}; + } else if (source >= end) { + source = (end - 1) * 2 - source + ${offset}; + } + source -= start; + `; + mainLoop = ` + ${dtype} rc = outputLoc; + ${padSetup} + result[0] = getChannel(getX(${source.join()}), ${innerDims}); + ${coords[rank - 1]} += 1; + if(${cLimit}) { + ${padSetup} + result[1] = getChannel(getX(${source.join()}), ${innerDims}); + } + `; + } + else { + const padSetup = ` + ${dtype} source = rc; + ${dtype} lt = ${dtype}(lessThan(source, start)); + ${dtype} gte = ${dtype}(greaterThanEqual(source, end)); + ${dtype} orig = 1 - (lt + gte); + source = orig * source + + lt * (start * 2 - source - ${offset}) + + gte * ((end - 1) * 2 - source + ${offset}); + source -= start; + `; + mainLoop = ` + ${dtype} rc = outputLoc; + ${padSetup} + result[0] = getChannel(getX(${source.join()}), ${innerDims}); + ${coords[rank - 1]} += 1; + if(${cLimit}) { + ${padSetup} + result[1] = getChannel(getX(${source.join()}), ${innerDims}); + } + rc = outputLoc; + ${coords[rank - 2]} += 1; + if(${coords[rank - 2]} < ${this.outputShape[rank - 2]}) { + ${padSetup} + result[2] = getChannel(getX(${source.join()}), ${innerDims}); + ${coords[rank - 1]} += 1; + if(${cLimit}) { + ${padSetup} + result[3] = getChannel(getX(${source.join()}), ${innerDims}); + } + } + `; + } + this.userCode = ` + const ${dtype} start = ${dtype}(${start}); + const ${dtype} end = ${dtype}(${end}); + + void main() { + ${dtype} outputLoc = getOutputCoords(); + vec4 result = vec4(0.); + ${mainLoop} + setOutput(result); + } + `; + } +} +//# sourceMappingURL=mirror_pad_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: MatMulPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatMulPackedProgram", function() { return MatMulPackedProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class MatMulPackedProgram { + constructor(aShape, bShape, outputShape, transposeA = false, transposeB = false, addBias = false, activation = null, hasPreluActivation = false) { + this.variableNames = ['matrixA', 'matrixB']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = outputShape; + const sharedDim = transposeA ? aShape[1] : aShape[2]; + const sharedDimensionPacked = Math.ceil(sharedDim / 2); + const aSample = transposeA ? 'i * 2, rc.y' : 'rc.y, i * 2'; + const bSample = transposeB ? 'rc.z, i * 2' : 'i * 2, rc.z'; + const aSwizzle = transposeA ? ['a.xxyy', 'a.zzww'] : ['a.xxzz', 'a.yyww']; + const bSwizzle = transposeB ? ['b.xzxz', 'b.ywyw'] : ['b.xyxy', 'b.zwzw']; + let activationSnippet = '', applyActivationSnippet = ''; + if (activation) { + if (hasPreluActivation) { + activationSnippet = `vec4 activation(vec4 a) { + vec4 b = getPreluActivationWeightsAtOutCoords(); + ${activation} + }`; + } + else { + activationSnippet = `vec4 activation(vec4 x) { + ${activation} + }`; + } + applyActivationSnippet = `result = activation(result);`; + } + const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : ''; + if (addBias) { + this.variableNames.push('bias'); + } + if (hasPreluActivation) { + this.variableNames.push('preluActivationWeights'); + } + let batchASnippet = 'rc.x'; + let batchBSnippet = 'rc.x'; + if (aShape[0] < bShape[0]) { + batchASnippet = `int(min(float(rc.x), ${aShape[0] - 1}.))`; + } + else if (bShape[0] < aShape[0]) { + batchBSnippet = `int(min(float(rc.x), ${bShape[0] - 1}.))`; + } + this.userCode = ` + ${activationSnippet} + + const float sharedDimension = ${sharedDimensionPacked}.0; + + vec4 dot2x2ARowBCol(ivec3 rc) { + vec4 result = vec4(0); + for (int i = 0; i < ${sharedDimensionPacked}; i++) { + int batchA = ${batchASnippet}; + int batchB = ${batchBSnippet}; + vec4 a = getMatrixA(batchA, ${aSample}); + vec4 b = getMatrixB(batchB, ${bSample}); + + // These swizzled products need to be separately added. + // See: https://github.com/tensorflow/tfjs/issues/1735 + result += (${aSwizzle[0]} * ${bSwizzle[0]}); + result += (${aSwizzle[1]} * ${bSwizzle[1]}); + } + return result; + } + + void main() { + ivec3 rc = getOutputCoords(); + vec4 result = dot2x2ARowBCol(rc); + + ${addBiasSnippet} + + ${applyActivationSnippet} + + setOutput(result); + } + `; + } +} +//# sourceMappingURL=mulmat_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js ***! + \*****************************************************************************/ +/*! exports provided: MultinomialProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MultinomialProgram", function() { return MultinomialProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class MultinomialProgram { + constructor(batchSize, numOutcomes, numSamples) { + this.variableNames = ['probs']; + this.outputShape = [batchSize, numSamples]; + this.userCode = ` + uniform float seed; + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + + float r = random(seed); + float cdf = 0.0; + + for (int i = 0; i < ${numOutcomes - 1}; i++) { + cdf += getProbs(batch, i); + + if (r < cdf) { + setOutput(float(i)); + return; + } + } + + // If no other event happened, last event happened. + setOutput(float(${numOutcomes - 1})); + } + `; + } + getCustomSetupFunc(seed) { + return (gpgpu, webGLProgram) => { + if (this.seedLoc == null) { + this.seedLoc = gpgpu.getUniformLocation(webGLProgram, 'seed'); + } + gpgpu.gl.uniform1f(this.seedLoc, seed); + }; + } +} +//# sourceMappingURL=multinomial_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js ***! + \************************************************************************/ +/*! exports provided: OneHotProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OneHotProgram", function() { return OneHotProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class OneHotProgram { + constructor(numIndices, depth, onValue, offValue) { + this.variableNames = ['indices']; + this.outputShape = [numIndices, depth]; + this.userCode = ` + void main() { + ivec2 coords = getOutputCoords(); + int index = round(getIndices(coords.x)); + setOutput(mix(float(${offValue}), float(${onValue}), + float(index == coords.y))); + } + `; + } +} +//# sourceMappingURL=onehot_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js ***! + \**********************************************************************/ +/*! exports provided: PackProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PackProgram", function() { return PackProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class PackProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.packedInputs = false; + this.packedOutput = true; + // Only input / output 3D tensors. + this.outputShape = outputShape; + const rank = outputShape.length; + if (rank === 0) { + this.userCode = ` + void main() { + setOutput(vec4(getA(), 0., 0., 0.)); + } + `; + } + else { + const channels = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('rc', rank); + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(rank); + const outOfBoundsCondition = getOutOfBoundsCondition(rank, outputShape, channels); + const setup = getSetup(rank, outputShape[outputShape.length - 1], outputShape[outputShape.length - 2], channels); + const output = getOutput(outputShape, channels); + this.userCode = ` + void main() { + ${dtype} rc = getOutputCoords(); + + if(${outOfBoundsCondition}) { + setOutput(vec4(0)); + } else { + ${setup} + + setOutput(vec4(${output})); + } + } + `; + } + } +} +function getSourceCoordsArr(rank, dims) { + const coords = []; + for (let row = 0; row <= 1; row++) { + for (let col = 0; col <= 1; col++) { + let coord = `${row === 0 ? 'r' : 'rp1'}, ${col === 0 ? 'c' : 'cp1'}`; + for (let d = 2; d < rank; d++) { + coord = `${dims[dims.length - 1 - d]},` + coord; + } + coords.push(coord); + } + } + return coords; +} +function getOutOfBoundsCondition(rank, shape, dims) { + if (rank === 1) { + return `rc > ${shape[0]}`; + } + let cond = ''; + for (let i = rank - 2; i < rank; i++) { + cond += `${dims[i]} >= ${shape[i]}`; + if (i < rank - 1) { + cond += '||'; + } + } + return cond; +} +function getSetup(rank, cols, rows, dims) { + if (rank === 1) { + return ''; + } + const innerDims = dims.slice(-2); + return ` + int r = ${innerDims[0]}; + int c = ${innerDims[1]}; + int rp1 = r + 1; + int cp1 = c + 1; + + bool cEdge = cp1 >= ${cols}; + bool rEdge = rp1 >= ${rows}; + `; +} +function getOutput(shape, dims) { + const rank = shape.length; + const sourceCoords = getSourceCoordsArr(rank, dims); + if (rank === 1) { + return `getA(rc), + rc + 1 >= ${shape[0]} ? 0. : getA(rc + 1), + 0, 0`; + } + return `getA(${sourceCoords[0]}), + cEdge ? 0. : getA(${sourceCoords[1]}), + rEdge ? 0. : getA(${sourceCoords[2]}), + rEdge || cEdge ? 0. : getA(${sourceCoords[3]})`; +} +//# sourceMappingURL=pack_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js ***! + \**************************************************************************/ +/*! exports provided: getVecChannels, getChannels, getSourceCoords */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVecChannels", function() { return getVecChannels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getChannels", function() { return getChannels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSourceCoords", function() { return getSourceCoords; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function getVecChannels(name, rank) { + return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank).map(d => `${name}.${d}`); +} +function getChannels(name, rank) { + if (rank === 1) { + return [name]; + } + return getVecChannels(name, rank); +} +function getSourceCoords(rank, dims) { + if (rank === 1) { + return 'rc'; + } + let coords = ''; + for (let i = 0; i < rank; i++) { + coords += dims[i]; + if (i < rank - 1) { + coords += ','; + } + } + return coords; +} +//# sourceMappingURL=packing_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js ***! + \*********************************************************************/ +/*! exports provided: PadProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PadProgram", function() { return PadProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class PadProgram { + constructor(xShape, paddings, constantValue) { + this.variableNames = ['x']; + this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */); + const rank = xShape.length; + const type = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(rank); + const start = paddings.map(p => p[0]).join(','); + const end = paddings.map((p, i) => p[0] + xShape[i]).join(','); + const unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank); + if (rank === 1) { + this.userCode = ` + int start = ${start}; + int end = ${end}; + + void main() { + int outC = getOutputCoords(); + if (outC < start || outC >= end) { + setOutput(float(${constantValue})); + } else { + setOutput(getX(outC - start)); + } + } + `; + return; + } + this.userCode = ` + ${type} start = ${type}(${start}); + ${type} end = ${type}(${end}); + + void main() { + ${type} outC = getOutputCoords(); + if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) { + setOutput(float(${constantValue})); + } else { + ${type} coords = outC - start; + setOutput(getX(${unpackedCoords})); + } + } + `; + } +} +//# sourceMappingURL=pad_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js ***! + \****************************************************************************/ +/*! exports provided: PadPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PadPackedProgram", function() { return PadPackedProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class PadPackedProgram { + constructor(xShape, paddings, constantValue) { + this.variableNames = ['x']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */); + const rank = xShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(rank); + const start = paddings.map(p => p[0]).join(','); + const end = paddings.map((p, i) => p[0] + xShape[i]).join(','); + const coords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('rc', rank); + const source = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('source', rank); + const cLimit = `${coords[rank - 1]} < ${this.outputShape[rank - 1]}`; + const innerDims = rank === 1 ? 'source' : `vec2(${source.slice(-2).join()})`; + const componentSetup = [ + `${dtype} rc = outputLoc;`, `${coords[rank - 1]} += 1; + if(${cLimit}) { + `, + rank === 1 ? '' : `} + rc = outputLoc; + ${coords[rank - 2]} += 1; + if(${coords[rank - 2]} < ${this.outputShape[rank - 2]}) {`, + rank === 1 ? '' : ` ${coords[rank - 1]} += 1; + if(${cLimit}) {` + ]; + const paddingArea = rank === 1 ? + 'rc < start || rc >= end' : + 'any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))'; + let mainLoop = ''; + for (let i = 0, j = rank === 1 ? 2 : 4; i < j; i++) { + mainLoop += ` + ${componentSetup[i]} + if (${paddingArea}) { + result[${i}] = float(${constantValue}); + } else { + ${dtype} source = rc - start; + result[${i}] = getChannel(getX(${source.join()}), ${innerDims}); + } + `; + } + mainLoop += (rank === 1 ? `} ` : `}}`); + this.userCode = ` + const ${dtype} start = ${dtype}(${start}); + const ${dtype} end = ${dtype}(${end}); + + void main() { + ${dtype} outputLoc = getOutputCoords(); + vec4 result = vec4(0.); + ${mainLoop} + setOutput(result); + } + `; + } +} +//# sourceMappingURL=pad_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js ***! + \**********************************************************************/ +/*! exports provided: Pool2DProgram, Pool3DProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Pool2DProgram", function() { return Pool2DProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Pool3DProgram", function() { return Pool3DProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class Pool2DProgram { + constructor(convInfo, poolType, computePositions, flattenPositions = false, includeBatchInIndex = false) { + this.variableNames = ['x']; + if (poolType === 'avg' && computePositions) { + throw new Error('Cannot compute positions for average pool.'); + } + const filterWidth = convInfo.filterWidth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + this.outputShape = convInfo.outShape; + const isAvgPool = poolType === 'avg'; + const batchFlattenPositionStr = `((batch * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + d`; + const flattenPositionStr = `(xR * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + d`; + let initializationValue = '0.0'; + if (!isAvgPool) { + // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps. + initializationValue = '-1.0 / 1e-20'; + } + if (computePositions) { + const compareOp = '>='; + this.userCode = ` + const ivec2 strides = ivec2(${strideHeight}, ${strideWidth}); + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + float avgValue = 0.0; + + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${effectiveFilterWidth}; + wC += ${dilationWidth}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + float value = getX(batch, xR, xC, d); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${compareOp} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${flattenPositions ? (includeBatchInIndex ? batchFlattenPositionStr : + flattenPositionStr) : + `wR * ${effectiveFilterWidth} + wC`}; + } + } + } + setOutput(float(minMaxPosition)); + } + `; + return; + } + const compareOp = 'max'; + let returnValue = `${poolType}(${poolType}(${poolType}(` + + 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])'; + if (poolType === 'avg') { + returnValue = `avgValue / count`; + } + const filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4; + const filterWidthVec4Remainder = filterWidth % 4; + const updateSnippet = ` + if (${isAvgPool}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${compareOp}(values, minMaxValue); + } + `; + this.userCode = ` + const ivec2 strides = ivec2(${strideHeight}, ${strideWidth}); + const ivec2 pads = ivec2(${padTop}, ${padLeft}); + const float initializationValue = ${initializationValue}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xR, int xC, int d) { + if (xC < 0 || xC >= ${convInfo.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xR, xC, d); + } + + void main() { + ivec4 coords = getOutputCoords(); + int batch = coords[0]; + int d = coords[3]; + + ivec2 xRCCorner = coords.yz * strides - pads; + int xRCorner = xRCCorner.x; + int xCCorner = xRCCorner.y; + + // max/min x(?, ?, d) to get y(yR, yC, d). + // ? = to be determined + vec4 minMaxValue = vec4(${initializationValue}); + float avgValue = 0.0; + count = 0.0; + + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${filterWidthNearestVec4}; wC += 4) { + int xC = xCCorner + wC * ${dilationWidth}; + + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${dilationWidth}, d), + getValue(batch, xR, xC + 2 * ${dilationWidth}, d), + getValue(batch, xR, xC + 3 * ${dilationWidth}, d) + ); + + ${updateSnippet} + } + + int xC = xCCorner + ${filterWidthNearestVec4}; + if (${filterWidthVec4Remainder === 1}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + initializationValue, + initializationValue, + initializationValue + ); + + ${updateSnippet} + } else if (${filterWidthVec4Remainder === 2}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${dilationWidth}, d), + initializationValue, + initializationValue + ); + + ${updateSnippet} + } else if (${filterWidthVec4Remainder === 3}) { + vec4 values = vec4( + getValue(batch, xR, xC, d), + getValue(batch, xR, xC + ${dilationWidth}, d), + getValue(batch, xR, xC + 2 * ${dilationWidth}, d), + initializationValue + ); + + ${updateSnippet} + } + } + setOutput(${returnValue}); + } + `; + } +} +class Pool3DProgram { + constructor(convInfo, poolType, computePositions, flattenPositions = false, includeBatchInIndex = false) { + this.variableNames = ['x']; + if (poolType === 'avg' && computePositions) { + throw new Error('Cannot compute positions for average pool.'); + } + const filterWidth = convInfo.filterWidth; + const strideDepth = convInfo.strideDepth; + const strideHeight = convInfo.strideHeight; + const strideWidth = convInfo.strideWidth; + const dilationDepth = convInfo.dilationDepth; + const dilationHeight = convInfo.dilationHeight; + const dilationWidth = convInfo.dilationWidth; + const effectiveFilterDepth = convInfo.effectiveFilterDepth; + const effectiveFilterHeight = convInfo.effectiveFilterHeight; + const effectiveFilterWidth = convInfo.effectiveFilterWidth; + const padFront = convInfo.padInfo.front; + const padTop = convInfo.padInfo.top; + const padLeft = convInfo.padInfo.left; + this.outputShape = convInfo.outShape; + const isAvgPool = poolType === 'avg'; + let initializationValue = '0.0'; + if (!isAvgPool) { + // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps. + initializationValue = '-1.0 / 1e-20'; + } + if (computePositions) { + const compareOp = '>='; + this.userCode = ` + const ivec3 strides = + ivec3(${strideDepth}, ${strideHeight}, ${strideWidth}); + const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft}); + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch). + // ? = to be determined + float minMaxValue = 0.0; + float minMaxValueFound = 0.0; + int minMaxPosition = 0; + + for (int wD = 0; wD < ${effectiveFilterDepth}; + wD += ${dilationDepth}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${convInfo.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${effectiveFilterWidth}; + wC += ${dilationWidth}) { + int xC = xCCorner + wC; + + if (xC < 0 || xC >= ${convInfo.inWidth}) { + continue; + } + + float value = getX(batch, xD, xR, xC, ch); + + // If a min / max value has already been found, use it. If not, + // use the current value. + float currMinMaxValue = mix( + value, minMaxValue, minMaxValueFound); + if (value ${compareOp} currMinMaxValue) { + minMaxValue = value; + minMaxValueFound = 1.0; + minMaxPosition = ${flattenPositions ? + (includeBatchInIndex ? + `(((batch * ${convInfo.inDepth} + xD) * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + ch` : + `((xD * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + ch`) : + `wD * ${effectiveFilterHeight} * ${effectiveFilterWidth} + + wR * ${effectiveFilterWidth} + wC`}; + } + } + } + } + setOutput(float(minMaxPosition)); + } + `; + return; + } + const compareOp = 'max'; + let returnValue = `${poolType}(${poolType}(${poolType}(` + + 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])'; + if (poolType === 'avg') { + returnValue = `avgValue / count`; + } + const filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4; + const filterWidthVec4Remainder = filterWidth % 4; + const updateSnippet = ` + if (${isAvgPool}) { + avgValue += dot(values, ones); + } else { + minMaxValue = ${compareOp}(values, minMaxValue); + } + `; + this.userCode = ` + const ivec3 strides = + ivec3(${strideDepth}, ${strideHeight}, ${strideWidth}); + const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft}); + const float initializationValue = ${initializationValue}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float count = 0.0; + + float getValue(int batch, int xD, int xR, int xC, int ch) { + if (xC < 0 || xC >= ${convInfo.inWidth}) { + return initializationValue; + } + count += 1.0; + return getX(batch, xD, xR, xC, ch); + } + + void main() { + ivec5 coords = getOutputCoords(); + int batch = coords.x; + int ch = coords.u; + + ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads; + int xDCorner = xCorner.x; + int xRCorner = xCorner.y; + int xCCorner = xCorner.z; + + // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch). + // ? = to be determined + vec4 minMaxValue = vec4(${initializationValue}); + float avgValue = 0.0; + count = 0.0; + + for (int wD = 0; wD < ${effectiveFilterDepth}; + wD += ${dilationDepth}) { + int xD = xDCorner + wD; + + if (xD < 0 || xD >= ${convInfo.inDepth}) { + continue; + } + + for (int wR = 0; wR < ${effectiveFilterHeight}; + wR += ${dilationHeight}) { + int xR = xRCorner + wR; + + if (xR < 0 || xR >= ${convInfo.inHeight}) { + continue; + } + + for (int wC = 0; wC < ${filterWidthNearestVec4}; wC += 4) { + int xC = xCCorner + wC * ${dilationWidth}; + + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${dilationWidth}, ch), + getValue(batch, xD, xR, xC + 2 * ${dilationWidth}, ch), + getValue(batch, xD, xR, xC + 3 * ${dilationWidth}, ch) + ); + + ${updateSnippet} + } + + int xC = xCCorner + ${filterWidthNearestVec4}; + if (${filterWidthVec4Remainder === 1}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + initializationValue, + initializationValue, + initializationValue + ); + + ${updateSnippet} + } else if (${filterWidthVec4Remainder === 2}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${dilationWidth}, ch), + initializationValue, + initializationValue + ); + + ${updateSnippet} + } else if (${filterWidthVec4Remainder === 3}) { + vec4 values = vec4( + getValue(batch, xD, xR, xC, ch), + getValue(batch, xD, xR, xC + ${dilationWidth}, ch), + getValue(batch, xD, xR, xC + 2 * ${dilationWidth}, ch), + initializationValue + ); + + ${updateSnippet} + } + } + setOutput(${returnValue}); + } + } + `; + } +} +//# sourceMappingURL=pool_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js ***! + \************************************************************************/ +/*! exports provided: ReduceProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReduceProgram", function() { return ReduceProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ReduceProgram { + constructor(reduceInfo, reduceType) { + this.variableNames = ['x']; + const { windowSize, batchSize, inSize, outSize } = reduceInfo; + this.outputShape = [batchSize, outSize]; + let initializationValue = '0.0'; + let compareOp = ``; + if (reduceType === 'prod') { + initializationValue = '1.0'; + } + else if (reduceType === 'min') { + // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps. + initializationValue = '1.0 / 1e-20'; + compareOp = `min`; + } + else if (reduceType === 'max') { + // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps. + initializationValue = '-1.0 / 1e-20'; + compareOp = `max`; + } + let returnValue = `${reduceType}(${reduceType}(${reduceType}(` + + 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])'; + if (reduceType === 'sum') { + returnValue = `sumValue`; + } + else if (reduceType === 'prod') { + returnValue = `prodValue`; + } + else if (reduceType === 'all') { + returnValue = `allValue`; + } + else if (reduceType === 'any') { + returnValue = `anyValue`; + } + const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4; + const windowSizeVec4Remainder = windowSize % 4; + let updateSnippet = ` + if (${reduceType === 'sum'}) { + sumValue += dot(values, ones); + } else if (${reduceType === 'prod'}) { + vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]); + prodValue *= tmp[0] * tmp[1]; + } else { + minMaxValue = ${compareOp}(values, minMaxValue); + } + `; + let vecType = `vec4`; + if (reduceType === 'all') { + initializationValue = '1.0'; + updateSnippet = ` + bool reducedAllValue = all(values); + float floatedReducedAllValue = float(reducedAllValue); + allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0); + `; + vecType = `bvec4`; + } + else if (reduceType === 'any') { + initializationValue = '0.0'; + updateSnippet = ` + bool reducedAnyValue = any(values); + float floatedReducedAnyValue = float(reducedAnyValue); + anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0); + `; + vecType = `bvec4`; + } + let checkOutOfBounds = ''; + if (inSize % windowSize > 0) { + checkOutOfBounds = ` + if (inIdx < 0 || inIdx >= ${inSize}) { + return initializationValue; + } + `; + } + this.userCode = ` + const float initializationValue = ${initializationValue}; + const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0); + + float getValue(int batch, int inIdx) { + ${checkOutOfBounds} + return getX(batch, inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = outIdx * ${windowSize}; + + vec4 minMaxValue = vec4(${initializationValue}); + float prodValue = 1.0; + float sumValue = 0.0; + float allValue = 1.0; + float anyValue = 0.0; + + for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) { + int inIdx = inOffset + i; + ${vecType} values = ${vecType}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + ${updateSnippet} + } + + int inIdx = inOffset + ${windowSizeNearestVec4}; + if (${windowSizeVec4Remainder === 1}) { + ${vecType} values = ${vecType}( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + ${updateSnippet} + } else if (${windowSizeVec4Remainder === 2}) { + ${vecType} values = ${vecType}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + ${updateSnippet} + } else if (${windowSizeVec4Remainder === 3}) { + ${vecType} values = ${vecType}( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + ${updateSnippet} + } + setOutput(${returnValue}); + } + `; + } +} +//# sourceMappingURL=reduce_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js ***! + \**********************************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _kernels_Add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./kernels/Add */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js"); +/* harmony import */ var _kernels_Atan2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kernels/Atan2 */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js"); +/* harmony import */ var _kernels_AvgPool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./kernels/AvgPool */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js"); +/* harmony import */ var _kernels_AvgPoolBackprop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kernels/AvgPoolBackprop */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolBackprop.js"); +/* harmony import */ var _kernels_BatchNorm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kernels/BatchNorm */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js"); +/* harmony import */ var _kernels_Cast__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./kernels/Cast */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js"); +/* harmony import */ var _kernels_Complex__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./kernels/Complex */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js"); +/* harmony import */ var _kernels_Concat__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./kernels/Concat */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js"); +/* harmony import */ var _kernels_Cos__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./kernels/Cos */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js"); +/* harmony import */ var _kernels_Div__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./kernels/Div */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Div.js"); +/* harmony import */ var _kernels_FFT__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./kernels/FFT */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js"); +/* harmony import */ var _kernels_FlipLeftRight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./kernels/FlipLeftRight */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js"); +/* harmony import */ var _kernels_FromPixels__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./kernels/FromPixels */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js"); +/* harmony import */ var _kernels_Identity__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./kernels/Identity */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js"); +/* harmony import */ var _kernels_IFFT__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./kernels/IFFT */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js"); +/* harmony import */ var _kernels_Imag__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./kernels/Imag */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js"); +/* harmony import */ var _kernels_Max__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./kernels/Max */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js"); +/* harmony import */ var _kernels_MaxPool__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./kernels/MaxPool */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js"); +/* harmony import */ var _kernels_MaxPoolBackprop__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./kernels/MaxPoolBackprop */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolBackprop.js"); +/* harmony import */ var _kernels_MaxPoolWithArgmax__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./kernels/MaxPoolWithArgmax */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js"); +/* harmony import */ var _kernels_Mean__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./kernels/Mean */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js"); +/* harmony import */ var _kernels_MirrorPad__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./kernels/MirrorPad */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js"); +/* harmony import */ var _kernels_Multiply__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./kernels/Multiply */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js"); +/* harmony import */ var _kernels_NonMaxSuppressionV3__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./kernels/NonMaxSuppressionV3 */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js"); +/* harmony import */ var _kernels_NonMaxSuppressionV4__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./kernels/NonMaxSuppressionV4 */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js"); +/* harmony import */ var _kernels_NonMaxSuppressionV5__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./kernels/NonMaxSuppressionV5 */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js"); +/* harmony import */ var _kernels_NotEqual__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./kernels/NotEqual */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js"); +/* harmony import */ var _kernels_Real__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./kernels/Real */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js"); +/* harmony import */ var _kernels_Reshape__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./kernels/Reshape */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js"); +/* harmony import */ var _kernels_RotateWithOffset__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./kernels/RotateWithOffset */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js"); +/* harmony import */ var _kernels_Sin__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./kernels/Sin */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js"); +/* harmony import */ var _kernels_Square__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./kernels/Square */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js"); +/* harmony import */ var _kernels_SquaredDifference__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./kernels/SquaredDifference */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js"); +/* harmony import */ var _kernels_Sub__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./kernels/Sub */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js"); +/* harmony import */ var _kernels_Tan__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./kernels/Tan */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js"); +/* harmony import */ var _kernels_Transpose__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./kernels/Transpose */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js"); +/* harmony import */ var _kernels_Unique__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./kernels/Unique */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// List all kernel configs here +const kernelConfigs = [ + _kernels_Add__WEBPACK_IMPORTED_MODULE_1__["addConfig"], + _kernels_Atan2__WEBPACK_IMPORTED_MODULE_2__["atan2Config"], + _kernels_AvgPool__WEBPACK_IMPORTED_MODULE_3__["avgPoolConfig"], + _kernels_AvgPoolBackprop__WEBPACK_IMPORTED_MODULE_4__["avgPoolBackpropConfig"], + _kernels_BatchNorm__WEBPACK_IMPORTED_MODULE_5__["batchNormConfig"], + _kernels_Cast__WEBPACK_IMPORTED_MODULE_6__["castConfig"], + _kernels_Complex__WEBPACK_IMPORTED_MODULE_7__["complexConfig"], + _kernels_Concat__WEBPACK_IMPORTED_MODULE_8__["concatConfig"], + _kernels_Cos__WEBPACK_IMPORTED_MODULE_9__["cosConfig"], + _kernels_Div__WEBPACK_IMPORTED_MODULE_10__["divConfig"], + _kernels_FFT__WEBPACK_IMPORTED_MODULE_11__["fftConfig"], + _kernels_FlipLeftRight__WEBPACK_IMPORTED_MODULE_12__["flipLeftRightConfig"], + _kernels_FromPixels__WEBPACK_IMPORTED_MODULE_13__["fromPixelsConfig"], + _kernels_Identity__WEBPACK_IMPORTED_MODULE_14__["identityConfig"], + _kernels_IFFT__WEBPACK_IMPORTED_MODULE_15__["ifftConfig"], + _kernels_Imag__WEBPACK_IMPORTED_MODULE_16__["imagConfig"], + _kernels_Max__WEBPACK_IMPORTED_MODULE_17__["maxConfig"], + _kernels_MaxPool__WEBPACK_IMPORTED_MODULE_18__["maxPoolConfig"], + _kernels_MaxPoolBackprop__WEBPACK_IMPORTED_MODULE_19__["maxPoolBackpropConfig"], + _kernels_MaxPoolWithArgmax__WEBPACK_IMPORTED_MODULE_20__["maxPoolWithArgmaxConfig"], + _kernels_Mean__WEBPACK_IMPORTED_MODULE_21__["meanConfig"], + _kernels_MirrorPad__WEBPACK_IMPORTED_MODULE_22__["mirrorPadConfig"], + _kernels_Multiply__WEBPACK_IMPORTED_MODULE_23__["multiplyConfig"], + _kernels_NonMaxSuppressionV3__WEBPACK_IMPORTED_MODULE_24__["nonMaxSuppressionV3Config"], + _kernels_NonMaxSuppressionV4__WEBPACK_IMPORTED_MODULE_25__["nonMaxSuppressionV4Config"], + _kernels_NonMaxSuppressionV5__WEBPACK_IMPORTED_MODULE_26__["nonMaxSuppressionV5Config"], + _kernels_NotEqual__WEBPACK_IMPORTED_MODULE_27__["notEqualConfig"], + _kernels_Real__WEBPACK_IMPORTED_MODULE_28__["realConfig"], + _kernels_Reshape__WEBPACK_IMPORTED_MODULE_29__["reshapeConfig"], + _kernels_RotateWithOffset__WEBPACK_IMPORTED_MODULE_30__["rotateWithOffsetConfig"], + _kernels_Sin__WEBPACK_IMPORTED_MODULE_31__["sinConfig"], + _kernels_Square__WEBPACK_IMPORTED_MODULE_32__["squareConfig"], + _kernels_Sub__WEBPACK_IMPORTED_MODULE_34__["subConfig"], + _kernels_SquaredDifference__WEBPACK_IMPORTED_MODULE_33__["squaredDifferenceConfig"], + _kernels_Tan__WEBPACK_IMPORTED_MODULE_35__["tanConfig"], + _kernels_Transpose__WEBPACK_IMPORTED_MODULE_36__["transposeConfig"], + _kernels_Unique__WEBPACK_IMPORTED_MODULE_37__["uniqueConfig"], +]; +for (const kernelConfig of kernelConfigs) { + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["registerKernel"])(kernelConfig); +} +//# sourceMappingURL=register_all_kernels.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js ***! + \********************************************************************************/ +/*! exports provided: ReshapePackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReshapePackedProgram", function() { return ReshapePackedProgram; }); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class ReshapePackedProgram { + constructor(outputShape, inputShape) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = outputShape; + let mainLoop = ``; + for (let i = 0; i < 4; i++) { + let thisRC = `thisRC = rc;`; + if (i % 2 === 1) { + thisRC += `thisRC.z += 1;`; + } + if (i > 1) { + thisRC += `thisRC.y += 1;`; + } + mainLoop += ` + ${thisRC} + ${i > 0 ? `if(thisRC.y < rows && thisRC.z < cols){` : ''} + int flatIndex = getFlatIndex(thisRC); + + ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex); + vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z)); + + result[${i}] = + getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims); + ${i > 0 ? '}' : ''} + `; + } + this.userCode = ` + ${getReshapedInputCoords(inputShape)} + ${_shader_compiler_util__WEBPACK_IMPORTED_MODULE_0__["getFlatIndexFrom3D"](outputShape)} + + void main() { + ivec3 rc = getOutputCoords(); + + vec4 result = vec4(0.); + + ivec3 thisRC; + int rows = ${outputShape[1]}; + int cols = ${outputShape[2]}; + + ${mainLoop} + + setOutput(result); + } + `; + } +} +function getReshapedInputCoords(shape) { + const coordsFromIndexSnippet = _shader_compiler_util__WEBPACK_IMPORTED_MODULE_0__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd'], shape); + return ` + ivec3 inputCoordsFromReshapedOutCoords(int index) { + ${coordsFromIndexSnippet} + return ivec3(r, c, d); + } + `; +} +//# sourceMappingURL=reshape_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js ***! + \******************************************************************************************/ +/*! exports provided: ResizeBilinearBackpropProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinearBackpropProgram", function() { return ResizeBilinearBackpropProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ResizeBilinearBackpropProgram { + constructor(dy, x, alignCorners) { + this.variableNames = ['dy']; + this.outputShape = []; + this.outputShape = x.shape; + const [, xHeight, xWidth,] = x.shape; + const [, yHeight, yWidth] = dy.shape; + // In the backwards pass, we want to find the pixels that were generated for + // each pixel in the input image the forward pass and add the corresponding + // coefficient from dy to the gradient (with some interpolation). + const effectiveXSize = [ + (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight, + (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth + ]; + const effectiveYSize = [ + (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight, + (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth + ]; + const heightScale = effectiveXSize[0] / effectiveYSize[0]; + const widthScale = effectiveXSize[1] / effectiveYSize[1]; + const invHeightScale = 1 / heightScale; + const invWidthScale = 1 / widthScale; + // This defines the size of the window of values around a particular + // index in dy that we want to search for contributions to dx. + const winHeight = (Math.ceil(invHeightScale) * 2) + 2; + const winWidth = (Math.ceil(invWidthScale) * 2) + 2; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${heightScale}); + const float widthScale = float(${widthScale}); + + const float invHeightScale = float(${invHeightScale}); + const float invWidthScale = float(${invWidthScale}); + + const int winHeight = int(${winHeight}); + const int winWidth = int(${winWidth}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(startRLerp - float(winHeight / 2)); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(startCLerp - float(winWidth / 2)); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${yHeight}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${yWidth}) { + continue; + } + + float dxR = float(dyR) * heightScale; + int topDxRIndex = int(floor(dxR)); + int bottomDxRIndex = int(min(ceil(dxR), ${xHeight - 1}.0)); + float dxRLerp = dxR - float(topDxRIndex); + float inverseDxRLerp = 1.0 - dxRLerp; + + float dxC = float(dyC) * widthScale; + int leftDxCIndex = int(floor(dxC)); + int rightDxCIndex = int(min(ceil(dxC), ${xWidth - 1}.0)); + float dxCLerp = dxC - float(leftDxCIndex); + float inverseDxCLerp = 1.0 - dxCLerp; + + if (r == topDxRIndex && c == leftDxCIndex) { + // topLeft + accumulator += + getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp; + } + + if (r == topDxRIndex && c == rightDxCIndex) { + // topRight + accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp; + } + + if (r == bottomDxRIndex && c == leftDxCIndex) { + // bottomLeft + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp; + } + + if (r == bottomDxRIndex && c == rightDxCIndex) { + // bottomRight + accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp; + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `; + } +} +//# sourceMappingURL=resize_bilinear_backprop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js ***! + \*********************************************************************************/ +/*! exports provided: ResizeBilinearProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinearProgram", function() { return ResizeBilinearProgram; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ResizeBilinearProgram { + constructor(inputShape, newHeight, newWidth, alignCorners) { + this.variableNames = ['A']; + this.outputShape = []; + const [batch, oldHeight, oldWidth, depth] = inputShape; + this.outputShape = [batch, newHeight, newWidth, depth]; + const effectiveInSize = [ + (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, + (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth + ]; + const effectiveOutSize = [ + (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, + (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth + ]; + this.userCode = ` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${effectiveInSize[0] / effectiveOutSize[0]}, + ${effectiveInSize[1] / effectiveOutSize[1]}); + const vec2 inputShapeRC = vec2(${oldHeight}.0, ${oldWidth}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC; + + // Compute the four integer indices. + ivec2 sourceFloorRC = ivec2(sourceFracIndexRC); + ivec2 sourceCeilRC = ivec2( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d); + float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d); + float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d); + float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d); + + vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC); + + float top = topLeft + (topRight - topLeft) * fracRC.y; + float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y; + float newValue = top + (bottom - top) * fracRC.x; + + setOutput(newValue); + } + `; + } +} +//# sourceMappingURL=resize_bilinear_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js ***! + \****************************************************************************************/ +/*! exports provided: ResizeBilinearPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinearPackedProgram", function() { return ResizeBilinearPackedProgram; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ResizeBilinearPackedProgram { + constructor(inputShape, newHeight, newWidth, alignCorners) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = []; + const [batch, oldHeight, oldWidth, depth] = inputShape; + this.outputShape = [batch, newHeight, newWidth, depth]; + const effectiveInSize = [ + (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, + (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth + ]; + const effectiveOutSize = [ + (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, + (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth + ]; + this.userCode = ` + const vec3 effectiveInputOverOutputRatioRC = vec3( + ${effectiveInSize[0] / effectiveOutSize[0]}, + ${effectiveInSize[1] / effectiveOutSize[1]}, + ${effectiveInSize[1] / effectiveOutSize[1]}); + const vec3 inputShapeRC = vec3(${oldHeight}.0, ${oldWidth}.0, + ${oldWidth}.0); + + float getAValue(int b, int r, int c, int d) { + return getChannel(getA(b, r, c, d), vec2(c, d)); + } + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + // Calculate values for next column in yRC.z. + ivec3 yRC = coords.yzz + ivec3(0, 0, 1); + + // Fractional source index. + vec3 sourceFracIndexRC = vec3(yRC) * effectiveInputOverOutputRatioRC; + + // Compute the four integer indices. + ivec3 sourceFloorRC = ivec3(sourceFracIndexRC); + ivec3 sourceCeilRC = ivec3( + min(inputShapeRC - 1.0, ceil(sourceFracIndexRC))); + + // Should we calculate next column and row elements in 2x2 packed cell. + bool hasNextCol = d < ${depth - 1}; + bool hasNextRow = coords.z < ${newWidth - 1}; + + // In parallel, construct four corners for all four components in + // packed 2x2 cell. + vec4 topLeft = vec4( + getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 bottomLeft = vec4( + getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0); + + vec4 topRight = vec4( + getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec4 bottomRight = vec4( + getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d), + hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1) + : 0.0, + hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d) + : 0.0, + (hasNextRow && hasNextCol) ? + getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0); + + vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC); + + vec4 top = mix(topLeft, topRight, fracRC.yyzz); + vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz); + vec4 newValue = mix(top, bottom, fracRC.x); + + setOutput(newValue); + } + `; + } +} +//# sourceMappingURL=resize_bilinear_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js ***! + \**************************************************************************************************/ +/*! exports provided: ResizeNearestNeigborBackpropProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeigborBackpropProgram", function() { return ResizeNearestNeigborBackpropProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ResizeNearestNeigborBackpropProgram { + constructor(dy, x, alignCorners) { + this.variableNames = ['dy']; + this.outputShape = []; + this.outputShape = x.shape; + const [, xHeight, xWidth,] = x.shape; + const [, yHeight, yWidth] = dy.shape; + // In the backwards pass, we want to find the pixels that were generated for + // each pixel in the input image the forward pass and add the corresponding + // coefficient from dy to the gradient (with some interpolation). + const effectiveXSize = [ + (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight, + (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth + ]; + const effectiveYSize = [ + (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight, + (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth + ]; + const heightScale = effectiveXSize[0] / effectiveYSize[0]; + const widthScale = effectiveXSize[1] / effectiveYSize[1]; + const invHeightScale = 1 / heightScale; + const invWidthScale = 1 / widthScale; + // This defines the size of the window of values around a particular + // index in dy that we want to search for contributions to dx. + const winHeight = (Math.ceil(invHeightScale) * 2) + 2; + const winWidth = (Math.ceil(invWidthScale) * 2) + 2; + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + int r = coords[1]; + int c = coords[2]; + + float accumulator = 0.0; + + const float heightScale = float(${heightScale}); + const float widthScale = float(${widthScale}); + + const float invHeightScale = float(${invHeightScale}); + const float invWidthScale = float(${invWidthScale}); + + const int winHeight = int(${winHeight}); + const int winWidth = int(${winWidth}); + + // Compute bounds for where in dy we will look + float startRLerp = floor(float(r) * invHeightScale); + int startDyR = int(floor(startRLerp - float(winHeight / 2))); + + float startCLerp = floor(float(c) * invWidthScale); + int startDyC = int(floor(startCLerp - float(winWidth / 2))); + + // Loop over dy + for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) { + int dyR = dyROffset + startDyR; + + // Guard against the window exceeding the bounds of dy + if (dyR < 0 || dyR >= ${yHeight}) { + continue; + } + + for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) { + int dyC = dyCOffset + startDyC; + + // Guard against the window exceeding the bounds of dy + if (dyC < 0 || dyC >= ${yWidth}) { + continue; + } + + float sourceFracRow = + float(${effectiveXSize[0]}) * + (float(dyR) / float(${effectiveYSize[0]})); + + float sourceFracCol = + float(${effectiveXSize[1]}) * + (float(dyC) / float(${effectiveYSize[1]})); + + int sourceNearestRow = int(min( + float(int(${xHeight}) - 1), + ${alignCorners} ? float(round(sourceFracRow)) : + float(floor(sourceFracRow)))); + + int sourceNearestCol = int(min( + float(int(${xWidth}) - 1), + ${alignCorners} ? float(round(sourceFracCol)) : + float(floor(sourceFracCol)))); + + if (r == sourceNearestRow && c == sourceNearestCol) { + accumulator += getDy(b, dyR, dyC, d); + } + } + } + // End loop over dy + + setOutput(accumulator); + } + `; + } +} +//# sourceMappingURL=resize_nearest_neighbor_backprop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js ***! + \*****************************************************************************************/ +/*! exports provided: ResizeNearestNeighborProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighborProgram", function() { return ResizeNearestNeighborProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class ResizeNearestNeighborProgram { + constructor(inputShape, newHeight, newWidth, alignCorners) { + this.variableNames = ['A']; + this.outputShape = []; + const [batch, oldHeight, oldWidth, depth] = inputShape; + this.outputShape = [batch, newHeight, newWidth, depth]; + const effectiveInSize = [ + (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight, + (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth + ]; + const effectiveOutSize = [ + (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight, + (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth + ]; + // When align corners is false, we rounds the value with floor. + const roundBase = alignCorners ? '0.5' : '0.0'; + this.userCode = ` + const vec2 effectiveInputOverOutputRatioRC = vec2( + ${effectiveInSize[0] / effectiveOutSize[0]}, + ${effectiveInSize[1] / effectiveOutSize[1]}); + const vec2 inputShapeRC = vec2(${oldHeight}.0, ${oldWidth}.0); + + void main() { + ivec4 coords = getOutputCoords(); + int b = coords[0]; + int d = coords[3]; + ivec2 yRC = coords.yz; + + // Fractional source index. + vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC; + + // Compute the coordinators of nearest neighbor point. + ivec2 sourceNearestRC = ivec2( + min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${roundBase}))); + + float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d); + + setOutput(newValue); + } + `; + } +} +//# sourceMappingURL=resize_nearest_neighbor_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ReverseProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReverseProgram", function() { return ReverseProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class ReverseProgram { + constructor(xShape, axis) { + this.variableNames = ['x']; + const rank = xShape.length; + if (rank > 4) { + throw new Error(`WebGL backend: Reverse of rank-${rank} tensor is not yet supported`); + } + this.outputShape = xShape; + if (rank === 1) { + this.userCode = ` + void main() { + int coord = getOutputCoords(); + setOutput(getX(${xShape[0]} - coord - 1)); + } + `; + return; + } + const getInCoord = (i) => { + if (axis.indexOf(i) !== -1 && xShape[i] !== 1) { + return `${xShape[i]} - coords[${i}] - 1`; + } + return `coords[${i}]`; + }; + const inCoords = xShape.map((_, i) => getInCoord(i)).join(','); + const type = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(rank); + this.userCode = ` + void main() { + ${type} coords = getOutputCoords(); + setOutput(getX(${inCoords})); + } + `; + } +} +//# sourceMappingURL=reverse_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js ***! + \********************************************************************************/ +/*! exports provided: ReversePackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReversePackedProgram", function() { return ReversePackedProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class ReversePackedProgram { + constructor(xShape, axis) { + this.variableNames = ['x']; + this.packedInputs = true; + this.packedOutput = true; + const rank = xShape.length; + if (rank > 4) { + throw new Error(`WebGL backend: Reverse of rank-${rank} tensor is not yet supported`); + } + this.outputShape = xShape; + const channels = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('rc', rank); + const nextColumn = `${channels[rank - 1]} + 1 < ${this.outputShape[rank - 1]}`; + const nextRow = `${channels[rank - 2]} + 1 < ${this.outputShape[rank - 2]}`; + const type = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(rank); + if (rank === 1) { + this.userCode = ` + void main(){ + int rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = getChannel(getX(${xShape[0]} - rc - 1), + ${xShape[0]} - rc - 1); + if(${nextColumn}){ + result.g = getChannel(getX(${xShape[0]} - (rc + 1) - 1), + ${xShape[0]} - (rc + 1) - 1); + } + setOutput(result); + } + `; + } + else { + this.userCode = ` + void main() { + ${type} rc = getOutputCoords(); + vec4 result = vec4(0.); + result.r = ${getR(channels.slice())}; + if(${nextColumn}){ + result.g = ${getG(channels.slice())}; + } + if(${nextRow}) { + result.b = ${getB(channels.slice())}; + if(${nextColumn}) { + result.a = ${getA(channels.slice())}; + } + } + setOutput(result); + } + `; + } + function getR(channels) { + return getChannel(channels); + } + function getG(channels) { + channels[rank - 1] = '(' + channels[rank - 1] + ` + 1)`; + return getChannel(channels); + } + function getB(channels) { + channels[rank - 2] = '(' + channels[rank - 2] + ` + 1)`; + return getChannel(channels); + } + function getA(channels) { + channels[rank - 1] = '(' + channels[rank - 1] + ` + 1)`; + channels[rank - 2] = '(' + channels[rank - 2] + ` + 1)`; + return getChannel(channels); + } + function getChannel(channels) { + const inCoordsArray = xShape.map((_, i) => getInCoord(i, channels)); + const inCoords = inCoordsArray.join(','); + const innerDims = inCoordsArray.slice(-2).join(','); + return `getChannel(getX(${inCoords}), vec2(${innerDims}))`; + } + function getInCoord(i, channels1) { + if (axis.indexOf(i) !== -1 && xShape[i] !== 1) { + return `${xShape[i]} - ${channels1[i]} - 1`; + } + else { + return `${channels1[i]}`; + } + } + } +} +//# sourceMappingURL=reverse_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js ***! + \************************************************************************/ +/*! exports provided: RotateProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RotateProgram", function() { return RotateProgram; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class RotateProgram { + constructor(imageShape, radians, fillValue, center) { + this.variableNames = ['Image']; + this.outputShape = []; + const imageHeight = imageShape[1]; + const imageWidth = imageShape[2]; + const sinFactor = Math.sin(radians).toFixed(3); + const cosFactor = Math.cos(radians).toFixed(3); + this.outputShape = imageShape; + const [centerX, centerY] = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].getImageCenter(center, imageHeight, imageWidth); + const centerXString = centerX.toFixed(3); + const centerYString = centerY.toFixed(3); + let fillSnippet = ''; + if (typeof fillValue === 'number') { + fillSnippet = `float outputValue = ${fillValue.toFixed(2)};`; + } + else { + fillSnippet = ` + vec3 fill = vec3(${fillValue.join(',')}); + float outputValue = fill[coords[3]];`; + } + this.userCode = ` + void main() { + ivec4 coords = getOutputCoords(); + int x = coords[2]; + int y = coords[1]; + float coordXFloat = (float(x) - ${centerXString}) * ${cosFactor} - (float(y) - ${centerYString}) * ${sinFactor}; + float coordYFloat = (float(x) - ${centerXString}) * ${sinFactor} + (float(y) - ${centerYString}) * ${cosFactor}; + int coordX = int(round(coordXFloat + ${centerXString})); + int coordY = int(round(coordYFloat + ${centerYString})); + ${fillSnippet} + if(coordX >= 0 && coordX < ${imageWidth} && coordY >= 0 && coordY < ${imageHeight}) { + outputValue = getImage(coords[0], coordY, coordX, coords[3]); + } + setOutput(outputValue); + } + `; + } +} +//# sourceMappingURL=rotate_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js ***! + \*************************************************************************/ +/*! exports provided: ScatterProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScatterProgram", function() { return ScatterProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class ScatterProgram { + constructor(updateSize, sliceDim, indicesRank, updatesRank, strides, shape, summingDupeIndex = true) { + this.variableNames = ['updates', 'indices', 'defaultValue']; + this.outputShape = shape; + const stridesType = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(strides.length); + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(shape.length); + let indicesString = ''; + if (indicesRank === 1) { + indicesString = 'i'; + } + else if (indicesRank === 2) { + indicesString = 'i, j'; + } + const indicesSnippet = `getIndices(${indicesString})`; + let updatesString = ''; + if (updatesRank === 1) { + updatesString = 'i'; + } + else if (updatesRank === 2) { + updatesString = 'i, coords[1]'; + } + const updatesSnippet = `getUpdates(${updatesString})`; + const strideString = sliceDim > 1 ? 'strides[j]' : 'strides'; + this.userCode = ` + ${stridesType} strides = ${stridesType}(${strides}); + + void main() { + ${dtype} coords = getOutputCoords(); + float sum = 0.0; + bool found = false; + for (int i = 0; i < ${updateSize}; i++) { + int flattenedIndex = 0; + for (int j = 0; j < ${sliceDim}; j++) { + int index = round(${indicesSnippet}); + flattenedIndex += index * ${strideString}; + } + if (flattenedIndex == coords[0]) { + sum += ${updatesSnippet}; + found = true; + } + } + setOutput(mix(getDefaultValue(), sum, float(found))); + } + `; + } +} +//# sourceMappingURL=scatter_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js ***! + \*************************************************************************/ +/*! exports provided: SegmentOpProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SegmentOpProgram", function() { return SegmentOpProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class SegmentOpProgram { + constructor(segOpInfo, segOpType) { + this.variableNames = ['x', 'segmentIds']; + const windowSize = segOpInfo.windowSize; + const batchSize = segOpInfo.batchSize; + const inSize = segOpInfo.inSize; + const numSegments = segOpInfo.numSegments; + const outSize = numSegments * Math.ceil(inSize / windowSize); + this.outputShape = [batchSize, outSize]; + const initializationValue = '0.0'; + const returnValue = `sumValue`; + const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4; + const windowSizeVec4Remainder = windowSize % 4; + const updateSnippet = ` + sumValue += dot(values, segFilter); + `; + let checkValueOutOfBounds = ''; + if (inSize % windowSize > 0) { + checkValueOutOfBounds = ` + if (inIdx < 0 || inIdx >= ${inSize}) { + return initializationValue; + } + `; + } + let checkSegmentIdOutOfBounds = ''; + if (inSize % windowSize > 0) { + checkSegmentIdOutOfBounds = ` + if (inIdx < 0 || inIdx >= ${inSize}) { + return -1.0; + } + `; + } + this.userCode = ` + const float initializationValue = ${initializationValue}; + + float getValue(int batch, int inIdx) { + ${checkValueOutOfBounds} + return getX(batch, inIdx); + } + + float getSegmentIdAtIndex(int inIdx) { + ${checkSegmentIdOutOfBounds} + return getSegmentIds(inIdx); + } + + void main() { + ivec2 coords = getOutputCoords(); + int batch = coords[0]; + int outIdx = coords[1]; + int inOffset = int(floor(float(outIdx) / float( + ${numSegments})) * float(${windowSize})); + int currentSeg = int(mod(float(outIdx), float(${numSegments}))); + + float sumValue = 0.0; + + for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) { + int inIdx = inOffset + i; + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + getValue(batch, inIdx + 3) + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0 + ); + + ${updateSnippet} + } + + int inIdx = inOffset + ${windowSizeNearestVec4}; + if (${windowSizeVec4Remainder === 1}) { + vec4 values = vec4( + getValue(batch, inIdx), + initializationValue, + initializationValue, + initializationValue + ); + + int inIdxSeg = int(getSegmentIdAtIndex(inIdx)); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + 0, + 0, + 0 + ); + + ${updateSnippet} + } else if (${windowSizeVec4Remainder === 2}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + initializationValue, + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + 0, + 0 + ); + + ${updateSnippet} + } else if (${windowSizeVec4Remainder === 3}) { + vec4 values = vec4( + getValue(batch, inIdx), + getValue(batch, inIdx + 1), + getValue(batch, inIdx + 2), + initializationValue + ); + + vec4 segFilter = vec4( + int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0, + int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0, + 0 + ); + + ${updateSnippet} + } + setOutput(${returnValue}); + } + `; + } +} +//# sourceMappingURL=segment_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js ***! + \************************************************************************/ +/*! exports provided: SelectProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectProgram", function() { return SelectProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class SelectProgram { + constructor(cRank, shape, rank) { + this.variableNames = ['c', 'a', 'b']; + this.outputShape = shape; + let cCoords; + let abCoords; + if (rank > 4) { + throw Error(`Where for rank ${rank} is not yet supported`); + } + if (rank === 1) { + abCoords = `resRC`; + cCoords = `resRC`; + } + else { + const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w']; + const cCoordVars = []; + const abCoordVars = []; + for (let i = 0; i < shape.length; i++) { + abCoordVars.push(`${currentCoords[i]}`); + if (i < cRank) { + cCoordVars.push(`${currentCoords[i]}`); + } + } + cCoords = cCoordVars.join(); + abCoords = abCoordVars.join(); + } + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(rank); + this.userCode = ` + void main() { + ${dtype} resRC = getOutputCoords(); + float cVal = getC(${cCoords}); + if (cVal >= 1.0) { + setOutput(getA(${abCoords})); + } else { + setOutput(getB(${abCoords})); + } + } + `; + } +} +//# sourceMappingURL=select_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js ***! + \*****************************************************************************/ +/*! exports provided: makeShader, getCoordsDataType */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeShader", function() { return makeShader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCoordsDataType", function() { return getCoordsDataType; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _glsl_version__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glsl_version */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js"); +/* harmony import */ var _shader_compiler_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shader_compiler_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const { getBroadcastDims } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"]; + + +function makeShader(inputsInfo, outputShape, userCode, usesPackedTextures) { + const prefixSnippets = []; + inputsInfo.forEach(x => { + const size = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(x.shapeInfo.logicalShape); + // Snippet when we decided to upload the values as uniform. + if (x.shapeInfo.isUniform) { + prefixSnippets.push(`uniform float ${x.name}${size > 1 ? `[${size}]` : ''};`); + } + else { + prefixSnippets.push(`uniform sampler2D ${x.name};`); + prefixSnippets.push(`uniform int offset${x.name};`); + } + }); + const inputPrefixSnippet = prefixSnippets.join('\n'); + const inputSamplingSnippet = inputsInfo + .map(x => getInputSamplingSnippet(x, outputShape, usesPackedTextures)) + .join('\n'); + const outTexShape = outputShape.texShape; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_1__["getGlslDifferences"])(); + const floatTextureSampleSnippet = getFloatTextureSampleSnippet(glsl); + let outputSamplingSnippet; + let floatTextureSetOutputSnippet; + let shaderPrefix = getShaderPrefix(glsl); + if (outputShape.isPacked) { + outputSamplingSnippet = + getPackedOutputSamplingSnippet(outputShape.logicalShape, outTexShape); + floatTextureSetOutputSnippet = getFloatTextureSetRGBASnippet(glsl); + } + else { + outputSamplingSnippet = + getOutputSamplingSnippet(outputShape.logicalShape, outTexShape); + floatTextureSetOutputSnippet = getFloatTextureSetRSnippet(glsl); + } + if (usesPackedTextures) { + shaderPrefix += SHADER_PACKED_PREFIX; + } + const source = [ + shaderPrefix, floatTextureSampleSnippet, floatTextureSetOutputSnippet, + inputPrefixSnippet, outputSamplingSnippet, inputSamplingSnippet, userCode + ].join('\n'); + return source; +} +function getSamplerFromInInfo(inInfo) { + const shape = inInfo.shapeInfo.logicalShape; + switch (shape.length) { + case 0: + return getSamplerScalar(inInfo); + case 1: + return getSampler1D(inInfo); + case 2: + return getSampler2D(inInfo); + case 3: + return getSampler3D(inInfo); + case 4: + return getSampler4D(inInfo); + case 5: + return getSampler5D(inInfo); + case 6: + return getSampler6D(inInfo); + default: + throw new Error(`${shape.length}-D input sampling` + + ` is not yet supported`); + } +} +function getPackedSamplerFromInInfo(inInfo) { + const shape = inInfo.shapeInfo.logicalShape; + switch (shape.length) { + case 0: + return getPackedSamplerScalar(inInfo); + case 1: + return getPackedSampler1D(inInfo); + case 2: + return getPackedSampler2D(inInfo); + case 3: + return getPackedSampler3D(inInfo); + default: + return getPackedSamplerND(inInfo); + } +} +function getInputSamplingSnippet(inInfo, outShapeInfo, usesPackedTextures = false) { + let res = ''; + if (usesPackedTextures) { + res += getPackedSamplerFromInInfo(inInfo); + } + else { + res += getSamplerFromInInfo(inInfo); + } + const inShape = inInfo.shapeInfo.logicalShape; + const outShape = outShapeInfo.logicalShape; + if (inShape.length <= outShape.length) { + if (usesPackedTextures) { + res += getPackedSamplerAtOutputCoords(inInfo, outShapeInfo); + } + else { + res += getSamplerAtOutputCoords(inInfo, outShapeInfo); + } + } + return res; +} +function getPackedOutputSamplingSnippet(outShape, outTexShape) { + switch (outShape.length) { + case 0: + return getOutputScalarCoords(); + case 1: + return getOutputPacked1DCoords(outShape, outTexShape); + case 2: + return getOutputPacked2DCoords(outShape, outTexShape); + case 3: + return getOutputPacked3DCoords(outShape, outTexShape); + default: + return getOutputPackedNDCoords(outShape, outTexShape); + } +} +function getOutputSamplingSnippet(outShape, outTexShape) { + switch (outShape.length) { + case 0: + return getOutputScalarCoords(); + case 1: + return getOutput1DCoords(outShape, outTexShape); + case 2: + return getOutput2DCoords(outShape, outTexShape); + case 3: + return getOutput3DCoords(outShape, outTexShape); + case 4: + return getOutput4DCoords(outShape, outTexShape); + case 5: + return getOutput5DCoords(outShape, outTexShape); + case 6: + return getOutput6DCoords(outShape, outTexShape); + default: + throw new Error(`${outShape.length}-D output sampling is not yet supported`); + } +} +function getFloatTextureSampleSnippet(glsl) { + return ` + float sampleTexture(sampler2D textureSampler, vec2 uv) { + return ${glsl.texture2D}(textureSampler, uv).r; + } + `; +} +function getFloatTextureSetRSnippet(glsl) { + return ` + void setOutput(float val) { + ${glsl.output} = vec4(val, 0, 0, 0); + } + `; +} +function getFloatTextureSetRGBASnippet(glsl) { + return ` + void setOutput(vec4 val) { + ${glsl.output} = val; + } + `; +} +function getShaderPrefix(glsl) { + const SHADER_PREFIX = `${glsl.version} + precision highp float; + precision highp int; + precision highp sampler2D; + ${glsl.varyingFs} vec2 resultUV; + ${glsl.defineOutput} + const vec2 halfCR = vec2(0.5, 0.5); + + struct ivec5 + { + int x; + int y; + int z; + int w; + int u; + }; + + struct ivec6 + { + int x; + int y; + int z; + int w; + int u; + int v; + }; + + uniform float NAN; + ${glsl.defineSpecialNaN} + ${glsl.defineSpecialInf} + ${glsl.defineRound} + + int imod(int x, int y) { + return x - y * (x / y); + } + + int idiv(int a, int b, float sign) { + int res = a / b; + int mod = imod(a, b); + if (sign < 0. && mod != 0) { + res -= 1; + } + return res; + } + + //Based on the work of Dave Hoskins + //https://www.shadertoy.com/view/4djSRW + #define HASHSCALE1 443.8975 + float random(float seed){ + vec2 p = resultUV * seed; + vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1); + p3 += dot(p3, p3.yzx + 19.19); + return fract((p3.x + p3.y) * p3.z); + } + + ${SAMPLE_1D_SNIPPET} + ${SAMPLE_2D_SNIPPET} + ${SAMPLE_3D_SNIPPET} + `; + return SHADER_PREFIX; +} +const SAMPLE_1D_SNIPPET = ` +vec2 uvFromFlat(int texNumR, int texNumC, int index) { + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +vec2 packedUVfrom1D(int texNumR, int texNumC, int index) { + int texelIndex = index / 2; + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`; +const SAMPLE_2D_SNIPPET = ` +vec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR, + int texNumC, int row, int col) { + int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2); + int texR = texelIndex / texNumC; + int texC = texelIndex - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`; +const SAMPLE_3D_SNIPPET = ` +vec2 packedUVfrom3D(int texNumR, int texNumC, + int texelsInBatch, int texelsInLogicalRow, int b, + int row, int col) { + int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2); + int texR = index / texNumC; + int texC = index - texR * texNumC; + return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR); +} +`; +const SHADER_PACKED_PREFIX = ` + float getChannel(vec4 frag, vec2 innerDims) { + vec2 modCoord = mod(innerDims, 2.); + return modCoord.x == 0. ? + (modCoord.y == 0. ? frag.r : frag.g) : + (modCoord.y == 0. ? frag.b : frag.a); + } + float getChannel(vec4 frag, int dim) { + float modCoord = mod(float(dim), 2.); + return modCoord == 0. ? frag.r : frag.g; + } +`; +function getOutputScalarCoords() { + return ` + int getOutputCoords() { + return 0; + } + `; +} +function getOutputPacked1DCoords(shape, texShape) { + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + if (packedTexShape[0] === 1) { + return ` + int getOutputCoords() { + return 2 * int(resultUV.x * ${packedTexShape[1]}.0); + } + `; + } + if (packedTexShape[1] === 1) { + return ` + int getOutputCoords() { + return 2 * int(resultUV.y * ${packedTexShape[0]}.0); + } + `; + } + return ` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${packedTexShape[0]}, ${packedTexShape[1]})); + return 2 * (resTexRC.x * ${packedTexShape[1]} + resTexRC.y); + } + `; +} +function getOutput1DCoords(shape, texShape) { + if (texShape[0] === 1) { + return ` + int getOutputCoords() { + return int(resultUV.x * ${texShape[1]}.0); + } + `; + } + if (texShape[1] === 1) { + return ` + int getOutputCoords() { + return int(resultUV.y * ${texShape[0]}.0); + } + `; + } + return ` + int getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + return resTexRC.x * ${texShape[1]} + resTexRC.y; + } + `; +} +function getOutputPacked3DCoords(shape, texShape) { + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + const texelsInLogicalRow = Math.ceil(shape[2] / 2); + const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2); + return ` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${packedTexShape[0]}, ${packedTexShape[1]})); + int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y; + + int b = index / ${texelsInBatch}; + index -= b * ${texelsInBatch}; + + int r = 2 * (index / ${texelsInLogicalRow}); + int c = imod(index, ${texelsInLogicalRow}) * 2; + + return ivec3(b, r, c); + } + `; +} +function getOutput3DCoords(shape, texShape) { + const coordsFromIndexSnippet = _shader_compiler_util__WEBPACK_IMPORTED_MODULE_2__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd'], shape); + return ` + ivec3 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + ${coordsFromIndexSnippet} + return ivec3(r, c, d); + } + `; +} +function getOutputPackedNDCoords(shape, texShape) { + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + const texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2); + const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2); + let texelsInBatchN = texelsInBatch; + let batches = ``; + let coords = 'b, r, c'; + for (let b = 2; b < shape.length - 1; b++) { + texelsInBatchN *= shape[shape.length - b - 1]; + batches = ` + int b${b} = index / ${texelsInBatchN}; + index -= b${b} * ${texelsInBatchN}; + ` + batches; + coords = `b${b}, ` + coords; + } + return ` + ivec${shape.length} getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${packedTexShape[0]}, ${packedTexShape[1]})); + int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y; + + ${batches} + + int b = index / ${texelsInBatch}; + index -= b * ${texelsInBatch}; + + int r = 2 * (index / ${texelsInLogicalRow}); + int c = imod(index, ${texelsInLogicalRow}) * 2; + + return ivec${shape.length}(${coords}); + } + `; +} +function getOutput4DCoords(shape, texShape) { + const coordsFromIndexSnippet = _shader_compiler_util__WEBPACK_IMPORTED_MODULE_2__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd', 'd2'], shape); + return ` + ivec4 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + ${coordsFromIndexSnippet} + return ivec4(r, c, d, d2); + } + `; +} +function getOutput5DCoords(shape, texShape) { + const coordsFromIndexSnippet = _shader_compiler_util__WEBPACK_IMPORTED_MODULE_2__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd', 'd2', 'd3'], shape); + return ` + ivec5 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * vec2(${texShape[0]}, + ${texShape[1]})); + + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + + ${coordsFromIndexSnippet} + + ivec5 outShape = ivec5(r, c, d, d2, d3); + return outShape; + } + `; +} +function getOutput6DCoords(shape, texShape) { + const coordsFromIndexSnippet = _shader_compiler_util__WEBPACK_IMPORTED_MODULE_2__["getLogicalCoordinatesFromFlatIndex"](['r', 'c', 'd', 'd2', 'd3', 'd4'], shape); + return ` + ivec6 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + + ${coordsFromIndexSnippet} + + ivec6 result = ivec6(r, c, d, d2, d3, d4); + return result; + } + `; +} +function getOutputPacked2DCoords(shape, texShape) { + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(shape, texShape)) { + return ` + ivec2 getOutputCoords() { + return 2 * ivec2(resultUV.yx * vec2(${packedTexShape[0]}, ${packedTexShape[1]})); + } + `; + } + // texels needed to accommodate a logical row + const texelsInLogicalRow = Math.ceil(shape[1] / 2); + /** + * getOutputCoords + * + * resTexRC: The rows and columns of the texels. If you move over one + * texel to the right in the packed texture, you are moving over one column + * (not two). + * + * index: The texel index + */ + return ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${packedTexShape[0]}, ${packedTexShape[1]})); + + int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y; + int r = 2 * (index / ${texelsInLogicalRow}); + int c = imod(index, ${texelsInLogicalRow}) * 2; + + return ivec2(r, c); + } + `; +} +function getOutput2DCoords(shape, texShape) { + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(shape, texShape)) { + return ` + ivec2 getOutputCoords() { + return ivec2(resultUV.yx * vec2(${texShape[0]}, ${texShape[1]})); + } + `; + } + if (shape[1] === 1) { + return ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + return ivec2(index, 0); + } + `; + } + if (shape[0] === 1) { + return ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + return ivec2(0, index); + } + `; + } + return ` + ivec2 getOutputCoords() { + ivec2 resTexRC = ivec2(resultUV.yx * + vec2(${texShape[0]}, ${texShape[1]})); + int index = resTexRC.x * ${texShape[1]} + resTexRC.y; + int r = index / ${shape[1]}; + int c = index - r * ${shape[1]}; + return ivec2(r, c); + } + `; +} +function getFlatOffsetUniformName(texName) { + return `offset${texName}`; +} +function getPackedSamplerScalar(inputInfo) { + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_1__["getGlslDifferences"])(); + return ` + vec4 ${funcName}() { + return ${glsl.texture2D}(${texName}, halfCR); + } + `; +} +function getSamplerScalar(inputInfo) { + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + if (inputInfo.shapeInfo.isUniform) { + return `float ${funcName}() {return ${texName};}`; + } + const [texNumR, texNumC] = inputInfo.shapeInfo.texShape; + if (texNumR === 1 && texNumC === 1) { + return ` + float ${funcName}() { + return sampleTexture(${texName}, halfCR); + } + `; + } + const [tNumR, tNumC] = inputInfo.shapeInfo.texShape; + const offset = getFlatOffsetUniformName(texName); + return ` + float ${funcName}() { + vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, ${offset}); + return sampleTexture(${texName}, uv); + } + `; +} +function getPackedSampler1D(inputInfo) { + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const texShape = inputInfo.shapeInfo.texShape; + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_1__["getGlslDifferences"])(); + return ` + vec4 ${funcName}(int index) { + vec2 uv = packedUVfrom1D( + ${packedTexShape[0]}, ${packedTexShape[1]}, index); + return ${glsl.texture2D}(${texName}, uv); + } + `; +} +function getSampler1D(inputInfo) { + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + if (inputInfo.shapeInfo.isUniform) { + // Uniform arrays will be less than 65505 (no risk of float16 overflow). + return ` + float ${funcName}(int index) { + ${getUniformSampler(inputInfo)} + } + `; + } + const texShape = inputInfo.shapeInfo.texShape; + const tNumR = texShape[0]; + const tNumC = texShape[1]; + if (tNumC === 1 && tNumR === 1) { + return ` + float ${funcName}(int index) { + return sampleTexture(${texName}, halfCR); + } + `; + } + const offset = getFlatOffsetUniformName(texName); + if (tNumC === 1) { + return ` + float ${funcName}(int index) { + vec2 uv = vec2(0.5, (float(index + ${offset}) + 0.5) / ${tNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + if (tNumR === 1) { + return ` + float ${funcName}(int index) { + vec2 uv = vec2((float(index + ${offset}) + 0.5) / ${tNumC}.0, 0.5); + return sampleTexture(${texName}, uv); + } + `; + } + return ` + float ${funcName}(int index) { + vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, index + ${offset}); + return sampleTexture(${texName}, uv); + } + `; +} +function getPackedSampler2D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const texShape = inputInfo.shapeInfo.texShape; + const texNumR = texShape[0]; + const texNumC = texShape[1]; + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_1__["getGlslDifferences"])(); + if (texShape != null && _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(shape, texShape)) { + return ` + vec4 ${funcName}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0); + + return ${glsl.texture2D}(${texName}, uv); + } + `; + } + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + const valuesPerRow = Math.ceil(shape[1] / 2); + return ` + vec4 ${funcName}(int row, int col) { + vec2 uv = packedUVfrom2D(${valuesPerRow}, ${packedTexShape[0]}, ${packedTexShape[1]}, row, col); + return ${glsl.texture2D}(${texName}, uv); + } + `; +} +function getSampler2D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const texShape = inputInfo.shapeInfo.texShape; + if (texShape != null && _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(shape, texShape)) { + const texNumR = texShape[0]; + const texNumC = texShape[1]; + return ` + float ${funcName}(int row, int col) { + vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + const { newShape, keptDims } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].squeezeShape(shape); + const squeezedShape = newShape; + if (squeezedShape.length < shape.length) { + const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape); + const params = ['row', 'col']; + return ` + ${getSamplerFromInInfo(newInputInfo)} + float ${funcName}(int row, int col) { + return ${funcName}(${getSqueezedParams(params, keptDims)}); + } + `; + } + if (inputInfo.shapeInfo.isUniform) { + // Uniform arrays will be less than 65505 (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col) { + int index = round(dot(vec2(row, col), vec2(${shape[1]}, 1))); + ${getUniformSampler(inputInfo)} + } + `; + } + const texNumR = texShape[0]; + const texNumC = texShape[1]; + const offset = getFlatOffsetUniformName(texName); + if (texNumC === 1) { + // index is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col) { + float index = dot(vec3(row, col, ${offset}), vec3(${shape[1]}, 1, 1)); + vec2 uv = vec2(0.5, (index + 0.5) / ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + if (texNumR === 1) { + // index is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col) { + float index = dot(vec3(row, col, ${offset}), vec3(${shape[1]}, 1, 1)); + vec2 uv = vec2((index + 0.5) / ${texNumC}.0, 0.5); + return sampleTexture(${texName}, uv); + } + `; + } + return ` + float ${funcName}(int row, int col) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${shape[1]} + col + ${offset}; + vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index); + return sampleTexture(${texName}, uv); + } +`; +} +function getPackedSampler3D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const texShape = inputInfo.shapeInfo.texShape; + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + if (shape[0] === 1) { + const squeezedShape = shape.slice(1); + const keptDims = [1, 2]; + const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape); + const params = ['b', 'row', 'col']; + return ` + ${getPackedSamplerFromInInfo(newInputInfo)} + vec4 ${funcName}(int b, int row, int col) { + return ${funcName}(${getSqueezedParams(params, keptDims)}); + } + `; + } + const texNumR = packedTexShape[0]; + const texNumC = packedTexShape[1]; + const valuesPerRow = Math.ceil(shape[2] / 2); + const texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2); + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_1__["getGlslDifferences"])(); + return ` + vec4 ${funcName}(int b, int row, int col) { + vec2 uv = packedUVfrom3D( + ${texNumR}, ${texNumC}, ${texelsInBatch}, ${valuesPerRow}, b, row, col); + return ${glsl.texture2D}(${texName}, uv); + } + `; +} +function getSampler3D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const stride0 = shape[1] * shape[2]; + const stride1 = shape[2]; + const { newShape, keptDims } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].squeezeShape(shape); + const squeezedShape = newShape; + if (squeezedShape.length < shape.length) { + const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape); + const params = ['row', 'col', 'depth']; + return ` + ${getSamplerFromInInfo(newInputInfo)} + float ${funcName}(int row, int col, int depth) { + return ${funcName}(${getSqueezedParams(params, keptDims)}); + } + `; + } + if (inputInfo.shapeInfo.isUniform) { + // Uniform arrays will be less than 65505 (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth) { + int index = round(dot(vec3(row, col, depth), + vec3(${stride0}, ${stride1}, 1))); + ${getUniformSampler(inputInfo)} + } + `; + } + const texShape = inputInfo.shapeInfo.texShape; + const texNumR = texShape[0]; + const texNumC = texShape[1]; + const flatOffset = inputInfo.shapeInfo.flatOffset; + if (texNumC === stride0 && flatOffset == null) { + // texC is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth) { + float texR = float(row); + float texC = dot(vec2(col, depth), vec2(${stride1}, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + if (texNumC === stride1 && flatOffset == null) { + // texR is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth) { + float texR = dot(vec2(row, col), vec2(${shape[1]}, 1)); + float texC = float(depth); + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + const offset = getFlatOffsetUniformName(texName); + return ` + float ${funcName}(int row, int col, int depth) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${stride0} + col * ${stride1} + depth + ${offset}; + vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index); + return sampleTexture(${texName}, uv); + } + `; +} +function getPackedSamplerND(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const rank = shape.length; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const texShape = inputInfo.shapeInfo.texShape; + const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)]; + const texNumR = packedTexShape[0]; + const texNumC = packedTexShape[1]; + const valuesPerRow = Math.ceil(shape[rank - 1] / 2); + let texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2); + let params = `int b, int row, int col`; + let index = `b * ${texelsInBatch} + (row / 2) * ${valuesPerRow} + (col / 2)`; + for (let b = 2; b < rank - 1; b++) { + params = `int b${b}, ` + params; + texelsInBatch *= shape[rank - b - 1]; + index = `b${b} * ${texelsInBatch} + ` + index; + } + const glsl = Object(_glsl_version__WEBPACK_IMPORTED_MODULE_1__["getGlslDifferences"])(); + return ` + vec4 ${funcName}(${params}) { + int index = ${index}; + int texR = index / ${texNumC}; + int texC = index - texR * ${texNumC}; + vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}, ${texNumR}); + return ${glsl.texture2D}(${texName}, uv); + } + `; +} +function getSampler4D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const stride2 = shape[3]; + const stride1 = shape[2] * stride2; + const stride0 = shape[1] * stride1; + const { newShape, keptDims } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].squeezeShape(shape); + if (newShape.length < shape.length) { + const newInputInfo = squeezeInputInfo(inputInfo, newShape); + const params = ['row', 'col', 'depth', 'depth2']; + return ` + ${getSamplerFromInInfo(newInputInfo)} + float ${funcName}(int row, int col, int depth, int depth2) { + return ${funcName}(${getSqueezedParams(params, keptDims)}); + } + `; + } + if (inputInfo.shapeInfo.isUniform) { + // Uniform arrays will be less than 65505 (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, int depth2) { + int index = round(dot(vec4(row, col, depth, depth2), + vec4(${stride0}, ${stride1}, ${stride2}, 1))); + ${getUniformSampler(inputInfo)} + } + `; + } + const flatOffset = inputInfo.shapeInfo.flatOffset; + const texShape = inputInfo.shapeInfo.texShape; + const texNumR = texShape[0]; + const texNumC = texShape[1]; + if (texNumC === stride0 && flatOffset == null) { + // texC is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, int depth2) { + float texR = float(row); + float texC = + dot(vec3(col, depth, depth2), + vec3(${stride1}, ${stride2}, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + if (texNumC === stride2 && flatOffset == null) { + // texR is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, int depth2) { + float texR = dot(vec3(row, col, depth), + vec3(${shape[1] * shape[2]}, ${shape[2]}, 1)); + float texC = float(depth2); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + const offset = getFlatOffsetUniformName(texName); + return ` + float ${funcName}(int row, int col, int depth, int depth2) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${stride0} + col * ${stride1} + + depth * ${stride2} + depth2; + vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index + ${offset}); + return sampleTexture(${texName}, uv); + } + `; +} +function getSampler5D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const stride3 = shape[4]; + const stride2 = shape[3] * stride3; + const stride1 = shape[2] * stride2; + const stride0 = shape[1] * stride1; + const { newShape, keptDims } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].squeezeShape(shape); + if (newShape.length < shape.length) { + const newInputInfo = squeezeInputInfo(inputInfo, newShape); + const params = ['row', 'col', 'depth', 'depth2', 'depth3']; + return ` + ${getSamplerFromInInfo(newInputInfo)} + float ${funcName}(int row, int col, int depth, int depth2, int depth3) { + return ${funcName}(${getSqueezedParams(params, keptDims)}); + } + `; + } + if (inputInfo.shapeInfo.isUniform) { + // Uniform arrays will be less than 65505 (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, int depth2, int depth3) { + float index = dot( + vec4(row, col, depth, depth2), + vec4(${stride0}, ${stride1}, ${stride2}, ${stride3})) + + depth3; + ${getUniformSampler(inputInfo)} + } + `; + } + const flatOffset = inputInfo.shapeInfo.flatOffset; + const texShape = inputInfo.shapeInfo.texShape; + const texNumR = texShape[0]; + const texNumC = texShape[1]; + if (texNumC === stride0 && flatOffset == null) { + // texC is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, int depth2, int depth3) { + int texR = row; + float texC = dot(vec4(col, depth, depth2, depth3), + vec4(${stride1}, ${stride2}, ${stride3}, 1)); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + if (texNumC === stride3 && flatOffset == null) { + // texR is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, int depth2, int depth3) { + float texR = dot( + vec4(row, col, depth, depth2), + vec4(${shape[1] * shape[2] * shape[3]}, + ${shape[2] * shape[3]}, ${shape[3]}, 1)); + int texC = depth3; + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + const offset = getFlatOffsetUniformName(texName); + return ` + float ${funcName}(int row, int col, int depth, int depth2, int depth3) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} + + depth2 * ${stride3} + depth3 + ${offset}; + vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index); + return sampleTexture(${texName}, uv); + } + `; +} +function getSampler6D(inputInfo) { + const shape = inputInfo.shapeInfo.logicalShape; + const texName = inputInfo.name; + const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1); + const { newShape, keptDims } = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].squeezeShape(shape); + if (newShape.length < shape.length) { + const newInputInfo = squeezeInputInfo(inputInfo, newShape); + const params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4']; + return ` + ${getSamplerFromInInfo(newInputInfo)} + float ${funcName}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + return ${funcName}(${getSqueezedParams(params, keptDims)}); + } + `; + } + const stride4 = shape[5]; + const stride3 = shape[4] * stride4; + const stride2 = shape[3] * stride3; + const stride1 = shape[2] * stride2; + const stride0 = shape[1] * stride1; + if (inputInfo.shapeInfo.isUniform) { + // Uniform arrays will be less than 65505 (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + int index = round(dot( + vec4(row, col, depth, depth2), + vec4(${stride0}, ${stride1}, ${stride2}, ${stride3})) + + dot( + vec2(depth3, depth4), + vec2(${stride4}, 1))); + ${getUniformSampler(inputInfo)} + } + `; + } + const flatOffset = inputInfo.shapeInfo.flatOffset; + const texShape = inputInfo.shapeInfo.texShape; + const texNumR = texShape[0]; + const texNumC = texShape[1]; + if (texNumC === stride0 && flatOffset == null) { + // texC is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + int texR = row; + float texC = dot(vec4(col, depth, depth2, depth3), + vec4(${stride1}, ${stride2}, ${stride3}, ${stride4})) + + float(depth4); + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + if (texNumC === stride4 && flatOffset == null) { + // texR is used directly as physical (no risk of float16 overflow). + return ` + float ${funcName}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + float texR = dot(vec4(row, col, depth, depth2), + vec4(${shape[1] * shape[2] * shape[3] * shape[4]}, + ${shape[2] * shape[3] * shape[4]}, + ${shape[3] * shape[4]}, + ${shape[4]})) + float(depth3); + int texC = depth4; + vec2 uv = (vec2(texC, texR) + halfCR) / + vec2(${texNumC}.0, ${texNumR}.0); + return sampleTexture(${texName}, uv); + } + `; + } + const offset = getFlatOffsetUniformName(texName); + return ` + float ${funcName}(int row, int col, int depth, + int depth2, int depth3, int depth4) { + // Explicitly use integer operations as dot() only works on floats. + int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} + + depth2 * ${stride3} + depth3 * ${stride4} + depth4 + ${offset}; + vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index); + return sampleTexture(${texName}, uv); + } + `; +} +function getUniformSampler(inputInfo) { + const texName = inputInfo.name; + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(inputInfo.shapeInfo.logicalShape); + if (inSize < 2) { + return `return ${texName};`; + } + return ` + for (int i = 0; i < ${inSize}; i++) { + if (i == index) { + return ${texName}[i]; + } + } + `; +} +function getPackedSamplerAtOutputCoords(inputInfo, outShapeInfo) { + const texName = inputInfo.name; + const texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1); + const funcName = 'get' + texFuncSnippet + 'AtOutCoords'; + const inRank = inputInfo.shapeInfo.logicalShape.length; + const outRank = outShapeInfo.logicalShape.length; + const broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape); + const type = getCoordsDataType(outRank); + const rankDiff = outRank - inRank; + let coordsSnippet; + const fields = ['x', 'y', 'z', 'w', 'u', 'v']; + if (inRank === 0) { + coordsSnippet = ''; + } + else if (outRank < 2 && broadcastDims.length >= 1) { + coordsSnippet = 'coords = 0;'; + } + else { + coordsSnippet = + broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`) + .join('\n'); + } + let unpackedCoordsSnippet = ''; + if (outRank < 2 && inRank > 0) { + unpackedCoordsSnippet = 'coords'; + } + else { + unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape + .map((s, i) => `coords.${fields[i + rankDiff]}`) + .join(', '); + } + let output = `return outputValue;`; + const inSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(inputInfo.shapeInfo.logicalShape); + const isInputScalar = inSize === 1; + const outSize = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(outShapeInfo.logicalShape); + const isOutputScalar = outSize === 1; + if (inRank === 1 && !isInputScalar && !isOutputScalar) { + output = ` + return vec4(outputValue.xy, outputValue.xy); + `; + } + else if (isInputScalar && !isOutputScalar) { + if (outRank === 1) { + output = ` + return vec4(outputValue.x, outputValue.x, 0., 0.); + `; + } + else { + output = ` + return vec4(outputValue.x); + `; + } + } + else if (broadcastDims.length) { + const rows = inRank - 2; + const cols = inRank - 1; + if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) { + output = `return vec4(outputValue.x);`; + } + else if (broadcastDims.indexOf(rows) > -1) { + output = `return vec4(outputValue.x, outputValue.y, ` + + `outputValue.x, outputValue.y);`; + } + else if (broadcastDims.indexOf(cols) > -1) { + output = `return vec4(outputValue.xx, outputValue.zz);`; + } + } + return ` + vec4 ${funcName}() { + ${type} coords = getOutputCoords(); + ${coordsSnippet} + vec4 outputValue = get${texFuncSnippet}(${unpackedCoordsSnippet}); + ${output} + } + `; +} +function getSamplerAtOutputCoords(inputInfo, outShapeInfo) { + const texName = inputInfo.name; + const texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1); + const funcName = 'get' + texFuncSnippet + 'AtOutCoords'; + const outTexShape = outShapeInfo.texShape; + const inTexShape = inputInfo.shapeInfo.texShape; + const inRank = inputInfo.shapeInfo.logicalShape.length; + const outRank = outShapeInfo.logicalShape.length; + if (!inputInfo.shapeInfo.isUniform && inRank === outRank && + inputInfo.shapeInfo.flatOffset == null && + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(inTexShape, outTexShape)) { + return ` + float ${funcName}() { + return sampleTexture(${texName}, resultUV); + } + `; + } + const type = getCoordsDataType(outRank); + const broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape); + const rankDiff = outRank - inRank; + let coordsSnippet; + const fields = ['x', 'y', 'z', 'w', 'u', 'v']; + if (inRank === 0) { + coordsSnippet = ''; + } + else if (outRank < 2 && broadcastDims.length >= 1) { + coordsSnippet = 'coords = 0;'; + } + else { + coordsSnippet = + broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`) + .join('\n'); + } + let unpackedCoordsSnippet = ''; + if (outRank < 2 && inRank > 0) { + unpackedCoordsSnippet = 'coords'; + } + else { + unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape + .map((s, i) => `coords.${fields[i + rankDiff]}`) + .join(', '); + } + return ` + float ${funcName}() { + ${type} coords = getOutputCoords(); + ${coordsSnippet} + return get${texFuncSnippet}(${unpackedCoordsSnippet}); + } + `; +} +function getCoordsDataType(rank) { + if (rank <= 1) { + return 'int'; + } + else if (rank === 2) { + return 'ivec2'; + } + else if (rank === 3) { + return 'ivec3'; + } + else if (rank === 4) { + return 'ivec4'; + } + else if (rank === 5) { + return 'ivec5'; + } + else if (rank === 6) { + return 'ivec6'; + } + else { + throw Error(`GPU for rank ${rank} is not yet supported`); + } +} +/** Returns a new input info (a copy) that has a squeezed logical shape. */ +function squeezeInputInfo(inInfo, squeezedShape) { + // Deep copy. + const newInputInfo = JSON.parse(JSON.stringify(inInfo)); + newInputInfo.shapeInfo.logicalShape = squeezedShape; + return newInputInfo; +} +function getSqueezedParams(params, keptDims) { + return keptDims.map(d => params[d]).join(', '); +} +//# sourceMappingURL=shader_compiler.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js ***! + \**********************************************************************************/ +/*! exports provided: getLogicalCoordinatesFromFlatIndex, dotify, getFlatIndexFrom3D, ENCODE_FLOAT_SNIPPET */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLogicalCoordinatesFromFlatIndex", function() { return getLogicalCoordinatesFromFlatIndex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dotify", function() { return dotify; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFlatIndexFrom3D", function() { return getFlatIndexFrom3D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENCODE_FLOAT_SNIPPET", function() { return ENCODE_FLOAT_SNIPPET; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Produces GLSL code that derives logical coordinates from a flat + * index. The code performs integer division with each stride and decrements + * the index until the index equals the final dimension coordinate. + */ +function getLogicalCoordinatesFromFlatIndex(coords, shape, index = 'index') { + const strides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(shape); + return strides + .map((stride, i) => { + const line1 = `int ${coords[i]} = ${index} / ${stride}`; + const line2 = i === strides.length - 1 ? + `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${stride}` : + `index -= ${coords[i]} * ${stride}`; + return `${line1}; ${line2};`; + }) + .join(''); +} +function buildVec(x) { + if (x.length === 1) { + return `${x[0]}`; + } + return `vec${x.length}(${x.join(',')})`; +} +/** + * Produces GLSL code that computes the dot product of the input x and y + * vectors. Handles splitting inputs into increments of vec4s when necessary. + */ +function dotify(x, y) { + if (x.length !== y.length) { + throw new Error(`Vectors to be dotted must be of the same length -` + + `got ${x.length} and ${y.length}`); + } + const slices = []; + const nearestVec4 = Math.floor(x.length / 4); + const nearestVec4Remainder = x.length % 4; + for (let i = 0; i < nearestVec4; i++) { + const xSlice = x.slice(i * 4, i * 4 + 4); + const ySlice = y.slice(i * 4, i * 4 + 4); + slices.push(`${buildVec(xSlice)}, ${buildVec(ySlice)}`); + } + if (nearestVec4Remainder !== 0) { + let xSlice = x.slice(nearestVec4 * 4); + let ySlice = y.slice(nearestVec4 * 4); + if (xSlice.length === 1) { + xSlice = xSlice.map(d => `float(${d})`); + ySlice = ySlice.map(d => `float(${d})`); + } + slices.push(`${buildVec(xSlice)}, ${buildVec(ySlice)}`); + } + return slices.map((d, i) => `dot(${d})`).join('+'); +} +/** + * Produces GLSL that computes the flat index from 3D coordinates. + */ +function getFlatIndexFrom3D(shape) { + const strides = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].computeStrides(shape).map(d => d.toString()); + return ` + int getFlatIndex(ivec3 coords) { + return coords.x * ${strides[0]} + coords.y * ${strides[1]} + coords.z; + } +`; +} +const ENCODE_FLOAT_SNIPPET = ` + const float FLOAT_MAX = 1.70141184e38; + const float FLOAT_MIN = 1.17549435e-38; + + lowp vec4 encode_float(highp float v) { + if (isnan(v)) { + return vec4(255, 255, 255, 255); + } + + highp float av = abs(v); + + if(av < FLOAT_MIN) { + return vec4(0.0, 0.0, 0.0, 0.0); + } else if(v > FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 127.0) / 255.0; + } else if(v < -FLOAT_MAX) { + return vec4(0.0, 0.0, 128.0, 255.0) / 255.0; + } + + highp vec4 c = vec4(0,0,0,0); + + highp float e = floor(log2(av)); + highp float m = exp2(fract(log2(av))) - 1.0; + + c[2] = floor(128.0 * m); + m -= c[2] / 128.0; + c[1] = floor(32768.0 * m); + m -= c[1] / 32768.0; + c[0] = floor(8388608.0 * m); + + highp float ebias = e + 127.0; + c[3] = floor(ebias / 2.0); + ebias -= c[3] * 2.0; + c[2] += floor(ebias) * 128.0; + + c[3] += 128.0 * step(0.0, -v); + + return c / 255.0; + } +`; +//# sourceMappingURL=shader_compiler_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js ***! + \***********************************************************************/ +/*! exports provided: SliceProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SliceProgram", function() { return SliceProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class SliceProgram { + constructor(destSize) { + this.variableNames = ['source']; + this.outputShape = destSize; + this.rank = destSize.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(this.rank); + const uniformPart = `uniform int start[${this.rank}];`; + const sourceCoords = getCoords(this.rank); + let body; + const coordSum = destSize.map((_, i) => { + return `sourceLoc.${coords[i]} = start[${i}] + coords.${coords[i]};`; + }); + body = ` + ${dtype} sourceLoc; + ${dtype} coords = getOutputCoords(); + ${coordSum.join('\n')} + `; + this.userCode = ` + ${uniformPart} + void main() { + ${body} + setOutput(getSource(${sourceCoords})); + } + `; + } + getCustomSetupFunc(start) { + if (start.length !== this.rank) { + throw Error(`The rank (${this.rank}) of the program must match the ` + + `length of start (${start.length})`); + } + return (gpgpu, webGLProgram) => { + if (this.startLoc == null) { + this.startLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'start'); + if (this.startLoc == null) { + // This means the compiler has optimized and realized it doesn't need + // the uniform. + return; + } + } + gpgpu.gl.uniform1iv(this.startLoc, start); + }; + } +} +const coords = ['x', 'y', 'z', 'w', 'u', 'v']; +function getCoords(rank) { + if (rank === 1) { + return 'sourceLoc'; + } + else if (rank <= 6) { + return coords.slice(0, rank).map(x => 'sourceLoc.' + x).join(','); + } + else { + throw Error(`Slicing for rank ${rank} is not yet supported`); + } +} +//# sourceMappingURL=slice_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js ***! + \******************************************************************************/ +/*! exports provided: SlicePackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SlicePackedProgram", function() { return SlicePackedProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class SlicePackedProgram { + constructor(destSize) { + this.variableNames = ['source']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = destSize; + this.rank = destSize.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(this.rank); + const coords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('coords', this.rank); + const sourceLoc = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('sourceLoc', this.rank); + const innerDims = this.rank === 1 ? 'sourceLoc' : `vec2(${sourceLoc.slice(-2).join()})`; + const getChannel = `getChannel(getSource(${sourceLoc.join()}), ${innerDims})`; + const upperRow = ` + result.x = ${getChannel}; + if (++${coords[this.rank - 1]} < ${destSize[this.rank - 1]}) { + ++${sourceLoc[this.rank - 1]}; + result.y = ${getChannel}; + --${sourceLoc[this.rank - 1]}; + } + `; + const lowerRow = this.rank === 1 ? '' : ` + --${coords[this.rank - 1]}; + if (++${coords[this.rank - 2]} < ${destSize[this.rank - 2]}) { + ++${sourceLoc[this.rank - 2]}; + result.z = ${getChannel}; + if (++${coords[this.rank - 1]} < ${destSize[this.rank - 1]}) { + ++${sourceLoc[this.rank - 1]}; + result.w = ${getChannel}; + } + } + `; + const sourceLocSetup = this.rank <= 4 ? + `sourceLoc = coords + + ${dtype}(${destSize.map((_, i) => `start[${i}]`).join()});` : + destSize.map((_, i) => `${sourceLoc[i]} = ${coords[i]} + start[${i}];`) + .join('\n'); + this.userCode = ` + uniform int start[${this.rank}]; + void main() { + ${dtype} coords = getOutputCoords(); + ${dtype} sourceLoc; + ${sourceLocSetup} + vec4 result = vec4(0.); + ${upperRow} + ${lowerRow} + setOutput(result); + } + `; + } + getCustomSetupFunc(start) { + if (start.length !== this.rank) { + throw Error(`The rank (${this.rank}) of the program must match the ` + + `length of start (${start.length})`); + } + return (gpgpu, webGLProgram) => { + if (this.startLoc == null) { + this.startLoc = gpgpu.getUniformLocationNoThrow(webGLProgram, 'start'); + if (this.startLoc == null) { + // This means the compiler has optimized and realized it doesn't need + // the uniform. + return; + } + } + gpgpu.gl.uniform1iv(this.startLoc, start); + }; + } +} +//# sourceMappingURL=slice_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js ***! + \*******************************************************************************/ +/*! exports provided: StridedSliceProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StridedSliceProgram", function() { return StridedSliceProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class StridedSliceProgram { + constructor(begin, strides, size) { + this.variableNames = ['x']; + this.outputShape = size; + const rank = size.length; + const inputDtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(size.length); + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(size.length); + let newCoords = ''; + if (rank === 1) { + newCoords = 'coords * strides + begin'; + } + else { + let outputAxis = 0; + newCoords = + size.map((_, i) => { + outputAxis++; + return size.length === 1 ? + `coords * strides[${i}] + begin[${i}]` : + `coords[${outputAxis - 1}] * strides[${i}] + begin[${i}]`; + }) + .join(','); + } + this.userCode = ` + ${inputDtype} begin = ${inputDtype}(${begin}); + ${inputDtype} strides = ${inputDtype}(${strides}); + + void main() { + ${dtype} coords = getOutputCoords(); + setOutput(getX(${newCoords})); + } + `; + } +} +//# sourceMappingURL=strided_slice_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js ***! + \**********************************************************************/ +/*! exports provided: PackingScheme, TextureUsage, PhysicalTextureType, getUnpackedMatrixTextureShapeWidthHeight, getUnpackedArraySizeFromMatrixSize, getColorMatrixTextureShapeWidthHeight, getDenseTexShape, getMatrixSizeFromUnpackedArraySize, decodeMatrixFromUnpackedColorRGBAArray, getPackedMatrixTextureShapeWidthHeight, getPackedRGBAArraySizeFromMatrixShape, getTextureConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PackingScheme", function() { return PackingScheme; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextureUsage", function() { return TextureUsage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PhysicalTextureType", function() { return PhysicalTextureType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUnpackedMatrixTextureShapeWidthHeight", function() { return getUnpackedMatrixTextureShapeWidthHeight; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUnpackedArraySizeFromMatrixSize", function() { return getUnpackedArraySizeFromMatrixSize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColorMatrixTextureShapeWidthHeight", function() { return getColorMatrixTextureShapeWidthHeight; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDenseTexShape", function() { return getDenseTexShape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMatrixSizeFromUnpackedArraySize", function() { return getMatrixSizeFromUnpackedArraySize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeMatrixFromUnpackedColorRGBAArray", function() { return decodeMatrixFromUnpackedColorRGBAArray; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPackedMatrixTextureShapeWidthHeight", function() { return getPackedMatrixTextureShapeWidthHeight; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPackedRGBAArraySizeFromMatrixShape", function() { return getPackedRGBAArraySizeFromMatrixShape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextureConfig", function() { return getTextureConfig; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +var PackingScheme; +(function (PackingScheme) { + /** + * All values in a single texel are densely packed without any constraints. + * + * This is how the shader encodes a tensor with shape = [2, 3, 4] + * (indices are [batch, row, col]). + * + * 000|001 010|011 020|021 + * ------- ------- ------- + * 002|003 012|013 022|023 + * + * 100|101 110|111 120|121 + * ------- ------- ------- + * 102|103 112|113 122|123 + * + */ + PackingScheme[PackingScheme["DENSE"] = 0] = "DENSE"; + /** + * Single texels contain only values from the same batch, and from adjacent + * rows and columns. + * + * This is how the shader encodes a tensor with shape = [2, 3, 5] + * (indices are [batch, row, col]). + * + * 000|001 002|003 004|xxx 020|021 022|023 024|xxx + * ------- ------- ------- ------- ------- ------- + * 010|011 012|013 014|xxx xxx|xxx xxx|xxx xxx|xxx + * + * 100|101 102|103 104|xxx 120|121 122|123 124|xxx + * ------- ------- ------- ------- ------- ------- + * 110|111 112|113 114|xxx xxx|xxx xxx|xxx xxx|xxx + * + */ + PackingScheme[PackingScheme["SHARED_BATCH"] = 1] = "SHARED_BATCH"; +})(PackingScheme || (PackingScheme = {})); +var TextureUsage; +(function (TextureUsage) { + TextureUsage[TextureUsage["RENDER"] = 0] = "RENDER"; + TextureUsage[TextureUsage["UPLOAD"] = 1] = "UPLOAD"; + TextureUsage[TextureUsage["PIXELS"] = 2] = "PIXELS"; + TextureUsage[TextureUsage["DOWNLOAD"] = 3] = "DOWNLOAD"; +})(TextureUsage || (TextureUsage = {})); +var PhysicalTextureType; +(function (PhysicalTextureType) { + PhysicalTextureType[PhysicalTextureType["UNPACKED_FLOAT16"] = 0] = "UNPACKED_FLOAT16"; + PhysicalTextureType[PhysicalTextureType["UNPACKED_FLOAT32"] = 1] = "UNPACKED_FLOAT32"; + PhysicalTextureType[PhysicalTextureType["PACKED_4X1_UNSIGNED_BYTE"] = 2] = "PACKED_4X1_UNSIGNED_BYTE"; + PhysicalTextureType[PhysicalTextureType["PACKED_2X2_FLOAT32"] = 3] = "PACKED_2X2_FLOAT32"; + PhysicalTextureType[PhysicalTextureType["PACKED_2X2_FLOAT16"] = 4] = "PACKED_2X2_FLOAT16"; +})(PhysicalTextureType || (PhysicalTextureType = {})); +function getUnpackedMatrixTextureShapeWidthHeight(rows, columns) { + return [columns, rows]; +} +function getUnpackedArraySizeFromMatrixSize(matrixSize, channelsPerTexture) { + return matrixSize * channelsPerTexture; +} +function getColorMatrixTextureShapeWidthHeight(rows, columns) { + return [columns * 4, rows]; +} +/** + * Get shape for densely packed RGBA texture. + */ +function getDenseTexShape(shape) { + const size = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(shape); + const texelsNeeded = Math.ceil(size / 4); + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeToSquarishShape(texelsNeeded); +} +function getMatrixSizeFromUnpackedArraySize(unpackedSize, channelsPerTexture) { + if (unpackedSize % channelsPerTexture !== 0) { + throw new Error(`unpackedSize (${unpackedSize}) must be a multiple of ` + + `${channelsPerTexture}`); + } + return unpackedSize / channelsPerTexture; +} +function decodeMatrixFromUnpackedColorRGBAArray(unpackedArray, matrix, channels) { + const requiredSize = unpackedArray.length * channels / 4; + if (matrix.length < requiredSize) { + throw new Error(`matrix length (${matrix.length}) must be >= ${requiredSize}`); + } + let dst = 0; + for (let src = 0; src < unpackedArray.length; src += 4) { + for (let c = 0; c < channels; c++) { + matrix[dst++] = unpackedArray[src + c]; + } + } +} +function getPackedMatrixTextureShapeWidthHeight(rows, columns) { + return [ + Math.max(1, Math.ceil(columns / 2)), Math.max(1, Math.ceil(rows / 2)) + ]; +} +function getPackedRGBAArraySizeFromMatrixShape(rows, columns) { + const [w, h] = getPackedMatrixTextureShapeWidthHeight(rows, columns); + return w * h * 4; +} +function getTextureConfig( +// tslint:disable-next-line:no-any +gl, textureHalfFloatExtension) { + // tslint:disable-next-line:no-any + const glany = gl; + let internalFormatFloat; + let internalFormatHalfFloat; + let internalFormatPackedHalfFloat; + let internalFormatPackedFloat; + let textureFormatFloat; + let downloadTextureFormat; + let downloadUnpackNumChannels; + let defaultNumChannels; + let textureTypeHalfFloat; + let textureTypeFloat; + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION') === 2) { + internalFormatFloat = glany.R32F; + internalFormatHalfFloat = glany.R16F; + internalFormatPackedHalfFloat = glany.RGBA16F; + internalFormatPackedFloat = glany.RGBA32F; + textureFormatFloat = glany.RED; + downloadUnpackNumChannels = 4; + defaultNumChannels = 1; + textureTypeHalfFloat = glany.HALF_FLOAT; + textureTypeFloat = glany.FLOAT; + } + else { + internalFormatFloat = gl.RGBA; + internalFormatHalfFloat = gl.RGBA; + internalFormatPackedHalfFloat = gl.RGBA; + internalFormatPackedFloat = glany.RGBA; + textureFormatFloat = gl.RGBA; + downloadUnpackNumChannels = 4; + defaultNumChannels = 4; + textureTypeHalfFloat = textureHalfFloatExtension != null ? + textureHalfFloatExtension.HALF_FLOAT_OES : + null; + textureTypeFloat = gl.FLOAT; + } + downloadTextureFormat = gl.RGBA; + return { + internalFormatFloat, + internalFormatHalfFloat, + internalFormatPackedHalfFloat, + internalFormatPackedFloat, + textureFormatFloat, + downloadTextureFormat, + downloadUnpackNumChannels, + defaultNumChannels, + textureTypeHalfFloat, + textureTypeFloat + }; +} +//# sourceMappingURL=tex_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js ***! + \*****************************************************************************/ +/*! exports provided: TextureManager, computeBytes */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextureManager", function() { return TextureManager; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeBytes", function() { return computeBytes; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _gpgpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gpgpu_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +class TextureManager { + constructor(gpgpu) { + this.gpgpu = gpgpu; + this.numUsedTextures = 0; + this.numFreeTextures = 0; + this._numBytesAllocated = 0; + this._numBytesFree = 0; // How many bytes that have been allocated + // are available for reuse. + this.freeTextures = {}; + this.logEnabled = false; + this.usedTextures = {}; + } + acquireTexture(shapeRC, usage, isPacked) { + const physicalTexType = getPhysicalFromLogicalTextureType(usage, isPacked); + const shapeKey = getKeyFromTextureShape(shapeRC, physicalTexType, isPacked); + if (!(shapeKey in this.freeTextures)) { + this.freeTextures[shapeKey] = []; + } + if (!(shapeKey in this.usedTextures)) { + this.usedTextures[shapeKey] = []; + } + const texBytes = computeBytes(shapeRC, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked); + if (this.freeTextures[shapeKey].length > 0) { + this.numFreeTextures--; + this.numUsedTextures++; + this._numBytesFree -= texBytes; + this.log(); + const newTexture = this.freeTextures[shapeKey].shift(); + this.usedTextures[shapeKey].push(newTexture); + return newTexture; + } + let newTexture; + if (physicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT32) { + newTexture = this.gpgpu.createPackedMatrixTexture(shapeRC[0], shapeRC[1]); + } + else if (physicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT16) { + newTexture = + this.gpgpu.createFloat16PackedMatrixTexture(shapeRC[0], shapeRC[1]); + } + else if (physicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].UNPACKED_FLOAT32) { + newTexture = + this.gpgpu.createFloat32MatrixTexture(shapeRC[0], shapeRC[1]); + } + else if (physicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].UNPACKED_FLOAT16) { + newTexture = + this.gpgpu.createFloat16MatrixTexture(shapeRC[0], shapeRC[1]); + } + else if (physicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_4X1_UNSIGNED_BYTE) { + newTexture = + this.gpgpu.createUnsignedBytesMatrixTexture(shapeRC[0], shapeRC[1]); + } + this.usedTextures[shapeKey].push(newTexture); + this.numUsedTextures++; + this._numBytesAllocated += texBytes; + this.log(); + return newTexture; + } + releaseTexture(texture, shape, logicalTexType, isPacked) { + if (this.freeTextures == null) { + // Already disposed. + return; + } + const physicalTexType = getPhysicalFromLogicalTextureType(logicalTexType, isPacked); + const shapeKey = getKeyFromTextureShape(shape, physicalTexType, isPacked); + if (!(shapeKey in this.freeTextures)) { + this.freeTextures[shapeKey] = []; + } + const texBytes = computeBytes(shape, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked); + const deleteTexThreshold = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().get('WEBGL_DELETE_TEXTURE_THRESHOLD'); + if (deleteTexThreshold !== -1 && + this._numBytesAllocated > deleteTexThreshold) { + this.gpgpu.deleteMatrixTexture(texture); + this._numBytesAllocated -= texBytes; + } + else { + this.freeTextures[shapeKey].push(texture); + this.numFreeTextures++; + this._numBytesFree += texBytes; + } + this.numUsedTextures--; + const texList = this.usedTextures[shapeKey]; + const texIndex = texList.indexOf(texture); + if (texIndex < 0) { + throw new Error('Cannot release a texture that was never provided by this ' + + 'texture manager'); + } + texList.splice(texIndex, 1); + this.log(); + } + log() { + if (!this.logEnabled) { + return; + } + const total = this.numFreeTextures + this.numUsedTextures; + console.log('Free/Used', `${this.numFreeTextures} / ${this.numUsedTextures}`, `(${total})`); + const freeRatio = this._numBytesFree / this._numBytesAllocated; + console.log(`Bytes allocated: ${this._numBytesAllocated}`); + console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100 * freeRatio)}%)`); + } + get numBytesAllocated() { + return this._numBytesAllocated; + } + get numBytesFree() { + return this._numBytesFree; + } + getNumUsedTextures() { + return this.numUsedTextures; + } + getNumFreeTextures() { + return this.numFreeTextures; + } + dispose() { + if (this.freeTextures == null) { + // Already disposed. + return; + } + for (const texShape in this.freeTextures) { + this.freeTextures[texShape].forEach(tex => { + this.gpgpu.deleteMatrixTexture(tex); + }); + } + for (const texShape in this.usedTextures) { + this.usedTextures[texShape].forEach(tex => { + this.gpgpu.deleteMatrixTexture(tex); + }); + } + this.freeTextures = null; + this.usedTextures = null; + this.numUsedTextures = 0; + this.numFreeTextures = 0; + this._numBytesAllocated = 0; + this._numBytesFree = 0; + } +} +function numBytesForInternalFormat(gl, internalFormat) { + // tslint:disable-next-line:no-any + const glany = gl; + if (internalFormat === glany.R32F) { + return 4; + } + else if (internalFormat === glany.R16F) { + return 2; + } + else if (internalFormat === glany.RGBA32F) { + return 16; + } + else if (internalFormat === gl.RGBA) { + return 16; + } + else if (internalFormat === glany.RGBA16F) { + return 8; + } + throw new Error(`Unknown internal format ${internalFormat}`); +} +function computeBytes(shape, physicalTexType, gl, textureConfig, isPacked) { + // It is not possible to infer packed status from the texture type because + // depending on the textureConfig, different texture types may resolve to the + // same internal format (e.g. in WebGL1, the internal format for + // UNPACKED_FLOAT16 textures is gl.RGBA). Therefore we pass in `isPacked` + // explicitly. + const internalFormat = internalFormatForPhysicalTexType(physicalTexType, textureConfig); + let numElements; + if (isPacked) { + const [packedWidth, packedHeight] = Object(_tex_util__WEBPACK_IMPORTED_MODULE_2__["getPackedMatrixTextureShapeWidthHeight"])(shape[0], shape[1]); + numElements = packedWidth * packedHeight; + } + else { + const [width, height] = Object(_tex_util__WEBPACK_IMPORTED_MODULE_2__["getUnpackedMatrixTextureShapeWidthHeight"])(shape[0], shape[1]); + numElements = width * height; + } + const bytesPerElement = numBytesForInternalFormat(gl, internalFormat); + return numElements * bytesPerElement; +} +function internalFormatForPhysicalTexType(physicalTexType, textureConfig) { + switch (physicalTexType) { + case _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT32: + return Object(_gpgpu_util__WEBPACK_IMPORTED_MODULE_1__["getInternalFormatForPackedMatrixTexture"])(textureConfig); + case _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT16: + return Object(_gpgpu_util__WEBPACK_IMPORTED_MODULE_1__["getInternalFormatForFloat16PackedMatrixTexture"])(textureConfig); + case _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].UNPACKED_FLOAT32: + return Object(_gpgpu_util__WEBPACK_IMPORTED_MODULE_1__["getInternalFormatForFloat32MatrixTexture"])(textureConfig); + case _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].UNPACKED_FLOAT16: + return Object(_gpgpu_util__WEBPACK_IMPORTED_MODULE_1__["getInternalFormatForFloat16MatrixTexture"])(textureConfig); + case _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_4X1_UNSIGNED_BYTE: + return Object(_gpgpu_util__WEBPACK_IMPORTED_MODULE_1__["getInternalFormatForUnsignedBytesMatrixTexture"])(textureConfig); + default: + throw new Error(`Unknown physical texture type ${physicalTexType}`); + } +} +function getPhysicalTextureForRendering(isPacked) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_RENDER_FLOAT32_ENABLED')) { + if (isPacked) { + return _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT32; + } + return _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].UNPACKED_FLOAT32; + } + if (isPacked) { + return _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT16; + } + return _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].UNPACKED_FLOAT16; +} +function getPhysicalFromLogicalTextureType(logicalTexType, isPacked) { + if (logicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["TextureUsage"].UPLOAD) { + return _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_2X2_FLOAT32; + } + else if (logicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["TextureUsage"].RENDER || logicalTexType == null) { + return getPhysicalTextureForRendering(isPacked); + } + else if (logicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["TextureUsage"].DOWNLOAD || + logicalTexType === _tex_util__WEBPACK_IMPORTED_MODULE_2__["TextureUsage"].PIXELS) { + return _tex_util__WEBPACK_IMPORTED_MODULE_2__["PhysicalTextureType"].PACKED_4X1_UNSIGNED_BYTE; + } + throw new Error(`Unknown logical texture type ${logicalTexType}`); +} +function getKeyFromTextureShape(shapeRowsCol, physicalTexType, isPacked) { + return `${shapeRowsCol[0]}_${shapeRowsCol[1]}_${physicalTexType}_${isPacked}`; +} +//# sourceMappingURL=texture_manager.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js ***! + \**********************************************************************/ +/*! exports provided: TileProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TileProgram", function() { return TileProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class TileProgram { + constructor(aShape, reps) { + this.variableNames = ['A']; + const outputShape = new Array(aShape.length); + for (let i = 0; i < outputShape.length; i++) { + outputShape[i] = aShape[i] * reps[i]; + } + this.outputShape = outputShape; + this.rank = outputShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(this.rank); + const sourceCoords = getSourceCoords(aShape); + this.userCode = ` + void main() { + ${dtype} resRC = getOutputCoords(); + setOutput(getA(${sourceCoords})); + } + `; + } +} +function getSourceCoords(aShape) { + const rank = aShape.length; + if (rank > 5) { + throw Error(`Tile for rank ${rank} is not yet supported`); + } + if (rank === 1) { + return `imod(resRC, ${aShape[0]})`; + } + const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u']; + const sourceCoords = []; + for (let i = 0; i < aShape.length; i++) { + sourceCoords.push(`imod(${currentCoords[i]}, ${aShape[i]})`); + } + return sourceCoords.join(); +} +//# sourceMappingURL=tile_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js ***! + \***************************************************************************/ +/*! exports provided: TransposeProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransposeProgram", function() { return TransposeProgram; }); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class TransposeProgram { + constructor(aShape, newDim) { + this.variableNames = ['A']; + const outputShape = new Array(aShape.length); + for (let i = 0; i < outputShape.length; i++) { + outputShape[i] = aShape[newDim[i]]; + } + this.outputShape = outputShape; + this.rank = outputShape.length; + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_0__["getCoordsDataType"])(this.rank); + const switched = getSwitchedCoords(newDim); + this.userCode = ` + void main() { + ${dtype} resRC = getOutputCoords(); + setOutput(getA(${switched})); + } + `; + } +} +function getSwitchedCoords(newDim) { + const rank = newDim.length; + if (rank > 6) { + throw Error(`Transpose for rank ${rank} is not yet supported`); + } + const originalOrder = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u', 'resRC.v']; + const switchedCoords = new Array(rank); + for (let i = 0; i < newDim.length; i++) { + switchedCoords[newDim[i]] = originalOrder[i]; + } + return switchedCoords.join(); +} +//# sourceMappingURL=transpose_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_packed_gpu.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_packed_gpu.js ***! + \**********************************************************************************/ +/*! exports provided: TransposePackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransposePackedProgram", function() { return TransposePackedProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class TransposePackedProgram { + constructor(aShape, newDim) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + const outputShape = new Array(aShape.length); + for (let i = 0; i < outputShape.length; i++) { + outputShape[i] = aShape[newDim[i]]; + } + this.outputShape = outputShape; + this.rank = outputShape.length; + if (this.rank > 6) { + throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`); + } + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(this.rank); + const outputOrder = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getVecChannels"])('rc', this.rank); + const switchedOrder = new Array(this.rank); + for (let i = 0; i < newDim.length; i++) { + switchedOrder[newDim[i]] = outputOrder[i]; + } + const innerDims = `vec2(${switchedOrder.slice(-2).join()})`; + const nextColumn = `++${outputOrder[this.rank - 1]} < ${outputShape[this.rank - 1]}`; + const getc = `getChannel(getA(${switchedOrder.join()}), ${innerDims})`; + this.userCode = ` + void main() { + ${dtype} rc = getOutputCoords(); + vec4 result = vec4(0.); + result[0] = ${getc}; + if(${nextColumn}) { + result[1] = ${getc}; + } + --${outputOrder[this.rank - 1]}; + if(++${outputOrder[this.rank - 2]} < ${outputShape[this.rank - 2]}) { + result[2] = ${getc}; + if(${nextColumn}) { + result[3] = ${getc}; + } + } + setOutput(result); + } + `; + } +} +//# sourceMappingURL=transpose_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js ***! + \*************************************************************************/ +/*! exports provided: UnaryOpProgram, LINEAR, ABS, RELU, RELU6, ELU, SELU, STEP, NEG, CEIL, FLOOR, SIGN, IS_NAN, IS_INF, IS_FINITE, ROUND, EXP, EXPM1, LOG, LOG1P, SQRT, RSQRT, SIGMOID, SOFTPLUS, ASIN, ACOS, ATAN, SINH, COSH, TANH, ASINH, ACOSH, ATANH, ERF, RECIPROCAL, LOGICAL_NOT, CLONE */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnaryOpProgram", function() { return UnaryOpProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LINEAR", function() { return LINEAR; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ABS", function() { return ABS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RELU", function() { return RELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RELU6", function() { return RELU6; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ELU", function() { return ELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SELU", function() { return SELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STEP", function() { return STEP; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEG", function() { return NEG; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CEIL", function() { return CEIL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FLOOR", function() { return FLOOR; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SIGN", function() { return SIGN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IS_NAN", function() { return IS_NAN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IS_INF", function() { return IS_INF; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IS_FINITE", function() { return IS_FINITE; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ROUND", function() { return ROUND; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EXP", function() { return EXP; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EXPM1", function() { return EXPM1; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOG", function() { return LOG; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOG1P", function() { return LOG1P; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SQRT", function() { return SQRT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RSQRT", function() { return RSQRT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SIGMOID", function() { return SIGMOID; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SOFTPLUS", function() { return SOFTPLUS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASIN", function() { return ASIN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ACOS", function() { return ACOS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ATAN", function() { return ATAN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SINH", function() { return SINH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COSH", function() { return COSH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TANH", function() { return TANH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASINH", function() { return ASINH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ACOSH", function() { return ACOSH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ATANH", function() { return ATANH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ERF", function() { return ERF; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RECIPROCAL", function() { return RECIPROCAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOGICAL_NOT", function() { return LOGICAL_NOT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CLONE", function() { return CLONE; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +class UnaryOpProgram { + constructor(aShape, opSnippet) { + this.variableNames = ['A']; + this.outputShape = aShape; + this.userCode = ` + float unaryOperation(float x) { + ${opSnippet} + } + + void main() { + float x = getAAtOutCoords(); + float y = unaryOperation(x); + + setOutput(y); + } + `; + } +} +const CHECK_NAN_SNIPPET = `if (isnan(x)) return x;`; +const LINEAR = `return x;`; +const ABS = `return abs(x);`; +const RELU = CHECK_NAN_SNIPPET + ` + return (x < 0.0) ? 0.0 : x; +`; +const RELU6 = CHECK_NAN_SNIPPET + ` + return (x < 0.0) ? 0.0 : min(6.0, x); +`; +const ELU = `return (x >= 0.0) ? x : (exp(x) - 1.0);`; +const SELU = ` + // Stable and Attracting Fixed Point (0, 1) for Normalized Weights. + // see: https://arxiv.org/abs/1706.02515 + float scaleAlpha = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].SELU_SCALEALPHA}; + float scale = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].SELU_SCALE}; + return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0); +`; +function STEP(alpha = 0.0) { + return CHECK_NAN_SNIPPET + ` + return x > 0.0 ? 1.0 : float(${alpha}); + `; +} +const NEG = `return -x;`; +const CEIL = `return ceil(x);`; +const FLOOR = `return floor(x);`; +const SIGN = ` + if (isnan(x)) { return 0.0; } + return sign(x); +`; +const IS_NAN = `return float(isnan(x));`; +const IS_INF = `return float(isinf(x));`; +const IS_FINITE = `return float(!isnan(x) && !isinf(x));`; +const ROUND = ` + // OpenGL ES does not support round function. + // The algorithm is based on banker's rounding. + float base = floor(x); + if ((x - base) < 0.5) { + return floor(x); + } else if ((x - base) > 0.5) { + return ceil(x); + } else { + if (mod(base, 2.0) == 0.0) { + return base; + } else { + return base + 1.0; + } + } +`; +const EXP = `return exp(x);`; +const EXPM1 = `return exp(x) - 1.0;`; +const LOG = `if (x < 0.0) return NAN; + return log(x);`; +const LOG1P = `return log(1.0 + x);`; +const SQRT = `return sqrt(x);`; +const RSQRT = `return inversesqrt(x);`; +const SIGMOID = `return 1.0 / (1.0 + exp(-1.0 * x));`; +/** + * mirrors the implementation of tf.nn.softplus: https://goo.gl/vkcvwX + * + * epsilon is the difference between 1.0 and the next representable + * float. For a single precision 32 bit float this should be 2^-23, see: + * https://math.byu.edu/~schow/work/IEEEFloatingPoint.htm + * + * too_large = (x > -threshold) is value above which exp(x) may overflow + * but softplus(x) == x is within machine epsilon + * + * too_small = (x < threshold) is value below which exp(x) may underflow, + * but softplus(x) == exp(x) is within machine epsilon. + */ +const SOFTPLUS = ` + float epsilon = 1.1920928955078125e-7; + float threshold = log(epsilon) + 2.0; + + bool too_large = x > -threshold; + bool too_small = x < threshold; + + float result; + float exp_x = exp(x); + + if (too_large){ + result = x; + } + else if (too_small){ + result = exp_x; + } + else{ + result = log(exp_x + 1.0); + } + return result; +`; +const ASIN = CHECK_NAN_SNIPPET + ` + if (abs(x) > 1.) { + return NAN; + } + return asin(x); +`; +const ACOS = CHECK_NAN_SNIPPET + ` + if (abs(x) > 1.) { + return NAN; + } + return acos(x); +`; +const ATAN = CHECK_NAN_SNIPPET + ` + return atan(x); +`; +const SINH = ` + float e2x = exp(x); + return (e2x - 1.0 / e2x) / 2.0; +`; +const COSH = ` + float e2x = exp(-x); + return (e2x + 1.0 / e2x) / 2.0; +`; +const TANH = ` + float e2x = exp(-2.0 * abs(x)); + return sign(x) * (1.0 - e2x) / (1.0 + e2x); +`; +const ASINH = CHECK_NAN_SNIPPET + `return log(x + sqrt(x * x + 1.0));`; +const ACOSH = CHECK_NAN_SNIPPET + ` + if (x < 1.0) return NAN; + return log(x + sqrt(x * x - 1.0));`; +const ATANH = CHECK_NAN_SNIPPET + ` + if ((x < -1.0) || (x > 1.0)) return NAN; + return (log(1.0 + x) - log(1.0 - x)) / 2.0;`; +const ERF = ` + // Error function is calculated approximately with elementary function. + // See "Handbook of Mathematical Functions with Formulas, + // Graphs, and Mathematical Tables", Abramowitz and Stegun. + float p = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_P}; + float a1 = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A1}; + float a2 = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A2}; + float a3 = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A3}; + float a4 = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A4}; + float a5 = ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["backend_util"].ERF_A5}; + + float sign = sign(x); + x = abs(x); + float t = 1.0 / (1.0 + p * x); + return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x)); +`; +const RECIPROCAL = `return 1.0 / x;`; +const LOGICAL_NOT = `return float(!(x >= 1.0));`; +const CLONE = 'return x;'; +//# sourceMappingURL=unaryop_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js ***! + \********************************************************************************/ +/*! exports provided: LINEAR, LOG, RELU, RELU6, ELU, UnaryOpPackedProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LINEAR", function() { return LINEAR; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOG", function() { return LOG; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RELU", function() { return RELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RELU6", function() { return RELU6; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ELU", function() { return ELU; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnaryOpPackedProgram", function() { return UnaryOpPackedProgram; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const LINEAR = `return x;`; +const LOG = ` + vec4 result = log(x); + vec4 isNaN = vec4(lessThan(x, vec4(0.0))); + result.r = isNaN.r == 1.0 ? NAN : result.r; + result.g = isNaN.g == 1.0 ? NAN : result.g; + result.b = isNaN.b == 1.0 ? NAN : result.b; + result.a = isNaN.a == 1.0 ? NAN : result.a; + + return result; +`; +const RELU = ` + vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +const RELU6 = ` + vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0))); + bvec4 isNaN = isnan(x); + + result.r = isNaN.r ? x.r : result.r; + result.g = isNaN.g ? x.g : result.g; + result.b = isNaN.b ? x.b : result.b; + result.a = isNaN.a ? x.a : result.a; + + return result; +`; +const ELU = ` + vec4 result; + + result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0); + result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0); + result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0); + result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0); + + return result; +`; +class UnaryOpPackedProgram { + constructor(aShape, opSnippet) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = true; + this.outputShape = aShape; + this.userCode = ` + vec4 unaryOperation(vec4 x) { + ${opSnippet} + } + + void main() { + vec4 x = getAAtOutCoords(); + vec4 y = unaryOperation(x); + + setOutput(y); + } + `; + } +} +//# sourceMappingURL=unaryop_packed_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js ***! + \************************************************************************/ +/*! exports provided: UnpackProgram */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnpackProgram", function() { return UnpackProgram; }); +/* harmony import */ var _packing_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./packing_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js"); +/* harmony import */ var _shader_compiler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shader_compiler */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +class UnpackProgram { + constructor(outputShape) { + this.variableNames = ['A']; + this.packedInputs = true; + this.packedOutput = false; + this.outputShape = outputShape; + const rank = outputShape.length; + const channels = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getChannels"])('rc', rank); + const dtype = Object(_shader_compiler__WEBPACK_IMPORTED_MODULE_1__["getCoordsDataType"])(rank); + const sourceCoords = Object(_packing_util__WEBPACK_IMPORTED_MODULE_0__["getSourceCoords"])(rank, channels); + const innerDims = channels.slice(-2); + const coords = rank <= 1 ? 'rc' : `vec2(${innerDims.join(',')})`; + this.userCode = ` + void main() { + ${dtype} rc = getOutputCoords(); + vec4 packedInput = getA(${sourceCoords}); + + setOutput(getChannel(packedInput, ${coords})); + } + `; + } +} +//# sourceMappingURL=unpack_gpu.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js ***! + \*********************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +/** @license See the LICENSE file. */ +// This code is auto-generated, do not modify this file! +const version = '2.7.0'; + +//# sourceMappingURL=version.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.js ***! + \*******************************************************************/ +/*! exports provided: MathBackendWebGL, setWebGLContext, GPGPUContext, gpgpu_util, webgl_util, forceHalfFloat */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceHalfFloat", function() { return forceHalfFloat; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _gpgpu_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gpgpu_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "gpgpu_util", function() { return _gpgpu_util__WEBPACK_IMPORTED_MODULE_1__; }); +/* harmony import */ var _webgl_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webgl_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "webgl_util", function() { return _webgl_util__WEBPACK_IMPORTED_MODULE_2__; }); +/* harmony import */ var _backend_webgl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend_webgl */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MathBackendWebGL", function() { return _backend_webgl__WEBPACK_IMPORTED_MODULE_3__["MathBackendWebGL"]; }); + +/* harmony import */ var _canvas_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./canvas_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setWebGLContext", function() { return _canvas_util__WEBPACK_IMPORTED_MODULE_4__["setWebGLContext"]; }); + +/* harmony import */ var _gpgpu_context__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./gpgpu_context */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GPGPUContext", function() { return _gpgpu_context__WEBPACK_IMPORTED_MODULE_5__["GPGPUContext"]; }); + +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +// WebGL specific utils. + +/** + * Enforce use of half precision textures if available on the platform. + * + * @doc {heading: 'Environment', namespace: 'webgl'} + */ +function forceHalfFloat() { + Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().set('WEBGL_FORCE_F16_TEXTURES', true); +} +//# sourceMappingURL=webgl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js ***! + \************************************************************************/ +/*! exports provided: callAndCheck, canBeRepresented, getWebGLErrorMessage, getExtensionOrThrow, createVertexShader, createFragmentShader, createProgram, linkProgram, validateProgram, createStaticVertexBuffer, createStaticIndexBuffer, getNumChannels, createTexture, validateTextureSize, createFramebuffer, bindVertexBufferToProgramAttribute, bindTextureUnit, unbindTextureUnit, getProgramUniformLocationOrThrow, getProgramUniformLocation, bindTextureToProgramUniformSampler, bindCanvasToFramebuffer, bindColorTextureToFramebuffer, unbindColorTextureFromFramebuffer, validateFramebuffer, getFramebufferErrorMessage, getBatchDim, getRowsCols, getShapeAs3D, getTextureShapeFromLogicalShape, isReshapeFree, getWebGLMaxTextureSize, resetMaxTextureSize, resetMaxTexturesInShader, getMaxTexturesInShader, getWebGLDisjointQueryTimerVersion, hasExtension, isWebGLVersionEnabled, isCapableOfRenderingToFloatTexture, isDownloadFloatTextureEnabled, isWebGLFenceEnabled, assertNotComplex */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "callAndCheck", function() { return callAndCheck; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canBeRepresented", function() { return canBeRepresented; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWebGLErrorMessage", function() { return getWebGLErrorMessage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getExtensionOrThrow", function() { return getExtensionOrThrow; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createVertexShader", function() { return createVertexShader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFragmentShader", function() { return createFragmentShader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createProgram", function() { return createProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProgram", function() { return linkProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateProgram", function() { return validateProgram; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createStaticVertexBuffer", function() { return createStaticVertexBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createStaticIndexBuffer", function() { return createStaticIndexBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNumChannels", function() { return getNumChannels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createTexture", function() { return createTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateTextureSize", function() { return validateTextureSize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFramebuffer", function() { return createFramebuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindVertexBufferToProgramAttribute", function() { return bindVertexBufferToProgramAttribute; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindTextureUnit", function() { return bindTextureUnit; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unbindTextureUnit", function() { return unbindTextureUnit; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProgramUniformLocationOrThrow", function() { return getProgramUniformLocationOrThrow; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProgramUniformLocation", function() { return getProgramUniformLocation; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindTextureToProgramUniformSampler", function() { return bindTextureToProgramUniformSampler; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCanvasToFramebuffer", function() { return bindCanvasToFramebuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindColorTextureToFramebuffer", function() { return bindColorTextureToFramebuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unbindColorTextureFromFramebuffer", function() { return unbindColorTextureFromFramebuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateFramebuffer", function() { return validateFramebuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFramebufferErrorMessage", function() { return getFramebufferErrorMessage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBatchDim", function() { return getBatchDim; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRowsCols", function() { return getRowsCols; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getShapeAs3D", function() { return getShapeAs3D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextureShapeFromLogicalShape", function() { return getTextureShapeFromLogicalShape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isReshapeFree", function() { return isReshapeFree; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWebGLMaxTextureSize", function() { return getWebGLMaxTextureSize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetMaxTextureSize", function() { return resetMaxTextureSize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetMaxTexturesInShader", function() { return resetMaxTexturesInShader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMaxTexturesInShader", function() { return getMaxTexturesInShader; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWebGLDisjointQueryTimerVersion", function() { return getWebGLDisjointQueryTimerVersion; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasExtension", function() { return hasExtension; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWebGLVersionEnabled", function() { return isWebGLVersionEnabled; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCapableOfRenderingToFloatTexture", function() { return isCapableOfRenderingToFloatTexture; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDownloadFloatTextureEnabled", function() { return isDownloadFloatTextureEnabled; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWebGLFenceEnabled", function() { return isWebGLFenceEnabled; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assertNotComplex", function() { return assertNotComplex; }); +/* harmony import */ var _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tensorflow/tfjs-core */ "./node_modules/@tensorflow/tfjs-core/dist/index.js"); +/* harmony import */ var _canvas_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./canvas_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js"); +/* harmony import */ var _tex_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tex_util */ "./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +function callAndCheck(gl, func) { + const returnValue = func(); + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('DEBUG')) { + checkWebGLError(gl); + } + return returnValue; +} +function checkWebGLError(gl) { + const error = gl.getError(); + if (error !== gl.NO_ERROR) { + throw new Error('WebGL Error: ' + getWebGLErrorMessage(gl, error)); + } +} +// https://en.wikipedia.org/wiki/Half-precision_floating-point_format +const MIN_FLOAT16 = 5.96e-8; +const MAX_FLOAT16 = 65504; +function canBeRepresented(num) { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('WEBGL_RENDER_FLOAT32_ENABLED') || num === 0 || + (MIN_FLOAT16 < Math.abs(num) && Math.abs(num) < MAX_FLOAT16)) { + return true; + } + return false; +} +function getWebGLErrorMessage(gl, status) { + switch (status) { + case gl.NO_ERROR: + return 'NO_ERROR'; + case gl.INVALID_ENUM: + return 'INVALID_ENUM'; + case gl.INVALID_VALUE: + return 'INVALID_VALUE'; + case gl.INVALID_OPERATION: + return 'INVALID_OPERATION'; + case gl.INVALID_FRAMEBUFFER_OPERATION: + return 'INVALID_FRAMEBUFFER_OPERATION'; + case gl.OUT_OF_MEMORY: + return 'OUT_OF_MEMORY'; + case gl.CONTEXT_LOST_WEBGL: + return 'CONTEXT_LOST_WEBGL'; + default: + return `Unknown error code ${status}`; + } +} +function getExtensionOrThrow(gl, extensionName) { + return throwIfNull(gl, () => gl.getExtension(extensionName), 'Extension "' + extensionName + '" not supported on this browser.'); +} +function createVertexShader(gl, vertexShaderSource) { + const vertexShader = throwIfNull(gl, () => gl.createShader(gl.VERTEX_SHADER), 'Unable to create vertex WebGLShader.'); + callAndCheck(gl, () => gl.shaderSource(vertexShader, vertexShaderSource)); + callAndCheck(gl, () => gl.compileShader(vertexShader)); + if (gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS) === false) { + console.log(gl.getShaderInfoLog(vertexShader)); + throw new Error('Failed to compile vertex shader.'); + } + return vertexShader; +} +function createFragmentShader(gl, fragmentShaderSource) { + const fragmentShader = throwIfNull(gl, () => gl.createShader(gl.FRAGMENT_SHADER), 'Unable to create fragment WebGLShader.'); + callAndCheck(gl, () => gl.shaderSource(fragmentShader, fragmentShaderSource)); + callAndCheck(gl, () => gl.compileShader(fragmentShader)); + if (gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS) === false) { + logShaderSourceAndInfoLog(fragmentShaderSource, gl.getShaderInfoLog(fragmentShader)); + throw new Error('Failed to compile fragment shader.'); + } + return fragmentShader; +} +const lineNumberRegex = /ERROR: [0-9]+:([0-9]+):/g; +function logShaderSourceAndInfoLog(shaderSource, shaderInfoLog) { + const lineNumberRegexResult = lineNumberRegex.exec(shaderInfoLog); + if (lineNumberRegexResult == null) { + console.log(`Couldn't parse line number in error: ${shaderInfoLog}`); + console.log(shaderSource); + return; + } + const lineNumber = +lineNumberRegexResult[1]; + const shaderLines = shaderSource.split('\n'); + const pad = shaderLines.length.toString().length + 2; + const linesWithLineNumbers = shaderLines.map((line, lineNumber) => _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].rightPad((lineNumber + 1).toString(), pad) + line); + let maxLineLength = 0; + for (let i = 0; i < linesWithLineNumbers.length; i++) { + maxLineLength = Math.max(linesWithLineNumbers[i].length, maxLineLength); + } + const beforeErrorLines = linesWithLineNumbers.slice(0, lineNumber - 1); + const errorLine = linesWithLineNumbers.slice(lineNumber - 1, lineNumber); + const afterErrorLines = linesWithLineNumbers.slice(lineNumber); + console.log(beforeErrorLines.join('\n')); + console.log(shaderInfoLog.split('\n')[0]); + console.log(`%c ${_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].rightPad(errorLine[0], maxLineLength)}`, 'border:1px solid red; background-color:#e3d2d2; color:#a61717'); + console.log(afterErrorLines.join('\n')); +} +function createProgram(gl) { + return throwIfNull(gl, () => gl.createProgram(), 'Unable to create WebGLProgram.'); +} +function linkProgram(gl, program) { + callAndCheck(gl, () => gl.linkProgram(program)); + if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) { + console.log(gl.getProgramInfoLog(program)); + throw new Error('Failed to link vertex and fragment shaders.'); + } +} +function validateProgram(gl, program) { + callAndCheck(gl, () => gl.validateProgram(program)); + if (gl.getProgramParameter(program, gl.VALIDATE_STATUS) === false) { + console.log(gl.getProgramInfoLog(program)); + throw new Error('Shader program validation failed.'); + } +} +function createStaticVertexBuffer(gl, data) { + const buffer = throwIfNull(gl, () => gl.createBuffer(), 'Unable to create WebGLBuffer'); + callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, buffer)); + callAndCheck(gl, () => gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW)); + return buffer; +} +function createStaticIndexBuffer(gl, data) { + const buffer = throwIfNull(gl, () => gl.createBuffer(), 'Unable to create WebGLBuffer'); + callAndCheck(gl, () => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer)); + callAndCheck(gl, () => gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.STATIC_DRAW)); + return buffer; +} +function getNumChannels() { + if (Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_VERSION') === 2) { + return 1; + } + return 4; +} +function createTexture(gl) { + return throwIfNull(gl, () => gl.createTexture(), 'Unable to create WebGLTexture.'); +} +function validateTextureSize(width, height) { + const maxTextureSize = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_MAX_TEXTURE_SIZE'); + if ((width <= 0) || (height <= 0)) { + const requested = `[${width}x${height}]`; + throw new Error('Requested texture size ' + requested + ' is invalid.'); + } + if ((width > maxTextureSize) || (height > maxTextureSize)) { + const requested = `[${width}x${height}]`; + const max = `[${maxTextureSize}x${maxTextureSize}]`; + throw new Error('Requested texture size ' + requested + + ' greater than WebGL maximum on this browser / GPU ' + max + '.'); + } +} +function createFramebuffer(gl) { + return throwIfNull(gl, () => gl.createFramebuffer(), 'Unable to create WebGLFramebuffer.'); +} +function bindVertexBufferToProgramAttribute(gl, program, attribute, buffer, arrayEntriesPerItem, itemStrideInBytes, itemOffsetInBytes) { + const loc = gl.getAttribLocation(program, attribute); + if (loc === -1) { + // The GPU compiler decided to strip out this attribute because it's unused, + // thus no need to bind. + return false; + } + callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, buffer)); + callAndCheck(gl, () => gl.vertexAttribPointer(loc, arrayEntriesPerItem, gl.FLOAT, false, itemStrideInBytes, itemOffsetInBytes)); + callAndCheck(gl, () => gl.enableVertexAttribArray(loc)); + return true; +} +function bindTextureUnit(gl, texture, textureUnit) { + validateTextureUnit(gl, textureUnit); + callAndCheck(gl, () => gl.activeTexture(gl.TEXTURE0 + textureUnit)); + callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture)); +} +function unbindTextureUnit(gl, textureUnit) { + validateTextureUnit(gl, textureUnit); + callAndCheck(gl, () => gl.activeTexture(gl.TEXTURE0 + textureUnit)); + callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null)); +} +function getProgramUniformLocationOrThrow(gl, program, uniformName) { + return throwIfNull(gl, () => gl.getUniformLocation(program, uniformName), 'uniform "' + uniformName + '" not present in program.'); +} +function getProgramUniformLocation(gl, program, uniformName) { + return gl.getUniformLocation(program, uniformName); +} +function bindTextureToProgramUniformSampler(gl, texture, uniformSamplerLocation, textureUnit) { + callAndCheck(gl, () => bindTextureUnit(gl, texture, textureUnit)); + callAndCheck(gl, () => gl.uniform1i(uniformSamplerLocation, textureUnit)); +} +function bindCanvasToFramebuffer(gl) { + callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, null)); + callAndCheck(gl, () => gl.viewport(0, 0, gl.canvas.width, gl.canvas.height)); + callAndCheck(gl, () => gl.scissor(0, 0, gl.canvas.width, gl.canvas.height)); +} +function bindColorTextureToFramebuffer(gl, texture, framebuffer) { + callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer)); + callAndCheck(gl, () => gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)); +} +function unbindColorTextureFromFramebuffer(gl, framebuffer) { + callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer)); + callAndCheck(gl, () => gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0)); +} +function validateFramebuffer(gl) { + const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status !== gl.FRAMEBUFFER_COMPLETE) { + throw new Error('Error binding framebuffer: ' + getFramebufferErrorMessage(gl, status)); + } +} +function getFramebufferErrorMessage(gl, status) { + switch (status) { + case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT: + return 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT'; + case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: + return 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT'; + case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS: + return 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS'; + case gl.FRAMEBUFFER_UNSUPPORTED: + return 'FRAMEBUFFER_UNSUPPORTED'; + default: + return `unknown error ${status}`; + } +} +function throwIfNull(gl, returnTOrNull, failureMessage) { + const tOrNull = callAndCheck(gl, () => returnTOrNull()); + if (tOrNull == null) { + throw new Error(failureMessage); + } + return tOrNull; +} +function validateTextureUnit(gl, textureUnit) { + const maxTextureUnit = gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1; + const glTextureUnit = textureUnit + gl.TEXTURE0; + if (glTextureUnit < gl.TEXTURE0 || glTextureUnit > maxTextureUnit) { + const textureUnitRange = `[gl.TEXTURE0, gl.TEXTURE${maxTextureUnit}]`; + throw new Error(`textureUnit must be in ${textureUnitRange}.`); + } +} +function getBatchDim(shape, dimsToSkip = 2) { + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(shape.slice(0, shape.length - dimsToSkip)); +} +function getRowsCols(shape) { + if (shape.length === 0) { + throw Error('Cannot get rows and columns of an empty shape array.'); + } + return [ + shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1] + ]; +} +function getShapeAs3D(shape) { + let shapeAs3D = [1, 1, 1]; + const isScalar = shape.length === 0 || (shape.length === 1 && shape[0] === 1); + if (!isScalar) { + shapeAs3D = + [getBatchDim(shape), ...getRowsCols(shape)]; + } + return shapeAs3D; +} +function getTextureShapeFromLogicalShape(logShape, isPacked = false) { + let maxTexSize = Object(_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["env"])().getNumber('WEBGL_MAX_TEXTURE_SIZE'); + if (isPacked) { + maxTexSize = maxTexSize * 2; + // This logic ensures we accurately count the number of packed texels needed + // to accommodate the tensor. We can only pack values in the same texel if + // they are from adjacent pairs of rows/cols within the same batch. So if a + // tensor has 3 rows, we pretend it has 4 rows in order to account for the + // fact that the texels containing the third row are half empty. + logShape = logShape.map((d, i) => i >= logShape.length - 2 ? + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].nearestLargerEven(logShape[i]) : + logShape[i]); + // Packed texture height is at least 2 (the channel height of a single + // texel). + if (logShape.length === 1) { + logShape = [2, logShape[0]]; + } + } + // If logical shape is 2, we don't squeeze, since we want to match physical. + if (logShape.length !== 2) { + const squeezeResult = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].squeezeShape(logShape); + logShape = squeezeResult.newShape; + } + let size = _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeFromShape(logShape); + if (logShape.length <= 1 && size <= maxTexSize) { + return [1, size]; + } + else if (logShape.length === 2 && logShape[0] <= maxTexSize && + logShape[1] <= maxTexSize) { + return logShape; + } + else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTexSize && + logShape[2] <= maxTexSize) { + return [logShape[0] * logShape[1], logShape[2]]; + } + else if (logShape.length === 3 && logShape[0] <= maxTexSize && + logShape[1] * logShape[2] <= maxTexSize) { + return [logShape[0], logShape[1] * logShape[2]]; + } + else if (logShape.length === 4 && + logShape[0] * logShape[1] * logShape[2] <= maxTexSize && + logShape[3] <= maxTexSize) { + return [logShape[0] * logShape[1] * logShape[2], logShape[3]]; + } + else if (logShape.length === 4 && logShape[0] <= maxTexSize && + logShape[1] * logShape[2] * logShape[3] <= maxTexSize) { + return [logShape[0], logShape[1] * logShape[2] * logShape[3]]; + } + else { + if (isPacked) { + // For packed textures size equals the number of channels required to + // accommodate the texture data. However in order to squarify such that + // inner dimensions stay even, we rewrite size to equal the number of + // texels. Then in the return statement we rehydrate the squarified + // dimensions to channel units. + const batchDim = getBatchDim(logShape); + let rows = 2, cols = 2; + if (logShape.length) { + [rows, cols] = getRowsCols(logShape); + } + size = batchDim * (rows / 2) * (cols / 2); + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeToSquarishShape(size).map(d => d * 2); + } + return _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].sizeToSquarishShape(size); + } +} +function isEven(n) { + return n % 2 === 0; +} +/** + * This determines whether reshaping a packed texture requires rearranging + * the data within the texture, assuming 2x2 packing. + */ +function isReshapeFree(shape1, shape2) { + shape1 = shape1.slice(-2); + shape2 = shape2.slice(-2); + if (_tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].arraysEqual(shape1, shape2)) { + return true; + } + if (!shape1.length || !shape2.length) { // One of the shapes is a scalar. + return true; + } + if (shape1[0] === 0 || shape1[1] === 0 || shape2[0] === 0 || + shape2[1] === 0) { + return true; + } + if (shape1.length !== shape2.length) { // One of the shapes is a vector. + const shape1Cols = shape1.slice(-1)[0]; + const shape2Cols = shape2.slice(-1)[0]; + if (shape1Cols === shape2Cols) { + return true; + } + if (isEven(shape1Cols) && isEven(shape2Cols) && + (shape1[0] === 1 || shape2[0] === 1)) { + return true; + } + } + return shape1[1] === shape2[1] && isEven(shape1[0]) && isEven(shape2[0]); +} +// We cache webgl params because the environment gets reset between +// unit tests and we don't want to constantly query the WebGLContext for +// MAX_TEXTURE_SIZE. +let MAX_TEXTURE_SIZE; +let MAX_TEXTURES_IN_SHADER; +function getWebGLMaxTextureSize(webGLVersion) { + if (MAX_TEXTURE_SIZE == null) { + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE); + } + return MAX_TEXTURE_SIZE; +} +function resetMaxTextureSize() { + MAX_TEXTURE_SIZE = null; +} +function resetMaxTexturesInShader() { + MAX_TEXTURES_IN_SHADER = null; +} +function getMaxTexturesInShader(webGLVersion) { + if (MAX_TEXTURES_IN_SHADER == null) { + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + MAX_TEXTURES_IN_SHADER = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + } + // We cap at 16 to avoid spurious runtime "memory exhausted" error. + return Math.min(16, MAX_TEXTURES_IN_SHADER); +} +function getWebGLDisjointQueryTimerVersion(webGLVersion) { + if (webGLVersion === 0) { + return 0; + } + let queryTimerVersion; + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + if (hasExtension(gl, 'EXT_disjoint_timer_query_webgl2') && + webGLVersion === 2) { + queryTimerVersion = 2; + } + else if (hasExtension(gl, 'EXT_disjoint_timer_query')) { + queryTimerVersion = 1; + } + else { + queryTimerVersion = 0; + } + return queryTimerVersion; +} +function hasExtension(gl, extensionName) { + const ext = gl.getExtension(extensionName); + return ext != null; +} +function isWebGLVersionEnabled(webGLVersion) { + try { + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + if (gl != null) { + return true; + } + } + catch (e) { + console.log('Error when getting WebGL context: ', e); + return false; + } + return false; +} +function isCapableOfRenderingToFloatTexture(webGLVersion) { + if (webGLVersion === 0) { + return false; + } + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + if (webGLVersion === 1) { + if (!hasExtension(gl, 'OES_texture_float')) { + return false; + } + } + else { + if (!hasExtension(gl, 'EXT_color_buffer_float')) { + return false; + } + } + const isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl); + return isFrameBufferComplete; +} +/** + * Check if we can download values from a float/half-float texture. + * + * Note that for performance reasons we use binding a texture to a framebuffer + * as a proxy for ability to download float values later using readPixels. The + * texture params of this texture will not match those in readPixels exactly + * but if we are unable to bind some kind of float texture to the frameBuffer + * then we definitely will not be able to read float values from it. + */ +function isDownloadFloatTextureEnabled(webGLVersion) { + if (webGLVersion === 0) { + return false; + } + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + if (webGLVersion === 1) { + if (!hasExtension(gl, 'OES_texture_float')) { + return false; + } + if (!hasExtension(gl, 'WEBGL_color_buffer_float')) { + return false; + } + } + else { + if (hasExtension(gl, 'EXT_color_buffer_float')) { + return createFloatTextureAndBindToFramebuffer(gl); + } + const COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float'; + if (hasExtension(gl, COLOR_BUFFER_HALF_FLOAT)) { + const textureHalfFloatExtension = gl.getExtension(COLOR_BUFFER_HALF_FLOAT); + return createHalfFloatTextureAndBindToFramebuffer(gl, textureHalfFloatExtension); + } + return false; + } + const isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl); + return isFrameBufferComplete; +} +function createFloatTextureAndBindToFramebuffer(gl) { + const texConfig = Object(_tex_util__WEBPACK_IMPORTED_MODULE_2__["getTextureConfig"])(gl); + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + const width = 1; + const height = 1; + gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeFloat, null); + const frameBuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + const isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE; + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.deleteTexture(texture); + gl.deleteFramebuffer(frameBuffer); + return isFrameBufferComplete; +} +function createHalfFloatTextureAndBindToFramebuffer( +// tslint:disable-next-line:no-any +gl, textureHalfFloatExtension) { + const texConfig = Object(_tex_util__WEBPACK_IMPORTED_MODULE_2__["getTextureConfig"])(gl, textureHalfFloatExtension); + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + const width = 1; + const height = 1; + gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatHalfFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeHalfFloat, null); + const frameBuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + const isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE; + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.deleteTexture(texture); + gl.deleteFramebuffer(frameBuffer); + return isFrameBufferComplete; +} +function isWebGLFenceEnabled(webGLVersion) { + if (webGLVersion !== 2) { + return false; + } + const gl = Object(_canvas_util__WEBPACK_IMPORTED_MODULE_1__["getWebGLContext"])(webGLVersion); + // tslint:disable-next-line:no-any + const isEnabled = gl.fenceSync != null; + return isEnabled; +} +function assertNotComplex(tensor, opName) { + if (!Array.isArray(tensor)) { + tensor = [tensor]; + } + tensor.forEach(t => { + if (t != null) { + _tensorflow_tfjs_core__WEBPACK_IMPORTED_MODULE_0__["util"].assert(t.dtype !== 'complex64', () => `${opName} does not support complex64 tensors ` + + 'in the WebGL backend.'); + } + }); +} +//# sourceMappingURL=webgl_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/array_util.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/array_util.js ***! + \************************************************************************/ +/*! exports provided: binaryInsert, binarySearch */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "binaryInsert", function() { return binaryInsert; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "binarySearch", function() { return binarySearch; }); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Inserts a value into a sorted array. This method allows duplicate, meaning it + * allows inserting duplicate value, in which case, the element will be inserted + * at the lowest index of the value. + * @param arr The array to modify. + * @param element The element to insert. + * @param comparator Optional. If no comparator is specified, elements are + * compared using array_util.defaultComparator, which is suitable for Strings + * and Numbers in ascending arrays. If the array contains multiple instances of + * the target value, the left-most instance will be returned. To provide a + * comparator, it should take 2 arguments to compare and return a negative, + * zero, or a positive number. + */ +function binaryInsert(arr, element, comparator) { + const index = binarySearch(arr, element, comparator); + const insertionPoint = index < 0 ? -(index + 1) : index; + arr.splice(insertionPoint, 0, element); +} +/** + * Searches the array for the target using binary search, returns the index + * of the found element, or position to insert if element not found. If no + * comparator is specified, elements are compared using array_ + * util.defaultComparator, which is suitable for Strings and Numbers in + * ascending arrays. If the array contains multiple instances of the target + * value, the left-most instance will be returned. + * @param arr The array to be searched in. + * @param target The target to be searched for. + * @param comparator Should take 2 arguments to compare and return a negative, + * zero, or a positive number. + * @return Lowest index of the target value if found, otherwise the insertion + * point where the target should be inserted, in the form of + * (-insertionPoint - 1). + */ +function binarySearch(arr, target, comparator) { + return binarySearch_(arr, target, comparator || defaultComparator); +} +/** + * Compares its two arguments for order. + * @param a The first element to be compared. + * @param b The second element to be compared. + * @return A negative number, zero, or a positive number as the first + * argument is less than, equal to, or greater than the second. + */ +function defaultComparator(a, b) { + return a > b ? 1 : a < b ? -1 : 0; +} +function binarySearch_(arr, target, comparator) { + let left = 0; + let right = arr.length; + let middle = 0; + let found = false; + while (left < right) { + middle = left + ((right - left) >>> 1); + const compareResult = comparator(target, arr[middle]); + if (compareResult > 0) { + left = middle + 1; + } + else { + right = middle; + // If compareResult is 0, the value is found. We record it is found, + // and then keep looking because there may be duplicate. + found = !compareResult; + } + } + return found ? left : -left - 1; +} +//# sourceMappingURL=array_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js ***! + \*********************************************************************/ +/*! exports provided: EPSILON_FLOAT32, EPSILON_FLOAT16, DataStorage, KernelBackend */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EPSILON_FLOAT32", function() { return EPSILON_FLOAT32; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EPSILON_FLOAT16", function() { return EPSILON_FLOAT16; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DataStorage", function() { return DataStorage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KernelBackend", function() { return KernelBackend; }); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const EPSILON_FLOAT32 = 1e-7; +const EPSILON_FLOAT16 = 1e-4; +/** Convenient class for storing tensor-related data. */ +class DataStorage { + constructor(backend, dataMover) { + this.backend = backend; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } +} +/** + * The interface that defines the kernels that should be implemented when + * adding a new backend. New backends don't need to implement every one of the + * methods, this can be done gradually (throw an error for unimplemented + * methods). + */ +class KernelBackend { + time(f) { + return notYetImplemented('time'); + } + read(dataId) { + return notYetImplemented('read'); + } + readSync(dataId) { + return notYetImplemented('readSync'); + } + numDataIds() { + return notYetImplemented('numDataIds'); + } + disposeData(dataId) { + return notYetImplemented('disposeData'); + } + write(values, shape, dtype) { + return notYetImplemented('write'); + } + move(dataId, values, shape, dtype) { + return notYetImplemented('move'); + } + memory() { + return notYetImplemented('memory'); + } + /** Returns the highest precision for floats in bits (e.g. 16 or 32) */ + floatPrecision() { + return notYetImplemented('floatPrecision'); + } + /** Returns the smallest representable number. */ + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + batchMatMul(a, b, transposeA, transposeB) { + return notYetImplemented('batchMatMul'); + } + fusedBatchMatMul({ a, b, transposeA, transposeB, bias, activation, preluActivationWeights }) { + return notYetImplemented('fusedBatchMatMul'); + } + slice(x, begin, size) { + return notYetImplemented('slice'); + } + stridedSlice(x, begin, end, strides) { + return notYetImplemented('stridedSlice'); + } + unstack(x, axis) { + return notYetImplemented('unstack'); + } + reverse(a, axis) { + return notYetImplemented('reverse'); + } + concat(tensors, axis) { + return notYetImplemented('concat'); + } + neg(a) { + return notYetImplemented('neg'); + } + add(a, b) { + return notYetImplemented('add'); + } + addN(tensors) { + return notYetImplemented('addN'); + } + subtract(a, b) { + return notYetImplemented('subtract'); + } + multiply(a, b) { + return notYetImplemented('multiply'); + } + realDivide(a, b) { + return notYetImplemented('realDivide'); + } + floorDiv(a, b) { + return notYetImplemented('floorDiv'); + } + sum(x, axes) { + return notYetImplemented('sum'); + } + prod(x, axes) { + return notYetImplemented('prod'); + } + unsortedSegmentSum(x, segmentIds, numSegments) { + return notYetImplemented('unsortedSegmentSum'); + } + argMin(x, axis) { + return notYetImplemented('argMin'); + } + argMax(x, axis) { + return notYetImplemented('argMax'); + } + equal(a, b) { + return notYetImplemented('equal'); + } + notEqual(a, b) { + return notYetImplemented('notEqual'); + } + less(a, b) { + return notYetImplemented('less'); + } + lessEqual(a, b) { + return notYetImplemented('lessEqual'); + } + greater(a, b) { + return notYetImplemented('greater'); + } + greaterEqual(a, b) { + return notYetImplemented('greaterEqual'); + } + logicalNot(a) { + return notYetImplemented('logicalNot'); + } + logicalAnd(a, b) { + return notYetImplemented('logicalAnd'); + } + logicalOr(a, b) { + return notYetImplemented('logicalOr'); + } + where(condition) { + return notYetImplemented('where'); + } + select(condition, a, b) { + return notYetImplemented('select'); + } + topk(x, k, sorted) { + return notYetImplemented('topk'); + } + min(x, axes) { + return notYetImplemented('min'); + } + minimum(a, b) { + return notYetImplemented('minimum'); + } + mod(a, b) { + return notYetImplemented('mod'); + } + max(x, axes) { + return notYetImplemented('max'); + } + maximum(a, b) { + return notYetImplemented('maximum'); + } + all(x, axes) { + return notYetImplemented('all'); + } + any(x, axes) { + return notYetImplemented('any'); + } + squaredDifference(a, b) { + return notYetImplemented('squaredDifference'); + } + ceil(x) { + return notYetImplemented('ceil'); + } + floor(x) { + return notYetImplemented('floor'); + } + round(x) { + return notYetImplemented('round'); + } + sign(x) { + return notYetImplemented('sign'); + } + isNaN(x) { + return notYetImplemented('isNaN'); + } + isInf(x) { + return notYetImplemented('isInf'); + } + isFinite(x) { + return notYetImplemented('isFinite'); + } + pow(a, b) { + return notYetImplemented('pow'); + } + exp(x) { + return notYetImplemented('exp'); + } + expm1(x) { + return notYetImplemented('expm1'); + } + softmax(x, dim) { + return notYetImplemented('softmax'); + } + log(x) { + return notYetImplemented('log'); + } + log1p(x) { + return notYetImplemented('log1p'); + } + sqrt(x) { + return notYetImplemented('sqrt'); + } + rsqrt(x) { + return notYetImplemented('rsqrt'); + } + square(x) { + return notYetImplemented('square'); + } + reciprocal(x) { + return notYetImplemented('reciprocal'); + } + relu(x) { + return notYetImplemented('relu'); + } + relu6(x) { + return notYetImplemented('relu6'); + } + prelu(x, a) { + return notYetImplemented('prelu'); + } + elu(x) { + return notYetImplemented('elu'); + } + eluDer(dy, y) { + return notYetImplemented('eluDer'); + } + selu(x) { + return notYetImplemented('selu'); + } + int(x) { + return notYetImplemented('int'); + } + clip(x, min, max) { + return notYetImplemented('clip'); + } + abs(x) { + return notYetImplemented('abs'); + } + complexAbs(x) { + return notYetImplemented('complexAbs'); + } + sigmoid(x) { + return notYetImplemented('sigmoid'); + } + softplus(x) { + return notYetImplemented('softplus'); + } + sin(x) { + return notYetImplemented('sin'); + } + cos(x) { + return notYetImplemented('cos'); + } + tan(x) { + return notYetImplemented('tan'); + } + asin(x) { + return notYetImplemented('asin'); + } + acos(x) { + return notYetImplemented('acos'); + } + atan(x) { + return notYetImplemented('atan'); + } + atan2(a, b) { + return notYetImplemented('atan2'); + } + sinh(x) { + return notYetImplemented('sinh'); + } + cosh(x) { + return notYetImplemented('cosh'); + } + tanh(x) { + return notYetImplemented('tanh'); + } + asinh(x) { + return notYetImplemented('asinh'); + } + acosh(x) { + return notYetImplemented('acosh'); + } + atanh(x) { + return notYetImplemented('atanh'); + } + erf(x) { + return notYetImplemented('erf'); + } + step(x, alpha) { + return notYetImplemented('step'); + } + fusedConv2d({ input, filter, convInfo, bias, activation, preluActivationWeights }) { + return notYetImplemented('fusedConv2d'); + } + conv2d(x, filter, convInfo) { + return notYetImplemented('conv2d'); + } + conv2dDerInput(dy, filter, convInfo) { + return notYetImplemented('conv2dDerInput'); + } + conv2dDerFilter(x, dY, convInfo) { + return notYetImplemented('conv2dDerFilter'); + } + fusedDepthwiseConv2D({ input, filter, convInfo, bias, activation, preluActivationWeights }) { + return notYetImplemented('fusedDepthwiseConv2D'); + } + depthwiseConv2D(input, filter, convInfo) { + return notYetImplemented('depthwiseConv2D'); + } + depthwiseConv2DDerInput(dy, filter, convInfo) { + return notYetImplemented('depthwiseConv2DDerInput'); + } + depthwiseConv2DDerFilter(x, dY, convInfo) { + return notYetImplemented('depthwiseConv2DDerFilter'); + } + conv3d(x, filter, convInfo) { + return notYetImplemented('conv3d'); + } + conv3dDerInput(dy, filter, convInfo) { + return notYetImplemented('conv3dDerInput'); + } + conv3dDerFilter(x, dY, convInfo) { + return notYetImplemented('conv3dDerFilter'); + } + maxPool(x, convInfo) { + return notYetImplemented('maxPool'); + } + maxPoolBackprop(dy, x, y, convInfo) { + return notYetImplemented('maxPoolBackprop'); + } + avgPool(x, convInfo) { + return notYetImplemented('avgPool'); + } + avgPoolBackprop(dy, x, convInfo) { + return notYetImplemented('avgPoolBackprop'); + } + avgPool3d(x, convInfo) { + return notYetImplemented('avgPool3d'); + } + avgPool3dBackprop(dy, x, convInfo) { + return notYetImplemented('avgPool3dBackprop'); + } + maxPool3d(x, convInfo) { + return notYetImplemented('maxPool3d'); + } + maxPool3dBackprop(dy, x, y, convInfo) { + return notYetImplemented('maxPool3dBackprop'); + } + reshape(x, shape) { + return notYetImplemented('reshape'); + } + cast(x, dtype) { + return notYetImplemented('cast'); + } + tile(x, reps) { + return notYetImplemented('tile'); + } + pad(x, paddings, constantValue) { + return notYetImplemented('pad'); + } + transpose(x, perm) { + return notYetImplemented('transpose'); + } + gather(x, indices, axis) { + return notYetImplemented('gather'); + } + gatherND(x, indices) { + return notYetImplemented('gatherND'); + } + scatterND(indices, updates, shape) { + return notYetImplemented('scatterND'); + } + batchToSpaceND(x, blockShape, crops) { + return notYetImplemented('batchToSpaceND'); + } + spaceToBatchND(x, blockShape, paddings) { + return notYetImplemented('spaceToBatchND'); + } + resizeBilinear(x, newHeight, newWidth, alignCorners) { + return notYetImplemented('resizeBilinear'); + } + resizeBilinearBackprop(dy, x, alignCorners) { + return notYetImplemented('resizeBilinearBackprop'); + } + resizeNearestNeighbor(x, newHEight, newWidth, alignCorners) { + return notYetImplemented('resizeNearestNeighbor'); + } + resizeNearestNeighborBackprop(dy, x, alignCorners) { + return notYetImplemented('resizeNearestNeighborBackprop'); + } + batchNorm(x, mean, variance, offset, scale, varianceEpsilon) { + return notYetImplemented('batchNorm'); + } + localResponseNormalization4D(x, radius, bias, alpha, beta) { + return notYetImplemented('localResponseNormalization4D'); + } + LRNGrad(dy, inputImage, outputImage, radius, bias, alpha, beta) { + return notYetImplemented('LRNGrad'); + } + multinomial(logits, normalized, numSamples, seed) { + return notYetImplemented('multinomial'); + } + oneHot(indices, depth, onValue, offValue) { + return notYetImplemented('oneHot'); + } + cumsum(x, axis, exclusive, reverse) { + return notYetImplemented('cumsum'); + } + nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { + return notYetImplemented('nonMaxSuppression'); + } + fft(x) { + return notYetImplemented('fft'); + } + ifft(x) { + return notYetImplemented('ifft'); + } + complex(real, imag) { + return notYetImplemented('complex'); + } + real(input) { + return notYetImplemented('real'); + } + imag(input) { + return notYetImplemented('imag'); + } + cropAndResize(image, boxes, boxIndex, cropSize, method, extrapolationValue) { + return notYetImplemented('cropAndResize'); + } + depthToSpace(x, blockSize, dataFormat) { + return notYetImplemented('depthToSpace'); + } + // Aligns with the "SplitV" kernel in TensorFlow. + split(value, sizeSplits, axis) { + return notYetImplemented('split'); + } + sparseToDense(sparseIndices, sparseValues, outputShape, defaultValue) { + return notYetImplemented('sparseToDense'); + } + diag(x) { + return notYetImplemented('diag'); + } + fill(shape, value, dtype) { + return notYetImplemented('fill'); + } + onesLike(x) { + return notYetImplemented('onesLike'); + } + zerosLike(x) { + return notYetImplemented('zerosLike'); + } + linspace(start, stop, num) { + return notYetImplemented('linspace'); + } + dispose() { + return notYetImplemented('dispose'); + } +} +function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. ` + + `This kernel may not be supported by the tfjs backend you have chosen`); +} +//# sourceMappingURL=backend.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js ***! + \**************************************************************************/ +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes, getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape, assertParamsConsistent, computeOutShape, computeDilation2DInfo, computePool2DInfo, computePool3DInfo, computeConv2DInfo, computeConv3DInfo, computeDefaultPad, tupleValuesAreOne, eitherStridesOrDilationsAreOne, convertConv2DDataFormat, getFusedDyActivation, getFusedBiasGradient, applyActivation, shouldFuse, PARALLELIZE_THRESHOLD, computeOptimalWindowSize, slice_util, upcastType, getImageCenter, getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize, prepareAndValidate, validateUpdateShape, validateInput, calculateShapes, SELU_SCALEALPHA, SELU_SCALE, ERF_P, ERF_A1, ERF_A2, ERF_A3, ERF_A4, ERF_A5, warn, log, mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent, prepareSplitSize, segment_util, castTensor, reshapeTensor, linspaceImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "castTensor", function() { return castTensor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshapeTensor", function() { return reshapeTensor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linspaceImpl", function() { return linspaceImpl; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_tensor1d__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/tensor1d */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js"); +/* harmony import */ var _ops_zeros__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/zeros */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axesAreInnerMostDims", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["axesAreInnerMostDims"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLocations", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["combineLocations"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeOutAndReduceShapes", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["computeOutAndReduceShapes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expandShapeToKeepDim", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["expandShapeToKeepDim"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "assertAxesAreInnerMostDims", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["assertAxesAreInnerMostDims"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getAxesPermutation", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["getAxesPermutation"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getUndoAxesPermutation", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["getUndoAxesPermutation"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getInnerMostAxes", function() { return _ops_axis_util__WEBPACK_IMPORTED_MODULE_6__["getInnerMostAxes"]; }); + +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBroadcastDims", function() { return _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_7__["getBroadcastDims"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getReductionAxes", function() { return _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_7__["getReductionAxes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "assertAndGetBroadcastShape", function() { return _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_7__["assertAndGetBroadcastShape"]; }); + +/* harmony import */ var _ops_concat_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/concat_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "assertParamsConsistent", function() { return _ops_concat_util__WEBPACK_IMPORTED_MODULE_8__["assertParamsConsistent"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeOutShape", function() { return _ops_concat_util__WEBPACK_IMPORTED_MODULE_8__["computeOutShape"]; }); + +/* harmony import */ var _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ops/conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeDilation2DInfo", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["computeDilation2DInfo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computePool2DInfo", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["computePool2DInfo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computePool3DInfo", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["computePool3DInfo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeConv2DInfo", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["computeConv2DInfo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeConv3DInfo", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["computeConv3DInfo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeDefaultPad", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["computeDefaultPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tupleValuesAreOne", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["tupleValuesAreOne"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eitherStridesOrDilationsAreOne", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["eitherStridesOrDilationsAreOne"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "convertConv2DDataFormat", function() { return _ops_conv_util__WEBPACK_IMPORTED_MODULE_9__["convertConv2DDataFormat"]; }); + +/* harmony import */ var _ops_fused_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ops/fused_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getFusedDyActivation", function() { return _ops_fused_util__WEBPACK_IMPORTED_MODULE_10__["getFusedDyActivation"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getFusedBiasGradient", function() { return _ops_fused_util__WEBPACK_IMPORTED_MODULE_10__["getFusedBiasGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "applyActivation", function() { return _ops_fused_util__WEBPACK_IMPORTED_MODULE_10__["applyActivation"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shouldFuse", function() { return _ops_fused_util__WEBPACK_IMPORTED_MODULE_10__["shouldFuse"]; }); + +/* harmony import */ var _ops_reduce_util__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../ops/reduce_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PARALLELIZE_THRESHOLD", function() { return _ops_reduce_util__WEBPACK_IMPORTED_MODULE_11__["PARALLELIZE_THRESHOLD"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeOptimalWindowSize", function() { return _ops_reduce_util__WEBPACK_IMPORTED_MODULE_11__["computeOptimalWindowSize"]; }); + +/* harmony import */ var _ops_slice_util__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ops/slice_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "slice_util", function() { return _ops_slice_util__WEBPACK_IMPORTED_MODULE_12__; }); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../types */ "./node_modules/@tensorflow/tfjs-core/dist/types.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "upcastType", function() { return _types__WEBPACK_IMPORTED_MODULE_13__["upcastType"]; }); + +/* harmony import */ var _ops_rotate_util__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../ops/rotate_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getImageCenter", function() { return _ops_rotate_util__WEBPACK_IMPORTED_MODULE_14__["getImageCenter"]; }); + +/* harmony import */ var _ops_array_ops_util__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ops/array_ops_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getReshaped", function() { return _ops_array_ops_util__WEBPACK_IMPORTED_MODULE_15__["getReshaped"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getPermuted", function() { return _ops_array_ops_util__WEBPACK_IMPORTED_MODULE_15__["getPermuted"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getReshapedPermuted", function() { return _ops_array_ops_util__WEBPACK_IMPORTED_MODULE_15__["getReshapedPermuted"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getSliceBeginCoords", function() { return _ops_array_ops_util__WEBPACK_IMPORTED_MODULE_15__["getSliceBeginCoords"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getSliceSize", function() { return _ops_array_ops_util__WEBPACK_IMPORTED_MODULE_15__["getSliceSize"]; }); + +/* harmony import */ var _ops_gather_nd_util__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ops/gather_nd_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareAndValidate", function() { return _ops_gather_nd_util__WEBPACK_IMPORTED_MODULE_16__["prepareAndValidate"]; }); + +/* harmony import */ var _ops_scatter_nd_util__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../ops/scatter_nd_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "validateUpdateShape", function() { return _ops_scatter_nd_util__WEBPACK_IMPORTED_MODULE_17__["validateUpdateShape"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "validateInput", function() { return _ops_scatter_nd_util__WEBPACK_IMPORTED_MODULE_17__["validateInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "calculateShapes", function() { return _ops_scatter_nd_util__WEBPACK_IMPORTED_MODULE_17__["calculateShapes"]; }); + +/* harmony import */ var _ops_selu_util__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ops/selu_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SELU_SCALEALPHA", function() { return _ops_selu_util__WEBPACK_IMPORTED_MODULE_18__["SELU_SCALEALPHA"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SELU_SCALE", function() { return _ops_selu_util__WEBPACK_IMPORTED_MODULE_18__["SELU_SCALE"]; }); + +/* empty/unused harmony star reexport *//* harmony import */ var _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../ops/erf_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ERF_P", function() { return _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__["ERF_P"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ERF_A1", function() { return _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__["ERF_A1"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ERF_A2", function() { return _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__["ERF_A2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ERF_A3", function() { return _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__["ERF_A3"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ERF_A4", function() { return _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__["ERF_A4"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ERF_A5", function() { return _ops_erf_util__WEBPACK_IMPORTED_MODULE_19__["ERF_A5"]; }); + +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../log */ "./node_modules/@tensorflow/tfjs-core/dist/log.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "warn", function() { return _log__WEBPACK_IMPORTED_MODULE_20__["warn"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "log", function() { return _log__WEBPACK_IMPORTED_MODULE_20__["log"]; }); + +/* harmony import */ var _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../backends/complex_util */ "./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeRealAndImagArrays", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["mergeRealAndImagArrays"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "splitRealAndImagArrays", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["splitRealAndImagArrays"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "complexWithEvenIndex", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["complexWithEvenIndex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "complexWithOddIndex", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["complexWithOddIndex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getComplexWithIndex", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["getComplexWithIndex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "assignToTypedArray", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["assignToTypedArray"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exponents", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["exponents"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exponent", function() { return _backends_complex_util__WEBPACK_IMPORTED_MODULE_21__["exponent"]; }); + +/* harmony import */ var _ops_split_util__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../ops/split_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareSplitSize", function() { return _ops_split_util__WEBPACK_IMPORTED_MODULE_22__["prepareSplitSize"]; }); + +/* harmony import */ var _ops_segment_util__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ops/segment_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "segment_util", function() { return _ops_segment_util__WEBPACK_IMPORTED_MODULE_23__; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +// Utilities needed by backend consumers of tf-core. + + + + + + + + + + + + + + + + + + + + + +function castTensor(x, dtype, backend) { + if (dtype === 'complex64') { + if (x.dtype === 'complex64') { + return x.clone(); + } + const zerosTensor = Object(_ops_zeros__WEBPACK_IMPORTED_MODULE_4__["zeros"])(x.shape); + const floatX = Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32'); + const result = backend.complex(floatX, zerosTensor); + zerosTensor.dispose(); + floatX.dispose(); + return result; + } + if (!Object(_util__WEBPACK_IMPORTED_MODULE_5__["hasEncodingLoss"])(x.dtype, dtype)) { + // We don't change the underlying data, since we cast to higher + // precision. + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].makeTensorFromDataId(x.dataId, x.shape, dtype); + } + if (x.dtype === 'complex64') { + const real = backend.real(x); + const result = Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(real, dtype); + real.dispose(); + return result; + } + if (dtype === 'int32') { + return backend.int(x); + } + else if (dtype === 'bool') { + const zero = Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_2__["scalar"])(0, x.dtype); + const result = backend.notEqual(x, zero); + zero.dispose(); + return result; + } + else { + throw new Error(`Error in Cast: failed to cast ${x.dtype} to ${dtype}`); + } +} +function reshapeTensor(x, shape) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].makeTensorFromDataId(x.dataId, shape, x.dtype); +} +function linspaceImpl(start, stop, num) { + const step = (stop - start) / (num - 1); + const values = Object(_util__WEBPACK_IMPORTED_MODULE_5__["makeZerosTypedArray"])(num, 'float32'); + values[0] = start; + for (let i = 1; i < values.length; i++) { + values[i] = values[i - 1] + step; + } + return Object(_ops_tensor1d__WEBPACK_IMPORTED_MODULE_3__["tensor1d"])(values, 'float32'); +} +//# sourceMappingURL=backend_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js ***! + \**************************************************************************/ +/*! exports provided: mergeRealAndImagArrays, splitRealAndImagArrays, complexWithEvenIndex, complexWithOddIndex, getComplexWithIndex, assignToTypedArray, exponents, exponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeRealAndImagArrays", function() { return mergeRealAndImagArrays; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitRealAndImagArrays", function() { return splitRealAndImagArrays; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complexWithEvenIndex", function() { return complexWithEvenIndex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "complexWithOddIndex", function() { return complexWithOddIndex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getComplexWithIndex", function() { return getComplexWithIndex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assignToTypedArray", function() { return assignToTypedArray; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exponents", function() { return exponents; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exponent", function() { return exponent; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Merges real and imaginary Float32Arrays into a single complex Float32Array. + * + * The memory layout is interleaved as follows: + * real: [r0, r1, r2] + * imag: [i0, i1, i2] + * complex: [r0, i0, r1, i1, r2, i2] + * + * This is the inverse of splitRealAndImagArrays. + * + * @param real The real values of the complex tensor values. + * @param imag The imag values of the complex tensor values. + * @returns A complex tensor as a Float32Array with merged values. + */ +function mergeRealAndImagArrays(real, imag) { + if (real.length !== imag.length) { + throw new Error(`Cannot merge real and imag arrays of different lengths. real:` + + `${real.length}, imag: ${imag.length}.`); + } + const result = new Float32Array(real.length * 2); + for (let i = 0; i < result.length; i += 2) { + result[i] = real[i / 2]; + result[i + 1] = imag[i / 2]; + } + return result; +} +/** + * Splits a complex Float32Array into real and imag parts. + * + * The memory layout is interleaved as follows: + * complex: [r0, i0, r1, i1, r2, i2] + * real: [r0, r1, r2] + * imag: [i0, i1, i2] + * + * This is the inverse of mergeRealAndImagArrays. + * + * @param complex The complex tensor values. + * @returns An object with real and imag Float32Array components of the complex + * tensor. + */ +function splitRealAndImagArrays(complex) { + const real = new Float32Array(complex.length / 2); + const imag = new Float32Array(complex.length / 2); + for (let i = 0; i < complex.length; i += 2) { + real[i / 2] = complex[i]; + imag[i / 2] = complex[i + 1]; + } + return { real, imag }; +} +/** + * Extracts even indexed complex values in the given array. + * @param complex The complex tensor values + */ +function complexWithEvenIndex(complex) { + const len = Math.ceil(complex.length / 4); + const real = new Float32Array(len); + const imag = new Float32Array(len); + for (let i = 0; i < complex.length; i += 4) { + real[Math.floor(i / 4)] = complex[i]; + imag[Math.floor(i / 4)] = complex[i + 1]; + } + return { real, imag }; +} +/** + * Extracts odd indexed comple values in the given array. + * @param complex The complex tensor values + */ +function complexWithOddIndex(complex) { + const len = Math.floor(complex.length / 4); + const real = new Float32Array(len); + const imag = new Float32Array(len); + for (let i = 2; i < complex.length; i += 4) { + real[Math.floor(i / 4)] = complex[i]; + imag[Math.floor(i / 4)] = complex[i + 1]; + } + return { real, imag }; +} +/** + * Get the map representing a complex value in the given array. + * @param complex The complex tensor values. + * @param index An index of the target complex value. + */ +function getComplexWithIndex(complex, index) { + const real = complex[index * 2]; + const imag = complex[index * 2 + 1]; + return { real, imag }; +} +/** + * Insert a given complex value into the TypedArray. + * @param data The array in which the complex value is inserted. + * @param c The complex value to be inserted. + * @param index An index of the target complex value. + */ +function assignToTypedArray(data, real, imag, index) { + data[index * 2] = real; + data[index * 2 + 1] = imag; +} +/** + * Make the list of exponent terms used by FFT. + */ +function exponents(n, inverse) { + const real = new Float32Array(n / 2); + const imag = new Float32Array(n / 2); + for (let i = 0; i < Math.ceil(n / 2); i++) { + const x = (inverse ? 2 : -2) * Math.PI * (i / n); + real[i] = Math.cos(x); + imag[i] = Math.sin(x); + } + return { real, imag }; +} +/** + * Make the exponent term used by FFT. + */ +function exponent(k, n, inverse) { + const x = (inverse ? 2 : -2) * Math.PI * (k / n); + const real = Math.cos(x); + const imag = Math.sin(x); + return { real, imag }; +} +//# sourceMappingURL=complex_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/kernel_impls.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/kernel_impls.js ***! + \**************************************************************************/ +/*! exports provided: nonMaxSuppressionV3Impl, nonMaxSuppressionV4Impl, nonMaxSuppressionV5Impl, split, tile, topkImpl, whereImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _non_max_suppression_impl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./non_max_suppression_impl */ "./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV3Impl", function() { return _non_max_suppression_impl__WEBPACK_IMPORTED_MODULE_0__["nonMaxSuppressionV3Impl"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV4Impl", function() { return _non_max_suppression_impl__WEBPACK_IMPORTED_MODULE_0__["nonMaxSuppressionV4Impl"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV5Impl", function() { return _non_max_suppression_impl__WEBPACK_IMPORTED_MODULE_0__["nonMaxSuppressionV5Impl"]; }); + +/* harmony import */ var _split_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./split_shared */ "./node_modules/@tensorflow/tfjs-core/dist/backends/split_shared.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "split", function() { return _split_shared__WEBPACK_IMPORTED_MODULE_1__["split"]; }); + +/* harmony import */ var _tile_impl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tile_impl */ "./node_modules/@tensorflow/tfjs-core/dist/backends/tile_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tile", function() { return _tile_impl__WEBPACK_IMPORTED_MODULE_2__["tile"]; }); + +/* harmony import */ var _topk_impl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./topk_impl */ "./node_modules/@tensorflow/tfjs-core/dist/backends/topk_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "topkImpl", function() { return _topk_impl__WEBPACK_IMPORTED_MODULE_3__["topkImpl"]; }); + +/* harmony import */ var _where_impl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./where_impl */ "./node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "whereImpl", function() { return _where_impl__WEBPACK_IMPORTED_MODULE_4__["whereImpl"]; }); + +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +//# sourceMappingURL=kernel_impls.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js ***! + \**************************************************************************************/ +/*! exports provided: nonMaxSuppressionV3Impl, nonMaxSuppressionV4Impl, nonMaxSuppressionV5Impl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV3Impl", function() { return nonMaxSuppressionV3Impl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV4Impl", function() { return nonMaxSuppressionV4Impl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nonMaxSuppressionV5Impl", function() { return nonMaxSuppressionV5Impl; }); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_tensor1d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/tensor1d */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js"); +/* harmony import */ var _array_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array_util */ "./node_modules/@tensorflow/tfjs-core/dist/backends/array_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Implementation of the NonMaxSuppression kernel shared between webgl and cpu. + */ + + + +function nonMaxSuppressionV3Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { + return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0 /* softNmsSigma */) + .selectedIndices; +} +function nonMaxSuppressionV4Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize) { + return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0 /* softNmsSigma */, false /* returnScoresTensor */, padToMaxOutputSize /* padToMaxOutputSize */, true + /* returnValidOutputs */ ); +} +function nonMaxSuppressionV5Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) { + return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, true /* returnScoresTensor */); +} +function nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, returnScoresTensor = false, padToMaxOutputSize = false, returnValidOutputs = false) { + // The list is sorted in ascending order, so that we can always pop the + // candidate with the largest score in O(1) time. + const candidates = []; + for (let i = 0; i < scores.length; i++) { + if (scores[i] > scoreThreshold) { + candidates.push({ score: scores[i], boxIndex: i, suppressBeginIndex: 0 }); + } + } + candidates.sort(ascendingComparator); + // If softNmsSigma is 0, the outcome of this algorithm is exactly same as + // before. + const scale = softNmsSigma > 0 ? (-0.5 / softNmsSigma) : 0.0; + const selectedIndices = []; + const selectedScores = []; + while (selectedIndices.length < maxOutputSize && candidates.length > 0) { + const candidate = candidates.pop(); + const { score: originalScore, boxIndex, suppressBeginIndex } = candidate; + if (originalScore < scoreThreshold) { + break; + } + // Overlapping boxes are likely to have similar scores, therefore we + // iterate through the previously selected boxes backwards in order to + // see if candidate's score should be suppressed. We use + // suppressBeginIndex to track and ensure a candidate can be suppressed + // by a selected box no more than once. Also, if the overlap exceeds + // iouThreshold, we simply ignore the candidate. + let ignoreCandidate = false; + for (let j = selectedIndices.length - 1; j >= suppressBeginIndex; --j) { + const iou = intersectionOverUnion(boxes, boxIndex, selectedIndices[j]); + if (iou >= iouThreshold) { + ignoreCandidate = true; + break; + } + candidate.score = + candidate.score * suppressWeight(iouThreshold, scale, iou); + if (candidate.score <= scoreThreshold) { + break; + } + } + // At this point, if `candidate.score` has not dropped below + // `scoreThreshold`, then we know that we went through all of the + // previous selections and can safely update `suppressBeginIndex` to the + // end of the selected array. Then we can re-insert the candidate with + // the updated score and suppressBeginIndex back in the candidate list. + // If on the other hand, `candidate.score` has dropped below the score + // threshold, we will not add it back to the candidates list. + candidate.suppressBeginIndex = selectedIndices.length; + if (!ignoreCandidate) { + // Candidate has passed all the tests, and is not suppressed, so + // select the candidate. + if (candidate.score === originalScore) { + selectedIndices.push(boxIndex); + selectedScores.push(candidate.score); + } + else if (candidate.score > scoreThreshold) { + // Candidate's score is suppressed but is still high enough to be + // considered, so add back to the candidates list. + Object(_array_util__WEBPACK_IMPORTED_MODULE_2__["binaryInsert"])(candidates, candidate, ascendingComparator); + } + } + } + // NonMaxSuppressionV4 feature: padding output to maxOutputSize. + const validOutputs = selectedIndices.length; + const elemsToPad = maxOutputSize - validOutputs; + if (padToMaxOutputSize && elemsToPad > 0) { + selectedIndices.push(...new Array(elemsToPad).fill(0)); + selectedScores.push(...new Array(elemsToPad).fill(0.0)); + } + const result = { selectedIndices: Object(_ops_tensor1d__WEBPACK_IMPORTED_MODULE_1__["tensor1d"])(selectedIndices, 'int32') }; + if (returnScoresTensor) { + result['selectedScores'] = Object(_ops_tensor1d__WEBPACK_IMPORTED_MODULE_1__["tensor1d"])(selectedScores, 'float32'); + } + if (returnValidOutputs) { + result['validOutputs'] = Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_0__["scalar"])(validOutputs, 'int32'); + } + return result; +} +function intersectionOverUnion(boxes, i, j) { + const iCoord = boxes.subarray(i * 4, i * 4 + 4); + const jCoord = boxes.subarray(j * 4, j * 4 + 4); + const yminI = Math.min(iCoord[0], iCoord[2]); + const xminI = Math.min(iCoord[1], iCoord[3]); + const ymaxI = Math.max(iCoord[0], iCoord[2]); + const xmaxI = Math.max(iCoord[1], iCoord[3]); + const yminJ = Math.min(jCoord[0], jCoord[2]); + const xminJ = Math.min(jCoord[1], jCoord[3]); + const ymaxJ = Math.max(jCoord[0], jCoord[2]); + const xmaxJ = Math.max(jCoord[1], jCoord[3]); + const areaI = (ymaxI - yminI) * (xmaxI - xminI); + const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ); + if (areaI <= 0 || areaJ <= 0) { + return 0.0; + } + const intersectionYmin = Math.max(yminI, yminJ); + const intersectionXmin = Math.max(xminI, xminJ); + const intersectionYmax = Math.min(ymaxI, ymaxJ); + const intersectionXmax = Math.min(xmaxI, xmaxJ); + const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * + Math.max(intersectionXmax - intersectionXmin, 0.0); + return intersectionArea / (areaI + areaJ - intersectionArea); +} +// A Gaussian penalty function, this method always returns values in [0, 1]. +// The weight is a function of similarity, the more overlap two boxes are, the +// smaller the weight is, meaning highly overlapping boxe will be significantly +// penalized. On the other hand, a non-overlapping box will not be penalized. +function suppressWeight(iouThreshold, scale, iou) { + const weight = Math.exp(scale * iou * iou); + return iou <= iouThreshold ? weight : 0.0; +} +function ascendingComparator(c1, c2) { + // For objects with same scores, we make the object with the larger index go + // first. In an array that pops from the end, this means that the object with + // the smaller index will be popped first. This ensures the same output as + // the TensorFlow python version. + return (c1.score - c2.score) || + ((c1.score === c2.score) && (c2.boxIndex - c1.boxIndex)); +} +//# sourceMappingURL=non_max_suppression_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/split_shared.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/split_shared.js ***! + \**************************************************************************/ +/*! exports provided: split */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "split", function() { return split; }); +/* harmony import */ var _ops_slice__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/slice */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +// TODO(annxingyuan): Use this helper in WASM Split kernel once intermediate +// kernels have been modularized in WebGL and CPU +// https://github.com/tensorflow/tfjs/issues/2822. +/** Shared implementation of the split kernel across WebGL and CPU. */ +function split(x, sizeSplits, axis) { + const begin = new Array(x.rank).fill(0); + const size = x.shape.slice(); + return sizeSplits.map(s => { + const sliceSize = [...size]; + sliceSize[axis] = s; + const sliceT = Object(_ops_slice__WEBPACK_IMPORTED_MODULE_0__["slice"])(x, begin, sliceSize); + begin[axis] += s; + return sliceT; + }); +} +//# sourceMappingURL=split_shared.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/tile_impl.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/tile_impl.js ***! + \***********************************************************************/ +/*! exports provided: tile */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tile", function() { return tile; }); +/* harmony import */ var _ops_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/buffer */ "./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * An implementation of the tile kernel shared between webgl and cpu for string + * tensors only. + */ + +function tile(xBuf, reps) { + const newShape = new Array(xBuf.rank); + for (let i = 0; i < newShape.length; i++) { + newShape[i] = xBuf.shape[i] * reps[i]; + } + const result = Object(_ops_buffer__WEBPACK_IMPORTED_MODULE_0__["buffer"])(newShape, xBuf.dtype); + for (let i = 0; i < result.values.length; ++i) { + const newLoc = result.indexToLoc(i); + const originalLoc = new Array(xBuf.rank); + for (let j = 0; j < originalLoc.length; j++) { + originalLoc[j] = newLoc[j] % xBuf.shape[j]; + } + const originalIndex = xBuf.locToIndex(originalLoc); + result.values[i] = xBuf.values[originalIndex]; + } + return result.toTensor(); +} +//# sourceMappingURL=tile_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/topk_impl.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/topk_impl.js ***! + \***********************************************************************/ +/*! exports provided: topkImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topkImpl", function() { return topkImpl; }); +/* harmony import */ var _ops_tensor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/tensor */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** An implementation of the TopK kernel shared between webgl and cpu. */ + + +function topkImpl(x, xShape, xDtype, k, sorted) { + // Reshape into a 2d tensor [batch, lastDim] and compute topk along lastDim. + const lastDim = xShape[xShape.length - 1]; + const [batch, size] = [x.length / lastDim, lastDim]; + const allTopKVals = Object(_util__WEBPACK_IMPORTED_MODULE_1__["getTypedArrayFromDType"])(xDtype, batch * k); + const allTopKIndices = Object(_util__WEBPACK_IMPORTED_MODULE_1__["getTypedArrayFromDType"])('int32', batch * k); + for (let b = 0; b < batch; b++) { + const offset = b * size; + const vals = x.subarray(offset, offset + size); + const valAndInd = []; + for (let i = 0; i < vals.length; i++) { + valAndInd.push({ value: vals[i], index: i }); + } + valAndInd.sort((a, b) => b.value - a.value); + const outOffset = b * k; + const topKVals = allTopKVals.subarray(outOffset, outOffset + k); + const topKIndices = allTopKIndices.subarray(outOffset, outOffset + k); + for (let i = 0; i < k; i++) { + topKVals[i] = valAndInd[i].value; + topKIndices[i] = valAndInd[i].index; + } + } + // Reshape back to the original input shape, except that the last + // dimension is k. + const outputShape = xShape.slice(); + outputShape[outputShape.length - 1] = k; + return [ + Object(_ops_tensor__WEBPACK_IMPORTED_MODULE_0__["tensor"])(allTopKVals, outputShape, xDtype), + Object(_ops_tensor__WEBPACK_IMPORTED_MODULE_0__["tensor"])(allTopKIndices, outputShape, 'int32') + ]; +} +//# sourceMappingURL=topk_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js ***! + \************************************************************************/ +/*! exports provided: whereImpl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "whereImpl", function() { return whereImpl; }); +/* harmony import */ var _ops_buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/buffer */ "./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** An implementation of the Where kernel shared between cpu and webgl */ + +function whereImpl(condShape, condVals) { + const indices = []; + for (let i = 0; i < condVals.length; i++) { + if (condVals[i]) { + indices.push(i); + } + } + const inBuffer = Object(_ops_buffer__WEBPACK_IMPORTED_MODULE_0__["buffer"])(condShape, 'int32'); + const out = Object(_ops_buffer__WEBPACK_IMPORTED_MODULE_0__["buffer"])([indices.length, condShape.length], 'int32'); + for (let i = 0; i < indices.length; i++) { + const loc = inBuffer.indexToLoc(indices[i]); + const offset = i * condShape.length; + out.values.set(loc, offset); + } + return out.toTensor(); +} +//# sourceMappingURL=where_impl.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/base.js": +/*!*********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/base.js ***! + \*********************************************************/ +/*! exports provided: AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, Variable, Rank, sumOutType, upcastType, abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, equalStrict, greaterEqualStrict, greaterStrict, lessEqualStrict, lessStrict, notEqualStrict, addStrict, divStrict, maximumStrict, minimumStrict, modStrict, mulStrict, powStrict, squaredDifferenceStrict, subStrict, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, Reduction, train, enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform, getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads, Environment, env, ENV, version_core, nextFrame, browser, io, math, serialization, test_util, util, backend_util, tensor_util, slice_util, gather_util, scatter_util, device_util, kernel_impls, KernelBackend, DataStorage, Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolBackprop, AvgPool3D, AvgPool3DBackprop, BatchMatMul, BatchToSpaceND, BroadcastTo, Cast, Ceil, ClipByValue, Complex, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, Div, Elu, EluGrad, Erf, Equal, Exp, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNBackprop, Max, Maximum, MaxPool, MaxPoolBackprop, MaxPool3D, MaxPool3DBackprop, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multiply, Negate, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, SelectV2, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SquaredDifference, Square, Sub, SparseToDense, StridedSlice, Tan, Tanh, Tile, TopK, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _io_io__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./io/io */ "./node_modules/@tensorflow/tfjs-core/dist/io/io.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "io", function() { return _io_io__WEBPACK_IMPORTED_MODULE_0__; }); +/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math */ "./node_modules/@tensorflow/tfjs-core/dist/math.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "math", function() { return _math__WEBPACK_IMPORTED_MODULE_1__; }); +/* harmony import */ var _ops_browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ops/browser */ "./node_modules/@tensorflow/tfjs-core/dist/ops/browser.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "browser", function() { return _ops_browser__WEBPACK_IMPORTED_MODULE_2__; }); +/* harmony import */ var _ops_gather_nd_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ops/gather_nd_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "gather_util", function() { return _ops_gather_nd_util__WEBPACK_IMPORTED_MODULE_3__; }); +/* harmony import */ var _ops_scatter_nd_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ops/scatter_nd_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "scatter_util", function() { return _ops_scatter_nd_util__WEBPACK_IMPORTED_MODULE_4__; }); +/* harmony import */ var _ops_slice_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ops/slice_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "slice_util", function() { return _ops_slice_util__WEBPACK_IMPORTED_MODULE_5__; }); +/* harmony import */ var _serialization__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serialization */ "./node_modules/@tensorflow/tfjs-core/dist/serialization.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "serialization", function() { return _serialization__WEBPACK_IMPORTED_MODULE_6__; }); +/* harmony import */ var _tensor_util__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tensor_util */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "tensor_util", function() { return _tensor_util__WEBPACK_IMPORTED_MODULE_7__; }); +/* harmony import */ var _test_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./test_util */ "./node_modules/@tensorflow/tfjs-core/dist/test_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "test_util", function() { return _test_util__WEBPACK_IMPORTED_MODULE_8__; }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return _util__WEBPACK_IMPORTED_MODULE_9__; }); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./version */ "./node_modules/@tensorflow/tfjs-core/dist/version.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version_core", function() { return _version__WEBPACK_IMPORTED_MODULE_10__["version"]; }); + +/* harmony import */ var _optimizers_adadelta_optimizer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./optimizers/adadelta_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdadeltaOptimizer", function() { return _optimizers_adadelta_optimizer__WEBPACK_IMPORTED_MODULE_11__["AdadeltaOptimizer"]; }); + +/* harmony import */ var _optimizers_adagrad_optimizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./optimizers/adagrad_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdagradOptimizer", function() { return _optimizers_adagrad_optimizer__WEBPACK_IMPORTED_MODULE_12__["AdagradOptimizer"]; }); + +/* harmony import */ var _optimizers_adam_optimizer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./optimizers/adam_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdamOptimizer", function() { return _optimizers_adam_optimizer__WEBPACK_IMPORTED_MODULE_13__["AdamOptimizer"]; }); + +/* harmony import */ var _optimizers_adamax_optimizer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./optimizers/adamax_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdamaxOptimizer", function() { return _optimizers_adamax_optimizer__WEBPACK_IMPORTED_MODULE_14__["AdamaxOptimizer"]; }); + +/* harmony import */ var _optimizers_momentum_optimizer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./optimizers/momentum_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MomentumOptimizer", function() { return _optimizers_momentum_optimizer__WEBPACK_IMPORTED_MODULE_15__["MomentumOptimizer"]; }); + +/* harmony import */ var _optimizers_optimizer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./optimizers/optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Optimizer", function() { return _optimizers_optimizer__WEBPACK_IMPORTED_MODULE_16__["Optimizer"]; }); + +/* harmony import */ var _optimizers_rmsprop_optimizer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./optimizers/rmsprop_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RMSPropOptimizer", function() { return _optimizers_rmsprop_optimizer__WEBPACK_IMPORTED_MODULE_17__["RMSPropOptimizer"]; }); + +/* harmony import */ var _optimizers_sgd_optimizer__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./optimizers/sgd_optimizer */ "./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SGDOptimizer", function() { return _optimizers_sgd_optimizer__WEBPACK_IMPORTED_MODULE_18__["SGDOptimizer"]; }); + +/* harmony import */ var _tensor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./tensor */ "./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tensor", function() { return _tensor__WEBPACK_IMPORTED_MODULE_19__["Tensor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TensorBuffer", function() { return _tensor__WEBPACK_IMPORTED_MODULE_19__["TensorBuffer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Variable", function() { return _tensor__WEBPACK_IMPORTED_MODULE_19__["Variable"]; }); + +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./types */ "./node_modules/@tensorflow/tfjs-core/dist/types.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Rank", function() { return _types__WEBPACK_IMPORTED_MODULE_20__["Rank"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sumOutType", function() { return _types__WEBPACK_IMPORTED_MODULE_20__["sumOutType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "upcastType", function() { return _types__WEBPACK_IMPORTED_MODULE_20__["upcastType"]; }); + +/* harmony import */ var _ops_ops__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ops/ops */ "./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["abs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["acos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "acosh", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["acosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "add", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["add"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addN", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["addN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "all", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["all"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "any", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["any"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "argMax", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["argMax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "argMin", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["argMin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["asin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asinh", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["asinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "atan", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["atan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["atan2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "atanh", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["atanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "avgPool", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["avgPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "avgPool3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["avgPool3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basicLSTMCell", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["basicLSTMCell"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchToSpaceND", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["batchToSpaceND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["batchNorm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["batchNorm2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["batchNorm3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm4d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["batchNorm4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "broadcastTo", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["broadcastTo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["buffer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cast", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["cast"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["ceil"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clipByValue", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["clipByValue"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["clone"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "complex", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["complex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["concat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat1d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["concat1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["concat2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["concat3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat4d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["concat4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv1d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["conv1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["conv2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv2dTranspose", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["conv2dTranspose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["conv3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv3dTranspose", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["conv3dTranspose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["cos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cosh", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["cosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cumsum", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["cumsum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "depthToSpace", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["depthToSpace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["depthwiseConv2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "diag", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["diag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dilation2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["dilation2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "div", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["div"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "divNoNan", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["divNoNan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dot", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["dot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elu", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["elu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "equal", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["equal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "erf", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["erf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exp", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["exp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expandDims", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["expandDims"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expm1", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["expm1"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eye", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["eye"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["fill"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["floor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "floorDiv", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["floorDiv"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gather", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["gather"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greater", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["greater"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greaterEqual", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["greaterEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imag", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["imag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isFinite", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["isFinite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isInf", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["isInf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNaN", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["isNaN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "leakyRelu", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["leakyRelu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "less", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["less"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lessEqual", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["lessEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linspace", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["linspace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "localResponseNormalization", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["localResponseNormalization"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "log", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["log"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "log1p", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["log1p"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logSigmoid", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logSigmoid"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logSoftmax", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logSoftmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logSumExp", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logSumExp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalAnd", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logicalAnd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalNot", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logicalNot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalOr", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logicalOr"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalXor", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["logicalXor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "matMul", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["matMul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["max"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxPool", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["maxPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxPool3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["maxPool3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxPoolWithArgmax", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["maxPoolWithArgmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maximum", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["maximum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mean", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["mean"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["min"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "minimum", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["minimum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mirrorPad", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["mirrorPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mod", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["mod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moments", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["moments"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mul", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["mul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiRNNCell", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["multiRNNCell"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multinomial", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["multinomial"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "neg", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["neg"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "notEqual", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["notEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "oneHot", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["oneHot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ones", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["ones"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onesLike", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["onesLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "outerProduct", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["outerProduct"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad1d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pad1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pad2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pad3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad4d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pad4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pool", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pow", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["pow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prelu", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["prelu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "print", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["print"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prod", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["prod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rand", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["rand"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomGamma", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["randomGamma"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomNormal", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["randomNormal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomUniform", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["randomUniform"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["range"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "real", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["real"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reciprocal", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reciprocal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relu", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["relu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relu6", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["relu6"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reshape", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reshape"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reverse"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse1d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reverse1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reverse2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reverse3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse4d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["reverse4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "round", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["round"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rsqrt", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["rsqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scalar", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["scalar"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selu", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["selu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "separableConv2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["separableConv2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setdiff1dAsync", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["setdiff1dAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sigmoid", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sigmoid"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sign", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sign"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sinh", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["slice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice1d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["slice1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["slice2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["slice3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice4d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["slice4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "softmax", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["softmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "softplus", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["softplus"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "spaceToBatchND", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["spaceToBatchND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fft", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["fft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ifft", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["ifft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "irfft", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["irfft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rfft", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["rfft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "split", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["split"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "square", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["square"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squaredDifference", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["squaredDifference"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squeeze", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["squeeze"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stack", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["stack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "step", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["step"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stridedSlice", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["stridedSlice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sub", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sub"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tan", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tanh", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor1d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor2d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor3d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor4d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor5d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor5d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor6d", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tensor6d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tile", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["tile"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "topk", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["topk"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "truncatedNormal", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["truncatedNormal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unique", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["unique"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unsortedSegmentSum", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["unsortedSegmentSum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unstack", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["unstack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variable", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["variable"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "where", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["where"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "whereAsync", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["whereAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zeros", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["zeros"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zerosLike", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["zerosLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "booleanMaskAsync", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["booleanMaskAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "equalStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["equalStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greaterEqualStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["greaterEqualStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greaterStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["greaterStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lessEqualStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["lessEqualStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lessStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["lessStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "notEqualStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["notEqualStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["addStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "divStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["divStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maximumStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["maximumStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "minimumStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["minimumStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "modStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["modStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mulStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["mulStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "powStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["powStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["squaredDifferenceStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subStrict", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["subStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["transpose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "norm", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["norm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "movingAverage", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["movingAverage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scatterND", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["scatterND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sparseToDense", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["sparseToDense"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gatherND", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["gatherND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dropout", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["dropout"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enclosingPowerOfTwo", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["enclosingPowerOfTwo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cosineWindow", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["cosineWindow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "inTopKAsync", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["inTopKAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "op", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["op"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OP_SCOPE_SUFFIX", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["OP_SCOPE_SUFFIX"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "image", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["image"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linalg", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["linalg"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "losses", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["losses"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "spectral", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["spectral"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fused", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["fused"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "signal", function() { return _ops_ops__WEBPACK_IMPORTED_MODULE_21__["signal"]; }); + +/* harmony import */ var _ops_loss_ops_utils__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ops/loss_ops_utils */ "./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reduction", function() { return _ops_loss_ops_utils__WEBPACK_IMPORTED_MODULE_22__["Reduction"]; }); + +/* harmony import */ var _train__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./train */ "./node_modules/@tensorflow/tfjs-core/dist/train.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "train", function() { return _train__WEBPACK_IMPORTED_MODULE_23__["train"]; }); + +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./globals */ "./node_modules/@tensorflow/tfjs-core/dist/globals.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableProdMode", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["enableProdMode"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableDebugMode", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["enableDebugMode"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disableDeprecationWarnings", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["disableDeprecationWarnings"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "deprecationWarn", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["deprecationWarn"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disposeVariables", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["disposeVariables"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "engine", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["engine"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "memory", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["memory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "profile", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["profile"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tidy", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["tidy"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispose", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["dispose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keep", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["keep"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "time", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["time"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setBackend", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["setBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ready", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["ready"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBackend", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["getBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeBackend", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["removeBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findBackend", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["findBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findBackendFactory", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["findBackendFactory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerBackend", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["registerBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "backend", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["backend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setPlatform", function() { return _globals__WEBPACK_IMPORTED_MODULE_24__["setPlatform"]; }); + +/* harmony import */ var _kernel_registry__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./kernel_registry */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getKernel", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["getKernel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getGradient", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["getGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getKernelsForBackend", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["getKernelsForBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerKernel", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["registerKernel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerGradient", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["registerGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unregisterKernel", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["unregisterKernel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unregisterGradient", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["unregisterGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyRegisteredKernels", function() { return _kernel_registry__WEBPACK_IMPORTED_MODULE_25__["copyRegisteredKernels"]; }); + +/* harmony import */ var _gradients__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./gradients */ "./node_modules/@tensorflow/tfjs-core/dist/gradients.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "customGrad", function() { return _gradients__WEBPACK_IMPORTED_MODULE_26__["customGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "grad", function() { return _gradients__WEBPACK_IMPORTED_MODULE_26__["grad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "grads", function() { return _gradients__WEBPACK_IMPORTED_MODULE_26__["grads"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "valueAndGrad", function() { return _gradients__WEBPACK_IMPORTED_MODULE_26__["valueAndGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "valueAndGrads", function() { return _gradients__WEBPACK_IMPORTED_MODULE_26__["valueAndGrads"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variableGrads", function() { return _gradients__WEBPACK_IMPORTED_MODULE_26__["variableGrads"]; }); + +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Environment", function() { return _environment__WEBPACK_IMPORTED_MODULE_27__["Environment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "env", function() { return _environment__WEBPACK_IMPORTED_MODULE_27__["env"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ENV", function() { return _environment__WEBPACK_IMPORTED_MODULE_27__["ENV"]; }); + +/* harmony import */ var _browser_util__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./browser_util */ "./node_modules/@tensorflow/tfjs-core/dist/browser_util.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nextFrame", function() { return _browser_util__WEBPACK_IMPORTED_MODULE_28__["nextFrame"]; }); + +/* harmony import */ var _backends_backend_util__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./backends/backend_util */ "./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "backend_util", function() { return _backends_backend_util__WEBPACK_IMPORTED_MODULE_29__; }); +/* harmony import */ var _device_util__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./device_util */ "./node_modules/@tensorflow/tfjs-core/dist/device_util.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "device_util", function() { return _device_util__WEBPACK_IMPORTED_MODULE_30__; }); +/* harmony import */ var _backends_kernel_impls__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./backends/kernel_impls */ "./node_modules/@tensorflow/tfjs-core/dist/backends/kernel_impls.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "kernel_impls", function() { return _backends_kernel_impls__WEBPACK_IMPORTED_MODULE_31__; }); +/* harmony import */ var _backends_backend__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./backends/backend */ "./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "KernelBackend", function() { return _backends_backend__WEBPACK_IMPORTED_MODULE_32__["KernelBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DataStorage", function() { return _backends_backend__WEBPACK_IMPORTED_MODULE_32__["DataStorage"]; }); + +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Abs", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Abs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Acos", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Acos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Acosh", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Acosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Add", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Add"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AddN", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["AddN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "All", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["All"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Any", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Any"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgMax", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ArgMax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgMin", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ArgMin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Asin", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Asin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Asinh", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Asinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Atan", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Atan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Atanh", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Atanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Atan2", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Atan2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPool", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["AvgPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPoolBackprop", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["AvgPoolBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPool3D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["AvgPool3D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPool3DBackprop", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["AvgPool3DBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BatchMatMul", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["BatchMatMul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BatchToSpaceND", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["BatchToSpaceND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BroadcastTo", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["BroadcastTo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cast", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Cast"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Ceil", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Ceil"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ClipByValue", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ClipByValue"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Complex", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Complex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Concat", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Concat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv2D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Conv2D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv2DBackpropFilter", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Conv2DBackpropFilter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv2DBackpropInput", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Conv2DBackpropInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv3D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Conv3D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv3DBackpropFilterV2", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Conv3DBackpropFilterV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv3DBackpropInputV2", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Conv3DBackpropInputV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cos", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Cos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cosh", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Cosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cumsum", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Cumsum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CropAndResize", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["CropAndResize"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthToSpace", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["DepthToSpace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNative", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["DepthwiseConv2dNative"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNativeBackpropFilter", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["DepthwiseConv2dNativeBackpropFilter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNativeBackpropInput", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["DepthwiseConv2dNativeBackpropInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Diag", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Diag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dilation2D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Dilation2D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dilation2DBackpropInput", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Dilation2DBackpropInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dilation2DBackpropFilter", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Dilation2DBackpropFilter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Div", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Div"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Elu", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Elu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EluGrad", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["EluGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Erf", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Erf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Equal", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Equal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Exp", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Exp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Expm1", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Expm1"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FFT", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FFT"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Fill", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Fill"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FlipLeftRight", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FlipLeftRight"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Floor", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Floor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FloorDiv", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FloorDiv"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FusedBatchNorm", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FusedBatchNorm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GatherV2", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["GatherV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GatherNd", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["GatherNd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Greater", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Greater"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GreaterEqual", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["GreaterEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Identity", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Identity"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IFFT", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["IFFT"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Imag", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Imag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IsFinite", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["IsFinite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IsInf", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["IsInf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IsNan", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["IsNan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Less", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Less"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LessEqual", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LessEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LinSpace", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LinSpace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Log", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Log"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Log1p", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Log1p"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogicalAnd", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LogicalAnd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogicalNot", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LogicalNot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogicalOr", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LogicalOr"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogSoftmax", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LogSoftmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LRN", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LRN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LRNBackprop", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["LRNBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Max", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Max"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Maximum", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Maximum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPool", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["MaxPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPoolBackprop", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["MaxPoolBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPool3D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["MaxPool3D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPool3DBackprop", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["MaxPool3DBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPoolWithArgmax", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["MaxPoolWithArgmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Mean", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Mean"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Min", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Min"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Minimum", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Minimum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MirrorPad", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["MirrorPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Mod", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Mod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Multiply", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Multiply"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Negate", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Negate"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotEqual", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["NotEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV3", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["NonMaxSuppressionV3"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV4", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["NonMaxSuppressionV4"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV5", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["NonMaxSuppressionV5"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OnesLike", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["OnesLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OneHot", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["OneHot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PadV2", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["PadV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Pool", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Pool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Pow", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Pow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Prelu", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Prelu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Prod", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Prod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Range", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Range"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Real", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Real"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reciprocal", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Reciprocal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Relu", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Relu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reshape", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Reshape"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighbor", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ResizeNearestNeighbor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighborGrad", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ResizeNearestNeighborGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinear", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ResizeBilinear"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinearGrad", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ResizeBilinearGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Relu6", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Relu6"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reverse", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Reverse"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Round", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Round"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Rsqrt", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Rsqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScatterNd", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ScatterNd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SelectV2", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["SelectV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Selu", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Selu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Slice", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Slice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sin", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sinh", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sign", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sign"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sigmoid", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sigmoid"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Softplus", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Softplus"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sqrt", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sum", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SpaceToBatchND", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["SpaceToBatchND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SplitV", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["SplitV"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Softmax", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Softmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SquaredDifference", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["SquaredDifference"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Square", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Square"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sub", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Sub"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SparseToDense", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["SparseToDense"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StridedSlice", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["StridedSlice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tan", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Tan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tanh", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Tanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tile", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Tile"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TopK", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["TopK"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Transpose", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Transpose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Unique", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Unique"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Unpack", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Unpack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsortedSegmentSum", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["UnsortedSegmentSum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZerosLike", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["ZerosLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Step", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["Step"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FromPixels", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FromPixels"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateWithOffset", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["RotateWithOffset"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_FusedMatMul", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["_FusedMatMul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FusedConv2D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FusedConv2D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FusedDepthwiseConv2D", function() { return _kernel_names__WEBPACK_IMPORTED_MODULE_33__["FusedDepthwiseConv2D"]; }); + +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// base.ts is tfjs-core without auto registration of things like flags, +// gradients, chained ops or the opHandler. See base_side_effects.ts for parts +// tfjs core that are required side effects. +/** + * @fileoverview + * @suppress {partialAlias} Optimization disabled due to passing the module + * object into a function below: + * + * import * as ops from './ops/ops'; + * setOpHandler(ops); + */ +// Serialization. + + + + + + + + + + + +// Optimizers. + + + + + + + + + + + + + + + + + + +// Top-level method exports. + +// Second level exports. + + + + + +// Backend specific. + +// Export all kernel names / info. + +//# sourceMappingURL=base.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js ***! + \**********************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _flags__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./flags */ "./node_modules/@tensorflow/tfjs-core/dist/flags.js"); +/* harmony import */ var _platforms_platform_browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./platforms/platform_browser */ "./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js"); +/* harmony import */ var _platforms_platform_node__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./platforms/platform_node */ "./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js"); +/* harmony import */ var _ops_buffer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ops/buffer */ "./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_clone__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ops/clone */ "./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"); +/* harmony import */ var _ops_print__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ops/print */ "./node_modules/@tensorflow/tfjs-core/dist/ops/print.js"); +/* harmony import */ var _tensor__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tensor */ "./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Required side effectful code for tfjs-core +// Set up Engine and ENV + +Object(_engine__WEBPACK_IMPORTED_MODULE_0__["getOrMakeEngine"])(); +// Register backend-agnostic flags. + +// Register platforms + + +// Set up OpHandler + + + + + +const opHandler = { + buffer: _ops_buffer__WEBPACK_IMPORTED_MODULE_4__["buffer"], + cast: _ops_cast__WEBPACK_IMPORTED_MODULE_5__["cast"], + clone: _ops_clone__WEBPACK_IMPORTED_MODULE_6__["clone"], + print: _ops_print__WEBPACK_IMPORTED_MODULE_7__["print"] +}; +Object(_tensor__WEBPACK_IMPORTED_MODULE_8__["setOpHandler"])(opHandler); +//# sourceMappingURL=base_side_effects.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/browser_util.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/browser_util.js ***! + \*****************************************************************/ +/*! exports provided: nextFrame */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(setImmediate) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nextFrame", function() { return nextFrame; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +const delayCallback = (() => { + if (typeof requestAnimationFrame !== 'undefined') { + return requestAnimationFrame; + } + else if (typeof setImmediate !== 'undefined') { + return setImmediate; + } + return (f) => f(); // no delays +})(); +/** + * Returns a promise that resolve when a requestAnimationFrame has completed. + * + * On Node.js this uses setImmediate instead of requestAnimationFrame. + * + * This is simply a sugar method so that users can do the following: + * `await tf.nextFrame();` + * + * @doc {heading: 'Performance', subheading: 'Timing'} + */ +function nextFrame() { + return new Promise(resolve => delayCallback(() => resolve())); +} + +//# sourceMappingURL=browser_util.js.map +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate)) + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/device_util.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/device_util.js ***! + \****************************************************************/ +/*! exports provided: isMobile, isBrowser */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMobile", function() { return isMobile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isBrowser", function() { return isBrowser; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// tslint:disable-next-line:no-any +function _isNavigatorDefined() { + return typeof navigator !== 'undefined' && navigator != null; +} +function isMobile() { + if (_isNavigatorDefined()) { + // tslint:disable-next-line:no-any + const a = navigator.userAgent || navigator.vendor || window.opera; + // tslint:disable-next-line:max-line-length + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i + .test(a) || + // tslint:disable-next-line:max-line-length + /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i + .test(a.substr(0, 4)); + } + return false; +} +function isBrowser() { + return (typeof window !== 'undefined' && window.document != null) || + //@ts-ignore + (typeof WorkerGlobalScope !== 'undefined'); +} +//# sourceMappingURL=device_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/engine.js": +/*!***********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/engine.js ***! + \***********************************************************/ +/*! exports provided: Engine, getOrMakeEngine, ENGINE, add */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Engine", function() { return Engine; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getOrMakeEngine", function() { return getOrMakeEngine; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENGINE", function() { return ENGINE; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add", function() { return add; }); +/* harmony import */ var _backends_backend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./backends/backend */ "./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js"); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _global_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./global_util */ "./node_modules/@tensorflow/tfjs-core/dist/global_util.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _kernel_registry__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kernel_registry */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"); +/* harmony import */ var _profiler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./profiler */ "./node_modules/@tensorflow/tfjs-core/dist/profiler.js"); +/* harmony import */ var _tape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tape */ "./node_modules/@tensorflow/tfjs-core/dist/tape.js"); +/* harmony import */ var _tensor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tensor */ "./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/* harmony import */ var _tensor_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tensor_util */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + + +class EngineState { + constructor() { + // Public since optimizers will use it. + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + // Number of nested tf.grad() statements when computing higher-order + // gradients. E.g. `1` for first-order gradients and `2` for second-order + // gradients. Used to track if the tape should be removed after a backprop. + this.gradientDepth = 0; + // Number of nested kernel calls. When kernel depth is greater than 1, we turn + // off the tape. + this.kernelDepth = 0; + this.scopeStack = []; + /** + * Keeps track of the number of data moves during a kernel execution. We + * maintain a stack since kernels can call other kernels, recursively. + */ + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { newBytes: 0, newTensors: 0, peakBytes: 0, kernels: [], result: null }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } +} +class Engine { + constructor(ENV) { + this.ENV = ENV; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations ` + + `failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make ` + + `sure to await tf.ready() or await tf.setBackend() before calling ` + + `other methods`); + } + if (this.backendInstance == null) { + const { name, asyncInit } = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been ` + + `initialized. Make sure to await tf.ready() or ` + + `await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + // If the backend hasn't been initialized but we have a registry entry for + // it, initialize it and return it. + if (backendName in this.registryFactory) { + const { asyncInit } = this.initializeBackend(backendName); + if (asyncInit) { + // Backend is not ready yet. + return null; + } + } + else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. ` + + `Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = { factory, priority }; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const { success, asyncInit } = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + // Reset the profiler. + this.profiler = new _profiler__WEBPACK_IMPORTED_MODULE_5__["Profiler"](this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = Object(_kernel_registry__WEBPACK_IMPORTED_MODULE_4__["getKernelsForBackend"])(this.backendName); + kernels.forEach(kernel => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = Object(_kernel_registry__WEBPACK_IMPORTED_MODULE_4__["getKernelsForBackend"])(backendName); + kernels.forEach(kernel => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + /** + * Initializes a backend by looking up the backend name in the factory + * registry and calling the factory method. Returns a boolean representing + * whether the initialization of the backend suceeded. Throws an error if + * there is no backend in the factory registry. + */ + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend = registryFactoryEntry.factory(); + /* Test if the factory returns a promise. + Done in a more liberal way than + previous 'Promise.resolve(backend)===backend' + as we needed to account for custom Promise + implementations (e.g. Angular) */ + if (backend && !(backend instanceof _backends_backend__WEBPACK_IMPORTED_MODULE_0__["KernelBackend"]) + && typeof backend.then === 'function') { + const promiseId = ++this.pendingBackendInitId; + const success = backend + .then(backendInstance => { + // Outdated promise. Another backend was set in the meantime. + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }) + .catch(err => { + // Outdated promise. Another backend was set in the meantime. + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return { success, asyncInit: true }; + } + else { + this.registry[backendName] = backend; + return { success: true, asyncInit: false }; + } + } + catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return { success: false, asyncInit: false }; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + // There is a pending promise of the backend we want to remove. Make it + // obsolete. + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + // Unset the backend if it is active. + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error('No backend found in registry.'); + } + return Object.keys(this.registryFactory).sort((a, b) => { + // Highest priority comes first. + return this.registryFactory[b].priority - + this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const { success, asyncInit } = this.initializeBackend(backendName); + if (asyncInit || success) { + return { name: backendName, asyncInit }; + } + } + throw new Error(`Could not initialize any backends, all backend initializations ` + + `failed.`); + } + moveData(backend, dataId) { + const info = this.state.tensorInfo.get(dataId); + const srcBackend = info.backend; + const values = this.readSync(dataId); + // Delete the tensor from the old backend and move it to the new + // backend. + srcBackend.disposeData(dataId); + info.backend = backend; + backend.move(dataId, values, info.shape, info.dtype); + if (this.shouldCheckForMemLeaks()) { + // Track the number of moves during a kernel execution to correctly + // detect memory leaks. + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + // Called with only 1 argument. + if (typeof nameOrFn !== 'function') { + throw new Error('Please provide a function to tidy()'); + } + fn = nameOrFn; + } + else { + // Called with 2 arguments. + if (typeof nameOrFn !== 'string' && !(nameOrFn instanceof String)) { + throw new Error('When calling with two arguments, the first argument ' + + 'to tidy() must be a string'); + } + if (typeof fn !== 'function') { + throw new Error('When calling with two arguments, the 2nd argument ' + + 'to tidy() must be a function'); + } + name = nameOrFn; + // TODO(nsthorat,smilkov): Do operation logging and performance + // profiling. + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error('Cannot return a Promise inside of tidy.'); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } + catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + /** + * This method is called instead of the public-facing tensor.clone() when + * saving a tensor for backwards pass. It makes sure to add the clone + * operation to the tape regardless of being called inside a kernel + * execution. + * + * This method will go away once all kernels are modularized since we won't + * need to turn off the tape inside runKernel(). + */ + clone(x) { + const y = this.makeTensorFromDataId(x.dataId, x.shape, x.dtype); + const inputs = { x }; + const grad = (dy) => ({ + x: () => { + const dtype = 'float32'; + const gradInputs = { x: dy }; + const attrs = { dtype }; + return ENGINE.runKernelFunc(backend => backend.cast(dy, dtype), gradInputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_3__["Cast"], attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad, saved, {}); + return y; + } + /** + * Execute a kernel with the given name and return the output tensor. + * + * @param kernelName The name of the kernel to execute. + * @param inputs A map of input names to tensors. + * @param attrs A map of attribute names to their values. An attribute is a + * primitive (non-tensor) input to the kernel. + * @param inputsToSave A list of tensors, inputs to save for the backprop + * computation. + * @param outputsToSave A list of booleans, specifying which output to save + * for the backprop computation. These are booleans since the output + * tensors are not visible to the user. + */ + runKernel(kernelName, inputs, attrs, inputsToSave, outputsToSave) { + const forwardFunc = null; + const backwardsFunc = null; + // Call runKernel as a stop-gap until we modularize all kernels. + // Once we modularize all kernels, we will remove the existing + // `runKernelFunc`. + return this.runKernelFunc(forwardFunc, inputs, backwardsFunc, kernelName, attrs, inputsToSave, outputsToSave); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool('IS_TEST'); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + // Count the number of data ids associated with the result of the kernel. + let numOutputDataIds = 0; + outInfos.forEach(info => { + // Complex numbers allocate 3 data ids, one for 'real', one for + // 'imaginary', and one for the container that holds the former two. + numOutputDataIds += (info.dtype === 'complex64' ? 3 : 1); + }); + // Account for the number of moves during kernel execution. A "data move" + // can happen in the middle of a kernel execution, placing a new (key,value) + // pair in the data storage. Since data moves have net zero effect (we + // always remove the data from the old backend), we have to cancel them out + // when detecting memory leaks. + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak ` + + `(${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + /** + * @deprecated Use `runKernel` for newly added kernels. Keep using this method + * only for kernels that are not yet fully modularized. + */ + runKernelFunc(forwardFunc, inputs, backwardsFunc, kernelName, attrs, inputsToSave, outputsToSave) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + if (kernelName == null) { + kernelName = + this.state.activeScope != null ? this.state.activeScope.name : ''; + } + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc; + const kernel = Object(_kernel_registry__WEBPACK_IMPORTED_MODULE_4__["getKernel"])(kernelName, this.backendName); + let out; + if (kernel != null) { + kernelFunc = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({ inputs, attrs, backend: this.backend }); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map(({ dataId, shape, dtype }) => this.makeTensorFromDataId(dataId, shape, dtype)); + // Save the inputs and outputs. + // Do not save unless we are recording to the tape. Otherwise it would + // cause a mem leak since we would never run backprop, which disposes + // the kept tensors. + if (isTapeOn) { + let tensorsToSave = this.getTensorsForGradient(kernelName, inputs, outTensors); + if (tensorsToSave == null) { + // Fallback for ops that call runKernelFunc and pass in + // inputsToSave and outputsToSave. Currently this is the set of ops + // with kernel support in the WASM backend. Once those ops and + // respective gradients are modularised we can remove this path. + if (outputsToSave == null) { + outputsToSave = []; + } + const outsToSave = outTensors.filter((_, i) => outputsToSave[i]); + tensorsToSave = (inputsToSave || []).slice().concat(outsToSave); + } + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } + else { + const saveFunc = (tensors) => { + // Do not save unless we are recording to the tape. Otherwise it would + // cause a mem leak since we would never run backprop, which disposes + // the kept tensors. + if (!isTapeOn) { + return; + } + saved = tensors.map(tensor => this.keep(this.clone(tensor))); + }; + kernelFunc = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = (Array.isArray(out) ? out : [out]); + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outs); + } + return outs; + }; + } + // Stop recording to a tape when running a kernel. + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool('DEBUG') && !this.state.profiling) { + outputs = kernelFunc(); + } + else { + kernelProfile = this.profiler.profileKernel(kernelName, inputs, () => kernelFunc()); + if (this.ENV.getBool('DEBUG')) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map(key => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map(item => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return (Array.isArray(out) ? outputs : outputs[0]); + } + /** + * Saves tensors used in forward mode for use in backward mode. + * + * @param tensors the list of tensors to save. + */ + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map(tensor => this.keep(this.clone(tensor))); + return saved; + } + /** + * Returns a list of tensors to save for a given gradient calculation. + * + * Returns undefined if their is no registered gradient for this kernel in the + * gradient registry. + * + * @param kernelName name of kernel to look up gradient for. + * @param inputs a map of input tensors. + * @param outputs an array of output tensors from forward mode of kernel. + */ + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = Object(_kernel_registry__WEBPACK_IMPORTED_MODULE_4__["getGradient"])(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + // If saveAllInputs is true, all inputs will be saved. Otherwise, inputs + // specified in inputsToSave will be saved. + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](Array.isArray(inputs), () => 'saveAllInputs is true, expected inputs to be an array.'); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } + else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + // TODO(yassogba) throw exception here once all runkernelFunc calls with + // inputsToSave/outputsToSave are removed + return null; + } + /** + * Internal method used by public APIs for tensor creation. Makes a new + * tensor with the provided shape, dtype and values. It always + * creates a new data id and writes the values to the underlying backend. + */ + makeTensor(values, shape, dtype, backend) { + if (values == null) { + throw new Error('Values passed to engine.makeTensor() are null'); + } + dtype = dtype || 'float32'; + backend = backend || this.backend; + let backendVals = values; + if (dtype === 'string' && _util__WEBPACK_IMPORTED_MODULE_9__["isString"](values[0])) { + backendVals = values.map(d => _util__WEBPACK_IMPORTED_MODULE_9__["encodeString"](d)); + } + const dataId = backend.write(backendVals, shape, dtype); + const t = new _tensor__WEBPACK_IMPORTED_MODULE_7__["Tensor"](shape, dtype, dataId, this.nextTensorId()); + this.incRef(t, backend); + // Count bytes for string tensors. + if (dtype === 'string') { + const info = this.state.tensorInfo.get(dataId); + const newBytes = Object(_util__WEBPACK_IMPORTED_MODULE_9__["bytesFromStringArray"])(backendVals); + this.state.numBytes += newBytes - info.bytes; + info.bytes = newBytes; + } + return t; + } + /** + * Internal method used by backends. Makes a new tensor + * that is a wrapper around an existing data id. It doesn't create + * a new data id, only increments the ref count used in memory tracking. + */ + makeTensorFromDataId(dataId, shape, dtype, backend) { + dtype = dtype || 'float32'; + const t = new _tensor__WEBPACK_IMPORTED_MODULE_7__["Tensor"](shape, dtype, dataId, this.nextTensorId()); + this.incRef(t, backend); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new _tensor__WEBPACK_IMPORTED_MODULE_7__["Variable"](initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + incRef(a, backend) { + const refCount = this.state.tensorInfo.has(a.dataId) ? + this.state.tensorInfo.get(a.dataId).refCount : + 0; + this.state.numTensors++; + if (a.dtype === 'string') { + this.state.numStringTensors++; + } + if (refCount === 0) { + this.state.numDataBuffers++; + // Bytes for complex numbers are counted by their components. Bytes for + // string tensors are counted when writing values. + let bytes = 0; + if (a.dtype !== 'complex64' && a.dtype !== 'string') { + bytes = a.size * _util__WEBPACK_IMPORTED_MODULE_9__["bytesPerElement"](a.dtype); + } + this.state.tensorInfo.set(a.dataId, { + backend: backend || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes, + refCount: 0 + }); + this.state.numBytes += bytes; + } + this.state.tensorInfo.get(a.dataId).refCount++; + if (!(a instanceof _tensor__WEBPACK_IMPORTED_MODULE_7__["Variable"])) { + this.track(a); + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + this.state.numTensors--; + if (a.dtype === 'string') { + this.state.numStringTensors--; + } + const info = this.state.tensorInfo.get(a.dataId); + const refCount = info.refCount; + if (refCount <= 1) { + // Don't count bytes for complex numbers as they are counted by their + // components. + if (a.dtype !== 'complex64') { + this.state.numBytes -= info.bytes; + } + this.state.numDataBuffers--; + info.backend.disposeData(a.dataId); + this.state.tensorInfo.delete(a.dataId); + } + else { + this.state.tensorInfo.get(a.dataId).refCount--; + } + // TODO(nsthorat): Construct an error and save the stack trace for + // debugging when in debug mode. Creating a stack trace is too expensive + // to do unconditionally. + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info = this.backend.memory(); + info.numTensors = this.state.numTensors; + info.numDataBuffers = this.state.numDataBuffers; + info.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info.unreliable = true; + if (info.reasons == null) { + info.reasons = []; + } + info.reasons.push('Memory usage by string tensors is approximate ' + + '(2 bytes per character)'); + } + return info; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map(d => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = + this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved }; + const gradConfig = Object(_kernel_registry__WEBPACK_IMPORTED_MODULE_4__["getGradient"])(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + // TODO(smilkov): To optimize back-prop, pass dys that are not used in + // the backprop graph to the user as null instead of zeros + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = _util__WEBPACK_IMPORTED_MODULE_9__["makeZerosTypedArray"](output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + // Grad functions of ops with single outputs expect a dy, while ops + // with multiple outputs expect dys (array of dy). + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + /** + * Start a scope. Use this with endScope() to achieve the same functionality + * as scope() without the need for a function closure. + */ + startScope(name) { + const scopeInfo = { + track: [], + name: 'unnamed scope', + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + /** + * End a scope. Use this with startScope() to achieve the same functionality + * as scope() without the need for a function closure. + */ + endScope(result) { + const tensorsToTrackInParent = Object(_tensor_util__WEBPACK_IMPORTED_MODULE_8__["getTensorsInContainer"])(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map(t => t.id)); + // Dispose the arrays tracked in this scope. + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor = this.state.activeScope.track[i]; + if (!tensor.kept && !tensorsToTrackInParentSet.has(tensor.id)) { + tensor.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? + null : + this.state.scopeStack[this.state.scopeStack.length - 1]; + // Track the current result in the parent scope. + tensorsToTrackInParent.forEach(tensor => { + // Only track the tensor if was allocated in the inner scope and is not + // globally kept. + if (!tensor.kept && tensor.scopeId === oldScope.id) { + this.track(tensor); + } + }); + } + /** + * Returns gradients of `f` with respect to each of the `xs`. The gradients + * returned are of the same length as `xs`, but some might be null if `f` + * was not a function of that `x`. It also takes optional dy to multiply the + * gradient, which defaults to `1`. + */ + gradients(f, xs, dy, allowNoGradients = false) { + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](xs.length > 0, () => 'gradients() received an empty list of xs.'); + if (dy != null && dy.dtype !== 'float32') { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy('forward', f)); + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](y instanceof _tensor__WEBPACK_IMPORTED_MODULE_7__["Tensor"], () => 'The result y returned by f() must be a tensor.'); + // Filter out the nodes that don't connect x => y. + const filteredTape = Object(_tape__WEBPACK_IMPORTED_MODULE_6__["getFilteredNodesXToY"])(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error('Cannot compute gradient of y=f(x) with respect to x. Make sure ' + + 'that the f you passed encloses all operations that lead from x ' + + 'to y.'); + } + return this.tidy('backward', () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = (dy == null) ? ones(y.shape) : dy; + // Backprop gradients through the filtered nodes. + Object(_tape__WEBPACK_IMPORTED_MODULE_6__["backpropagateGradients"])(accumulatedGradientMap, filteredTape, + // Pass the tidy function to avoid circular dep with `tape.ts`. + f => this.tidy(f), + // Pass an add function to avoide a circular dep with `tape.ts`. + add); + const grads = xs.map(x => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + // This means that we are not computing higher-order gradients + // and can clean up the tape. + this.state.activeTape.forEach(node => { + for (const tensor of node.saved) { + tensor.dispose(); + } + }); + this.state.activeTape = null; + } + return { value: y, grads }; + }); + } + customGrad(f) { + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](_util__WEBPACK_IMPORTED_MODULE_9__["isFunction"](f), () => 'The f passed in customGrad(f) must be a function.'); + return (...inputs) => { + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](inputs.every(t => t instanceof _tensor__WEBPACK_IMPORTED_MODULE_7__["Tensor"]), () => 'The args passed in customGrad(f)(x1, x2,...) must all be ' + + 'tensors'); + let res; + const inputMap = {}; + inputs.forEach((input, i) => { + inputMap[i] = input; + }); + return this.runKernelFunc((_, save) => { + res = f(...[...inputs, save]); + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](res.value instanceof _tensor__WEBPACK_IMPORTED_MODULE_7__["Tensor"], () => 'The function f passed in customGrad(f) must return an ' + + 'object where `obj.value` is a tensor'); + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](_util__WEBPACK_IMPORTED_MODULE_9__["isFunction"](res.gradFunc), () => 'The function f passed in customGrad(f) must return an ' + + 'object where `obj.gradFunc` is a function.'); + return res.value; + }, inputMap, (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads = Array.isArray(gradRes) ? gradRes : [gradRes]; + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](grads.length === inputs.length, () => 'The function f passed in customGrad(f) must return an ' + + 'object where `obj.gradFunc` is a function that returns ' + + 'the same number of tensors as inputs passed to f(...).'); + _util__WEBPACK_IMPORTED_MODULE_9__["assert"](grads.every(t => t instanceof _tensor__WEBPACK_IMPORTED_MODULE_7__["Tensor"]), () => 'The function f passed in customGrad(f) must return an ' + + 'object where `obj.gradFunc` is a function that returns ' + + 'a list of only tensors.'); + const gradMap = {}; + grads.forEach((grad, i) => { + gradMap[i] = () => grad; + }); + return gradMap; + }); + }; + } + readSync(dataId) { + // Route the read to the correct backend. + const info = this.state.tensorInfo.get(dataId); + return info.backend.readSync(dataId); + } + read(dataId) { + // Route the read to the correct backend. + const info = this.state.tensorInfo.get(dataId); + return info.backend.read(dataId); + } + async time(query) { + const start = Object(_util__WEBPACK_IMPORTED_MODULE_9__["now"])(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = Object(_util__WEBPACK_IMPORTED_MODULE_9__["now"])() - start; + return timingInfo; + } + /** + * Tracks a Tensor in the current scope to be automatically cleaned up + * when the current scope ends, and returns the value. + * + * @param result The Tensor to track in the current scope. + */ + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + /** + * Resets the engine state. Removes all backends but does not remove + * registered backend factories. + */ + reset() { + // Make any pending promise obsolete. + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } +} +Engine.nextTensorId = 0; +Engine.nextVariableId = 0; +function ones(shape) { + const values = Object(_util__WEBPACK_IMPORTED_MODULE_9__["makeOnesTypedArray"])(Object(_util__WEBPACK_IMPORTED_MODULE_9__["sizeFromShape"])(shape), 'float32'); + return ENGINE.makeTensor(values, shape, 'float32'); +} +function getOrMakeEngine() { + const ns = Object(_global_util__WEBPACK_IMPORTED_MODULE_2__["getGlobalNamespace"])(); + if (ns._tfengine == null) { + const environment = new _environment__WEBPACK_IMPORTED_MODULE_1__["Environment"](ns); + ns._tfengine = new Engine(environment); + } + Object(_environment__WEBPACK_IMPORTED_MODULE_1__["setEnvironmentGlobal"])(ns._tfengine.ENV); + // Tell the current tensor interface that the global engine is responsible + // for tracking. + Object(_tensor__WEBPACK_IMPORTED_MODULE_7__["setTensorTracker"])(() => ns._tfengine); + return ns._tfengine; +} +const ENGINE = getOrMakeEngine(); +/** + * A implementation of the add op for use within engine and tape. + * + * This allows us to avoid a circular dependency between add.ts and engine. + * It is exported to be available in tape tests. + */ +function add(a, b) { + // We duplicate Add here to avoid a circular dependency with add.ts. + const inputs = { a, b }; + return ENGINE.runKernelFunc((backend, save) => { + const res = backend.add(a, b); + save([a, b]); + return res; + }, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_3__["Add"]); +} +//# sourceMappingURL=engine.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/environment.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/environment.js ***! + \****************************************************************/ +/*! exports provided: Environment, getQueryParams, env, ENV, setEnvironmentGlobal */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Environment", function() { return Environment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getQueryParams", function() { return getQueryParams; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "env", function() { return env; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENV", function() { return ENV; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setEnvironmentGlobal", function() { return setEnvironmentGlobal; }); +/* harmony import */ var _util_base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util_base */ "./node_modules/@tensorflow/tfjs-core/dist/util_base.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +// Expects flags from URL in the format ?tfjsflags=FLAG1:1,FLAG2:true. +const TENSORFLOWJS_FLAGS_PREFIX = 'tfjsflags'; +/** + * The environment contains evaluated flags as well as the registered platform. + * This is always used as a global singleton and can be retrieved with + * `tf.env()`. + * + * @doc {heading: 'Environment'} + */ +class Environment { + // tslint:disable-next-line: no-any + constructor(global) { + this.global = global; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. ` + + `Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = { evaluationFn, setHook }; + // Override the flag value from the URL. This has to happen here because the + // environment is initialized before flags get registered. + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (Object(_util_base__WEBPACK_IMPORTED_MODULE_0__["isPromise"])(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. ` + + `Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + // For backwards compatibility. + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === 'undefined' || + typeof this.global.location === 'undefined' || + typeof this.global.location.search === 'undefined') { + return; + } + const urlParams = getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(','); + keyValues.forEach(keyValue => { + const [key, value] = keyValue.split(':'); + this.urlFlags[key] = parseValue(key, value); + }); + } + } +} +function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join('='); + }); + return params; +} +function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ''); +} +function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === 'true' || value === 'false') { + return value === 'true'; + } + else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); +} +/** + * Returns the current environment (a global singleton). + * + * The environment object contains the evaluated feature values as well as the + * active platform. + * + * @doc {heading: 'Environment'} + */ +function env() { + return ENV; +} +let ENV = null; +function setEnvironmentGlobal(environment) { + ENV = environment; +} +//# sourceMappingURL=environment.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/flags.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/flags.js ***! + \**********************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(process) {/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _device_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./device_util */ "./node_modules/@tensorflow/tfjs-core/dist/device_util.js"); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const ENV = Object(_environment__WEBPACK_IMPORTED_MODULE_2__["env"])(); +/** + * This file contains environment-related flag registrations. + */ +/** Whether to enable debug mode. */ +ENV.registerFlag('DEBUG', () => false, debugValue => { + if (debugValue) { + console.warn('Debugging mode is ON. The output of every math call will ' + + 'be downloaded to CPU and checked for NaNs. ' + + 'This significantly impacts performance.'); + } +}); +/** Whether we are in a browser (as versus, say, node.js) environment. */ +ENV.registerFlag('IS_BROWSER', () => _device_util__WEBPACK_IMPORTED_MODULE_1__["isBrowser"]()); +/** Whether we are in a browser (as versus, say, node.js) environment. */ +ENV.registerFlag('IS_NODE', () => (typeof process !== 'undefined') && + (typeof process.versions !== 'undefined') && + (typeof process.versions.node !== 'undefined')); +/** Whether this browser is Chrome. */ +ENV.registerFlag('IS_CHROME', () => typeof navigator !== 'undefined' && navigator != null && + navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && + /Google Inc/.test(navigator.vendor)); +/** + * True when the environment is "production" where we disable safety checks + * to gain performance. + */ +ENV.registerFlag('PROD', () => false); +/** + * Whether to do sanity checks when inferring a shape from user-provided + * values, used when creating a new tensor. + */ +ENV.registerFlag('TENSORLIKE_CHECK_SHAPE_CONSISTENCY', () => ENV.getBool('DEBUG')); +/** Whether deprecation warnings are enabled. */ +ENV.registerFlag('DEPRECATION_WARNINGS_ENABLED', () => true); +/** True if running unit tests. */ +ENV.registerFlag('IS_TEST', () => false); +//# sourceMappingURL=flags.js.map +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"))) + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/global_util.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/global_util.js ***! + \****************************************************************/ +/*! exports provided: getGlobalNamespace, getGlobal */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(global, process) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGlobalNamespace", function() { return getGlobalNamespace; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGlobal", function() { return getGlobal; }); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Note that the identifier globalNameSpace is scoped to this module, but will +// always resolve to the same global object regardless of how the module is +// resolved. +// tslint:disable-next-line:no-any +let globalNameSpace; +// tslint:disable-next-line:no-any +function getGlobalNamespace() { + if (globalNameSpace == null) { + // tslint:disable-next-line:no-any + let ns; + if (typeof (window) !== 'undefined') { + ns = window; + } + else if (typeof (global) !== 'undefined') { + ns = global; + } + else if (typeof (process) !== 'undefined') { + ns = process; + } + else if (typeof (self) !== 'undefined') { + ns = self; + } + else { + throw new Error('Could not find a global object'); + } + globalNameSpace = ns; + } + return globalNameSpace; +} +// tslint:disable-next-line:no-any +function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; +} +/** + * Returns a globally accessible 'singleton' object. + * + * @param key the name of the object + * @param init a function to initialize to initialize this object + * the first time it is fetched. + */ +function getGlobal(key, init) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } + else { + const singleton = init(); + globalMap.set(key, singleton); + return globalMap.get(key); + } +} +//# sourceMappingURL=global_util.js.map +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"))) + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/globals.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/globals.js ***! + \************************************************************/ +/*! exports provided: enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableProdMode", function() { return enableProdMode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableDebugMode", function() { return enableDebugMode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disableDeprecationWarnings", function() { return disableDeprecationWarnings; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deprecationWarn", function() { return deprecationWarn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disposeVariables", function() { return disposeVariables; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "engine", function() { return engine; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "memory", function() { return memory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "profile", function() { return profile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tidy", function() { return tidy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispose", function() { return dispose; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keep", function() { return keep; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "time", function() { return time; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setBackend", function() { return setBackend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ready", function() { return ready; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBackend", function() { return getBackend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeBackend", function() { return removeBackend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findBackend", function() { return findBackend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findBackendFactory", function() { return findBackendFactory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerBackend", function() { return registerBackend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backend", function() { return backend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setPlatform", function() { return setPlatform; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _tensor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tensor */ "./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/* harmony import */ var _tensor_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tensor_util */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Enables production mode which disables correctness checks in favor of + * performance. + * + * @doc {heading: 'Environment'} + */ +function enableProdMode() { + Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().set('PROD', true); +} +/** + * Enables debug mode which will log information about all executed kernels: + * the elapsed time of the kernel execution, as well as the rank, shape, and + * size of the output tensor. + * + * Debug mode will significantly slow down your application as it will + * download the result of every operation to the CPU. This should not be used in + * production. Debug mode does not affect the timing information of the kernel + * execution as we do not measure download time in the kernel execution time. + * + * See also: `tf.profile`, `tf.memory`. + * + * @doc {heading: 'Environment'} + */ +function enableDebugMode() { + Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().set('DEBUG', true); +} +/** Globally disables deprecation warnings */ +function disableDeprecationWarnings() { + Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().set('DEPRECATION_WARNINGS_ENABLED', false); + console.warn(`TensorFlow.js deprecation warnings have been disabled.`); +} +/** Warn users about deprecated functionality. */ +function deprecationWarn(msg) { + if (Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('DEPRECATION_WARNINGS_ENABLED')) { + console.warn(msg + ' You can disable deprecation warnings with ' + + 'tf.disableDeprecationWarnings().'); + } +} +Object(_tensor__WEBPACK_IMPORTED_MODULE_2__["setDeprecationWarningFn"])(deprecationWarn); +/** + * Dispose all variables kept in backend engine. + * + * @doc {heading: 'Environment'} + */ +function disposeVariables() { + _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].disposeVariables(); +} +/** + * It returns the global engine that keeps track of all tensors and backends. + * + * @doc {heading: 'Environment'} + */ +function engine() { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"]; +} +/** + * Returns memory info at the current time in the program. The result is an + * object with the following properties: + * + * - `numBytes`: Number of bytes allocated (undisposed) at this time. + * - `numTensors`: Number of unique tensors allocated. + * - `numDataBuffers`: Number of unique data buffers allocated + * (undisposed) at this time, which is ≤ the number of tensors + * (e.g. `a.reshape(newShape)` makes a new Tensor that shares the same + * data buffer with `a`). + * - `unreliable`: True if the memory usage is unreliable. See `reasons` when + * `unreliable` is true. + * - `reasons`: `string[]`, reasons why the memory is unreliable, present if + * `unreliable` is true. + * + * WebGL Properties: + * - `numBytesInGPU`: Number of bytes allocated (undisposed) in the GPU only at + * this time. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +function memory() { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].memory(); +} +/** + * Executes the provided function `f()` and returns a promise that resolves + * with information about the function's memory use: + * - `newBytes`: the number of new bytes allocated + * - `newTensors`: the number of new tensors created + * - `peakBytes`: the peak number of bytes allocated + * - `kernels`: an array of objects for each kernel involved that reports + * their input and output shapes, number of bytes used, and number of new + * tensors created. + * + * ```js + * const profile = await tf.profile(() => { + * const x = tf.tensor1d([1, 2, 3]); + * let x2 = x.square(); + * x2.dispose(); + * x2 = x.square(); + * x2.dispose(); + * return x; + * }); + * + * console.log(`newBytes: ${profile.newBytes}`); + * console.log(`newTensors: ${profile.newTensors}`); + * console.log(`byte usage over all kernels: ${profile.kernels.map(k => + * k.totalBytesSnapshot)}`); + * ``` + * + * + * @doc {heading: 'Performance', subheading: 'Profile'} + */ +function profile(f) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].profile(f); +} +/** + * Executes the provided function `fn` and after it is executed, cleans up all + * intermediate tensors allocated by `fn` except those returned by `fn`. + * `fn` must not return a Promise (async functions not allowed). The returned + * result can be a complex object. + * + * Using this method helps avoid memory leaks. In general, wrap calls to + * operations in `tf.tidy` for automatic memory cleanup. + * + * NOTE: Variables do *not* get cleaned up when inside a tidy(). If you want to + * dispose variables, please use `tf.disposeVariables` or call dispose() + * directly on variables. + * + * ```js + * // y = 2 ^ 2 + 1 + * const y = tf.tidy(() => { + * // a, b, and one will be cleaned up when the tidy ends. + * const one = tf.scalar(1); + * const a = tf.scalar(2); + * const b = a.square(); + * + * console.log('numTensors (in tidy): ' + tf.memory().numTensors); + * + * // The value returned inside the tidy function will return + * // through the tidy, in this case to the variable y. + * return b.add(one); + * }); + * + * console.log('numTensors (outside tidy): ' + tf.memory().numTensors); + * y.print(); + * ``` + * + * @param nameOrFn The name of the closure, or the function to execute. + * If a name is provided, the 2nd argument should be the function. + * If debug mode is on, the timing and the memory usage of the function + * will be tracked and displayed on the console using the provided name. + * @param fn The function to execute. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +function tidy(nameOrFn, fn) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].tidy(nameOrFn, fn); +} +/** + * Disposes any `tf.Tensor`s found within the provided object. + * + * @param container an object that may be a `tf.Tensor` or may directly + * contain `tf.Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. If + * the object is not a `tf.Tensor` or does not contain `Tensors`, nothing + * happens. In general it is safe to pass any object here, except that + * `Promise`s are not supported. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +function dispose(container) { + const tensors = Object(_tensor_util__WEBPACK_IMPORTED_MODULE_3__["getTensorsInContainer"])(container); + tensors.forEach(tensor => tensor.dispose()); +} +/** + * Keeps a `tf.Tensor` generated inside a `tf.tidy` from being disposed + * automatically. + * + * ```js + * let b; + * const y = tf.tidy(() => { + * const one = tf.scalar(1); + * const a = tf.scalar(2); + * + * // b will not be cleaned up by the tidy. a and one will be cleaned up + * // when the tidy ends. + * b = tf.keep(a.square()); + * + * console.log('numTensors (in tidy): ' + tf.memory().numTensors); + * + * // The value returned inside the tidy function will return + * // through the tidy, in this case to the variable y. + * return b.add(one); + * }); + * + * console.log('numTensors (outside tidy): ' + tf.memory().numTensors); + * console.log('y:'); + * y.print(); + * console.log('b:'); + * b.print(); + * ``` + * + * @param result The tensor to keep from being disposed. + * + * @doc {heading: 'Performance', subheading: 'Memory'} + */ +function keep(result) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].keep(result); +} +/** + * Executes `f()` and returns a promise that resolves with timing + * information. + * + * The result is an object with the following properties: + * + * - `wallMs`: Wall execution time. + * - `kernelMs`: Kernel execution time, ignoring data transfer. If using the + * WebGL backend and the query timer extension is not available, this will + * return an error object. + * - On `WebGL` The following additional properties exist: + * - `uploadWaitMs`: CPU blocking time on texture uploads. + * - `downloadWaitMs`: CPU blocking time on texture downloads (readPixels). + * + * ```js + * const x = tf.randomNormal([20, 20]); + * const time = await tf.time(() => x.matMul(x)); + * + * console.log(`kernelMs: ${time.kernelMs}, wallTimeMs: ${time.wallMs}`); + * ``` + * + * @param f The function to execute and time. + * + * @doc {heading: 'Performance', subheading: 'Timing'} + */ +function time(f) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].time(f); +} +/** + * Sets the backend (cpu, webgl, wasm, etc) responsible for creating tensors and + * executing operations on those tensors. Returns a promise that resolves + * to a boolean if the backend initialization was successful. + * + * Note this disposes the current backend, if any, as well as any tensors + * associated with it. A new backend is initialized, even if it is of the + * same type as the previous one. + * + * @param backendName The name of the backend. Currently supports + * `'webgl'|'cpu'` in the browser, `'tensorflow'` under node.js + * (requires tfjs-node), and `'wasm'` (requires tfjs-backend-wasm). + * + * @doc {heading: 'Backends'} + */ +function setBackend(backendName) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].setBackend(backendName); +} +/** + * Returns a promise that resolves when the currently selected backend (or the + * highest priority one) has initialized. Await this promise when you are using + * a backend that has async initialization. + * + * @doc {heading: 'Backends'} + */ +function ready() { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].ready(); +} +/** + * Returns the current backend name (cpu, webgl, etc). The backend is + * responsible for creating tensors and executing operations on those tensors. + * + * @doc {heading: 'Backends'} + */ +function getBackend() { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].backendName; +} +/** + * Removes a backend and the registered factory. + * + * @doc {heading: 'Backends'} + */ +function removeBackend(name) { + _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].removeBackend(name); +} +/** + * Finds the backend registered under the provided name. Returns null if the + * name is not in the registry, or the registration hasn't finished yet. + */ +function findBackend(name) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].findBackend(name); +} +/** + * Finds the backend factory registered under the provided name. Returns a + * function that produces a new backend when called. Returns null if the name + * is not in the registry. + */ +function findBackendFactory(name) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].findBackendFactory(name); +} +/** + * Registers a global backend. The registration should happen when importing + * a module file (e.g. when importing `backend_webgl.ts`), and is used for + * modular builds (e.g. custom tfjs bundle with only webgl support). + * + * @param factory The backend factory function. When called, it should + * return a backend instance, or a promise of an instance. + * @param priority The priority of the backend (higher = more important). + * In case multiple backends are registered, the priority is used to find + * the best backend. Defaults to 1. + * @return False if there is already a registered backend under this name, true + * if not. + * + * @doc {heading: 'Backends'} + */ +function registerBackend(name, factory, priority = 1) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].registerBackend(name, factory, priority); +} +/** + * Gets the current backend. If no backends have been initialized, this will + * attempt to initialize the best backend. Will throw an error if the highest + * priority backend has async initialization, in which case, you should call + * 'await tf.ready()' before running other code. + * + * @doc {heading: 'Backends'} + */ +function backend() { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].backend; +} +/** + * Sets the global platform. + * + * @param platformName The name of this platform. + * @param platform A platform implementation. + */ +function setPlatform(platformName, platform) { + Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().setPlatform(platformName, platform); +} +//# sourceMappingURL=globals.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients.js ***! + \**************************************************************/ +/*! exports provided: customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customGrad", function() { return customGrad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "variableGrads", function() { return variableGrads; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "valueAndGrad", function() { return valueAndGrad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "valueAndGrads", function() { return valueAndGrads; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "grad", function() { return grad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "grads", function() { return grads; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _tensor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tensor */ "./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Provided `f(x)`, returns another function `g(x, dy?)`, which gives the + * gradient of `f(x)` with respect to `x`. + * + * If `dy` is provided, the gradient of `f(x).mul(dy).sum()` with respect to + * `x` is computed instead. `f(x)` must take a single tensor `x` and return a + * single tensor `y`. If `f()` takes multiple inputs, use `tf.grads` instead. + * + * ```js + * // f(x) = x ^ 2 + * const f = x => x.square(); + * // f'(x) = 2x + * const g = tf.grad(f); + * + * const x = tf.tensor1d([2, 3]); + * g(x).print(); + * ``` + * + * ```js + * // f(x) = x ^ 3 + * const f = x => x.pow(tf.scalar(3, 'int32')); + * // f'(x) = 3x ^ 2 + * const g = tf.grad(f); + * // f''(x) = 6x + * const gg = tf.grad(g); + * + * const x = tf.tensor1d([2, 3]); + * gg(x).print(); + * ``` + * + * @param f The function f(x), to compute gradient for. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +function grad(f) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isFunction"](f), () => 'The f passed in grad(f) must be a function'); + return (x, dy) => { + // x can be of any dtype, thus null as the last argument. + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'tf.grad', null); + const $dy = (dy != null) ? Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(dy, 'dy', 'tf.grad') : null; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].tidy(() => { + const { value, grads } = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].gradients(() => f($x), [$x], $dy); + if ($dy != null) { + _util__WEBPACK_IMPORTED_MODULE_3__["assertShapesMatch"](value.shape, $dy.shape, 'The shape of dy passed in grad(f)(x, dy) must match the shape ' + + 'returned by f(x)'); + } + checkGrads(grads); + return grads[0]; + }); + }; +} +/** + * Provided `f(x1, x2,...)`, returns another function `g([x1, x2,...], dy?)`, + * which gives an array of gradients of `f()` with respect to each input + * [`x1`,`x2`,...]. + * + * If `dy` is passed when calling `g()`, the gradient of + * `f(x1,...).mul(dy).sum()` with respect to each input is computed instead. + * The provided `f` must take one or more tensors and return a single tensor + * `y`. If `f()` takes a single input, we recommend using `tf.grad` instead. + * + * ```js + * // f(a, b) = a * b + * const f = (a, b) => a.mul(b); + * // df / da = b, df / db = a + * const g = tf.grads(f); + * + * const a = tf.tensor1d([2, 3]); + * const b = tf.tensor1d([-2, -3]); + * const [da, db] = g([a, b]); + * console.log('da'); + * da.print(); + * console.log('db'); + * db.print(); + * ``` + * + * @param f The function `f(x1, x2,...)` to compute gradients for. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +function grads(f) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isFunction"](f), () => 'The f passed in grads(f) must be a function'); + return (args, dy) => { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](Array.isArray(args), () => 'The args passed in grads(f)(args) must be an array ' + + 'of `Tensor`s or `TensorLike`s'); + // args can be of any dtype, thus null as the last argument. + const $args = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensorArray"])(args, 'args', 'tf.grads', null); + const $dy = (dy != null) ? Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(dy, 'dy', 'tf.grads') : null; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].tidy(() => { + const { value, grads } = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].gradients(() => f(...$args), $args, $dy); + if ($dy != null) { + _util__WEBPACK_IMPORTED_MODULE_3__["assertShapesMatch"](value.shape, $dy.shape, 'The shape of dy passed in grads(f)([x1,...], dy) must ' + + 'match the shape returned by f([x1,...])'); + } + checkGrads(grads); + return grads; + }); + }; +} +/** + * Like `tf.grad`, but also returns the value of `f()`. Useful when `f()` + * returns a metric you want to show. + * + * The result is a rich object with the following properties: + * - grad: The gradient of `f(x)` w.r.t `x` (result of `tf.grad`). + * - value: The value returned by `f(x)`. + * + * ```js + * // f(x) = x ^ 2 + * const f = x => x.square(); + * // f'(x) = 2x + * const g = tf.valueAndGrad(f); + * + * const x = tf.tensor1d([2, 3]); + * const {value, grad} = g(x); + * + * console.log('value'); + * value.print(); + * console.log('grad'); + * grad.print(); + * ``` + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +function valueAndGrad(f) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isFunction"](f), () => 'The f passed in valueAndGrad(f) must be a function'); + return (x, dy) => { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](x instanceof _tensor__WEBPACK_IMPORTED_MODULE_1__["Tensor"], () => 'The x passed in valueAndGrad(f)(x) must be a tensor'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](dy == null || dy instanceof _tensor__WEBPACK_IMPORTED_MODULE_1__["Tensor"], () => 'The dy passed in valueAndGrad(f)(x, dy) must be a tensor'); + const { grads, value } = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].gradients(() => f(x), [x], dy); + checkGrads(grads); + return { grad: grads[0], value }; + }; +} +/** + * Like `tf.grads`, but returns also the value of `f()`. Useful when `f()` + * returns a metric you want to show. + * + * The result is a rich object with the following properties: + * - grads: The gradients of `f()` w.r.t each input (result of `tf.grads`). + * - value: The value returned by `f(x)`. + * + * ```js + * // f(a, b) = a * b + * const f = (a, b) => a.mul(b); + * // df/da = b, df/db = a + * const g = tf.valueAndGrads(f); + * + * const a = tf.tensor1d([2, 3]); + * const b = tf.tensor1d([-2, -3]); + * const {value, grads} = g([a, b]); + * + * const [da, db] = grads; + * + * console.log('value'); + * value.print(); + * + * console.log('da'); + * da.print(); + * console.log('db'); + * db.print(); + * ``` + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +function valueAndGrads(f) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isFunction"](f), () => 'The f passed in valueAndGrads(f) must be a function'); + return (args, dy) => { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](Array.isArray(args) && args.every(arg => arg instanceof _tensor__WEBPACK_IMPORTED_MODULE_1__["Tensor"]), () => 'The args passed in valueAndGrads(f)(args) must be array of ' + + 'tensors'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](dy == null || dy instanceof _tensor__WEBPACK_IMPORTED_MODULE_1__["Tensor"], () => 'The dy passed in valueAndGrads(f)(args, dy) must be a tensor'); + const res = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].gradients(() => f(...args), args, dy); + if (dy != null) { + _util__WEBPACK_IMPORTED_MODULE_3__["assertShapesMatch"](res.value.shape, dy.shape, 'The shape of dy passed in valueAndGrads(f)([x1,...], dy) must ' + + 'match the shape returned by f([x1,...])'); + } + checkGrads(res.grads); + return res; + }; +} +/** + * Computes and returns the gradient of f(x) with respect to the list of + * trainable variables provided by `varList`. If no list is provided, it + * defaults to all trainable variables. + * + * ```js + * const a = tf.variable(tf.tensor1d([3, 4])); + * const b = tf.variable(tf.tensor1d([5, 6])); + * const x = tf.tensor1d([1, 2]); + * + * // f(a, b) = a * x ^ 2 + b * x + * const f = () => a.mul(x.square()).add(b.mul(x)).sum(); + * // df/da = x ^ 2, df/db = x + * const {value, grads} = tf.variableGrads(f); + * + * Object.keys(grads).forEach(varName => grads[varName].print()); + * ``` + * + * @param f The function to execute. f() should return a scalar. + * @param varList The list of variables to compute the gradients with respect + * to. Defaults to all trainable variables. + * @returns An object with the following keys and values: + * - `value`: The value of the function `f`. + * - `grads`: A map from the names of the variables to the gradients. + * If the `varList` argument is provided explicitly and contains a subset of + * non-trainable variables, this map in the return value will contain keys + * that map the names of the non-trainable variables to `null`. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +function variableGrads(f, varList) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isFunction"](f), () => 'The f passed in variableGrads(f) must be a function'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](varList == null || + Array.isArray(varList) && varList.every(v => v instanceof _tensor__WEBPACK_IMPORTED_MODULE_1__["Variable"]), () => 'The varList passed in variableGrads(f, varList) must be an array ' + + 'of variables'); + const specifiedVarList = varList != null; + if (!specifiedVarList) { + // Get all of the trainable variables. + varList = []; + for (const varName in _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].registeredVariables) { + varList.push(_engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].registeredVariables[varName]); + } + } + const specifiedNonTrainable = specifiedVarList ? varList.filter(variable => !variable.trainable) : null; + // Prune non-trainable variables. + const originalVarCount = varList.length; + varList = varList.filter(variable => variable.trainable); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](varList.length > 0, () => `variableGrads() expects at least one of the input variables to ` + + `be trainable, but none of the ${originalVarCount} variables is ` + + `trainable.`); + const allowNoGradients = true; + const { value, grads } = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].gradients(f, varList, null, allowNoGradients); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](grads.some(g => g != null), () => 'Cannot find a connection between any variable and the result of ' + + 'the loss function y=f(x). Please make sure the operations that ' + + 'use variables are inside the function f passed to minimize().'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](value.rank === 0, () => `The f passed in variableGrads(f) must return a scalar, but it ` + + `returned a rank-${value.rank} tensor`); + const namedGrads = {}; + varList.forEach((v, i) => { + if (grads[i] != null) { + namedGrads[v.name] = grads[i]; + } + }); + if (specifiedNonTrainable != null) { + // If varList is explicitly provided and contains non-trainable values, + // add them to the returned gradients with `null` values. + specifiedNonTrainable.forEach(v => namedGrads[v.name] = null); + } + return { value, grads: namedGrads }; +} +/** + * Overrides the gradient computation of a function `f`. + * + * Takes a function + * `f(...inputs, save) => {value: Tensor, gradFunc: (dy, saved) => Tensor[]}` + * and returns another function `g(...inputs)` which takes the same inputs as + * `f`. When called, `g` returns `f().value`. In backward mode, custom gradients + * with respect to each input of `f` are computed using `f().gradFunc`. + * + * The `save` function passsed to `f` should be used for saving tensors needed + * in the gradient. And the `saved` passed to the `gradFunc` is a + * `NamedTensorMap`, which contains those saved tensor. + * + * ```js + * const customOp = tf.customGrad((x, save) => { + * // Save x to make sure it's available later for the gradient. + * save([x]); + * // Override gradient of our custom x ^ 2 op to be dy * abs(x); + * return { + * value: x.square(), + * // Note `saved.x` which points to the `x` we saved earlier. + * gradFunc: (dy, saved) => [dy.mul(saved[0].abs())] + * }; + * }); + * + * const x = tf.tensor1d([-1, -2, 3]); + * const dx = tf.grad(x => customOp(x)); + * + * console.log(`f(x):`); + * customOp(x).print(); + * console.log(`f'(x):`); + * dx(x).print(); + * ``` + * + * @param f The function to evaluate in forward mode, which should return + * `{value: Tensor, gradFunc: (dy, saved) => Tensor[]}`, where `gradFunc` + * returns the custom gradients of `f` with respect to its inputs. + * + * @doc {heading: 'Training', subheading: 'Gradients'} + */ +function customGrad(f) { + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].customGrad(f); +} +function checkGrads(grads) { + const numNullGradients = grads.filter(g => g == null).length; + if (numNullGradients > 0) { + throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that + the f you passed encloses all operations that lead from x to y.`); + } +} + +//# sourceMappingURL=gradients.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Abs_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Abs_grad.js ***! + \***********************************************************************/ +/*! exports provided: absGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "absGradConfig", function() { return absGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_step__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/step */ "./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const absGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Abs"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(dy, Object(_ops_step__WEBPACK_IMPORTED_MODULE_3__["step"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32'), -1)) }; + } +}; +//# sourceMappingURL=Abs_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Acos_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Acos_grad.js ***! + \************************************************************************/ +/*! exports provided: acosGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acosGradConfig", function() { return acosGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sqrt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/sqrt */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +const acosGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Acos"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { + x: () => { + const a = Object(_ops_square__WEBPACK_IMPORTED_MODULE_6__["square"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')); + const b = Object(_ops_sqrt__WEBPACK_IMPORTED_MODULE_5__["sqrt"])(Object(_ops_sub__WEBPACK_IMPORTED_MODULE_7__["sub"])(Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_4__["scalar"])(1), a)); + return Object(_ops_neg__WEBPACK_IMPORTED_MODULE_3__["neg"])(Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, b)); + } + }; + } +}; +//# sourceMappingURL=Acos_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Acosh_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Acosh_grad.js ***! + \*************************************************************************/ +/*! exports provided: acoshGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acoshGradConfig", function() { return acoshGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_sqrt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sqrt */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +const acoshGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Acosh"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { + x: () => { + const a = Object(_ops_sqrt__WEBPACK_IMPORTED_MODULE_3__["sqrt"])(Object(_ops_sub__WEBPACK_IMPORTED_MODULE_5__["sub"])(Object(_ops_square__WEBPACK_IMPORTED_MODULE_4__["square"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')), 1)); + return Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, a); + } + }; + } +}; +//# sourceMappingURL=Acosh_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/AddN_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/AddN_grad.js ***! + \************************************************************************/ +/*! exports provided: addNGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addNGradConfig", function() { return addNGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const addNGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["AddN"], + saveAllInputs: true, + gradFunc: (dy, saved) => { + const ders = {}; + saved.forEach((_, i) => { + ders[i] = () => dy.clone(); + }); + return ders; + } +}; +//# sourceMappingURL=AddN_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Add_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Add_grad.js ***! + \***********************************************************************/ +/*! exports provided: addGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGradConfig", function() { return addGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const addGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Add"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"](a.shape, b.shape); + const derA = () => { + let res = dy; + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](a.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_3__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])(res, a.shape); + }; + const derB = () => { + let res = dy; + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](b.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_3__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])(res, b.shape); + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Add_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMax_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMax_grad.js ***! + \**************************************************************************/ +/*! exports provided: argMaxGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "argMaxGradConfig", function() { return argMaxGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const argMaxGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["ArgMax"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(x) }; + } +}; +//# sourceMappingURL=ArgMax_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMin_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMin_grad.js ***! + \**************************************************************************/ +/*! exports provided: argMinGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "argMinGradConfig", function() { return argMinGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const argMinGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["ArgMin"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(x) }; + } +}; +//# sourceMappingURL=ArgMin_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Asin_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Asin_grad.js ***! + \************************************************************************/ +/*! exports provided: asinGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinGradConfig", function() { return asinGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sqrt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sqrt */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +const asinGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Asin"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, Object(_ops_sqrt__WEBPACK_IMPORTED_MODULE_4__["sqrt"])(Object(_ops_sub__WEBPACK_IMPORTED_MODULE_6__["sub"])(Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_3__["scalar"])(1), Object(_ops_square__WEBPACK_IMPORTED_MODULE_5__["square"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32'))))) }; + } +}; +//# sourceMappingURL=Asin_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Asinh_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Asinh_grad.js ***! + \*************************************************************************/ +/*! exports provided: asinhGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinhGradConfig", function() { return asinhGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sqrt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/sqrt */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +const asinhGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Asinh"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { + x: () => { + const a = Object(_ops_sqrt__WEBPACK_IMPORTED_MODULE_5__["sqrt"])(Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_4__["scalar"])(1), Object(_ops_square__WEBPACK_IMPORTED_MODULE_6__["square"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(x, 'float32')))); + return Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(dy, a); + } + }; + } +}; +//# sourceMappingURL=Asinh_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Atan2_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Atan2_grad.js ***! + \*************************************************************************/ +/*! exports provided: atan2GradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2GradConfig", function() { return atan2GradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + +const atan2GradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Atan2"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_2__["assertAndGetBroadcastShape"])(a.shape, b.shape); + const derA = () => { + const d = Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(Object(_ops_square__WEBPACK_IMPORTED_MODULE_7__["square"])(a), Object(_ops_square__WEBPACK_IMPORTED_MODULE_7__["square"])(b)); + let res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(b, d)); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_2__["getReductionAxes"])(a.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, a.shape); + }; + const derB = () => { + const d = Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(Object(_ops_square__WEBPACK_IMPORTED_MODULE_7__["square"])(a), Object(_ops_square__WEBPACK_IMPORTED_MODULE_7__["square"])(b)); + let res = Object(_ops_neg__WEBPACK_IMPORTED_MODULE_5__["neg"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(a, d))); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_2__["getReductionAxes"])(b.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, b.shape); + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Atan2_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Atan_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Atan_grad.js ***! + \************************************************************************/ +/*! exports provided: atanGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanGradConfig", function() { return atanGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const atanGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Atan"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(dy, Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(Object(_ops_square__WEBPACK_IMPORTED_MODULE_4__["square"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(x, 'float32')), 1)) }; + } +}; +//# sourceMappingURL=Atan_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Atanh_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Atanh_grad.js ***! + \*************************************************************************/ +/*! exports provided: atanhGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanhGradConfig", function() { return atanhGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +const atanhGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Atanh"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, Object(_ops_sub__WEBPACK_IMPORTED_MODULE_4__["sub"])(Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_5__["scalar"])(1), Object(_ops_square__WEBPACK_IMPORTED_MODULE_3__["square"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')))) }; + } +}; +//# sourceMappingURL=Atanh_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool3D_grad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool3D_grad.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool3DGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool3DGradConfig", function() { return avgPool3DGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_avg_pool_3d_backprop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/avg_pool_3d_backprop */ "./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d_backprop.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const avgPool3DGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["AvgPool3D"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const { filterSize, strides, dilations, pad, dimRoundingMode } = attrs; + const $dilations = dilations == null ? [1, 1, 1] : dilations; + return { + x: () => Object(_ops_avg_pool_3d_backprop__WEBPACK_IMPORTED_MODULE_1__["avgPool3dBackprop"])(dy, x, filterSize, strides, $dilations, pad, dimRoundingMode) + }; + } +}; +//# sourceMappingURL=AvgPool3D_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool_grad.js ***! + \***************************************************************************/ +/*! exports provided: avgPoolGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolGradConfig", function() { return avgPoolGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_avg_pool_backprop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/avg_pool_backprop */ "./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_backprop.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const avgPoolGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["AvgPool"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const { filterSize, strides, pad } = attrs; + return { + x: () => Object(_ops_avg_pool_backprop__WEBPACK_IMPORTED_MODULE_1__["avgPoolBackprop"])(dy, x, filterSize, strides, pad) + }; + } +}; +//# sourceMappingURL=AvgPool_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/BatchMatMul_grad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/BatchMatMul_grad.js ***! + \*******************************************************************************/ +/*! exports provided: batchMatMulGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchMatMulGradConfig", function() { return batchMatMulGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mat_mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const batchMatMulGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["BatchMatMul"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved, attrs) => { + const [a, b] = saved; + const { transposeA, transposeB } = attrs; + if (!transposeA && !transposeB) { + return { + a: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(dy, b, false, true), + b: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(a, dy, true, false) + }; + } + else if (!transposeA && transposeB) { + return { + a: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(dy, b, false, false), + b: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(dy, a, true, false) + }; + } + else if (transposeA && !transposeB) { + return { + a: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(b, dy, false, true), + b: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(a, dy, false, false) + }; + } + else { + return { + a: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(b, dy, true, true), + b: () => Object(_ops_mat_mul__WEBPACK_IMPORTED_MODULE_1__["matMul"])(dy, a, true, true) + }; + } + } +}; +//# sourceMappingURL=BatchMatMul_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/BatchToSpaceND_grad.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/BatchToSpaceND_grad.js ***! + \**********************************************************************************/ +/*! exports provided: batchToSpaceNDGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchToSpaceNDGradConfig", function() { return batchToSpaceNDGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_space_to_batch_nd__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/space_to_batch_nd */ "./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const batchToSpaceNDGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["BatchToSpaceND"], + gradFunc: (dy, saved, attrs) => { + const { blockShape, crops } = attrs; + return { x: () => Object(_ops_space_to_batch_nd__WEBPACK_IMPORTED_MODULE_1__["spaceToBatchND"])(dy, blockShape, crops) }; + } +}; +//# sourceMappingURL=BatchToSpaceND_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/BroadcastTo_grad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/BroadcastTo_grad.js ***! + \*******************************************************************************/ +/*! exports provided: broadcastToGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "broadcastToGradConfig", function() { return broadcastToGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const broadcastToGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["BroadcastTo"], + gradFunc: (dy, saved, attrs) => { + const broadCastToAttrs = attrs; + const inputShape = broadCastToAttrs.inputShape; + const outputShape = broadCastToAttrs.shape; + const reps = Array.from(outputShape); + for (let i = inputShape.length - 1; i >= 0; i--) { + if (inputShape[i] === outputShape[i]) { + reps[i] = 1; + } + else if (inputShape[i] !== 1) { + throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`); + } + } + const axes = []; + for (let i = 0; i < reps.length; i++) { + if (reps[i] > 1) { + axes.push(i); + } + } + return { x: () => Object(_ops_sum__WEBPACK_IMPORTED_MODULE_1__["sum"])(dy, axes, true /* keepDims */) }; + } +}; +//# sourceMappingURL=BroadcastTo_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Cast_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Cast_grad.js ***! + \************************************************************************/ +/*! exports provided: castGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "castGradConfig", function() { return castGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +const castGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Cast"], + gradFunc: (dy) => { + return { x: () => dy.clone() }; + } +}; +//# sourceMappingURL=Cast_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Ceil_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Ceil_grad.js ***! + \************************************************************************/ +/*! exports provided: ceilGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceilGradConfig", function() { return ceilGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const ceilGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Ceil"], + gradFunc: (dy) => { + // TODO(manrajgrover): Return null for gradients when backprop supports it. + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=Ceil_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/ClipByValue_grad.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/ClipByValue_grad.js ***! + \*******************************************************************************/ +/*! exports provided: clipByValueGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipByValueGradConfig", function() { return clipByValueGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_greater_equal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/greater_equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js"); +/* harmony import */ var _ops_less_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/less_equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"); +/* harmony import */ var _ops_logical_and__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/logical_and */ "./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js"); +/* harmony import */ var _ops_where__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/where */ "./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +const clipByValueGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["ClipByValue"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const { clipValueMin, clipValueMax } = attrs; + return { + x: () => Object(_ops_where__WEBPACK_IMPORTED_MODULE_4__["where"])(Object(_ops_logical_and__WEBPACK_IMPORTED_MODULE_3__["logicalAnd"])(Object(_ops_greater_equal__WEBPACK_IMPORTED_MODULE_1__["greaterEqual"])(x, clipValueMin), Object(_ops_less_equal__WEBPACK_IMPORTED_MODULE_2__["lessEqual"])(x, clipValueMax)), dy, Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_5__["zerosLike"])(dy)), + }; + } +}; +//# sourceMappingURL=ClipByValue_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Concat_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Concat_grad.js ***! + \**************************************************************************/ +/*! exports provided: concatGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatGradConfig", function() { return concatGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_split__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/split */ "./node_modules/@tensorflow/tfjs-core/dist/ops/split.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const concatGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Concat"], + saveAllInputs: true, + gradFunc: (dy, saved, attrs) => { + const shapes = saved.map(t => t.shape); + const { axis } = attrs; + const $axis = Object(_util__WEBPACK_IMPORTED_MODULE_2__["parseAxisParam"])(axis, saved[0].shape)[0]; + const sizeSplits = shapes.map(s => s[$axis]); + const derTensors = Object(_ops_split__WEBPACK_IMPORTED_MODULE_1__["split"])(dy, sizeSplits, $axis); + return derTensors.map(t => () => t); + } +}; +//# sourceMappingURL=Concat_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2DBackpropInput_grad.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2DBackpropInput_grad.js ***! + \***************************************************************************************/ +/*! exports provided: conv2DBackpropInputGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DBackpropInputGradConfig", function() { return conv2DBackpropInputGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_conv2d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/conv2d */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js"); +/* harmony import */ var _ops_conv2d_backprop_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/conv2d_backprop_filter */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const conv2DBackpropInputGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Conv2DBackpropInput"], + inputsToSave: ['dy', 'filter'], + gradFunc: (ddx, saved, attrs) => { + const [dy, filter] = saved; + const { strides, pad, dataFormat, dimRoundingMode } = attrs; + return { + dy: () => Object(_ops_conv2d__WEBPACK_IMPORTED_MODULE_1__["conv2d"])(ddx, filter, strides, pad, dataFormat, 1 /* dilations */, dimRoundingMode), + filter: () => Object(_ops_conv2d_backprop_filter__WEBPACK_IMPORTED_MODULE_2__["conv2DBackpropFilter"])(ddx, dy, filter.shape, strides, pad, dataFormat, dimRoundingMode) + }; + } +}; +//# sourceMappingURL=Conv2DBackpropInput_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2D_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2D_grad.js ***! + \**************************************************************************/ +/*! exports provided: conv2DGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv2DGradConfig", function() { return conv2DGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_conv2d_backprop_filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/conv2d_backprop_filter */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js"); +/* harmony import */ var _ops_conv2d_backprop_input__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/conv2d_backprop_input */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js"); +/* harmony import */ var _ops_conv_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const conv2DGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Conv2D"], + inputsToSave: ['x', 'filter'], + gradFunc: (dy, saved, attrs) => { + const [x4D, $filter] = saved; + const { dilations, strides, pad, dataFormat } = attrs; + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](_ops_conv_util__WEBPACK_IMPORTED_MODULE_3__["tupleValuesAreOne"](dilations), () => 'Error in gradient of conv2D: dilation rates greater than 1 ' + + `are not yet supported in gradients. Got dilations '${dilations}'`); + return { + x: () => Object(_ops_conv2d_backprop_input__WEBPACK_IMPORTED_MODULE_2__["conv2DBackpropInput"])(x4D.shape, dy, $filter, strides, pad, dataFormat), + filter: () => Object(_ops_conv2d_backprop_filter__WEBPACK_IMPORTED_MODULE_1__["conv2DBackpropFilter"])(x4D, dy, $filter.shape, strides, pad, dataFormat) + }; + } +}; +//# sourceMappingURL=Conv2D_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv3D_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv3D_grad.js ***! + \**************************************************************************/ +/*! exports provided: conv3DGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conv3DGradConfig", function() { return conv3DGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_conv3d_backprop_filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/conv3d_backprop_filter */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_filter.js"); +/* harmony import */ var _ops_conv3d_backprop_input__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/conv3d_backprop_input */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js"); +/* harmony import */ var _ops_conv_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const conv3DGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Conv3D"], + inputsToSave: ['x', 'filter'], + gradFunc: (dy, saved, attrs) => { + const { dilations, strides, pad } = attrs; + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](Object(_ops_conv_util__WEBPACK_IMPORTED_MODULE_3__["tupleValuesAreOne"])(dilations), () => 'Error in gradient of conv3D: dilation rates greater than 1 are ' + + `not yet supported in gradients. Got dilations '${dilations}'`); + const [x5D, $filter] = saved; + return { + x: () => Object(_ops_conv3d_backprop_input__WEBPACK_IMPORTED_MODULE_2__["conv3DBackpropInput"])(x5D.shape, dy, $filter, strides, pad), + filter: () => Object(_ops_conv3d_backprop_filter__WEBPACK_IMPORTED_MODULE_1__["conv3DBackpropFilter"])(x5D, dy, $filter.shape, strides, pad) + }; + } +}; +//# sourceMappingURL=Conv3D_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Cos_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Cos_grad.js ***! + \***********************************************************************/ +/*! exports provided: cosGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cosGradConfig", function() { return cosGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_sin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sin */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sin.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const cosGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Cos"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(Object(_ops_neg__WEBPACK_IMPORTED_MODULE_3__["neg"])(Object(_ops_sin__WEBPACK_IMPORTED_MODULE_4__["sin"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32'))), dy) }; + } +}; +//# sourceMappingURL=Cos_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Cosh_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Cosh_grad.js ***! + \************************************************************************/ +/*! exports provided: coshGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "coshGradConfig", function() { return coshGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_sinh__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sinh */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const coshGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Cosh"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(Object(_ops_sinh__WEBPACK_IMPORTED_MODULE_3__["sinh"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')), dy) }; + } +}; +//# sourceMappingURL=Cosh_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Cumsum_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Cumsum_grad.js ***! + \**************************************************************************/ +/*! exports provided: cumsumGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cumsumGradConfig", function() { return cumsumGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_axis_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _ops_cumsum__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cumsum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js"); +/* harmony import */ var _ops_transpose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const cumsumGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Cumsum"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const { axis, exclusive, reverse } = attrs; + return { + x: () => { + const permutation = Object(_ops_axis_util__WEBPACK_IMPORTED_MODULE_1__["getAxesPermutation"])([axis], x.rank); + let out = Object(_ops_cumsum__WEBPACK_IMPORTED_MODULE_2__["cumsum"])(dy, axis, exclusive, !reverse); + if (permutation != null) { + out = Object(_ops_transpose__WEBPACK_IMPORTED_MODULE_3__["transpose"])(out, permutation); + } + return out; + } + }; + } +}; +//# sourceMappingURL=Cumsum_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/DepthwiseConv2dNative_grad.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/DepthwiseConv2dNative_grad.js ***! + \*****************************************************************************************/ +/*! exports provided: depthwiseConv2dNativeGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2dNativeGradConfig", function() { return depthwiseConv2dNativeGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_conv_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _ops_depthwise_conv2d_native_backprop_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/depthwise_conv2d_native_backprop_filter */ "./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js"); +/* harmony import */ var _ops_depthwise_conv2d_native_backprop_input__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/depthwise_conv2d_native_backprop_input */ "./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const depthwiseConv2dNativeGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["DepthwiseConv2dNative"], + inputsToSave: ['x', 'filter'], + gradFunc: (dy, saved, attrs) => { + const { dilations, strides, pad, dimRoundingMode } = attrs; + const $dilations = dilations == null ? [1, 1] : dilations; + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](_ops_conv_util__WEBPACK_IMPORTED_MODULE_1__["tupleValuesAreOne"]($dilations), () => 'Error in gradient of depthwiseConv2dNative: dilation rates ' + + `greater than 1 are not yet supported. Got dilations ` + + `'${$dilations}'`); + const [x, filter] = saved; + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](x.rank === 4, () => `Error in gradient of depthwiseConv2dNative: input must be ` + + `rank 4, but got rank ${x.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](filter.rank === 4, () => `Error in gradient of depthwiseConv2dNative: filter must be ` + + `rank 4, but got rank ${filter.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](x.shape[3] === filter.shape[2], () => `Error in gradient of depthwiseConv2d: number of input ` + + `channels (${x.shape[3]}) must match the inChannels dimension ` + + `in filter ${filter.shape[2]}.`); + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](_ops_conv_util__WEBPACK_IMPORTED_MODULE_1__["eitherStridesOrDilationsAreOne"](strides, $dilations), () => 'Error in gradient of depthwiseConv2d: Either strides or ' + + `dilations must be 1. Got strides ${strides} and dilations ` + + `'${$dilations}'.`); + if (dimRoundingMode != null) { + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](_util__WEBPACK_IMPORTED_MODULE_4__["isInt"](pad), () => `Error in depthwiseConv2d: pad must be an integer when using, ` + + `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`); + } + return { + x: () => Object(_ops_depthwise_conv2d_native_backprop_input__WEBPACK_IMPORTED_MODULE_3__["depthwiseConv2dNativeBackpropInput"])(x.shape, dy, filter, strides, pad, dilations, dimRoundingMode), + filter: () => Object(_ops_depthwise_conv2d_native_backprop_filter__WEBPACK_IMPORTED_MODULE_2__["depthwiseConv2dNativeBackpropFilter"])(x, dy, filter.shape, strides, pad, dilations, dimRoundingMode), + }; + } +}; +//# sourceMappingURL=DepthwiseConv2dNative_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Dilation2D_grad.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Dilation2D_grad.js ***! + \******************************************************************************/ +/*! exports provided: dilation2dGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dilation2dGradConfig", function() { return dilation2dGradConfig; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const dilation2dGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Dilation2D"], + inputsToSave: ['x', 'filter'], + gradFunc: (dy, saved, attrs) => { + const [x, filter] = saved; + const inputInputs = { x, filter, dy }; + const filterInputs = { x, filter, dy }; + return { + x: () => _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernel(_kernel_names__WEBPACK_IMPORTED_MODULE_1__["Dilation2DBackpropInput"], inputInputs, attrs), + filter: () => _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernel(_kernel_names__WEBPACK_IMPORTED_MODULE_1__["Dilation2DBackpropFilter"], filterInputs, attrs) + }; + } +}; +//# sourceMappingURL=Dilation2D_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Div_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Div_grad.js ***! + \***********************************************************************/ +/*! exports provided: divGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divGradConfig", function() { return divGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + +const divGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Div"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"](a.shape, b.shape); + const derA = () => { + const res = Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(b, 'float32')); + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](a.shape, outShape); + if (reduceAxes.length > 0) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(res, reduceAxes), a.shape); + } + return res; + }; + const derB = () => { + let res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(a, 'float32')); + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](b.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(res, reduceAxes), b.shape); + } + const tmp = Object(_ops_square__WEBPACK_IMPORTED_MODULE_7__["square"])(b); + return Object(_ops_neg__WEBPACK_IMPORTED_MODULE_5__["neg"])(Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(res, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(tmp, 'float32'))); + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Div_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Elu_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Elu_grad.js ***! + \***********************************************************************/ +/*! exports provided: eluGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eluGradConfig", function() { return eluGradConfig; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const eluGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Elu"], + outputsToSave: [true], + gradFunc: (dy, saved) => { + const [y] = saved; + const backPropKernelFunc = (backend) => { + return backend.eluDer(dy, y); + }; + const inputs = { dy, y }; + return { + x: () => _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(backPropKernelFunc, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["EluGrad"]) + }; + } +}; +//# sourceMappingURL=Elu_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Erf_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Erf_grad.js ***! + \***********************************************************************/ +/*! exports provided: erfGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "erfGradConfig", function() { return erfGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_exp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/exp */ "./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const erfGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Erf"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + const a = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(Object(_ops_exp__WEBPACK_IMPORTED_MODULE_1__["exp"])(Object(_ops_neg__WEBPACK_IMPORTED_MODULE_3__["neg"])(Object(_ops_square__WEBPACK_IMPORTED_MODULE_4__["square"])(x))), 2 / Math.sqrt(Math.PI)); + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(dy, a) }; + } +}; +//# sourceMappingURL=Erf_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Exp_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Exp_grad.js ***! + \***********************************************************************/ +/*! exports provided: expGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expGradConfig", function() { return expGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const expGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Exp"], + outputsToSave: [true], + gradFunc: (dy, saved) => { + const [y] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(dy, y) }; + } +}; +//# sourceMappingURL=Exp_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Expm1_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Expm1_grad.js ***! + \*************************************************************************/ +/*! exports provided: expm1GradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expm1GradConfig", function() { return expm1GradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_exp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/exp */ "./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const expm1GradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Expm1"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(dy, Object(_ops_exp__WEBPACK_IMPORTED_MODULE_1__["exp"])(x)) }; + } +}; +//# sourceMappingURL=Expm1_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/FloorDiv_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/FloorDiv_grad.js ***! + \****************************************************************************/ +/*! exports provided: floorDivGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floorDivGradConfig", function() { return floorDivGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + +const floorDivGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["FloorDiv"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"])(a.shape, b.shape); + const derA = () => { + const res = Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(b, 'float32')); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(a.shape, outShape); + if (reduceAxes.length > 0) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(res, reduceAxes), a.shape); + } + return res; + }; + const derB = () => { + let res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(a, 'float32')); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(b.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(res, reduceAxes), b.shape); + } + const tmp = Object(_ops_square__WEBPACK_IMPORTED_MODULE_7__["square"])(b); + return Object(_ops_neg__WEBPACK_IMPORTED_MODULE_5__["neg"])(Object(_ops_div__WEBPACK_IMPORTED_MODULE_3__["div"])(res, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(tmp, 'float32'))); + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=FloorDiv_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Floor_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Floor_grad.js ***! + \*************************************************************************/ +/*! exports provided: floorGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floorGradConfig", function() { return floorGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const floorGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Floor"], + gradFunc: (dy) => { + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=Floor_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/FusedBatchNorm_grad.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/FusedBatchNorm_grad.js ***! + \**********************************************************************************/ +/*! exports provided: fusedBatchNormGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fusedBatchNormGradConfig", function() { return fusedBatchNormGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_rsqrt__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/rsqrt */ "./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/* harmony import */ var _ops_tile__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ops/tile */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + +const fusedBatchNormGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["FusedBatchNorm"], + inputsToSave: ['x', 'mean', 'variance', 'scale'], + gradFunc: (dy, saved, attrs) => { + const { varianceEpsilon } = attrs; + const [x, mean, variance, scale] = saved; + const scaleValue = scale == null ? Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_6__["scalar"])(1) : scale; + const reductionAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_2__["getReductionAxes"])(mean.shape, x.shape); + const tileShape = []; + if (mean.rank === 1) { + for (let i = 0; i < x.shape.length - 1; ++i) { + tileShape.push(x.shape[i]); + } + tileShape.push(1); + } + const xMinusMean = Object(_ops_sub__WEBPACK_IMPORTED_MODULE_7__["sub"])(x, mean); + const dyTimesScaleValue = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, scaleValue); + const oneOverSqrtVariance = Object(_ops_rsqrt__WEBPACK_IMPORTED_MODULE_5__["rsqrt"])(Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(variance, Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_6__["scalar"])(varianceEpsilon))); + const minusHalfRCube = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(oneOverSqrtVariance, oneOverSqrtVariance), oneOverSqrtVariance), Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_6__["scalar"])(-0.5)); + const derX = () => { + if (mean.rank === 1) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_tile__WEBPACK_IMPORTED_MODULE_9__["tile"])(Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(oneOverSqrtVariance, [1, 1, 1, mean.shape[0]]), tileShape)), scaleValue), x.shape); + } + else { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, oneOverSqrtVariance), scaleValue), x.shape); + } + }; + const derMean = () => { + let meanDer = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(oneOverSqrtVariance, Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_6__["scalar"])(-1)), dyTimesScaleValue); + if (mean.rank === 1) { + meanDer = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(meanDer, reductionAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(meanDer, mean.shape); + }; + const derVariance = () => { + let varianceDer = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(minusHalfRCube, xMinusMean), dyTimesScaleValue); + if (mean.rank === 1) { + varianceDer = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(varianceDer, reductionAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(varianceDer, mean.shape); + }; + const derScale = () => { + const xMinusMean2TimesRsqrt = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(xMinusMean, oneOverSqrtVariance); + let scaleDer = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, xMinusMean2TimesRsqrt); + if (mean.rank === 1) { + scaleDer = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(scaleDer, reductionAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(scaleDer, mean.shape); + }; + const derOffset = () => { + let offsetDer = dy; + if (mean.rank === 1) { + offsetDer = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_8__["sum"])(offsetDer, reductionAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(offsetDer, mean.shape); + }; + return { + x: derX, + mean: derMean, + variance: derVariance, + scale: derScale, + offset: derOffset + }; + } +}; +//# sourceMappingURL=FusedBatchNorm_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/GatherV2_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/GatherV2_grad.js ***! + \****************************************************************************/ +/*! exports provided: gatherGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gatherGradConfig", function() { return gatherGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_axis_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_transpose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/* harmony import */ var _ops_unsorted_segment_sum__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/unsorted_segment_sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +const gatherGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["GatherV2"], + inputsToSave: ['x', 'indices'], + gradFunc: (dy, saved, attrs) => { + const [x, indices] = saved; + const { axis } = attrs; + const parsedAxis = Object(_util__WEBPACK_IMPORTED_MODULE_5__["parseAxisParam"])(axis, x.shape)[0]; + const derX = () => { + const paramsShape = x.shape; + const indicesSize = indices.size; + const outerShape = paramsShape.slice(0, parsedAxis); + const outerDims = outerShape.length; + const innerShape = paramsShape.slice(axis, paramsShape.length).slice(1); + const innerDims = innerShape.length; + const outerAxesIndices = arrayRange(0, outerDims); + const innerAxesIndices = arrayRange(outerDims + 1, outerDims + 1 + innerDims); + const valuesShape = arrayConcat([outerShape, [indicesSize], innerShape]); + const values = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])(dy, valuesShape); + const reshapedIndices = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_2__["reshape"])(indices, [indicesSize]); + const transposeDims = arrayConcat([[outerDims], outerAxesIndices, innerAxesIndices]); + const valuesTranspose = Object(_ops_transpose__WEBPACK_IMPORTED_MODULE_3__["transpose"])(values, transposeDims); + let paramsGrad = Object(_ops_unsorted_segment_sum__WEBPACK_IMPORTED_MODULE_4__["unsortedSegmentSum"])(valuesTranspose, reshapedIndices, x.shape[parsedAxis]); + const invertTransposeDims = Object(_ops_axis_util__WEBPACK_IMPORTED_MODULE_1__["getUndoAxesPermutation"])(transposeDims); + paramsGrad = Object(_ops_transpose__WEBPACK_IMPORTED_MODULE_3__["transpose"])(paramsGrad, invertTransposeDims); + return paramsGrad; + }; + return { x: derX, indices: () => indices }; + } +}; +function arrayRange(start, stop) { + const result = []; + for (let i = start; i < stop; ++i) { + result.push(i); + } + return result; +} +function arrayConcat(arrays) { + const result = []; + for (let i = 0; i < arrays.length; ++i) { + for (let j = 0; j < arrays[i].length; ++j) { + result.push(arrays[i][j]); + } + } + return result; +} +//# sourceMappingURL=GatherV2_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/GreaterEqual_grad.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/GreaterEqual_grad.js ***! + \********************************************************************************/ +/*! exports provided: greaterEqualGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "greaterEqualGradConfig", function() { return greaterEqualGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const greaterEqualGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["GreaterEqual"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + return { a: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(a), b: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(b) }; + } +}; +//# sourceMappingURL=GreaterEqual_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Identity_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Identity_grad.js ***! + \****************************************************************************/ +/*! exports provided: identityGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identityGradConfig", function() { return identityGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const identityGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Identity"], + gradFunc: (dy) => { + return { x: () => Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(dy, 'float32') }; + } +}; +//# sourceMappingURL=Identity_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/IsFinite_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/IsFinite_grad.js ***! + \****************************************************************************/ +/*! exports provided: isFiniteGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFiniteGradConfig", function() { return isFiniteGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const isFiniteGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["IsFinite"], + gradFunc: (dy) => { + // TODO(nsthorat): Let gradients be null for cases where we want to stop + // backpropgation. + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=IsFinite_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/IsInf_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/IsInf_grad.js ***! + \*************************************************************************/ +/*! exports provided: isInfGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInfGradConfig", function() { return isInfGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const isInfGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["IsInf"], + gradFunc: (dy) => { + // TODO(nsthorat): Let gradients be null for cases where we want to stop + // backpropgation. + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=IsInf_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/IsNan_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/IsNan_grad.js ***! + \*************************************************************************/ +/*! exports provided: isNanGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNanGradConfig", function() { return isNanGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const isNanGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["IsNan"], + gradFunc: (dy) => { + // TODO(nsthorat): Let gradients be null for cases where we want to stop + // backpropgation. + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=IsNan_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/LRN_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/LRN_grad.js ***! + \***********************************************************************/ +/*! exports provided: lrnGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lrnGradConfig", function() { return lrnGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_local_response_normalization_backprop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/local_response_normalization_backprop */ "./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization_backprop.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const lrnGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["LRN"], + inputsToSave: ['x'], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const [x, y] = saved; + const { depthRadius, bias, alpha, beta } = attrs; + return { + x: () => Object(_ops_local_response_normalization_backprop__WEBPACK_IMPORTED_MODULE_1__["localResponseNormalizationBackprop"])(x, y, dy, depthRadius, bias, alpha, beta) + }; + } +}; +//# sourceMappingURL=LRN_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Log1p_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Log1p_grad.js ***! + \*************************************************************************/ +/*! exports provided: log1pGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log1pGradConfig", function() { return log1pGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const log1pGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Log1p"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(x, 1)) }; + } +}; +//# sourceMappingURL=Log1p_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/LogSoftmax_grad.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/LogSoftmax_grad.js ***! + \******************************************************************************/ +/*! exports provided: logSoftmaxGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logSoftmaxGradConfig", function() { return logSoftmaxGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_exp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/exp */ "./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const logSoftmaxGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["LogSoftmax"], + inputsToSave: [], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const [value] = saved; + const { axis } = attrs; + return { + logits: () => { + const keepDims = true; + const softmax = Object(_ops_exp__WEBPACK_IMPORTED_MODULE_1__["exp"])(value); + return Object(_ops_sub__WEBPACK_IMPORTED_MODULE_3__["sub"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_4__["sum"])(dy, axis, keepDims), softmax)); + } + }; + } +}; +//# sourceMappingURL=LogSoftmax_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Log_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Log_grad.js ***! + \***********************************************************************/ +/*! exports provided: logGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logGradConfig", function() { return logGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const logGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Log"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')) }; + } +}; +//# sourceMappingURL=Log_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool3D_grad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool3D_grad.js ***! + \*****************************************************************************/ +/*! exports provided: maxPool3DGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPool3DGradConfig", function() { return maxPool3DGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_max_pool_3d_backprop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/max_pool_3d_backprop */ "./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d_backprop.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const maxPool3DGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["MaxPool3D"], + inputsToSave: ['x'], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const [x, y] = saved; + const { filterSize, strides, dilations, pad, dimRoundingMode } = attrs; + const $dilations = dilations == null ? [1, 1, 1] : dilations; + return { + x: () => Object(_ops_max_pool_3d_backprop__WEBPACK_IMPORTED_MODULE_1__["maxPool3dBackprop"])(dy, x, y, filterSize, strides, $dilations, pad, dimRoundingMode) + }; + } +}; +//# sourceMappingURL=MaxPool3D_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool_grad.js ***! + \***************************************************************************/ +/*! exports provided: maxPoolGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxPoolGradConfig", function() { return maxPoolGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_max_pool_backprop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/max_pool_backprop */ "./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_backprop.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const maxPoolGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["MaxPool"], + inputsToSave: ['x'], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const [x, y] = saved; + const { filterSize, strides, pad } = attrs; + return { + x: () => Object(_ops_max_pool_backprop__WEBPACK_IMPORTED_MODULE_1__["maxPoolBackprop"])(dy, x, y, filterSize, strides, pad) + }; + } +}; +//# sourceMappingURL=MaxPool_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Max_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Max_grad.js ***! + \***********************************************************************/ +/*! exports provided: maxGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maxGradConfig", function() { return maxGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _min_max_grad_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./min_max_grad_util */ "./node_modules/@tensorflow/tfjs-core/dist/gradients/min_max_grad_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const maxGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Max"], + inputsToSave: ['x'], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const maxAttrs = attrs; + const { reductionIndices } = maxAttrs; + const x = saved[0]; + const y = saved[1]; + const origAxes = _util__WEBPACK_IMPORTED_MODULE_1__["parseAxisParam"](reductionIndices, x.shape); + const maxGrad = Object(_min_max_grad_util__WEBPACK_IMPORTED_MODULE_2__["gradForMinAndMax"])(dy, y, x, origAxes); + return { + x: () => { + return maxGrad['x'](); + } + }; + } +}; +//# sourceMappingURL=Max_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Maximum_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Maximum_grad.js ***! + \***************************************************************************/ +/*! exports provided: maximumGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maximumGradConfig", function() { return maximumGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_greater_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/greater_equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js"); +/* harmony import */ var _ops_less__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/less */ "./node_modules/@tensorflow/tfjs-core/dist/ops/less.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const maximumGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Maximum"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const derA = () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_greater_equal__WEBPACK_IMPORTED_MODULE_2__["greaterEqual"])(a, b), 'float32')); + const derB = () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_less__WEBPACK_IMPORTED_MODULE_3__["less"])(a, b), 'float32')); + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Maximum_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Min_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Min_grad.js ***! + \***********************************************************************/ +/*! exports provided: minGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minGradConfig", function() { return minGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _min_max_grad_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./min_max_grad_util */ "./node_modules/@tensorflow/tfjs-core/dist/gradients/min_max_grad_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const minGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Min"], + inputsToSave: ['x'], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const minAttrs = attrs; + const { axis } = minAttrs; + const [x, y] = saved; + const origAxes = _util__WEBPACK_IMPORTED_MODULE_1__["parseAxisParam"](axis, x.shape); + const minGrad = Object(_min_max_grad_util__WEBPACK_IMPORTED_MODULE_2__["gradForMinAndMax"])(dy, y, x, origAxes); + return { + x: () => { + return minGrad['x'](); + } + }; + } +}; +//# sourceMappingURL=Min_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Minimum_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Minimum_grad.js ***! + \***************************************************************************/ +/*! exports provided: minimumGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumGradConfig", function() { return minimumGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_greater__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/greater */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"); +/* harmony import */ var _ops_less_equal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/less_equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const minimumGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Minimum"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const derA = () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_less_equal__WEBPACK_IMPORTED_MODULE_3__["lessEqual"])(a, b), 'float32')); + const derB = () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_greater__WEBPACK_IMPORTED_MODULE_2__["greater"])(a, b), 'float32')); + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Minimum_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/MirrorPad_grad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/MirrorPad_grad.js ***! + \*****************************************************************************/ +/*! exports provided: mirrorPadGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mirrorPadGradConfig", function() { return mirrorPadGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/slice */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const mirrorPadGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["MirrorPad"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + // Pad introduces values around the original tensor, so the gradient + // slices the original shape out of the gradient. + const x = saved[0]; + const { paddings } = attrs; + const begin = paddings.map(p => p[0]); + return { x: () => Object(_ops_slice__WEBPACK_IMPORTED_MODULE_1__["slice"])(dy, begin, x.shape) }; + } +}; +//# sourceMappingURL=MirrorPad_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Mod_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Mod_grad.js ***! + \***********************************************************************/ +/*! exports provided: modGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modGradConfig", function() { return modGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_floor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/floor */ "./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +const modGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Mod"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"])(a.shape, b.shape); + const derA = () => { + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(a.shape, outShape); + if (reduceAxes.length > 0) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_7__["sum"])(dy, reduceAxes), a.shape); + } + return dy; + }; + const derB = () => { + const res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, Object(_ops_neg__WEBPACK_IMPORTED_MODULE_5__["neg"])(Object(_ops_floor__WEBPACK_IMPORTED_MODULE_3__["floor"])(Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(a, b)))); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(b.shape, outShape); + if (reduceAxes.length > 0) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_7__["sum"])(res, reduceAxes), b.shape); + } + return res; + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Mod_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Multiply_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Multiply_grad.js ***! + \****************************************************************************/ +/*! exports provided: multiplyGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiplyGradConfig", function() { return multiplyGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +const multiplyGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Multiply"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"])(a.shape, b.shape); + const derA = () => { + const res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(b, 'float32')); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(a.shape, outShape); + if (reduceAxes.length > 0) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_5__["sum"])(res, reduceAxes), a.shape); + } + return res; + }; + const derB = () => { + const res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(a, 'float32')); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(b.shape, outShape); + if (reduceAxes.length > 0) { + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_5__["sum"])(res, reduceAxes), b.shape); + } + return res; + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Multiply_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Negate_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Negate_grad.js ***! + \**************************************************************************/ +/*! exports provided: negateGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "negateGradConfig", function() { return negateGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const negateGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Negate"], + gradFunc: (dy) => { + return { x: () => Object(_ops_neg__WEBPACK_IMPORTED_MODULE_1__["neg"])(dy) }; + } +}; +//# sourceMappingURL=Negate_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/OneHot_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/OneHot_grad.js ***! + \**************************************************************************/ +/*! exports provided: oneHotGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "oneHotGradConfig", function() { return oneHotGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const oneHotGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["OneHot"], + inputsToSave: ['indices'], + gradFunc: (dy, saved) => { + const indices = saved[0]; + return { indices: () => Object(_ops_zeros__WEBPACK_IMPORTED_MODULE_1__["zeros"])(indices.shape, 'float32') }; + } +}; +//# sourceMappingURL=OneHot_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/OnesLike_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/OnesLike_grad.js ***! + \****************************************************************************/ +/*! exports provided: onesLikeGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onesLikeGradConfig", function() { return onesLikeGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const onesLikeGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["OnesLike"], + gradFunc: (dy) => { + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=OnesLike_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/PadV2_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/PadV2_grad.js ***! + \*************************************************************************/ +/*! exports provided: padV2GradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "padV2GradConfig", function() { return padV2GradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/slice */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const padV2GradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["PadV2"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + // Pad introduces values around the original tensor, so the gradient + // slices the original shape out of the gradient. + const x = saved[0]; + const { paddings } = attrs; + const begin = paddings.map(p => p[0]); + return { x: () => Object(_ops_slice__WEBPACK_IMPORTED_MODULE_1__["slice"])(dy, begin, x.shape) }; + } +}; +//# sourceMappingURL=PadV2_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Pow_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Pow_grad.js ***! + \***********************************************************************/ +/*! exports provided: powGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "powGradConfig", function() { return powGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_greater__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/greater */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"); +/* harmony import */ var _ops_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/log */ "./node_modules/@tensorflow/tfjs-core/dist/ops/log.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_pow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/pow */ "./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/* harmony import */ var _ops_where__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../ops/where */ "./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + + + + +const powGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Pow"], + inputsToSave: ['a', 'b'], + outputsToSave: [true], + gradFunc: (dy, saved) => { + const [a, b, y] = saved; + const base = a; + const exp = b; + const outShape = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"](base.shape, exp.shape); + const derBase = () => { + const expFloat = Object(_ops_cast__WEBPACK_IMPORTED_MODULE_2__["cast"])(exp, 'float32'); + let res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_5__["mul"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_5__["mul"])(expFloat, Object(_ops_pow__WEBPACK_IMPORTED_MODULE_6__["pow"])(base, Object(_ops_sub__WEBPACK_IMPORTED_MODULE_9__["sub"])(expFloat, Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_8__["scalar"])(1))))); + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](base.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_10__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_7__["reshape"])(res, base.shape); + }; + const derExp = () => { + const condition = Object(_ops_greater__WEBPACK_IMPORTED_MODULE_3__["greater"])(base, 0); + const logBase = Object(_ops_where__WEBPACK_IMPORTED_MODULE_11__["where"])(condition, Object(_ops_log__WEBPACK_IMPORTED_MODULE_4__["log"])(base), Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_12__["zerosLike"])(base)); + let res = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_5__["mul"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_5__["mul"])(y, logBase)); + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](exp.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_10__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_7__["reshape"])(res, exp.shape); + }; + return { a: derBase, b: derExp }; + } +}; +//# sourceMappingURL=Pow_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Prelu_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Prelu_grad.js ***! + \*************************************************************************/ +/*! exports provided: preluGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "preluGradConfig", function() { return preluGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_greater__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/greater */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/* harmony import */ var _ops_where__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/where */ "./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +const preluGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Prelu"], + inputsToSave: ['x', 'alpha'], + gradFunc: (dy, saved) => { + const [x, alpha] = saved; + const mask = Object(_ops_greater__WEBPACK_IMPORTED_MODULE_2__["greater"])(x, 0); + return { + x: () => Object(_ops_where__WEBPACK_IMPORTED_MODULE_6__["where"])(mask, dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, alpha)), + alpha: () => { + let res = Object(_ops_where__WEBPACK_IMPORTED_MODULE_6__["where"])(mask, Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_7__["zerosLike"])(dy), Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, x)); + const reduceAxes = Object(_ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"])(alpha.shape, dy.shape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_5__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(res, alpha.shape); + } + }; + } +}; +//# sourceMappingURL=Prelu_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Reciprocal_grad.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Reciprocal_grad.js ***! + \******************************************************************************/ +/*! exports provided: reciprocalGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reciprocalGradConfig", function() { return reciprocalGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const reciprocalGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Reciprocal"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_1__["div"])(dy, Object(_ops_neg__WEBPACK_IMPORTED_MODULE_2__["neg"])(Object(_ops_square__WEBPACK_IMPORTED_MODULE_3__["square"])(x))) }; + } +}; +//# sourceMappingURL=Reciprocal_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Relu6_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Relu6_grad.js ***! + \*************************************************************************/ +/*! exports provided: relu6GradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relu6GradConfig", function() { return relu6GradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_less_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/less_equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_step__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/step */ "./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const relu6GradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Relu6"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + const mask = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_less_equal__WEBPACK_IMPORTED_MODULE_2__["lessEqual"])(x, 6), Object(_ops_step__WEBPACK_IMPORTED_MODULE_4__["step"])(x)); + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(mask, 'float32')) }; + } +}; +//# sourceMappingURL=Relu6_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Relu_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Relu_grad.js ***! + \************************************************************************/ +/*! exports provided: reluGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reluGradConfig", function() { return reluGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_step__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/step */ "./node_modules/@tensorflow/tfjs-core/dist/ops/step.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const reluGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Relu"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_step__WEBPACK_IMPORTED_MODULE_3__["step"])(x), 'float32')) }; + } +}; +//# sourceMappingURL=Relu_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Reshape_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Reshape_grad.js ***! + \***************************************************************************/ +/*! exports provided: reshapeGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshapeGradConfig", function() { return reshapeGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const reshapeGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Reshape"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_1__["reshape"])(dy, x.shape) }; + } +}; +//# sourceMappingURL=Reshape_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeBilinear_grad.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeBilinear_grad.js ***! + \**********************************************************************************/ +/*! exports provided: resizeBilinearGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resizeBilinearGradConfig", function() { return resizeBilinearGradConfig; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const resizeBilinearGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_1__["ResizeBilinear"], + inputsToSave: ['images'], + gradFunc: (dy, saved, attrs) => { + const [images] = saved; + const backPropKernelFunc = (backend) => { + const { alignCorners } = attrs; + return backend.resizeBilinearBackprop(dy, images, alignCorners); + }; + const inputs = { images }; + const imagesDer = () => _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(backPropKernelFunc, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["ResizeBilinearGrad"], attrs); + return { images: imagesDer }; + } +}; +//# sourceMappingURL=ResizeBilinear_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeNearestNeighbor_grad.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeNearestNeighbor_grad.js ***! + \*****************************************************************************************/ +/*! exports provided: resizeNearestNeighborGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resizeNearestNeighborGradConfig", function() { return resizeNearestNeighborGradConfig; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const resizeNearestNeighborGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_1__["ResizeNearestNeighbor"], + inputsToSave: ['images'], + gradFunc: (dy, saved, attrs) => { + const [images] = saved; + const backPropKernelFunc = (backend) => { + const { alignCorners } = attrs; + return backend.resizeNearestNeighborBackprop(dy, images, alignCorners); + }; + const inputs = { images }; + const imagesDer = () => _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(backPropKernelFunc, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["ResizeNearestNeighborGrad"], attrs); + return { images: imagesDer }; + } +}; +//# sourceMappingURL=ResizeNearestNeighbor_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Reverse_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Reverse_grad.js ***! + \***************************************************************************/ +/*! exports provided: reverseGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reverseGradConfig", function() { return reverseGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_reverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/reverse */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const reverseGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Reverse"], + gradFunc: (dy, saved, attrs) => { + const { dims } = attrs; + const axes = Object(_util__WEBPACK_IMPORTED_MODULE_2__["parseAxisParam"])(dims, dy.shape); + return { x: () => Object(_ops_reverse__WEBPACK_IMPORTED_MODULE_1__["reverse"])(dy, axes) }; + } +}; +//# sourceMappingURL=Reverse_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Round_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Round_grad.js ***! + \*************************************************************************/ +/*! exports provided: roundGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "roundGradConfig", function() { return roundGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const roundGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Round"], + gradFunc: (dy) => { + // TODO(nsthorat): Let gradients be null for cases where we want to stop + // backpropgation. + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=Round_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Rsqrt_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Rsqrt_grad.js ***! + \*************************************************************************/ +/*! exports provided: rsqrtGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rsqrtGradConfig", function() { return rsqrtGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_pow__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/pow */ "./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const rsqrtGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Rsqrt"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_neg__WEBPACK_IMPORTED_MODULE_3__["neg"])(Object(_ops_div__WEBPACK_IMPORTED_MODULE_1__["div"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(Object(_ops_pow__WEBPACK_IMPORTED_MODULE_4__["pow"])(x, 1.5), 2))) }; + } +}; +//# sourceMappingURL=Rsqrt_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/SelectV2_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/SelectV2_grad.js ***! + \****************************************************************************/ +/*! exports provided: selectV2PoolGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "selectV2PoolGradConfig", function() { return selectV2PoolGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_logical_not__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/logical_not */ "./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const selectV2PoolGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["SelectV2"], + inputsToSave: ['condition'], + gradFunc: (dy, saved) => { + const [condition] = saved; + return { + // TODO(julianoks): Return null for condition gradient + // when backprop supports it. + condition: () => Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_4__["zerosLike"])(condition), 'float32'), + t: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(condition, dy.dtype)), + e: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_logical_not__WEBPACK_IMPORTED_MODULE_2__["logicalNot"])(condition), dy.dtype)) + }; + } +}; +//# sourceMappingURL=SelectV2_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Selu_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Selu_grad.js ***! + \************************************************************************/ +/*! exports provided: seluGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "seluGradConfig", function() { return seluGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_exp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/exp */ "./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js"); +/* harmony import */ var _ops_greater__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/greater */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_selu_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/selu_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js"); +/* harmony import */ var _ops_where__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/where */ "./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +const seluGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Selu"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { + x: () => { + const mask = Object(_ops_greater__WEBPACK_IMPORTED_MODULE_3__["greater"])(x, Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_5__["scalar"])(0)); + const scaleAlpha = Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_5__["scalar"])(_ops_selu_util__WEBPACK_IMPORTED_MODULE_6__["SELU_SCALEALPHA"]); + const scale = Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_5__["scalar"])(_ops_selu_util__WEBPACK_IMPORTED_MODULE_6__["SELU_SCALE"]); + const greaterThanZeroDer = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, scale); + const lessEqualZeroDer = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(Object(_ops_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(dy, scaleAlpha), Object(_ops_exp__WEBPACK_IMPORTED_MODULE_2__["exp"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32'))); + return Object(_ops_where__WEBPACK_IMPORTED_MODULE_7__["where"])(mask, greaterThanZeroDer, lessEqualZeroDer); + } + }; + } +}; +//# sourceMappingURL=Selu_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sigmoid_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sigmoid_grad.js ***! + \***************************************************************************/ +/*! exports provided: sigmoidGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sigmoidGradConfig", function() { return sigmoidGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const sigmoidGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sigmoid"], + outputsToSave: [true], + gradFunc: (dy, saved) => { + const [y] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(y, Object(_ops_sub__WEBPACK_IMPORTED_MODULE_3__["sub"])(Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_2__["scalar"])(1), y))) }; + } +}; +//# sourceMappingURL=Sigmoid_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sign_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sign_grad.js ***! + \************************************************************************/ +/*! exports provided: signGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "signGradConfig", function() { return signGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const signGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sign"], + gradFunc: (dy) => { + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=Sign_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sin_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sin_grad.js ***! + \***********************************************************************/ +/*! exports provided: sinGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinGradConfig", function() { return sinGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_cos__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cos */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const sinGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sin"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_cos__WEBPACK_IMPORTED_MODULE_2__["cos"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')), dy) }; + } +}; +//# sourceMappingURL=Sin_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sinh_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sinh_grad.js ***! + \************************************************************************/ +/*! exports provided: sinhGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinhGradConfig", function() { return sinhGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_cosh__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/cosh */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const sinhGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sinh"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_cosh__WEBPACK_IMPORTED_MODULE_2__["cosh"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')), dy) }; + } +}; +//# sourceMappingURL=Sinh_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Slice_grad.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Slice_grad.js ***! + \*************************************************************************/ +/*! exports provided: sliceGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sliceGradConfig", function() { return sliceGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_pad__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/pad */ "./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js"); +/* harmony import */ var _ops_slice_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/slice_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const sliceGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Slice"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const { begin, size } = attrs; + const inputShape = x.shape; + const [begin_, size_] = Object(_ops_slice_util__WEBPACK_IMPORTED_MODULE_2__["parseSliceParams"])(x, begin, size); + // Create an Nx2 padding where the first column represents how many + // zeros are prepended (at start) for each dimension, and the second + // column indicates how many zeros are appended (at end). + // The number of zeros to append is the shape of the input + // elementwise-subtracted by both the begin vector and sizes vector. + const paddings = []; + for (let i = 0; i < dy.rank; i++) { + paddings.push([begin_[i], inputShape[i] - begin_[i] - size_[i]]); + } + return { x: () => Object(_ops_pad__WEBPACK_IMPORTED_MODULE_1__["pad"])(dy, paddings) }; + } +}; +//# sourceMappingURL=Slice_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Softmax_grad.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Softmax_grad.js ***! + \***************************************************************************/ +/*! exports provided: softmaxGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "softmaxGradConfig", function() { return softmaxGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const softmaxGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Softmax"], + outputsToSave: [true], + gradFunc: (dy, saved, attrs) => { + const [y] = saved; + const { dim } = attrs; + const keepDims = true; + const dyTimesY = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(dy, y); + return { + logits: () => Object(_ops_sub__WEBPACK_IMPORTED_MODULE_2__["sub"])(dyTimesY, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(Object(_ops_sum__WEBPACK_IMPORTED_MODULE_3__["sum"])(dyTimesY, [dim], keepDims), y)) + }; + } +}; +//# sourceMappingURL=Softmax_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Softplus_grad.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Softplus_grad.js ***! + \****************************************************************************/ +/*! exports provided: softplusGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "softplusGradConfig", function() { return softplusGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_sigmoid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/sigmoid */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const softplusGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Softplus"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(dy, Object(_ops_sigmoid__WEBPACK_IMPORTED_MODULE_2__["sigmoid"])(x)) }; + } +}; +//# sourceMappingURL=Softplus_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/SpaceToBatchND_grad.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/SpaceToBatchND_grad.js ***! + \**********************************************************************************/ +/*! exports provided: spaceToBatchNDGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spaceToBatchNDGradConfig", function() { return spaceToBatchNDGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_batch_to_space_nd__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/batch_to_space_nd */ "./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const spaceToBatchNDGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["SpaceToBatchND"], + gradFunc: (dy, saved, attrs) => { + const { blockShape, paddings } = attrs; + return { x: () => Object(_ops_batch_to_space_nd__WEBPACK_IMPORTED_MODULE_1__["batchToSpaceND"])(dy, blockShape, paddings) }; + } +}; +//# sourceMappingURL=SpaceToBatchND_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/SplitV_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/SplitV_grad.js ***! + \**************************************************************************/ +/*! exports provided: splitVGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitVGradConfig", function() { return splitVGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_concat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/concat */ "./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const splitVGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["SplitV"], + gradFunc: (dy, saved, attrs) => { + const { axis } = attrs; + return { x: () => Object(_ops_concat__WEBPACK_IMPORTED_MODULE_1__["concat"])(dy, axis) }; + } +}; +//# sourceMappingURL=SplitV_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sqrt_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sqrt_grad.js ***! + \************************************************************************/ +/*! exports provided: sqrtGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrtGradConfig", function() { return sqrtGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_sqrt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sqrt */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const sqrtGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sqrt"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(Object(_ops_sqrt__WEBPACK_IMPORTED_MODULE_4__["sqrt"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32')), 2)) }; + } +}; +//# sourceMappingURL=Sqrt_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Square_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Square_grad.js ***! + \**************************************************************************/ +/*! exports provided: squareGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squareGradConfig", function() { return squareGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const squareGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Square"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_2__["mul"])(Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(x, 'float32'), 2)) }; + } +}; +//# sourceMappingURL=Square_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/SquaredDifference_grad.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/SquaredDifference_grad.js ***! + \*************************************************************************************/ +/*! exports provided: squaredDifferenceGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceGradConfig", function() { return squaredDifferenceGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const squaredDifferenceGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["SquaredDifference"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const two = Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_2__["scalar"])(2); + const derA = () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(two, Object(_ops_sub__WEBPACK_IMPORTED_MODULE_3__["sub"])(a, b))); + const derB = () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(dy, Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(two, Object(_ops_sub__WEBPACK_IMPORTED_MODULE_3__["sub"])(b, a))); + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=SquaredDifference_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Step_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Step_grad.js ***! + \************************************************************************/ +/*! exports provided: stepGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stepGradConfig", function() { return stepGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const stepGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Step"], + gradFunc: (dy) => { + // TODO(manrajgrover): Return null for gradients when backprop supports + // it. + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=Step_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sub_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sub_grad.js ***! + \***********************************************************************/ +/*! exports provided: subGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subGradConfig", function() { return subGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/broadcast_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js"); +/* harmony import */ var _ops_neg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/neg */ "./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _ops_sum__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const subGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sub"], + inputsToSave: ['a', 'b'], + gradFunc: (dy, saved) => { + const [a, b] = saved; + const outShape = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["assertAndGetBroadcastShape"](a.shape, b.shape); + const derA = () => { + let res = dy; + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](a.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_4__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])(res, a.shape); + }; + const derB = () => { + let res = dy; + const reduceAxes = _ops_broadcast_util__WEBPACK_IMPORTED_MODULE_1__["getReductionAxes"](b.shape, outShape); + if (reduceAxes.length > 0) { + res = Object(_ops_sum__WEBPACK_IMPORTED_MODULE_4__["sum"])(res, reduceAxes); + } + return Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])(Object(_ops_neg__WEBPACK_IMPORTED_MODULE_2__["neg"])(res), b.shape); + }; + return { a: derA, b: derB }; + } +}; +//# sourceMappingURL=Sub_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Sum_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Sum_grad.js ***! + \***********************************************************************/ +/*! exports provided: sumGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sumGradConfig", function() { return sumGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_ones__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/ones */ "./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const sumGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Sum"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const expandedDyShape = x.shape.slice(); + const { axis } = attrs; + const axes = Object(_util__WEBPACK_IMPORTED_MODULE_4__["parseAxisParam"])(axis, x.shape); + axes.forEach(axis => { + expandedDyShape[axis] = 1; + }); + const expandedDy = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])(dy, expandedDyShape); + const derX = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(expandedDy, Object(_ops_ones__WEBPACK_IMPORTED_MODULE_2__["ones"])(x.shape, 'float32')); + return { x: () => derX }; + } +}; +//# sourceMappingURL=Sum_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Tan_grad.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Tan_grad.js ***! + \***********************************************************************/ +/*! exports provided: tanGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanGradConfig", function() { return tanGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_cos__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cos */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js"); +/* harmony import */ var _ops_div__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const tanGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Tan"], + inputsToSave: ['x'], + gradFunc: (dy, saved) => { + const [x] = saved; + return { x: () => Object(_ops_div__WEBPACK_IMPORTED_MODULE_2__["div"])(dy, Object(_ops_square__WEBPACK_IMPORTED_MODULE_3__["square"])(Object(_ops_cos__WEBPACK_IMPORTED_MODULE_1__["cos"])(x))) }; + } +}; +//# sourceMappingURL=Tan_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Tanh_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Tanh_grad.js ***! + \************************************************************************/ +/*! exports provided: tanhGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tanhGradConfig", function() { return tanhGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_square__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/square */ "./node_modules/@tensorflow/tfjs-core/dist/ops/square.js"); +/* harmony import */ var _ops_sub__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const tanhGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Tanh"], + outputsToSave: [true], + gradFunc: (dy, saved) => { + const [y] = saved; + return { x: () => Object(_ops_mul__WEBPACK_IMPORTED_MODULE_1__["mul"])(Object(_ops_sub__WEBPACK_IMPORTED_MODULE_4__["sub"])(Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_2__["scalar"])(1), Object(_ops_square__WEBPACK_IMPORTED_MODULE_3__["square"])(y)), dy) }; + } +}; +//# sourceMappingURL=Tanh_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Tile_grad.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Tile_grad.js ***! + \************************************************************************/ +/*! exports provided: tileGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tileGradConfig", function() { return tileGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _ops_slice__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/slice */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const tileGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Tile"], + inputsToSave: ['x'], + gradFunc: (dy, saved, attrs) => { + const [x] = saved; + const { reps } = attrs; + const derX = () => { + let xGrad = Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_3__["zerosLike"])(x); + // TODO(cais): Maybe reduce memory footprint by avoiding repeated + // slicing. + if (x.rank === 1) { + for (let i = 0; i < reps[0]; ++i) { + xGrad = Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(xGrad, Object(_ops_slice__WEBPACK_IMPORTED_MODULE_2__["slice"])(dy, [i * x.shape[0]], [x.shape[0]])); + } + } + else if (x.rank === 2) { + for (let i = 0; i < reps[0]; ++i) { + for (let j = 0; j < reps[1]; ++j) { + xGrad = Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(xGrad, Object(_ops_slice__WEBPACK_IMPORTED_MODULE_2__["slice"])(dy, [i * x.shape[0], j * x.shape[1]], [ + x.shape[0], x.shape[1] + ])); + } + } + } + else if (x.rank === 3) { + for (let i = 0; i < reps[0]; ++i) { + for (let j = 0; j < reps[1]; ++j) { + for (let k = 0; k < reps[2]; ++k) { + xGrad = + Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(xGrad, Object(_ops_slice__WEBPACK_IMPORTED_MODULE_2__["slice"])(dy, [i * x.shape[0], j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]])); + } + } + } + } + else if (x.rank === 4) { + for (let i = 0; i < reps[0]; ++i) { + for (let j = 0; j < reps[1]; ++j) { + for (let k = 0; k < reps[2]; ++k) { + for (let l = 0; l < reps[3]; ++l) { + xGrad = + Object(_ops_add__WEBPACK_IMPORTED_MODULE_1__["add"])(xGrad, Object(_ops_slice__WEBPACK_IMPORTED_MODULE_2__["slice"])(dy, [ + i * x.shape[0], j * x.shape[1], k * x.shape[2], + l * x.shape[3] + ], [x.shape[0], x.shape[1], x.shape[2], x.shape[3]])); + } + } + } + } + } + else { + throw new Error(`Gradient for tile operation is not implemented for rank-` + + `${x.rank} tensors yet.`); + } + return xGrad; + }; + return { x: derX }; + }, +}; +//# sourceMappingURL=Tile_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Transpose_grad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Transpose_grad.js ***! + \*****************************************************************************/ +/*! exports provided: transposeGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transposeGradConfig", function() { return transposeGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_axis_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _ops_transpose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + +const transposeGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Transpose"], + gradFunc: (dy, saved, attrs) => { + const transposeAttrs = attrs; + const { perm } = transposeAttrs; + const undoPerm = _ops_axis_util__WEBPACK_IMPORTED_MODULE_1__["getUndoAxesPermutation"](perm); + return { x: () => Object(_ops_transpose__WEBPACK_IMPORTED_MODULE_2__["transpose"])(dy, undoPerm) }; + } +}; +//# sourceMappingURL=Transpose_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/Unpack_grad.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/Unpack_grad.js ***! + \**************************************************************************/ +/*! exports provided: unpackGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unpackGradConfig", function() { return unpackGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_stack__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/stack */ "./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const unpackGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["Unpack"], + gradFunc: (dy, saved, attrs) => { + const unpackAttrs = attrs; + const { axis } = unpackAttrs; + return { value: () => Object(_ops_stack__WEBPACK_IMPORTED_MODULE_1__["stack"])(dy, axis) }; + } +}; +//# sourceMappingURL=Unpack_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/UnsortedSegmentSum_grad.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/UnsortedSegmentSum_grad.js ***! + \**************************************************************************************/ +/*! exports provided: unsortedSegmentSumGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unsortedSegmentSumGradConfig", function() { return unsortedSegmentSumGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_expand_dims__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/expand_dims */ "./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js"); +/* harmony import */ var _ops_gather__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/gather */ "./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js"); +/* harmony import */ var _ops_greater_equal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/greater_equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js"); +/* harmony import */ var _ops_logical_and__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/logical_and */ "./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js"); +/* harmony import */ var _ops_maximum__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ops/maximum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js"); +/* harmony import */ var _ops_ones__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ops/ones */ "./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js"); +/* harmony import */ var _ops_scalar__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../ops/scalar */ "./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js"); +/* harmony import */ var _ops_where__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../ops/where */ "./node_modules/@tensorflow/tfjs-core/dist/ops/where.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + +const unsortedSegmentSumGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["UnsortedSegmentSum"], + inputsToSave: ['segmentIds'], + gradFunc: (dy, saved) => { + const [segmentIds] = saved; + const derX = () => { + return gatherDropNegatives(dy, segmentIds); + }; + return { x: derX }; + } +}; +function gatherDropNegatives(x, indices) { + // Helper function for unsorted segment ops. Gathers params for + // positive segment ids and gathers 0 for inputs with negative segment id. + // Mirrors _GatherDropNegatives from tensorflow/python/ops/math_grad.py + const zeroClippedIndices = Object(_ops_maximum__WEBPACK_IMPORTED_MODULE_5__["maximum"])(indices, Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_9__["zerosLike"])(indices)); + const gathered = Object(_ops_gather__WEBPACK_IMPORTED_MODULE_2__["gather"])(x, zeroClippedIndices); + let isPositive = Object(_ops_greater_equal__WEBPACK_IMPORTED_MODULE_3__["greaterEqual"])(indices, Object(_ops_scalar__WEBPACK_IMPORTED_MODULE_7__["scalar"])(0, 'int32')); + const numIters = gathered.rank - isPositive.rank; + for (let i = 0; i < numIters; ++i) { + isPositive = Object(_ops_expand_dims__WEBPACK_IMPORTED_MODULE_1__["expandDims"])(isPositive, i + 1); + } + isPositive = Object(_ops_logical_and__WEBPACK_IMPORTED_MODULE_4__["logicalAnd"])(isPositive, Object(_ops_ones__WEBPACK_IMPORTED_MODULE_6__["ones"])(gathered.shape, 'bool')); + const zeroSlice = Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_9__["zerosLike"])(gathered); + return Object(_ops_where__WEBPACK_IMPORTED_MODULE_8__["where"])(isPositive, gathered, zeroSlice); +} +//# sourceMappingURL=UnsortedSegmentSum_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/ZerosLike_grad.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/ZerosLike_grad.js ***! + \*****************************************************************************/ +/*! exports provided: zerosLikeGradConfig */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zerosLikeGradConfig", function() { return zerosLikeGradConfig; }); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/zeros_like */ "./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const zerosLikeGradConfig = { + kernelName: _kernel_names__WEBPACK_IMPORTED_MODULE_0__["ZerosLike"], + gradFunc: (dy) => { + return { x: () => Object(_ops_zeros_like__WEBPACK_IMPORTED_MODULE_1__["zerosLike"])(dy) }; + } +}; +//# sourceMappingURL=ZerosLike_grad.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/gradients/min_max_grad_util.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/gradients/min_max_grad_util.js ***! + \********************************************************************************/ +/*! exports provided: gradForMinAndMax */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gradForMinAndMax", function() { return gradForMinAndMax; }); +/* harmony import */ var _ops_axis_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _ops_cast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _ops_equal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ops/equal */ "./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js"); +/* harmony import */ var _ops_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ops/mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _ops_reshape__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ops/reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +/** + * Gradient helper function for the min and max operations. + */ +function gradForMinAndMax(dy, y, xOrig, origAxes) { + if (y.rank < xOrig.rank) { + y = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(y, _ops_axis_util__WEBPACK_IMPORTED_MODULE_0__["expandShapeToKeepDim"](y.shape, origAxes)); + } + if (dy.rank < xOrig.rank) { + dy = Object(_ops_reshape__WEBPACK_IMPORTED_MODULE_4__["reshape"])(dy, _ops_axis_util__WEBPACK_IMPORTED_MODULE_0__["expandShapeToKeepDim"](dy.shape, origAxes)); + } + return { + x: () => { + const dx = Object(_ops_mul__WEBPACK_IMPORTED_MODULE_3__["mul"])(dy, Object(_ops_cast__WEBPACK_IMPORTED_MODULE_1__["cast"])(Object(_ops_equal__WEBPACK_IMPORTED_MODULE_2__["equal"])(xOrig, y), dy.dtype)); + return dx; + } + }; +} +//# sourceMappingURL=min_max_grad_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/index.js ***! + \**********************************************************/ +/*! exports provided: AdadeltaOptimizer, AdagradOptimizer, AdamOptimizer, AdamaxOptimizer, MomentumOptimizer, Optimizer, RMSPropOptimizer, SGDOptimizer, Tensor, TensorBuffer, Variable, Rank, sumOutType, upcastType, abs, acos, acosh, add, addN, all, any, argMax, argMin, asin, asinh, atan, atan2, atanh, avgPool, avgPool3d, basicLSTMCell, batchToSpaceND, batchNorm, batchNorm2d, batchNorm3d, batchNorm4d, broadcastTo, buffer, cast, ceil, clipByValue, clone, complex, concat, concat1d, concat2d, concat3d, concat4d, conv1d, conv2d, conv2dTranspose, conv3d, conv3dTranspose, cos, cosh, cumsum, depthToSpace, depthwiseConv2d, diag, dilation2d, div, divNoNan, dot, elu, equal, erf, exp, expandDims, expm1, eye, fill, floor, floorDiv, gather, greater, greaterEqual, imag, isFinite, isInf, isNaN, leakyRelu, less, lessEqual, linspace, localResponseNormalization, log, log1p, logSigmoid, logSoftmax, logSumExp, logicalAnd, logicalNot, logicalOr, logicalXor, matMul, max, maxPool, maxPool3d, maxPoolWithArgmax, maximum, mean, min, minimum, mirrorPad, mod, moments, mul, multiRNNCell, multinomial, neg, notEqual, oneHot, ones, onesLike, outerProduct, pad, pad1d, pad2d, pad3d, pad4d, pool, pow, prelu, print, prod, rand, randomGamma, randomNormal, randomUniform, range, real, reciprocal, relu, relu6, reshape, reverse, reverse1d, reverse2d, reverse3d, reverse4d, round, rsqrt, scalar, selu, separableConv2d, setdiff1dAsync, sigmoid, sign, sin, sinh, slice, slice1d, slice2d, slice3d, slice4d, softmax, softplus, spaceToBatchND, fft, ifft, irfft, rfft, split, sqrt, square, squaredDifference, squeeze, stack, step, stridedSlice, sub, sum, tan, tanh, tensor, tensor1d, tensor2d, tensor3d, tensor4d, tensor5d, tensor6d, tile, topk, truncatedNormal, unique, unsortedSegmentSum, unstack, variable, where, whereAsync, zeros, zerosLike, booleanMaskAsync, equalStrict, greaterEqualStrict, greaterStrict, lessEqualStrict, lessStrict, notEqualStrict, addStrict, divStrict, maximumStrict, minimumStrict, modStrict, mulStrict, powStrict, squaredDifferenceStrict, subStrict, transpose, norm, movingAverage, scatterND, sparseToDense, gatherND, dropout, enclosingPowerOfTwo, cosineWindow, inTopKAsync, op, OP_SCOPE_SUFFIX, image, linalg, losses, spectral, fused, signal, Reduction, train, enableProdMode, enableDebugMode, disableDeprecationWarnings, deprecationWarn, disposeVariables, engine, memory, profile, tidy, dispose, keep, time, setBackend, ready, getBackend, removeBackend, findBackend, findBackendFactory, registerBackend, backend, setPlatform, getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels, customGrad, grad, grads, valueAndGrad, valueAndGrads, variableGrads, Environment, env, ENV, version_core, nextFrame, browser, io, math, serialization, test_util, util, backend_util, tensor_util, slice_util, gather_util, scatter_util, device_util, kernel_impls, KernelBackend, DataStorage, Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolBackprop, AvgPool3D, AvgPool3DBackprop, BatchMatMul, BatchToSpaceND, BroadcastTo, Cast, Ceil, ClipByValue, Complex, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, Div, Elu, EluGrad, Erf, Equal, Exp, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNBackprop, Max, Maximum, MaxPool, MaxPoolBackprop, MaxPool3D, MaxPool3DBackprop, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multiply, Negate, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, SelectV2, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SquaredDifference, Square, Sub, SparseToDense, StridedSlice, Tan, Tanh, Tile, TopK, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _base_side_effects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base_side_effects */ "./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js"); +/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "./node_modules/@tensorflow/tfjs-core/dist/base.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdadeltaOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AdadeltaOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdagradOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AdagradOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdamOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AdamOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AdamaxOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AdamaxOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MomentumOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MomentumOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Optimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Optimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RMSPropOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["RMSPropOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SGDOptimizer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["SGDOptimizer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tensor", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Tensor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TensorBuffer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["TensorBuffer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Variable", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Variable"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Rank", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Rank"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sumOutType", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sumOutType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "upcastType", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["upcastType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["abs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["acos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "acosh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["acosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "add", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["add"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addN", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["addN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "all", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["all"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "any", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["any"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "argMax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["argMax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "argMin", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["argMin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["asin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asinh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["asinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "atan", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["atan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["atan2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "atanh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["atanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "avgPool", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["avgPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "avgPool3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["avgPool3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basicLSTMCell", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["basicLSTMCell"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchToSpaceND", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["batchToSpaceND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["batchNorm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["batchNorm2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["batchNorm3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "batchNorm4d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["batchNorm4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "broadcastTo", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["broadcastTo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["buffer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cast", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["cast"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ceil"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clipByValue", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["clipByValue"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["clone"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "complex", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["complex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["concat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat1d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["concat1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["concat2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["concat3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat4d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["concat4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv1d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["conv1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["conv2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv2dTranspose", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["conv2dTranspose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["conv3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "conv3dTranspose", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["conv3dTranspose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["cos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cosh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["cosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cumsum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["cumsum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "depthToSpace", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["depthToSpace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "depthwiseConv2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["depthwiseConv2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "diag", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["diag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dilation2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["dilation2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "div", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["div"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "divNoNan", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["divNoNan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dot", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["dot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["elu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "equal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["equal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "erf", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["erf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exp", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["exp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expandDims", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["expandDims"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expm1", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["expm1"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eye", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["eye"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["fill"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["floor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "floorDiv", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["floorDiv"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gather", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["gather"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greater", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["greater"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greaterEqual", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["greaterEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imag", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["imag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isFinite", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["isFinite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isInf", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["isInf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNaN", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["isNaN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "leakyRelu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["leakyRelu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "less", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["less"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lessEqual", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["lessEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linspace", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["linspace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "localResponseNormalization", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["localResponseNormalization"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "log", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["log"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "log1p", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["log1p"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logSigmoid", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logSigmoid"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logSoftmax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logSoftmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logSumExp", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logSumExp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalAnd", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logicalAnd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalNot", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logicalNot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalOr", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logicalOr"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logicalXor", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["logicalXor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "matMul", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["matMul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["max"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxPool", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["maxPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxPool3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["maxPool3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maxPoolWithArgmax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["maxPoolWithArgmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maximum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["maximum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mean", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["mean"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["min"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "minimum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["minimum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mirrorPad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["mirrorPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mod", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["mod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moments", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["moments"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mul", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["mul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiRNNCell", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["multiRNNCell"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multinomial", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["multinomial"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "neg", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["neg"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "notEqual", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["notEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "oneHot", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["oneHot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ones", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ones"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onesLike", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["onesLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "outerProduct", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["outerProduct"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad1d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pad1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pad2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pad3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pad4d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pad4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pool", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pow", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["pow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prelu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["prelu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "print", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["print"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prod", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["prod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rand", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["rand"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomGamma", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["randomGamma"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomNormal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["randomNormal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomUniform", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["randomUniform"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["range"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "real", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["real"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reciprocal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reciprocal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["relu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relu6", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["relu6"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reshape", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reshape"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reverse"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse1d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reverse1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reverse2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reverse3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reverse4d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["reverse4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "round", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["round"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rsqrt", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["rsqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scalar", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["scalar"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["selu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "separableConv2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["separableConv2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setdiff1dAsync", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["setdiff1dAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sigmoid", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sigmoid"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sign", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sign"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sinh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["slice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice1d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["slice1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["slice2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["slice3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice4d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["slice4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "softmax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["softmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "softplus", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["softplus"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "spaceToBatchND", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["spaceToBatchND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fft", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["fft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ifft", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ifft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "irfft", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["irfft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rfft", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["rfft"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "split", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["split"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "square", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["square"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squaredDifference", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["squaredDifference"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squeeze", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["squeeze"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stack", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["stack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "step", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["step"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stridedSlice", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["stridedSlice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sub", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sub"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tan", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tanh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor1d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor1d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor2d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor2d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor3d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor3d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor4d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor4d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor5d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor5d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor6d", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor6d"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tile", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tile"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "topk", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["topk"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "truncatedNormal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["truncatedNormal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unique", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["unique"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unsortedSegmentSum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["unsortedSegmentSum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unstack", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["unstack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variable", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["variable"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "where", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["where"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "whereAsync", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["whereAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zeros", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["zeros"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zerosLike", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["zerosLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "booleanMaskAsync", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["booleanMaskAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "equalStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["equalStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greaterEqualStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["greaterEqualStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "greaterStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["greaterStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lessEqualStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["lessEqualStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lessStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["lessStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "notEqualStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["notEqualStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["addStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "divStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["divStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "maximumStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["maximumStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "minimumStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["minimumStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "modStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["modStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mulStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["mulStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "powStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["powStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["squaredDifferenceStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subStrict", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["subStrict"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["transpose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "norm", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["norm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "movingAverage", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["movingAverage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scatterND", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["scatterND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sparseToDense", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["sparseToDense"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gatherND", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["gatherND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dropout", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["dropout"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enclosingPowerOfTwo", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["enclosingPowerOfTwo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cosineWindow", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["cosineWindow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "inTopKAsync", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["inTopKAsync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "op", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["op"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OP_SCOPE_SUFFIX", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["OP_SCOPE_SUFFIX"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "image", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["image"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linalg", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["linalg"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "losses", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["losses"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "spectral", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["spectral"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fused", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["fused"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "signal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["signal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reduction", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Reduction"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "train", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["train"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableProdMode", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["enableProdMode"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableDebugMode", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["enableDebugMode"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disableDeprecationWarnings", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["disableDeprecationWarnings"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "deprecationWarn", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["deprecationWarn"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disposeVariables", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["disposeVariables"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "engine", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["engine"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "memory", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["memory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "profile", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["profile"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tidy", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tidy"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispose", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["dispose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keep", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["keep"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "time", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["time"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["setBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ready", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ready"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["getBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["removeBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["findBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findBackendFactory", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["findBackendFactory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["registerBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "backend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["backend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setPlatform", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["setPlatform"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getKernel", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["getKernel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getGradient", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["getGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getKernelsForBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["getKernelsForBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerKernel", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["registerKernel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerGradient", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["registerGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unregisterKernel", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["unregisterKernel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unregisterGradient", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["unregisterGradient"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyRegisteredKernels", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["copyRegisteredKernels"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "customGrad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["customGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "grad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["grad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "grads", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["grads"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "valueAndGrad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["valueAndGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "valueAndGrads", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["valueAndGrads"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variableGrads", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["variableGrads"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Environment", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Environment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "env", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["env"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ENV", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ENV"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version_core", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["version_core"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nextFrame", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["nextFrame"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "browser", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["browser"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "io", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["io"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "math", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["math"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "serialization", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["serialization"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "test_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["test_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "backend_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["backend_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tensor_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["tensor_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "slice_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["slice_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gather_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["gather_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scatter_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["scatter_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "device_util", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["device_util"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "kernel_impls", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["kernel_impls"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "KernelBackend", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["KernelBackend"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DataStorage", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["DataStorage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Abs", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Abs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Acos", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Acos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Acosh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Acosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Add", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Add"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AddN", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AddN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "All", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["All"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Any", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Any"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgMax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ArgMax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgMin", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ArgMin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Asin", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Asin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Asinh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Asinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Atan", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Atan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Atanh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Atanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Atan2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Atan2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPool", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AvgPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPoolBackprop", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AvgPoolBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPool3D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AvgPool3D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AvgPool3DBackprop", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["AvgPool3DBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BatchMatMul", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["BatchMatMul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BatchToSpaceND", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["BatchToSpaceND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BroadcastTo", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["BroadcastTo"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cast", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Cast"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Ceil", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Ceil"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ClipByValue", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ClipByValue"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Complex", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Complex"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Concat", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Concat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv2D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Conv2D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv2DBackpropFilter", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Conv2DBackpropFilter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv2DBackpropInput", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Conv2DBackpropInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv3D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Conv3D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv3DBackpropFilterV2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Conv3DBackpropFilterV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Conv3DBackpropInputV2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Conv3DBackpropInputV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cos", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Cos"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cosh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Cosh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Cumsum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Cumsum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CropAndResize", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["CropAndResize"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthToSpace", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["DepthToSpace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNative", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["DepthwiseConv2dNative"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNativeBackpropFilter", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["DepthwiseConv2dNativeBackpropFilter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNativeBackpropInput", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["DepthwiseConv2dNativeBackpropInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Diag", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Diag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dilation2D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Dilation2D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dilation2DBackpropInput", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Dilation2DBackpropInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dilation2DBackpropFilter", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Dilation2DBackpropFilter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Div", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Div"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Elu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Elu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EluGrad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["EluGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Erf", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Erf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Equal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Equal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Exp", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Exp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Expm1", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Expm1"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FFT", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FFT"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Fill", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Fill"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FlipLeftRight", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FlipLeftRight"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Floor", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Floor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FloorDiv", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FloorDiv"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FusedBatchNorm", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FusedBatchNorm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GatherV2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["GatherV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GatherNd", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["GatherNd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Greater", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Greater"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GreaterEqual", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["GreaterEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Identity", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Identity"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IFFT", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["IFFT"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Imag", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Imag"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IsFinite", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["IsFinite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IsInf", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["IsInf"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IsNan", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["IsNan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Less", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Less"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LessEqual", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LessEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LinSpace", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LinSpace"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Log", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Log"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Log1p", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Log1p"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogicalAnd", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LogicalAnd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogicalNot", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LogicalNot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogicalOr", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LogicalOr"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogSoftmax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LogSoftmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LRN", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LRN"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LRNBackprop", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["LRNBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Max", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Max"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Maximum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Maximum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPool", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MaxPool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPoolBackprop", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MaxPoolBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPool3D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MaxPool3D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPool3DBackprop", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MaxPool3DBackprop"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxPoolWithArgmax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MaxPoolWithArgmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Mean", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Mean"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Min", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Min"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Minimum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Minimum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MirrorPad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["MirrorPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Mod", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Mod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Multiply", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Multiply"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Negate", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Negate"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotEqual", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["NotEqual"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV3", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["NonMaxSuppressionV3"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV4", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["NonMaxSuppressionV4"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV5", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["NonMaxSuppressionV5"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OnesLike", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["OnesLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OneHot", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["OneHot"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PadV2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["PadV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Pool", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Pool"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Pow", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Pow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Prelu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Prelu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Prod", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Prod"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Range", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Range"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Real", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Real"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reciprocal", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Reciprocal"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Relu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Relu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reshape", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Reshape"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighbor", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ResizeNearestNeighbor"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighborGrad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ResizeNearestNeighborGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinear", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ResizeBilinear"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinearGrad", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ResizeBilinearGrad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Relu6", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Relu6"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reverse", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Reverse"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Round", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Round"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Rsqrt", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Rsqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScatterNd", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ScatterNd"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SelectV2", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["SelectV2"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Selu", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Selu"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Slice", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Slice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sin", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sin"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sinh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sinh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sign", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sign"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sigmoid", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sigmoid"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Softplus", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Softplus"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sqrt", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sqrt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SpaceToBatchND", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["SpaceToBatchND"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SplitV", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["SplitV"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Softmax", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Softmax"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SquaredDifference", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["SquaredDifference"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Square", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Square"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sub", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Sub"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SparseToDense", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["SparseToDense"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StridedSlice", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["StridedSlice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tan", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Tan"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tanh", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Tanh"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tile", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Tile"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TopK", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["TopK"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Transpose", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Transpose"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Unique", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Unique"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Unpack", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Unpack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsortedSegmentSum", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["UnsortedSegmentSum"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZerosLike", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["ZerosLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Step", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["Step"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FromPixels", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FromPixels"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateWithOffset", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["RotateWithOffset"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_FusedMatMul", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["_FusedMatMul"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FusedConv2D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FusedConv2D"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FusedDepthwiseConv2D", function() { return _base__WEBPACK_IMPORTED_MODULE_1__["FusedDepthwiseConv2D"]; }); + +/* harmony import */ var _register_all_gradients__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./register_all_gradients */ "./node_modules/@tensorflow/tfjs-core/dist/register_all_gradients.js"); +/* harmony import */ var _public_chained_ops_register_all_chained_ops__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./public/chained_ops/register_all_chained_ops */ "./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/register_all_chained_ops.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Required side effectful code. + +// All exports from this package should be in base. + +// Register all the gradients. + +// Import all op chainers and add type info to Tensor. + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js ***! + \*********************************************************************/ +/*! exports provided: BrowserDownloads, browserDownloadsRouter, browserDownloads, browserFiles */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserDownloads", function() { return BrowserDownloads; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "browserDownloadsRouter", function() { return browserDownloadsRouter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "browserDownloads", function() { return browserDownloads; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "browserFiles", function() { return browserFiles; }); +/* harmony import */ var _flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../flags */ "./node_modules/@tensorflow/tfjs-core/dist/flags.js"); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _io_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./io_utils */ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"); +/* harmony import */ var _router_registry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./router_registry */ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * IOHandlers related to files, such as browser-triggered file downloads, + * user-selected files in browser. + */ + + + + +const DEFAULT_FILE_NAME_PREFIX = 'model'; +const DEFAULT_JSON_EXTENSION_NAME = '.json'; +const DEFAULT_WEIGHT_DATA_EXTENSION_NAME = '.weights.bin'; +function defer(f) { + return new Promise(resolve => setTimeout(resolve)).then(f); +} +class BrowserDownloads { + constructor(fileNamePrefix) { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER')) { + // TODO(cais): Provide info on what IOHandlers are available under the + // current environment. + throw new Error('browserDownloads() cannot proceed because the current environment ' + + 'is not a browser.'); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = + fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof (document) === 'undefined') { + throw new Error('Browser downloads are not supported in ' + + 'this environment since `document` is not present'); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: 'application/octet-stream' })); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error('BrowserDownloads.save() does not support saving model topology ' + + 'in binary formats yet.'); + } + else { + const weightsManifest = [{ + paths: ['./' + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: 'application/json' })); + // If anchor elements are not provided, create them without attaching them + // to parents, so that the downloaded file names can be controlled. + const jsonAnchor = this.jsonAnchor == null ? document.createElement('a') : + this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + // Trigger downloads by evoking a click event on the download anchors. + // When multiple downloads are started synchronously, Firefox will only + // save the last one. + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent('click'))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? + document.createElement('a') : + this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent('click'))); + } + return { modelArtifactsInfo: Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["getModelArtifactsInfoForJSON"])(modelArtifacts) }; + } + } +} +BrowserDownloads.URL_SCHEME = 'downloads://'; +class BrowserFiles { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, ` + + `but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + // tslint:disable-next-line:no-any + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({ modelTopology }); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = + this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } + catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach(weightsGroup => { + weightsGroup.paths.forEach(path => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach(weightsGroup => { + weightsGroup.paths.forEach(path => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event) => { + // tslint:disable-next-line:no-any + const weightData = event.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + resolve({ + modelTopology, + weightSpecs, + weightData: Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["concatenateArrayBuffers"])(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy, + userDefinedMetadata: modelJSON.userDefinedMetadata + }); + } + }; + weightFileReader.onerror = error => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = error => reject(`Failed to read model topology and weights manifest JSON ` + + `from file '${jsonFile.name}'. BrowserFiles supports loading ` + + `Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + /** + * Check the compatibility between weights manifest and weight files. + */ + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map(file => Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["basename"])(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach(path => { + const pathBasename = Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["basename"])(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: ` + + `'${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } + else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest ` + + `(${basenames.length}) and the number of weight files provided ` + + `(${files.length}).`); + } + return pathToFile; + } +} +const browserDownloadsRouter = (url) => { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER')) { + return null; + } + else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } + else { + return null; + } + } +}; +_router_registry__WEBPACK_IMPORTED_MODULE_3__["IORouterRegistry"].registerSaveRouter(browserDownloadsRouter); +/** + * Creates an IOHandler that triggers file downloads from the browser. + * + * The returned `IOHandler` instance can be used as model exporting methods such + * as `tf.Model.save` and supports only saving. + * + * ```js + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * const saveResult = await model.save('downloads://mymodel'); + * // This will trigger downloading of two files: + * // 'mymodel.json' and 'mymodel.weights.bin'. + * console.log(saveResult); + * ``` + * + * @param fileNamePrefix Prefix name of the files to be downloaded. For use with + * `tf.Model`, `fileNamePrefix` should follow either of the following two + * formats: + * 1. `null` or `undefined`, in which case the default file + * names will be used: + * - 'model.json' for the JSON file containing the model topology and + * weights manifest. + * - 'model.weights.bin' for the binary file containing the binary weight + * values. + * 2. A single string or an Array of a single string, as the file name prefix. + * For example, if `'foo'` is provided, the downloaded JSON + * file and binary weights file will be named 'foo.json' and + * 'foo.weights.bin', respectively. + * @param config Additional configuration for triggering downloads. + * @returns An instance of `BrowserDownloads` `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +function browserDownloads(fileNamePrefix = 'model') { + return new BrowserDownloads(fileNamePrefix); +} +/** + * Creates an IOHandler that loads model artifacts from user-selected files. + * + * This method can be used for loading from files such as user-selected files + * in the browser. + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * // Note: This code snippet won't run properly without the actual file input + * // elements in the HTML DOM. + * + * // Suppose there are two HTML file input (``) + * // elements. + * const uploadJSONInput = document.getElementById('upload-json'); + * const uploadWeightsInput = document.getElementById('upload-weights'); + * const model = await tf.loadLayersModel(tf.io.browserFiles( + * [uploadJSONInput.files[0], uploadWeightsInput.files[0]])); + * ``` + * + * @param files `File`s to load from. Currently, this function supports only + * loading from files that contain Keras-style models (i.e., `tf.Model`s), for + * which an `Array` of `File`s is expected (in that order): + * - A JSON file containing the model topology and weight manifest. + * - Optionally, One or more binary files containing the binary weights. + * These files must have names that match the paths in the `weightsManifest` + * contained by the aforementioned JSON file, or errors will be thrown + * during loading. These weights files have the same format as the ones + * generated by `tensorflowjs_converter` that comes with the `tensorflowjs` + * Python PIP package. If no weights files are provided, only the model + * topology will be loaded from the JSON file above. + * @returns An instance of `Files` `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +function browserFiles(files) { + return new BrowserFiles(files); +} +//# sourceMappingURL=browser_files.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/http.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/http.js ***! + \************************************************************/ +/*! exports provided: HTTPRequest, parseUrl, isHTTPScheme, httpRouter, http, browserHTTPRequest */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HTTPRequest", function() { return HTTPRequest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return parseUrl; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHTTPScheme", function() { return isHTTPScheme; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "httpRouter", function() { return httpRouter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "http", function() { return http; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "browserHTTPRequest", function() { return browserHTTPRequest; }); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _io_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./io_utils */ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"); +/* harmony import */ var _router_registry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./router_registry */ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/* harmony import */ var _weights_loader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./weights_loader */ "./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * IOHandler implementations based on HTTP requests in the web browser. + * + * Uses [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API). + */ + + + + + +const OCTET_STREAM_MIME_TYPE = 'application/octet-stream'; +const JSON_TYPE = 'application/json'; +class HTTPRequest { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = 'POST'; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + Object(_util__WEBPACK_IMPORTED_MODULE_1__["assert"])(typeof loadOptions.fetchFunc === 'function', () => 'Must pass a function that matches the signature of ' + + '`fetch` (see ' + + 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)'); + this.fetch = loadOptions.fetchFunc; + } + else { + this.fetch = Object(_environment__WEBPACK_IMPORTED_MODULE_0__["env"])().platform.fetch; + } + Object(_util__WEBPACK_IMPORTED_MODULE_1__["assert"])(path != null && path.length > 0, () => 'URL path for http must not be null, undefined or ' + + 'empty.'); + if (Array.isArray(path)) { + Object(_util__WEBPACK_IMPORTED_MODULE_1__["assert"])(path.length === 2, () => 'URL paths for http must have a length of 2, ' + + `(actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && + loadOptions.requestInit.body != null) { + throw new Error('requestInit is expected to have no pre-existing body, but has one.'); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error('BrowserHTTPRequest.save() does not support saving model topology ' + + 'in binary formats yet.'); + } + const init = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); + init.body = new FormData(); + const weightsManifest = [{ + paths: ['./model.weights.bin'], + weights: modelArtifacts.weightSpecs, + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + userDefinedMetadata: modelArtifacts.userDefinedMetadata, + weightsManifest + }; + init.body.append('model.json', new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), 'model.json'); + if (modelArtifacts.weightData != null) { + init.body.append('model.weights.bin', new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), 'model.weights.bin'); + } + const response = await this.fetch(this.path, init); + if (response.ok) { + return { + modelArtifactsInfo: Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["getModelArtifactsInfoForJSON"])(modelArtifacts), + responses: [response], + }; + } + else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ` + + `${response.status}.`); + } + } + /** + * Load model artifacts via HTTP request(s). + * + * See the documentation to `tf.io.http` for details on the saved + * artifacts. + * + * @returns The loaded model artifacts (if loading succeeds). + */ + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ` + + `${modelConfigRequest.status}. Please verify this URL points to ` + + `the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } + catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + // TODO(nsthorat): Remove this after some time when we're comfortable that + // .pb files are mostly gone. + if (this.path.endsWith('.pb')) { + message += ' Your path contains a .pb file extension. ' + + 'Support for .pb models have been removed in TensorFlow.js 1.0 ' + + 'in favor of .json models. You can re-convert your Python ' + + 'TensorFlow model using the TensorFlow.js 1.0 conversion scripts ' + + 'or you can convert your.pb models with the \'pb2json\'' + + 'NPM script in the tensorflow/tfjs-converter repository.'; + } + else { + message += ' Please make sure the server is serving valid ' + + 'JSON for this request.'; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + // We do not allow both modelTopology and weightsManifest to be missing. + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model ` + + `topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + userDefinedMetadata, + generatedBy, + convertedBy, + format + }; + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } + else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await Object(_weights_loader__WEBPACK_IMPORTED_MODULE_4__["loadWeightsAsArrayBuffer"])(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["concatenateArrayBuffers"])(buffers)]; + } +} +HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; +/** + * Extract the prefix and suffix of the url, where the prefix is the path before + * the last file, and suffix is the search params after the last file. + * ``` + * const url = 'http://tfhub.dev/model/1/tensorflowjs_model.pb?tfjs-format=file' + * [prefix, suffix] = parseUrl(url) + * // prefix = 'http://tfhub.dev/model/1/' + * // suffix = '?tfjs-format=file' + * ``` + * @param url the model url to be parsed. + */ +function parseUrl(url) { + const lastSlash = url.lastIndexOf('/'); + const lastSearchParam = url.lastIndexOf('?'); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ''; + return [prefix + '/', suffix]; +} +function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; +} +const httpRouter = (url, loadOptions) => { + if (typeof fetch === 'undefined' && + (loadOptions == null || loadOptions.fetchFunc == null)) { + // `http` uses `fetch` or `node-fetch`, if one wants to use it in + // an environment that is not the browser or node they have to setup a + // global fetch polyfill. + return null; + } + else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every(urlItem => isHTTPScheme(urlItem)); + } + else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; +}; +_router_registry__WEBPACK_IMPORTED_MODULE_3__["IORouterRegistry"].registerSaveRouter(httpRouter); +_router_registry__WEBPACK_IMPORTED_MODULE_3__["IORouterRegistry"].registerLoadRouter(httpRouter); +/** + * Creates an IOHandler subtype that sends model artifacts to HTTP server. + * + * An HTTP request of the `multipart/form-data` mime type will be sent to the + * `path` URL. The form data includes artifacts that represent the topology + * and/or weights of the model. In the case of Keras-style `tf.Model`, two + * blobs (files) exist in form-data: + * - A JSON file consisting of `modelTopology` and `weightsManifest`. + * - A binary weights file consisting of the concatenated weight values. + * These files are in the same format as the one generated by + * [tfjs_converter](https://js.tensorflow.org/tutorials/import-keras.html). + * + * The following code snippet exemplifies the client-side code that uses this + * function: + * + * ```js + * const model = tf.sequential(); + * model.add( + * tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'})); + * + * const saveResult = await model.save(tf.io.http( + * 'http://model-server:5000/upload', {requestInit: {method: 'PUT'}})); + * console.log(saveResult); + * ``` + * + * If the default `POST` method is to be used, without any custom parameters + * such as headers, you can simply pass an HTTP or HTTPS URL to `model.save`: + * + * ```js + * const saveResult = await model.save('http://model-server:5000/upload'); + * ``` + * + * The following GitHub Gist + * https://gist.github.com/dsmilkov/1b6046fd6132d7408d5257b0976f7864 + * implements a server based on [flask](https://github.com/pallets/flask) that + * can receive the request. Upon receiving the model artifacts via the requst, + * this particular server reconsistutes instances of [Keras + * Models](https://keras.io/models/model/) in memory. + * + * + * @param path A URL path to the model. + * Can be an absolute HTTP path (e.g., + * 'http://localhost:8000/model-upload)') or a relative path (e.g., + * './model-upload'). + * @param requestInit Request configurations to be used when sending + * HTTP request to server using `fetch`. It can contain fields such as + * `method`, `credentials`, `headers`, `mode`, etc. See + * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request + * for more information. `requestInit` must not have a body, because the + * body will be set by TensorFlow.js. File blobs representing the model + * topology (filename: 'model.json') and the weights of the model (filename: + * 'model.weights.bin') will be appended to the body. If `requestInit` has a + * `body`, an Error will be thrown. + * @param loadOptions Optional configuration for the loading. It includes the + * following fields: + * - weightPathPrefix Optional, this specifies the path prefix for weight + * files, by default this is calculated from the path param. + * - fetchFunc Optional, custom `fetch` function. E.g., in Node.js, + * the `fetch` from node-fetch can be used here. + * - onProgress Optional, progress callback function, fired periodically + * before the load is completed. + * @returns An instance of `IOHandler`. + * + * @doc { + * heading: 'Models', + * subheading: 'Loading', + * namespace: 'io', + * ignoreCI: true + * } + */ +function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); +} +/** + * Deprecated. Use `tf.io.http`. + * @param path + * @param loadOptions + */ +function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); +} +//# sourceMappingURL=http.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js ***! + \******************************************************************/ +/*! exports provided: deleteDatabase, BrowserIndexedDB, indexedDBRouter, browserIndexedDB, BrowserIndexedDBManager */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deleteDatabase", function() { return deleteDatabase; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserIndexedDB", function() { return BrowserIndexedDB; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "indexedDBRouter", function() { return indexedDBRouter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "browserIndexedDB", function() { return browserIndexedDB; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserIndexedDBManager", function() { return BrowserIndexedDBManager; }); +/* harmony import */ var _flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../flags */ "./node_modules/@tensorflow/tfjs-core/dist/flags.js"); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _io_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./io_utils */ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"); +/* harmony import */ var _router_registry__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./router_registry */ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +const DATABASE_NAME = 'tensorflowjs'; +const DATABASE_VERSION = 1; +// Model data and ModelArtifactsInfo (metadata) are stored in two separate +// stores for efficient access of the list of stored models and their metadata. +// 1. The object store for model data: topology, weights and weight manifests. +const MODEL_STORE_NAME = 'models_store'; +// 2. The object store for ModelArtifactsInfo, including meta-information such +// as the type of topology (JSON vs binary), byte size of the topology, byte +// size of the weights, etc. +const INFO_STORE_NAME = 'model_info_store'; +/** + * Delete the entire database for tensorflow.js, including the models store. + */ +async function deleteDatabase() { + const idbFactory = getIndexedDBFactory(); + return new Promise((resolve, reject) => { + const deleteRequest = idbFactory.deleteDatabase(DATABASE_NAME); + deleteRequest.onsuccess = () => resolve(); + deleteRequest.onerror = error => reject(error); + }); +} +function getIndexedDBFactory() { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER')) { + // TODO(cais): Add more info about what IOHandler subtypes are available. + // Maybe point to a doc page on the web and/or automatically determine + // the available IOHandlers and print them in the error message. + throw new Error('Failed to obtain IndexedDB factory because the current environment' + + 'is not a web browser.'); + } + // tslint:disable-next-line:no-any + const theWindow = typeof window === 'undefined' ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || + theWindow.webkitIndexedDB || theWindow.msIndexedDB || + theWindow.shimIndexedDB; + if (factory == null) { + throw new Error('The current browser does not appear to support IndexedDB.'); + } + return factory; +} +function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, { keyPath: 'modelPath' }); + db.createObjectStore(INFO_STORE_NAME, { keyPath: 'modelPath' }); +} +/** + * IOHandler subclass: Browser IndexedDB. + * + * See the doc string of `browserIndexedDB` for more details. + */ +class BrowserIndexedDB { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error('For IndexedDB, modelPath must not be null, undefined or empty.'); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + // TODO(cais): Support saving GraphDef models. + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error('BrowserLocalStorage.save() does not support saving model topology ' + + 'in binary formats yet.'); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + /** + * Perform database action to put model artifacts into or read model artifacts + * from IndexedDB object store. + * + * Whether the action is put or get depends on whether `modelArtifacts` is + * specified. If it is specified, the action will be put; otherwise the action + * will be get. + * + * @param modelPath A unique string path for the model. + * @param modelArtifacts If specified, it will be the model artifacts to be + * stored in IndexedDB. + * @returns A `Promise` of `SaveResult`, if the action is put, or a `Promise` + * of `ModelArtifacts`, if the action is get. + */ + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + // Read model out from object store. + const modelTx = db.transaction(MODEL_STORE_NAME, 'readonly'); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' ` + + `in IndexedDB.`)); + } + else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = error => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } + else { + // Put model into object store. + const modelArtifactsInfo = Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["getModelArtifactsInfoForJSON"])(modelArtifacts); + // First, put ModelArtifactsInfo into info store. + const infoTx = db.transaction(INFO_STORE_NAME, 'readwrite'); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo }); + let modelTx; + putInfoRequest.onsuccess = () => { + // Second, put model data into model store. + modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite'); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo }); + putModelRequest.onerror = error => { + // If the put-model request fails, roll back the info entry as + // well. + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = error => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = error => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } + else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = error => reject(openRequest.error); + }); + } +} +BrowserIndexedDB.URL_SCHEME = 'indexeddb://'; +const indexedDBRouter = (url) => { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER')) { + return null; + } + else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } + else { + return null; + } + } +}; +_router_registry__WEBPACK_IMPORTED_MODULE_3__["IORouterRegistry"].registerSaveRouter(indexedDBRouter); +_router_registry__WEBPACK_IMPORTED_MODULE_3__["IORouterRegistry"].registerLoadRouter(indexedDBRouter); +/** + * Creates a browser IndexedDB IOHandler for saving and loading models. + * + * ```js + * const model = tf.sequential(); + * model.add( + * tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'})); + * + * const saveResult = await model.save('indexeddb://MyModel')); + * console.log(saveResult); + * ``` + * + * @param modelPath A unique identifier for the model to be saved. Must be a + * non-empty string. + * @returns An instance of `BrowserIndexedDB` (sublcass of `IOHandler`), + * which can be used with, e.g., `tf.Model.save`. + */ +function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? + key.slice(BrowserIndexedDB.URL_SCHEME.length) : + key; +} +class BrowserIndexedDBManager { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, 'readonly'); + const store = tx.objectStore(INFO_STORE_NAME); + // tslint:disable:max-line-length + // Need to cast `store` as `any` here because TypeScript's DOM + // library does not have the `getAll()` method even though the + // method is supported in the latest version of most mainstream + // browsers: + // https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/getAll + // tslint:enable:max-line-length + // tslint:disable-next-line:no-any + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = error => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = error => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, 'readwrite'); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' ` + + `in IndexedDB.`)); + } + else { + // First, delete the entry in the info store. + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + // Second, delete the entry in the model store. + modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite'); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = error => reject(getInfoRequest.error); + }; + // Proceed with deleting model data regardless of whether deletion + // of info data succeeds or not. + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = error => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = error => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } + else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = error => reject(openRequest.error); + }); + } +} +//# sourceMappingURL=indexed_db.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/io.js": +/*!**********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io.js ***! + \**********************************************************/ +/*! exports provided: copyModel, listModels, moveModel, removeModel, browserFiles, browserHTTPRequest, concatenateArrayBuffers, decodeWeights, encodeWeights, fromMemory, getLoadHandlers, getModelArtifactsInfoForJSON, getSaveHandlers, http, isHTTPScheme, loadWeights, registerLoadRouter, registerSaveRouter, weightsLoaderFactory, withSaveHandler */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _indexed_db__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./indexed_db */ "./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js"); +/* harmony import */ var _local_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./local_storage */ "./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js"); +/* harmony import */ var _browser_files__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./browser_files */ "./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "browserFiles", function() { return _browser_files__WEBPACK_IMPORTED_MODULE_2__["browserFiles"]; }); + +/* harmony import */ var _http__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./http */ "./node_modules/@tensorflow/tfjs-core/dist/io/http.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "browserHTTPRequest", function() { return _http__WEBPACK_IMPORTED_MODULE_3__["browserHTTPRequest"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "http", function() { return _http__WEBPACK_IMPORTED_MODULE_3__["http"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isHTTPScheme", function() { return _http__WEBPACK_IMPORTED_MODULE_3__["isHTTPScheme"]; }); + +/* harmony import */ var _io_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./io_utils */ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatenateArrayBuffers", function() { return _io_utils__WEBPACK_IMPORTED_MODULE_4__["concatenateArrayBuffers"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "decodeWeights", function() { return _io_utils__WEBPACK_IMPORTED_MODULE_4__["decodeWeights"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "encodeWeights", function() { return _io_utils__WEBPACK_IMPORTED_MODULE_4__["encodeWeights"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getModelArtifactsInfoForJSON", function() { return _io_utils__WEBPACK_IMPORTED_MODULE_4__["getModelArtifactsInfoForJSON"]; }); + +/* harmony import */ var _passthrough__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./passthrough */ "./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromMemory", function() { return _passthrough__WEBPACK_IMPORTED_MODULE_5__["fromMemory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withSaveHandler", function() { return _passthrough__WEBPACK_IMPORTED_MODULE_5__["withSaveHandler"]; }); + +/* harmony import */ var _router_registry__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./router_registry */ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLoadHandlers", function() { return _router_registry__WEBPACK_IMPORTED_MODULE_6__["getLoadHandlers"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getSaveHandlers", function() { return _router_registry__WEBPACK_IMPORTED_MODULE_6__["getSaveHandlers"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerLoadRouter", function() { return _router_registry__WEBPACK_IMPORTED_MODULE_6__["registerLoadRouter"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerSaveRouter", function() { return _router_registry__WEBPACK_IMPORTED_MODULE_6__["registerSaveRouter"]; }); + +/* harmony import */ var _weights_loader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./weights_loader */ "./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadWeights", function() { return _weights_loader__WEBPACK_IMPORTED_MODULE_7__["loadWeights"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "weightsLoaderFactory", function() { return _weights_loader__WEBPACK_IMPORTED_MODULE_7__["weightsLoaderFactory"]; }); + +/* harmony import */ var _model_management__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./model_management */ "./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyModel", function() { return _model_management__WEBPACK_IMPORTED_MODULE_8__["copyModel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "listModels", function() { return _model_management__WEBPACK_IMPORTED_MODULE_8__["listModels"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveModel", function() { return _model_management__WEBPACK_IMPORTED_MODULE_8__["moveModel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeModel", function() { return _model_management__WEBPACK_IMPORTED_MODULE_8__["removeModel"]; }); + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +// Importing local_storage and indexed_db is necessary for the routers to be +// registered. + + + + + + + + + + +//# sourceMappingURL=io.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js ***! + \****************************************************************/ +/*! exports provided: encodeWeights, decodeWeights, concatenateTypedArrays, stringByteLength, arrayBufferToBase64String, base64StringToArrayBuffer, concatenateArrayBuffers, basename, getModelArtifactsInfoForJSON, getFloat16Decoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(Buffer) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encodeWeights", function() { return encodeWeights; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeWeights", function() { return decodeWeights; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatenateTypedArrays", function() { return concatenateTypedArrays; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stringByteLength", function() { return stringByteLength; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arrayBufferToBase64String", function() { return arrayBufferToBase64String; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "base64StringToArrayBuffer", function() { return base64StringToArrayBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatenateArrayBuffers", function() { return concatenateArrayBuffers; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return basename; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getModelArtifactsInfoForJSON", function() { return getModelArtifactsInfoForJSON; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFloat16Decoder", function() { return getFloat16Decoder; }); +/* harmony import */ var _ops_complex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ops/complex */ "./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js"); +/* harmony import */ var _ops_tensor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ops/tensor */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./types */ "./node_modules/@tensorflow/tfjs-core/dist/io/types.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** Number of bytes reserved for the length of the string. (32bit integer). */ +const NUM_BYTES_STRING_LENGTH = 4; +/** + * Encode a map from names to weight values as an ArrayBuffer, along with an + * `Array` of `WeightsManifestEntry` as specification of the encoded weights. + * + * This function does not perform sharding. + * + * This function is the reverse of `decodeWeights`. + * + * @param tensors A map ("dict") from names to tensors. + * @param group Group to which the weights belong (optional). + * @returns A `Promise` of + * - A flat `ArrayBuffer` with all the binary values of the `Tensor`s + * concatenated. + * - An `Array` of `WeightManifestEntry`s, carrying information including + * tensor names, `dtype`s and shapes. + * @throws Error: on unsupported tensor `dtype`. + */ +async function encodeWeights(tensors, group) { + // TODO(adarob, cais): Support quantization. + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? + tensors.map(tensor => tensor.name) : + Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== 'float32' && t.dtype !== 'int32' && t.dtype !== 'bool' && + t.dtype !== 'string' && t.dtype !== 'complex64') { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = { name, shape: t.shape, dtype: t.dtype }; + if (t.dtype === 'string') { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p, c) => p + c.length, 0) + + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i = 0; i < vals.length; i++) { + const val = vals[i]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } + else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return { data: concatenateTypedArrays(tensorValues), specs }; +} +/** + * Decode flat ArrayBuffer as weights. + * + * This function does not handle sharding. + * + * This function is the reverse of `encodeWeights`. + * + * @param buffer A flat ArrayBuffer carrying the binary values of the tensors + * concatenated in the order specified in `specs`. + * @param specs Specifications of the names, dtypes and shapes of the tensors + * whose value are encoded by `buffer`. + * @return A map from tensor name to tensor value, with the names corresponding + * to names in `specs`. + * @throws Error, if any of the tensors has unsupported dtype. + */ +function decodeWeights(buffer, specs) { + // TODO(adarob, cais): Support quantization. + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = Object(_util__WEBPACK_IMPORTED_MODULE_2__["sizeFromShape"])(shape); + let values; + if ('quantization' in spec) { + const quantization = spec.quantization; + if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') { + if (!('min' in quantization && 'scale' in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} ` + + `doesn't have corresponding metadata min and scale.`); + } + } + else if (quantization.dtype === 'float16') { + if (dtype !== 'float32') { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} ` + + `which only supports weights of type float32 not ${dtype}.`); + } + } + else { + throw new Error(`Weight ${spec.name} has unknown ` + + `quantization dtype ${quantization.dtype}. ` + + `Supported quantization dtypes are: ` + + `'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = _types__WEBPACK_IMPORTED_MODULE_3__["DTYPE_VALUE_SIZE_MAP"][quantization.dtype]; + const byteBuffer = buffer.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = (quantization.dtype === 'uint8') ? + new Uint8Array(byteBuffer) : + new Uint16Array(byteBuffer); + if (dtype === 'float32') { + if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } + else if (quantization.dtype === 'float16') { + if (float16Decode === undefined) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } + else { + throw new Error(`Unsupported quantization type ${quantization.dtype} ` + + `for weight type float32.`); + } + } + else if (dtype === 'int32') { + if (quantization.dtype !== 'uint8' && quantization.dtype !== 'uint16') { + throw new Error(`Unsupported quantization type ${quantization.dtype} ` + + `for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } + else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } + else if (dtype === 'string') { + const size = Object(_util__WEBPACK_IMPORTED_MODULE_2__["sizeFromShape"])(spec.shape); + values = []; + for (let i = 0; i < size; i++) { + const byteLength = new Uint32Array(buffer.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } + else { + const dtypeFactor = _types__WEBPACK_IMPORTED_MODULE_3__["DTYPE_VALUE_SIZE_MAP"][dtype]; + const byteBuffer = buffer.slice(offset, offset + size * dtypeFactor); + if (dtype === 'float32') { + values = new Float32Array(byteBuffer); + } + else if (dtype === 'int32') { + values = new Int32Array(byteBuffer); + } + else if (dtype === 'bool') { + values = new Uint8Array(byteBuffer); + } + else if (dtype === 'complex64') { + values = new Float32Array(byteBuffer); + const real = new Float32Array(values.length / 2); + const image = new Float32Array(values.length / 2); + for (let i = 0; i < real.length; i++) { + real[i] = values[i * 2]; + image[i] = values[i * 2 + 1]; + } + const realTensor = Object(_ops_tensor__WEBPACK_IMPORTED_MODULE_1__["tensor"])(real, shape, 'float32'); + const imageTensor = Object(_ops_tensor__WEBPACK_IMPORTED_MODULE_1__["tensor"])(image, shape, 'float32'); + out[name] = Object(_ops_complex__WEBPACK_IMPORTED_MODULE_0__["complex"])(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } + else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== 'complex64') { + out[name] = Object(_ops_tensor__WEBPACK_IMPORTED_MODULE_1__["tensor"])(values, shape, dtype); + } + } + return out; +} +/** + * Concatenate TypedArrays into an ArrayBuffer. + */ +function concatenateTypedArrays(xs) { + // TODO(adarob, cais): Support quantization. + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + // `normalizedXs` is here for this reason: a `TypedArray`'s `buffer' + // can have a different byte length from that of the `TypedArray` itself, + // for example, when the `TypedArray` is created from an offset in an + // `ArrayBuffer`. `normliazedXs` holds `TypedArray`s whose `buffer`s match + // the `TypedArray` in byte length. If an element of `xs` does not show + // this property, a new `TypedArray` that satisfy this property will be + // constructed and pushed into `normalizedXs`. + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + // tslint:disable:no-any + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : + new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || + x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + // tslint:enable:no-any + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; +} +// Use Buffer on Node.js instead of Blob/atob/btoa +const useNodeBuffer = typeof Buffer !== 'undefined' && + (typeof Blob === 'undefined' || typeof atob === 'undefined' || + typeof btoa === 'undefined'); +/** + * Calculate the byte length of a JavaScript string. + * + * Note that a JavaScript string can contain wide characters, therefore the + * length of the string is not necessarily equal to the byte length. + * + * @param str Input string. + * @returns Byte length. + */ +function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; +} +/** + * Encode an ArrayBuffer as a base64 encoded string. + * + * @param buffer `ArrayBuffer` to be converted. + * @returns A string that base64-encodes `buffer`. + */ +function arrayBufferToBase64String(buffer) { + if (useNodeBuffer) { + return Buffer.from(buffer).toString('base64'); + } + const buf = new Uint8Array(buffer); + let s = ''; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); +} +/** + * Decode a base64 string as an ArrayBuffer. + * + * @param str Base64 string. + * @returns Decoded `ArrayBuffer`. + */ +function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, 'base64'); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer.set([s.charCodeAt(i)], i); + } + return buffer.buffer; +} +/** + * Concatenate a number of ArrayBuffers into one. + * + * @param buffers A number of array buffers to concatenate. + * @returns Result of concatenating `buffers` in order. + */ +function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer) => { + totalByteLength += buffer.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer) => { + temp.set(new Uint8Array(buffer), offset); + offset += buffer.byteLength; + }); + return temp.buffer; +} +/** + * Get the basename of a path. + * + * Behaves in a way analogous to Linux's basename command. + * + * @param path + */ +function basename(path) { + const SEPARATOR = '/'; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; +} +/** + * Populate ModelArtifactsInfo fields for a model with JSON topology. + * @param modelArtifacts + * @returns A ModelArtifactsInfo object. + */ +function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error('Expected JSON model topology, received ArrayBuffer.'); + } + return { + dateSaved: new Date(), + modelTopologyType: 'JSON', + modelTopologyBytes: modelArtifacts.modelTopology == null ? + 0 : + stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? + 0 : + stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? + 0 : + modelArtifacts.weightData.byteLength, + }; +} +/** + * Computes mantisa table for casting Float16 to Float32 + * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + * + * @returns Uint32Array, 2048 mantissa lookup values. + */ +function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 0x00800000) === 0) { + e -= 0x00800000; + m <<= 1; + } + m &= ~0x00800000; + e += 0x38800000; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 0x38000000 + ((i - 1024) << 13); + } + return mantisaTable; +} +/** + * Computes exponent table for casting Float16 to Float32 + * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + * + * @returns Uint32Array, 64 exponent lookup values. + */ +function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 0x47800000; + exponentTable[32] = 0x80000000; + exponentTable[63] = 0xc7800000; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 0x80000000 + ((i - 32) << 23); + } + return exponentTable; +} +/** + * Computes offset table for casting Float16 to Float32 + * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + * + * @returns Uint32Array, 6d offset values. + */ +function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; +} +/** + * Retrieve a Float16 decoder which will decode a ByteArray of Float16 values + * to a Float32Array. + * + * @returns Function (buffer: Uint16Array) => Float32Array which decodes + * the Uint16Array of Float16 bytes to a Float32Array. + */ +function getFloat16Decoder() { + // Algorithm is based off of + // http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf + // Cache lookup tables + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 0x3ff)] + + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer); + }; +} +//# sourceMappingURL=io_utils.js.map +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../buffer/index.js */ "./node_modules/buffer/index.js").Buffer)) + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js ***! + \*********************************************************************/ +/*! exports provided: purgeLocalStorageArtifacts, BrowserLocalStorage, localStorageRouter, browserLocalStorage, BrowserLocalStorageManager */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "purgeLocalStorageArtifacts", function() { return purgeLocalStorageArtifacts; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserLocalStorage", function() { return BrowserLocalStorage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "localStorageRouter", function() { return localStorageRouter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "browserLocalStorage", function() { return browserLocalStorage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserLocalStorageManager", function() { return BrowserLocalStorageManager; }); +/* harmony import */ var _flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../flags */ "./node_modules/@tensorflow/tfjs-core/dist/flags.js"); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _io_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./io_utils */ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"); +/* harmony import */ var _router_registry__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./router_registry */ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +const PATH_SEPARATOR = '/'; +const PATH_PREFIX = 'tensorflowjs_models'; +const INFO_SUFFIX = 'info'; +const MODEL_TOPOLOGY_SUFFIX = 'model_topology'; +const WEIGHT_SPECS_SUFFIX = 'weight_specs'; +const WEIGHT_DATA_SUFFIX = 'weight_data'; +const MODEL_METADATA_SUFFIX = 'model_metadata'; +/** + * Purge all tensorflow.js-saved model artifacts from local storage. + * + * @returns Paths of the models purged. + */ +function purgeLocalStorageArtifacts() { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER') || typeof window === 'undefined' || + typeof window.localStorage === 'undefined') { + throw new Error('purgeLocalStorageModels() cannot proceed because local storage is ' + + 'unavailable in the current environment.'); + } + const LS = window.localStorage; + const purgedModelPaths = []; + for (let i = 0; i < LS.length; ++i) { + const key = LS.key(i); + const prefix = PATH_PREFIX + PATH_SEPARATOR; + if (key.startsWith(prefix) && key.length > prefix.length) { + LS.removeItem(key); + const modelName = getModelPathFromKey(key); + if (purgedModelPaths.indexOf(modelName) === -1) { + purgedModelPaths.push(modelName); + } + } + } + return purgedModelPaths; +} +function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; +} +/** + * Get model path from a local-storage key. + * + * E.g., 'tensorflowjs_models/my/model/1/info' --> 'my/model/1' + * + * @param key + */ +function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? + key.slice(BrowserLocalStorage.URL_SCHEME.length) : + key; +} +/** + * IOHandler subclass: Browser Local Storage. + * + * See the doc string to `browserLocalStorage` for more details. + */ +class BrowserLocalStorage { + constructor(modelPath) { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER') || typeof window === 'undefined' || + typeof window.localStorage === 'undefined') { + // TODO(cais): Add more info about what IOHandler subtypes are + // available. + // Maybe point to a doc page on the web and/or automatically determine + // the available IOHandlers and print them in the error message. + throw new Error('The current environment does not support local storage.'); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error('For local storage, modelPath must not be null, undefined or empty.'); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + /** + * Save model artifacts to browser local storage. + * + * See the documentation to `browserLocalStorage` for details on the saved + * artifacts. + * + * @param modelArtifacts The model artifacts to be stored. + * @returns An instance of SaveResult. + */ + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error('BrowserLocalStorage.save() does not support saving model topology ' + + 'in binary formats yet.'); + } + else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = Object(_io_utils__WEBPACK_IMPORTED_MODULE_3__["getModelArtifactsInfoForJSON"])(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, Object(_io_utils__WEBPACK_IMPORTED_MODULE_3__["arrayBufferToBase64String"])(modelArtifacts.weightData)); + this.LS.setItem(this.keys.modelMetadata, JSON.stringify({ + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + userDefinedMetadata: modelArtifacts.userDefinedMetadata + })); + return { modelArtifactsInfo }; + } + catch (err) { + // If saving failed, clean up all items saved so far. + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: ` + + `size quota being exceeded is a possible cause of this failure: ` + + `modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, ` + + `weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, ` + + `weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + /** + * Load a model from local storage. + * + * See the documentation to `browserLocalStorage` for details on the saved + * artifacts. + * + * @returns The loaded model (if loading succeeds). + */ + async load() { + const info = JSON.parse(this.LS.getItem(this.keys.info)); + if (info == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info.modelTopologyType !== 'JSON') { + throw new Error('BrowserLocalStorage does not support loading non-JSON model ' + + 'topology yet.'); + } + const out = {}; + // Load topology. + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' ` + + `is missing.`); + } + out.modelTopology = topology; + // Load weight specs. + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' ` + + `are missing.`); + } + out.weightSpecs = weightSpecs; + // Load meta-data fields. + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata['format']; + out.generatedBy = metadata['generatedBy']; + out.convertedBy = metadata['convertedBy']; + out.userDefinedMetadata = metadata['userDefinedMetadata']; + } + // Load weight data. + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model ` + + `'${this.modelPath}' are missing.`); + } + out.weightData = Object(_io_utils__WEBPACK_IMPORTED_MODULE_3__["base64StringToArrayBuffer"])(weightDataBase64); + return out; + } +} +BrowserLocalStorage.URL_SCHEME = 'localstorage://'; +const localStorageRouter = (url) => { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER')) { + return null; + } + else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } + else { + return null; + } + } +}; +_router_registry__WEBPACK_IMPORTED_MODULE_4__["IORouterRegistry"].registerSaveRouter(localStorageRouter); +_router_registry__WEBPACK_IMPORTED_MODULE_4__["IORouterRegistry"].registerLoadRouter(localStorageRouter); +/** + * Factory function for local storage IOHandler. + * + * This `IOHandler` supports both `save` and `load`. + * + * For each model's saved artifacts, four items are saved to local storage. + * - `${PATH_SEPARATOR}/${modelPath}/info`: Contains meta-info about the + * model, such as date saved, type of the topology, size in bytes, etc. + * - `${PATH_SEPARATOR}/${modelPath}/topology`: Model topology. For Keras- + * style models, this is a stringized JSON. + * - `${PATH_SEPARATOR}/${modelPath}/weight_specs`: Weight specs of the + * model, can be used to decode the saved binary weight values (see + * item below). + * - `${PATH_SEPARATOR}/${modelPath}/weight_data`: Concatenated binary + * weight values, stored as a base64-encoded string. + * + * Saving may throw an `Error` if the total size of the artifacts exceed the + * browser-specific quota. + * + * @param modelPath A unique identifier for the model to be saved. Must be a + * non-empty string. + * @returns An instance of `IOHandler`, which can be used with, e.g., + * `tf.Model.save`. + */ +function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); +} +class BrowserLocalStorageManager { + constructor() { + Object(_util__WEBPACK_IMPORTED_MODULE_2__["assert"])(Object(_environment__WEBPACK_IMPORTED_MODULE_1__["env"])().getBool('IS_BROWSER'), () => 'Current environment is not a web browser'); + Object(_util__WEBPACK_IMPORTED_MODULE_2__["assert"])(typeof window === 'undefined' || + typeof window.localStorage !== 'undefined', () => 'Current browser does not appear to support localStorage'); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info; + } +} +//# sourceMappingURL=local_storage.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js ***! + \************************************************************************/ +/*! exports provided: ModelStoreManagerRegistry, moveModel, copyModel, removeModel, listModels */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModelStoreManagerRegistry", function() { return ModelStoreManagerRegistry; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveModel", function() { return moveModel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyModel", function() { return copyModel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeModel", function() { return removeModel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "listModels", function() { return listModels; }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _router_registry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./router_registry */ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Classes and functions for model management across multiple storage mediums. + * + * Supported client actions: + * - Listing models on all registered storage mediums. + * - Remove model by URL from any registered storage mediums, by using URL + * string. + * - Moving or copying model from one path to another in the same medium or from + * one medium to another, by using URL strings. + */ + + +const URL_SCHEME_SUFFIX = '://'; +class ModelStoreManagerRegistry { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + /** + * Register a save-handler router. + * + * @param saveRouter A function that maps a URL-like string onto an instance + * of `IOHandler` with the `save` method defined or `null`. + */ + static registerManager(scheme, manager) { + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(scheme != null, () => 'scheme must not be undefined or null.'); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(scheme.length > 0, () => 'scheme must not be an empty string.'); + const registry = ModelStoreManagerRegistry.getInstance(); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } +} +/** + * Helper method for parsing a URL string into a scheme and a path. + * + * @param url E.g., 'localstorage://my-model' + * @returns A dictionary with two fields: scheme and path. + * Scheme: e.g., 'localstorage' in the example above. + * Path: e.g., 'my-model' in the example above. + */ +function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. ` + + `Supported schemes are: ` + + `${ModelStoreManagerRegistry.getSchemes().join(',')}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1], + }; +} +async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = _router_registry__WEBPACK_IMPORTED_MODULE_1__["IORouterRegistry"].getLoadHandlers(sourceURL); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) ` + + `load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = _router_registry__WEBPACK_IMPORTED_MODULE_1__["IORouterRegistry"].getSaveHandlers(destURL); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination ` + + `URL ${destURL}.`); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) ` + + `save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + // If moving within the same storage medium, remove the old model as soon as + // the loading is done. Without doing this, it is possible that the combined + // size of the two models will cause the cloning to fail. + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme) + .removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + // If moving between mediums, the deletion is done after the save succeeds. + // This guards against the case in which saving to the destination medium + // fails. + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme) + .removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; +} +/** + * List all models stored in registered storage mediums. + * + * For a web browser environment, the registered mediums are Local Storage and + * IndexedDB. + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Delete the model. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * ``` + * + * @returns A `Promise` of a dictionary mapping URLs of existing models to + * their model artifacts info. URLs include medium-specific schemes, e.g., + * 'indexeddb://my/model/1'. Model artifacts info include type of the + * model's topology, byte sizes of the topology, weights, etc. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; +} +/** + * Remove a model specified by URL from a reigstered storage medium. + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Delete the model. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * ``` + * + * @param url A URL to a stored model, with a scheme prefix, e.g., + * 'localstorage://my-model-1', 'indexeddb://my/model/2'. + * @returns ModelArtifactsInfo of the deleted model (if and only if deletion + * is successful). + * @throws Error if deletion fails, e.g., if no model exists at `path`. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); +} +/** + * Copy a model from one URL to another. + * + * This function supports: + * + * 1. Copying within a storage medium, e.g., + * `tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')` + * 2. Copying between two storage mediums, e.g., + * `tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')` + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Copy the model, from Local Storage to IndexedDB. + * await tf.io.copyModel( + * 'localstorage://demo/management/model1', + * 'indexeddb://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Remove both models. + * await tf.io.removeModel('localstorage://demo/management/model1'); + * await tf.io.removeModel('indexeddb://demo/management/model1'); + * ``` + * + * @param sourceURL Source URL of copying. + * @param destURL Destination URL of copying. + * @returns ModelArtifactsInfo of the copied model (if and only if copying + * is successful). + * @throws Error if copying fails, e.g., if no model exists at `sourceURL`, or + * if `oldPath` and `newPath` are identical. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +/** + * Move a model from one URL to another. + * + * This function supports: + * + * 1. Moving within a storage medium, e.g., + * `tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')` + * 2. Moving between two storage mediums, e.g., + * `tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')` + * + * ```js + * // First create and save a model. + * const model = tf.sequential(); + * model.add(tf.layers.dense( + * {units: 1, inputShape: [10], activation: 'sigmoid'})); + * await model.save('localstorage://demo/management/model1'); + * + * // Then list existing models. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Move the model, from Local Storage to IndexedDB. + * await tf.io.moveModel( + * 'localstorage://demo/management/model1', + * 'indexeddb://demo/management/model1'); + * + * // List models again. + * console.log(JSON.stringify(await tf.io.listModels())); + * + * // Remove the moved model. + * await tf.io.removeModel('indexeddb://demo/management/model1'); + * ``` + * + * @param sourceURL Source URL of moving. + * @param destURL Destination URL of moving. + * @returns ModelArtifactsInfo of the copied model (if and only if copying + * is successful). + * @throws Error if moving fails, e.g., if no model exists at `sourceURL`, or + * if `oldPath` and `newPath` are identical. + * + * @doc { + * heading: 'Models', + * subheading: 'Management', + * namespace: 'io', + * ignoreCI: true + * } + */ +async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} + +//# sourceMappingURL=model_management.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js ***! + \*******************************************************************/ +/*! exports provided: fromMemory, withSaveHandler */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromMemory", function() { return fromMemory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withSaveHandler", function() { return withSaveHandler; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class PassthroughLoader { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } +} +class PassthroughSaver { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } +} +/** + * Creates an IOHandler that loads model artifacts from memory. + * + * When used in conjunction with `tf.loadLayersModel`, an instance of + * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts. + * + * ```js + * const model = await tf.loadLayersModel(tf.io.fromMemory( + * modelTopology, weightSpecs, weightData)); + * ``` + * + * @param modelArtifacts a object containing model topology (i.e., parsed from + * the JSON format). + * @param weightSpecs An array of `WeightsManifestEntry` objects describing the + * names, shapes, types, and quantization of the weight data. + * @param weightData A single `ArrayBuffer` containing the weight data, + * concatenated in the order described by the weightSpecs. + * @param trainingConfig Model training configuration. Optional. + * + * @returns A passthrough `IOHandler` that simply loads the provided data. + */ +function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || + modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } + else { + // Legacy support: with only modelTopology. + // TODO(cais): Remove this deprecated API. + console.warn('Please call tf.io.fromMemory() with only one argument. ' + + 'The argument should be of type ModelArtifacts. ' + + 'The multi-argument signature of tf.io.fromMemory() has been ' + + 'deprecated and will be removed in a future release.'); + return new PassthroughLoader({ modelTopology: modelArtifacts }); + } + } + else { + // Legacy support. + // TODO(cais): Remove this deprecated API. + console.warn('Please call tf.io.fromMemory() with only one argument. ' + + 'The argument should be of type ModelArtifacts. ' + + 'The multi-argument signature of tf.io.fromMemory() has been ' + + 'deprecated and will be removed in a future release.'); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } +} +/** + * Creates an IOHandler that passes saved model artifacts to a callback. + * + * ```js + * function handleSave(artifacts) { + * // ... do something with the artifacts ... + * return {modelArtifactsInfo: {...}, ...}; + * } + * + * const saveResult = model.save(tf.io.withSaveHandler(handleSave)); + * ``` + * + * @param saveHandler A function that accepts a `ModelArtifacts` and returns a + * `SaveResult`. + */ +function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); +} +//# sourceMappingURL=passthrough.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/progress.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/progress.js ***! + \****************************************************************/ +/*! exports provided: monitorPromisesProgress */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monitorPromisesProgress", function() { return monitorPromisesProgress; }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Monitor Promise.all progress, fire onProgress callback function. + * + * @param promises Promise list going to be monitored + * @param onProgress Callback function. Fired when a promise resolved. + * @param startFraction Optional fraction start. Default to 0. + * @param endFraction Optional fraction end. Default to 1. + */ +function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then(value => { + const fraction = startFraction + + ++resolvedPromise / promises.length * (endFraction - startFraction); + // pass fraction as parameter to callback function. + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises) { + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(promises != null && Array.isArray(promises) && promises.length > 0, () => 'promises must be a none empty array'); + } + function checkFraction(startFraction, endFraction) { + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(startFraction >= 0 && startFraction <= 1, () => `Progress fraction must be in range [0, 1], but ` + + `got startFraction ${startFraction}`); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(endFraction >= 0 && endFraction <= 1, () => `Progress fraction must be in range [0, 1], but ` + + `got endFraction ${endFraction}`); + Object(_util__WEBPACK_IMPORTED_MODULE_0__["assert"])(endFraction >= startFraction, () => `startFraction must be no more than endFraction, but ` + + `got startFraction ${startFraction} and endFraction ` + + `${endFraction}`); + } + return Promise.all(promises.map(registerMonitor)); +} +//# sourceMappingURL=progress.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js ***! + \***********************************************************************/ +/*! exports provided: IORouterRegistry, registerSaveRouter, registerLoadRouter, getSaveHandlers, getLoadHandlers */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IORouterRegistry", function() { return IORouterRegistry; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerSaveRouter", function() { return registerSaveRouter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerLoadRouter", function() { return registerLoadRouter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSaveHandlers", function() { return getSaveHandlers; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLoadHandlers", function() { return getLoadHandlers; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +class IORouterRegistry { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + /** + * Register a save-handler router. + * + * @param saveRouter A function that maps a URL-like string onto an instance + * of `IOHandler` with the `save` method defined or `null`. + */ + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + /** + * Register a load-handler router. + * + * @param loadRouter A function that maps a URL-like string onto an instance + * of `IOHandler` with the `load` method defined or `null`. + */ + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + /** + * Look up IOHandler for saving, given a URL-like string. + * + * @param url + * @returns If only one match is found, an instance of IOHandler with the + * `save` method defined. If no match is found, `null`. + * @throws Error, if more than one match is found. + */ + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, 'save'); + } + /** + * Look up IOHandler for loading, given a URL-like string. + * + * @param url + * @param loadOptions Optional, custom load options. + * @returns All valid handlers for `url`, given the currently registered + * handler routers. + */ + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, 'load', loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === 'load' ? + IORouterRegistry.getInstance().loadRouters : + IORouterRegistry.getInstance().saveRouters; + routers.forEach(router => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } +} +const registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); +const registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); +const getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); +const getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); +//# sourceMappingURL=router_registry.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/types.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/types.js ***! + \*************************************************************/ +/*! exports provided: DTYPE_VALUE_SIZE_MAP */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DTYPE_VALUE_SIZE_MAP", function() { return DTYPE_VALUE_SIZE_MAP; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/* Type definitions for exporting and importing of models. */ +/** + * A map from Tensor dtype to number of bytes per element of the Tensor. + */ +const DTYPE_VALUE_SIZE_MAP = { + 'float32': 4, + 'float16': 2, + 'int32': 4, + 'uint16': 2, + 'uint8': 1, + 'bool': 1, + 'complex64': 8 +}; +//# sourceMappingURL=types.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js ***! + \**********************************************************************/ +/*! exports provided: loadWeightsAsArrayBuffer, loadWeights, weightsLoaderFactory */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadWeightsAsArrayBuffer", function() { return loadWeightsAsArrayBuffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadWeights", function() { return loadWeights; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "weightsLoaderFactory", function() { return weightsLoaderFactory; }); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _io_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./io_utils */ "./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js"); +/* harmony import */ var _progress__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./progress */ "./node_modules/@tensorflow/tfjs-core/dist/io/progress.js"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./types */ "./node_modules/@tensorflow/tfjs-core/dist/io/types.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +/** + * Reads binary weights data from a number of URLs. + * + * @param fetchURLs URLs to send the HTTP requests at, using `fetch` calls. + * @param requestOptions RequestInit (options) for the HTTP requests. + * @param fetchFunc Optional overriding value for the `window.fetch` function. + * @param onProgress Optional, progress callback function, fired periodically + * before the load is completed. + * @returns A `Promise` of an Array of `ArrayBuffer`. The Array has the same + * length as `fetchURLs`. + */ +async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? Object(_environment__WEBPACK_IMPORTED_MODULE_0__["env"])().platform.fetch : + loadOptions.fetchFunc; + // Create the requests for all of the weights in parallel. + const requests = fetchURLs.map(fetchURL => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true })); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? + await Promise.all(requests) : + await Object(_progress__WEBPACK_IMPORTED_MODULE_3__["monitorPromisesProgress"])(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map(response => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? + await Promise.all(bufferPromises) : + await Object(_progress__WEBPACK_IMPORTED_MODULE_3__["monitorPromisesProgress"])(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; +} +/** + * Reads a weights manifest JSON configuration, fetches the weights and + * returns them as `Tensor`s. + * + * @param manifest The weights manifest JSON. + * @param filePathPrefix The path prefix for filenames given in the manifest. + * Defaults to the empty string. + * @param weightNames The names of the weights to be fetched. + */ +async function loadWeights(manifest, filePathPrefix = '', weightNames, requestInit) { + // TODO(nsthorat): Groups are currently fetched atomically. If you need a + // single weight from a group, the whole group will be fetched. At a future + // date, we should support fetching only the individual shards within a + // group that are needed to reconstruct the requested weight. + // TODO(cais): Use `decodeWeights` for implementation. + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit }); + const loadWeights = weightsLoaderFactory(fetchWeights); + return loadWeights(manifest, filePathPrefix, weightNames); +} +/** + * Creates a function, which reads a weights manifest JSON configuration, + * fetches the weight files using the specified function and returns them as + * `Tensor`s. + * + * ```js + * // example for creating a nodejs weight loader, which reads the weight files + * // from disk using fs.readFileSync + * + * import * as fs from 'fs' + * + * const fetchWeightsFromDisk = (filePaths: string[]) => + * filePaths.map(filePath => fs.readFileSync(filePath).buffer) + * + * const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk) + * + * const manifest = JSON.parse( + * fs.readFileSync('./my_model-weights_manifest').toString() + * ) + * const weightMap = await loadWeights(manifest, './') + * ``` + * @param fetchWeightsFunction The function used for fetching the weight files. + * @returns Weight loading function. + */ +function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = '', weightNames) => { + // Collect all the groups, weights, and their relative offsets to be + // fetched. + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach(weightsEntry => { + const rawDtype = ('quantization' in weightsEntry) ? + weightsEntry.quantization.dtype : + weightsEntry.dtype; + const weightsBytes = _types__WEBPACK_IMPORTED_MODULE_4__["DTYPE_VALUE_SIZE_MAP"][rawDtype] * + _util__WEBPACK_IMPORTED_MODULE_1__["sizeFromShape"](weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } + else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every(found => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ` + + `${weightsNotFound.join(', ')}. \n` + + `Manifest JSON has weights with names: ` + + `${allManifestWeightNames.join(', ')}.`); + } + // Convert the one-hot boolean groupId => shouldFetch map to a list of group + // IDs. + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach(i => { + manifest[i].paths.forEach(filepath => { + const fetchUrl = filePathPrefix + + (!filePathPrefix.endsWith('/') ? '/' : '') + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach(i => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i = 0; i < numBuffers; i++) { + groupBytes += buffers[bufferIndexOffset + i].byteLength; + } + // Create a buffer for the whole group. + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i = 0; i < numBuffers; i++) { + const buffer = new Uint8Array(buffers[bufferIndexOffset + i]); + groupByteBuffer.set(buffer, groupBufferOffset); + groupBufferOffset += buffer.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach(weightsEntry => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = Object(_io_utils__WEBPACK_IMPORTED_MODULE_2__["decodeWeights"])(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; +} +//# sourceMappingURL=weights_loader.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js ***! + \*****************************************************************/ +/*! exports provided: Abs, Acos, Acosh, Add, AddN, All, Any, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, Atan2, AvgPool, AvgPoolBackprop, AvgPool3D, AvgPool3DBackprop, BatchMatMul, BatchToSpaceND, BroadcastTo, Cast, Ceil, ClipByValue, Complex, Concat, Conv2D, Conv2DBackpropFilter, Conv2DBackpropInput, Conv3D, Conv3DBackpropFilterV2, Conv3DBackpropInputV2, Cos, Cosh, Cumsum, CropAndResize, DepthToSpace, DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput, Diag, Dilation2D, Dilation2DBackpropInput, Dilation2DBackpropFilter, Div, Elu, EluGrad, Erf, Equal, Exp, Expm1, FFT, Fill, FlipLeftRight, Floor, FloorDiv, FusedBatchNorm, GatherV2, GatherNd, Greater, GreaterEqual, Identity, IFFT, Imag, IsFinite, IsInf, IsNan, Less, LessEqual, LinSpace, Log, Log1p, LogicalAnd, LogicalNot, LogicalOr, LogSoftmax, LRN, LRNBackprop, Max, Maximum, MaxPool, MaxPoolBackprop, MaxPool3D, MaxPool3DBackprop, MaxPoolWithArgmax, Mean, Min, Minimum, MirrorPad, Mod, Multiply, Negate, NotEqual, NonMaxSuppressionV3, NonMaxSuppressionV4, NonMaxSuppressionV5, OnesLike, OneHot, PadV2, Pool, Pow, Prelu, Prod, Range, Real, Reciprocal, Relu, Reshape, ResizeNearestNeighbor, ResizeNearestNeighborGrad, ResizeBilinear, ResizeBilinearGrad, Relu6, Reverse, Round, Rsqrt, ScatterNd, SelectV2, Selu, Slice, Sin, Sinh, Sign, Sigmoid, Softplus, Sqrt, Sum, SpaceToBatchND, SplitV, Softmax, SquaredDifference, Square, Sub, SparseToDense, StridedSlice, Tan, Tanh, Tile, TopK, Transpose, Unique, Unpack, UnsortedSegmentSum, ZerosLike, Step, FromPixels, RotateWithOffset, _FusedMatMul, FusedConv2D, FusedDepthwiseConv2D */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Abs", function() { return Abs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Acos", function() { return Acos; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Acosh", function() { return Acosh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Add", function() { return Add; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddN", function() { return AddN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "All", function() { return All; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Any", function() { return Any; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgMax", function() { return ArgMax; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgMin", function() { return ArgMin; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Asin", function() { return Asin; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Asinh", function() { return Asinh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Atan", function() { return Atan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Atanh", function() { return Atanh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Atan2", function() { return Atan2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvgPool", function() { return AvgPool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvgPoolBackprop", function() { return AvgPoolBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvgPool3D", function() { return AvgPool3D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AvgPool3DBackprop", function() { return AvgPool3DBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BatchMatMul", function() { return BatchMatMul; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BatchToSpaceND", function() { return BatchToSpaceND; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BroadcastTo", function() { return BroadcastTo; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cast", function() { return Cast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Ceil", function() { return Ceil; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ClipByValue", function() { return ClipByValue; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Complex", function() { return Complex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Concat", function() { return Concat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv2D", function() { return Conv2D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv2DBackpropFilter", function() { return Conv2DBackpropFilter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv2DBackpropInput", function() { return Conv2DBackpropInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv3D", function() { return Conv3D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv3DBackpropFilterV2", function() { return Conv3DBackpropFilterV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Conv3DBackpropInputV2", function() { return Conv3DBackpropInputV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cos", function() { return Cos; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cosh", function() { return Cosh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cumsum", function() { return Cumsum; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CropAndResize", function() { return CropAndResize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthToSpace", function() { return DepthToSpace; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNative", function() { return DepthwiseConv2dNative; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNativeBackpropFilter", function() { return DepthwiseConv2dNativeBackpropFilter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DepthwiseConv2dNativeBackpropInput", function() { return DepthwiseConv2dNativeBackpropInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Diag", function() { return Diag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dilation2D", function() { return Dilation2D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dilation2DBackpropInput", function() { return Dilation2DBackpropInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dilation2DBackpropFilter", function() { return Dilation2DBackpropFilter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Div", function() { return Div; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Elu", function() { return Elu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EluGrad", function() { return EluGrad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Erf", function() { return Erf; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Equal", function() { return Equal; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Exp", function() { return Exp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Expm1", function() { return Expm1; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FFT", function() { return FFT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Fill", function() { return Fill; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FlipLeftRight", function() { return FlipLeftRight; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Floor", function() { return Floor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FloorDiv", function() { return FloorDiv; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FusedBatchNorm", function() { return FusedBatchNorm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GatherV2", function() { return GatherV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GatherNd", function() { return GatherNd; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Greater", function() { return Greater; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GreaterEqual", function() { return GreaterEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Identity", function() { return Identity; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IFFT", function() { return IFFT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Imag", function() { return Imag; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IsFinite", function() { return IsFinite; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IsInf", function() { return IsInf; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IsNan", function() { return IsNan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Less", function() { return Less; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LessEqual", function() { return LessEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinSpace", function() { return LinSpace; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Log", function() { return Log; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Log1p", function() { return Log1p; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogicalAnd", function() { return LogicalAnd; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogicalNot", function() { return LogicalNot; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogicalOr", function() { return LogicalOr; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogSoftmax", function() { return LogSoftmax; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LRN", function() { return LRN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LRNBackprop", function() { return LRNBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Max", function() { return Max; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Maximum", function() { return Maximum; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPool", function() { return MaxPool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPoolBackprop", function() { return MaxPoolBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPool3D", function() { return MaxPool3D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPool3DBackprop", function() { return MaxPool3DBackprop; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxPoolWithArgmax", function() { return MaxPoolWithArgmax; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Mean", function() { return Mean; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Min", function() { return Min; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Minimum", function() { return Minimum; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MirrorPad", function() { return MirrorPad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Mod", function() { return Mod; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Multiply", function() { return Multiply; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Negate", function() { return Negate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotEqual", function() { return NotEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV3", function() { return NonMaxSuppressionV3; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV4", function() { return NonMaxSuppressionV4; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NonMaxSuppressionV5", function() { return NonMaxSuppressionV5; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OnesLike", function() { return OnesLike; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OneHot", function() { return OneHot; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PadV2", function() { return PadV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Pool", function() { return Pool; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Pow", function() { return Pow; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Prelu", function() { return Prelu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Prod", function() { return Prod; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Range", function() { return Range; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Real", function() { return Real; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Reciprocal", function() { return Reciprocal; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Relu", function() { return Relu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Reshape", function() { return Reshape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighbor", function() { return ResizeNearestNeighbor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeNearestNeighborGrad", function() { return ResizeNearestNeighborGrad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinear", function() { return ResizeBilinear; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ResizeBilinearGrad", function() { return ResizeBilinearGrad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Relu6", function() { return Relu6; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Reverse", function() { return Reverse; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Round", function() { return Round; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Rsqrt", function() { return Rsqrt; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScatterNd", function() { return ScatterNd; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectV2", function() { return SelectV2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Selu", function() { return Selu; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Slice", function() { return Slice; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sin", function() { return Sin; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sinh", function() { return Sinh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sign", function() { return Sign; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sigmoid", function() { return Sigmoid; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Softplus", function() { return Softplus; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sqrt", function() { return Sqrt; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sum", function() { return Sum; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SpaceToBatchND", function() { return SpaceToBatchND; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SplitV", function() { return SplitV; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Softmax", function() { return Softmax; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SquaredDifference", function() { return SquaredDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Square", function() { return Square; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sub", function() { return Sub; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SparseToDense", function() { return SparseToDense; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StridedSlice", function() { return StridedSlice; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tan", function() { return Tan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tanh", function() { return Tanh; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tile", function() { return Tile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopK", function() { return TopK; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transpose", function() { return Transpose; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Unique", function() { return Unique; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Unpack", function() { return Unpack; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnsortedSegmentSum", function() { return UnsortedSegmentSum; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZerosLike", function() { return ZerosLike; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Step", function() { return Step; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FromPixels", function() { return FromPixels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RotateWithOffset", function() { return RotateWithOffset; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_FusedMatMul", function() { return _FusedMatMul; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FusedConv2D", function() { return FusedConv2D; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FusedDepthwiseConv2D", function() { return FusedDepthwiseConv2D; }); +const Abs = 'Abs'; +const Acos = 'Acos'; +const Acosh = 'Acosh'; +const Add = 'Add'; +const AddN = 'AddN'; +const All = 'All'; +const Any = 'Any'; +const ArgMax = 'ArgMax'; +const ArgMin = 'ArgMin'; +const Asin = 'Asin'; +const Asinh = 'Asinh'; +const Atan = 'Atan'; +const Atanh = 'Atanh'; +const Atan2 = 'Atan2'; +const AvgPool = 'AvgPool'; +const AvgPoolBackprop = 'AvgPoolBackprop'; +const AvgPool3D = 'AvgPool3D'; +const AvgPool3DBackprop = 'AvgPool3DBackprop'; +const BatchMatMul = 'BatchMatMul'; +const BatchToSpaceND = 'BatchToSpaceND'; +const BroadcastTo = 'BroadcastTo'; +const Cast = 'Cast'; +const Ceil = 'Ceil'; +const ClipByValue = 'ClipByValue'; +const Complex = 'Complex'; +const Concat = 'Concat'; +const Conv2D = 'Conv2D'; +const Conv2DBackpropFilter = 'Conv2DBackpropFilter'; +const Conv2DBackpropInput = 'Conv2DBackpropInput'; +const Conv3D = 'Conv3D'; +const Conv3DBackpropFilterV2 = 'Conv3DBackpropFilterV2'; +const Conv3DBackpropInputV2 = 'Conv3DBackpropInputV2'; +const Cos = 'Cos'; +const Cosh = 'Cosh'; +const Cumsum = 'Cumsum'; +const CropAndResize = 'CropAndResize'; +const DepthToSpace = 'DepthToSpace'; +const DepthwiseConv2dNative = 'DepthwiseConv2dNative'; +const DepthwiseConv2dNativeBackpropFilter = 'DepthwiseConv2dNativeBackpropFilter'; +const DepthwiseConv2dNativeBackpropInput = 'DepthwiseConv2dNativeBackpropInput'; +const Diag = 'Diag'; +const Dilation2D = 'Dilation2D'; +const Dilation2DBackpropInput = 'Dilation2DBackpropInput'; +const Dilation2DBackpropFilter = 'Dilation2DBackpropFilter'; +const Div = 'Div'; +const Elu = 'Elu'; +const EluGrad = 'EluGrad'; +const Erf = 'Erf'; +const Equal = 'Equal'; +const Exp = 'Exp'; +const Expm1 = 'Expm1'; +const FFT = 'FFT'; +const Fill = 'Fill'; +const FlipLeftRight = 'FlipLeftRight'; +const Floor = 'Floor'; +const FloorDiv = 'FloorDiv'; +const FusedBatchNorm = 'FusedBatchNorm'; +const GatherV2 = 'GatherV2'; +const GatherNd = 'GatherNd'; +const Greater = 'Greater'; +const GreaterEqual = 'GreaterEqual'; +const Identity = 'Identity'; +const IFFT = 'IFFT'; +const Imag = 'Imag'; +const IsFinite = 'IsFinite'; +const IsInf = 'IsInf'; +const IsNan = 'IsNan'; +const Less = 'Less'; +const LessEqual = 'LessEqual'; +const LinSpace = 'LinSpace'; +const Log = 'Log'; +const Log1p = 'Log1p'; +const LogicalAnd = 'LogicalAnd'; +const LogicalNot = 'LogicalNot'; +const LogicalOr = 'LogicalOr'; +const LogSoftmax = 'LogSoftmax'; +const LRN = 'LRN'; +const LRNBackprop = 'LRNBackprop'; +const Max = 'Max'; +const Maximum = 'Maximum'; +const MaxPool = 'MaxPool'; +const MaxPoolBackprop = 'MaxPoolBackprop'; +const MaxPool3D = 'MaxPool3D'; +const MaxPool3DBackprop = 'MaxPool3DBackprop'; +const MaxPoolWithArgmax = 'MaxPoolWithArgmax'; +const Mean = 'Mean'; +const Min = 'Min'; +const Minimum = 'Minimum'; +const MirrorPad = 'MirrorPad'; +const Mod = 'Mod'; +const Multiply = 'Multiply'; +const Negate = 'Negate'; +const NotEqual = 'NotEqual'; +const NonMaxSuppressionV3 = 'NonMaxSuppressionV3'; +const NonMaxSuppressionV4 = 'NonMaxSuppressionV4'; +const NonMaxSuppressionV5 = 'NonMaxSuppressionV5'; +const OnesLike = 'OnesLike'; +const OneHot = 'OneHot'; +const PadV2 = 'PadV2'; +const Pool = 'Pool'; +const Pow = 'Pow'; +const Prelu = 'Prelu'; +const Prod = 'Prod'; +const Range = 'Range'; +const Real = 'Real'; +const Reciprocal = 'Reciprocal'; +const Relu = 'Relu'; +const Reshape = 'Reshape'; +const ResizeNearestNeighbor = 'ResizeNearestNeighbor'; +const ResizeNearestNeighborGrad = 'ResizeNearestNeighborGrad'; +const ResizeBilinear = 'ResizeBilinear'; +const ResizeBilinearGrad = 'ResizeBilinearGrad'; +const Relu6 = 'Relu6'; +const Reverse = 'Reverse'; +const Round = 'Round'; +const Rsqrt = 'Rsqrt'; +const ScatterNd = 'ScatterNd'; +const SelectV2 = 'SelectV2'; +const Selu = 'Selu'; +const Slice = 'Slice'; +const Sin = 'Sin'; +const Sinh = 'Sinh'; +const Sign = 'Sign'; +const Sigmoid = 'Sigmoid'; +const Softplus = 'Softplus'; +const Sqrt = 'Sqrt'; +const Sum = 'Sum'; +const SpaceToBatchND = 'SpaceToBatchND'; +const SplitV = 'SplitV'; +const Softmax = 'Softmax'; +const SquaredDifference = 'SquaredDifference'; +const Square = 'Square'; +const Sub = 'Sub'; +const SparseToDense = 'SparseToDense'; +const StridedSlice = 'StridedSlice'; +const Tan = 'Tan'; +const Tanh = 'Tanh'; +const Tile = 'Tile'; +const TopK = 'TopK'; +const Transpose = 'Transpose'; +const Unique = 'Unique'; +const Unpack = 'Unpack'; +const UnsortedSegmentSum = 'UnsortedSegmentSum'; +const ZerosLike = 'ZerosLike'; +/** + * TensorFlow.js-only kernels + */ +const Step = 'Step'; +const FromPixels = 'FromPixels'; +const RotateWithOffset = 'RotateWithOffset'; +const _FusedMatMul = '_FusedMatMul'; +const FusedConv2D = 'FusedConv2D'; +const FusedDepthwiseConv2D = 'FusedDepthwiseConv2D'; +//# sourceMappingURL=kernel_names.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js ***! + \********************************************************************/ +/*! exports provided: getKernel, getGradient, getKernelsForBackend, registerKernel, registerGradient, unregisterKernel, unregisterGradient, copyRegisteredKernels */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKernel", function() { return getKernel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGradient", function() { return getGradient; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKernelsForBackend", function() { return getKernelsForBackend; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerKernel", function() { return registerKernel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerGradient", function() { return registerGradient; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unregisterKernel", function() { return unregisterKernel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unregisterGradient", function() { return unregisterGradient; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyRegisteredKernels", function() { return copyRegisteredKernels; }); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/* harmony import */ var _global_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./global_util */ "./node_modules/@tensorflow/tfjs-core/dist/global_util.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + +const kernelRegistry = Object(_global_util__WEBPACK_IMPORTED_MODULE_1__["getGlobal"])('kernelRegistry', () => new Map()); +const gradRegistry = Object(_global_util__WEBPACK_IMPORTED_MODULE_1__["getGlobal"])('gradRegistry', () => new Map()); +/** + * Returns the kernel function (code) associated with the provided names. + * + * @param kernelName The official name of the kernel. + * @param backendName The official name of the backend. + */ +function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); +} +/** + * Returns the registered gradient info associated with the provided kernel. + * @param kernelName The official TF kernel name. + */ +function getGradient(kernelName) { + return gradRegistry.get(kernelName); +} +function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const { done, value } = it.next(); + if (done) { + break; + } + const [key, config] = value; + const [backend,] = key.split('_'); + if (backend === backendName) { + result.push(config); + } + } + return result; +} +/** + * Registers the function (forward pass) for the kernel in a global registry. + * + * @param config A config object with the following properties: + * - `kernelName` The official name of the kernel. + * - `backendName` The official name of the backend. + * - `kernelFunc` The function to run during the forward pass of the kernel. + * - `setupFunc` Optional. Gets called once, after the backend initializes. + * - `disposeFunc` Optional. Gets called once, right before the backend is + * disposed. + */ +function registerKernel(config) { + const { kernelName, backendName } = config; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend ` + + `'${backendName}' is already registered`); + } + kernelRegistry.set(key, config); +} +/** + * Registers a gradient function for a given kernel in the global registry, + * to be used during the back-propagation of that kernel. + * + * @param config An object with the following properties: + * - `kernelName` The name of the kernel that the gradient function is for. + * - `gradFunc` The function to run during back-propagation. + */ +function registerGradient(config) { + const { kernelName } = config; + if (gradRegistry.has(kernelName)) { + // TODO (yassogba) after 3.0 assess whether we need to keep this gated + // to debug mode. + if (Object(_environment__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('DEBUG')) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config); +} +/** + * Removes the kernel function from the registry. + * + * @param kernelName The official name of the kernel. + * @param backendName The official name of the backend. + * + */ +function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend ` + + `'${backendName}' is not registered`); + } + kernelRegistry.delete(key); +} +/** Removes the registered gradient from the global registry. */ +function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); +} +/** + * Finds kernels that have already been registered to a backend and re-registers + * them for a new backend. Useful for registering custom backends. + * @param registeredBackendName Already registered backend. + * @param newBackendName New backend. + */ +function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach(kernelConfig => { + const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName }); + registerKernel(newKernelConfig); + }); +} +function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; +} +//# sourceMappingURL=kernel_registry.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/log.js": +/*!********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/log.js ***! + \********************************************************/ +/*! exports provided: warn, log */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "warn", function() { return warn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); +/* harmony import */ var _environment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./environment */ "./node_modules/@tensorflow/tfjs-core/dist/environment.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +function warn(...msg) { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('IS_TEST')) { + console.warn(...msg); + } +} +function log(...msg) { + if (!Object(_environment__WEBPACK_IMPORTED_MODULE_0__["env"])().getBool('IS_TEST')) { + console.log(...msg); + } +} +//# sourceMappingURL=log.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/math.js": +/*!*********************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/math.js ***! + \*********************************************************/ +/*! exports provided: confusionMatrix */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ops_confusion_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ops/confusion_matrix */ "./node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "confusionMatrix", function() { return _ops_confusion_matrix__WEBPACK_IMPORTED_MODULE_0__["confusionMatrix"]; }); + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Exports under the tf.math.* namespace. + */ + + +//# sourceMappingURL=math.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js ***! + \************************************************************/ +/*! exports provided: abs */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return abs; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes absolute value element-wise: `abs(x)` + * + * ```js + * const x = tf.tensor1d([-1, 2, -3, 4]); + * + * x.abs().print(); // or tf.abs(x) + * ``` + * @param x The input `tf.Tensor`. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function abs_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'abs'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + save([$x]); + if ($x.dtype === 'complex64') { + return backend.complexAbs($x); + } + return backend.abs($x); + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Abs"]); +} +const abs = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ abs_ }); +//# sourceMappingURL=abs.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js ***! + \*************************************************************/ +/*! exports provided: acos */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return acos; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes acos of the input `tf.Tensor` element-wise: `acos(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.acos().print(); // or tf.acos(x) + * ``` + * @param x The input tensor. + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function acos_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'acos'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + const res = backend.acos($x); + save([$x]); + return res; + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Acos"]); +} +const acos = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ acos_ }); +//# sourceMappingURL=acos.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js ***! + \**************************************************************/ +/*! exports provided: acosh */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acosh", function() { return acosh; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes the inverse hyperbolic cos of the input `tf.Tensor` element-wise: + * `acosh(x)` + * + * ```js + * const x = tf.tensor1d([10, 1, 3, 5.7]); + * + * x.acosh().print(); // or tf.acosh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function acosh_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'acosh'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + const res = backend.acosh($x); + save([$x]); + return res; + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Acosh"]); +} +const acosh = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ acosh_ }); +//# sourceMappingURL=acosh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add.js ***! + \************************************************************/ +/*! exports provided: add */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add", function() { return add; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +/** + * Adds two `tf.Tensor`s element-wise, A + B. Supports broadcasting. + * + * + * ```js + * const a = tf.tensor1d([1, 2, 3, 4]); + * const b = tf.tensor1d([10, 20, 30, 40]); + * + * a.add(b).print(); // or tf.add(a, b) + * ``` + * + * ```js + * // Broadcast add a with b. + * const a = tf.scalar(5); + * const b = tf.tensor1d([10, 20, 30, 40]); + * + * a.add(b).print(); // or tf.add(a, b) + * ``` + * @param a The first `tf.Tensor` to add. + * @param b The second `tf.Tensor` to add. Must have the same type as `a`. + * + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +function add_(a, b) { + let $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_3__["convertToTensor"])(a, 'a', 'add'); + let $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_3__["convertToTensor"])(b, 'b', 'add'); + [$a, $b] = Object(_tensor_util__WEBPACK_IMPORTED_MODULE_2__["makeTypesMatch"])($a, $b); + const forward = (backend, save) => { + const res = backend.add($a, $b); + save([$a, $b]); + return res; + }; + const inputs = { a: $a, b: $b }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Add"]); +} +const add = Object(_operation__WEBPACK_IMPORTED_MODULE_4__["op"])({ add_ }); +//# sourceMappingURL=add.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js ***! + \**************************************************************/ +/*! exports provided: addN */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addN", function() { return addN; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +/** + * Adds a list of `tf.Tensor`s element-wise, each with the same shape and dtype. + * + * ```js + * const a = tf.tensor1d([1, 2]); + * const b = tf.tensor1d([3, 4]); + * const c = tf.tensor1d([5, 6]); + * + * tf.addN([a, b, c]).print(); + * ``` + * @param tensors A list of tensors with the same shape and dtype. + * @doc {heading: 'Operations', subheading: 'Arithmetic'} + */ +function addN_(tensors) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](Array.isArray(tensors), () => 'The argument passed to tf.addN() must be a list of tensors'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](tensors.length >= 1, () => `Must pass at least one tensor to tf.addN(), but got ` + + `${tensors.length}`); + const $tensors = tensors.map((t, i) => Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(t, `tensors${i}`, 'addN')); + const firstTensor = $tensors[0]; + $tensors.forEach(t => { + if (t.dtype !== firstTensor.dtype) { + throw new Error('All tensors passed to tf.addN() must have the same dtype'); + } + }); + $tensors.forEach(t => { + if (!_util__WEBPACK_IMPORTED_MODULE_3__["arraysEqual"](t.shape, firstTensor.shape)) { + throw new Error('All tensors passed to tf.addN() must have the same shape'); + } + }); + const forward = (backend, save) => { + const res = backend.addN($tensors); + save($tensors); + return res; + }; + const inputs = $tensors; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["AddN"]); +} +const addN = Object(_operation__WEBPACK_IMPORTED_MODULE_4__["op"])({ addN_ }); +//# sourceMappingURL=add_n.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/all.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/all.js ***! + \************************************************************/ +/*! exports provided: all */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "all", function() { return all; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _axis_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +/** + * Computes the logical and of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If `axes` has no entries, all dimensions are reduced, and an + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 1, 1], 'bool'); + * + * x.all().print(); // or tf.all(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool'); + * + * const axis = 1; + * x.all(axis).print(); // or tf.all(x, axis) + * ``` + * + * @param x The input tensor. Must be of dtype bool. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +function all_(x, axis = null, keepDims = false) { + let $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'all', 'bool'); + const forward = (backend) => { + const origAxes = Object(_util__WEBPACK_IMPORTED_MODULE_3__["parseAxisParam"])(axis, $x.shape); + let axes = origAxes; + const permutedAxes = Object(_axis_util__WEBPACK_IMPORTED_MODULE_4__["getAxesPermutation"])(axes, $x.rank); + if (permutedAxes != null) { + $x = Object(_transpose__WEBPACK_IMPORTED_MODULE_7__["transpose"])($x, permutedAxes); + axes = Object(_axis_util__WEBPACK_IMPORTED_MODULE_4__["getInnerMostAxes"])(axes.length, $x.rank); + } + const res = backend.all($x, axes); + if (keepDims) { + const newShape = Object(_axis_util__WEBPACK_IMPORTED_MODULE_4__["expandShapeToKeepDim"])(res.shape, origAxes); + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, newShape); + } + return res; + }; + const inputs = { x: $x }; + const attrs = { axis, keepDims }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["All"], attrs); +} +const all = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ all_ }); +//# sourceMappingURL=all.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/any.js": +/*!************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/any.js ***! + \************************************************************/ +/*! exports provided: any */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "any", function() { return any; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _axis_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +/** + * Computes the logical or of elements across dimensions of a `tf.Tensor`. + * + * Reduces the input along the dimensions given in `axes`. Unless `keepDims` + * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in + * `axes`. If `keepDims` is true, the reduced dimensions are retained with + * length 1. If `axes` has no entries, all dimensions are reduced, and an + * `tf.Tensor` with a single element is returned. + * + * ```js + * const x = tf.tensor1d([1, 1, 1], 'bool'); + * + * x.any().print(); // or tf.any(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool'); + * + * const axis = 1; + * x.any(axis).print(); // or tf.any(x, axis) + * ``` + * + * @param x The input tensor. Must be of dtype bool. + * @param axis The dimension(s) to reduce. By default it reduces + * all dimensions. + * @param keepDims If true, retains reduced dimensions with size 1. + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +function any_(x, axis = null, keepDims = false) { + let $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'any', 'bool'); + const forward = (backend) => { + const origAxes = Object(_util__WEBPACK_IMPORTED_MODULE_3__["parseAxisParam"])(axis, $x.shape); + let axes = origAxes; + const permutedAxes = Object(_axis_util__WEBPACK_IMPORTED_MODULE_4__["getAxesPermutation"])(axes, $x.rank); + if (permutedAxes != null) { + $x = Object(_transpose__WEBPACK_IMPORTED_MODULE_7__["transpose"])($x, permutedAxes); + axes = Object(_axis_util__WEBPACK_IMPORTED_MODULE_4__["getInnerMostAxes"])(axes.length, $x.rank); + } + const res = backend.any($x, axes); + if (keepDims) { + const newShape = Object(_axis_util__WEBPACK_IMPORTED_MODULE_4__["expandShapeToKeepDim"])(res.shape, origAxes); + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, newShape); + } + return res; + }; + const inputs = { x: $x }; + const attrs = { axis, keepDims }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Any"], attrs); +} +// tslint:disable-next-line:variable-name +const any = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ any_ }); +//# sourceMappingURL=any.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js ***! + \****************************************************************/ +/*! exports provided: argMax */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "argMax", function() { return argMax; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _axis_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +/** + * Returns the indices of the maximum values along an `axis`. + * + * The result has the same shape as `input` with the dimension along `axis` + * removed. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.argMax().print(); // or tf.argMax(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]); + * + * const axis = 1; + * x.argMax(axis).print(); // or tf.argMax(x, axis) + * ``` + * + * @param x The input tensor. + * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension). + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +function argMax_(x, axis = 0) { + let $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'argMax'); + const forward = (backend, save) => { + save([$x]); + let axes = _util__WEBPACK_IMPORTED_MODULE_3__["parseAxisParam"](axis, $x.shape); + const permutedAxes = _axis_util__WEBPACK_IMPORTED_MODULE_4__["getAxesPermutation"](axes, $x.rank); + if (permutedAxes != null) { + $x = Object(_transpose__WEBPACK_IMPORTED_MODULE_6__["transpose"])($x, permutedAxes); + axes = _axis_util__WEBPACK_IMPORTED_MODULE_4__["getInnerMostAxes"](axes.length, $x.rank); + } + return backend.argMax($x, axes[0]); + }; + const inputs = { x: $x }; + const attrs = { axis }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["ArgMax"], attrs); +} +const argMax = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ argMax_ }); +//# sourceMappingURL=arg_max.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js ***! + \****************************************************************/ +/*! exports provided: argMin */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "argMin", function() { return argMin; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _axis_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./axis_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./transpose */ "./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js"); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +/** + * Returns the indices of the minimum values along an `axis`. + * + * The result has the same shape as `input` with the dimension along `axis` + * removed. + * + * ```js + * const x = tf.tensor1d([1, 2, 3]); + * + * x.argMin().print(); // or tf.argMin(x) + * ``` + * + * ```js + * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]); + * + * const axis = 1; + * x.argMin(axis).print(); // or tf.argMin(x, axis) + * ``` + * + * @param x The input tensor. + * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension). + * + * @doc {heading: 'Operations', subheading: 'Reduction'} + */ +function argMin_(x, axis = 0) { + let $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'argMin'); + const forward = (backend, save) => { + save([$x]); + if (axis == null) { + axis = 0; + } + let axes = _util__WEBPACK_IMPORTED_MODULE_3__["parseAxisParam"](axis, $x.shape); + const permutedAxes = _axis_util__WEBPACK_IMPORTED_MODULE_4__["getAxesPermutation"](axes, $x.rank); + if (permutedAxes != null) { + $x = Object(_transpose__WEBPACK_IMPORTED_MODULE_6__["transpose"])($x, permutedAxes); + axes = _axis_util__WEBPACK_IMPORTED_MODULE_4__["getInnerMostAxes"](axes.length, $x.rank); + } + return backend.argMin($x, axes[0]); + }; + const inputs = { x: $x }; + const attrs = { axis }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["ArgMin"], attrs); +} +const argMin = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ argMin_ }); +//# sourceMappingURL=arg_min.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js ***! + \***********************************************************************/ +/*! exports provided: getReshaped, getPermuted, getReshapedPermuted, getSliceBeginCoords, getSliceSize */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getReshaped", function() { return getReshaped; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPermuted", function() { return getPermuted; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getReshapedPermuted", function() { return getReshapedPermuted; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSliceBeginCoords", function() { return getSliceBeginCoords; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSliceSize", function() { return getSliceSize; }); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Gets the new shape of the input Tensor after it's been reshaped + * to: + * [blockShape[0], ..., blockShape[M-1], batch / prod(blockShape), + * inputShape[1], ..., inputShape[N-1]] + * + * See step 1: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +function getReshaped(inputShape, blockShape, prod, batchToSpace = true) { + let reshaped = []; + if (batchToSpace) { + reshaped = reshaped.concat(blockShape.slice(0)); + reshaped.push(inputShape[0] / prod); + reshaped = reshaped.concat(inputShape.slice(1)); + } + else { + reshaped = reshaped.concat(inputShape[0]); + const spatialLength = blockShape.length; + for (let i = 0; i < spatialLength; ++i) { + reshaped = + reshaped.concat([inputShape[i + 1] / blockShape[i], blockShape[i]]); + } + reshaped = reshaped.concat(inputShape.slice(spatialLength + 1)); + } + return reshaped; +} +/** + * Gets the permutation that will transpose the dimensions of the + * reshaped tensor to shape: + * + * [batch / prod(block_shape),inputShape[1], blockShape[0], ..., + * inputShape[M], blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]] + * + * see step 2: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +function getPermuted(reshapedRank, blockShapeRank, batchToSpace = true) { + const permuted = []; + if (batchToSpace) { + permuted.push(blockShapeRank); + for (let i = blockShapeRank + 1; i < reshapedRank; ++i) { + if (i <= 2 * blockShapeRank) { + permuted.push(i); + permuted.push(i - (blockShapeRank + 1)); + } + else { + permuted.push(i); + } + } + } + else { + const permutedBeforeBatch = []; + const permutedAfterBatch = []; + for (let i = 1; i < reshapedRank; ++i) { + if (i >= blockShapeRank * 2 + 1 || i % 2 === 1) { + permutedAfterBatch.push(i); + } + else { + permutedBeforeBatch.push(i); + } + } + permuted.push(...permutedBeforeBatch); + permuted.push(0); + permuted.push(...permutedAfterBatch); + } + return permuted; +} +/** + * Gets the shape of the reshaped and permuted input Tensor before any cropping + * is applied. The new shape will be: + * + * [batch / prod(blockShape),inputShape[1] * blockShape[0], ..., + * inputShape[M] * blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]] + * + * See step 3: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +function getReshapedPermuted(inputShape, blockShape, prod, batchToSpace = true) { + const reshapedPermuted = []; + if (batchToSpace) { + reshapedPermuted.push(inputShape[0] / prod); + } + else { + reshapedPermuted.push(inputShape[0] * prod); + } + for (let i = 1; i < inputShape.length; ++i) { + if (i <= blockShape.length) { + if (batchToSpace) { + reshapedPermuted.push(blockShape[i - 1] * inputShape[i]); + } + else { + reshapedPermuted.push(inputShape[i] / blockShape[i - 1]); + } + } + else { + reshapedPermuted.push(inputShape[i]); + } + } + return reshapedPermuted; +} +/** + * Converts the crops argument into the beginning coordinates of a slice + * operation. + */ +function getSliceBeginCoords(crops, blockShape) { + const sliceBeginCoords = [0]; + for (let i = 0; i < blockShape; ++i) { + sliceBeginCoords.push(crops[i][0]); + } + return sliceBeginCoords; +} +/** + * Converts the crops argument into the size of a slice operation. When + * combined with getSliceBeginCoords this function allows the reshaped and + * permuted Tensor to be cropped to its final output shape of: + * + * inputShape[1] * blockShape[0] - crops[0,0] - crops[0,1], ..., + * inputShape[M] * blockShape[M-1] -crops[M-1,0] - + * crops[M-1,1],inputShape[M+1], ..., inputShape[N-1]] + * + * See step 4: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd + */ +function getSliceSize(uncroppedShape, crops, blockShape) { + const sliceSize = uncroppedShape.slice(0, 1); + for (let i = 0; i < blockShape; ++i) { + sliceSize.push(uncroppedShape[i + 1] - crops[i][0] - crops[i][1]); + } + return sliceSize; +} +//# sourceMappingURL=array_ops_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js ***! + \*************************************************************/ +/*! exports provided: asin */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return asin; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes asin of the input `tf.Tensor` element-wise: `asin(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.asin().print(); // or tf.asin(x) + * ``` + * @param x The input tensor. + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function asin_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'asin'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + const res = backend.asin($x); + save([$x]); + return res; + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Asin"]); +} +const asin = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ asin_ }); +//# sourceMappingURL=asin.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js ***! + \**************************************************************/ +/*! exports provided: asinh */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asinh", function() { return asinh; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes inverse hyperbolic sin of the input `tf.Tensor` element-wise: + * `asinh(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.asinh().print(); // or tf.asinh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function asinh_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'asinh'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + const res = backend.asinh($x); + save([$x]); + return res; + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Asinh"]); +} +const asinh = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ asinh_ }); +//# sourceMappingURL=asinh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js": +/*!*************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js ***! + \*************************************************************/ +/*! exports provided: atan */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan", function() { return atan; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes atan of the input `tf.Tensor` element-wise: `atan(x)` + * + * ```js + * const x = tf.tensor1d([0, 1, -1, .7]); + * + * x.atan().print(); // or tf.atan(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function atan_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'atan'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + const res = backend.atan($x); + save([$x]); + return res; + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Atan"]); +} +const atan = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ atan_ }); +//# sourceMappingURL=atan.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js ***! + \**************************************************************/ +/*! exports provided: atan2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return atan2; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +/** + * Computes arctangent of `tf.Tensor`s a / b element-wise: `atan2(a, b)`. + * Supports broadcasting. + * + * ```js + * const a = tf.tensor1d([1.0, 1.0, -1.0, .7]); + * const b = tf.tensor1d([2.0, 13.0, 3.5, .21]); + * + * tf.atan2(a, b).print() + * ``` + * + * @param a The first tensor. + * @param b The second tensor. Must have the same dtype as `a`. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function atan2_(a, b) { + let $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_3__["convertToTensor"])(a, 'a', 'atan2'); + let $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_3__["convertToTensor"])(b, 'b', 'atan2'); + [$a, $b] = Object(_tensor_util__WEBPACK_IMPORTED_MODULE_2__["makeTypesMatch"])($a, $b); + const forward = (backend, save) => { + const res = backend.atan2($a, $b); + save([$a, $b]); + return res; + }; + const inputs = { a: $a, b: $b }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Atan2"]); +} +const atan2 = Object(_operation__WEBPACK_IMPORTED_MODULE_4__["op"])({ atan2_ }); +//# sourceMappingURL=atan2.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js": +/*!**************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js ***! + \**************************************************************/ +/*! exports provided: atanh */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atanh", function() { return atanh; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + +/** + * Computes inverse hyperbolic tan of the input `tf.Tensor` element-wise: + * `atanh(x)` + * + * ```js + * const x = tf.tensor1d([0, .1, -.1, .7]); + * + * x.atanh().print(); // or tf.atanh(x) + * ``` + * @param x The input tensor. + * + * @doc {heading: 'Operations', subheading: 'Basic math'} + */ +function atanh_(x) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'atanh'); + const inputs = { x: $x }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc((backend, save) => { + const res = backend.atanh($x); + save([$x]); + return res; + }, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["Atanh"]); +} +const atanh = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ atanh_ }); +//# sourceMappingURL=atanh.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js ***! + \*****************************************************************/ +/*! exports provided: avgPool */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool", function() { return avgPool; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _cast__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _conv_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +/** + * Computes the 2D average pooling of an image. + * + * @param x The input tensor, of rank 4 or rank 3 of shape + * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed. + * @param filterSize The filter size: `[filterHeight, filterWidth]`. If + * `filterSize` is a single number, then `filterHeight == filterWidth`. + * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param pad The type of padding algorithm: + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_guides/python/nn#Convolution]( + * https://www.tensorflow.org/api_guides/python/nn#Convolution) + * @param dimRoundingMode The rounding mode used when computing output + * dimensions if pad is a number. If none is provided, it will not round + * and error if the output is of fractional size. + */ +function avgPool_(x, filterSize, strides, pad, dimRoundingMode) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'avgPool', 'float32'); + const dilations = 1; + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_conv_util__WEBPACK_IMPORTED_MODULE_5__["eitherStridesOrDilationsAreOne"](strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + let x4D = $x; + let reshapedTo4D = false; + if ($x.rank === 3) { + reshapedTo4D = true; + x4D = Object(_reshape__WEBPACK_IMPORTED_MODULE_7__["reshape"])($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]); + } + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](x4D.rank === 4, () => `Error in avgPool: x must be rank 4 but got rank ${x4D.rank}.`); + if (dimRoundingMode != null) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isInt"](pad), () => `Error in avgPool: pad must be an integer when using, ` + + `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`); + } + const forward = (backend, save) => { + const convInfo = _conv_util__WEBPACK_IMPORTED_MODULE_5__["computePool2DInfo"](x4D.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode); + save([x4D]); + if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 && + _util__WEBPACK_IMPORTED_MODULE_3__["arraysEqual"](convInfo.inShape, convInfo.outShape)) { + return x4D.clone(); + } + return backend.avgPool(x4D, convInfo); + }; + const inputs = { x: x4D }; + const attrs = { filterSize, strides, pad, dimRoundingMode }; + let res = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["AvgPool"], attrs); + res = Object(_cast__WEBPACK_IMPORTED_MODULE_4__["cast"])(res, $x.dtype); + if (reshapedTo4D) { + return Object(_reshape__WEBPACK_IMPORTED_MODULE_7__["reshape"])(res, [res.shape[1], res.shape[2], res.shape[3]]); + } + return res; +} +const avgPool = Object(_operation__WEBPACK_IMPORTED_MODULE_6__["op"])({ avgPool_ }); +//# sourceMappingURL=avg_pool.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js ***! + \********************************************************************/ +/*! exports provided: avgPool3d */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool3d", function() { return avgPool3d; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "./node_modules/@tensorflow/tfjs-core/dist/globals.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _cast__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _conv_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + +/** + * Computes the 3D average pooling. + * + * ```js + * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]); + * const result = tf.avgPool3d(x, 2, 1, 'valid'); + * result.print(); + * ``` + * + * @param x The input tensor, of rank 5 or rank 4 of shape + * `[batch, depth, height, width, inChannels]`. + * @param filterSize The filter size: + * `[filterDepth, filterHeight, filterWidth]`. + * If `filterSize` is a single number, + * then `filterDepth == filterHeight == filterWidth`. + * @param strides The strides of the pooling: + * `[strideDepth, strideHeight, strideWidth]`. + * If `strides` is a single number, + * then `strideDepth == strideHeight == strideWidth`. + * @param pad The type of padding algorithm. + * - `same` and stride 1: output will be of same size as input, + * regardless of filter size. + * - `valid`: output will be smaller than input if filter is larger + * than 1*1x1. + * - For more info, see this guide: + * [https://www.tensorflow.org/api_guides/python/nn#Convolution]( + * https://www.tensorflow.org/api_guides/python/nn#Convolution) + * @param dimRoundingMode The rounding mode used when computing output + * dimensions if pad is a number. If none is provided, it will not round + * and error if the output is of fractional size. + * @param dataFormat An optional string from: "NDHWC", "NCDHW". Defaults to + * "NDHWC". Specify the data format of the input and output data. With the + * default format "NDHWC", the data is stored in the order of: [batch, + * depth, height, width, channels]. Only "NDHWC" is currently supported. + * @param dilations Deprecated, this field will be gone in v3.0.0. + * The dilation rates: + * `[dilationDepth, dilationHeight, dilationWidth]` + * in which we sample input values across the depth, height and width + * dimensions in dilated pooling. + * Defaults to `[1, 1, 1]`. If `dilations` is a single number, + * then `dilationDepth == dilationHeight == dilationWidth`. + * If it is greater than 1, then all values of `strides` must be 1. + * + * @doc {heading: 'Operations', subheading: 'Convolution'} + */ +function avgPool3d_(x, filterSize, strides, pad, dimRoundingMode, dataFormat = 'NDHWC', dilations) { + if (dilations == null) { + dilations = [1, 1, 1]; + } + else { + Object(_globals__WEBPACK_IMPORTED_MODULE_1__["deprecationWarn"])('dilations is deprecated, this field will be gone in ' + + 'v3.0.0.'); + } + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_3__["convertToTensor"])(x, 'x', 'avgPool3d', 'float32'); + let x5D = $x; + let reshapedTo5D = false; + if ($x.rank === 4) { + reshapedTo5D = true; + x5D = Object(_reshape__WEBPACK_IMPORTED_MODULE_8__["reshape"])($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]); + } + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](x5D.rank === 5, () => `Error in avgPool3d: x must be rank 5 but got rank ${x5D.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](dataFormat === 'NDHWC', () => `Error in avgPool3d: Only NDHWC is currently supported, ` + + `but got dataFormat of ${dataFormat}`); + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](_conv_util__WEBPACK_IMPORTED_MODULE_6__["eitherStridesOrDilationsAreOne"](strides, dilations), () => 'Error in avgPool3d: Either strides or dilations must be 1. ' + + `Got strides ${strides} and dilations '${dilations}'`); + if (dimRoundingMode != null) { + _util__WEBPACK_IMPORTED_MODULE_4__["assert"](_util__WEBPACK_IMPORTED_MODULE_4__["isInt"](pad), () => `Error in avgPool3d: pad must be an integer when using, ` + + `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`); + } + const forward = (backend, save) => { + if (dilations == null) { + dilations = [1, 1, 1]; + } + const convInfo = _conv_util__WEBPACK_IMPORTED_MODULE_6__["computePool3DInfo"](x5D.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat); + save([x5D]); + return backend.avgPool3d(x5D, convInfo); + }; + const inputs = { x: x5D }; + const attrs = { filterSize, strides, pad, dimRoundingMode, dataFormat, dilations }; + let res = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_2__["AvgPool3D"], attrs); + res = Object(_cast__WEBPACK_IMPORTED_MODULE_5__["cast"])(res, x5D.dtype); + if (reshapedTo5D) { + return Object(_reshape__WEBPACK_IMPORTED_MODULE_8__["reshape"])(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]); + } + return res; +} +const avgPool3d = Object(_operation__WEBPACK_IMPORTED_MODULE_7__["op"])({ avgPool3d_ }); +//# sourceMappingURL=avg_pool_3d.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d_backprop.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d_backprop.js ***! + \*****************************************************************************/ +/*! exports provided: avgPool3dBackprop */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPool3dBackprop", function() { return avgPool3dBackprop; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _conv_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +/** + * Computes the backprop of a 3d avg pool. + * + * @param dy The dy error, of rank 5 of shape + * [batchSize, depth, height, width, channels]. + * assumed. + * @param input The original input image, of rank 5 or rank4 of shape + * [batchSize, depth, height, width, channels]. + * @param filterSize The filter size: + * `[filterDepth, filterHeight, filterWidth]`. + * `filterSize` is a single number, + * then `filterDepth == filterHeight == filterWidth`. + * @param strides The strides of the pooling: + * `[strideDepth, strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param dilations Deprecated, this field will be gone in v3.0.0. The dilation + * rates: `[dilationDepth, dilationHeight, dilationWidth]` + * in which we sample input values across the depth, height and width + * dimensions in dilated pooling. + * Defaults to `[1, 1, 1]`. If `dilations` is a single number, + * then `dilationDepth == dilationHeight == dilationWidth`. + * If it is greater than 1, then all values of `strides` must be 1. + * @param pad A string from: 'same', 'valid'. The type of padding algorithm + * used in the forward prop of the op. + * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. The + * rounding mode used when computing output dimensions if pad is a + * number. If none is provided, it will not round and error if the output + * is of fractional size. + */ +function avgPool3dBackprop_(dy, input, filterSize, strides, dilations = [1, 1, 1], pad, dimRoundingMode) { + const $dy = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(dy, 'dy', 'avgPool3dBackprop'); + const $input = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(input, 'input', 'avgPool3dBackprop'); + let dy5D = $dy; + let input5D = $input; + let reshapedTo5D = false; + if ($input.rank === 4) { + reshapedTo5D = true; + dy5D = Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]); + input5D = Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])($input, [ + 1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3] + ]); + } + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](dy5D.rank === 5, () => `Error in avgPool3dBackprop: dy must be rank 5 but got rank ` + + `${dy5D.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](input5D.rank === 5, () => `Error in avgPool3dBackprop: input must be rank 5 but got rank ` + + `${input5D.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_conv_util__WEBPACK_IMPORTED_MODULE_4__["eitherStridesOrDilationsAreOne"](strides, dilations), () => 'Error in avgPool3dBackprop: Either strides or dilations ' + + `must be 1. Got strides ${strides} and dilations '${dilations}'`); + if (dimRoundingMode != null) { + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](_util__WEBPACK_IMPORTED_MODULE_3__["isInt"](pad), () => `Error in maxPool3dBackprop: pad must be an integer when ` + + `using, dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`); + } + const forward = backend => { + const convInfo = _conv_util__WEBPACK_IMPORTED_MODULE_4__["computePool3DInfo"](input5D.shape, filterSize, strides, dilations, pad, dimRoundingMode); + return backend.avgPool3dBackprop(dy5D, input5D, convInfo); + }; + const inputs = { dy: dy5D, input: input5D }; + const attrs = { filterSize, strides, dilations, pad, dimRoundingMode }; + const res = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["AvgPool3DBackprop"], attrs); + if (reshapedTo5D) { + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]); + } + return res; +} +const avgPool3dBackprop = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ avgPool3dBackprop_ }); +//# sourceMappingURL=avg_pool_3d_backprop.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_backprop.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_backprop.js ***! + \**************************************************************************/ +/*! exports provided: avgPoolBackprop */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "avgPoolBackprop", function() { return avgPoolBackprop; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _conv_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conv_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +/** + * Computes the backprop of an 2D avg pool. + * + * @param dy The dy error, of rank 4 or rank 3 of shape + * [batchSize, height, width, channels]. If rank 3, batch of 1 is + * assumed. + * @param input The input image, of rank 4 or rank 3 of shape + * [batchSize, height, width, channels]. If rank 3, batch of 1 is + * assumed. + * @param filterSize The filter size: `[filterHeight, filterWidth]`. If + * `filterSize` is a single number, then `filterHeight == filterWidth`. + * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If + * `strides` is a single number, then `strideHeight == strideWidth`. + * @param pad A string from: 'same', 'valid'. The type of padding algorithm + * used in the forward prop of the op. + */ +function avgPoolBackprop_(dy, input, filterSize, strides, pad) { + const $dy = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(dy, 'dy', 'avgPoolBackprop'); + const $input = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(input, 'input', 'avgPoolBackprop'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"]($input.rank === $dy.rank, () => `Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`); + let input4D = $input; + let dy4D = $dy; + let reshapedTo4D = false; + if ($input.rank === 3) { + reshapedTo4D = true; + input4D = + Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])($input, [1, $input.shape[0], $input.shape[1], $input.shape[2]]); + dy4D = Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2]]); + } + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](dy4D.rank === 4, () => `Error in avgPoolBackprop: dy must be rank 4 but got rank ` + + `${dy4D.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](input4D.rank === 4, () => `Error in avgPoolBackprop: input must be rank 4 but got rank ` + + `${input4D.rank}.`); + const forward = backend => { + const convInfo = _conv_util__WEBPACK_IMPORTED_MODULE_4__["computePool2DInfo"](input4D.shape, filterSize, strides, 1 /* dilations */, pad); + return backend.avgPoolBackprop(dy4D, input4D, convInfo); + }; + const inputs = { dy: dy4D, input: input4D }; + const attrs = { filterSize, strides, pad }; + const res = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["AvgPoolBackprop"], attrs); + if (reshapedTo4D) { + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, [res.shape[1], res.shape[2], res.shape[3]]); + } + return res; +} +const avgPoolBackprop = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ avgPoolBackprop_ }); +//# sourceMappingURL=avg_pool_backprop.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js ***! + \******************************************************************/ +/*! exports provided: axesAreInnerMostDims, combineLocations, computeOutAndReduceShapes, expandShapeToKeepDim, assertAxesAreInnerMostDims, getAxesPermutation, getUndoAxesPermutation, getInnerMostAxes */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "axesAreInnerMostDims", function() { return axesAreInnerMostDims; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLocations", function() { return combineLocations; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeOutAndReduceShapes", function() { return computeOutAndReduceShapes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expandShapeToKeepDim", function() { return expandShapeToKeepDim; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assertAxesAreInnerMostDims", function() { return assertAxesAreInnerMostDims; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAxesPermutation", function() { return getAxesPermutation; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUndoAxesPermutation", function() { return getUndoAxesPermutation; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInnerMostAxes", function() { return getInnerMostAxes; }); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +/** + * Returns true if the axis specifies the inner most dimensions of the + * array. + */ +function axesAreInnerMostDims(axes, rank) { + for (let i = 0; i < axes.length; ++i) { + if (axes[axes.length - i - 1] !== rank - 1 - i) { + return false; + } + } + return true; +} +function combineLocations(outputLoc, reduceLoc, axes) { + const rank = outputLoc.length + reduceLoc.length; + const loc = []; + let outIdx = 0; + let reduceIdx = 0; + for (let dim = 0; dim < rank; dim++) { + if (axes.indexOf(dim) === -1) { + loc.push(outputLoc[outIdx++]); + } + else { + loc.push(reduceLoc[reduceIdx++]); + } + } + return loc; +} +function computeOutAndReduceShapes(aShape, axes) { + const outShape = []; + const rank = aShape.length; + for (let dim = 0; dim < rank; dim++) { + if (axes.indexOf(dim) === -1) { + outShape.push(aShape[dim]); + } + } + const reduceShape = axes.map(dim => aShape[dim]); + return [outShape, reduceShape]; +} +function expandShapeToKeepDim(shape, axes) { + const reduceSubShape = axes.map(x => 1); + return combineLocations(shape, reduceSubShape, axes); +} +function assertAxesAreInnerMostDims(msg, axes, rank) { + _util__WEBPACK_IMPORTED_MODULE_0__["assert"](axesAreInnerMostDims(axes, rank), () => `${msg} supports only inner-most axes for now. ` + + `Got axes ${axes} and rank-${rank} input.`); +} +/** + * Returns the axes permutation to be used with `tf.transpose`, if such + * permutation is necessary. Otherwise it returns null. This method is used by + * operations that operate only on inner-most axes. + */ +function getAxesPermutation(axes, rank) { + if (axesAreInnerMostDims(axes, rank)) { + return null; + } + const result = []; + for (let i = 0; i < rank; ++i) { + if (axes.indexOf(i) === -1) { + result.push(i); + } + } + axes.forEach(axis => result.push(axis)); + return result; +} +/** Returns the axes permutation that undoes the original permutation. */ +function getUndoAxesPermutation(axes) { + return axes.map((axis, i) => [i, axis]) + .sort((a, b) => a[1] - b[1]) + .map(x => x[0]); +} +function getInnerMostAxes(numAxes, rank) { + const res = []; + for (let i = rank - numAxes; i < rank; ++i) { + res.push(i); + } + return res; +} +//# sourceMappingURL=axis_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js": +/*!************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js ***! + \************************************************************************/ +/*! exports provided: basicLSTMCell */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basicLSTMCell", function() { return basicLSTMCell; }); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _concat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./concat */ "./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js"); +/* harmony import */ var _mat_mul__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mat_mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js"); +/* harmony import */ var _mul__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _sigmoid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sigmoid */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js"); +/* harmony import */ var _slice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./slice */ "./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js"); +/* harmony import */ var _tanh__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tanh */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + +/** + * Computes the next state and output of a BasicLSTMCell. + * + * Returns `[newC, newH]`. + * + * Derived from tf.contrib.rnn.BasicLSTMCell. + * + * @param forgetBias Forget bias for the cell. + * @param lstmKernel The weights for the cell. + * @param lstmBias The bias for the cell. + * @param data The input to the cell. + * @param c Previous cell state. + * @param h Previous cell output. + * + * @doc {heading: 'Operations', subheading: 'RNN'} + */ +function basicLSTMCell_(forgetBias, lstmKernel, lstmBias, data, c, h) { + const $forgetBias = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(forgetBias, 'forgetBias', 'basicLSTMCell'); + const $lstmKernel = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(lstmKernel, 'lstmKernel', 'basicLSTMCell'); + const $lstmBias = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(lstmBias, 'lstmBias', 'basicLSTMCell'); + const $data = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(data, 'data', 'basicLSTMCell'); + const $c = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(c, 'c', 'basicLSTMCell'); + const $h = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(h, 'h', 'basicLSTMCell'); + const combined = Object(_concat__WEBPACK_IMPORTED_MODULE_2__["concat"])([$data, $h], 1); + const weighted = Object(_mat_mul__WEBPACK_IMPORTED_MODULE_3__["matMul"])(combined, $lstmKernel); + const res = Object(_add__WEBPACK_IMPORTED_MODULE_1__["add"])(weighted, $lstmBias); + // i = input_gate, j = new_input, f = forget_gate, o = output_gate + const batchSize = res.shape[0]; + const sliceCols = res.shape[1] / 4; + const sliceSize = [batchSize, sliceCols]; + const i = Object(_slice__WEBPACK_IMPORTED_MODULE_7__["slice"])(res, [0, 0], sliceSize); + const j = Object(_slice__WEBPACK_IMPORTED_MODULE_7__["slice"])(res, [0, sliceCols], sliceSize); + const f = Object(_slice__WEBPACK_IMPORTED_MODULE_7__["slice"])(res, [0, sliceCols * 2], sliceSize); + const o = Object(_slice__WEBPACK_IMPORTED_MODULE_7__["slice"])(res, [0, sliceCols * 3], sliceSize); + const newC = Object(_add__WEBPACK_IMPORTED_MODULE_1__["add"])(Object(_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(Object(_sigmoid__WEBPACK_IMPORTED_MODULE_6__["sigmoid"])(i), Object(_tanh__WEBPACK_IMPORTED_MODULE_8__["tanh"])(j)), Object(_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])($c, Object(_sigmoid__WEBPACK_IMPORTED_MODULE_6__["sigmoid"])(Object(_add__WEBPACK_IMPORTED_MODULE_1__["add"])($forgetBias, f)))); + const newH = Object(_mul__WEBPACK_IMPORTED_MODULE_4__["mul"])(Object(_tanh__WEBPACK_IMPORTED_MODULE_8__["tanh"])(newC), Object(_sigmoid__WEBPACK_IMPORTED_MODULE_6__["sigmoid"])(o)); + return [newC, newH]; +} +const basicLSTMCell = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ basicLSTMCell_ }); +//# sourceMappingURL=basic_lstm_cell.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js ***! + \**************************************************************************/ +/*! exports provided: batchToSpaceND */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchToSpaceND", function() { return batchToSpaceND; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + +/** + * This operation reshapes the "batch" dimension 0 into `M + 1` dimensions of + * shape `blockShape + [batch]`, interleaves these blocks back into the grid + * defined by the spatial dimensions `[1, ..., M]`, to obtain a result with + * the same rank as the input. The spatial dimensions of this intermediate + * result are then optionally cropped according to `crops` to produce the + * output. This is the reverse of `tf.spaceToBatchND`. See below for a precise + * description. + * + * ```js + * const x = tf.tensor4d([1, 2, 3, 4], [4, 1, 1, 1]); + * const blockShape = [2, 2]; + * const crops = [[0, 0], [0, 0]]; + * + * x.batchToSpaceND(blockShape, crops).print(); + * ``` + * + * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape + + * remainingShape`, where spatialShape has `M` dimensions. + * @param blockShape A 1-D array. Must have shape `[M]`, all values must + * be >= 1. + * @param crops A 2-D array. Must have shape `[M, 2]`, all values must be >= 0. + * `crops[i] = [cropStart, cropEnd]` specifies the amount to crop from input + * dimension `i + 1`, which corresponds to spatial dimension `i`. It is required + * that `cropStart[i] + cropEnd[i] <= blockShape[i] * inputShape[i + 1]` + * + * This operation is equivalent to the following steps: + * + * 1. Reshape `x` to `reshaped` of shape: `[blockShape[0], ..., + * blockShape[M-1], batch / prod(blockShape), x.shape[1], ..., + * x.shape[N-1]]` + * + * 2. Permute dimensions of `reshaped`to produce `permuted` of shape `[batch / + * prod(blockShape),x.shape[1], blockShape[0], ..., x.shape[M], + * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]` + * + * 3. Reshape `permuted` to produce `reshapedPermuted` of shape `[batch / + * prod(blockShape),x.shape[1] * blockShape[0], ..., x.shape[M] * + * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]` + * + * 4. Crop the start and end of dimensions `[1, ..., M]` of `reshapedPermuted` + * according to `crops` to produce the output of shape: `[batch / + * prod(blockShape),x.shape[1] * blockShape[0] - crops[0,0] - crops[0,1], + * ..., x.shape[M] * blockShape[M-1] - crops[M-1,0] - + * crops[M-1,1],x.shape[M+1], ..., x.shape[N-1]]` + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +function batchToSpaceND_(x, blockShape, crops) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'batchToSpaceND'); + const prod = blockShape.reduce((a, b) => a * b); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"]($x.rank >= 1 + blockShape.length, () => `input rank is ${$x.rank} but should be > than blockShape.length ${blockShape.length}`); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"](crops.length === blockShape.length, () => `crops.length is ${crops.length} but should be equal to blockShape.length ${blockShape.length}`); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"]($x.shape[0] % prod === 0, () => `input tensor batch is ${$x.shape[0]} but is not divisible by the product of ` + + `the elements of blockShape ${blockShape.join(' * ')} === ${prod}`); + const forward = backend => { + return backend.batchToSpaceND($x, blockShape, crops); + }; + const inputs = { x: $x }; + const attrs = { blockShape, crops }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["BatchToSpaceND"], attrs); +} +const batchToSpaceND = Object(_operation__WEBPACK_IMPORTED_MODULE_4__["op"])({ batchToSpaceND_ }); +//# sourceMappingURL=batch_to_space_nd.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js": +/*!******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js ***! + \******************************************************************/ +/*! exports provided: batchNorm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNorm", function() { return batchNorm; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _batchnorm_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./batchnorm_util */ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + +/** + * Batch normalization. + * + * As described in + * [http://arxiv.org/abs/1502.03167](http://arxiv.org/abs/1502.03167). + * + * Mean, variance, scale, and offset can be of two shapes: + * - The same shape as the input. + * - In the common case, the depth dimension is the last dimension of x, so + * the values would be an `tf.Tensor1D` of shape [depth]. + * + * Also available are stricter rank-specific methods with the same signature + * as this method that assert that parameters passed are of given rank + * - `tf.batchNorm2d` + * - `tf.batchNorm3d` + * - `tf.batchNorm4d` + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + * + * @doc {heading: 'Operations', subheading: 'Normalization'} + */ +function batchNorm_(x, mean, variance, offset, scale, varianceEpsilon) { + if (varianceEpsilon == null) { + varianceEpsilon = 0.001; + } + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'x', 'batchNorm'); + const $mean = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(mean, 'mean', 'batchNorm'); + const $variance = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(variance, 'variance', 'batchNorm'); + let $scale; + if (scale != null) { + $scale = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(scale, 'scale', 'batchNorm'); + } + let $offset; + if (offset != null) { + $offset = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(offset, 'offset', 'batchNorm'); + } + _util__WEBPACK_IMPORTED_MODULE_3__["assert"]($mean.rank === $variance.rank, () => 'Batch normalization gradient requires mean and variance to have ' + + 'equal ranks.'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"]($offset == null || $mean.rank === $offset.rank, () => 'Batch normalization gradient requires mean and offset to have ' + + 'equal ranks.'); + _util__WEBPACK_IMPORTED_MODULE_3__["assert"]($scale == null || $mean.rank === $scale.rank, () => 'Batch normalization gradient requires mean and scale to have ' + + 'equal ranks.'); + const x4D = Object(_batchnorm_util__WEBPACK_IMPORTED_MODULE_4__["xAs4D"])($x); + const forward = (backend, save) => { + save([x4D, $mean, $variance, $scale]); + return backend.batchNorm(x4D, as1DOr4D($mean), as1DOr4D($variance), as1DOr4D($offset), as1DOr4D($scale), varianceEpsilon); + }; + const inputs = { + x: x4D, + scale: $scale, + offset: $offset, + mean: $mean, + variance: $variance + }; + const attrs = { varianceEpsilon }; + const res = _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* gradient */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["FusedBatchNorm"], attrs); + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(res, $x.shape); +} +function as1DOr4D(x) { + if (x == null) { + return null; + } + if (x.rank === 0) { + // tslint:disable-next-line:no-unnecessary-type-assertion + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(x, [x.size]); + } + else if (x.rank === 1) { + return x; + } + else if (x.rank === 2) { + // tslint:disable-next-line:no-unnecessary-type-assertion + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(x, [1, 1, x.shape[0], x.shape[1]]); + } + else if (x.rank === 3) { + // tslint:disable-next-line:no-unnecessary-type-assertion + return Object(_reshape__WEBPACK_IMPORTED_MODULE_6__["reshape"])(x, [1, x.shape[0], x.shape[1], x.shape[2]]); + } + return x; +} +const batchNorm = Object(_operation__WEBPACK_IMPORTED_MODULE_5__["op"])({ batchNorm_ }); +//# sourceMappingURL=batchnorm.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm2d */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNorm2d", function() { return batchNorm2d; }); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _batchnorm__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./batchnorm */ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); + + + + +/** + * Batch normalization, strictly for 2D. For the more relaxed version, see + * `tf.batchNorm`. + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + */ +function batchNorm2d_(x, mean, variance, offset, scale, varianceEpsilon) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(x, 'x', 'batchNorm'); + const $mean = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(mean, 'mean', 'batchNorm'); + const $variance = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(variance, 'variance', 'batchNorm'); + let $scale; + if (scale != null) { + $scale = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(scale, 'scale', 'batchNorm'); + } + let $offset; + if (offset != null) { + $offset = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(offset, 'offset', 'batchNorm'); + } + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($x.rank === 2, () => `Error in batchNorm2D: x must be rank 2 but got rank ` + + `${$x.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($mean.rank === 2 || $mean.rank === 1, () => `Error in batchNorm2D: mean must be rank 2 or rank 1 but ` + + `got rank ${$mean.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($variance.rank === 2 || $variance.rank === 1, () => `Error in batchNorm2D: variance must be rank 2 or rank 1 ` + + `but got rank ${$variance.rank}.`); + if ($scale != null) { + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($scale.rank === 2 || $scale.rank === 1, () => `Error in batchNorm2D: scale must be rank 2 or rank 1 ` + + `but got rank ${$scale.rank}.`); + } + if ($offset != null) { + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($offset.rank === 2 || $offset.rank === 1, () => `Error in batchNorm2D: offset must be rank 2 or rank 1 ` + + `but got rank ${$offset.rank}.`); + } + return Object(_batchnorm__WEBPACK_IMPORTED_MODULE_2__["batchNorm"])($x, $mean, $variance, $offset, $scale, varianceEpsilon); +} +const batchNorm2d = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ batchNorm2d_ }); +//# sourceMappingURL=batchnorm2d.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm3d */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNorm3d", function() { return batchNorm3d; }); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _batchnorm__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./batchnorm */ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); + + + + +/** + * Batch normalization, strictly for 3D. For the more relaxed version, see + * `tf.batchNorm`. + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + */ +function batchNorm3d_(x, mean, variance, offset, scale, varianceEpsilon) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(x, 'x', 'batchNorm'); + const $mean = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(mean, 'mean', 'batchNorm'); + const $variance = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(variance, 'variance', 'batchNorm'); + let $scale; + if (scale != null) { + $scale = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(scale, 'scale', 'batchNorm'); + } + let $offset; + if (offset != null) { + $offset = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(offset, 'offset', 'batchNorm'); + } + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($x.rank === 3, () => `Error in batchNorm3D: x must be rank 3 but got rank ` + + `${$x.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($mean.rank === 3 || $mean.rank === 1, () => `Error in batchNorm3D: mean must be rank 3 or rank 1 but ` + + `got rank ${$mean.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($variance.rank === 3 || $variance.rank === 1, () => `Error in batchNorm3D: variance must be rank 3 or rank 1 ` + + `but got rank ${$variance.rank}.`); + if ($scale != null) { + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($scale.rank === 3 || $scale.rank === 1, () => `Error in batchNorm3D: scale must be rank 3 or rank 1 ` + + `but got rank ${$scale.rank}.`); + } + if ($offset != null) { + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($offset.rank === 3 || $offset.rank === 1, () => `Error in batchNorm3D: offset must be rank 3 or rank 1 ` + + `but got rank ${$offset.rank}.`); + } + return Object(_batchnorm__WEBPACK_IMPORTED_MODULE_2__["batchNorm"])($x, $mean, $variance, $offset, $scale, varianceEpsilon); +} +const batchNorm3d = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ batchNorm3d_ }); +//# sourceMappingURL=batchnorm3d.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js": +/*!********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js ***! + \********************************************************************/ +/*! exports provided: batchNorm4d */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "batchNorm4d", function() { return batchNorm4d; }); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _batchnorm__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./batchnorm */ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); + + + + +/** + * Batch normalization, strictly for 4D. For the more relaxed version, see + * `tf.batchNorm`. + * + * @param x The input Tensor. + * @param mean A mean Tensor. + * @param variance A variance Tensor. + * @param offset An offset Tensor. + * @param scale A scale Tensor. + * @param varianceEpsilon A small float number to avoid dividing by 0. + */ +function batchNorm4d_(x, mean, variance, offset, scale, varianceEpsilon) { + const $x = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(x, 'x', 'batchNorm'); + const $mean = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(mean, 'mean', 'batchNorm'); + const $variance = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(variance, 'variance', 'batchNorm'); + let $scale; + if (scale != null) { + $scale = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(scale, 'scale', 'batchNorm'); + } + let $offset; + if (offset != null) { + $offset = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(offset, 'offset', 'batchNorm'); + } + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($x.rank === 4, () => `Error in batchNorm4D: x must be rank 4 but got rank ` + + `${$x.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($mean.rank === 4 || $mean.rank === 1, () => `Error in batchNorm4D: mean must be rank 4 or rank 1 but ` + + `got rank ${$mean.rank}.`); + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($variance.rank === 4 || $variance.rank === 1, () => `Error in batchNorm4D: variance must be rank 4 or rank 1 ` + + `but got rank ${$variance.rank}.`); + if ($scale != null) { + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($scale.rank === 4 || $scale.rank === 1, () => `Error in batchNorm4D: scale must be rank 4 or rank 1 ` + + `but got rank ${$scale.rank}.`); + } + if ($offset != null) { + _util__WEBPACK_IMPORTED_MODULE_1__["assert"]($offset.rank === 4 || $offset.rank === 1, () => `Error in batchNorm4D: offset must be rank 4 or rank 1 ` + + `but got rank ${$offset.rank}.`); + } + return Object(_batchnorm__WEBPACK_IMPORTED_MODULE_2__["batchNorm"])($x, $mean, $variance, $offset, $scale, varianceEpsilon); +} +const batchNorm4d = Object(_operation__WEBPACK_IMPORTED_MODULE_3__["op"])({ batchNorm4d_ }); +//# sourceMappingURL=batchnorm4d.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js ***! + \***********************************************************************/ +/*! exports provided: xAs4D */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "xAs4D", function() { return xAs4D; }); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); + +function xAs4D(x) { + let x4D; + if (x.rank === 0 || x.rank === 1) { + x4D = Object(_reshape__WEBPACK_IMPORTED_MODULE_0__["reshape"])(x, [1, 1, 1, x.size]); + } + else if (x.rank === 2) { + x4D = Object(_reshape__WEBPACK_IMPORTED_MODULE_0__["reshape"])(x, [1, 1, x.shape[0], x.shape[1]]); + } + else if (x.rank === 3) { + x4D = Object(_reshape__WEBPACK_IMPORTED_MODULE_0__["reshape"])(x, [1, x.shape[0], x.shape[1], x.shape[2]]); + } + else { + x4D = x; + } + return x4D; +} +//# sourceMappingURL=batchnorm_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/binary_ops.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/binary_ops.js ***! + \*******************************************************************/ +/*! exports provided: addStrict, divStrict, maximumStrict, minimumStrict, modStrict, mulStrict, powStrict, squaredDifferenceStrict, subStrict */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addStrict", function() { return addStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divStrict", function() { return divStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "maximumStrict", function() { return maximumStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumStrict", function() { return minimumStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modStrict", function() { return modStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mulStrict", function() { return mulStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "powStrict", function() { return powStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDifferenceStrict", function() { return squaredDifferenceStrict; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subStrict", function() { return subStrict; }); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../globals */ "./node_modules/@tensorflow/tfjs-core/dist/globals.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _add__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./add */ "./node_modules/@tensorflow/tfjs-core/dist/ops/add.js"); +/* harmony import */ var _div__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./div */ "./node_modules/@tensorflow/tfjs-core/dist/ops/div.js"); +/* harmony import */ var _maximum__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./maximum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js"); +/* harmony import */ var _minimum__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./minimum */ "./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js"); +/* harmony import */ var _mod__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./mod */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js"); +/* harmony import */ var _mul__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./mul */ "./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _pow__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./pow */ "./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js"); +/* harmony import */ var _squared_difference__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./squared_difference */ "./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js"); +/* harmony import */ var _sub__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./sub */ "./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + + + + + + +/** + * @deprecated + * Adds two `tf.Tensor`s element-wise, A + B. + * + * Inputs must be the same shape. For broadcasting support, use add() instead. + * + * @param a The first Tensor to add element-wise. + * @param b The second Tensor to add element-wise. + */ +function addStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'addStrict'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'addStrict'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in addStrict: '); + return Object(_add__WEBPACK_IMPORTED_MODULE_3__["add"])($a, $b); +} +/** + * @deprecated + * Subtracts two `tf.Tensor`s element-wise, A - B. Inputs must + * be the same shape. + * + * For broadcasting support, use `tf.sub` instead. + * + * @param a The first Tensor to subtract element-wise. + * @param b The second Tensor to subtract element-wise. + */ +function subStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'subStrict'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'subStrict'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in subStrict: '); + return Object(_sub__WEBPACK_IMPORTED_MODULE_12__["sub"])($a, $b); +} +/** + * @deprecated + * Computes the power of one `tf.Tensor` to another. Inputs must + * be the same shape. + * + * For broadcasting support, use `tf.pow` instead. + * + * @param base The base tensor to pow element-wise. + * @param exp The exponent tensor to pow element-wise. + */ +function powStrict_(base, exp) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"](base.shape, exp.shape, 'Error in powStrict: '); + return Object(_pow__WEBPACK_IMPORTED_MODULE_10__["pow"])(base, exp); +} +/** + * @deprecated + * Multiplies two `tf.Tensor`s element-wise, A * B. + * + * Inputs must be the same shape. For broadcasting support, use `tf.mul`. + * + * @param a The first tensor to multiply. + * @param b The first tensor to multiply. Must have the same + * dtype as `a`. + */ +function mulStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'mul'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'mul'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in multiplyStrict: '); + return Object(_mul__WEBPACK_IMPORTED_MODULE_8__["mul"])($a, $b); +} +/** + * @deprecated + * Divides two `tf.Tensor`s element-wise, A / B. Inputs must + * be the same shape. + * + * @param a The first tensor as the numerator for element-wise division. + * @param b The second tensor as the denominator for element-wise division. + */ +function divStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'div'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'div'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in divideStrict: '); + return Object(_div__WEBPACK_IMPORTED_MODULE_4__["div"])($a, $b); +} +/** + * @deprecated + * Returns the mod of a and b (`a < b ? a : b`) element-wise. Inputs must + * be the same shape. For broadcasting support, use mod(). + * + * @param a The first tensor. + * @param b The second tensor. Must have the same dtype as `a`. + */ +function modStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'modStrict'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'modStrict'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in modStrict: '); + return Object(_mod__WEBPACK_IMPORTED_MODULE_7__["mod"])($a, $b); +} +/** + * @deprecated + * Returns the min of a and b (`a < b ? a : b`) element-wise. Inputs must + * be the same shape. For broadcasting support, use minimum(). + * + * @param a The first tensor. + * @param b The second tensor. Must have the same dtype as `a`. + */ +function minimumStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'minimumStrict'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'minimumStrict'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in minimumStrict: '); + return Object(_minimum__WEBPACK_IMPORTED_MODULE_6__["minimum"])($a, $b); +} +/** + * @deprecated + * Returns the max of a and b (`a > b ? a : b`) element-wise. Inputs must + * be the same shape. For broadcasting support, use maximum(). + * + * @param a The first tensor. + * @param b The second tensor. Must have the same dtype as `a`. + */ +function maximumStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'maximumStrict'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'maximumStrict'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in maximumStrict: '); + return Object(_maximum__WEBPACK_IMPORTED_MODULE_5__["maximum"])($a, $b); +} +/** + * @deprecated + * Returns (a - b) * (a - b) element-wise. + * + * Inputs must be the same shape. For broadcasting support, use + * `tf.squaredDifference` instead. + * + * @param a The first tensor. + * @param b The second tensor. Must have the same type as `a`. + */ +function squaredDifferenceStrict_(a, b) { + Object(_globals__WEBPACK_IMPORTED_MODULE_0__["deprecationWarn"])('strict variants of ops have been deprecated ' + + 'and will be removed in future'); + const $a = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(a, 'a', 'squaredDifferenceStrict'); + const $b = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_1__["convertToTensor"])(b, 'b', 'squaredDifferenceStrict'); + _util__WEBPACK_IMPORTED_MODULE_2__["assertShapesMatch"]($a.shape, $b.shape, 'Error in squaredDifferenceStrict: '); + return Object(_squared_difference__WEBPACK_IMPORTED_MODULE_11__["squaredDifference"])($a, $b); +} +const addStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ addStrict_ }); +const divStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ divStrict_ }); +const maximumStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ maximumStrict_ }); +const minimumStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ minimumStrict_ }); +const modStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ modStrict_ }); +const mulStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ mulStrict_ }); +const powStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ powStrict_ }); +const squaredDifferenceStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ squaredDifferenceStrict_ }); +const subStrict = Object(_operation__WEBPACK_IMPORTED_MODULE_9__["op"])({ subStrict_ }); +//# sourceMappingURL=binary_ops.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js ***! + \*********************************************************************/ +/*! exports provided: booleanMaskAsync */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "booleanMaskAsync", function() { return booleanMaskAsync; }); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./node_modules/@tensorflow/tfjs-core/dist/util.js"); +/* harmony import */ var _gather__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./gather */ "./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/* harmony import */ var _squeeze__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./squeeze */ "./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js"); +/* harmony import */ var _where_async__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./where_async */ "./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js"); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +/** + * Apply boolean mask to tensor. + * + * ```js + * const tensor = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]); + * const mask = tf.tensor1d([1, 0, 1], 'bool'); + * const result = await tf.booleanMaskAsync(tensor, mask); + * result.print(); + * ``` + * + * @param tensor N-D tensor. + * @param mask K-D boolean tensor, K <= N and K must be known statically. + * @param axis A 0-D int Tensor representing the axis in tensor to mask from. + * By default, axis is 0 which will mask from the first dimension. + * Otherwise K + axis <= N. + * + * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'} + */ +async function booleanMaskAsync_(tensor, mask, axis) { + const $tensor = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(tensor, 'tensor', 'boolMask'); + const $mask = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_0__["convertToTensor"])(mask, 'mask', 'boolMask', 'bool'); + const axisFrom = axis == null ? 0 : axis; + const maskDim = $mask.rank; + const tensorShape = $tensor.shape; + _util__WEBPACK_IMPORTED_MODULE_1__["assert"](maskDim > 0, () => 'mask cannot be scalar'); + _util__WEBPACK_IMPORTED_MODULE_1__["assertShapesMatch"](tensorShape.slice(axisFrom, axisFrom + maskDim), $mask.shape, `mask's shape must match the first K dimensions of tensor's shape,`); + let leadingSize = 1; + for (let i = axisFrom; i < axisFrom + maskDim; i++) { + leadingSize *= tensorShape[i]; + } + const targetTensorShape = tensorShape.slice(0, axisFrom) + .concat([leadingSize], tensorShape.slice(axisFrom + maskDim)); + const reshapedTensor = Object(_reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])($tensor, targetTensorShape); + const reshapedMask = Object(_reshape__WEBPACK_IMPORTED_MODULE_3__["reshape"])($mask, [-1]); + const positivePositions = await Object(_where_async__WEBPACK_IMPORTED_MODULE_5__["whereAsync"])(reshapedMask); + const indices = Object(_squeeze__WEBPACK_IMPORTED_MODULE_4__["squeeze"])(positivePositions, [1]); + const res = Object(_gather__WEBPACK_IMPORTED_MODULE_2__["gather"])(reshapedTensor, indices, axisFrom); + // Ensure no memory leak. + if (tensor !== $tensor) { + $tensor.dispose(); + } + if (mask !== $mask) { + $mask.dispose(); + } + indices.dispose(); + reshapedTensor.dispose(); + reshapedMask.dispose(); + positivePositions.dispose(); + return res; +} +const booleanMaskAsync = booleanMaskAsync_; +//# sourceMappingURL=boolean_mask.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js ***! + \*********************************************************************/ +/*! exports provided: broadcastTo */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "broadcastTo", function() { return broadcastTo; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _clone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./clone */ "./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _reshape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reshape */ "./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js"); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + +/** + * Broadcast an array to a compatible shape NumPy-style. + * + * The tensor's shape is compared to the broadcast shape from end to beginning. + * Ones are prepended to the tensor's shape until is has the same length as + * the broadcast shape. If input.shape[i]==shape[i], the (i+1)-th axis is + * already broadcast-compatible. If input.shape[i]==1 and shape[i]==N, then + * the input tensor is tiled N times along that axis (using tf.tile). + * + * @param input The tensor that is to be broadcasted. + * @param shape The input is to be broadcast to this shape. + * + * @doc {heading: 'Tensors', subheading: 'Transformations'} + */ +function broadcastTo_(x, shape) { + let input = Object(_tensor_util_env__WEBPACK_IMPORTED_MODULE_2__["convertToTensor"])(x, 'broadcastTo', 'x'); + const xShape = input.shape; + if (shape.some(d => !(d > 0) || d % 1 !== 0)) { + throw new Error(`broadcastTo(): Invalid broadcast shape [${shape}].`); + } + if (shape.length < input.rank) { + throw new Error(`broadcastTo(): shape.length=${shape.length} < input.rank=${input.rank}.`); + } + if (shape.length > input.rank) { + const newShape = input.shape.slice(); + while (newShape.length < shape.length) { + newShape.unshift(1); + } + input = Object(_reshape__WEBPACK_IMPORTED_MODULE_5__["reshape"])(input, newShape); + } + const inputShape = input.shape; + const reps = Array.from(shape); + for (let i = shape.length - 1; i >= 0; i--) { + if (inputShape[i] === shape[i]) { + reps[i] = 1; + } + else if (input.shape[i] !== 1) { + throw new Error(`broadcastTo(): [${xShape}] cannot be broadcast to [${shape}].`); + } + } + const axes = reps.map((n, i) => n > 1 ? i : -1).filter(i => i >= 0); + if (axes.length === 0) { + return Object(_clone__WEBPACK_IMPORTED_MODULE_3__["clone"])(input); + } + const forward = (backend) => backend.tile(input, reps); + const inputs = { x: input }; + const attrs = { shape, inputShape }; + return _engine__WEBPACK_IMPORTED_MODULE_0__["ENGINE"].runKernelFunc(forward, inputs, null /* grad */, _kernel_names__WEBPACK_IMPORTED_MODULE_1__["BroadcastTo"], attrs); +} +const broadcastTo = Object(_operation__WEBPACK_IMPORTED_MODULE_4__["op"])({ broadcastTo_ }); +//# sourceMappingURL=broadcast_to.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js ***! + \***********************************************************************/ +/*! exports provided: getBroadcastDims, getReductionAxes, assertAndGetBroadcastShape */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBroadcastDims", function() { return getBroadcastDims; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getReductionAxes", function() { return getReductionAxes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assertAndGetBroadcastShape", function() { return assertAndGetBroadcastShape; }); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +/** + * Returns the dimensions in the input shape that are broadcasted to + * produce the provided output shape. + * + * The returned dimensions are 0-indexed and sorted. An example: + * inShape = [4, 1, 3] + * outShape = [5, 4, 3, 3] + * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3. + */ +function getBroadcastDims(inShape, outShape) { + const inRank = inShape.length; + const dims = []; + for (let i = 0; i < inRank; i++) { + const dim = inRank - 1 - i; + const a = inShape[dim] || 1; + const b = outShape[outShape.length - 1 - i] || 1; + if (b > 1 && a === 1) { + dims.unshift(dim); + } + } + return dims; +} +/** + * Returns the axes in the output space that should be reduced to produce + * the input space. + */ +function getReductionAxes(inShape, outShape) { + const result = []; + for (let i = 0; i < outShape.length; i++) { + const inDim = inShape[inShape.length - i - 1]; + const outAxis = outShape.length - i - 1; + const outDim = outShape[outAxis]; + if (inDim == null || (inDim === 1 && outDim > 1)) { + result.unshift(outAxis); + } + } + return result; +} +function assertAndGetBroadcastShape(shapeA, shapeB) { + const result = []; + const l = Math.max(shapeA.length, shapeB.length); + for (let i = 0; i < l; i++) { + let a = shapeA[shapeA.length - i - 1]; + if (a == null) { + a = 1; + } + let b = shapeB[shapeB.length - i - 1]; + if (b == null) { + b = 1; + } + if (a === 1) { + result.unshift(b); + } + else if (b === 1) { + result.unshift(a); + } + else if (a !== b) { + const errMsg = `Operands could not be broadcast together with shapes ` + + `${shapeA} and ${shapeB}.`; + throw Error(errMsg); + } + else { + result.unshift(a); + } + } + return result; +} +//# sourceMappingURL=broadcast_util.js.map + +/***/ }), + +/***/ "./node_modules/@tensorflow/tfjs-core/dist/ops/browser.js": +/*!****************************************************************!*\ + !*** ./node_modules/@tensorflow/tfjs-core/dist/ops/browser.js ***! + \****************************************************************/ +/*! exports provided: toPixels, fromPixels */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toPixels", function() { return toPixels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromPixels", function() { return fromPixels; }); +/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../engine */ "./node_modules/@tensorflow/tfjs-core/dist/engine.js"); +/* harmony import */ var _kernel_names__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../kernel_names */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js"); +/* harmony import */ var _kernel_registry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../kernel_registry */ "./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js"); +/* harmony import */ var _tensor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tensor */ "./node_modules/@tensorflow/tfjs-core/dist/tensor.js"); +/* harmony import */ var _tensor_util_env__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tensor_util_env */ "./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js"); +/* harmony import */ var _cast__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./cast */ "./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js"); +/* harmony import */ var _operation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./operation */ "./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js"); +/* harmony import */ var _tensor3d__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tensor3d */ "./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js"); +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + + + + + + + + +let fromPixels2DContext; +/** + * Creates a `tf.Tensor` from an image. + * + * ```js + * const image = new ImageData(1, 1); + * image.data[0] = 100; + * image.data[1] = 150; + * image.data[2] = 200; + * image.data[3] = 255; + * + * tf.browser.fromPixels(image).print(); + * ``` + * + * @param pixels The input image to construct the tensor from. The + * supported image types are all 4-channel. You can also pass in an image + * object with following attributes: + * `{data: Uint8Array; width: number; height: number}` + * @param numChannels The number of channels of the output tensor. A + * numChannels value less than 4 allows you to ignore channels. Defaults to + * 3 (ignores alpha channel of input image). + * + * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true} + */ +function fromPixels_(pixels, numChannels = 3) { + // Sanity checks. + if (numChannels > 4) { + throw new Error('Cannot construct Tensor with more than 4 channels from pixels.'); + } + if (pixels == null) { + throw new Error('pixels passed to tf.browser.fromPixels() can not be null'); + } + let isPixelData = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + if (pixels.data instanceof Uint8Array) { + isPixelData = true; + } + else if (typeof (ImageData) !== 'undefined' && pixels instanceof ImageData) { + isImageData = true; + } + else if (typeof (HTMLVideoElement) !== 'undefined' && + pixels instanceof HTMLVideoElement) { + isVideo = true; + } + else if (typeof (HTMLImageElement) !== 'undefined' && + pixels instanceof HTMLImageElement) { + isImage = true; + // tslint:disable-next-line: no-any + } + else if (pixels.getContext != null) { + isCanvasLike = true; + } + else { + throw new Error('pixels passed to tf.browser.fromPixels() must be either an ' + + `HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData ` + + `in browser, or OffscreenCanvas, ImageData in webworker` + + ` or {data: Uint32Array, width: number, height: number}, ` + + `but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && + pixels.readyState < + HAVE_CURRENT_DATA_READY_STATE) { + throw new Error('The video element has not loaded data yet. Please wait for ' + + '`loadeddata` event on the !8Bh*Eb|EqABpP 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