chore: update

This commit is contained in:
Henri Saudubray 2026-03-27 10:53:26 +01:00
parent 4776edc9db
commit 416d97c513
Signed by: hms
GPG key ID: 7065F57ED8856128
25 changed files with 1653 additions and 283 deletions

60
lib/hsim/lift.ml Normal file
View file

@ -0,0 +1,60 @@
type ('s, 'a) state =
{ mutable state : 's;
mutable input : 'a option;
mutable time : Ztypes.time;
mutable jump : bool; }
let lift_hsim_full (n : unit Ztypes.hsimu)
: (unit, unit, unit, Ztypes.cvec, Ztypes.dvec, Ztypes.zoutvec, Ztypes.zinvec option) Full.hnode * int
= let Hsim { alloc; step; reset; derivative; crossings; maxsize; _ } = n in
let state = { state = alloc (); input = None; time = 0.0; jump = false } in
let csize, zsize = maxsize state.state in
let no_zin, no_zout = Zls.zmake zsize, Zls.cmake zsize in
let no_der, pos = Zls.cmake csize, Zls.cmake csize in
let no_time = -1.0 in reset state.state;
let fder { state; time; _ } offset () y =
derivative state y no_der no_zin no_zout (time +. offset);
no_der in
let fzer { state; time; _ } offset () y =
crossings state y no_zin no_zout (time +. offset); no_zout in
let fout _ _ () _ = () in
let step { state; time; _ } offset () =
{ state; time=time +. offset; input=Some (); jump = false },
step state pos no_der no_zin (time +. offset) in
let reset ({ state; _ } as st) () = reset state; st in
let jump s = s.jump in
let cset ({ state; _ } as st) _ =
derivative state pos no_der no_zin no_zout no_time; st in
let zset ({ state; _ } as st) = function None -> st | Some zinvec ->
derivative state pos no_der zinvec no_zout no_time; { st with jump = true } in
let cget { state; _ } =
derivative state pos no_der no_zin no_zout no_time; pos in
HNode { state; fder; fzer; fout; step; reset; jump; cget; cset; zset }, zsize
let lift_hsim (n : unit Ztypes.hsimu)
: (unit, unit, unit, Ztypes.cvec, Ztypes.dvec, Ztypes.zoutvec, Ztypes.zinvec option) Fill.hnode * int
= let Hsim { alloc; step; reset; derivative; crossings; maxsize; _ } = n in
let state = { state = alloc (); input = None; time = 0.0; jump = false } in
let csize, zsize = maxsize state.state in
let no_zin, no_zout = Zls.zmake zsize, Zls.cmake zsize in
let no_der, pos = Zls.cmake csize, Zls.cmake csize in
let no_time = -1.0 in reset state.state;
let fder { state; time; _ } offset () y =
derivative state y no_der no_zin no_zout (time +. offset);
no_der in
let fzer { state; time; _ } offset () y =
crossings state y no_zin no_zout (time +. offset); no_zout in
let fout _ _ () _ = () in
let step { state; time; _ } offset () =
{ state; time=time +. offset; input=Some (); jump = false },
step state pos no_der no_zin (time +. offset) in
let reset ({ state; _ } as st) () = reset state; st in
let jump s = s.jump in
let cset ({ state; _ } as st) _ =
derivative state pos no_der no_zin no_zout no_time; st in
let zset ({ state; _ } as st) = function None -> st | Some zinvec ->
derivative state pos no_der zinvec no_zout no_time; { st with jump = true } in
let cget { state; _ } =
derivative state pos no_der no_zin no_zout no_time; pos in
HNode { state; fder; fzer; fout; step; reset; jump; cget; cset; zset }, zsize