// Black-Box Optimization Framework - 主入口

///|
struct FuncConfig {
  f : (Array[Double]) -> Double
  name : String
  bounds : @lib.Bounds
  optimal : Double
}

///|
fn make_func_configs() -> Array[FuncConfig] {
  [
    FuncConfig::{
      f: @lib.sphere_function,
      name: "Sphere",
      bounds: @lib.make_bounds(-5.0, 5.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.rastrigin_function,
      name: "Rastrigin",
      bounds: @lib.make_bounds(-5.12, 5.12),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.rosenbrock_function,
      name: "Rosenbrock",
      bounds: @lib.make_bounds(-5.0, 5.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.ackley_function,
      name: "Ackley",
      bounds: @lib.make_bounds(-32.768, 32.768),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.griewank_function,
      name: "Griewank",
      bounds: @lib.make_bounds(-600.0, 600.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.schwefel_function,
      name: "Schwefel",
      bounds: @lib.make_bounds(-500.0, 500.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.levy_function,
      name: "Levy",
      bounds: @lib.make_bounds(-10.0, 10.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.michalewicz_function,
      name: "Michalewicz",
      bounds: @lib.make_bounds(0.0, 3.141592653589793),
      optimal: -4.687658,
    },
    FuncConfig::{
      f: @lib.zakharov_function,
      name: "Zakharov",
      bounds: @lib.make_bounds(-10.0, 10.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.booth_function,
      name: "Booth",
      bounds: @lib.make_bounds(-10.0, 10.0),
      optimal: 0.0,
    },
    FuncConfig::{
      f: @lib.matyas_function,
      name: "Matyas",
      bounds: @lib.make_bounds(-10.0, 10.0),
      optimal: 0.0,
    },
  ]
}

///|
fn main {
  println(
    "╔══════════════════════════════════════════════════════════╗",
  )
  println(
    "║      黑盒优化算法 - 基准测试与准确率对比                ║",
  )
  println(
    "╚══════════════════════════════════════════════════════════╝",
  )
  println("")

  let dim = 5
  let funcs = make_func_configs()

  // ===== 第一部分:数学函数验证 =====
  println(
    "┌──────────────────────────────────────────────────────────┐",
  )
  println(
    "│ 第一部分:数学函数验证                                    │",
  )
  println(
    "└──────────────────────────────────────────────────────────┘",
  )
  println("")

  println("  cos(0)     = \{@lib.cos_approx(0.0)} (expected: 1.0)")
  println("  cos(pi)    = \{@lib.cos_approx(@lib.PI)} (expected: -1.0)")
  println("  cos(pi/2)  = \{@lib.cos_approx(@lib.PI / 2.0)} (expected: 0.0)")
  println("  cos(3pi)   = \{@lib.cos_approx(3.0 * @lib.PI)} (expected: -1.0)")
  println("")

  let zeros : Array[Double] = [0.0, 0.0, 0.0, 0.0, 0.0]
  for i in 0..