def unary_nd(f, x, eps=EPS): if isinstance(x, array_types): if np.iscomplexobj(x): nd_grad = np.zeros(x.shape) + 0j elif isinstance(x, garray_obj): nd_grad = np.array(np.zeros(x.shape), dtype=np.gpu_float32) else: nd_grad = np.zeros(x.shape) for dims in it.product(*list(map(range, x.shape))): nd_grad[dims] = unary_nd(indexed_function(f, x, dims), x[dims]) return nd_grad elif isinstance(x, tuple): return tuple([unary_nd(indexed_function(f, tuple(x), i), x[i]) for i in range(len(x))]) elif isinstance(x, dict): return {k : unary_nd(indexed_function(f, x, k), v) for k, v in iteritems(x)} elif isinstance(x, list): return [unary_nd(indexed_function(f, x, i), v) for i, v in enumerate(x)] elif np.iscomplexobj(x): result = (f(x + eps/2) - f(x - eps/2)) / eps \ - 1j*(f(x + 1j*eps/2) - f(x - 1j*eps/2)) / eps return type(safe_type(x))(result) else: return type(safe_type(x))((f(x + eps/2) - f(x - eps/2)) / eps)
def _flip(a, trans): if anp.iscomplexobj(a): return 'H' if trans in ('N', 0) else 'N' else: return 'T' if trans in ('N', 0) else 'N'