Re: [sage-support] Piecewise Function Fails to Evaluate in its Domain

2019-04-03 Thread David Joyner
On Wed, Apr 3, 2019 at 2:47 PM  wrote:

> The simplest example:
>
> f = piecewise([[[-pi-1, -pi/2], 0], [(-pi/2,pi/2), 1], [[pi/2, pi+1], 0]])
> print(f(-pi))
>
>
I'm not sure why it isn't evaluating symbolic numbers like pi, but here's a
work-around:

sage: f = piecewise([((-pi-*1*, -pi/*2*), *0*), ((-pi/*2*,pi/*2*), *1*),
((pi/*2*, pi+*1*), *0*)])

sage: ff = *lambda* x: f(RR(x))

sage: ff(-pi)

0

sage: f(-*3.1415*)
0

which gives the traceback:
>
> TypeError Traceback (most recent call last)
>  in ()
> > 1 f(-pi)
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>  in sage.symbolic.expression._eval_on_operands.new_f 
> (build/cythonized/sage/symbolic/expression.cpp:66491)()
>   12677 new_args = list(ex._unpack_operands())
>   12678 new_args.extend(args)
> > 12679 return f(ex, *new_args, **kwds)
>   12680 return new_f
>   12681
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
>  in __call__(self, parameters, variable, value, **kwds)
> 472 if value is not None:
> 473 substitution[variable] = value
> --> 474 return self.subs(substitution)
> 475
> 476 def _fast_float_(self, *args):
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>  in sage.symbolic.expression.Expression.substitute 
> (build/cythonized/sage/symbolic/expression.cpp:30025)()
>5289 
> smap.insert(make_pair((self.coerce_in(k))._gobj,
>5290   
> (self.coerce_in(v))._gobj))
> -> 5291 res = self._gobj.subs_map(smap, 0)
>5292 return new_Expression_from_GEx(self._parent, res)
>5293
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
>  in _subs_(self, subs_map, options, parameters, x)
> 226 if hasattr(point, 'pyobject'):
> 227 # unwrap any numeric values
> --> 228 point = point.pyobject()
> 229 else:
> 230 raise ValueError('substituting the piecewise variable 
> must result in real number')
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>  in sage.symbolic.expression.Expression.pyobject 
> (build/cythonized/sage/symbolic/expression.cpp:6083)()
> 372
> 373 cdef class Expression(CommutativeRingElement):
> --> 374 cpdef object pyobject(self):
> 375 """
> 376 Get the underlying Python object.
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>  in sage.symbolic.expression.Expression.pyobject 
> (build/cythonized/sage/symbolic/expression.cpp:6009)()
> 428
> 429 if not is_a_numeric(self._gobj):
> --> 430 raise TypeError("self must be a numeric expression")
> 431 return py_object_from_numeric(self._gobj)
> 432
>
> TypeError: self must be a numeric expression
> sage: f(-pi)
> ---
> TypeError Traceback (most recent call last)
>  in ()
> > 1 f(-pi)
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>  in sage.symbolic.expression._eval_on_operands.new_f 
> (build/cythonized/sage/symbolic/expression.cpp:66491)()
>   12677 new_args = list(ex._unpack_operands())
>   12678 new_args.extend(args)
> > 12679 return f(ex, *new_args, **kwds)
>   12680 return new_f
>   12681
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
>  in __call__(self, parameters, variable, value, **kwds)
> 472 if value is not None:
> 473 substitution[variable] = value
> --> 474 return self.subs(substitution)
> 475
> 476 def _fast_float_(self, *args):
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
>  in sage.symbolic.expression.Expression.substitute 
> (build/cythonized/sage/symbolic/expression.cpp:30025)()
>5289 
> smap.insert(make_pair((self.coerce_in(k))._gobj,
>5290   
> (self.coerce_in(v))._gobj))
> -> 5291 res = self._gobj.subs_map(smap, 0)
>5292 return new_Expression_from_GEx(self._parent, res)
>5293
>
> /Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
>  in _subs_(self, subs_map, options, parameters, x)
> 226 if hasattr(point, 'pyobject'):

[sage-support] Piecewise Function Fails to Evaluate in its Domain

2019-04-03 Thread brandonhgomes
The simplest example:

f = piecewise([[[-pi-1, -pi/2], 0], [(-pi/2,pi/2), 1], [[pi/2, pi+1], 0]])
print(f(-pi))

which gives the traceback:

TypeError Traceback (most recent call last)
 in ()
> 1 f(-pi)

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression._eval_on_operands.new_f 
(build/cythonized/sage/symbolic/expression.cpp:66491)()
  12677 new_args = list(ex._unpack_operands())
  12678 new_args.extend(args)
> 12679 return f(ex, *new_args, **kwds)
  12680 return new_f
  12681

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
 in __call__(self, parameters, variable, value, **kwds)
472 if value is not None:
473 substitution[variable] = value
--> 474 return self.subs(substitution)
475
476 def _fast_float_(self, *args):

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression.Expression.substitute 
(build/cythonized/sage/symbolic/expression.cpp:30025)()
   5289 smap.insert(make_pair((self.coerce_in(k))._gobj,
   5290   
(self.coerce_in(v))._gobj))
-> 5291 res = self._gobj.subs_map(smap, 0)
   5292 return new_Expression_from_GEx(self._parent, res)
   5293

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
 in _subs_(self, subs_map, options, parameters, x)
226 if hasattr(point, 'pyobject'):
227 # unwrap any numeric values
--> 228 point = point.pyobject()
229 else:
230 raise ValueError('substituting the piecewise variable must 
result in real number')

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression.Expression.pyobject 
(build/cythonized/sage/symbolic/expression.cpp:6083)()
372
373 cdef class Expression(CommutativeRingElement):
--> 374 cpdef object pyobject(self):
375 """
376 Get the underlying Python object.

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression.Expression.pyobject 
(build/cythonized/sage/symbolic/expression.cpp:6009)()
428
429 if not is_a_numeric(self._gobj):
--> 430 raise TypeError("self must be a numeric expression")
431 return py_object_from_numeric(self._gobj)
432

TypeError: self must be a numeric expression
sage: f(-pi)
---
TypeError Traceback (most recent call last)
 in ()
> 1 f(-pi)

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression._eval_on_operands.new_f 
(build/cythonized/sage/symbolic/expression.cpp:66491)()
  12677 new_args = list(ex._unpack_operands())
  12678 new_args.extend(args)
> 12679 return f(ex, *new_args, **kwds)
  12680 return new_f
  12681

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
 in __call__(self, parameters, variable, value, **kwds)
472 if value is not None:
473 substitution[variable] = value
--> 474 return self.subs(substitution)
475
476 def _fast_float_(self, *args):

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression.Expression.substitute 
(build/cythonized/sage/symbolic/expression.cpp:30025)()
   5289 smap.insert(make_pair((self.coerce_in(k))._gobj,
   5290   
(self.coerce_in(v))._gobj))
-> 5291 res = self._gobj.subs_map(smap, 0)
   5292 return new_Expression_from_GEx(self._parent, res)
   5293

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/functions/piecewise.py
 in _subs_(self, subs_map, options, parameters, x)
226 if hasattr(point, 'pyobject'):
227 # unwrap any numeric values
--> 228 point = point.pyobject()
229 else:
230 raise ValueError('substituting the piecewise variable must 
result in real number')

/Applications/SageMath-8.7.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.pyx
 in sage.symbolic.expression.Expression.pyobject 
(build/cythonized/sage/symbolic/expression.cpp:6083)()
372
373 cdef class Expression(Commutati