# Example configuration for the regional_coverage CELF submodular solver.
#
# The solver reads this shape from <config_dir>/config.yaml.

candidate_generation:
  # Start-time stride in seconds. Must align with the case time_step_s.
  time_stride_s: 150

  # Used only when roll_values_deg is omitted. The generated default grid is
  # symmetric about nadir and filtered by the public sensor edge-angle limits.
  roll_step_deg: 4.0

  # Deterministic cap for the promoted fixed-candidate quality envelope.
  max_candidates_total: 518400
  cap_strategy: balanced_stride

  # Optional explicit grids. Invalid values are filtered against the public
  # action-grid, sensor-duration, and sensor-edge constraints.
  duration_values_s: [20, 60, 120]
  roll_values_deg: [-31.0, -27.0, 27.0, 31.0]

  # Number of generated candidates copied to root-level candidate_debug.json.
  debug_candidate_limit: 5

coverage_mapping:
  # indexed builds a solver-local sparse grid over public coverage samples.
  # simple keeps the direct scan path for debugging and equivalence tests.
  method: indexed

  # Longitude/latitude bin size in degrees for the indexed mapping path.
  spatial_bin_deg: 0.25

  # Use an integer for fixed worker count or auto for deterministic parallel
  # throughput on the current machine.
  worker_count: auto
  chunk_size: 4096

selection:
  # CELF/CEF runs both variants by default and keeps the higher objective value.
  run_unit_cost: true
  run_cost_benefit: true

  # Cost used by the cost-benefit variant:
  # action_count, imaging_time, estimated_energy, or transition_burden.
  cost_mode: action_count

  # Null maps the paper budget B to the benchmark max_actions_total.
  budget: null

  # Candidates at or below this current marginal gain are not accepted.
  min_marginal_gain: 0.0

  # When true, CELF accepts only candidates that keep the current fixed
  # candidate schedule solver-local feasible. Post-selection repair remains a
  # safety net, not the primary feasibility mechanism.
  schedule_aware: true

  # Bounded deterministic insertions and one-for-one swaps improve the
  # solver-local coverage objective while preserving solver-local schedule
  # validity. This does not create continuous-time candidates or call verifiers.
  local_improvement: true
  local_improvement_max_passes: 12
  local_improvement_max_candidate_checks: 1500
  local_improvement_worker_count: auto
  local_improvement_chunk_size: 16

  # Compute the Leskovec Section 3.2 online upper bound over the same fixed
  # candidate set used by CELF. This is a finite-set certificate, not a bound
  # on continuous satellite scheduling.
  compute_online_bounds: true
  max_bound_order_debug: 10

  # Iteration traces can be large when the candidate cap is raised.
  write_iteration_trace: false
  max_iteration_debug: 100
