package pipeline import "sdr-wideband-suite/internal/config" type Policy struct { Mode string `json:"mode"` SurveillanceFFTSize int `json:"surveillance_fft_size"` SurveillanceFPS int `json:"surveillance_fps"` RefinementEnabled bool `json:"refinement_enabled"` MaxRefinementJobs int `json:"max_refinement_jobs"` MinCandidateSNRDb float64 `json:"min_candidate_snr_db"` PreferGPU bool `json:"prefer_gpu"` } func PolicyFromConfig(cfg config.Config) Policy { return Policy{ Mode: cfg.Pipeline.Mode, SurveillanceFFTSize: cfg.Surveillance.AnalysisFFTSize, SurveillanceFPS: cfg.Surveillance.FrameRate, RefinementEnabled: cfg.Refinement.Enabled, MaxRefinementJobs: cfg.Resources.MaxRefinementJobs, MinCandidateSNRDb: cfg.Refinement.MinCandidateSNRDb, PreferGPU: cfg.Resources.PreferGPU, } } func ApplyNamedProfile(cfg *config.Config, name string) { if cfg == nil || name == "" { return } switch name { case "legacy": cfg.Pipeline.Mode = "legacy" cfg.Surveillance.Strategy = "single-resolution" cfg.Refinement.Enabled = true if cfg.Resources.MaxRefinementJobs <= 0 { cfg.Resources.MaxRefinementJobs = 8 } case "wideband-balanced": cfg.Pipeline.Mode = "wideband-balanced" cfg.Surveillance.Strategy = "single-resolution" if cfg.Surveillance.AnalysisFFTSize < 4096 { cfg.Surveillance.AnalysisFFTSize = 4096 } if cfg.FrameRate < 12 { cfg.FrameRate = 12 } if cfg.Surveillance.FrameRate < 12 { cfg.Surveillance.FrameRate = 12 } cfg.Refinement.Enabled = true if cfg.Refinement.MaxConcurrent < 16 { cfg.Refinement.MaxConcurrent = 16 } if cfg.Resources.MaxRefinementJobs < 16 { cfg.Resources.MaxRefinementJobs = 16 } cfg.Resources.PreferGPU = true case "wideband-aggressive": cfg.Pipeline.Mode = "wideband-aggressive" cfg.Surveillance.Strategy = "single-resolution" if cfg.Surveillance.AnalysisFFTSize < 8192 { cfg.Surveillance.AnalysisFFTSize = 8192 } if cfg.FrameRate < 10 { cfg.FrameRate = 10 } if cfg.Surveillance.FrameRate < 10 { cfg.Surveillance.FrameRate = 10 } cfg.Refinement.Enabled = true if cfg.Refinement.MaxConcurrent < 32 { cfg.Refinement.MaxConcurrent = 32 } if cfg.Resources.MaxRefinementJobs < 32 { cfg.Resources.MaxRefinementJobs = 32 } cfg.Resources.PreferGPU = true case "archive": cfg.Pipeline.Mode = "archive" cfg.Refinement.Enabled = true if cfg.Refinement.MaxConcurrent < 12 { cfg.Refinement.MaxConcurrent = 12 } if cfg.Resources.MaxRefinementJobs < 12 { cfg.Resources.MaxRefinementJobs = 12 } if !cfg.Recorder.Enabled { cfg.Recorder.Enabled = true } } cfg.FFTSize = cfg.Surveillance.AnalysisFFTSize }