// Development compiler: native CPU tasks with complete, exclusive output rows.
import aner.parallel
import aner.random

fn trajectory(parameters: List, iteration: Int64, seed: Int64, output: OutputRegion<Float64>) {
    let steps = cast<Int64>(parameters.get(0))
    let buffer = Array<Float64>(2, 0.25)
    let input = random.uniform(seed, 0) * 0.0001
    for step in Range(steps) {
        buffer[0] = buffer[0] * 0.9999 + input
    }
    output[0] = buffer[0]
    output[1] = Float64(iteration)
}

let serial = parallel.repeat(8, trajectory, List(1000), output_shape: List(2), execution: parallel.local(1), seed: 2026)
let concurrent = parallel.repeat(8, trajectory, List(1000), output_shape: List(2), execution: parallel.local(), seed: 2026)
var equivalent = true
for iteration in Range(serial.rows()) {
    if serial[iteration, 0] != concurrent[iteration, 0] { equivalent = false }
    if concurrent[iteration, 1] != Float64(iteration) { equivalent = false }
    if serial.seed(iteration) != concurrent.seed(iteration) { equivalent = false }
}
print(equivalent)
print(concurrent.rows())
print(concurrent.cols())
print(dtype(concurrent))
