///|
fn main {
  println(
    "====================================================================",
  )
  println(
    "   MoonDiffusionLab: 扩散模型原理实验工具箱 (1D/2D Toy Diffusion)   ",
  )
  println(
    "   Powered by Pure MoonBit | Pedagogical & High Visual Impact       ",
  )
  println(
    "====================================================================\n",
  )

  let rng = @core.Rng::new(seed=42UL)

  // 实验一:双月分布 (Two Moons) 前向加噪与 DDPM 随机去噪
  println("[Experiment 1] Two Moons Dataset - Forward Noising & DDPM Sampling")
  let moons = @dataset.sample_two_moons(120, noise=0.05, rng)
  println(
    @visualize.render_ascii_scatter(
      moons,
      width=50,
      height=18,
      title="Original Two Moons Dataset (t=0)",
    ),
  )

  let sched = @schedule.DiffusionSchedule::create(
    30,
    Linear(beta_start=0.001, beta_end=0.03),
  )
  let noised_mid = @diffusion.q_sample_batch(moons, 15, rng, sched)
  println(
    @visualize.render_ascii_scatter(
      noised_mid,
      width=50,
      height=18,
      title="Forward Noising Midpoint (t=15)",
    ),
  )

  let noised_end = @diffusion.q_sample_batch(moons, 29, rng, sched)
  println(
    @visualize.render_ascii_scatter(
      noised_end,
      width=50,
      height=18,
      title="Forward Noising End (t=29, Pure Gaussian)",
    ),
  )

  println("--> Starting DDPM Analytical Reverse Denoising Sampling...")
  let model_moons = @model.AnalyticalModel::new(moons, bandwidth=0.1)
  let (ddpm_samples, _) = @diffusion.sample_ddpm_analytical(
    120,
    model_moons,
    sched,
    rng,
    record_interval=10,
  )
  println(
    @visualize.render_ascii_scatter(
      ddpm_samples,
      width=50,
      height=18,
      title="DDPM Denoised Result (t=0)",
    ),
  )
  let wass_moons = @core.sliced_wasserstein_approx(ddpm_samples, moons)
  println(
    "    [Metric] Sliced Wasserstein Distance to Original: " +
    wass_moons.to_string() +
    "\n",
  )

  // 实验二:高斯环形分布 (GMM Ring) - DDIM 确定性加速采样
  println(
    "[Experiment 2] 8-Gaussians Ring Dataset - DDIM Deterministic Fast Sampling",
  )
  let gmm = @dataset.sample_gmm_ring(150, radius=2.0, noise=0.1, rng)
  println(
    @visualize.render_ascii_scatter(
      gmm,
      width=50,
      height=18,
      title="Original GMM Ring Dataset",
    ),
  )

  let sched_cosine = @schedule.DiffusionSchedule::create(30, Cosine(s=0.008))
  let model_gmm = @model.AnalyticalModel::new(gmm, bandwidth=0.1)
  println("--> Running DDIM 5-Step Fast Denoising Trajectory...")
  let (ddim_samples, _ddim_traj) = @diffusion.sample_ddim_analytical(
    150,
    model_gmm,
    sched_cosine,
    rng,
    num_steps=5,
  )
  println(
    @visualize.render_ascii_scatter(
      ddim_samples,
      width=50,
      height=18,
      title="DDIM 5-Step Fast Denoised Result",
    ),
  )
  let wass_gmm = @core.sliced_wasserstein_approx(ddim_samples, gmm)
  println(
    "    [Metric] Sliced Wasserstein Distance to Original: " +
    wass_gmm.to_string() +
    "\n",
  )

  // 实验三:双峰分布与 Euler ODE 轨迹
  println("[Experiment 3] Bimodal Distribution - Probability Flow Euler ODE")
  let bimodal = @dataset.sample_bimodal(100, dist=1.8, noise=0.15, rng)
  let model_bi = @model.AnalyticalModel::new(bimodal, bandwidth=0.1)
  let (euler_samples, _) = @diffusion.sample_euler_analytical(
    100,
    model_bi,
    sched,
    rng,
    num_steps=10,
  )
  println(
    @visualize.render_ascii_scatter(
      euler_samples,
      width=50,
      height=18,
      title="Euler ODE 10-Step Flow Result",
    ),
  )

  // 实验四:ToyMLP 采样整合
  println("[Experiment 4] ToyMLP Integration - DDPM Random Denoising")
  let toy_mlp = @model.ToyMLP::new(rng)
  let (mlp_samples, _) = @diffusion.sample_ddpm_mlp(
    100,
    toy_mlp,
    sched,
    rng,
    record_interval=10,
  )
  println(
    @visualize.render_ascii_scatter(
      mlp_samples,
      width=50,
      height=18,
      title="ToyMLP DDPM Denoised Result (Untrained)",
    ),
  )

  println(
    "\n====================================================================",
  )
  println(
    "   All diffusion experiments completed successfully!                ",
  )
  println("   Use `moon run cmd/lab -- html > demo.html` to generate HTML.   ")
  println(
    "====================================================================",
  )
}