let numerical_gradient l p x y y' =
let open MX in
let h = 0.00001 in
let f = l y in
let g = mapi_by_row ~d:(col_num p)
(fun i v ->
let fa = f (x $@ (replace_row (v -$ h) p i)) in
let fb = f (x $@ (replace_row (v +$ h) p i)) in
(fb -@ fa) /$ (2. *. h)
) p in g