use bywind::{
BakedWindMap, BenchmarkRoute, EnsembleSpread, RealizationRun, RouteEvolution, SegmentMetrics,
};
use swarmkit_sailing::{Boat, RouteBounds};
pub(crate) struct ReoptMsg {
pub(crate) iteration: usize,
pub(crate) new_times: Vec<f64>,
}
#[derive(serde::Deserialize, serde::Serialize, Default)]
#[serde(default)]
pub(crate) struct SearchOutputs {
pub(crate) iteration: usize,
#[serde(skip)]
pub(crate) route_evolution: Option<RouteEvolution>,
#[serde(skip)]
pub(crate) route_bounds: Option<RouteBounds>,
#[serde(skip)]
pub(crate) baked_wind_map: Option<BakedWindMap>,
#[serde(skip)]
pub(crate) boat: Option<Boat>,
#[serde(skip)]
pub(crate) segment_stats: Option<Vec<SegmentMetrics>>,
#[serde(skip)]
pub(crate) best_fitness: Option<f64>,
#[serde(skip)]
pub(crate) live_gbest: Option<LiveGbest>,
#[serde(skip)]
pub(crate) benchmark: Option<BenchmarkRoute>,
#[serde(skip)]
pub(crate) ensemble: Option<EnsembleSpread>,
#[serde(skip)]
pub(crate) realization_runs: Vec<RealizationRun>,
#[serde(skip)]
pub(crate) summary_selection: SummarySelection,
#[serde(skip)]
pub(crate) bake_duration: Option<std::time::Duration>,
#[serde(skip)]
pub(crate) search_duration: Option<std::time::Duration>,
#[serde(skip)]
pub(crate) last_search_seed: Option<u64>,
}
pub(crate) struct LiveGbest {
pub(crate) iter_idx: usize,
pub(crate) total_iters: usize,
pub(crate) xs: Vec<f64>,
pub(crate) ys: Vec<f64>,
#[expect(
dead_code,
reason = "kept for future per-segment overlays; route-overlay only \
uses xs/ys for now but the field rounds out the 'gbest \
snapshot' shape and matches the SearchProgressEvent."
)]
pub(crate) ts: Vec<f64>,
pub(crate) best_fit: f64,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
pub(crate) enum SummarySelection {
#[default]
Gbest,
Realization(usize),
}