def test_logaddexp_opt(): x, y = map(Symbol, 'x y'.split()) expr1 = log(exp(x) + exp(y)) opt1 = optimize(expr1, [logaddexp_opt]) assert logaddexp(x, y) - opt1 == 0 assert logaddexp(y, x) - opt1 == 0 assert opt1.rewrite(log) == expr1
def test_logaddexp(): lae_xy = logaddexp(x, y) ref_xy = log(exp(x) + exp(y)) for wrt, deriv_order in product([x, y, z], range(0, 3)): assert (lae_xy.diff(wrt, deriv_order) - ref_xy.diff(wrt, deriv_order)).rewrite(log).simplify() == 0 one_third_e = 1 * exp(1) / 3 two_thirds_e = 2 * exp(1) / 3 logThirdE = log(one_third_e) logTwoThirdsE = log(two_thirds_e) lae_sum_to_e = logaddexp(logThirdE, logTwoThirdsE) assert lae_sum_to_e.rewrite(log) == 1 assert lae_sum_to_e.simplify() == 1 assert logaddexp(2, 3).simplify() == logaddexp(2, 3) # cannot simplify with 2, 3
def test_cupy_print(): prntr = CuPyPrinter() assert prntr.doprint(logaddexp(a, b)) == 'cupy.logaddexp(a, b)' assert prntr.doprint(sqrt(x)) == 'cupy.sqrt(x)' assert prntr.doprint(log(x)) == 'cupy.log(x)' assert prntr.doprint("acos(x)") == 'cupy.arccos(x)' assert prntr.doprint("exp(x)") == 'cupy.exp(x)' assert prntr.doprint("Abs(x)") == 'abs(x)'
# Optimization procedures for turning A**(-1) * x into MatrixSolve(A, x) def _matinv_predicate(expr): # TODO: We should be able to support more than 2 elements if expr.is_MatMul and len(expr.args) == 2: left, right = expr.args if left.is_Inverse and right.shape[1] == 1: inv_arg = left.arg if isinstance(inv_arg, MatrixSymbol): return bool(ask(Q.fullrank(left.arg))) return False def _matinv_transform(expr): left, right = expr.args inv_arg = left.arg return MatrixSolve(inv_arg, right) matinv_opt = ReplaceOptim(_matinv_predicate, _matinv_transform) logaddexp_opt = ReplaceOptim(log(exp(_v)+exp(_w)), logaddexp(_v, _w)) logaddexp2_opt = ReplaceOptim(log(Pow(2, _v)+Pow(2, _w)), logaddexp2(_v, _w)*log(2)) # Collections of optimizations: optims_c99 = (expm1_opt, log1p_opt, exp2_opt, log2_opt, log2const_opt) optims_numpy = optims_c99 + (logaddexp_opt, logaddexp2_opt,) + sinc_opts optims_scipy = (cosm1_opt,)
def test_numpy_logaddexp(): lae = logaddexp(a, b) assert NumPyPrinter().doprint(lae) == 'numpy.logaddexp(a, b)' lae2 = logaddexp2(a, b) assert NumPyPrinter().doprint(lae2) == 'numpy.logaddexp2(a, b)'