Altifigence Academy

8 / 24 · Práctica

Práctica: ejecuta el contrato de cuantización

Cuantiza −40 con la misma configuración uint8. ¿Cuáles son su código y su valor descuantizado, y qué aserción añadirías?

Objetivo y preparación

Ejecuta la asignación de códigos, los empates negativos, la saturación y un producto escalar entero centrado. Este archivo necesita Node.js y ningún paquete externo. Crea quantize-lab.mjs en una carpeta vacía nueva, copia el código siguiente y ejecuta node quantize-lab.mjs. Si no tienes Node, completa a mano la tabla de predicciones. Si tu Digital Design Studio instalado ofrece un flujo admitido de creación y apertura de archivos de este tipo, puedes crear e inspeccionar manualmente el mismo archivo allí. Estas instrucciones no afirman creación automática de proyectos ni ejecución dentro de DDS.

Predice antes de ejecutar

Con escala 0.25 y punto cero 128, −0.625 pasa al empate −2.5, se redondea al par −2 y da el código 126. La entrada −0.375 también da 126. Cero da 128; 0.375 y 0.625 dan ambos 130. La entrada 40 daría 288, así que la saturación uint8 la cambia a 255. Predice [126,126,128,130,130,255]. Estos casos distinguen empates negativos, empates positivos, cero real y recorte.

Centra [130,126] a [2,−2]. Con los pesos [3,−2], la suma es diez. La escala combinada 0.125 representa el valor real 1.25; la escala de salida 0.25 y el punto cero 128 dan 133. El código es un ejercicio de contrato numérico, no un importador de modelos ni una evaluación de precisión.

Ejecuta primero las aserciones sin modificar. Después sustituye 0.625 por 0.875. Predice que el empate 3.5 se redondea a cuatro y da el código 132 antes de cambiar el valor esperado. Sustituye temporalmente roundEven por Math.round y observa el fallo de la aserción del empate negativo; después restáuralo. Un fallo intencionado demuestra que la prueba observa el comportamiento exigido.

Por último, descuantiza el código saturado 255: representa 31.75, un error de −8.25 respecto a 40. Es mucho mayor que la cota ordinaria de redondeo de medio paso. Elegir la escala implica una compensación entre intervalo y resolución; medir la precisión del modelo requiere un modelo y un conjunto de datos independientes. Registra tus predicciones, la salida del comando y el razonamiento del caso modificado.

Archivo ejecutable

javascript
import assert from 'node:assert/strict';
// An exact tie is handled with nearest-even, including negative input.
export function roundEven(v) {
  const f = Math.floor(v), d = v - f;
  return d < 0.5 ? f : d > 0.5 ? f + 1 : f % 2 === 0 ? f : f + 1;
}
export const quantize = (x, s, z) => Math.min(255, Math.max(0, roundEven(x / s) + z));
const values = [-0.625, -0.375, 0, 0.375, 0.625, 40];
const codes = values.map(x => quantize(x, 0.25, 128));
assert.deepEqual(codes, [126, 126, 128, 130, 130, 255]);
assert.equal(roundEven(-1.5), -2);
assert.equal(roundEven(-2.5), -2);
const xq = [130, 126], wq = [3, -2];
const acc = xq.reduce((sum, x, i) => sum + (x - 128) * wq[i], 0);
assert.equal(acc, 10);
assert.equal(acc * 0.25 * 0.5, 1.25);
assert.equal(quantize(1.25, 0.25, 128), 133);
console.log(JSON.stringify({codes, acc, real: 1.25, output: 133}));

Inténtalo tú

Cuantiza −40 con la misma configuración uint8. ¿Cuáles son su código y su valor descuantizado, y qué aserción añadirías?

Leer la explicación

El código sin limitar es −32, así que se recorta a cero. La descuantización es (0−128)×0.25=−32. Añade una aserción que compruebe que quantize(−40,0.25,128) es igual a cero para cubrir la saturación negativa.

Lesson files

quantize-lab.mjs ↓

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.