///|
/// Qwen3-0.6B CPU forward: compare against HF reference logits.
///
/// Usage: moon run cmd/qwen --target native --
///|
fn le_f32(b : Bytes, off : Int) -> Float {
Float::reinterpret_from_int(
b[off].to_int() |
(b[off + 1].to_int() << 8) |
(b[off + 2].to_int() << 16) |
(b[off + 3].to_int() << 24),
)
}
///|
fn run() -> Unit raise Error {
let args = @env.args()
guard args.length() >= 4 else {
println("usage: qwen ")
panic()
}
let st = @qwen.SafeTensors::parse(@fs.read_file_to_bytes(args[1]))
let model = @qwen.Qwen3::load(st)
println("weights loaded")
// reference input tokens
let input_json = @json.parse(@fs.read_file_to_string(args[2]))
guard input_json is Array(ids_json) else { panic() }
let ids : Array[Int] = []
for id in ids_json {
guard id is Number(v, ..) else { panic() }
ids.push(v.to_int())
}
// forward
let logits = model.forward(ids)
println("forward done")
// compare with reference
let refb = @fs.read_file_to_bytes(args[3])
let mut max_diff : Double = 0.0
let mut argmax = 0
let mut best : Float = -3.4e38
for i in 0.. max_diff {
max_diff = d
}
if logits[i] > best {
best = logits[i]
argmax = i
}
}
println("max_diff=\{max_diff}")
println("argmax=\{argmax} (expect 12095 ' Paris')")
if max_diff < 0.1 && argmax == 12095 {
println("MATCH")
} else {
println("MISMATCH")
}
}
///|
fn main {
run() catch {
e => println("error: \{e}")
}
}