use std::path::{Path, PathBuf};
use anyhow::{Context, Result, bail};
use surtgis_algorithms::inference::onnx::OnnxModel;
use surtgis_algorithms::inference::run_tiled;
use surtgis_core::Raster;
use surtgis_core::io::{read_geotiff, write_geotiff, write_geotiff_multiband};
use crate::helpers::write_opts;
pub fn run(
model: &Path,
features: &[PathBuf],
output: &Path,
tile_size: usize,
halo: usize,
argmax: bool,
compress: bool,
) -> Result<()> {
if features.is_empty() {
bail!("surtgis infer: --features needs at least one input raster");
}
println!("SurtGIS Infer (scaffold — see SPEC_SURTGIS_ONNX_INFERENCE.md)");
println!("================================================================");
println!(" Model: {}", model.display());
println!(" Features: {} raster(s)", features.len());
println!(" Output: {}", output.display());
println!(" Tile size: {tile_size}");
println!(" Halo: {halo}");
println!();
let bands: Vec<Raster<f32>> = features
.iter()
.map(|p| {
read_geotiff(p, None)
.with_context(|| format!("Failed to read feature raster {}", p.display()))
})
.collect::<Result<_>>()?;
let onnx_model = OnnxModel::load(model, bands.len(), 1, halo).context(
"surtgis infer: ONNX model loading is not yet implemented (scaffold only) — \
see SPEC_SURTGIS_ONNX_INFERENCE.md. The tiling/halo/stitching orchestration \
this command uses (surtgis_algorithms::inference::run_tiled) is implemented \
and tested independently of any ML runtime.",
)?;
let outputs = run_tiled(&onnx_model, &bands, tile_size)?;
if argmax {
bail!("surtgis infer: --argmax is not yet implemented (scaffold only)");
}
match outputs.as_slice() {
[single] => {
write_geotiff(single, output, Some(write_opts(compress)))
.context("Failed to write output")?;
}
many => {
let refs: Vec<&Raster<f32>> = many.iter().collect();
write_geotiff_multiband(&refs, output, Some(write_opts(compress)))
.context("Failed to write output")?;
}
}
println!("Done: wrote {}", output.display());
Ok(())
}