{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.rtemis.org/preprocessor/v1/schema.json",
  "title": "rtemis PreprocessorConfig",
  "description": "Language-independent config for rtemis preprocessing. Mirrors the `PreprocessorConfig` object / `setup_Preprocessor` arguments. The same config drives rtemis (R), rtemis-py, and rtemislive to identical output.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "const": "https://schema.rtemis.org/preprocessor/v1/schema.json",
      "description": "JSON Schema URI for this config instance."
    },
    "complete_cases": {
      "type": "boolean",
      "default": false,
      "description": "Retain only complete cases."
    },
    "remove_features_thres": {
      "type": ["number", "null"],
      "maximum": 1,
      "exclusiveMinimum": 0,
      "default": null,
      "description": "Remove features missing in >= this fraction of cases."
    },
    "remove_cases_thres": {
      "type": ["number", "null"],
      "maximum": 1,
      "exclusiveMinimum": 0,
      "default": null,
      "description": "Remove cases missing >= this fraction of features."
    },
    "missingness": {
      "type": "boolean",
      "default": false,
      "description": "Add a boolean missingness indicator per feature with NAs."
    },
    "impute": {
      "type": "boolean",
      "default": false,
      "description": "Impute missing values."
    },
    "impute_type": {
      "type": "string",
      "enum": ["missRanger", "micePMM", "meanMode"],
      "default": "missRanger",
      "description": "Imputation method."
    },
    "impute_discrete": {
      "type": "string",
      "default": "get_mode",
      "description": "Function name to impute discrete features."
    },
    "impute_continuous": {
      "type": "string",
      "default": "mean",
      "description": "Function name to impute continuous features."
    },
    "integer2factor": {
      "type": "boolean",
      "default": false,
      "description": "Convert integers to factors."
    },
    "integer2numeric": {
      "type": "boolean",
      "default": false,
      "description": "Convert integers to numeric."
    },
    "logical2factor": {
      "type": "boolean",
      "default": false,
      "description": "Convert logicals to factors."
    },
    "logical2numeric": {
      "type": "boolean",
      "default": false,
      "description": "Convert logicals to numeric."
    },
    "numeric2factor": {
      "type": "boolean",
      "default": false,
      "description": "Convert numeric to factors."
    },
    "numeric2factor_levels": {
      "type": ["array", "null"],
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "default": null,
      "description": "Factor levels for numeric2factor."
    },
    "numeric_cut_n": {
      "type": "integer",
      "minimum": 0,
      "default": 0,
      "description": "Cut numeric features into this many bins (0 = off)."
    },
    "numeric_cut_labels": {
      "type": "boolean",
      "default": false,
      "description": "Use labels for numeric_cut bins."
    },
    "numeric_quant_n": {
      "type": "integer",
      "minimum": 0,
      "default": 0,
      "description": "Cut numeric features into this many quantile bins (0 = off)."
    },
    "numeric_quant_NAonly": {
      "type": "boolean",
      "default": false,
      "description": "Quantile-cut only features with NAs."
    },
    "unique_len2factor": {
      "type": "integer",
      "minimum": 0,
      "default": 0,
      "description": "Convert features with <= this many unique values to factors (0 = off)."
    },
    "character2factor": {
      "type": "boolean",
      "default": false,
      "description": "Convert character features to factors."
    },
    "factorNA2missing": {
      "type": "boolean",
      "default": false,
      "description": "Convert factor NAs to a 'missing' level."
    },
    "factorNA2missing_level": {
      "type": "string",
      "default": "missing",
      "description": "Level name for factorNA2missing."
    },
    "factor2integer": {
      "type": "boolean",
      "default": false,
      "description": "Convert factors to integers."
    },
    "factor2integer_startat0": {
      "type": "boolean",
      "default": true,
      "description": "factor2integer starts at 0."
    },
    "scale": {
      "type": "boolean",
      "default": false,
      "description": "Scale features."
    },
    "center": {
      "type": "boolean",
      "default": false,
      "description": "Center features."
    },
    "remove_constants": {
      "type": "boolean",
      "default": false,
      "description": "Remove constant features."
    },
    "remove_constants_skip_missing": {
      "type": "boolean",
      "default": true,
      "description": "Ignore missing values when detecting constants."
    },
    "remove_duplicates": {
      "type": "boolean",
      "default": false,
      "description": "Remove duplicate cases."
    },
    "remove_features": {
      "type": ["array", "null"],
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "default": null,
      "description": "Names of features to remove."
    },
    "one_hot": {
      "type": "boolean",
      "default": false,
      "description": "One-hot encode factors."
    },
    "add_date_features": {
      "type": "boolean",
      "default": false,
      "description": "Add date-derived features."
    },
    "date_features": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["weekday", "month", "year"]
      },
      "minItems": 1,
      "default": ["weekday", "month", "year"],
      "description": "Date features to add."
    },
    "add_holidays": {
      "type": "boolean",
      "default": false,
      "description": "Add a holiday indicator feature."
    },
    "exclude": {
      "type": ["array", "null"],
      "items": {
        "type": "integer"
      },
      "minItems": 1,
      "default": null,
      "description": "Column indices to exclude from preprocessing."
    },
    "impute_missRanger_params": {
      "type": "object",
      "description": "Parameters passed to missRanger (e.g. pmm.k, maxiter, num.trees)."
    },
    "scale_centers": {
      "type": ["object", "null"],
      "$comment": "Data-dependent: learned during preprocess(); per-feature scaling centers."
    },
    "scale_coefficients": {
      "type": ["object", "null"],
      "$comment": "Data-dependent: learned during preprocess(); per-feature scaling coefficients."
    },
    "one_hot_levels": {
      "type": ["object", "null"],
      "$comment": "Data-dependent: learned during preprocess(); per-feature one-hot levels."
    }
  }
}
