{"version":3,"file":"simple-ml.cjs","sources":["../src/utils/validation.js","../src/utils/matrix.js","../src/regression/linear.js","../src/regression/logistic.js","../src/regression/polynomial.js","../src/utils/stats.js","../src/classification/knn.js","../src/classification/naive-bayes.js","../src/classification/decision-tree.js","../src/utils/random.js","../src/clustering/kmeans.js","../src/preprocessing/scalers.js","../src/preprocessing/encoders.js","../src/preprocessing/imputers.js","../src/metrics/regression.js","../src/metrics/classification.js","../src/model-selection/split.js","../src/metrics/clustering.js"],"sourcesContent":["export function validateArray(arr, name = 'array') {\n  if (!Array.isArray(arr)) {\n    throw new TypeError(`${name} must be an array`);\n  }\n  if (arr.length === 0) {\n    throw new Error(`${name} cannot be empty`);\n  }\n  return true;\n}\n\nexport function validate2DArray(arr, name = 'array') {\n  validateArray(arr, name);\n  if (!arr.every(row => Array.isArray(row))) {\n    throw new TypeError(`${name} must be a 2D array`);\n  }\n  const rowLength = arr[0].length;\n  if (!arr.every(row => row.length === rowLength)) {\n    throw new Error(`All rows in ${name} must have the same length`);\n  }\n  return true;\n}\n\nexport function validateNumericArray(arr, name = 'array') {\n  validateArray(arr, name);\n  if (!arr.every(val => typeof val === 'number' && !isNaN(val))) {\n    throw new TypeError(`All elements in ${name} must be numbers`);\n  }\n  return true;\n}\n\nexport function validateNumeric2DArray(arr, name = 'array') {\n  validate2DArray(arr, name);\n  if (!arr.every(row => row.every(val => typeof val === 'number' && !isNaN(val)))) {\n    throw new TypeError(`All elements in ${name} must be numbers`);\n  }\n  return true;\n}\n\nexport function validateShapesMatch(X, y, xName = 'X', yName = 'y') {\n  validateArray(X, xName);\n  validateArray(y, yName);\n  if (X.length !== y.length) {\n    throw new Error(`${xName} and ${yName} must have the same number of samples. Got ${X.length} and ${y.length}`);\n  }\n  return true;\n}\n\nexport function validatePositiveInteger(value, name = 'value') {\n  if (!Number.isInteger(value) || value <= 0) {\n    throw new Error(`${name} must be a positive integer, got ${value}`);\n  }\n  return true;\n}\n\nexport function validateNumber(value, name = 'value') {\n  if (typeof value !== 'number' || isNaN(value)) {\n    throw new TypeError(`${name} must be a number, got ${value}`);\n  }\n  return true;\n}\n\nexport function validateRange(value, min, max, name = 'value') {\n  validateNumber(value, name);\n  if (value < min || value > max) {\n    throw new Error(`${name} must be between ${min} and ${max}, got ${value}`);\n  }\n  return true;\n}\n\nexport function validateFitted(isFitted, modelName = 'Model') {\n  if (!isFitted) {\n    throw new Error(`${modelName} must be fitted before making predictions. Call fit() first.`);\n  }\n  return true;\n}\n","import { validate2DArray, validateNumeric2DArray, validateNumericArray } from './validation.js';\n\nexport function transpose(matrix) {\n  validate2DArray(matrix, 'matrix');\n  if (matrix.length === 0 || matrix[0].length === 0) {\n    return [];\n  }\n  return matrix[0].map((_, colIndex) => matrix.map(row => row[colIndex]));\n}\n\nexport function dotProduct(a, b) {\n  validateNumericArray(a, 'vector a');\n  validateNumericArray(b, 'vector b');\n  if (a.length !== b.length) {\n    throw new Error(`Vectors must have same length. Got ${a.length} and ${b.length}`);\n  }\n  return a.reduce((sum, val, i) => sum + val * b[i], 0);\n}\n\nexport function matrixMultiply(A, B) {\n  validateNumeric2DArray(A, 'matrix A');\n  validateNumeric2DArray(B, 'matrix B');\n  \n  const rowsA = A.length;\n  const colsA = A[0].length;\n  const rowsB = B.length;\n  const colsB = B[0].length;\n  \n  if (colsA !== rowsB) {\n    throw new Error(`Cannot multiply matrices: columns of A (${colsA}) must equal rows of B (${rowsB})`);\n  }\n  \n  const result = Array(rowsA).fill(0).map(() => Array(colsB).fill(0));\n  \n  for (let i = 0; i < rowsA; i++) {\n    for (let j = 0; j < colsB; j++) {\n      for (let k = 0; k < colsA; k++) {\n        result[i][j] += A[i][k] * B[k][j];\n      }\n    }\n  }\n  \n  return result;\n}\n\nexport function matrixVectorMultiply(matrix, vector) {\n  validateNumeric2DArray(matrix, 'matrix');\n  validateNumericArray(vector, 'vector');\n  \n  if (matrix[0].length !== vector.length) {\n    throw new Error(`Matrix columns (${matrix[0].length}) must equal vector length (${vector.length})`);\n  }\n  \n  return matrix.map(row => dotProduct(row, vector));\n}\n\nexport function addMatrices(A, B) {\n  validateNumeric2DArray(A, 'matrix A');\n  validateNumeric2DArray(B, 'matrix B');\n  \n  if (A.length !== B.length || A[0].length !== B[0].length) {\n    throw new Error('Matrices must have the same dimensions for addition');\n  }\n  \n  return A.map((row, i) => row.map((val, j) => val + B[i][j]));\n}\n\nexport function scalarMultiply(matrix, scalar) {\n  if (Array.isArray(matrix[0])) {\n    validateNumeric2DArray(matrix, 'matrix');\n    return matrix.map(row => row.map(val => val * scalar));\n  } else {\n    validateNumericArray(matrix, 'vector');\n    return matrix.map(val => val * scalar);\n  }\n}\n\nexport function identity(n) {\n  return Array(n).fill(0).map((_, i) => \n    Array(n).fill(0).map((_, j) => i === j ? 1 : 0)\n  );\n}\n\nexport function inverse(matrix, options = {}) {\n  validateNumeric2DArray(matrix, 'matrix');\n  const n = matrix.length;\n  \n  if (n !== matrix[0].length) {\n    throw new Error('Matrix must be square for inversion');\n  }\n  \n  const regularization = options.regularization || 0;\n  const augmented = matrix.map((row, i) => [...row, ...identity(n)[i]]);\n  \n  if (regularization > 0) {\n    for (let i = 0; i < n; i++) {\n      augmented[i][i] += regularization;\n    }\n  }\n  \n  for (let i = 0; i < n; i++) {\n    let maxRow = i;\n    for (let k = i + 1; k < n; k++) {\n      if (Math.abs(augmented[k][i]) > Math.abs(augmented[maxRow][i])) {\n        maxRow = k;\n      }\n    }\n    \n    [augmented[i], augmented[maxRow]] = [augmented[maxRow], augmented[i]];\n    \n    const pivot = augmented[i][i];\n    if (Math.abs(pivot) < 1e-10) {\n      throw new Error('Matrix is singular or nearly singular and cannot be inverted. Consider using Ridge regression or adding regularization.');\n    }\n    \n    for (let j = 0; j < 2 * n; j++) {\n      augmented[i][j] /= pivot;\n    }\n    \n    for (let k = 0; k < n; k++) {\n      if (k !== i) {\n        const factor = augmented[k][i];\n        for (let j = 0; j < 2 * n; j++) {\n          augmented[k][j] -= factor * augmented[i][j];\n        }\n      }\n    }\n  }\n  \n  return augmented.map(row => row.slice(n));\n}\n\nexport function euclideanDistance(a, b) {\n  validateNumericArray(a, 'vector a');\n  validateNumericArray(b, 'vector b');\n  \n  if (a.length !== b.length) {\n    throw new Error(`Vectors must have same length. Got ${a.length} and ${b.length}`);\n  }\n  \n  return Math.sqrt(a.reduce((sum, val, i) => sum + Math.pow(val - b[i], 2), 0));\n}\n\nexport function covariance(X) {\n  validateNumeric2DArray(X, 'X');\n  \n  const n = X.length;\n  const p = X[0].length;\n  \n  const means = Array(p).fill(0);\n  for (let j = 0; j < p; j++) {\n    for (let i = 0; i < n; i++) {\n      means[j] += X[i][j];\n    }\n    means[j] /= n;\n  }\n  \n  const cov = Array(p).fill(0).map(() => Array(p).fill(0));\n  \n  for (let i = 0; i < p; i++) {\n    for (let j = 0; j < p; j++) {\n      let sum = 0;\n      for (let k = 0; k < n; k++) {\n        sum += (X[k][i] - means[i]) * (X[k][j] - means[j]);\n      }\n      cov[i][j] = sum / (n - 1);\n    }\n  }\n  \n  return cov;\n}\n","import { validateNumeric2DArray, validateNumericArray, validateShapesMatch, validateFitted, validateNumber } from '../utils/validation.js';\nimport { transpose, matrixMultiply, matrixVectorMultiply, inverse, identity, addMatrices, scalarMultiply } from '../utils/matrix.js';\n\nexport class LinearRegression {\n  constructor(options = {}) {\n    this.fitIntercept = options.fitIntercept !== undefined ? options.fitIntercept : true;\n    this.normalize = options.normalize || false;\n    this.regularization = options.regularization || null;\n    this.alpha = options.alpha || 1.0;\n    \n    this.coefficients = null;\n    this.intercept = null;\n    this.isFitted = false;\n    this.featureMeans = null;\n    this.featureStds = null;\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    validateNumericArray(y, 'y');\n    validateShapesMatch(X, y);\n    \n    let XProcessed = X.map(row => [...row]);\n    \n    if (this.normalize) {\n      const nFeatures = XProcessed[0].length;\n      this.featureMeans = Array(nFeatures).fill(0);\n      this.featureStds = Array(nFeatures).fill(0);\n      \n      for (let j = 0; j < nFeatures; j++) {\n        const column = XProcessed.map(row => row[j]);\n        this.featureMeans[j] = column.reduce((a, b) => a + b, 0) / column.length;\n        \n        const variance = column.reduce((sum, val) => \n          sum + Math.pow(val - this.featureMeans[j], 2), 0) / column.length;\n        this.featureStds[j] = Math.sqrt(variance) || 1;\n        \n        for (let i = 0; i < XProcessed.length; i++) {\n          XProcessed[i][j] = (XProcessed[i][j] - this.featureMeans[j]) / this.featureStds[j];\n        }\n      }\n    }\n    \n    if (this.fitIntercept) {\n      XProcessed = XProcessed.map(row => [1, ...row]);\n    }\n    \n    const XT = transpose(XProcessed);\n    const XTX = matrixMultiply(XT, XProcessed);\n    \n    if (this.regularization === 'ridge') {\n      const nFeatures = XTX.length;\n      const regularizationMatrix = scalarMultiply(identity(nFeatures), this.alpha);\n      \n      if (this.fitIntercept) {\n        regularizationMatrix[0][0] = 0;\n      }\n      \n      const XTXReg = addMatrices(XTX, regularizationMatrix);\n      const XTXInv = inverse(XTXReg);\n      const XTy = matrixVectorMultiply(XT, y);\n      this.coefficients = matrixVectorMultiply(XTXInv, XTy);\n    } else {\n      const XTXInv = inverse(XTX, { regularization: 1e-10 });\n      const XTy = matrixVectorMultiply(XT, y);\n      this.coefficients = matrixVectorMultiply(XTXInv, XTy);\n    }\n    \n    if (this.fitIntercept) {\n      this.intercept = this.coefficients[0];\n      this.coefficients = this.coefficients.slice(1);\n    } else {\n      this.intercept = 0;\n    }\n    \n    this.isFitted = true;\n    return this;\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'LinearRegression');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    let XProcessed = X.map(row => [...row]);\n    \n    if (this.normalize) {\n      for (let j = 0; j < XProcessed[0].length; j++) {\n        for (let i = 0; i < XProcessed.length; i++) {\n          XProcessed[i][j] = (XProcessed[i][j] - this.featureMeans[j]) / this.featureStds[j];\n        }\n      }\n    }\n    \n    return XProcessed.map(row => {\n      let prediction = this.intercept;\n      for (let i = 0; i < row.length; i++) {\n        prediction += row[i] * this.coefficients[i];\n      }\n      return prediction;\n    });\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'LinearRegression');\n    \n    const predictions = this.predict(X);\n    const yMean = y.reduce((sum, val) => sum + val, 0) / y.length;\n    \n    let ssRes = 0;\n    let ssTot = 0;\n    \n    for (let i = 0; i < y.length; i++) {\n      ssRes += Math.pow(y[i] - predictions[i], 2);\n      ssTot += Math.pow(y[i] - yMean, 2);\n    }\n    \n    return 1 - (ssRes / ssTot);\n  }\n}\n\nexport class RidgeRegression extends LinearRegression {\n  constructor(options = {}) {\n    super({ ...options, regularization: 'ridge' });\n  }\n}\n\nexport class LassoRegression extends LinearRegression {\n  constructor(options = {}) {\n    super(options);\n    this.regularization = 'lasso';\n    this.maxIterations = options.maxIterations || 1000;\n    this.tolerance = options.tolerance || 0.0001;\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    validateNumericArray(y, 'y');\n    validateShapesMatch(X, y);\n    \n    let XProcessed = X.map(row => [...row]);\n    \n    if (this.normalize) {\n      const nFeatures = XProcessed[0].length;\n      this.featureMeans = Array(nFeatures).fill(0);\n      this.featureStds = Array(nFeatures).fill(0);\n      \n      for (let j = 0; j < nFeatures; j++) {\n        const column = XProcessed.map(row => row[j]);\n        this.featureMeans[j] = column.reduce((a, b) => a + b, 0) / column.length;\n        \n        const variance = column.reduce((sum, val) => \n          sum + Math.pow(val - this.featureMeans[j], 2), 0) / column.length;\n        this.featureStds[j] = Math.sqrt(variance) || 1;\n        \n        for (let i = 0; i < XProcessed.length; i++) {\n          XProcessed[i][j] = (XProcessed[i][j] - this.featureMeans[j]) / this.featureStds[j];\n        }\n      }\n    }\n    \n    const nSamples = XProcessed.length;\n    const nFeatures = XProcessed[0].length;\n    \n    this.coefficients = Array(nFeatures).fill(0);\n    this.intercept = 0;\n    \n    for (let iter = 0; iter < this.maxIterations; iter++) {\n      const oldCoefficients = [...this.coefficients];\n      const oldIntercept = this.intercept;\n      \n      if (this.fitIntercept) {\n        let interceptSum = 0;\n        for (let i = 0; i < nSamples; i++) {\n          let prediction = 0;\n          for (let k = 0; k < nFeatures; k++) {\n            prediction += XProcessed[i][k] * this.coefficients[k];\n          }\n          interceptSum += (y[i] - prediction);\n        }\n        this.intercept = interceptSum / nSamples;\n      }\n      \n      for (let j = 0; j < nFeatures; j++) {\n        let rho = 0;\n        let norm = 0;\n        \n        for (let i = 0; i < nSamples; i++) {\n          let prediction = this.intercept;\n          for (let k = 0; k < nFeatures; k++) {\n            if (k !== j) {\n              prediction += XProcessed[i][k] * this.coefficients[k];\n            }\n          }\n          rho += XProcessed[i][j] * (y[i] - prediction);\n          norm += XProcessed[i][j] * XProcessed[i][j];\n        }\n        \n        if (norm === 0) {\n          this.coefficients[j] = 0;\n        } else if (rho < -this.alpha) {\n          this.coefficients[j] = (rho + this.alpha) / norm;\n        } else if (rho > this.alpha) {\n          this.coefficients[j] = (rho - this.alpha) / norm;\n        } else {\n          this.coefficients[j] = 0;\n        }\n      }\n      \n      const coeffDiff = oldCoefficients.reduce((sum, val, i) => \n        sum + Math.abs(val - this.coefficients[i]), 0);\n      const interceptDiff = Math.abs(oldIntercept - this.intercept);\n      \n      if (coeffDiff + interceptDiff < this.tolerance) {\n        break;\n      }\n    }\n    \n    this.isFitted = true;\n    return this;\n  }\n}\n","import { validateNumeric2DArray, validateArray, validateShapesMatch, validateFitted } from '../utils/validation.js';\n\nexport class LogisticRegression {\n  constructor(options = {}) {\n    this.learningRate = options.learningRate || 0.01;\n    this.maxIterations = options.maxIterations || 1000;\n    this.tolerance = options.tolerance || 0.0001;\n    this.fitIntercept = options.fitIntercept !== undefined ? options.fitIntercept : true;\n    this.multiClass = options.multiClass || 'ovr';\n\n    this.coefficients = null;\n    this.intercept = null;\n    this.classes = null;\n    this.isFitted = false;\n    this.models = null;\n  }\n\n  sigmoid(z) {\n    return z.map(val => 1 / (1 + Math.exp(-val)));\n  }\n\n  softmax(z) {\n    const exp = z.map(row => row.map(val => Math.exp(val - Math.max(...row))));\n    return exp.map(row => {\n      const sum = row.reduce((a, b) => a + b, 0);\n      return row.map(val => val / sum);\n    });\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n    validateArray(y, 'y');\n    validateShapesMatch(X, y);\n\n    this.classes = Array.from(new Set(y)).sort();\n\n    if (this.classes.length === 2) {\n      this._fitBinary(X, y);\n    } else {\n      this._fitMulticlass(X, y);\n    }\n\n    this.isFitted = true;\n    return this;\n  }\n\n  _fitBinary(X, y) {\n    const nSamples = X.length;\n    const nFeatures = X[0].length;\n\n    const yBinary = y.map(val => val === this.classes[1] ? 1 : 0);\n\n    this.coefficients = Array(nFeatures).fill(0);\n    this.intercept = 0;\n\n    for (let iter = 0; iter < this.maxIterations; iter++) {\n      const z = X.map((row, i) => {\n        let sum = this.intercept;\n        for (let j = 0; j < nFeatures; j++) {\n          sum += row[j] * this.coefficients[j];\n        }\n        return sum;\n      });\n\n      const predictions = this.sigmoid(z);\n\n      const gradients = Array(nFeatures).fill(0);\n      let interceptGradient = 0;\n\n      for (let i = 0; i < nSamples; i++) {\n        const error = predictions[i] - yBinary[i];\n        for (let j = 0; j < nFeatures; j++) {\n          gradients[j] += error * X[i][j];\n        }\n        interceptGradient += error;\n      }\n\n      const oldCoefficients = [...this.coefficients];\n\n      for (let j = 0; j < nFeatures; j++) {\n        this.coefficients[j] -= this.learningRate * gradients[j] / nSamples;\n      }\n\n      if (this.fitIntercept) {\n        this.intercept -= this.learningRate * interceptGradient / nSamples;\n      }\n\n      const diff = oldCoefficients.reduce((sum, val, i) =>\n        sum + Math.abs(val - this.coefficients[i]), 0);\n\n      if (diff < this.tolerance) {\n        break;\n      }\n    }\n  }\n\n  _fitMulticlass(X, y) {\n    const nClasses = this.classes.length;\n\n    if (this.multiClass === 'ovr') {\n      this.models = [];\n\n      for (const targetClass of this.classes) {\n        // Convert to binary labels (1 for target class, 0 for all others)\n        const yBinary = y.map(val => val === targetClass ? 1 : 0);\n        const model = new LogisticRegression({\n          learningRate: this.learningRate,\n          maxIterations: this.maxIterations,\n          tolerance: this.tolerance,\n          fitIntercept: this.fitIntercept\n        });\n        model.fit(X, yBinary);\n        this.models.push(model);\n      }\n    } else {\n      const nFeatures = X[0].length;\n      const nSamples = X.length;\n\n      this.coefficients = Array(nClasses).fill(0).map(() => Array(nFeatures).fill(0));\n      this.intercept = Array(nClasses).fill(0);\n\n      for (let iter = 0; iter < this.maxIterations; iter++) {\n        const z = X.map(row => {\n          return this.coefficients.map((coef, k) => {\n            let sum = this.intercept[k];\n            for (let j = 0; j < nFeatures; j++) {\n              sum += row[j] * coef[j];\n            }\n            return sum;\n          });\n        });\n\n        const probabilities = this.softmax(z);\n\n        // Store old coefficients for convergence check\n        const oldCoefficients = this.coefficients.map(row => [...row]);\n        const oldIntercept = [...this.intercept];\n\n        for (let k = 0; k < nClasses; k++) {\n          const gradients = Array(nFeatures).fill(0);\n          let interceptGradient = 0;\n\n          for (let i = 0; i < nSamples; i++) {\n            const error = probabilities[i][k] - (y[i] === this.classes[k] ? 1 : 0);\n            for (let j = 0; j < nFeatures; j++) {\n              gradients[j] += error * X[i][j];\n            }\n            interceptGradient += error;\n          }\n\n          for (let j = 0; j < nFeatures; j++) {\n            this.coefficients[k][j] -= this.learningRate * gradients[j] / nSamples;\n          }\n\n          if (this.fitIntercept) {\n            this.intercept[k] -= this.learningRate * interceptGradient / nSamples;\n          }\n        }\n\n        // Check for convergence\n        let maxDiff = 0;\n        for (let k = 0; k < nClasses; k++) {\n          for (let j = 0; j < nFeatures; j++) {\n            maxDiff = Math.max(maxDiff, Math.abs(this.coefficients[k][j] - oldCoefficients[k][j]));\n          }\n          if (this.fitIntercept) {\n            maxDiff = Math.max(maxDiff, Math.abs(this.intercept[k] - oldIntercept[k]));\n          }\n        }\n\n        if (maxDiff < this.tolerance) {\n          break;\n        }\n      }\n    }\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'LogisticRegression');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    const probabilities = this.predictProba(X);\n\n    return probabilities.map(probs => {\n      const maxIndex = probs.indexOf(Math.max(...probs));\n      return this.classes[maxIndex];\n    });\n  }\n\n  predictProba(X) {\n    validateFitted(this.isFitted, 'LogisticRegression');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    if (this.classes.length === 2) {\n      const z = X.map(row => {\n        let sum = this.intercept;\n        for (let j = 0; j < row.length; j++) {\n          sum += row[j] * this.coefficients[j];\n        }\n        return sum;\n      });\n\n      const prob1 = this.sigmoid(z);\n      return prob1.map(p => [1 - p, p]);\n    }\n\n    if (this.models) {\n      const scores = X.map(row => {\n        return this.models.map(model => {\n          const proba = model.predictProba([row])[0];\n          return proba[1];\n        });\n      });\n\n      return scores.map(row => {\n        const sum = row.reduce((a, b) => a + b, 0) || 1;\n        return row.map(val => val / sum);\n      });\n    }\n\n    const z = X.map(row => {\n      return this.coefficients.map((coef, k) => {\n        let sum = this.intercept[k];\n        for (let j = 0; j < row.length; j++) {\n          sum += row[j] * coef[j];\n        }\n        return sum;\n      });\n    });\n\n    return this.softmax(z);\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'LogisticRegression');\n\n    const predictions = this.predict(X);\n    const correct = predictions.filter((pred, i) => pred === y[i]).length;\n    return correct / y.length;\n  }\n}\n","import { validateNumeric2DArray, validateNumericArray, validateShapesMatch, validateFitted, validatePositiveInteger } from '../utils/validation.js';\nimport { LinearRegression } from './linear.js';\n\nexport class PolynomialRegression {\n  constructor(options = {}) {\n    this.degree = options.degree || 2;\n    validatePositiveInteger(this.degree, 'degree');\n    \n    this.fitIntercept = options.fitIntercept !== undefined ? options.fitIntercept : true;\n    this.includeBias = options.includeBias !== undefined ? options.includeBias : true;\n    \n    this.model = new LinearRegression({\n      fitIntercept: this.fitIntercept,\n      normalize: options.normalize || false\n    });\n    \n    this.isFitted = false;\n  }\n\n  _transformFeatures(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    const nSamples = X.length;\n    const nFeatures = X[0].length;\n    const transformed = [];\n    \n    for (let i = 0; i < nSamples; i++) {\n      const row = [];\n      \n      for (let degree = 1; degree <= this.degree; degree++) {\n        for (let j = 0; j < nFeatures; j++) {\n          row.push(Math.pow(X[i][j], degree));\n        }\n      }\n      \n      if (this.degree > 1) {\n        for (let j = 0; j < nFeatures; j++) {\n          for (let k = j + 1; k < nFeatures; k++) {\n            row.push(X[i][j] * X[i][k]);\n          }\n        }\n      }\n      \n      transformed.push(row);\n    }\n    \n    return transformed;\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    validateNumericArray(y, 'y');\n    validateShapesMatch(X, y);\n    \n    const XPoly = this._transformFeatures(X);\n    this.model.fit(XPoly, y);\n    \n    this.isFitted = true;\n    return this;\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'PolynomialRegression');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    const XPoly = this._transformFeatures(X);\n    return this.model.predict(XPoly);\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'PolynomialRegression');\n    \n    const XPoly = this._transformFeatures(X);\n    return this.model.score(XPoly, y);\n  }\n\n  get coefficients() {\n    return this.model.coefficients;\n  }\n\n  get intercept() {\n    return this.model.intercept;\n  }\n}\n","import { validateNumericArray } from './validation.js';\n\nexport function mean(arr) {\n  validateNumericArray(arr, 'array');\n  return arr.reduce((sum, val) => sum + val, 0) / arr.length;\n}\n\nexport function median(arr) {\n  validateNumericArray(arr, 'array');\n  const sorted = Array.from(arr).sort((a, b) => a - b);\n  const mid = Math.floor(sorted.length / 2);\n  return sorted.length % 2 === 0\n    ? (sorted[mid - 1] + sorted[mid]) / 2\n    : sorted[mid];\n}\n\nexport function variance(arr, sample = true) {\n  validateNumericArray(arr, 'array');\n  const m = mean(arr);\n  const divisor = sample ? arr.length - 1 : arr.length;\n  return arr.reduce((sum, val) => sum + Math.pow(val - m, 2), 0) / divisor;\n}\n\nexport function standardDeviation(arr, sample = true) {\n  return Math.sqrt(variance(arr, sample));\n}\n\nexport function min(arr) {\n  validateNumericArray(arr, 'array');\n  return Math.min.apply(null, arr);\n}\n\nexport function max(arr) {\n  validateNumericArray(arr, 'array');\n  return Math.max.apply(null, arr);\n}\n\nexport function sum(arr) {\n  validateNumericArray(arr, 'array');\n  return arr.reduce((sum, val) => sum + val, 0);\n}\n\nexport function mode(arr) {\n  const frequency = {};\n  let maxFreq = 0;\n  let modeValue = arr[0];\n\n  for (const val of arr) {\n    frequency[val] = (frequency[val] || 0) + 1;\n    if (frequency[val] > maxFreq) {\n      maxFreq = frequency[val];\n      modeValue = val;\n    }\n  }\n\n  return modeValue;\n}\n\nexport function quantile(arr, q) {\n  validateNumericArray(arr, 'array');\n  if (q < 0 || q > 1) {\n    throw new Error('Quantile must be between 0 and 1');\n  }\n\n  const sorted = Array.from(arr).sort((a, b) => a - b);\n  const pos = (sorted.length - 1) * q;\n  const base = Math.floor(pos);\n  const rest = pos - base;\n\n  if (sorted[base + 1] !== undefined) {\n    return sorted[base] + rest * (sorted[base + 1] - sorted[base]);\n  }\n  return sorted[base];\n}\n\nexport function correlation(x, y) {\n  validateNumericArray(x, 'x');\n  validateNumericArray(y, 'y');\n\n  if (x.length !== y.length) {\n    throw new Error('Arrays must have the same length');\n  }\n\n  const n = x.length;\n  const meanX = mean(x);\n  const meanY = mean(y);\n\n  let numerator = 0;\n  let denomX = 0;\n  let denomY = 0;\n\n  for (let i = 0; i < n; i++) {\n    const diffX = x[i] - meanX;\n    const diffY = y[i] - meanY;\n    numerator += diffX * diffY;\n    denomX += diffX * diffX;\n    denomY += diffY * diffY;\n  }\n\n  return numerator / Math.sqrt(denomX * denomY);\n}\n\nexport function zscore(arr) {\n  const m = mean(arr);\n  const std = standardDeviation(arr);\n  return arr.map(val => (val - m) / std);\n}\n","import { validateNumeric2DArray, validateArray, validateShapesMatch, validateFitted, validatePositiveInteger } from '../utils/validation.js';\nimport { euclideanDistance } from '../utils/matrix.js';\nimport { mode } from '../utils/stats.js';\n\nexport class KNeighborsClassifier {\n  constructor(options = {}) {\n    this.k = options.k || 5;\n    validatePositiveInteger(this.k, 'k');\n\n    this.weights = options.weights || 'uniform';\n    this.metric = options.metric || 'euclidean';\n\n    this.XTrain = null;\n    this.yTrain = null;\n    this.classes = null;\n    this.isFitted = false;\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n    validateArray(y, 'y');\n    validateShapesMatch(X, y);\n\n    this.XTrain = X.map(row => [...row]);\n    this.yTrain = [...y];\n    this.classes = Array.from(new Set(y)).sort();\n\n    this.isFitted = true;\n    return this;\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'KNeighborsClassifier');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(testPoint => {\n      const distances = this.XTrain.map((trainPoint, i) => ({\n        distance: euclideanDistance(testPoint, trainPoint),\n        label: this.yTrain[i]\n      }));\n\n      distances.sort((a, b) => a.distance - b.distance);\n\n      const kNearest = distances.slice(0, this.k);\n\n      if (this.weights === 'uniform') {\n        const labels = kNearest.map(neighbor => neighbor.label);\n        return mode(labels);\n      } else if (this.weights === 'distance') {\n        const weightedVotes = {};\n\n        for (const neighbor of kNearest) {\n          const weight = neighbor.distance === 0 ? 1e10 : 1 / neighbor.distance;\n          weightedVotes[neighbor.label] = (weightedVotes[neighbor.label] || 0) + weight;\n        }\n\n        return Object.keys(weightedVotes).reduce((a, b) =>\n          weightedVotes[a] > weightedVotes[b] ? a : b\n        );\n      }\n    });\n  }\n\n  predictProba(X) {\n    validateFitted(this.isFitted, 'KNeighborsClassifier');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(testPoint => {\n      const distances = this.XTrain.map((trainPoint, i) => ({\n        distance: euclideanDistance(testPoint, trainPoint),\n        label: this.yTrain[i]\n      }));\n\n      distances.sort((a, b) => a.distance - b.distance);\n\n      const kNearest = distances.slice(0, this.k);\n\n      const probabilities = {};\n      this.classes.forEach(c => probabilities[c] = 0);\n\n      if (this.weights === 'uniform') {\n        for (const neighbor of kNearest) {\n          probabilities[neighbor.label] += 1 / this.k;\n        }\n      } else {\n        let totalWeight = 0;\n        for (const neighbor of kNearest) {\n          const weight = neighbor.distance === 0 ? 1e10 : 1 / neighbor.distance;\n          probabilities[neighbor.label] += weight;\n          totalWeight += weight;\n        }\n\n        for (const c of this.classes) {\n          probabilities[c] /= totalWeight;\n        }\n      }\n\n      return this.classes.map(c => probabilities[c]);\n    });\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'KNeighborsClassifier');\n\n    const predictions = this.predict(X);\n    const correct = predictions.filter((pred, i) => pred === y[i]).length;\n    return correct / y.length;\n  }\n}\n","import { validateNumeric2DArray, validateArray, validateShapesMatch, validateFitted } from '../utils/validation.js';\nimport { mean, variance } from '../utils/stats.js';\n\nexport class GaussianNaiveBayes {\n  constructor() {\n    this.classes = null;\n    this.classPriors = null;\n    this.means = null;\n    this.variances = null;\n    this.isFitted = false;\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n    validateArray(y, 'y');\n    validateShapesMatch(X, y);\n\n    this.classes = Array.from(new Set(y)).sort();\n    const nFeatures = X[0].length;\n\n    this.classPriors = {};\n    this.means = {};\n    this.variances = {};\n\n    for (const c of this.classes) {\n      const classIndices = y.map((label, i) => label === c ? i : -1).filter(i => i !== -1);\n      const classData = classIndices.map(i => X[i]);\n\n      this.classPriors[c] = classData.length / X.length;\n\n      this.means[c] = [];\n      this.variances[c] = [];\n\n      for (let j = 0; j < nFeatures; j++) {\n        const featureValues = classData.map(row => row[j]);\n        this.means[c][j] = mean(featureValues);\n        this.variances[c][j] = variance(featureValues, false) + 1e-9;\n      }\n    }\n\n    this.isFitted = true;\n    return this;\n  }\n\n  _gaussianProbability(x, mean, variance) {\n    const exponent = Math.exp(-Math.pow(x - mean, 2) / (2 * variance));\n    return (1 / Math.sqrt(2 * Math.PI * variance)) * exponent;\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'GaussianNaiveBayes');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(sample => {\n      const posteriors = {};\n\n      for (const c of this.classes) {\n        let logPosterior = Math.log(this.classPriors[c]);\n\n        for (let j = 0; j < sample.length; j++) {\n          const prob = this._gaussianProbability(sample[j], this.means[c][j], this.variances[c][j]);\n          logPosterior += Math.log(prob + 1e-10);\n        }\n\n        posteriors[c] = logPosterior;\n      }\n\n      return this.classes.reduce((a, b) => posteriors[a] > posteriors[b] ? a : b);\n    });\n  }\n\n  predictProba(X) {\n    validateFitted(this.isFitted, 'GaussianNaiveBayes');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(sample => {\n      const logPosteriors = {};\n\n      for (const c of this.classes) {\n        let logPosterior = Math.log(this.classPriors[c]);\n\n        for (let j = 0; j < sample.length; j++) {\n          const prob = this._gaussianProbability(sample[j], this.means[c][j], this.variances[c][j]);\n          logPosterior += Math.log(prob + 1e-10);\n        }\n\n        logPosteriors[c] = logPosterior;\n      }\n\n      const logValues = Object.values(logPosteriors);\n      const maxLog = Math.max.apply(null, logValues);\n      const expSums = {};\n      let totalExp = 0;\n\n      for (const c of this.classes) {\n        expSums[c] = Math.exp(logPosteriors[c] - maxLog);\n        totalExp += expSums[c];\n      }\n\n      return this.classes.map(c => expSums[c] / totalExp);\n    });\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'GaussianNaiveBayes');\n\n    const predictions = this.predict(X);\n    const correct = predictions.filter((pred, i) => pred === y[i]).length;\n    return correct / y.length;\n  }\n}\n\nexport class MultinomialNaiveBayes {\n  constructor(options = {}) {\n    this.alpha = options.alpha || 1.0;\n    this.classes = null;\n    this.classPriors = null;\n    this.featureProbs = null;\n    this.isFitted = false;\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n    validateArray(y, 'y');\n    validateShapesMatch(X, y);\n\n    this.classes = Array.from(new Set(y)).sort();\n    const nFeatures = X[0].length;\n\n    this.classPriors = {};\n    this.featureProbs = {};\n\n    for (const c of this.classes) {\n      const classIndices = y.map((label, i) => label === c ? i : -1).filter(i => i !== -1);\n      const classData = classIndices.map(i => X[i]);\n\n      this.classPriors[c] = classData.length / X.length;\n\n      const featureCounts = Array(nFeatures).fill(0);\n      let totalCount = 0;\n\n      for (const sample of classData) {\n        for (let j = 0; j < nFeatures; j++) {\n          featureCounts[j] += sample[j];\n          totalCount += sample[j];\n        }\n      }\n\n      this.featureProbs[c] = featureCounts.map(count =>\n        (count + this.alpha) / (totalCount + this.alpha * nFeatures)\n      );\n    }\n\n    this.isFitted = true;\n    return this;\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'MultinomialNaiveBayes');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(sample => {\n      const scores = {};\n\n      for (const c of this.classes) {\n        let logScore = Math.log(this.classPriors[c]);\n\n        for (let j = 0; j < sample.length; j++) {\n          logScore += sample[j] * Math.log(this.featureProbs[c][j] + 1e-10);\n        }\n\n        scores[c] = logScore;\n      }\n\n      return this.classes.reduce((a, b) => scores[a] > scores[b] ? a : b);\n    });\n  }\n\n  predictProba(X) {\n    validateFitted(this.isFitted, 'MultinomialNaiveBayes');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(sample => {\n      const logScores = {};\n\n      for (const c of this.classes) {\n        let logScore = Math.log(this.classPriors[c]);\n\n        for (let j = 0; j < sample.length; j++) {\n          logScore += sample[j] * Math.log(this.featureProbs[c][j] + 1e-10);\n        }\n\n        logScores[c] = logScore;\n      }\n\n      const logValues = Object.values(logScores);\n      const maxLog = Math.max.apply(null, logValues);\n      const expSums = {};\n      let totalExp = 0;\n\n      for (const c of this.classes) {\n        expSums[c] = Math.exp(logScores[c] - maxLog);\n        totalExp += expSums[c];\n      }\n\n      return this.classes.map(c => expSums[c] / totalExp);\n    });\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'MultinomialNaiveBayes');\n\n    const predictions = this.predict(X);\n    const correct = predictions.filter((pred, i) => pred === y[i]).length;\n    return correct / y.length;\n  }\n}\n","import { validateNumeric2DArray, validateArray, validateShapesMatch, validateFitted, validatePositiveInteger } from '../utils/validation.js';\nimport { mode } from '../utils/stats.js';\n\nclass TreeNode {\n  constructor(options = {}) {\n    this.featureIndex = options.featureIndex || null;\n    this.threshold = options.threshold || null;\n    this.left = options.left || null;\n    this.right = options.right || null;\n    this.value = options.value || null;\n    this.isLeaf = options.isLeaf || false;\n  }\n}\n\nexport class DecisionTreeClassifier {\n  constructor(options = {}) {\n    this.maxDepth = options.maxDepth || 10;\n    this.minSamplesSplit = options.minSamplesSplit || 2;\n    this.minSamplesLeaf = options.minSamplesLeaf || 1;\n    this.criterion = options.criterion || 'gini';\n\n    this.root = null;\n    this.classes = null;\n    this.isFitted = false;\n  }\n\n  _giniImpurity(y) {\n    const counts = {};\n    for (const label of y) {\n      counts[label] = (counts[label] || 0) + 1;\n    }\n\n    let impurity = 1;\n    for (const count of Object.values(counts)) {\n      const prob = count / y.length;\n      impurity -= prob * prob;\n    }\n\n    return impurity;\n  }\n\n  _entropy(y) {\n    const counts = {};\n    for (const label of y) {\n      counts[label] = (counts[label] || 0) + 1;\n    }\n\n    let entropy = 0;\n    for (const count of Object.values(counts)) {\n      const prob = count / y.length;\n      if (prob > 0) {\n        entropy -= prob * Math.log2(prob);\n      }\n    }\n\n    return entropy;\n  }\n\n  _calculateImpurity(y) {\n    return this.criterion === 'gini' ? this._giniImpurity(y) : this._entropy(y);\n  }\n\n  _split(X, y, featureIndex, threshold) {\n    const leftIndices = [];\n    const rightIndices = [];\n\n    for (let i = 0; i < X.length; i++) {\n      if (X[i][featureIndex] <= threshold) {\n        leftIndices.push(i);\n      } else {\n        rightIndices.push(i);\n      }\n    }\n\n    return {\n      leftX: leftIndices.map(i => X[i]),\n      leftY: leftIndices.map(i => y[i]),\n      rightX: rightIndices.map(i => X[i]),\n      rightY: rightIndices.map(i => y[i])\n    };\n  }\n\n  _findBestSplit(X, y) {\n    let bestGain = -Infinity;\n    let bestFeature = null;\n    let bestThreshold = null;\n\n    const nFeatures = X[0].length;\n    const currentImpurity = this._calculateImpurity(y);\n\n    for (let featureIndex = 0; featureIndex < nFeatures; featureIndex++) {\n      const featureValues = Array.from(new Set(X.map(row => row[featureIndex]))).sort((a, b) => a - b);\n\n      for (let i = 0; i < featureValues.length - 1; i++) {\n        const threshold = (featureValues[i] + featureValues[i + 1]) / 2;\n\n        const { leftY, rightY } = this._split(X, y, featureIndex, threshold);\n\n        if (leftY.length < this.minSamplesLeaf || rightY.length < this.minSamplesLeaf) {\n          continue;\n        }\n\n        const leftImpurity = this._calculateImpurity(leftY);\n        const rightImpurity = this._calculateImpurity(rightY);\n\n        const weightedImpurity =\n          (leftY.length / y.length) * leftImpurity +\n          (rightY.length / y.length) * rightImpurity;\n\n        const gain = currentImpurity - weightedImpurity;\n\n        if (gain > bestGain) {\n          bestGain = gain;\n          bestFeature = featureIndex;\n          bestThreshold = threshold;\n        }\n      }\n    }\n\n    return { featureIndex: bestFeature, threshold: bestThreshold, gain: bestGain };\n  }\n\n  _buildTree(X, y, depth = 0) {\n    if (depth >= this.maxDepth ||\n        y.length < this.minSamplesSplit ||\n        new Set(y).size === 1) {\n      return new TreeNode({\n        value: mode(y),\n        isLeaf: true\n      });\n    }\n\n    const { featureIndex, threshold, gain } = this._findBestSplit(X, y);\n\n    if (gain <= 0 || featureIndex === null) {\n      return new TreeNode({\n        value: mode(y),\n        isLeaf: true\n      });\n    }\n\n    const { leftX, leftY, rightX, rightY } = this._split(X, y, featureIndex, threshold);\n\n    const leftNode = this._buildTree(leftX, leftY, depth + 1);\n    const rightNode = this._buildTree(rightX, rightY, depth + 1);\n\n    return new TreeNode({\n      featureIndex,\n      threshold,\n      left: leftNode,\n      right: rightNode,\n      isLeaf: false\n    });\n  }\n\n  fit(X, y) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n    validateArray(y, 'y');\n    validateShapesMatch(X, y);\n\n    this.classes = Array.from(new Set(y)).sort();\n    this.root = this._buildTree(X, y);\n\n    this.isFitted = true;\n    return this;\n  }\n\n  _predictOne(x, node = this.root) {\n    if (node.isLeaf) {\n      return node.value;\n    }\n\n    if (x[node.featureIndex] <= node.threshold) {\n      return this._predictOne(x, node.left);\n    } else {\n      return this._predictOne(x, node.right);\n    }\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'DecisionTreeClassifier');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(x => this._predictOne(x));\n  }\n\n  score(X, y) {\n    validateFitted(this.isFitted, 'DecisionTreeClassifier');\n\n    const predictions = this.predict(X);\n    const correct = predictions.filter((pred, i) => pred === y[i]).length;\n    return correct / y.length;\n  }\n}\n","export function setSeed(seed) {\n  let state = seed;\n  \n  return function() {\n    state = (state * 9301 + 49297) % 233280;\n    return state / 233280;\n  };\n}\n\nexport function randomInt(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nexport function randomChoice(arr) {\n  return arr[randomInt(0, arr.length - 1)];\n}\n\nexport function shuffle(arr) {\n  const shuffled = [...arr];\n  for (let i = shuffled.length - 1; i > 0; i--) {\n    const j = randomInt(0, i);\n    [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n  }\n  return shuffled;\n}\n\nexport function randomSample(arr, n, replace = false) {\n  if (!replace && n > arr.length) {\n    throw new Error('Sample size cannot be larger than array length when replace=false');\n  }\n  \n  if (replace) {\n    return Array(n).fill(0).map(() => randomChoice(arr));\n  } else {\n    const shuffled = shuffle(arr);\n    return shuffled.slice(0, n);\n  }\n}\n\nexport function randomNormal(mean = 0, std = 1) {\n  let u1 = Math.random();\n  let u2 = Math.random();\n  \n  const z0 = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n  return z0 * std + mean;\n}\n\nexport function randomUniform(min = 0, max = 1) {\n  return Math.random() * (max - min) + min;\n}\n","import { validateNumeric2DArray, validateFitted, validatePositiveInteger } from '../utils/validation.js';\nimport { euclideanDistance } from '../utils/matrix.js';\nimport { randomInt } from '../utils/random.js';\n\nexport class KMeans {\n  constructor(options = {}) {\n    this.nClusters = options.nClusters || 3;\n    validatePositiveInteger(this.nClusters, 'nClusters');\n\n    this.maxIterations = options.maxIterations || 300;\n    this.tolerance = options.tolerance || 0.0001;\n    this.initMethod = options.initMethod || 'kmeans++';\n    this.nInit = options.nInit || 10;\n\n    this.centroids = null;\n    this.labels = null;\n    this.inertia = null;\n    this.nIterations = 0;\n    this.isFitted = false;\n  }\n\n  _initializeCentroidsRandom(X) {\n    const indices = new Set();\n    while (indices.size < this.nClusters) {\n      indices.add(randomInt(0, X.length - 1));\n    }\n    return Array.from(indices).map(i => [...X[i]]);\n  }\n\n  _initializeCentroidsKMeansPlusPlus(X) {\n    const centroids = [];\n\n    const firstIndex = randomInt(0, X.length - 1);\n    centroids.push([...X[firstIndex]]);\n\n    for (let i = 1; i < this.nClusters; i++) {\n      const distances = X.map(point => {\n        const dists = centroids.map(c => Math.pow(euclideanDistance(point, c), 2));\n        const minDist = Math.min.apply(null, dists);\n        return minDist;\n      });\n\n      const totalDist = distances.reduce((a, b) => a + b, 0);\n      const probabilities = distances.map(d => d / totalDist);\n\n      let cumSum = 0;\n      const rand = Math.random();\n      for (let j = 0; j < probabilities.length; j++) {\n        cumSum += probabilities[j];\n        if (rand <= cumSum) {\n          centroids.push([...X[j]]);\n          break;\n        }\n      }\n    }\n\n    return centroids;\n  }\n\n  _assignClusters(X, centroids) {\n    return X.map(point => {\n      const distances = centroids.map(c => euclideanDistance(point, c));\n      return distances.indexOf(Math.min.apply(null, distances));\n    });\n  }\n\n  _updateCentroids(X, labels) {\n    const newCentroids = Array(this.nClusters).fill(0).map(() =>\n      Array(X[0].length).fill(0)\n    );\n    const counts = Array(this.nClusters).fill(0);\n\n    for (let i = 0; i < X.length; i++) {\n      const cluster = labels[i];\n      counts[cluster]++;\n      for (let j = 0; j < X[i].length; j++) {\n        newCentroids[cluster][j] += X[i][j];\n      }\n    }\n\n    for (let i = 0; i < this.nClusters; i++) {\n      if (counts[i] > 0) {\n        for (let j = 0; j < newCentroids[i].length; j++) {\n          newCentroids[i][j] /= counts[i];\n        }\n      }\n    }\n\n    return newCentroids;\n  }\n\n  _calculateInertia(X, labels, centroids) {\n    let inertia = 0;\n    for (let i = 0; i < X.length; i++) {\n      const centroid = centroids[labels[i]];\n      inertia += Math.pow(euclideanDistance(X[i], centroid), 2);\n    }\n    return inertia;\n  }\n\n  _fitOnce(X) {\n    let centroids;\n    if (this.initMethod === 'kmeans++') {\n      centroids = this._initializeCentroidsKMeansPlusPlus(X);\n    } else {\n      centroids = this._initializeCentroidsRandom(X);\n    }\n\n    let labels = null;\n    let iterations = 0;\n\n    for (let iter = 0; iter < this.maxIterations; iter++) {\n      iterations = iter + 1;\n\n      labels = this._assignClusters(X, centroids);\n\n      const newCentroids = this._updateCentroids(X, labels);\n\n      let maxShift = 0;\n      for (let i = 0; i < this.nClusters; i++) {\n        const shift = euclideanDistance(centroids[i], newCentroids[i]);\n        maxShift = Math.max(maxShift, shift);\n      }\n\n      centroids = newCentroids;\n\n      if (maxShift < this.tolerance) {\n        break;\n      }\n    }\n\n    const inertia = this._calculateInertia(X, labels, centroids);\n\n    return { centroids, labels, inertia, iterations };\n  }\n\n  fit(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    if (X.length < this.nClusters) {\n      throw new Error(`Number of samples (${X.length}) must be >= number of clusters (${this.nClusters})`);\n    }\n\n    let bestResult = null;\n    let bestInertia = Infinity;\n\n    for (let i = 0; i < this.nInit; i++) {\n      const result = this._fitOnce(X);\n\n      if (result.inertia < bestInertia) {\n        bestInertia = result.inertia;\n        bestResult = result;\n      }\n    }\n\n    this.centroids = bestResult.centroids;\n    this.labels = bestResult.labels;\n    this.inertia = bestResult.inertia;\n    this.nIterations = bestResult.iterations;\n\n    this.isFitted = true;\n    return this;\n  }\n\n  predict(X) {\n    validateFitted(this.isFitted, 'KMeans');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return this._assignClusters(X, this.centroids);\n  }\n\n  fitPredict(X) {\n    this.fit(X);\n    return this.labels;\n  }\n\n  transform(X) {\n    validateFitted(this.isFitted, 'KMeans');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    validateNumeric2DArray(X, 'X');\n\n    return X.map(point =>\n      this.centroids.map(c => euclideanDistance(point, c))\n    );\n  }\n}\n","import { validateNumeric2DArray, validateFitted } from '../utils/validation.js';\nimport { mean, standardDeviation, min, max, median, quantile } from '../utils/stats.js';\n\nexport class StandardScaler {\n  constructor(options = {}) {\n    this.withMean = options.withMean !== undefined ? options.withMean : true;\n    this.withStd = options.withStd !== undefined ? options.withStd : true;\n    \n    this.mean = null;\n    this.std = null;\n    this.isFitted = false;\n  }\n\n  fit(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    const nFeatures = X[0].length;\n    this.mean = Array(nFeatures).fill(0);\n    this.std = Array(nFeatures).fill(1);\n    \n    for (let j = 0; j < nFeatures; j++) {\n      const column = X.map(row => row[j]);\n      \n      if (this.withMean) {\n        this.mean[j] = mean(column);\n      }\n      \n      if (this.withStd) {\n        this.std[j] = standardDeviation(column) || 1;\n      }\n    }\n    \n    this.isFitted = true;\n    return this;\n  }\n\n  transform(X) {\n    validateFitted(this.isFitted, 'StandardScaler');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    return X.map(row => \n      row.map((val, j) => (val - this.mean[j]) / this.std[j])\n    );\n  }\n\n  fitTransform(X) {\n    this.fit(X);\n    return this.transform(X);\n  }\n\n  inverseTransform(X) {\n    validateFitted(this.isFitted, 'StandardScaler');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    return X.map(row => \n      row.map((val, j) => val * this.std[j] + this.mean[j])\n    );\n  }\n}\n\nexport class MinMaxScaler {\n  constructor(options = {}) {\n    this.featureRange = options.featureRange || [0, 1];\n    \n    this.dataMin = null;\n    this.dataMax = null;\n    this.dataRange = null;\n    this.isFitted = false;\n  }\n\n  fit(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    const nFeatures = X[0].length;\n    this.dataMin = Array(nFeatures);\n    this.dataMax = Array(nFeatures);\n    this.dataRange = Array(nFeatures);\n    \n    for (let j = 0; j < nFeatures; j++) {\n      const column = X.map(row => row[j]);\n      this.dataMin[j] = min(column);\n      this.dataMax[j] = max(column);\n      this.dataRange[j] = this.dataMax[j] - this.dataMin[j] || 1;\n    }\n    \n    this.isFitted = true;\n    return this;\n  }\n\n  transform(X) {\n    validateFitted(this.isFitted, 'MinMaxScaler');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    const [minRange, maxRange] = this.featureRange;\n    const scale = maxRange - minRange;\n    \n    return X.map(row => \n      row.map((val, j) => {\n        const normalized = (val - this.dataMin[j]) / this.dataRange[j];\n        return normalized * scale + minRange;\n      })\n    );\n  }\n\n  fitTransform(X) {\n    this.fit(X);\n    return this.transform(X);\n  }\n\n  inverseTransform(X) {\n    validateFitted(this.isFitted, 'MinMaxScaler');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    const [minRange, maxRange] = this.featureRange;\n    const scale = maxRange - minRange;\n    \n    return X.map(row => \n      row.map((val, j) => {\n        const normalized = (val - minRange) / scale;\n        return normalized * this.dataRange[j] + this.dataMin[j];\n      })\n    );\n  }\n}\n\nexport class RobustScaler {\n  constructor(options = {}) {\n    this.quantileRange = options.quantileRange || [25, 75];\n    this.withCentering = options.withCentering !== undefined ? options.withCentering : true;\n    this.withScaling = options.withScaling !== undefined ? options.withScaling : true;\n    \n    this.center = null;\n    this.scale = null;\n    this.isFitted = false;\n  }\n\n  fit(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    const nFeatures = X[0].length;\n    this.center = Array(nFeatures).fill(0);\n    this.scale = Array(nFeatures).fill(1);\n    \n    for (let j = 0; j < nFeatures; j++) {\n      const column = X.map(row => row[j]);\n      \n      if (this.withCentering) {\n        this.center[j] = median(column);\n      }\n      \n      if (this.withScaling) {\n        const q1 = quantile(column, this.quantileRange[0] / 100);\n        const q3 = quantile(column, this.quantileRange[1] / 100);\n        this.scale[j] = (q3 - q1) || 1;\n      }\n    }\n    \n    this.isFitted = true;\n    return this;\n  }\n\n  transform(X) {\n    validateFitted(this.isFitted, 'RobustScaler');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    return X.map(row => \n      row.map((val, j) => (val - this.center[j]) / this.scale[j])\n    );\n  }\n\n  fitTransform(X) {\n    this.fit(X);\n    return this.transform(X);\n  }\n\n  inverseTransform(X) {\n    validateFitted(this.isFitted, 'RobustScaler');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    validateNumeric2DArray(X, 'X');\n    \n    return X.map(row => \n      row.map((val, j) => val * this.scale[j] + this.center[j])\n    );\n  }\n}\n","import { validateArray, validateFitted } from '../utils/validation.js';\n\nexport class LabelEncoder {\n  constructor() {\n    this.classes = null;\n    this.classToIndex = null;\n    this.isFitted = false;\n  }\n\n  fit(y) {\n    validateArray(y, 'y');\n\n    this.classes = Array.from(new Set(y)).sort();\n    this.classToIndex = {};\n\n    this.classes.forEach((label, index) => {\n      this.classToIndex[label] = index;\n    });\n\n    this.isFitted = true;\n    return this;\n  }\n\n  transform(y) {\n    validateFitted(this.isFitted, 'LabelEncoder');\n    validateArray(y, 'y');\n\n    return y.map(label => {\n      if (!(label in this.classToIndex)) {\n        throw new Error(`Label '${label}' not found in fitted classes`);\n      }\n      return this.classToIndex[label];\n    });\n  }\n\n  fitTransform(y) {\n    this.fit(y);\n    return this.transform(y);\n  }\n\n  inverseTransform(y) {\n    validateFitted(this.isFitted, 'LabelEncoder');\n    validateArray(y, 'y');\n\n    return y.map(index => {\n      if (index < 0 || index >= this.classes.length) {\n        throw new Error(`Index ${index} out of range for fitted classes`);\n      }\n      return this.classes[index];\n    });\n  }\n}\n\nexport class OneHotEncoder {\n  constructor(options = {}) {\n    this.categories = null;\n    this.dropFirst = options.dropFirst || false;\n    this.isFitted = false;\n  }\n\n  fit(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    const nFeatures = X[0].length;\n    this.categories = Array(nFeatures);\n\n    for (let j = 0; j < nFeatures; j++) {\n      const column = X.map(row => row[j]);\n      this.categories[j] = Array.from(new Set(column)).sort();\n    }\n\n    this.isFitted = true;\n    return this;\n  }\n\n  transform(X) {\n    validateFitted(this.isFitted, 'OneHotEncoder');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    return X.map(row => {\n      const encoded = [];\n\n      for (let j = 0; j < row.length; j++) {\n        const value = row[j];\n        const categories = this.categories[j];\n\n        if (!categories.includes(value)) {\n          throw new Error(`Value '${value}' not found in fitted categories for feature ${j}`);\n        }\n\n        const startIdx = this.dropFirst ? 1 : 0;\n        for (let k = startIdx; k < categories.length; k++) {\n          encoded.push(categories[k] === value ? 1 : 0);\n        }\n      }\n\n      return encoded;\n    });\n  }\n\n  fitTransform(X) {\n    this.fit(X);\n    return this.transform(X);\n  }\n\n  inverseTransform(X) {\n    validateFitted(this.isFitted, 'OneHotEncoder');\n\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n\n    return X.map(row => {\n      const decoded = [];\n      let idx = 0;\n\n      for (let j = 0; j < this.categories.length; j++) {\n        const categories = this.categories[j];\n        const nCategories = this.dropFirst ? categories.length - 1 : categories.length;\n\n        const oneHot = row.slice(idx, idx + nCategories);\n        idx += nCategories;\n\n        let found = false;\n        const startIdx = this.dropFirst ? 1 : 0;\n\n        for (let k = 0; k < oneHot.length; k++) {\n          if (oneHot[k] === 1) {\n            decoded.push(categories[startIdx + k]);\n            found = true;\n            break;\n          }\n        }\n\n        if (!found) {\n          if (this.dropFirst) {\n            decoded.push(categories[0]);\n          } else {\n            decoded.push(null);\n          }\n        }\n      }\n\n      return decoded;\n    });\n  }\n}\n","import { validateFitted } from '../utils/validation.js';\nimport { mean, median, mode } from '../utils/stats.js';\n\nexport class SimpleImputer {\n  constructor(options = {}) {\n    this.strategy = options.strategy || 'mean';\n    this.fillValue = options.fillValue;\n    this.missingValues = options.missingValues !== undefined ? options.missingValues : null;\n    \n    this.statistics = null;\n    this.isFitted = false;\n  }\n\n  _isMissing(value) {\n    if (this.missingValues === null) {\n      return value === null || value === undefined || (typeof value === 'number' && isNaN(value));\n    }\n    return value === this.missingValues;\n  }\n\n  fit(X) {\n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    const nFeatures = X[0].length;\n    this.statistics = Array(nFeatures);\n    \n    for (let j = 0; j < nFeatures; j++) {\n      const column = X.map(row => row[j]).filter(val => !this._isMissing(val));\n      \n      if (column.length === 0) {\n        this.statistics[j] = 0;\n        continue;\n      }\n      \n      if (this.strategy === 'mean') {\n        const numericColumn = column.filter(val => typeof val === 'number');\n        this.statistics[j] = numericColumn.length > 0 ? mean(numericColumn) : 0;\n      } else if (this.strategy === 'median') {\n        const numericColumn = column.filter(val => typeof val === 'number');\n        this.statistics[j] = numericColumn.length > 0 ? median(numericColumn) : 0;\n      } else if (this.strategy === 'most_frequent') {\n        this.statistics[j] = mode(column);\n      } else if (this.strategy === 'constant') {\n        this.statistics[j] = this.fillValue !== undefined ? this.fillValue : 0;\n      } else {\n        throw new Error(`Unknown strategy: ${this.strategy}`);\n      }\n    }\n    \n    this.isFitted = true;\n    return this;\n  }\n\n  transform(X) {\n    validateFitted(this.isFitted, 'SimpleImputer');\n    \n    if (!Array.isArray(X[0])) {\n      X = X.map(val => [val]);\n    }\n    \n    return X.map(row => \n      row.map((val, j) => this._isMissing(val) ? this.statistics[j] : val)\n    );\n  }\n\n  fitTransform(X) {\n    this.fit(X);\n    return this.transform(X);\n  }\n}\n","import { validateNumericArray, validateShapesMatch } from '../utils/validation.js';\nimport { mean } from '../utils/stats.js';\n\nexport function meanAbsoluteError(yTrue, yPred) {\n  validateNumericArray(yTrue, 'yTrue');\n  validateNumericArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const errors = yTrue.map((val, i) => Math.abs(val - yPred[i]));\n  return mean(errors);\n}\n\nexport function meanSquaredError(yTrue, yPred) {\n  validateNumericArray(yTrue, 'yTrue');\n  validateNumericArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const errors = yTrue.map((val, i) => Math.pow(val - yPred[i], 2));\n  return mean(errors);\n}\n\nexport function rootMeanSquaredError(yTrue, yPred) {\n  return Math.sqrt(meanSquaredError(yTrue, yPred));\n}\n\nexport function r2Score(yTrue, yPred) {\n  validateNumericArray(yTrue, 'yTrue');\n  validateNumericArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const yMean = mean(yTrue);\n\n  let ssRes = 0;\n  let ssTot = 0;\n\n  for (let i = 0; i < yTrue.length; i++) {\n    ssRes += Math.pow(yTrue[i] - yPred[i], 2);\n    ssTot += Math.pow(yTrue[i] - yMean, 2);\n  }\n\n  if (ssTot === 0) {\n    return 1.0;\n  }\n\n  return 1 - (ssRes / ssTot);\n}\n\nexport function meanAbsolutePercentageError(yTrue, yPred) {\n  validateNumericArray(yTrue, 'yTrue');\n  validateNumericArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const errors = yTrue.map((val, i) => {\n    if (val === 0) {\n      return Math.abs(yPred[i]);\n    }\n    return Math.abs((val - yPred[i]) / val);\n  });\n\n  return mean(errors) * 100;\n}\n\nexport function maxError(yTrue, yPred) {\n  validateNumericArray(yTrue, 'yTrue');\n  validateNumericArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const errors = yTrue.map((val, i) => Math.abs(val - yPred[i]));\n  return Math.max.apply(null, errors);\n}\n\nexport const mae = meanAbsoluteError;\nexport const mse = meanSquaredError;\nexport const rmse = rootMeanSquaredError;\nexport const r2 = r2Score;\nexport const mape = meanAbsolutePercentageError;\n","import { validateArray, validateShapesMatch } from '../utils/validation.js';\n\nexport function accuracy(yTrue, yPred) {\n  validateArray(yTrue, 'yTrue');\n  validateArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const correct = yTrue.filter((val, i) => val === yPred[i]).length;\n  return correct / yTrue.length;\n}\n\nexport function confusionMatrix(yTrue, yPred) {\n  validateArray(yTrue, 'yTrue');\n  validateArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const combined = yTrue.concat(yPred);\n  const classes = Array.from(new Set(combined)).sort();\n  const n = classes.length;\n  const matrix = Array(n).fill(0).map(() => Array(n).fill(0));\n\n  const classToIndex = {};\n  classes.forEach((c, i) => classToIndex[c] = i);\n\n  for (let i = 0; i < yTrue.length; i++) {\n    const trueIdx = classToIndex[yTrue[i]];\n    const predIdx = classToIndex[yPred[i]];\n    matrix[trueIdx][predIdx]++;\n  }\n\n  return { matrix, classes };\n}\n\nexport function precision(yTrue, yPred, options = {}) {\n  validateArray(yTrue, 'yTrue');\n  validateArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const average = options.average || 'binary';\n  const posLabel = options.posLabel;\n\n  const { matrix, classes } = confusionMatrix(yTrue, yPred);\n\n  if (average === 'binary') {\n    const posIdx = posLabel !== undefined\n      ? classes.indexOf(posLabel)\n      : 1;\n\n    const tp = matrix[posIdx][posIdx];\n    const fp = matrix.reduce((sum, row, i) => i !== posIdx ? sum + row[posIdx] : sum, 0);\n\n    return tp + fp === 0 ? 0 : tp / (tp + fp);\n  }\n\n  const precisions = classes.map((_, i) => {\n    const tp = matrix[i][i];\n    const fp = matrix.reduce((sum, row, j) => j !== i ? sum + row[i] : sum, 0);\n    return tp + fp === 0 ? 0 : tp / (tp + fp);\n  });\n\n  if (average === 'macro') {\n    return precisions.reduce((a, b) => a + b, 0) / precisions.length;\n  } else if (average === 'weighted') {\n    const weights = classes.map((_, i) => matrix[i].reduce((a, b) => a + b, 0));\n    const totalWeight = weights.reduce((a, b) => a + b, 0);\n    return precisions.reduce((sum, p, i) => sum + p * weights[i], 0) / totalWeight;\n  }\n\n  return precisions;\n}\n\nexport function recall(yTrue, yPred, options = {}) {\n  validateArray(yTrue, 'yTrue');\n  validateArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const average = options.average || 'binary';\n  const posLabel = options.posLabel;\n\n  const { matrix, classes } = confusionMatrix(yTrue, yPred);\n\n  if (average === 'binary') {\n    const posIdx = posLabel !== undefined\n      ? classes.indexOf(posLabel)\n      : 1;\n\n    const tp = matrix[posIdx][posIdx];\n    const fn = matrix[posIdx].reduce((sum, val, i) => i !== posIdx ? sum + val : sum, 0);\n\n    return tp + fn === 0 ? 0 : tp / (tp + fn);\n  }\n\n  const recalls = classes.map((_, i) => {\n    const tp = matrix[i][i];\n    const fn = matrix[i].reduce((sum, val, j) => j !== i ? sum + val : sum, 0);\n    return tp + fn === 0 ? 0 : tp / (tp + fn);\n  });\n\n  if (average === 'macro') {\n    return recalls.reduce((a, b) => a + b, 0) / recalls.length;\n  } else if (average === 'weighted') {\n    const weights = classes.map((_, i) => matrix[i].reduce((a, b) => a + b, 0));\n    const totalWeight = weights.reduce((a, b) => a + b, 0);\n    return recalls.reduce((sum, r, i) => sum + r * weights[i], 0) / totalWeight;\n  }\n\n  return recalls;\n}\n\nexport function f1Score(yTrue, yPred, options = {}) {\n  const p = precision(yTrue, yPred, options);\n  const r = recall(yTrue, yPred, options);\n\n  if (Array.isArray(p)) {\n    return p.map((prec, i) => {\n      const rec = r[i];\n      return prec + rec === 0 ? 0 : 2 * prec * rec / (prec + rec);\n    });\n  }\n\n  return p + r === 0 ? 0 : 2 * p * r / (p + r);\n}\n\nexport function classificationReport(yTrue, yPred) {\n  validateArray(yTrue, 'yTrue');\n  validateArray(yPred, 'yPred');\n  validateShapesMatch([yTrue], [yPred], 'yTrue', 'yPred');\n\n  const { classes } = confusionMatrix(yTrue, yPred);\n  const report = {};\n\n  for (const label of classes) {\n    const binaryTrue = yTrue.map(y => y === label ? 1 : 0);\n    const binaryPred = yPred.map(y => y === label ? 1 : 0);\n\n    report[label] = {\n      precision: precision(binaryTrue, binaryPred, { average: 'binary', posLabel: 1 }),\n      recall: recall(binaryTrue, binaryPred, { average: 'binary', posLabel: 1 }),\n      f1Score: f1Score(binaryTrue, binaryPred, { average: 'binary', posLabel: 1 }),\n      support: yTrue.filter(y => y === label).length\n    };\n  }\n\n  report.accuracy = accuracy(yTrue, yPred);\n  report.macroAvg = {\n    precision: precision(yTrue, yPred, { average: 'macro' }),\n    recall: recall(yTrue, yPred, { average: 'macro' }),\n    f1Score: f1Score(yTrue, yPred, { average: 'macro' })\n  };\n  report.weightedAvg = {\n    precision: precision(yTrue, yPred, { average: 'weighted' }),\n    recall: recall(yTrue, yPred, { average: 'weighted' }),\n    f1Score: f1Score(yTrue, yPred, { average: 'weighted' })\n  };\n\n  return report;\n}\n","import { validateArray, validateShapesMatch, validateRange } from '../utils/validation.js';\nimport { shuffle as shuffleArray } from '../utils/random.js';\n\nexport function trainTestSplit(X, y, options = {}) {\n  validateArray(X, 'X');\n  \n  if (y !== undefined) {\n    validateArray(y, 'y');\n    validateShapesMatch(X, y);\n  }\n  \n  const testSize = options.testSize !== undefined ? options.testSize : 0.25;\n  const trainSize = options.trainSize;\n  const shuffle = options.shuffle !== undefined ? options.shuffle : true;\n  const randomState = options.randomState;\n  \n  validateRange(testSize, 0, 1, 'testSize');\n  \n  const n = X.length;\n  let nTest;\n  \n  if (trainSize !== undefined) {\n    validateRange(trainSize, 0, 1, 'trainSize');\n    nTest = Math.floor(n * (1 - trainSize));\n  } else {\n    nTest = Math.floor(n * testSize);\n  }\n  \n  const nTrain = n - nTest;\n  \n  let indices = Array.from({ length: n }, (_, i) => i);\n  \n  if (shuffle) {\n    indices = shuffleArray(indices);\n  }\n  \n  const trainIndices = indices.slice(0, nTrain);\n  const testIndices = indices.slice(nTrain);\n  \n  const XTrain = trainIndices.map(i => X[i]);\n  const XTest = testIndices.map(i => X[i]);\n  \n  if (y !== undefined) {\n    const yTrain = trainIndices.map(i => y[i]);\n    const yTest = testIndices.map(i => y[i]);\n    return { XTrain, XTest, yTrain, yTest };\n  }\n  \n  return { XTrain, XTest };\n}\n\nexport function kFoldSplit(n, options = {}) {\n  const nSplits = options.nSplits || 5;\n  const shuffle = options.shuffle !== undefined ? options.shuffle : false;\n  \n  if (nSplits <= 1 || nSplits > n) {\n    throw new Error(`nSplits must be between 2 and ${n}, got ${nSplits}`);\n  }\n  \n  let indices = Array.from({ length: n }, (_, i) => i);\n  \n  if (shuffle) {\n    indices = shuffleArray(indices);\n  }\n  \n  const foldSize = Math.floor(n / nSplits);\n  const folds = [];\n  \n  for (let i = 0; i < nSplits; i++) {\n    const start = i * foldSize;\n    const end = i === nSplits - 1 ? n : start + foldSize;\n    \n    const testIndices = indices.slice(start, end);\n    const trainIndices = [...indices.slice(0, start), ...indices.slice(end)];\n    \n    folds.push({ trainIndices, testIndices });\n  }\n  \n  return folds;\n}\n\nexport function crossValidate(model, X, y, options = {}) {\n  validateArray(X, 'X');\n  validateArray(y, 'y');\n  validateShapesMatch(X, y);\n  \n  const cv = options.cv || 5;\n  const scoring = options.scoring || 'accuracy';\n  \n  const folds = kFoldSplit(X.length, { nSplits: cv, shuffle: true });\n  const scores = [];\n  \n  for (const fold of folds) {\n    const XTrain = fold.trainIndices.map(i => X[i]);\n    const yTrain = fold.trainIndices.map(i => y[i]);\n    const XTest = fold.testIndices.map(i => X[i]);\n    const yTest = fold.testIndices.map(i => y[i]);\n    \n    const clonedModel = Object.create(Object.getPrototypeOf(model));\n    Object.assign(clonedModel, JSON.parse(JSON.stringify(model)));\n    clonedModel.isFitted = false;\n    \n    clonedModel.fit(XTrain, yTrain);\n    \n    let score;\n    if (typeof scoring === 'function') {\n      score = scoring(clonedModel, XTest, yTest);\n    } else if (scoring === 'accuracy' || scoring === 'score') {\n      score = clonedModel.score(XTest, yTest);\n    } else {\n      score = clonedModel.score(XTest, yTest);\n    }\n    \n    scores.push(score);\n  }\n  \n  const meanScore = scores.reduce((a, b) => a + b, 0) / scores.length;\n  const variance = scores.reduce((sum, s) => sum + Math.pow(s - meanScore, 2), 0) / scores.length;\n  const stdScore = Math.sqrt(variance);\n  \n  return {\n    scores,\n    meanScore,\n    stdScore,\n    cv\n  };\n}\n","import { validateNumeric2DArray, validateArray, validateShapesMatch } from '../utils/validation.js';\nimport { euclideanDistance } from '../utils/matrix.js';\nimport { mean } from '../utils/stats.js';\n\nexport function silhouetteScore(X, labels) {\n  if (!Array.isArray(X[0])) {\n    X = X.map(val => [val]);\n  }\n\n  validateNumeric2DArray(X, 'X');\n  validateArray(labels, 'labels');\n  validateShapesMatch(X, labels);\n\n  const clusters = Array.from(new Set(labels));\n  const n = X.length;\n\n  if (clusters.length <= 1 || clusters.length >= n) {\n    return 0;\n  }\n\n  const silhouettes = [];\n\n  for (let i = 0; i < n; i++) {\n    const currentCluster = labels[i];\n\n    const sameClusterPoints = [];\n    const otherClusterDistances = {};\n\n    for (let j = 0; j < n; j++) {\n      if (i === j) continue;\n\n      const distance = euclideanDistance(X[i], X[j]);\n\n      if (labels[j] === currentCluster) {\n        sameClusterPoints.push(distance);\n      } else {\n        if (!otherClusterDistances[labels[j]]) {\n          otherClusterDistances[labels[j]] = [];\n        }\n        otherClusterDistances[labels[j]].push(distance);\n      }\n    }\n\n    const a = sameClusterPoints.length > 0 ? mean(sameClusterPoints) : 0;\n\n    let b = Infinity;\n    for (const cluster in otherClusterDistances) {\n      const avgDist = mean(otherClusterDistances[cluster]);\n      b = Math.min(b, avgDist);\n    }\n\n    if (b === Infinity) {\n      b = 0;\n    }\n\n    const s = a === 0 && b === 0 ? 0 : (b - a) / Math.max(a, b);\n    silhouettes.push(s);\n  }\n\n  return mean(silhouettes);\n}\n\nexport function daviesBouldinScore(X, labels) {\n  if (!Array.isArray(X[0])) {\n    X = X.map(val => [val]);\n  }\n\n  validateNumeric2DArray(X, 'X');\n  validateArray(labels, 'labels');\n  validateShapesMatch(X, labels);\n\n  const clusters = Array.from(new Set(labels));\n  const k = clusters.length;\n\n  if (k <= 1) {\n    return 0;\n  }\n\n  const centroids = {};\n  const clusterPoints = {};\n\n  for (const cluster of clusters) {\n    const points = X.filter((_, i) => labels[i] === cluster);\n    clusterPoints[cluster] = points;\n\n    const nFeatures = points[0].length;\n    const centroid = Array(nFeatures).fill(0);\n\n    for (const point of points) {\n      for (let j = 0; j < nFeatures; j++) {\n        centroid[j] += point[j];\n      }\n    }\n\n    for (let j = 0; j < nFeatures; j++) {\n      centroid[j] /= points.length;\n    }\n\n    centroids[cluster] = centroid;\n  }\n\n  const scatters = {};\n  for (const cluster of clusters) {\n    const points = clusterPoints[cluster];\n    const centroid = centroids[cluster];\n\n    const distances = points.map(point => euclideanDistance(point, centroid));\n    scatters[cluster] = mean(distances);\n  }\n\n  let dbIndex = 0;\n\n  for (const i of clusters) {\n    let maxRatio = 0;\n\n    for (const j of clusters) {\n      if (i === j) continue;\n\n      const centroidDist = euclideanDistance(centroids[i], centroids[j]);\n      if (centroidDist === 0) continue;\n\n      const ratio = (scatters[i] + scatters[j]) / centroidDist;\n      maxRatio = Math.max(maxRatio, ratio);\n    }\n\n    dbIndex += maxRatio;\n  }\n\n  return dbIndex / k;\n}\n\nexport function calinskiHarabaszScore(X, labels) {\n  if (!Array.isArray(X[0])) {\n    X = X.map(val => [val]);\n  }\n\n  validateNumeric2DArray(X, 'X');\n  validateArray(labels, 'labels');\n  validateShapesMatch(X, labels);\n\n  const n = X.length;\n  const clusters = Array.from(new Set(labels));\n  const k = clusters.length;\n\n  if (k <= 1 || k >= n) {\n    return 0;\n  }\n\n  const nFeatures = X[0].length;\n  const overallCentroid = Array(nFeatures).fill(0);\n\n  for (const point of X) {\n    for (let j = 0; j < nFeatures; j++) {\n      overallCentroid[j] += point[j];\n    }\n  }\n\n  for (let j = 0; j < nFeatures; j++) {\n    overallCentroid[j] /= n;\n  }\n\n  let betweenClusterDispersion = 0;\n  let withinClusterDispersion = 0;\n\n  for (const cluster of clusters) {\n    const points = X.filter((_, i) => labels[i] === cluster);\n    const nPoints = points.length;\n\n    const centroid = Array(nFeatures).fill(0);\n    for (const point of points) {\n      for (let j = 0; j < nFeatures; j++) {\n        centroid[j] += point[j];\n      }\n    }\n    for (let j = 0; j < nFeatures; j++) {\n      centroid[j] /= nPoints;\n    }\n\n    betweenClusterDispersion += nPoints * Math.pow(euclideanDistance(centroid, overallCentroid), 2);\n\n    for (const point of points) {\n      withinClusterDispersion += Math.pow(euclideanDistance(point, centroid), 2);\n    }\n  }\n\n  if (withinClusterDispersion === 0) {\n    return 0;\n  }\n\n  return (betweenClusterDispersion / withinClusterDispersion) * ((n - k) / (k - 1));\n}\n\nexport function inertia(X, labels, centroids) {\n  if (!Array.isArray(X[0])) {\n    X = X.map(val => [val]);\n  }\n\n  validateNumeric2DArray(X, 'X');\n  validateArray(labels, 'labels');\n  validateShapesMatch(X, labels);\n\n  let totalInertia = 0;\n\n  for (let i = 0; i < X.length; i++) {\n    const centroid = centroids[labels[i]];\n    totalInertia += Math.pow(euclideanDistance(X[i], centroid), 2);\n  }\n\n  return totalInertia;\n}\n"],"names":["validateArray","arr","name","Array","isArray","TypeError","length","Error","validate2DArray","every","row","rowLength","validateNumericArray","val","isNaN","validateNumeric2DArray","validateShapesMatch","X","y","xName","yName","validatePositiveInteger","value","Number","isInteger","validateNumber","validateRange","min","max","validateFitted","isFitted","modelName","transpose","matrix","map","_","colIndex","dotProduct","a","b","reduce","sum","i","matrixMultiply","A","B","rowsA","colsA","rowsB","colsB","result","fill","j","k","matrixVectorMultiply","vector","addMatrices","scalarMultiply","scalar","identity","n","inverse","options","regularization","augmented","concat","maxRow","Math","abs","_ref","pivot","factor","slice","euclideanDistance","sqrt","pow","LinearRegression","this","fitIntercept","undefined","normalize","alpha","coefficients","intercept","featureMeans","featureStds","_proto","prototype","fit","_this","XProcessed","nFeatures","_loop","column","variance","XT","XTX","regularizationMatrix","XTXInv","XTy","predict","_this2","prediction","score","predictions","yMean","ssRes","ssTot","RidgeRegression","_LinearRegression","call","_extends","_inheritsLoose","LassoRegression","_LinearRegression2","_this3","maxIterations","tolerance","_this4","_loop2","nSamples","iter","oldCoefficients","oldIntercept","interceptSum","rho","norm","coeffDiff","LogisticRegression","learningRate","multiClass","classes","models","sigmoid","z","exp","softmax","apply","from","Set","sort","_fitBinary","_fitMulticlass","yBinary","gradients","interceptGradient","error","diff","nClasses","_step","targetClass","model","push","_iterator","_createForOfIteratorHelperLoose","done","coef","probabilities","maxDiff","predictProba","probs","maxIndex","indexOf","p","filter","pred","PolynomialRegression","degree","includeBias","_createClass","_transformFeatures","transformed","XPoly","key","get","mean","median","sorted","mid","floor","sample","m","divisor","standardDeviation","mode","frequency","maxFreq","modeValue","quantile","q","pos","base","KNeighborsClassifier","weights","metric","XTrain","yTrain","testPoint","distances","trainPoint","distance","label","kNearest","labels","neighbor","weightedVotes","Object","keys","forEach","c","_step2","_iterator2","_step3","totalWeight","_iterator3","weight","_iterator4","_step4","GaussianNaiveBayes","classPriors","means","variances","classData","featureValues","_gaussianProbability","x","exponent","PI","posteriors","logPosterior","log","prob","logPosteriors","logValues","values","maxLog","expSums","totalExp","MultinomialNaiveBayes","featureProbs","_proto2","_step5","_loop3","_step6","featureCounts","totalCount","_iterator6","count","_iterator5","_this5","_step7","scores","_iterator7","logScore","_this6","_step8","logScores","_iterator8","_step9","_iterator9","TreeNode","featureIndex","threshold","left","right","isLeaf","DecisionTreeClassifier","maxDepth","minSamplesSplit","minSamplesLeaf","criterion","root","_giniImpurity","counts","impurity","_i","_Object$values","_entropy","entropy","_i2","_Object$values2","log2","_calculateImpurity","_split","leftIndices","rightIndices","leftX","leftY","rightX","rightY","_findBestSplit","bestGain","Infinity","bestFeature","bestThreshold","currentImpurity","_this$_split","leftImpurity","rightImpurity","gain","_buildTree","depth","size","_this$_findBestSplit","_this$_split2","leftNode","rightNode","_predictOne","node","randomInt","random","randomChoice","shuffle","shuffled","KMeans","nClusters","initMethod","nInit","centroids","inertia","nIterations","_initializeCentroidsRandom","indices","add","_initializeCentroidsKMeansPlusPlus","firstIndex","point","dists","totalDist","d","cumSum","rand","_assignClusters","_updateCentroids","newCentroids","cluster","_calculateInertia","_fitOnce","iterations","maxShift","shift","bestResult","bestInertia","fitPredict","transform","StandardScaler","withMean","withStd","std","fitTransform","inverseTransform","MinMaxScaler","featureRange","dataMin","dataMax","dataRange","_this$featureRange","minRange","scale","_this$featureRange2","maxRange","RobustScaler","quantileRange","withCentering","withScaling","center","_proto3","_this7","q1","q3","_this8","_this9","LabelEncoder","classToIndex","index","OneHotEncoder","categories","dropFirst","encoded","includes","decoded","idx","nCategories","oneHot","found","startIdx","SimpleImputer","strategy","fillValue","missingValues","statistics","_isMissing","numericColumn","meanAbsoluteError","yTrue","yPred","meanSquaredError","rootMeanSquaredError","r2Score","meanAbsolutePercentageError","mae","mse","rmse","r2","mape","accuracy","confusionMatrix","combined","precision","average","posLabel","_confusionMatrix","posIdx","tp","fp","precisions","recall","_confusionMatrix2","fn","recalls","r","f1Score","prec","rec","kFoldSplit","nSplits","shuffleArray","foldSize","folds","start","end","testIndices","trainIndices","clusters","overallCentroid","betweenClusterDispersion","withinClusterDispersion","_clusters4","_i4","points","nPoints","centroid","_confusionMatrix3","report","binaryTrue","binaryPred","support","macroAvg","weightedAvg","meanX","meanY","numerator","denomX","denomY","diffX","diffY","cov","cv","scoring","fold","XTest","yTest","clonedModel","create","getPrototypeOf","assign","JSON","parse","stringify","meanScore","s","stdScore","clusterPoints","_clusters","scatters","_clusters2","dbIndex","_i3","_clusters3","maxRatio","centroidDist","totalInertia","errors","u1","u2","cos","replace","seed","state","silhouettes","currentCluster","sameClusterPoints","otherClusterDistances","avgDist","testSize","trainSize","nTest","nTrain"],"mappings":"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"}