// Run from a fresh output directory: model/adapter publication never overwrites.
// This bounded native fixture is not a pretrained text-quality benchmark.
import aner.token
import aner.gen
import aner.nn

nn.configure("cpu", "Float64", "preserve")
let codec = token.byte_tokenizer()
let training = token.corpus(codec, List("abba abba", "baab baab"), role: "training")
let validation = token.corpus(codec, List("held out scientific observation"), role: "validation")
let base = gen.decoder(codec, context: 8, width: 4, heads: 2,
    layers: 1, seed: 41, dropout: 0.15)
let adapted = base.lora(List("block.0.qkv"), rank: 2, alpha: 4.0, seed: 71)
let plan = gen.fine_tune_plan(adapted, training, validation,
    steps: 6, batch: 2, rate: 0.01, seed: 23,
    clip_norm: 1.0, warmup_steps: 2, weight_decay: 0.01)
print(plan.summary())
print(plan.memory_summary())
let job = plan.start()
let result = job.wait()
print(job.status())
print(job.completed_steps())
print(job.trained_tokens())
print(result.validation_loss())
print(result.completed())
result.save_model("training-job.anergen")
result.save_adapter("training-job.anerlora")

let continuation = gen.resume_plan("training-job.anergen", training, validation, steps: 2)
let continued = continuation.start().wait()
print(continued.model().steps())
continued.save_model("training-job-continued.anergen")
