export const VECTOR_DIM = 384;

export function embedLocal(text: string): number[] {
  const vec = new Float64Array(VECTOR_DIM);
  const tokens = text.toLowerCase().match(/[a-z0-9]+/g) || [];
  for (const t of tokens) {
    let h = 2166136261;
    for (let i = 0; i < t.length; i++) h = Math.imul(h ^ t.charCodeAt(i), 16777619) >>> 0;
    const idx = h % VECTOR_DIM;
    const sign = h & 1 ? 1 : -1;
    vec[idx] += sign;
  }
  let n = 0;
  for (let i = 0; i < VECTOR_DIM; i++) n += vec[i] * vec[i];
  n = Math.sqrt(n) || 1;
  return Array.from(vec, (x) => x / n);
}

export function cosine(a: number[], b: number[]): number {
  let s = 0;
  const n = Math.min(a.length, b.length);
  for (let i = 0; i < n; i++) s += a[i] * b[i];
  return s;
}
