# Example configuration for the aeossp_standard greedy-LNS solver.
# Copy or rename this file to config.yaml (or config.json) in your
# config directory and adjust values as needed.

# --- Candidate generation ---
# Stride multiplier for candidate start-time grid.  1 = every grid step,
# 2 = every second grid step, etc.  Larger values reduce candidate count.
candidate_stride_multiplier: 1

# Hard cap on total candidates across all satellites and tasks.
# null = no limit.
max_candidates: null

# Hard cap on candidates per individual task.
# null = no limit.
max_candidates_per_task: null

# Process workers for deterministic satellite-level candidate generation.
# 1 = serial generation.
candidate_workers: 1

# --- Greedy insertion ---
# When true, evaluate all feasible insertion positions and choose the one
# with minimum transition-time increment (Antuori et al. Section 4.1.1).
# For fixed grid-aligned times this typically resolves to the time-ordered
# position, but the code structure is preserved for paper fidelity.
minimize_transition_increment: false

# --- Local search ---
# Maximum number of first-improving descent iterations.
max_local_search_iterations: 1000

# Optional wall-clock time budget for local search in seconds.
# null = no time limit.
max_local_search_time_s: null

# Optional end-to-end wall-clock accounting budget in seconds.
# When set, remaining budget is passed into local search after preprocessing.
# Candidate generation and repair are not interrupted in this phase.
total_time_budget_s: null

# Number of restarts after reaching a local minimum.
# 0 = no restarts (deterministic single run).
# For a fair multi-start run profile, use restart_count >= 4 with
# stochastic_ordering: true, a fixed random_seed, and total_time_budget_s set
# to the experiment envelope.
restart_count: 0

# Process workers for deterministic restart waves.
# 1 = sequential restart policy.
local_search_workers: 1

# Random seed for stochastic ordering and restart perturbation.
# null = use system time (non-deterministic).
# Only matters when restart_count > 0 or stochastic_ordering is true.
random_seed: null

# When true, shuffle component order randomly each iteration.
# Default is deterministic ordering.
stochastic_ordering: false

# When true, small connected components are reinserted by exact bounded
# enumeration instead of marginal-profit greedy ordering. This is a
# solver-local benchmark adaptation of the paper's exact subproblem role; it
# does not use the proprietary Tempo backend.
enable_exact_reinsertion: false

# Maximum component size eligible for exact bounded enumeration.
# Larger components fall back to greedy reinsertion.
max_exact_component_size: 8

# Per-component wall-clock timeout for exact reinsertion.
# null = no per-component exact timeout.
exact_subproblem_timeout_s: 0.05

# When true, objective-improving local-search moves that clearly worsen
# solver-local battery depletion are rejected before final repair.
enable_battery_guardrails: false

# Minimum acceptable solver-local battery floor for guarded moves.
# A move is rejected only when it worsens battery below this floor or adds a
# battery-depletion issue. Final repair still runs as a safety net.
battery_guard_min_wh: 0.0

# --- Repair ---
# Maximum number of repair removal iterations.
max_repair_iterations: 200

# --- Debug ---
# When true, write additional debug artifacts to solution_dir/debug/.
debug: false
