I'm not saying that this sort of calculation shouldn't be doable, just
that the user needs to be explicit about asking for it to happen.
Also keep in mind that some evalf() calls can be very slow. This can
obviously happen if the expression is large, but it can also happen
for some Integrals and Sums in the current code.
Here's an example (from
https://github.com/sympy/sympy/issues/10800)
Integral(sin(exp(x)), (x, 1, oo)).evalf() # hangs
Obviously we need to fix that to evaluate faster, but the point is
that even if we did that, evalf is inherently a very expensive
operation in general.
On Fri, Sep 22, 2023 at 3:16 PM Chris Smith <
smi...@gmail.com> wrote:
>
> > This is a great example of code that ends up being dependent on
> automatic evaluation behavior which makes that behavior harder to
> remove.
>
> If that is removed then the test will be changed to whatever mechanism will allow the sign of `self - i` to be determined. And for an arbitrary function I don't know how you can do that without evaluation (even if that evaluation does something like ball/interval arithmetic to determine that the range of possible values allows the inequality to be determined). Computing with `n(2)` is much faster than trying to infer the value of a complicated expression.
>
> Do you have ideas about how we can tell if `sqrt(log(100)+log(log(100))) > 2` that is faster than evaluation?
Computing whether a > b is a hard problem. It's computation
undecidable in general by Richardson's theorem (a = b is equivalent to
~(a > b) & ~(a < b)). If you have something like sin(1)**2 + cos(1)**2
> 1, and you try to compute it numerically, you cannot get a definite
answer.
So the only reasonable approach is to use something that is fast, but
might give an indeterminate answer, and give users an option to extend
to something more computationally expensive.
I know the code here is coming from __int__, which can only return a
number or raise an exception. I would say here that it should just
raise an exception when too much computation is required, and there
should be a separate SymPy API that can return an unevaluated
expression and has options for controlling how much computation is
done.
But if your model is "compute everything immediately with automatic
evaluation", you have absolutely no control over how much computation
is done. And you end up with defaults that try to do way too much
computation, which ends up slowing things down.
Aaron Meurer
> To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/3da5eaa6-2299-4d24-bfd1-fbe0e899d678n%40googlegroups.com.