feat (doc): some notes

This commit is contained in:
Henri Saudubray 2025-04-17 18:19:08 +02:00
parent 48d6cc4ca8
commit b4a29bbb97
Signed by: hms
GPG key ID: 7065F57ED8856128
2 changed files with 142 additions and 7 deletions

View file

@ -60,6 +60,10 @@ module LazySim (S : SimState) =
let (h, f, z), sstate = solver.step sstate stop in
let mstate = model.cset mstate (f h) in
let h' = input.start +. h in
let fout t =
model.fout mstate (input.u (now +. t)) (f (now +. t)) in
let out =
{ start = input.start +. now; length = h -. now; u = fout } in
let state = match z with
| None ->
let status =
@ -70,11 +74,6 @@ module LazySim (S : SimState) =
let status = S.running ~mode:Discrete ~now:h' status in
let mstate = model.zset mstate z in
S.update ~status ~mstate ~sstate state in
let fout t =
model.fout mstate (input.u (now +. t)) (f (now +. t)) in
let out =
{ start = input.start +. now; length = h -. now; u = fout }
in
Some out, state in
let reset m s =
let mstate = model.reset m (S.mstate s) in
@ -92,20 +91,59 @@ module LazySim (S : SimState) =
module GreedySim (S : SimState) =
struct
(* TODO: greedy simulation *)
let sim
(HNode model : ('p, 'a, 'b, 'y, 'yder, 'zin, 'zout) hnode)
(DNode solver : ('y, 'yder, 'zin, 'zout) solver)
: ('p, 'a, 'b) sim
= let state = S.init ~mstate:model.state ~sstate:solver.state in
let rec step state input =
let status = S.status state and mstate = S.mstate state
and sstate = S.sstate state in
match input, S.is_running state with
| Some input, _ ->
let mode = Discrete and now = 0.0 and stop = input.length in
let status = S.running ~mode ~input ~now ~stop (S.status state) in
let state = S.update ~status state in
None, state
step state None
| None, false -> None, state
| None, true -> assert false
| None, true ->
let input = S.input state and now = S.now state
and stop = S.stop state in
match S.mode state with
| Discrete ->
let o, mstate = model.step mstate (input.u now) in
let state =
let h = model.horizon mstate in
if h <= 0.0 then S.update ~mstate state
else if now >= stop then raise Common.Utils.TODO
else if model.jump mstate then
let y = model.cget mstate in
let fder t = model.fder mstate (offset input now t) in
let fzer t = model.fzer mstate (offset input now t) in
let ivp = { fder; stop = stop -. now; init = y } in
let zc = { yc = y; fzer } in
let sstate = solver.reset (ivp, zc) sstate in
let status = S.running ~mode:Continuous status in
S.update ~status ~mstate ~sstate state
else
let status = S.running ~mode:Continuous status in
S.update ~status state in
let start = input.start +. now in
Some { start; length = 0.0; u = fun _ -> o }, state
| Continuous ->
let (h, f, z), sstate = solver.step sstate stop in
let mstate = model.cset mstate (f h) in
let h' = input.start +. h in
let fout t =
model.fout mstate (input.u (now +. t)) (f (now +. t)) in
let out =
{ start = input.start +. now; length = h -. now; u = fout } in
match z with
| None ->
let status =
if h >= stop then S.running ~mode:Discrete ~now:h' status
in
let reset = assert false in
DNode { state; step; reset }