42 lines
1.4 KiB
OCaml
42 lines
1.4 KiB
OCaml
open Zls
|
|
open Illinois
|
|
|
|
type state = { state: t; vec: zarray }
|
|
|
|
let make_full size : (carray, carray, zarray option) Full.zsolver =
|
|
let state =
|
|
{ state = initialize 0 (fun _ _ _ -> ()) (cmake 0);
|
|
vec = zmake 0 } in
|
|
let reset { vec; _ } Full.{ fzer; y0; _ } =
|
|
let fzer t cvec zout =
|
|
let zout' = fzer t cvec in blit zout' zout in
|
|
{ state = initialize size fzer y0;
|
|
vec = if length vec = size then vec else zmake size } in
|
|
let step ({ state; vec } as s) Full.{ h; f } =
|
|
let y1 = f h in
|
|
let fder h _ = let y = f h in blit y y1 in
|
|
step state h y1;
|
|
if has_roots state then
|
|
let h = find state (fder, y1) vec in
|
|
s, (h, Some vec)
|
|
else s, (h, None) in
|
|
Full.DNode { state; step; reset }
|
|
|
|
let make size : (carray, carray, zarray option) Fill.zsolver =
|
|
let state =
|
|
{ state = initialize 0 (fun _ _ _ -> ()) (cmake 0);
|
|
vec = zmake 0 } in
|
|
let reset { vec; _ } Fill.{ fzer; y0; _ } =
|
|
let fzer t cvec zout =
|
|
let zout' = fzer t cvec in blit zout' zout in
|
|
{ state = initialize size fzer y0;
|
|
vec = if length vec = size then vec else zmake size } in
|
|
let step ({ state; vec } as s) Fill.{ h; f } =
|
|
let y1 = f h in
|
|
let fder h _ = let y = f h in blit y y1 in
|
|
step state h y1;
|
|
if has_roots state then
|
|
let h = find state (fder, y1) vec in
|
|
s, (h, Some vec)
|
|
else s, (h, None) in
|
|
Fill.DNode { state; step; reset }
|