{
  "id": "PWM-L2-em-cassi-forward",
  "principle_id": "PWM-L1-em-maxwell-vacuum",
  "name": "CASSI Forward Operator",
  "description": "Forward operator mapping a 3-D hyperspectral cube to a 2-D coded snapshot via a binary aperture mask and per-band dispersion shifts, with additive Gaussian sensor noise. Defines the linear measurement model for snapshot spectral imaging.",
  "operator_type": "linear-forward",
  "math_latex": "y[i,j] = \\sum_b M[i, j - \\delta_b] \\cdot x[i, j - \\delta_b, b] + n[i,j]",
  "omega": {
    "parameters": [
      {"name": "spatial_resolution", "symbol": "H,W", "min": 256, "max": 1024, "unit": "px", "notes": "power-of-two preferred"},
      {"name": "spectral_bands", "symbol": "B", "min": 28, "max": 64, "unit": "bands"},
      {"name": "wavelength_min", "symbol": "lambda_min", "min": 400, "max": 700, "unit": "nm"},
      {"name": "wavelength_max", "symbol": "lambda_max", "min": 400, "max": 700, "unit": "nm"},
      {"name": "dispersion_shift", "symbol": "delta", "min": 1, "max": 4, "unit": "px/band"},
      {"name": "mask_density", "symbol": "rho", "min": 0.4, "max": 0.6, "unit": "dimensionless"},
      {"name": "noise_std", "symbol": "sigma", "min": 0.001, "max": 0.05, "unit": "relative_intensity"}
    ]
  },
  "epsilon": {
    "metric": "psnr",
    "threshold": 28.0,
    "unit": "dB",
    "evaluation": "band-by-band, averaged"
  },
  "io_signature": {
    "inputs": [
      {"name": "x", "type": "float32", "shape": "(H, W, B)", "desc": "ground-truth hyperspectral cube"},
      {"name": "mask", "type": "uint8", "shape": "(H, W)", "desc": "binary coded aperture"},
      {"name": "dispersion", "type": "int", "shape": "(B,)", "desc": "per-band pixel shift"},
      {"name": "sigma", "type": "float", "shape": "scalar", "desc": "noise standard deviation"}
    ],
    "outputs": [
      {"name": "y", "type": "float32", "shape": "(H, W)", "desc": "coded snapshot measurement"}
    ]
  },
  "preconditions": [
    "mask must be binary (values in {0, 1})",
    "dispersion array must be monotonically increasing",
    "input cube x must be non-negative everywhere"
  ],
  "references": [
    {
      "title": "Single disperser design for coded aperture snapshot spectral imaging",
      "authors": ["A. Wagadarikar", "R. John", "R. Willett", "D. Brady"],
      "year": 2008,
      "venue": "Applied Optics, vol. 47, B44-B51",
      "doi": "10.1364/AO.47.000B44"
    },
    {
      "title": "Multiframe image estimation for coded aperture snapshot spectral imagers",
      "authors": ["D. S. Kittle", "K. Choi", "A. Wagadarikar", "D. Brady"],
      "year": 2010,
      "venue": "Applied Optics, vol. 49, 6824-6833",
      "doi": "10.1364/AO.49.006824"
    }
  ]
}
