iterate Dataset
open suspend override fun iterateDataset(name: String, dataset: TrainSet<Input, InputLabel>, customMetricsToRecord: List<Metric>?, failureRateThreshold: Double, earlyStop: (TrainSetItem<Input, InputLabel>) -> PrematureExecutionStopDecision, processItem: suspend StageScope<Input, Output, InputLabel>.(TrainSetItem<Input, InputLabel>) -> Unit): StageRecord
Thin delegate over runStage with the datasetIterationMetrics preset (plus any customMetricsToRecord). Threshold breach throws inside the block so runStage's catch arm records it on the dataset stage — preserving the documented "marks but does not throw" contract and letting per-item aborts propagate naturally.