/** 算法类型 */
export enum AlgorithmType {
  /** 稳态类型 */
  Steady = '1',
  /** 动态类型 */
  Dynamic = '2',
}
/** 特征列类型 */
export enum ColumnType {
  /** 特征输入列 */
  Input = '1',
  /** 标签输出列 */
  Output = '2',
}

export enum ModelStatus {
  /** 失败 */
  Failed = '-1',
  /** 未开始 */
  NoStart = '待开始',
  /** 进行中 */
  Underway = '1',
  /** 已终止 */
  Termination = '2',
  /** 已完成 */
  Complete = '3',
}
export const ModelStatusMap = new Map([
  ['-1', '失败'],
  ['0', '未开始'],
  ['1', '进行中'],
  ['2', '已终止'],
  ['3', '已完成'],
]);

export class ModelFile {
  static getSourceFilePath(modelId: string) {
    return '/modelTraining/modelId' + modelId + '/source/';
  }
}

export class AlgorithmOptions {
  /** 损失函数 */
  static lossFunction = [
    { label: '均方误差', value: 'mse' },
    { label: '平均绝对误差', value: 'l1' },
    { label: '交叉熵', value: 'cross_entropy' },
    { label: '二分类交叉熵', value: 'bce' },
    { label: '平滑L1', value: 'smooth_l1' },
    { label: 'KL散度', value: 'kl_div' },
    { label: '合页损失', value: 'hinge' },
    { label: '三元组损失', value: 'triplet' },
  ];
  /** 优化函数 */
  static optimizeFunction = [
    { label: '随机梯度下降', value: 'sgd' },
    { label: '自适应矩估计', value: 'adam' },
    { label: '均方根传播', value: 'rmsprop' },
    { label: '自适应梯度', value: 'adagrad' },
    { label: 'Adam权重衰减版', value: 'adamw' },
  ];
  /** 导出模型格式 */
  static exportFormat = [
    { label: '.pt', value: '.pt' },
    { label: '.onnx', value: '.onnx' },
    { label: '.bin', value: '.bin' },
  ];
  /** 数据处理方式 */
  static disposeMethod = [
    { label: 'Min - Max等区间缩放法', value: 'minmax' },
    { label: 'Z-score等方差缩放法', value: 'z-source' },
    { label: '小数定标标准化法', value: '3' },
  ];
}

/**
 * 防抖函数：确保函数在最后一次触发后等待指定时间才执行
 * @param {Function} func - 需要防抖的函数
 * @param {number} wait - 等待时间，单位：毫秒，
 * @returns {Function} 防抖后的函数
 */
let timer: any = null; // 定时器
export function debounce(func: any, wait: any) {
  // 如果已有定时器，清除它
  if (timer) {
    clearTimeout(timer);
  }
  // 设置新的定时器
  timer = setTimeout(() => {
    func();
    timer = null; // 执行后清除定时器引用
  }, wait);
}

/**
 * 判断两个数组是否存在相同项
 * @param arr1
 * @param arr2
 * @returns
 */
export function hasCommonItem(arr1: any, arr2: any) {
  return arr1.some((item: any) => arr2.includes(item));
}
