function dotProduct(a: number[], b: number[]): number {
    return a.map((x, i) => x * b[i]).reduce((sum, current) => sum + current, 0);
  }  
  
  function magnitude(arr: number[]): number {
    return Math.sqrt(arr.map(x => x * x).reduce((sum, current) => sum + current, 0));
  }
  
  function cosineSimilarity(arr1: number[], arr2: number[]): number {
    if (arr1.length !== arr2.length) {
        throw new Error("Arrays must have the same length");
    }
  
    const dotProd = dotProduct(arr1, arr2);
    const magnitudeProd = magnitude(arr1) * magnitude(arr2);
    if (magnitudeProd === 0) {
        return 0;
    }
    return dotProd / magnitudeProd;
  }
  
  function averageOfArrays(arr: number[][]): number[] {
    // Get the length of the first sub-array
    const length = arr[0].length;
  
    // Initialize an array to store the sums
    const sums = Array(length).fill(0);
  
    // Loop over each sub-array
    for (let i = 0; i < arr.length; i++) {
      // Loop over each element in the sub-array
      for (let j = 0; j < arr[i].length; j++) {
        // Add the element to the corresponding sum
        sums[j] += arr[i][j];
      }
    }
  
    // Divide each sum by the number of arrays to get the average
    const averages = sums.map(sum => sum / arr.length);
  
    return averages;
  }

 export { cosineSimilarity, averageOfArrays };