# catalog/operations/terrain/tri.yaml

id: terrain_tri
name: Terrain Ruggedness Index
description: >
  Calculate Terrain Ruggedness Index (TRI) from DEM. TRI measures the total
  elevation change between a cell and its 8 neighbors. Higher values indicate
  more rugged terrain. Based on Riley et al. (1999).
version: 1.0.0
category: terrain
type: raster-to-raster
default_implementation: native

inputs:
  - name: dem
    type: raster
    format: cog
    description: Input Digital Elevation Model (GeoTIFF or COG)
    required: true

requires:
  concepts: [elevation]

outputs:
  - name: tri
    type: raster
    format: cog
    dtype: float32
    unit: meters
    concept: tri
    description: TRI raster (in same units as DEM elevation)

params: {}

granularity:
  min_resolution_m: 1
  max_resolution_m: 90
  recommended_resolution_m: 10
  output_resolution: inherit
  suitable_aoi_km2:
    min: 0.1
    max: 50000
  realtime_max_km2: 200
  requires_continuous: true

execution:
  realtime_max_km2: 200
  cost_per_km2: 0.001
  time_per_km2_sec: 0.4
  memory_profile: low
  profile:
    cpu: low
    memory: low
    io: medium
  scaling:
    model: linear
    parallelizable: true
    min_chunk_km2: 1

default_input:
  connector: usgs_3dep
  params:
    resolution: 10m

cache_policy:
  regional_precompute: [ski_areas, wilderness_areas]
  ttl_days: 90
  invalidate_on: [source_update]

# backends: audited 2026-08-14 (defect 50). A key means a runtime that DISPATCHES this op —
# folia-engine `dispatch_op` (products/sdk/folia-engine/src/lib.rs), a `registerOp`/OP_TABLE
# entry in packages/compute, `_BUILTIN_OP_MAP` in folia/compute.py, or a backend manifest
# (folia/backends/*/backend.yaml).
backends:
  python:
    function: geo.terrain.tri
    dispatch: folia/compute.py _BUILTIN_OP_MAP

display_hints:
  map:
    renderer: maplibre
    palette: sequential
    opacity: 0.8
  info:
    fields: [tri]
    format: "{value}m"
    section: Terrain

ui:
  icon: activity
  color: "#8B4513"
