From 1929337bc3d226c2d490ce9e6727bb0f52d408a6 Mon Sep 17 00:00:00 2001 From: Ralf Stephan Date: Sat, 19 Aug 2017 16:22:14 +0200 Subject: [PATCH] 20191: cases() function --- src/sage/functions/all.py | 2 +- src/sage/functions/other.py | 91 +++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/sage/functions/all.py b/src/sage/functions/all.py index 1c04b124ea0..61c4bca946d 100644 --- a/src/sage/functions/all.py +++ b/src/sage/functions/all.py @@ -25,7 +25,7 @@ abs_symbolic, sqrt, log_gamma, gamma_inc, incomplete_gamma, gamma_inc_lower, arg, real_part, real, frac, - imag_part, imag, imaginary, conjugate) + imag_part, imag, imaginary, conjugate, cases) from .log import (exp, exp_polar, log, ln, polylog, dilog, lambert_w, harmonic_number) diff --git a/src/sage/functions/other.py b/src/sage/functions/other.py index 2fd46fbd6c0..468fb84a9ff 100644 --- a/src/sage/functions/other.py +++ b/src/sage/functions/other.py @@ -2580,3 +2580,94 @@ def _print_latex_(self, ex, var, to, direction=''): symbolic_limit = Function_limit() + +class Function_cases(GinacFunction): + """ + Formal function holding ``(condition, expression)`` pairs. + + Numbers are considered conditions with zero being ``False``. + A true condition marks a default value. The function is not + evaluated as long as it contains a relation that cannot be + decided by Pynac. + + EXAMPLES:: + + sage: ex = cases([(x==0, pi), (True, 0)]); ex + cases(((x == 0, pi), (1, 0))) + sage: ex.subs(x==0) + pi + sage: ex.subs(x==2) + 0 + sage: ex + 1 + cases(((x == 0, pi), (1, 0))) + 1 + sage: _.subs(x==0) + pi + 1 + + The first encountered default is used, as well as the first relation + that can be trivially decided:: + + sage: cases(((True, pi), (True, 0))) + pi + + sage: _ = var('y') + sage: ex = cases(((x==0, pi), (y==1, 0))); ex + cases(((x == 0, pi), (y == 1, 0))) + sage: ex.subs(x==0) + pi + sage: ex.subs(x==0, y==1) + pi + """ + def __init__(self): + """ + EXAMPLES:: + + sage: loads(dumps(cases)) + cases + """ + GinacFunction.__init__(self, "cases") + + def __call__(self, l, **kwargs): + """ + EXAMPLES:: + + sage: ex = cases([(x==0, pi), (True, 0)]); ex + cases(((x == 0, pi), (1, 0))) + + TESTS:: + + sage: cases() + Traceback (most recent call last): + ... + TypeError: __call__() takes exactly 2 arguments (1 given) + + sage: cases(x) + Traceback (most recent call last): + ... + RuntimeError: cases argument not a sequence + """ + return GinacFunction.__call__(self, + SR._force_pyobject(l), **kwargs) + + def _print_latex_(self, l, **kwargs): + r""" + EXAMPLES:: + + sage: ex = cases([(x==0, pi), (True, 0)]); ex + cases(((x == 0, pi), (1, 0))) + sage: latex(ex) + \begin{cases}{\pi} & {x = 0}\\{0} & {1}\end{cases} + """ + if not isinstance(l, (list, tuple)): + raise ValueError("cases() argument must be a list") + str = r"\begin{cases}" + for pair in l: + left = None + if (isinstance(pair, tuple)): + right,left = pair + else: + right = pair + str += r"{%s} & {%s}\\" % (latex(left), latex(right)) + print(str[:-2] + r"\end{cases}") + +cases = Function_cases() +