On Monday, November 24, 2014 11:19:40 AM UTC-8, Jesús Torrado wrote: > > Hi there, > > I am using fast_callable in order to pass numpy arrays to symbolic > expressions, as suggested [here]( > http://ask.sagemath.org/question/8383/using-symbolic-expressions-with-numpy-arrays/ > ) > > I encountered the following behaviour: > > sage: var('x') > sage: f(x) = x**2 > sage: fast_callable(f)(2) > 4 > sage: f(x) = 0 > sage: fast_callable(f)(2) > [...] > ValueError [and no message here] > sage: f(x) = 0 > sage: f(x) = 0 > sage: fast_callable(f, vars=[x])(2) > 0 > > I guess this is not a bad behaviour per se (though the exception looks > like it has not been handled properly). Nevertheless, I think it would be > nice that when `f.variables()==()`, `fast_callable` simply discards the > input. It would save some testing for corner cases: if I pass `f` to a > function that expects `f(x)` with one variable, one would have to check for > the special case of a zero-defined `f`. >
The case of 0 variables is only a special case. This occurs more generally for "symbolic functions" that do not actually have all their arguments appear in their evaluating expression: sage: f(x,y)=y sage: fast_callable(f)(1,2) ValueError: In fact, the behaviour leads to silent differences in results that should probably lead to an error of some sort: sage: f(3) y sage: fast_callable(f)(3) 3 As you remark, fast_callable(f,vars=[x,y]) does do the right: sage: fast_callable(f,vars=(x,y))(1,2) 2 sage: fast_callable(f,vars=(x,y))(3) ValueError: so the problem is that fast_callable is using the wrong heuristics for determining "vars" when not explicitly given. From the printing it's pretty clear what should be used: sage: f (x, y) |--> y (clearly the left hand side is the best guess for "vars" in this case) but I have trouble finding an easy criterion to recognize that f needs different treatment from f(x,y): sage: type(f) <type 'sage.symbolic.expression.Expression'> sage: type(f(x,y)) <type 'sage.symbolic.expression.Expression'> sage: f(x,y) y The heuristics used in fast_callable are problematic in other situations too: sage: f(u,v)=x^2*u+v sage: f (u, v) |--> u*x ^2+ v sage: f(3,5,7) #shouldn't we complain about the extra argument? 3*x^2 + 5 sage: fast_callable(f)(1,2) ValueError: sage: fast_callable(f)(3,5,7) #do we know for sure the x will land in the third position? 152 sage: fast_callable(f,vars=(u,v))(1,2) #perhaps the free x should cause an earlier error? ValueError: Variable 'x' not found -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To post to this group, send email to sage-support@googlegroups.com. Visit this group at http://groups.google.com/group/sage-support. For more options, visit https://groups.google.com/d/optout.