{
 "version_protocolo": "119-C0.v4",
 "fecha_registro": "2026-09-29",
 "contrato": "119_LA_RED_DENSA_NUEVA_CONTRACT.md, aprobado por Roberto el 29-09",
 "base": {
  "protocolo": "118-C0.v3",
  "digest_sha256": "858dceea8e0d17bf65e014ef575382d6fa4b702523510badc3479d26b95e4461",
  "como_se_calculo": "sha256 del fichero protocolo_118_v3.json TAL CUAL en disco (hashlib.sha256 sobre los bytes crudos del fichero). NOTA: difiere del campo interno 'digest_sha256' que trae el propio v3 (0642cf632078dee1c580701918ebd372f1d278b5496bd89d5fc22e49e26ea993), que es un autodigest sobre el JSON canonico SIN ese campo (ver generar_protocolo_118_v3.py:145-146); aqui se pidio explicitamente el hash del fichero en disco, no ese autodigest, para fijar exactamente los bytes que sirvieron de base."
 },
 "decisiones_del_contrato_119": {
  "D1": "(a) motor NUEVO en matrixai-engines, en torch, como lightgbm; no toca el nucleo en este contrato",
  "D2": "exito = regla de cierre (32/40) y entra en la cartera; entre el techo de los retoques (~27/40) y 32/40 se publica como avance medido y NO entra en la cartera; por debajo de 27/40 se cierra como el 118",
  "D3": "convive con la densa actual hasta C5; sustituir es decision de producto aparte"
 },
 "motor": {
  "id_propuesto": "matrixai.tabm_plr.torch_cpu",
  "estado": "PROPUESTO para este registro; el motor AUN NO EXISTE en matrixai-engines, se construye en C2. El id definitivo se fija al construirlo."
 },
 "arquitectura": {
  "embeddings_numericas": {
   "nombre": "PLR (Periodic + Linear + ReLU), tambien llamadas 'PeriodicEmbeddings'",
   "fuente_paper": {
    "cita": "Yury Gorishniy, Ivan Rubachev, Artem Babenko, \"On Embeddings for Numerical Features in Tabular Deep Learning\", NeurIPS 2022",
    "arxiv": "https://arxiv.org/abs/2203.05556"
   },
   "fuente_codigo": {
    "paquete_pip": "rtdl_num_embeddings, clase PeriodicEmbeddings",
    "repositorio": "https://github.com/yandex-research/rtdl-num-embeddings",
    "fichero_leido": "package/rtdl_num_embeddings.py (rama main)",
    "readme_leido": "package/README.md (rama main)",
    "licencia_del_paquete": "Apache-2.0 (package/LICENSE, Copyright 2023 Yandex LLC)"
   },
   "parametros_por_omision_del_constructor": {
    "d_embedding": 24,
    "n_frequencies": 48,
    "frequency_init_scale": 0.01,
    "activation": true,
    "lite": "SIN VALOR POR OMISION en el codigo: es un argumento obligatorio (tras '*' en la firma, sin '='). El README lo llama 'a reasonable starting point' con lite=True, pero los DOS ejemplos ejecutables del repositorio (seccion 'Periodic embeddings' de package/README.md, y example.ipynb del repo tabm) fijan lite=False. Se elige AQUI lite=False, por ser el valor de los ejemplos ejecutables oficiales, no por mirar los 40 conjuntos."
   },
   "cita_literal_firma": "def __init__(self, n_features: int, d_embedding: int = 24, *, n_frequencies: int = 48, frequency_init_scale: float = 0.01, activation: bool = True, lite: bool) -> None:  (package/rtdl_num_embeddings.py, clase PeriodicEmbeddings, lineas ~253-262)",
   "no_consta": "rtdl_num_embeddings es solo para columnas NUMERICAS: no dice nada de categoricas."
  },
  "backbone_ensamblado": {
   "nombre": "TabM, arch_type='tabm' (el valor por omision)",
   "fuente_paper": {
    "cita": "Yury Gorishniy, Akim Kotelnikov, Artem Babenko, \"TabM: Advancing Tabular Deep Learning with Parameter-Efficient Ensembling\", ICLR 2025",
    "arxiv": "https://arxiv.org/abs/2410.24210"
   },
   "fuente_codigo": {
    "paquete_pip": "tabm, clase TabM, metodo de fabrica TabM.make()",
    "repositorio": "https://github.com/yandex-research/tabm",
    "fichero_leido": "tabm.py (rama main, raiz del repo -- NO esta en una carpeta 'package/')",
    "readme_leido": "README.md (rama main)",
    "ejemplo_leido": "example.ipynb (rama main)",
    "licencia": "Apache-2.0 (LICENSE, Copyright 2024 Yandex LLC; cubre todo el repo, incluido tabm.py)"
   },
   "parametros_por_omision_de_TabM_make": {
    "k": 32,
    "arch_type": "tabm",
    "d_block": 512,
    "dropout": 0.1,
    "activation": "ReLU",
    "n_blocks": "2 SI se pasa num_embeddings (nuestro caso, con PLR); 3 si no se pasa ninguno. Fuente literal: 'n_blocks': 2 if has_num_embeddings else 3",
    "start_scaling_init": "'normal' cuando hay num_embeddings (nuestro caso); 'random-signs' si no hay num_embeddings"
   },
   "cita_literal_defaults": "defaults = {'n_blocks': 2 if has_num_embeddings else 3, 'd_block': 512, 'dropout': 0.1, 'activation': 'ReLU', 'k': 32, 'arch_type': default_arch_type, 'start_scaling_init': (None if kwargs.get('arch_type', default_arch_type) == 'tabm-packed' else 'normal' if has_num_embeddings else 'random-signs')}  (tabm.py, TabM.make(), rama main)",
   "k_en_el_espacio_de_busqueda_del_paper": "tabla de hiperparametros del README: k = Const[32] (NO se afina); n_blocks = UniformInt[1,5] para TabM puro y UniformInt[1,4] para TabM con PiecewiseLinearEmbeddings; d_block = UniformInt[64,1024,step=16]",
   "promediado_de_las_k_salidas": {
    "entrenamiento": "las k cabezas se entrenan de forma independiente sobre la perdida MEDIA, nunca sobre la perdida de la prediccion media. Cita literal: 'It is crucial to train the k predictions of TabM indepedendently without averaging them. In other words, the mean loss must be optimized, not the loss of the mean prediction.' (README.md, seccion 'Training')",
    "inferencia": "se promedian las k predicciones; en clasificacion se promedian PROBABILIDADES, no logits. Cita literal: 'On inference, to obtain a prediction for a given object, average the k predictions. [...] on classification tasks, probabilities should usually be averaged, not logits.' (README.md, seccion 'Inference')",
    "share_training_batches": "True en el ejemplo oficial (example.ipynb) y recomendado por el propio repo: 'True is recommended by default because of better training efficiency.' (example.ipynb, celda de comentario sobre share_training_batches)"
   }
  },
  "embeddings_categoricas": {
   "que_hace_TabM_por_omision": "ONE-HOT, siempre, para TODAS las cardinalidades -- no hay ningun camino de embedding para categoricas en el paquete tabm. Cita literal del docstring de TabM.__init__: \"cat_cardinalities: the cardinalities of the categorical features [...] The categorical features are encoded with the one-hot encoding.\" (tabm.py, clase TabM, docstring de __init__)",
   "no_consta": "ni tabm ni rtdl_num_embeddings ofrecen una capa de embedding para categoricas (rtdl_num_embeddings es solo numericas; tabm solo hace one-hot). El contrato 119 exige embeddings para TODAS las categoricas en C2 (cierra la C4 del contrato 118): su diseno concreto (dimension, inicializacion) NO esta en ninguna de las dos fuentes citadas aqui y queda fuera del alcance de citas de este protocolo -- se define en C2.",
   "decision_del_119": {
    "que": "EMBEDDING aprendido para TODAS las categóricas, de cualquier cardinalidad (como pide el contrato 119 aprobado, y cierra la C4 del 118); dimensión 24 = la misma `d_embedding` de las numéricas (PLR), para que cada columna entre al cuerpo con el mismo ancho. Una categoría no vista en train va a un índice «desconocido» propio.",
    "por_que_no_one_hot_como_TabM": "con one-hot, KDDCup09 (una categórica de 15.415 valores y 20 de más de 12) haría la primera capa de decenas de miles de entradas: es la causa (3) del análisis del 24-09 (Allstate y KDDCup09 agotaban el tiempo) y no cabría en el presupuesto de pared. La regla del núcleo ya lo hace hoy (> 12 valores → embedding, `_ONEHOT_MAX`).",
    "que_no_es": "NO sale de TabM ni de rtdl_num_embeddings: es una decisión de ESTE protocolo, fijada antes de medir y sin mirar los 40 conjuntos. Si C3 no cumple, no se retoca sobre los mismos 32 (regla del contrato).",
    "fijado": "2026-09-29, supervisor, antes de construir"
   },
   "faltantes_decision_del_119": {
    "que": "una categórica faltante es su PROPIO valor («ausente»), con su fila en el embedding, distinta del índice de «desconocido» (valor no visto en train)",
    "fijado": "2026-09-29, supervisor, antes de medir"
   }
  },
  "preprocesado_numericas": {
   "fuente": {
    "ejemplo_oficial": "example.ipynb (repo tabm, rama main), celda 'Data preprocessing'",
    "config_del_paper": "paper/exp/debug/0.toml y paper/exp/mlp-periodic/adult/0-tuning.toml (rama main): [data] num_policy = \"noisy-quantile\", mismo nombre que la estrategia del notebook; la implementacion real vive en un paquete `lib` que el repo tabm IMPORTA pero NO incluye (paper/bin/model.py: 'import lib', 'import lib.data'; no hay carpeta lib/ en el repositorio, confirmado listando el arbol de git), asi que su codigo literal no consta en este repositorio -- se cita el equivalente autocontenido de example.ipynb, que es la fuente 'oficialmente recomendada' segun el propio README del paquete rtdl_num_embeddings"
   },
   "transformador": "sklearn.preprocessing.QuantileTransformer",
   "parametros": {
    "n_quantiles": "max(min(len(train_idx) // 30, 1000), 10)",
    "output_distribution": "normal",
    "subsample": 1000000000
   },
   "ruido_antes_de_ajustar": {
    "que": "se anade ruido gaussiano SOLO a la copia de train usada para AJUSTAR el transformador; los datos que luego se TRANSFORMAN (train, validation, test) son los ORIGINALES, sin ruido",
    "distribucion": "np.random.default_rng(0).normal(0.0, 1e-5, x_num_train.shape), casteado al mismo dtype que los datos de train -- media 0.0, desviacion 1e-5, semilla 0",
    "motivo_citado": "'The noise is added to improve the output of QuantileTransformer in some cases.' (example.ipynb, comentario en la celda 'Data preprocessing')"
   },
   "ajustado_sobre": "SOLO train (data_numpy['train']['x_num'] + ruido); nunca validation ni test -- mismo criterio que 118-C1.cuantiles",
   "aplicado_a": "el transformador ya AJUSTADO se aplica (.transform, SIN ruido) a train, validation y test por igual",
   "cita_literal_codigo": "x_num_train_numpy = data_numpy['train']['x_num']\nnoise = (\n    np.random.default_rng(0)\n    .normal(0.0, 1e-5, x_num_train_numpy.shape)\n    .astype(x_num_train_numpy.dtype)\n)\npreprocessing = sklearn.preprocessing.QuantileTransformer(\n    n_quantiles=max(min(len(train_idx) // 30, 1000), 10),\n    output_distribution='normal',\n    subsample=10**9,\n).fit(x_num_train_numpy + noise)\ndel x_num_train_numpy\n\n# Apply the preprocessing.\nfor part in data_numpy:\n    data_numpy[part]['x_num'] = preprocessing.transform(data_numpy[part]['x_num'])\n(example.ipynb, celda 'Data preprocessing')",
   "faltantes": {
    "no_consta": "ni example.ipynb ni los .toml del paper muestran tratamiento de valores faltantes en las numericas; los datasets usados en el notebook (California housing, y un conjunto sintetico de sklearn) no tienen faltantes, asi que el ejemplo no lo ejercita. El codigo real de imputacion, si existe, viviria en el paquete `lib` no incluido en este repositorio (ver nota en 'fuente' arriba)."
   },
   "faltantes_decision_del_119": {
    "que": "una numérica faltante se rellena con la MEDIANA de train antes del QuantileTransformer (la misma política que la preparación del núcleo, `matrixai/training/preparacion.py`, ajustada solo con train); sin columna-marca aparte",
    "por_que": "la fuente no lo trata («no consta»: sus conjuntos no traen faltantes) y los 40 de Fase 0 sí; se toma la regla que ya aplica la casa en vez de inventar una",
    "fijado": "2026-09-29, supervisor, antes de medir"
   }
  },
  "objetivo_regresion": {
   "fuente": {
    "ejemplo_oficial": "example.ipynb (repo tabm, rama main), celda 'Data preprocessing' (bloque 'Label preprocessing') y celda 'evaluate' (deshace la estandarizacion antes de medir)",
    "config_del_paper": "paper/bin/model.py, funcion main (~lineas 345-350): se llama SIEMPRE lib.data.standardize_labels(...) para toda tarea de regresion, sin condicion de asimetria; el codigo de standardize_labels en si vive en el paquete `lib` externo, no incluido en este repositorio (misma limitacion que el preprocesado de numericas)"
   },
   "transformacion": "estandarizacion: (y - media_train) / desviacion_train",
   "ajustado_sobre": "SOLO train",
   "log1p": "NO CONSTA en ninguna de las dos fuentes leidas (ni example.ipynb ni la llamada de paper/bin/model.py a lib.data.standardize_labels): no hay condicion de asimetria ni transformacion logaritmica citada en ningun sitio de este repositorio. El propio nombre de la funcion ('standardize_labels') y el comentario del notebook ('it is highly recommended to standardize the training labels') no mencionan ningun log; la fuente aplica SIEMPRE una estandarizacion simple, incondicional (a diferencia de 118-C2.objetivo, que aplica log1p condicionado a la asimetria de train)",
   "deshacer_en_prediccion": "y_pred = y_pred * desviacion_train + media_train, antes de calcular la metrica -- cita literal en 'evaluate()': 'y_pred = y_pred * regression_label_stats.std + regression_label_stats.mean'",
   "cita_literal_codigo_ejemplo": "Y_train = data_numpy['train']['y'].copy()\nif task_type == 'regression':\n    # For regression tasks, it is highly recommended to standardize the training labels.\n    regression_label_stats = RegressionLabelStats(\n        Y_train.mean().item(), Y_train.std().item()\n    )\n    Y_train = (Y_train - regression_label_stats.mean) / regression_label_stats.std\nelse:\n    regression_label_stats = None\n(example.ipynb, celda 'Data preprocessing')",
   "cita_literal_codigo_paper": "dataset = lib.data.build_dataset(**config['data'])\nif dataset.task.is_regression:\n    dataset.data['y'], regression_label_stats = lib.data.standardize_labels(\n        dataset.data['y']\n    )\nelse:\n    regression_label_stats = None\n(paper/bin/model.py, funcion main)",
   "clasificacion": "sin cambio (no aplica)"
  }
 },
 "receta_entrenamiento": {
  "fuente": {
   "ejemplo_oficial": "example.ipynb (repo tabm, rama main), celdas 'Model and optimizer' y 'Training'",
   "config_del_paper": "paper/exp/debug/0.toml y paper/exp/mlp-periodic/adult/0-tuning.toml (repo tabm, rama main): mismos valores que el ejemplo, confirmando que no es solo un ejemplo de juguete",
   "readme": "README.md, seccion 'Default optimizer'"
  },
  "optimizador": "adamw",
  "learning_rate": 0.002,
  "weight_decay": 0.0003,
  "cita_literal_optimizador_readme": "Currently, for the default TabM, the default optimizer is torch.optim.AdamW(..., lr=0.002, weight_decay=0.0003). (README.md, seccion 'Default optimizer')",
  "cita_literal_ejemplo": "optimizer = torch.optim.AdamW(model.parameters(), lr=2e-3, weight_decay=3e-4) (example.ipynb, celda 'Model and optimizer')",
  "recorte_de_gradiente": {
   "norma_maxima": 1.0,
   "fuente": "gradient_clipping_norm: Optional[float] = 1.0 (example.ipynb); gradient_clipping_norm = 1.0 (paper/exp/debug/0.toml y paper/exp/mlp-periodic/adult/0-tuning.toml)"
  },
  "batch_size": {
   "valor_fuente": 256,
   "fuente": "batch_size = 256 (example.ipynb); batch_size = 256 (paper/exp/debug/0.toml y paper/exp/mlp-periodic/adult/0-tuning.toml)",
   "aplicado_aqui": "min(256, filas de train), mismo criterio que 118-C3.receta, para no exceder el tamano de train en los conjuntos pequenos"
  },
  "parada_temprana": {
   "paciencia_epocas": 16,
   "metrica": "validation_loss / la metrica de validacion del arnes -- mismo criterio que 118-C3.receta",
   "cita_literal": "patience = 16 [...] Early stopping: the training stops if the validation score does not improve for more than patience consecutive epochs. (example.ipynb); patience = 16 (paper/exp/debug/0.toml y paper/exp/mlp-periodic/adult/0-tuning.toml)"
  },
  "epocas_maximas": {
   "valor_fuente": "SIN TOPE en la fuente: n_epochs = -1 en los .toml del paper (sin limite salvo la paciencia), n_epochs = 1_000_000_000 en example.ipynb (mismo efecto practico)",
   "aplicado_aqui": "el tope real es el plazo del motor (0,75 del presupuesto de pared), igual que 118-C3.receta: 'nunca mas reloj'",
   "no_consta": "la fuente no publica un numero tipico de epocas hasta la parada temprana; solo la paciencia (16) esta fijada como valor por omision"
  },
  "share_training_batches": true
 },
 "licencias": {
  "contexto": "El contrato 119 fija 'sin dependencias nuevas: torch ya esta [...] Las piezas de los articulos se implementan aqui, citandolos.' Esta seccion deja constancia de las licencias de los paquetes de referencia, por si alguna vez se evalua usarlos tal cual en vez de reimplementar (entraria en la tabla de terceros).",
  "rtdl_num_embeddings": {
   "licencia_del_paquete_pip": "Apache License 2.0, Copyright 2023 Yandex LLC (package/LICENSE, rama main del repo rtdl-num-embeddings)",
   "licencia_raiz_del_repositorio": "MIT License, Copyright (c) 2022 Authors of \"On Embeddings for Numerical Features in Tabular Deep Learning\" (LICENSE, rama main) -- cubre el codigo de investigacion original (bin/, lib/), NO el paquete instalable, que tiene su propia licencia Apache-2.0 en package/LICENSE",
   "se_podria_usar_el_paquete_en_vez_de_reimplementar": "si, Apache-2.0 es permisiva y compatible"
  },
  "tabm": {
   "licencia": "Apache License 2.0, Copyright 2024 Yandex LLC (LICENSE, rama main; cubre todo el repositorio, incluido tabm.py, el paquete pip instalable)",
   "se_podria_usar_el_paquete_en_vez_de_reimplementar": "si, Apache-2.0 es permisiva y compatible"
  }
 },
 "c0_lecturas": {
  "cardinalidades_categoricas_mayores_de_12": {
   "regla_del_nucleo": "_ONEHOT_MAX = 12 (dataset_project.py:63-71): las categoricas con mas de 12 valores van a la red COMPUESTA del nucleo, con embedding",
   "medido_en_cabeceras_ARFF": [
    {
     "nombre": "KDDCup09_appetency",
     "n_categoricas_gt_12": 20,
     "max_cardinalidad_medida": 15415,
     "sellado": false
    },
    {
     "nombre": "Amazon_employee_access",
     "n_categoricas_gt_12": 9,
     "max_cardinalidad_medida": 7518,
     "sellado": false
    },
    {
     "nombre": "okcupid-stem",
     "n_categoricas_gt_12": 9,
     "max_cardinalidad_medida": 7019,
     "sellado": false
    },
    {
     "nombre": "splice",
     "n_categoricas_gt_12": 1,
     "max_cardinalidad_medida": 3178,
     "sellado": true
    },
    {
     "nombre": "kick",
     "n_categoricas_gt_12": 8,
     "max_cardinalidad_medida": 1063,
     "sellado": false
    },
    {
     "nombre": "Allstate_Claims_Severity",
     "n_categoricas_gt_12": 16,
     "max_cardinalidad_medida": 326,
     "sellado": false
    },
    {
     "nombre": "house_sales",
     "n_categoricas_gt_12": 1,
     "max_cardinalidad_medida": 70,
     "sellado": false
    },
    {
     "nombre": "Moneyball",
     "n_categoricas_gt_12": 1,
     "max_cardinalidad_medida": 39,
     "sellado": false
    },
    {
     "nombre": "house_prices_nominal",
     "n_categoricas_gt_12": 3,
     "max_cardinalidad_medida": 25,
     "sellado": false
    },
    {
     "nombre": "dresses-sales",
     "n_categoricas_gt_12": 7,
     "max_cardinalidad_medida": 24,
     "sellado": false
    },
    {
     "nombre": "SAT11-HAND-runtime-regression",
     "n_categoricas_gt_12": 1,
     "max_cardinalidad_medida": 15,
     "sellado": false
    }
   ],
   "comparado_con_protocolo_118_v3": {
    "max_cardinalidad_nominal_y_sellado": "COINCIDE exactamente en los 11/11: mismo max_cardinalidad_nominal que 'max_cardinalidad_medida' arriba, y el mismo 'sellado' (splice=true, el resto=false)",
    "alta_cardinalidad_booleano": "NO CUADRA en 4 de los 11: v3 trae 'alta_cardinalidad: false' para Moneyball (39), house_prices_nominal (25), dresses-sales (24) y SAT11-HAND-runtime-regression (15), pese a superar el umbral _ONEHOT_MAX=12 del nucleo que de verdad decide el camino a la red compuesta. v3 marca 'alta_cardinalidad: true' en los otros 7 (KDDCup09_appetency, Amazon_employee_access, okcupid-stem, splice, kick, Allstate_Claims_Severity, house_sales). Con los puntos disponibles, el corte de esa bandera en v3 queda entre 39 (false) y 70 (true): usa un umbral MAS ALTO que el _ONEHOT_MAX=12 real del nucleo. No es un dato incorrecto (los max_cardinalidad_nominal si son exactos) sino una etiqueta con un criterio distinto al que enruta de verdad. No se corrige aqui (v3 no se toca); queda escrito para que C2 no use 'alta_cardinalidad' de v3 como proxy del enrutado real por embeddings."
   }
  },
  "coste_densa_v2_en_intentos": {
   "total_h": 9.1,
   "por_cubo": {
    "pequeno": {
     "h": 1.0,
     "mediana_s": 12.7
    },
    "mediano": {
     "h": 3.21,
     "mediana_s": 37.1
    },
    "grande": {
     "h": 4.89,
     "mediana_s": 322.6,
     "maximo_s": 646.2,
     "presupuesto_s": 600
    }
   },
   "no_sellados_h": 7.54,
   "sellados_h": 1.56,
   "coherencia_con_v3": "protocolo_118_v3.json ya registra coste_estimado.densa_v2_en_no_sellados_h_de_intentos = 7.54, identico al dato de partida aqui (9.10 - 1.56 = 7.54): coincide"
  }
 },
 "c1_plan": {
  "objetivo": "medir SOLO coste (epocas/segundo en CPU, 5 hilos), NUNCA metrica, para fijar k y d_block del motor nuevo antes de construirlo en C2",
  "conjuntos": [
   "Allstate_Claims_Severity",
   "KDDCup09_appetency",
   "APSFailure"
  ],
  "motivo_de_los_tres": "los 3 conjuntos mas caros para la densa hoy, segun el riesgo declarado en el contrato 119 ('El coste en CPU')",
  "rejilla_de_coste": {
   "k": [
    8,
    16,
    32
   ],
   "d_block": [
    256,
    512
   ],
   "n_blocks": "fijo en 2 (el valor por omision de TabM.make() con num_embeddings presente)",
   "total_configuraciones": 6,
   "total_medidas": 18
  },
  "regla_escrita_antes_de_medir": {
   "configuracion_por_omision_de_la_fuente": {
    "k": 32,
    "d_block": 512,
    "n_blocks": 2
   },
   "N_epocas_minimas": {
    "valor": 17,
    "porque": "17 = paciencia (16, fuente: example.ipynb y los .toml del paper) + 1: el minimo para que la parada temprana pueda completar UNA ventana entera de 'sin mejora' dentro del plazo. La fuente no da un numero tipico de epocas hasta converger (n_epochs no tiene tope en la fuente); solo la paciencia esta fijada, asi que N se ancla a ella, no a una cifra inventada"
   },
   "criterio": "se elige la configuracion por omision de la fuente (k=32, d_block=512) si en los 3 conjuntos cabe en 0,75 x 600 s = 450 s con al menos 17 epocas. Si no cabe, se baja k primero (32 -> 16 -> 8, en ese orden) y solo despues la anchura (d_block 512 -> 256), hasta que quepa en los 3 conjuntos a la vez",
   "nunca_por_metrica": "la sonda de C1 no calcula ninguna metrica; solo cronometra"
  },
  "duracion_estimada": {
   "minutos": "25-35",
   "desglose": "preparar una vez los 3 conjuntos grandes (carga + particion, ~5 min) + 18 medidas cortas de epocas/s (unas pocas epocas cada una, no hasta converger; ~1-1.5 min cada una a 5 hilos en los conjuntos mas caros) + margen",
   "coherente_con_el_contrato": "el contrato 119 estima C1 en ~30 min; esta cifra no lo supera"
  },
  "recursos": {
   "cpu_hilos": 5,
   "techo_memoria": "6G",
   "de_dia": true
  },
  "parametros_por_configuracion": {
   "que": "la sonda cuenta, además del tiempo, los PARÁMETROS de cada configuración en cada conjunto (sin métrica)",
   "por_que": "con los valores por omisión (k=32, d_block=512, PLR 24 × columnas), la primera capa de KDDCup09 (231 columnas) ya pasa de 5.500 × 512 ≈ 2,8 M de pesos, por encima de los 2 M del perfil «equilibrado» del producto (`matrixai/limits.py`). En Fase 0 el motor corre sin los topes de producto (`sin_topes`); el número se registra para que C5 (qué hace el producto con ella) lo tenga delante, no para elegir la configuración."
  }
 },
 "veredicto": {
  "regla_de_subida": {
   "que": "el motor nuevo sube a confirmacion en los sellados (C4) si cumple las DOS condiciones sobre los 32 no sellados (C3), frente a la densa v2 en los MISMOS conjuntos y particiones -- copiada literal de 118-C0.v3, sustituyendo 'la palanca' por 'el motor nuevo'",
   "condicion_1_sube_los_cumplidos": "el numero de conjuntos donde el motor nuevo esta a <=2 puntos del mejor es mayor que el numero de conjuntos donde la densa v2 lo estaba (mismos 32)",
   "condicion_2_mejoras_superan_a_inferioridades": "diferencia emparejada (motor nuevo - densa v2) por repeticion y pliegue, intervalo 95% por bootstrap de pliegues (1000 remuestras, semilla 0): 'mejora' si excluye el cero por arriba, 'inferioridad' si por abajo; el conteo de 'mejora' > el conteo de 'inferioridad'",
   "si_no_cumple": "NO se relanza sobre los mismos 32 con otros valores (eso seria afinar contra el examen); se cierra C3 como esta, se declara el resultado medido y C5 decide con D2. Un segundo intento necesita una enmienda escrita antes, con su motivo (regla del contrato 119)"
  },
  "confirmacion": "la receta elegida, UNA vez, en los SELLADOS; es la cifra que se publica (copiado literal de 118-C0.v3.veredicto.confirmacion)",
  "liston": "a 2 puntos del mejor en >= 80% de los conjuntos (el de la v2, sin tocar) (copiado literal de 118-C0.v3.veredicto.liston)",
  "tabla_de_referencia": {
   "que": "los otros seis motores de la pasada v2 (113-C5, protocolo v2), CONGELADOS: NO se re-miden en C3 ni en C4",
   "motores": [
    "dummy",
    "sklearn.logreg",
    "sklearn.hgb",
    "lightgbm",
    "xgboost",
    "catboost"
   ],
   "fuente": "protocolo_exploratorio_v2.json (lista 'motores') y pasada_v2_113_resultado.json (resultados ya medidos); 'dummy' cuenta para la tabla pero queda excluido de la definicion de 'mejor' (regla_de_cierre.definicion_de_mejor, copiada sin tocar de v3)"
  },
  "exito_segun_D2": "32/40 (regla de cierre, 80% de 40) entra en la cartera; entre el techo de los retoques (~27/40, analisis del 24-09) y 32/40 se publica como avance medido y NO entra en la cartera; por debajo de 27/40 se cierra como el 118. (119_LA_RED_DENSA_NUEVA_CONTRACT.md, decision D2 de Roberto)"
 },
 "datasets": [
  {
   "data_id": 3,
   "nombre": "kr-vs-kp",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 1,
   "sha256_arff": "b22a8a12bd40648400b000bad0545683b8ecd33ac84f2c265dd5c309c832fd69",
   "columna_objetivo": "class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 3196,
   "n_columnas": 37,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 3,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": true,
   "file_id": 3
  },
  {
   "data_id": 6,
   "nombre": "letter",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "a31f2d9ad119a53e182e7371d48981982dbb2b0a5e9f0aa7b73f373857b64e2e",
   "columna_objetivo": "class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 20000,
   "n_columnas": 17,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": true,
   "file_id": 6
  },
  {
   "data_id": 11,
   "nombre": "balance-scale",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "87d3943cea423bb376be52b5dfec17f79c63108dddcf40e0a46e5ba7196a5c24",
   "columna_objetivo": "class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 625,
   "n_columnas": 5,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 11
  },
  {
   "data_id": 12,
   "nombre": "mfeat-factors",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 1,
   "sha256_arff": "609d8f01dbf3f34a953617cc3586ddbb897d98013eba4ef4a4bf73791205ae5c",
   "columna_objetivo": "class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 2000,
   "n_columnas": 217,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 12
  },
  {
   "data_id": 28,
   "nombre": "optdigits",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "e86f102c957f41c7022b187766b0f9949a54ae8cedc492de1cc29765f060358a",
   "columna_objetivo": "class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 5620,
   "n_columnas": 65,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 28
  },
  {
   "data_id": 32,
   "nombre": "pendigits",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "5be0ce5f618a248a15e953bb63bd2c6bd99c1b9cdcd59c0a6abf06ae58758bca",
   "columna_objetivo": "class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 10992,
   "n_columnas": 17,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 32
  },
  {
   "data_id": 37,
   "nombre": "diabetes",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "4eddd5b2b64679e8888348e306520a393d6a28e1ddc9643cfb76fc5d912d6d40",
   "columna_objetivo": "class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 768,
   "n_columnas": 9,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 37
  },
  {
   "data_id": 38,
   "nombre": "sick",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "85c39615380ca4c05c17a53c3faad9523924958d1e9bc5af0dcbefc6339e7800",
   "columna_objetivo": "Class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 3772,
   "n_columnas": 30,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 5,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 38
  },
  {
   "data_id": 46,
   "nombre": "splice",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "4b22fd2fc0564f0b5af59a5a40ee0dd77476835ba48b717960d85d095be53036",
   "columna_objetivo": "Class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 3190,
   "n_columnas": 61,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 3178,
   "alta_cardinalidad": true,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": true,
   "file_id": 46
  },
  {
   "data_id": 181,
   "nombre": "yeast",
   "fuente": "amlb-clasificacion",
   "version": 1,
   "sha256_arff": "ae97eccd3ad5f9a998efec8acb2026f1748df6c8a392a5b2b0f321c2ef053933",
   "columna_objetivo": "class_protein_localization",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1484,
   "n_columnas": 9,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 3616
  },
  {
   "data_id": 201,
   "nombre": "pol",
   "fuente": "amlb-regresion",
   "version": 1,
   "sha256_arff": "0f5f397fb144dfb7269a03e4eccc84a413a48982ceef0a91b142c9917b39675e",
   "columna_objetivo": "foo",
   "tarea": "regression",
   "cubo_de_tamano": "mediano",
   "n_filas": 15000,
   "n_columnas": 49,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": true,
   "file_id": 3638
  },
  {
   "data_id": 287,
   "nombre": "wine_quality",
   "fuente": "amlb-regresion",
   "version": 1,
   "sha256_arff": "a06ffbd99a40aaf09315f914a3a681f7d6d757a614c5d414410a4877f5709093",
   "columna_objetivo": "quality",
   "tarea": "regression",
   "cubo_de_tamano": "mediano",
   "n_filas": 6497,
   "n_columnas": 12,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 49817
  },
  {
   "data_id": 574,
   "nombre": "house_16H",
   "fuente": "amlb-regresion",
   "version": 1,
   "sha256_arff": "c9d4c46cb5f598fd9e3e1993a1ff06d85c662e50a9fe1fef9c1dc7d067d3b311",
   "columna_objetivo": "price",
   "tarea": "regression",
   "cubo_de_tamano": "grande",
   "n_filas": 22784,
   "n_columnas": 17,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 52752
  },
  {
   "data_id": 1049,
   "nombre": "pc4",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 1,
   "sha256_arff": "a257bbf9d05df9b6a12675e5a74da2b138c59591f24bc3866c68f8abc67624c1",
   "columna_objetivo": "c",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1458,
   "n_columnas": 38,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 53932
  },
  {
   "data_id": 1050,
   "nombre": "pc3",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "2ef1d5e4712544e44213a23532cf5fd8e8515ad22fa428b9f3443e4190a8e57e",
   "columna_objetivo": "c",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1563,
   "n_columnas": 38,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": true,
   "file_id": 53933
  },
  {
   "data_id": 1053,
   "nombre": "jm1",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "8f3795e84e8755f1b21b4820c9f3286e60843d3f0a9751c595e0c47e786a7b52",
   "columna_objetivo": "defects",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 10885,
   "n_columnas": 22,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 53936
  },
  {
   "data_id": 1063,
   "nombre": "kc2",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "832b27ed0b34faddd8d4b3c23cdc65e5118bd7694f016b449f3d0b70c8575fd5",
   "columna_objetivo": "problems",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 522,
   "n_columnas": 22,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 53946
  },
  {
   "data_id": 1068,
   "nombre": "pc1",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "a22470def91454aa442e54104e2856c53725e8c9108bdfaac867504982483f97",
   "columna_objetivo": "defects",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1109,
   "n_columnas": 22,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 53951
  },
  {
   "data_id": 1111,
   "nombre": "KDDCup09_appetency",
   "fuente": "amlb-clasificacion",
   "version": 1,
   "sha256_arff": "201abbcfec1177badbc60bd67433186edde5d01374977183a2f49ffa9d863eca",
   "columna_objetivo": "APPETENCY",
   "tarea": "binary_classification",
   "cubo_de_tamano": "grande",
   "n_filas": 50000,
   "n_columnas": 231,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 15415,
   "alta_cardinalidad": true,
   "desbalanceado": true,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 53994
  },
  {
   "data_id": 1462,
   "nombre": "banknote-authentication",
   "fuente": "openml-cc18",
   "version": 1,
   "sha256_arff": "ba23e986caffafbdce29c651278bb0455cdae5c2274e86afe4716c47a4fb278d",
   "columna_objetivo": "Class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1372,
   "n_columnas": 5,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": true,
   "file_id": 1586223
  },
  {
   "data_id": 1487,
   "nombre": "ozone-level-8hr",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 1,
   "sha256_arff": "2d5cd15a541f72a46ececf2332e611944752cce78a79d1a3311bec8fbb51d10e",
   "columna_objetivo": "Class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 2534,
   "n_columnas": 73,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 1592279
  },
  {
   "data_id": 1515,
   "nombre": "micro-mass",
   "fuente": "amlb-clasificacion",
   "version": 2,
   "sha256_arff": "b4109c3ac28c6d248993fb1936df6137414c9d90efb46179880948e4cb46aa9f",
   "columna_objetivo": "Class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 571,
   "n_columnas": 1301,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 1593707
  },
  {
   "data_id": 4135,
   "nombre": "Amazon_employee_access",
   "fuente": "amlb-clasificacion",
   "version": 1,
   "sha256_arff": "4f33c09f3612b5de1294ca664eec7fd1bb56a94b05d0352219794a37e4acc8cc",
   "columna_objetivo": "target",
   "tarea": "binary_classification",
   "cubo_de_tamano": "grande",
   "n_filas": 32769,
   "n_columnas": 10,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 7518,
   "alta_cardinalidad": true,
   "desbalanceado": true,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 1681098
  },
  {
   "data_id": 4534,
   "nombre": "PhishingWebsites",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 1,
   "sha256_arff": "3bcf93b1612306537ee2737751f1bac185b2a77886ab376644c3bf0c7f7cb3e6",
   "columna_objetivo": "Result",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 11055,
   "n_columnas": 31,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 3,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 1798106
  },
  {
   "data_id": 23381,
   "nombre": "dresses-sales",
   "fuente": "openml",
   "version": 2,
   "sha256_arff": "44057bb677eb4a144d01816262fc164f923a46fdda019a026e83e0c44b58ee95",
   "columna_objetivo": "Class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 500,
   "n_columnas": 13,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 24,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 1910507
  },
  {
   "data_id": 40668,
   "nombre": "connect-4",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 2,
   "sha256_arff": "430cc660591a281550b4270886776a7c0a7f8047bbdbbcc6ee428f223369e219",
   "columna_objetivo": "class",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "grande",
   "n_filas": 67557,
   "n_columnas": 43,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 3,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "public",
   "sellado": false,
   "file_id": 4965243
  },
  {
   "data_id": 40900,
   "nombre": "Satellite",
   "fuente": "amlb-clasificacion",
   "version": 1,
   "sha256_arff": "7dbb82e275016c3b3a1382ac9172e6ff65ca885ac611cf3d03e78e92d59a7646",
   "columna_objetivo": "Target",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 5100,
   "n_columnas": 37,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": true,
   "file_id": 16787463
  },
  {
   "data_id": 40978,
   "nombre": "Internet-Advertisements",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 2,
   "sha256_arff": "853b895fb12183ee665de29559d8aab1dc77abcf24602e4c3132b23b035b9a09",
   "columna_objetivo": "class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 3279,
   "n_columnas": 1559,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 2,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 18140371
  },
  {
   "data_id": 40983,
   "nombre": "wilt",
   "fuente": "openml-cc18+amlb-clasificacion",
   "version": 2,
   "sha256_arff": "e29d2b9c08fbd21fe7104df37f16eed8fd0d3a9c782cbb8efada0cf7ebb8d6bb",
   "columna_objetivo": "class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "mediano",
   "n_filas": 4839,
   "n_columnas": 6,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 18151926
  },
  {
   "data_id": 40994,
   "nombre": "climate-model-simulation-crashes",
   "fuente": "openml-cc18",
   "version": 4,
   "sha256_arff": "5be0901079f4d3317631ad9e955cd5e45d5eb8c753565b197e49e461524085b8",
   "columna_objetivo": "outcome",
   "tarea": "binary_classification",
   "cubo_de_tamano": "pequeno",
   "n_filas": 540,
   "n_columnas": 21,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 18237248
  },
  {
   "data_id": 41021,
   "nombre": "Moneyball",
   "fuente": "amlb-regresion",
   "version": 2,
   "sha256_arff": "1ef7013b57ff2ce89a0b8b25dc643ce7eca4b24d6b93785c2945983b2e8364e2",
   "columna_objetivo": "RS",
   "tarea": "regression",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1232,
   "n_columnas": 15,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 39,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 18626236
  },
  {
   "data_id": 41138,
   "nombre": "APSFailure",
   "fuente": "amlb-clasificacion",
   "version": 1,
   "sha256_arff": "e95128fc82ef5d5bc5a732b0bc63dea0f6e285cc60f31290c81f82ea13429c4f",
   "columna_objetivo": "class",
   "tarea": "binary_classification",
   "cubo_de_tamano": "grande",
   "n_filas": 76000,
   "n_columnas": 171,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": true,
   "solo_numericas": true,
   "licencia": "CC0",
   "sellado": false,
   "file_id": 19335511
  },
  {
   "data_id": 41162,
   "nombre": "kick",
   "fuente": "openml",
   "version": 1,
   "sha256_arff": "918b922249d410f9274557850e0f494d51a450a97c4755ce0c6889b82811d0ff",
   "columna_objetivo": "IsBadBuy",
   "tarea": "binary_classification",
   "cubo_de_tamano": "grande",
   "n_filas": 72983,
   "n_columnas": 33,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 1063,
   "alta_cardinalidad": true,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "CC0",
   "sellado": false,
   "file_id": 19335679
  },
  {
   "data_id": 41980,
   "nombre": "SAT11-HAND-runtime-regression",
   "fuente": "openml",
   "version": 1,
   "sha256_arff": "1ab43811428dfbd685e41edd34fd63222d4da768ab5060c8ee820268740a848b",
   "columna_objetivo": "runtime",
   "tarea": "regression",
   "cubo_de_tamano": "mediano",
   "n_filas": 4440,
   "n_columnas": 117,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 15,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 21388255
  },
  {
   "data_id": 42225,
   "nombre": "diamonds",
   "fuente": "amlb-regresion",
   "version": 1,
   "sha256_arff": "0bbef7a24061e5cc4e8591eea59417948a2d2286401675b57163a555e1849b40",
   "columna_objetivo": "price",
   "tarea": "regression",
   "cubo_de_tamano": "grande",
   "n_filas": 53940,
   "n_columnas": 10,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 8,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "public domain",
   "sellado": true,
   "file_id": 21792853
  },
  {
   "data_id": 42563,
   "nombre": "house_prices_nominal",
   "fuente": "amlb-regresion",
   "version": 1,
   "sha256_arff": "1e83c38ec2f33615fc3308a641e6f3a1fe4a7b4fbb8dd54913c6082799602bdc",
   "columna_objetivo": "SalePrice",
   "tarea": "regression",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1460,
   "n_columnas": 80,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 25,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 21854633
  },
  {
   "data_id": 42571,
   "nombre": "Allstate_Claims_Severity",
   "fuente": "amlb-regresion",
   "version": 1,
   "sha256_arff": "34b4b36a712efb6263710fc6d07a53926bee42028e461f9c51f1911c557218fa",
   "columna_objetivo": "loss",
   "tarea": "regression",
   "cubo_de_tamano": "grande",
   "n_filas": 188318,
   "n_columnas": 131,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 326,
   "alta_cardinalidad": true,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 21854647
  },
  {
   "data_id": 42730,
   "nombre": "us_crime",
   "fuente": "amlb-regresion",
   "version": 2,
   "sha256_arff": "17d04c67182f1f522752946cbf6ada34b145ca0705c0e396eab6ffcda1552507",
   "columna_objetivo": "ViolentCrimesPerPop",
   "tarea": "regression",
   "cubo_de_tamano": "pequeno",
   "n_filas": 1994,
   "n_columnas": 127,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 0,
   "alta_cardinalidad": false,
   "desbalanceado": false,
   "solo_numericas": true,
   "licencia": "Public",
   "sellado": false,
   "file_id": 22044764
  },
  {
   "data_id": 42731,
   "nombre": "house_sales",
   "fuente": "amlb-regresion",
   "version": 3,
   "sha256_arff": "86508fd41de8e54786c8bb61527ddd8163a740390dbc9028fc104ca2e52f9928",
   "columna_objetivo": "price",
   "tarea": "regression",
   "cubo_de_tamano": "grande",
   "n_filas": 21613,
   "n_columnas": 22,
   "tiene_faltantes": false,
   "max_cardinalidad_nominal": 70,
   "alta_cardinalidad": true,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "CC0 Public Domain",
   "sellado": false,
   "file_id": 22044765
  },
  {
   "data_id": 42734,
   "nombre": "okcupid-stem",
   "fuente": "amlb-clasificacion",
   "version": 3,
   "sha256_arff": "1af41ae7bd750443ea535b324b91e830799c13b9bc2c2f64ea4fff29634c024d",
   "columna_objetivo": "job",
   "tarea": "multiclass_classification",
   "cubo_de_tamano": "grande",
   "n_filas": 50789,
   "n_columnas": 20,
   "tiene_faltantes": true,
   "max_cardinalidad_nominal": 7019,
   "alta_cardinalidad": true,
   "desbalanceado": false,
   "solo_numericas": false,
   "licencia": "Public",
   "sellado": false,
   "file_id": 22044770
  }
 ],
 "particion": {
  "folds": 5,
  "repeticiones_pequeno_mediano": 3,
  "repeticiones_grande": 1,
  "semillas": [
   0,
   1,
   2
  ]
 },
 "presupuesto": {
  "minutos_por_cubo": {
   "pequeno": 2.0,
   "mediano": 5.0,
   "grande": 10.0
  },
  "hilos": 4,
  "procesos_en_paralelo": 2
 },
 "recursos_declarados": {
  "maquina": "servidor de desarrollo, medido 2026-09-04",
  "cpu_fisicas": 4,
  "cpu_logicas": 8,
  "ram_gb": 15,
  "ram_disponible_gb": 10,
  "gpu": null,
  "disco_gb": 197,
  "python": "3.12.3",
  "hilos_por_proceso": 4,
  "procesos_en_paralelo": 2,
  "nota": "sin GPU en esta máquina; CUDA queda para una tabla aparte marcada GPU, fuera del ranking CPU principal (invariante 4 del 101). Re-firmado el 2026-09-13: la reserva era 4 hilos x 6 procesos = 24 sobre 8 CPUs lógicas (triple), y cpu_fisicas decía 8. Medido con las funciones de protocolo.py en esta misma máquina: cpus_disponibles()=8, nucleos_fisicos()=4, reserva_segura(4)=2 -> 4 x 2 = 8 hilos, sobre_reserva 0. El escalado medido no pierde nada: 24 hilos sobre 8 CPUs rendían el mismo techo de 4,69x que 8. NO se tocaron la regla de cierre, la definición de mejor, el listón, la lista de datasets ni las particiones."
 },
 "regla_de_cierre": {
  "puntos": 2.0,
  "fraccion_minima": 0.8,
  "metrica_por_tarea": {
   "binary_classification": "AUROC",
   "multiclass_classification": "accuracy_o_f1_macro",
   "regression": "R2"
  },
  "definicion_de_mejor": "el motor con mejor media de los ajustes en ESE dataset, excluido el baseline dummy; un fallo (timeout/crash) cuenta como dataset perdido para ese motor"
 },
 "metricas_por_tarea": {
  "binary_classification": {
   "primaria": "AUROC",
   "secundarias": [
    "AUPRC",
    "log_loss",
    "Brier",
    "accuracy@0.5",
    "accuracy@prevalencia",
    "F1_macro"
   ],
   "calibracion": "pendiente/intercepto de recalibración logística sobre logit(p); ECE 10 cubos por cuantiles"
  },
  "multiclass_classification": {
   "primaria": "log_loss",
   "secundarias": [
    "macro_AUROC_OVR",
    "accuracy",
    "F1_macro"
   ],
   "calibracion": "ECE de la clase predicha"
  },
  "regression": {
   "primaria": "RMSE",
   "secundarias": [
    "MAE",
    "R2"
   ],
   "calibracion": null
  },
  "siempre": [
   "tiempo_de_ajuste",
   "tiempo_de_prediccion",
   "cpu_segundos",
   "rss_pico_mb",
   "tasa_de_fallo",
   "dispersion_entre_semillas"
  ],
  "intervalos": "bootstrap de 1000 remuestreos sobre las predicciones fuera-de-fold agrupadas por repetición, más la dispersión entre las 3 semillas (105-C2, reutilizado — nunca una segunda implementación)"
 },
 "digest_sha256": "50fc56a1c688c057cca643953c7659e73731915f59c1cf32f6419c14992299a4"
}
