import { PrintObject } from "./PrintObject";
import { String } from "../dataType/String";
import { FeatureCollection } from "@turf/turf";
import { List } from "../dataType/List";
import { ConfusionMatrix } from "./ConfusionMatrix";

/**
 * @class gve.Classifier
 * @since gve
 */
export class Classifier extends PrintObject {
  /**
   * Classifier
   * @hideconstructor
   * @return gve.Classifier
   * @tutorial gve
   */
  constructor() {
    super();
    if (!(this instanceof Classifier)) {
      return new Classifier();
    }
  }

  /**
   * 为给定的距离度量创建最小距离分类器
   * @param {string} metric 要使用的距离度量
   * @param {number} kNearest k个最近邻居或距离组成的数组
   * @returns Classifier
   */
  minimumDistance(metric: string='euclidean', kNearest: number=1) {
    return new Classifier();
  }

  /**
   * 为给定的距离度量创建最小距离分类器
   * @param {string} metric 要使用的距离度量
   * @param {number} kNearest k个最近邻居或距离组成的数组
   * @returns Classifier
   * @tutorial gve.Classifier
   */
  static minimumDistance(metric: string='euclidean', kNearest: number=1) {
    return new Classifier();
  }

  /**
   * 对FeatureCollection实例进行训练
   * @param {FeatureCollection} features 需要训练的featureCollection集合
   * @param {string} classProperty 包含类属性名称的值
   * @param {any[]|List<any>} inputProperties 作为训练数据的属性名称列表
   * @returns Classifier
   */
  train(features: FeatureCollection, classProperty: string, inputProperties: any[]|List<any> = null) {
    return new Classifier();
  }

  /**
   * 描述训练过的分类器的结果
   * @returns Classifier
   */
  explain() {
    return new Classifier();
  }

  /**
   * 根据分类器的训练数据计算分类器的二维混淆矩阵 
   * @returns ConfusionMatrix
   */
  confusionMatrix() {
    return new ConfusionMatrix();
  }

  /**
   * 创建一个空的CART分类器,决策树算法
   * @param {number} [maxNodes] 可选参数,每棵树的节点的最大数量,如果没有指定,则无限制
   * @param {number} [minLeafPopulation] 可选参数,创建训练集包含的节点数量
   * @param {number} [maxDepth] 可选参数,树的最大深度
   * @returns Classifier
   * @tutorial gve.Classifier
   */
  static Cart(maxNodes?: number, minLeafPopulation?: number, maxDepth?: number) {
    return new Classifier();
  }

  /**
   * 创建一个空的随机森林分类器
   * @param {number} numberOfTrees 创建的决策树数量
   * @param {number} [variablesPerSplit] 可选参数,每个变量拆分的数量
   * @param {number} [minLeafPopulation] 可选参数,创建至少包含这些点的节点
   * @param {number} [bagFraction] 可选参数,每棵树的输入袋比例
   * @param {number} [maxNodes] 可选参数,每棵树中最大的叶子节点数量
   * @param {number} [seed] 可选参数,随机种子
   * @returns Classifier
   * @tutorial gve.Classifier
   */
  static smileRandomForest(numberOfTrees: number, variablesPerSplit?: number, 
    minLeafPopulation?: number, bagFraction?: number, maxNodes?: number, seed?: number) {
    return new Classifier();
  }

  /**
   * 设置输出模式
   * @param {string} [mode] 可选参数,输出模式CLASSIFICATION|REGRESSION|PROBABILITY|MULTIPROBABILITY|RAW|RAW_REGRESSION中之一
   * @returns Classifier
   */
  setOutputMode(mode?: string) {
    return new Classifier();
  }

  /**
   * 创建一个空的CART分类器
   * @param {number} [maxNodes] 可选参数,整数,默认值:null,每棵树的最大叶子节点数。如果未指定,则默认为无限制
   * @param {number} [minLeafPopulation] 可选参数,整数,默认值:1,仅创建训练集包含至少这么多点的节点
   * @returns Classifier
   * @tutorial gve.Classifier
   */
  static smileCart(maxNodes?: number, minLeafPopulation?: number) {
    return new Classifier();
  }

  /**
   * 创建一个空的梯度树提升分类器
   * @param {number} numberOfTrees 整数, 需要创建的决策树数量
   * @param {number} [shrinkage] 可选参数,浮点数, 默认值: 0.005,  (0, 1] 范围内的收缩参数控制程序的学习速率
   * @param {number} [samplingRate] 可选参数,浮点数, 默认值: 0.7, 随机树提升的采样率
   * @param {number} [maxNodes] 可选参数,整数, 默认值: null,每棵树的最大叶子节点数量。如果没有指定,默认为无限制
   * @param {string} [loss] 可选参数,默认值: "LeastAbsoluteDeviation", 回归的损失函数。可以是:LeastSquares, LeastAbsoluteDeviation, Huber
   * @param {number} [seed] 可选参数,整数, 默认值: 0,随机化种子
   * @returns Classifier
   * @tutorial gve.Classifier
   */
  static smileGradientTreeBoost(numberOfTrees: number, shrinkage?: number, 
    samplingRate?: number, maxNodes?: number, loss?: string, seed?: number) {
    return new Classifier();
  }

  
}