Source code for monalisa.optim._back_gradient_n

"""Port of src/optim/bmBackGradient_n.m."""

import numpy as np

from monalisa._mat import mixed, vec


[docs] def back_gradient_n(x, n_u, dX_u, n): """Backward finite difference along dimension ``n`` (1-based), zero on the first slice.""" n_u = vec(n_u).astype(np.int64) dX_u = vec(dX_u) shape = tuple(n_u) if n_u.size > 1 else (int(n_u[0]), 1) x = np.reshape(np.asarray(x), shape, order="F") ax = int(n) - 1 g = mixed(np.divide, x - np.roll(x, 1, axis=ax), dX_u[ax]) idx = [slice(None)] * g.ndim idx[ax] = 0 g[tuple(idx)] = 0 return np.reshape(g, (-1, 1), order="F")