UNPKG

@allemandi/embed-utils

Version:

Fast, type-safe utilities for vector embedding comparison and search.

3 lines (2 loc) 1.89 kB
function t(t,e){let n=0,r=0,o=0;for(let s=0;s<t.length;s++){const c=t[s],l=e[s];n+=c*l,r+=c*c,o+=l*l}const s=Math.sqrt(r)*Math.sqrt(o);return 0===s?0:n/s}function e(t,e){let n=0;for(let r=0;r<t.length;r++){const o=t[r]-e[r];n+=o*o}return Math.sqrt(n)}function n(t,e){let n=0;for(let r=0;r<t.length;r++)n+=Math.abs(t[r]-e[r]);return n}function r(t){let e=0;for(let n=0;n<t.length;n++)e+=t[n]*t[n];const n=Math.sqrt(e);if(0===n)return t.slice();const r=new Array(t.length);for(let e=0;e<t.length;e++)r[e]=t[e]/n;return r}function o(t,e=1e-6){let n=0;for(let e=0;e<t.length;e++){const r=t[e];n+=r*r}return Math.abs(n-1)<=e}function s(t){const e=t.length;if(0===e)return[];const n=t[0].length,r=new Array(n).fill(0);for(let o=0;o<e;o++){const e=t[o];for(let t=0;t<n;t++)r[t]+=e[t]}for(let t=0;t<n;t++)r[t]/=e;return r}function c(r,o,s={}){const{topK:c,threshold:l,method:i="cosine"}=s,a=void 0!==c?c:void 0!==l?o.length:1,h=[];let f,u,d;switch(i){case"euclidean":f=e,u=!0,d="distance";break;case"manhattan":f=n,u=!0,d="distance";break;default:f=t,u=!1,d="similarityScore"}for(const t of o){const e=f(r,t.embedding);if(void 0!==l){(u?e<=l:e>=l)&&h.push({...t,[d]:e})}else h.push({...t,[d]:e})}return h.sort((t,e)=>{if("similarityScore"===d||"distance"===d){const n=t[d]??0,r=e[d]??0;return u?n-r:r-n}return 0}),h.slice(0,a)}function l(r,o,s={}){const{method:c="cosine"}=s;let l,i,a;switch(c){case"euclidean":l=e,i=!0,a="distance";break;case"manhattan":l=n,i=!0,a="distance";break;default:l=t,i=!1,a="similarityScore"}const h=new Array(o.length);for(let t=0;t<o.length;t++)h[t]={...o[t],[a]:l(r,o[t].embedding)};return h.sort((t,e)=>i?t[a]-e[a]:e[a]-t[a]),h}export{t as computeCosineSimilarity,e as computeEuclideanDistance,n as computeManhattanDistance,c as findNearestNeighbors,o as isNormalized,s as meanVector,r as normalizeVector,l as rankBySimilarity}; //# sourceMappingURL=index.js.map