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