Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit 1929337

Browse files
committed
20191: cases() function
1 parent effcedb commit 1929337

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

src/sage/functions/all.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
abs_symbolic, sqrt, log_gamma,
2626
gamma_inc, incomplete_gamma, gamma_inc_lower,
2727
arg, real_part, real, frac,
28-
imag_part, imag, imaginary, conjugate)
28+
imag_part, imag, imaginary, conjugate, cases)
2929

3030
from .log import (exp, exp_polar, log, ln, polylog, dilog, lambert_w, harmonic_number)
3131

src/sage/functions/other.py

+91
Original file line numberDiff line numberDiff line change
@@ -2580,3 +2580,94 @@ def _print_latex_(self, ex, var, to, direction=''):
25802580

25812581
symbolic_limit = Function_limit()
25822582

2583+
2584+
class Function_cases(GinacFunction):
2585+
"""
2586+
Formal function holding ``(condition, expression)`` pairs.
2587+
2588+
Numbers are considered conditions with zero being ``False``.
2589+
A true condition marks a default value. The function is not
2590+
evaluated as long as it contains a relation that cannot be
2591+
decided by Pynac.
2592+
2593+
EXAMPLES::
2594+
2595+
sage: ex = cases([(x==0, pi), (True, 0)]); ex
2596+
cases(((x == 0, pi), (1, 0)))
2597+
sage: ex.subs(x==0)
2598+
pi
2599+
sage: ex.subs(x==2)
2600+
0
2601+
sage: ex + 1
2602+
cases(((x == 0, pi), (1, 0))) + 1
2603+
sage: _.subs(x==0)
2604+
pi + 1
2605+
2606+
The first encountered default is used, as well as the first relation
2607+
that can be trivially decided::
2608+
2609+
sage: cases(((True, pi), (True, 0)))
2610+
pi
2611+
2612+
sage: _ = var('y')
2613+
sage: ex = cases(((x==0, pi), (y==1, 0))); ex
2614+
cases(((x == 0, pi), (y == 1, 0)))
2615+
sage: ex.subs(x==0)
2616+
pi
2617+
sage: ex.subs(x==0, y==1)
2618+
pi
2619+
"""
2620+
def __init__(self):
2621+
"""
2622+
EXAMPLES::
2623+
2624+
sage: loads(dumps(cases))
2625+
cases
2626+
"""
2627+
GinacFunction.__init__(self, "cases")
2628+
2629+
def __call__(self, l, **kwargs):
2630+
"""
2631+
EXAMPLES::
2632+
2633+
sage: ex = cases([(x==0, pi), (True, 0)]); ex
2634+
cases(((x == 0, pi), (1, 0)))
2635+
2636+
TESTS::
2637+
2638+
sage: cases()
2639+
Traceback (most recent call last):
2640+
...
2641+
TypeError: __call__() takes exactly 2 arguments (1 given)
2642+
2643+
sage: cases(x)
2644+
Traceback (most recent call last):
2645+
...
2646+
RuntimeError: cases argument not a sequence
2647+
"""
2648+
return GinacFunction.__call__(self,
2649+
SR._force_pyobject(l), **kwargs)
2650+
2651+
def _print_latex_(self, l, **kwargs):
2652+
r"""
2653+
EXAMPLES::
2654+
2655+
sage: ex = cases([(x==0, pi), (True, 0)]); ex
2656+
cases(((x == 0, pi), (1, 0)))
2657+
sage: latex(ex)
2658+
\begin{cases}{\pi} & {x = 0}\\{0} & {1}\end{cases}
2659+
"""
2660+
if not isinstance(l, (list, tuple)):
2661+
raise ValueError("cases() argument must be a list")
2662+
str = r"\begin{cases}"
2663+
for pair in l:
2664+
left = None
2665+
if (isinstance(pair, tuple)):
2666+
right,left = pair
2667+
else:
2668+
right = pair
2669+
str += r"{%s} & {%s}\\" % (latex(left), latex(right))
2670+
print(str[:-2] + r"\end{cases}")
2671+
2672+
cases = Function_cases()
2673+

0 commit comments

Comments
 (0)