feat: no existential types, add hrun

This commit is contained in:
Henri Saudubray 2026-03-27 10:53:26 +01:00
parent a41e6b2faa
commit ae1a5cf284
Signed by: hms
GPG key ID: 7065F57ED8856128
3 changed files with 166 additions and 42 deletions

View file

@ -278,3 +278,18 @@ let hsim : ('i, 'o, 'r, 'y, 'yder, 'zin, 'zout) hnode ->
let model = HNode { m with state = m.reset m.state r } in
State { s with model; input = None; time = 0.; mode = D } in
DNode { state; step; reset }
(** Run a simulation on a list of inputs
For each input value, we step the simulation as many times as
needed for it to reach the horizon. *)
let hrun (model : ('i, 'o, 'r, 'y, 'yder, 'zin, 'zout) hnode)
(solver : ('y, 'yder, 'zin, 'zout) solver)
(i : 'i dense list) : 'o dense list
= let sim = hsim model solver and i = List.map Option.some i in
let rec step os (DNode sim) i =
let state, o = sim.step sim.state i in
let sim = DNode { sim with state } in
if o = None then (sim, List.rev_map Option.get os)
else step (o :: os) sim None in
List.fold_left_map (step []) sim i |> snd |> List.flatten