From 1c06a725369c6b98a2c5dab2d1b29fff2ffd8ee8 Mon Sep 17 00:00:00 2001 From: Jonas Loos <33965649+JonasLoos@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:18:57 +0100 Subject: [PATCH] split representations by stesps, i.e. fix #1 --- generate-reprs.ipynb | 5 ++++- index.html | 13 +++++------- worker/pkg/worker.js | 20 +++++++----------- worker/pkg/worker_bg.wasm | Bin 80056 -> 66749 bytes worker/src/lib.rs | 43 ++++++++++++++++---------------------- worker/webworker.js | 8 +++---- 6 files changed, 38 insertions(+), 51 deletions(-) diff --git a/generate-reprs.ipynb b/generate-reprs.ipynb index 46d419a..5935f40 100644 --- a/generate-reprs.ipynb +++ b/generate-reprs.ipynb @@ -13,7 +13,7 @@ "metadata": {}, "outputs": [], "source": [ - "from diffusers import AutoPipelineForText2Image, AutoencoderKL\n", + "from diffusers import AutoPipelineForText2Image\n", "import torch\n", "import numpy as np\n", "from pathlib import Path\n", @@ -154,6 +154,9 @@ "\n", " # save representations\n", " for pos, reprs in representations.items():\n", + " for j, repr in enumerate(reprs, 0):\n", + " with open(save_path / f'repr-{pos}-{j}.bin', 'wb') as f:\n", + " f.write(np.array(repr, dtype=np.float16).tobytes())\n", " with open(save_path / f'repr-{pos}.bin', 'wb') as f:\n", " f.write(np.array(np.stack(reprs), dtype=np.float16).tobytes())\n", "\n", diff --git a/index.html b/index.html index def357c..8260f1e 100644 --- a/index.html +++ b/index.html @@ -224,13 +224,13 @@

H-Space similarity explorer

concept.image_ctx = concept.image_canvas.getContext('2d'); concept.tile_ctx = concept.tile_canvas.getContext('2d'); - concept.getUrl = () => `${window.location.pathname.split('/').slice(0, -1).join('/')}/representations/${current_model.short}/${concept.name}/repr-${current_position}.bin`; + concept.getUrl = () => `${window.location.pathname.split('/').slice(0, -1).join('/')}/representations/${current_model.short}/${concept.name}/repr-${current_position}-${concept.step-1}.bin`; // helper function to load the representation const getRepr = () => { concept.repr_loading_started = Date.now(); const { steps, n, m } = current_model.getShapes(); - callWasm('fetch_repr', { url: concept.getUrl(), steps, n, m }) + callWasm('fetch_repr', { url: concept.getUrl(), n, m }) .then(() => { console.log(`Fetched repr for ${concept.name} from ${concept.getUrl()}`); updateCanvasesWithLastClicked(); @@ -310,11 +310,8 @@

H-Space similarity explorer

// slider event listener slider.addEventListener('input', event => { - const value = event.target.value; - slider_value.textContent = value; - concept.step = value; - concept.img.src = `representations/${current_model.short}/${concept.name}/${concept.step}.jpg`; - updateCanvasesWithLastClicked(); + concept.step = event.target.value; + concept.update(); }); // concept name select event listener @@ -432,7 +429,7 @@

H-Space similarity explorer

img_ctx.fillRect(last_clicked.col * tile_size, last_clicked.row * tile_size, tile_size, tile_size); } // update tile canvas - callWasm('calc_similarities', { func, repr1_str: base_concept.getUrl(), repr2_str: concept.getUrl(), step1: base_concept.step-1, step2: concept.step-1, row, col }) + callWasm('calc_similarities', { func, repr1_str: base_concept.getUrl(), repr2_str: concept.getUrl(), row, col }) .then((similarities) => { if (similarities === 'loading') { drawError(concept, 'Loading...'); diff --git a/worker/pkg/worker.js b/worker/pkg/worker.js index 6ee050c..c03bed2 100644 --- a/worker/pkg/worker.js +++ b/worker/pkg/worker.js @@ -228,13 +228,11 @@ function getArrayF32FromWasm0(ptr, len) { * @param {string} func * @param {string} repr1_str * @param {string} repr2_str -* @param {number} step1 -* @param {number} step2 * @param {number} row * @param {number} col * @returns {Float32Array} */ -export function calc_similarities(func, repr1_str, repr2_str, step1, step2, row, col) { +export function calc_similarities(func, repr1_str, repr2_str, row, col) { try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); const ptr0 = passStringToWasm0(func, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); @@ -243,7 +241,7 @@ export function calc_similarities(func, repr1_str, repr2_str, step1, step2, row, const len1 = WASM_VECTOR_LEN; const ptr2 = passStringToWasm0(repr2_str, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len2 = WASM_VECTOR_LEN; - wasm.calc_similarities(retptr, ptr0, len0, ptr1, len1, ptr2, len2, step1, step2, row, col); + wasm.calc_similarities(retptr, ptr0, len0, ptr1, len1, ptr2, len2, row, col); var r0 = getInt32Memory0()[retptr / 4 + 0]; var r1 = getInt32Memory0()[retptr / 4 + 1]; var r2 = getInt32Memory0()[retptr / 4 + 2]; @@ -261,15 +259,14 @@ export function calc_similarities(func, repr1_str, repr2_str, step1, step2, row, /** * @param {string} url -* @param {number} steps * @param {number} n * @param {number} m * @returns {Promise} */ -export function fetch_repr(url, steps, n, m) { +export function fetch_repr(url, n, m) { const ptr0 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; - const ret = wasm.fetch_repr(ptr0, len0, steps, n, m); + const ret = wasm.fetch_repr(ptr0, len0, n, m); return takeObject(ret); } @@ -280,7 +277,7 @@ function handleError(f, args) { wasm.__wbindgen_exn_store(addHeapObject(e)); } } -function __wbg_adapter_57(arg0, arg1, arg2, arg3) { +function __wbg_adapter_55(arg0, arg1, arg2, arg3) { wasm.wasm_bindgen__convert__closures__invoke2_mut__h493f10fe887c5e99(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); } @@ -381,9 +378,6 @@ function __wbg_get_imports() { imports.wbg.__wbg_log_79d3c56888567995 = function(arg0) { console.log(getObject(arg0)); }; - imports.wbg.__wbg_warn_2a68e3ab54e55f28 = function(arg0) { - console.warn(getObject(arg0)); - }; imports.wbg.__wbg_newwithstrandinit_11fbc38beb4c26b0 = function() { return handleError(function (arg0, arg1, arg2) { const ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2)); return addHeapObject(ret); @@ -456,7 +450,7 @@ function __wbg_get_imports() { const a = state0.a; state0.a = 0; try { - return __wbg_adapter_57(a, state0.b, arg0, arg1); + return __wbg_adapter_55(a, state0.b, arg0, arg1); } finally { state0.a = a; } @@ -512,7 +506,7 @@ function __wbg_get_imports() { const ret = wasm.memory; return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper274 = function(arg0, arg1, arg2) { + imports.wbg.__wbindgen_closure_wrapper266 = function(arg0, arg1, arg2) { const ret = makeMutClosure(arg0, arg1, 45, __wbg_adapter_20); return addHeapObject(ret); }; diff --git a/worker/pkg/worker_bg.wasm b/worker/pkg/worker_bg.wasm index c76407606005c259e4dd6aef41026171f326aeea..78ce693bf99ef1dcf1b7c58b4a65dd8f13322652 100644 GIT binary patch literal 66749 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 literal 80056 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⪚qQ>Hmfg{m%6=>Wkakfm2&M?Pj0! z&#Jg?mjCha@z2>qyvsj+E_r;LC^(FNKY6@B8h#i*n>?QHRp7t&kJg=vYI?oU}l{GRb_IH)R-Lr2^haf!OqUSgg!~Hv7_sSwMfKK30{GJB~&`!Z&G@)2d`3C_?NcXeqXxICh6j9@>V*4_ia9z}-5o_q}7Mi^Ztp zfZwEpcWJxqKXZ_&7qA~&Ppj8TfYl_2fkqYaCXbKJiCP;0 zy*V!k(6MZgd(=+Ijuj8`ARFk86iDn!X~+)JGkscC9v?NPUcsa%A;Xi*Vu}SM6Oic? zW$qGaR;)Qd3+BMC=KF0NYZSlysMj|CbKpWjMGQMMhlL)I15!^6r~Se*F&V@1IOx$y zzAels)-;a|4Tz%V!*CzbVIJ%0!xPeH70N^sG8j`5QJ55V#$QoQoYZY^&g+#0XxT>y zRG(}^u9j?il|2?B!#pZ?V5{DTPs{!j3L^&rtnV&CUifq3XYfJ+;p9#`JmDvoXG;H( z$LEj|GVLzm(l+fb=3@RStP!!Ij`$nDCZ?3*?rDSoJTZP5pRQ^&fI52wxK_J8#7Ait z3GfnXqhfG9wQ$|mpDFX(Pj=O$A_I7h~py&{eVXqQyn#)@H1m(-tn=Sr@>fAYmSdMk*EC=_vKCH z&;P`Ix&6(QHD3$86xCKfAerPFNzONKz!MaoRmYI?(|O zXHmrlgSIQ(pXt@NiH2;4%0=AG!0u>+?&M=b#Jfb`fscFP5Wf38WmAgxZyJZPi7AOK zh>tAHYCZc!rE|G`c++m9VKmRo`_Ga;KHr=7>XB(^zb=hyGtW)=EihBR1j{x!t`Qv% z5(}QI${Ecql6hCNGYAo};H(8}()Cj@)J?2bEW6226ZWeL{X1QarT$US>iIRzSc<7h z=XCY3G*~&m2iaH#keIB)ybB~5uYt=M0+=2liD@#IUWw-!r@-S+fgnz@KfYO40<*eK zkg1O)g};d58uC*4~*`28N~Z&8QFr zqjXoz`#?&*SE26}J0Tbxy6AI!|1VJ2JK|%XrbCK@I7#YbBmoih?J3JBYXZa$3<94J z-6g~6F%-@ui#CBI$Ry+1VRg_4`!i}QNtKeI3^{mz=MbQo9x<5K_%hS{uZRi;=Y z8Rw?gDIQOyWWVr6dB8ss?Y|)JuGov>pExzPlime3a~V5ul`SI~PEi1y{s+*11_O#) z^or0cSSi0{AkxV%$QX^b({?fpLwpp20nV^E*Z4iy1e+HtFiWS#{;<;@CXQWUX9rUW zWbksp#)-N}uCM{6MNA_hI%I)7o2f&Y0cOr=vAx=Rwh;@<0kvCumPq*yHQ%{r<8H+hYhUpo_PZ%x1(F16pDpS z!=<}7kn@eZE`K($-O&))0-6!V?V;8xCd`(J$b4ZR+DC$3IxgOy$OF$Wb)bX^t&gL` z#>0uwq7W?x`MMNJx@hhnO^LPsGg?m$9400#4thevj^}>vIFaIJ^QWqQ?%mM2ScLbS z8@qr))Z!$UT8!biVd9h`r3uLCY2AUKkCWVYK)^&A2$&LA=?rE-BDMVA$=Hw3OLjt* za4lVkWR$&*xDIo-iSd{~+UV^{Xcqtnx+PejR*SK5HM@v+sZYu#$r+GTP@(=T_Co38 zP@!Uw5jKVfB%6IG8SKR2qC`D>f{$d_NCM^qhmcR{qC2I9@I{TgN`;tHgA-p9&xd>) zVf@E@=;I0q#O;oI3q-lhB|=HuU52WnEyv^>F-M4B8b!f*@wCwUMSe~#TOU{f?W*nV znYK0;;Ksp4w3xd|!{f9;4YL?DeeWjkAFZ=D%|iu9GkU_C{H8bbwFiO`C?rI&IBIxIn%@9|XS97kCmEoq2UkaHZp-QF%7l-sZF+md1ijV9;%e zXaH4Z@86l5Gf*yU0&-ut)a&Ap; z2!x!fKb$xvdSu%$(2j60P`I7li&$SKGC&`c1=$`y_hrdyj>e4toa-o=+7YtabyRmb z?k4TdZ*8PtYF6_7YY2MH=ouQufdT@bF!&~NfyJ9lw#yzFIXXec4vb4I2Wv&0lF{pX znt|wIb6CN11sM(*w2tE7()-KEl0n}Qe7Li70eR789rsGIb+YVhlWk>SmgcztJWK&L zFauwKS+F;WVnZNNp}1e!O6}UiG`{bC)TP}re-`{`3z8b`c5kF)Z>Oe&vfe~m$}TwM z8NfnGj=zPL2#Okhrd$o>S}=f>{3qc-H+O)i&ol8WMAr$^(w%&}mvO}x@;#Cpgm^Un z^^lJ?#BahxOG^l%ViSD~pkf#8E^7gc*$*{GGGQyKUenPDzm@JOLVnnM&0?w-8>{7} zkA`SPW2x2gcpYeBg zHO<=3*pZ8^ai?9tsLPB;W>bds!CNAG{g}eAK{yhnh6LQfBiD<+rZ%A~#NW5O#60@! z;|V$)Xd*>G0WvW?HlTV4PlNdJUsnN&ar!P-4SmoQt3fYD9xr|0#&dj4WN;W%@%;Javh=*(Qe#wE* zhWocN*h%5u_$kloFqO~ifiWd`ok{T;To;C0C0?L|MOqx6+u4#lOp~uCrb54}Nr5On z$N4QeniaI<2$LK-RMqFWpe2WIh;XLapiOmXlT!lI0ATJy<%a^XDWqXYxwF+(j+u@4 zUdX+%iuEq!Ar<1DLk%GGj%5v|4TQdt%GyR)PNs?S=_Ie1N*0nIBT_hXox6k@ZLu5ICloxngxTBMsZ& zLnbx|b??Zy?A|7+oPxu?@_5Q&AGf=N!yfz6anBKdJ8aHLSWn~N%0T<*L1_}H43&iL zG1HbLbUo>Hd$U+fSrF(o_9f%Z++6sBUXX)J{vdh+q>M$YFcfTKA3nd@jJv|msN|OjI+{w6_wNZCS zn|=ov`rVG)9kOqfqZ<-34Dqu5vD4)maN*u4(}Gx;#RzOR&QBM`fF22Y89Hz&a@lXn zP;coolSc7_=uEM!YV)VcNX@`=X@~amkUT|`jPS+bm(^%EAxJL)$696N-Wzd#tzx5h z#WJ}ws#sLh%j=7YNwQ}FXlMM_j9qL>Ip;H|l3wH#{97&+OYl70*$`p^q+Vvh@blzC2Ly;3d3ZmKC`QtR;!XWv`An&!&8$eE}SPZVEAJOLe z-KdjV+cY*W{|AQM`?_pwtY*|VwO!wT_4BX(ee>8_eo%6U?|VyccWRs&Y5oO2zFXH1 z@6KLq9o%WWZZm~8KmIH_NX+p@t>l}1i&bDg9U#*}*x4uBnXXxn;(={$k-!G;a__=1 z334k&hb_5(_>;H-SQ?T^7X5O)PN#&K_sTe4JK>3TtORREJ)y_Mc!0jpPwl#zZWf8g z=sHltr$C`l5+2M5cPM^h|Bo)WDbl>t&W?gIuGz-Iiu80SZEV2w4&fFYLBby7s*ssM z_%uad#|z>zI5$i6z>92cfyA#G*IcD5xH6w8p{(<)w0Sg-#)i-?>4C5Kg!&-o3Xz8E(5PhxNbL=0m|Q?0=r08n`~EY=VcIR0EQGm~w5Ugn;=BacoAHFXq3m{hXFi48P1!8e zWg|q}=&__vlL(C=qYdP~AzcwT3}xlsW&Y0Go@`3dR=zLn0@zRE_~76C^yh!dSMun+ zFFo`#|LdVge}`uiVQ$}FeeOHYzxbzL`y7ka0OY>^^GDzQ?|=1&PyX(R5~#@OU)%>jFob(I)6%uRDdpm!FXq4b%8Knt6O<~7RkqE&@nN7i$z;;(= zubqbV)s8UBxuKEMfvVdm4Yv+Xsrc=h2Z*-qd*Dyqtqj$+p6viDvzK9Kvv7jxnEPL3 zIj_&WbAx_IHP&D+f>4SSSkiuFq}!B&X(WZw zZrk_6Z+?65_Go+0HVc~Fu5$mviPPW;m*${W+!^s+plsHdIc3SrVnK&nja9am0Bvq) zqYxsL!#S-YgC9!sm>^Ela~AA#usRC1*vQ2+j43O(o9S?1Mzn1&$CGdMEMF>i+g-ao zyEG+3LMK2nl5;0jaM8Z}oKKZI7I??)R=sTN&C=4-q{OV&_6j6t6L;u1Z=Q^P7xmBq z)ghZH@>QWQsVX>7QdPw9oQpUVdR(}dL3K8fA#YW8oR>#i_5xZVrlo?xR9rUPJFT>?mH`O2@VsX{*$9{z!}3A|U~@?k;fB60uOxy%QL(Q7A2CJ9$=NNxG;twA!Ry z53D5V7@+D2HnmcGX=5u1AGc16JNrIT)`ljlZkO2`gE35T>Uhz#%8i8?Frx4}@j2@h z`{&Se3oDdO#4kL2+{NuVl)J5}Fo@rgdwX_^ z-R9nw<`h%4%o>rR@U90r*5pc!U12?nyCYPT)rYz=1! z(eu_kf+%Z#M?IU-Mv;-u6)L2iZAdZ@hIT6O zn%N6{I6a7GFt#w_b?9fb)F$J<&?vwrWK)ZJK}IVFL<96xBzTivFmdlAOS{fxjyY_! zYsq%Np&)?*H6<}OZ1s&`0McmPqDZJGJfRxj+{k6$MSDXagBT={FdtGGirlgArGq$jEJ@*2#0yM0pa{M zL+c1pK^yoA z7ge!@Yv4qT832tIQ<7SU$9~%JOES-yhV^QRcF5!~GMrzCZ1_tz_^Ors`!YUSkBM-b z9(EiDl-_}cib{FT<{I!9f|6RpqUZ*#6!Sat{kgS>H-47XC3BI$j;zc<4sCNZj2hYP z2smcqqv+K!OjS*R6ct#a#pTldGmhuHo|~r?QLugKgHx--K9%S((K8xTw~`&*6t}6( zMAmJmd&xpsylPrk_a4)!yPF!4sAbe9nPqLmB@dQKz0=|x`e2LglcQ8@-LIe1VleiE zQE!)y(CqpmUIKg%Tg>{VSFnJs%w%EACr9Mjq6;2(_A(4Y{r`cwwI|)D8N26ic}}bj zP%YLmY37Kg8@WtxN6tJ0T}UDd>4vVMK@*XoYD1cBstuMaHPmc7rqI~=)#NaoNL~Xg zS|!AUY{~tuGGfiWk&7KcEHjfUaD+SKPwc$Xfu4z0tD791AUWlzzk%1J<%x~CN1!LW z0fU`b@{a@xnU-3>1FV1?oifYWu+C;~IyA`=`rTy^kMVJ|(s;t!6u+$dXMl`$-LldY zLY2+9Ae+5!IODKtj=SvdTrjv$T`mn4>a%l$1I0pZzB*Vd&6n$q+L6I}tvFb&%$DvR zDAo#%QhlIY?H`{TnwT9Po|!2Ojpg%0bAy%HLakOf(w`p~8XFk*d6rj}4lb7(3)R{B zK&^fjYM3oAmn!vgwL)W;t81l$g}ckD$~iaVa&D39JNX6t9M3cSe{tyCMJ>-)bB`OC zKmWZy`Ccq6EtO`YLpPV|t4odP>D9{NT4AMc&!MPVi3*kI(0gjNL(y7cX|-hKs}B9h z&Yv&qJ|52HDS^#&bjw0vr4%)))o2M2m#&CbYSr1*Vk4@~MU`r$|0AVZHBuj*bG>&H@a}8l_^j!cfzaYAu1^7lNFdr|mZ<@JOHc)5)E@FVyR$ zS_9BWbA>XHnvUwFrMUsx-M1&Y`s%2*Q1=gKp~*|-N?~b!&|2>A{g{6+%((^Hb|b$n z{LVtvR%dm^1L+y+`w8k91}5!X)910|`7G4`k@Cvma&?yeo;Uz2g<4~vbk}NO=^%vB z*CdWTw`Owg$7$a`@KZa_Lc5xkow9YtL87Z7Qhty26lq5}fm5+isZ<+Lp;#={>ro-P zb)i-&%trgG5Mgu+I9Zr4c~XmJS8L_Ud{nJPg}Fwl7R{DC-hznEWhhgB6zkgf4c1oc zjpAT_VzyWqot!EZhi9ioMv4=Yvm?c^p|Q!*$lU12OsO%uQ6*3 ztYPgKTv9uPVb8SX+yTn{-~4v*TdEdjX-%qd?=cm6zh5C_7F`BC!ipaIP3{*UZ6ss_}l7Rb0 zn>WIC1E|dP-=iGFjTkPnR7ov-Xd3x!z#an{H`&MiyZN3>F|bv`u33baq>i@ zeTu8-A}!+=xxa)TxLI0WX{eCd@)`&l%^Zm&f7T19zet}(g#0NqhQ^~ckPX7?gU3f# zM0=DqmdqcyYHnosozdZPVx?BUUK) z{gnHmPOs0La(qc6oJ{Hb9PR~YuLJqEipQMCPjdc1r6|@?hm&!$P^hD`l-A1C)%wzr z2;NzVR;uMX{AU)uYO9AcPyG#4GxC)i<-$_=BOb$-3r7ruGo@$+wWeAVmDWnd)mpv0 zR$4l;pZpA$OLeaUDs~a>@Ly0UN0C^7B8kTSfy(M;@7BuKlO`lhxwg~@A1iL zX`KG@*&N>4PoqQs#_oSK21EVVQg17d5g%MZwt~k2bU0$iOv~y=Uj>U5L>3BU%)lR(+jy@@1JvzkydT~d46i=iRut23-h|_ zYE!5WLd0jG8=KW0=l+s*6=~1UCc4du?J8AfTU$liG|$hUG7r3SCF;34$~V*gVv<(2 zObR2(ck$Bn`CoDWR(?(U!|PzxRWmqds;iaRvtgB)A=s!D%8g`PU)h#(1==CKM*3&D zBB2aVn1P9!#6VWGyjsSXs~y2cIzm$$3rU)2wp#Kmc&^-lwM3007*k6qQH}bBF7XXx z73s5DsjsfARBKX^s&E|RLQ=REuu99trg3Fv8TMSYHi+cp@0^_JHd(HcQP0zU{ax46 zNXyguV!yTa=0at@v|nv1%^p~79GKf@P`+)wB?l6Vj`GBF#cQQINte=3W7kK$Q~a*y zcL%>2e#`tKzA3HrtsZ{8{4V8Jh~8bUuK=z{=1B>gI8iBTC3GlQvkX?#T3VFGr6V}M z{2!>~-p23sGE+?DYS9a&hSYQM(ykosr_2$ERPx5ayLIa=jY4s8dh1rxYf?OYJKy{G zd0zqM4NPDU&*^u`?s{Rl)L*TY=gZg%{Yb&OewD&nc^;ocBJJoYN=d4>lq;C$<=NjlAi?`?xm|Yq8|4RwOEdlTBhpYu2F53?|8ulNTI(Ph?7^0LO+>rD111&v zqVW^Vi%ZoyscF<&b#bF8T(@v$O46fdYt@w%Y>U^N1BaN^r#i(~hxonWj-N(P2i&U? zsNdh=?QxB*#xs2ut_`$2%SR)7N-|gN)Nh2J^r+T%V?2-ZyQX4VNh0Ln75G#ZKyk_O zv)#AU26^gSZ-YEWd!$39&-ZaJd`_Q#ll#l~o$Yot3iZW7sodB)X0`(V3F?(THN}rf z6*qfc&PgAY?W8gA>;c%7>#rTL-d8sw>SJKXcIJ#$ujXoao%qhqK!0=B(T>++_GVFJ=t27mWe7Jn*U?NzJ(K6>+{L8%H~dsj`g{z5 zBDvh!?;Ci2KfjdU$;Z(8d?U{{@w=IyB$4Rj7JkyrZsVsv!TolA*B0svQKKNqS}d#- zit;X`PQ<5@HW{BEoGq;&{YgH9RbP=2J3268T&z|&oVanIS@MYgs%+7*jR@B}_@(3a z0q#G@PyUG%ChIbR(hg!e0+SOOMEZpbawZ4&a}~U<1U~It3z6&t__~2z%EW1foBI&? z^e0$+nBR$QnOknqj%TS$I510H5!ZcHWdC97nZLbZwP8=GNj_r<%qD-!g*lVi>8IsY z0UJ|jJ&7A7jrf^p&T+554{%kx(yPZ6iRMN$jf|YJREb>R{v@i}w4tZ0Z%ol>1}#qL z>J#$Dxd*9(i~9=KbGe!_lhpq#SGwyy7JV#_!#+QpAIXpA$MWO(iTq@KYA8Q6G&DRk zGBi3ghS@wZG&wXioF5(<9v&VU9vvPV9v_|f<3r=a<0Ipv<74CF z;}heP<5Ls)iJ^(%iIIuXiLr_CiHV8HiK)r_RoTB3d6tAL0>#IrU61qfY6U!`5Om_c83b%(6{r|5QdB4KfxDuJ5y|%JJ=zemGcg2@# z^{@+*WPTN&W6*Xp4n)_@CwV4Iv;8wiGVSJ6yabQW_&`4DYdRMrz%|;RAMVeO?&&xT zdaTwv@&m&t2i>iHt#f%dFg1kRpfovCq&qWv+!g0ws?3)f2UGPSe8)K+uS)&%OVyde RQvDrW_40hBzjSxw{{qtY)N%j- diff --git a/worker/src/lib.rs b/worker/src/lib.rs index 46f6c76..0a1c2a1 100644 --- a/worker/src/lib.rs +++ b/worker/src/lib.rs @@ -7,7 +7,7 @@ use std::cell::RefCell; use js_sys::{ArrayBuffer, Uint8Array}; use console_error_panic_hook; use std::panic; -use ndarray::{s, Array2, Array3, ArrayView1, Axis, Zip}; +use ndarray::{s, Array1, Array2, ArrayView1, Axis, Zip}; use std::sync::Arc; @@ -17,7 +17,7 @@ macro_rules! jsnone {() => {JsValue::from_str(&format!("WASM: unexpected None in // cache to store representations and means thread_local! { - static GLOBAL_MAP: RefCell,Array2,Array2)>>> = RefCell::new(HashMap::new()); + static GLOBAL_MAP: RefCell,Array1,Array1)>>> = RefCell::new(HashMap::new()); } @@ -27,8 +27,6 @@ pub fn calc_similarities( func: String, repr1_str: String, repr2_str: String, - step1: usize, - step2: usize, row: usize, col: usize, ) -> Result, JsValue> { @@ -45,13 +43,13 @@ pub fn calc_similarities( let arc_data1 = reprs.get(&repr1_str).ok_or_else(|| JsValue::from_str("loading"))?; let arc_data2 = reprs.get(&repr2_str).ok_or_else(|| JsValue::from_str("loading"))?; let (repr1, repr2, means1_full, means2_full, norms1, norms2) = (&arc_data1.0, &arc_data2.0, &arc_data1.1, &arc_data2.1, &arc_data1.2, &arc_data2.2); - let n = (repr1.shape()[1] as f32).sqrt() as usize; + let n = (repr1.shape()[0] as f32).sqrt() as usize; // calculate mean of bath representations let means = if func == "cosine_centered" { Some( - Zip::from(&means1_full.slice(s![step1,..])) - .and(&means2_full.slice(s![step2,..])) + Zip::from(means1_full) + .and(means2_full) .map_collect(|&mean1, &mean2| ((mean1 + mean2) / 2.0))) } else { None }; @@ -59,31 +57,31 @@ pub fn calc_similarities( // let time_after_loading = js_sys::Date::now(); // calculate similarities - let a: ArrayView1 = repr1.slice(s![step1,row*n+col,..]); + let a: ArrayView1 = repr1.slice(s![row*n+col,..]); let mut similarities: Vec = match func.as_str() { - "cosine" => repr2.slice(s![step2, .., ..]) + "cosine" => repr2 .axis_iter(Axis(0)) .enumerate() - .map(|(index, b)| b.dot(&a) / (norms1[[step1, index]] * norms2[[step2, index]])) + .map(|(index, b)| b.dot(&a) / (norms1[[index]] * norms2[[index]])) .collect::>(), - "cosine_centered" => repr2.slice(s![step2,..,..]) + "cosine_centered" => repr2 .axis_iter(Axis(0)) .enumerate() .map(|(index, b)| Zip::from(a) .and(b) .and(means.as_ref().unwrap().view()) - .fold(0.0, |acc, &ai, &bi, &mean| acc + (ai - mean) * (bi - mean)) / (norms1[[step1, index]] * norms2[[step2, index]])) + .fold(0.0, |acc, &ai, &bi, &mean| acc + (ai - mean) * (bi - mean)) / (norms1[[index]] * norms2[[index]])) .collect::>(), - "manhattan" => repr2.slice(s![step2,..,..]) + "manhattan" => repr2 .axis_iter(Axis(0)) .map(|b| Zip::from(a).and(b).fold(0.0, |acc, &ai, &bi| acc + (ai - bi).abs())) .collect::>(), - "euclidean" => repr2.slice(s![step2,..,..]) + "euclidean" => repr2 .axis_iter(Axis(0)) .map(|b| Zip::from(a).and(b).fold(0.0, |acc, &ai, &bi| acc + (ai - bi).powi(2)).sqrt()) .collect::>(), - "chebyshev" => repr2.slice(s![step2,..,..]) + "chebyshev" => repr2 .axis_iter(Axis(0)) .map(|b| Zip::from(a).and(b).fold(0.0, |acc: f32, &ai, &bi| acc.max((ai - bi).abs()))) .collect::>(), @@ -114,7 +112,7 @@ pub fn calc_similarities( // fetch representation from url and store it in cache #[wasm_bindgen] -pub async fn fetch_repr(url: String, steps: usize, n: usize, m: usize) -> Result<(), JsValue> { +pub async fn fetch_repr(url: String, n: usize, m: usize) -> Result<(), JsValue> { console_error_panic_hook::set_once(); // better error messages in the console // if the representation is already fetched, return @@ -145,21 +143,16 @@ pub async fn fetch_repr(url: String, steps: usize, n: usize, m: usize) -> Result let float16_data: Vec = bytes.chunks_exact(2).map(|chunk| f16::from_le_bytes([chunk[0], chunk[1]])).collect(); // convert float16 vector to Array4 - let representations = match Array3::from_shape_vec((steps, n*n, m), float16_data.iter().map(|&x| f32::from(x)).collect()) { + let representations = match Array2::from_shape_vec((n*n, m), float16_data.iter().map(|&x| f32::from(x)).collect()) { Ok(repr) => repr, Err(e) => { - let new_steps = float16_data.len() / (n*n*m); - if new_steps * n*n*m != float16_data.len() { - return Err(JsValue::from_str(format!("Failed to convert float16 vector (len {}, {}) to Array3 with shape ({}, {}, {}): {:#?}", float16_data.len(), url, steps, n*n, m, e).as_str())) - } - console::warn_1(&JsValue::from_str(format!("Failed to convert float16 vector (len {}, {}) to Array3 with shape ({}, {}, {}), using shape ({}, {}, {}) instead", float16_data.len(), url, steps, n*n, m, new_steps, n*n, m).as_str())); - Array3::from_shape_vec((new_steps, n*n, m), float16_data.iter().map(|&x| f32::from(x)).collect()).map_err(jserr!())? + return Err(JsValue::from_str(format!("Failed to convert float16 vector (len {}, {}) to Array3 with shape ({}, {}): {:#?}", float16_data.len(), url, n*n, m, e).as_str())) } }; // store representations and means and norms in cache - let means = representations.mean_axis(Axis(1)).ok_or(jsnone!())?; - let norms = representations.mapv(|x| x.powi(2)).sum_axis(Axis(2)).mapv(f32::sqrt); + let means = representations.mean_axis(Axis(0)).ok_or(jsnone!())?; + let norms = representations.mapv(|x| x.powi(2)).sum_axis(Axis(1)).mapv(f32::sqrt); GLOBAL_MAP.with(|map| { map.borrow_mut().insert(url.to_string(), Arc::new((representations, means, norms))); }); diff --git a/worker/webworker.js b/worker/webworker.js index 153db60..425fdbd 100644 --- a/worker/webworker.js +++ b/worker/webworker.js @@ -6,14 +6,14 @@ onmessage = function(e) { asdf.then(_ => { const id = e.data.id; if (e.data.task === 'fetch_repr') { - const { url, steps, n, m } = e.data.data; - wasm.fetch_repr(url, steps, n, m) + const { url, n, m } = e.data.data; + wasm.fetch_repr(url, n, m) .then(() => postMessage({id, data: {status: 'success'}})) .catch((e) => postMessage({id, data: {status: 'error', msg: e}})) } else if (e.data.task === 'calc_similarities') { - const { func, repr1_str, repr2_str, step1, step2, row, col } = e.data.data; + const { func, repr1_str, repr2_str, row, col } = e.data.data; try { - const similarities = wasm.calc_similarities(func, repr1_str, repr2_str, step1, step2, row, col); + const similarities = wasm.calc_similarities(func, repr1_str, repr2_str, row, col); postMessage({ id, data: similarities }); } catch (e) { if (e === 'loading') {