@allemandi/embed-utils
Version:
Fast, type-safe utilities for vector embedding comparison and search.
3 lines (2 loc) • 1.92 kB
JavaScript
;function t(t,e){let n=0,r=0,o=0;for(let s=0;s<t.length;s++){const i=t[s],c=e[s];n+=i*c,r+=i*i,o+=c*c}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}exports.computeCosineSimilarity=t,exports.computeEuclideanDistance=e,exports.computeManhattanDistance=n,exports.findNearestNeighbors=function(r,o,s={}){const{topK:i,threshold:c,method:a="cosine"}=s,l=void 0!==i?i:void 0!==c?o.length:1,u=[];let h,f,d;switch(a){case"euclidean":h=e,f=!0,d="distance";break;case"manhattan":h=n,f=!0,d="distance";break;default:h=t,f=!1,d="similarityScore"}for(const t of o){const e=h(r,t.embedding);if(void 0!==c){(f?e<=c:e>=c)&&u.push({...t,[d]:e})}else u.push({...t,[d]:e})}return u.sort((t,e)=>{if("similarityScore"===d||"distance"===d){const n=t[d]??0,r=e[d]??0;return f?n-r:r-n}return 0}),u.slice(0,l)},exports.isNormalized=function(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},exports.meanVector=function(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},exports.normalizeVector=function(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},exports.rankBySimilarity=function(r,o,s={}){const{method:i="cosine"}=s;let c,a,l;switch(i){case"euclidean":c=e,a=!0,l="distance";break;case"manhattan":c=n,a=!0,l="distance";break;default:c=t,a=!1,l="similarityScore"}const u=new Array(o.length);for(let t=0;t<o.length;t++)u[t]={...o[t],[l]:c(r,o[t].embedding)};return u.sort((t,e)=>a?t[l]-e[l]:e[l]-t[l]),u};
//# sourceMappingURL=index.cjs.map