On 19 Mrz., 18:49, Jason Grout <[email protected]> wrote:
> Jason Grout wrote:
> > Wilfried_Huss wrote:
>
> >> On 19 Mrz., 16:47, Jason Grout <[email protected]> wrote:
> >>> [email protected] wrote:
> >>>> Hello, this command produces one half of a cirle, not 1/4 as excepted.
> >>>> I think that this is a bug in sage 3.4
> >>>> Robert
> >>>> region_plot([y>0,x>0,x^2+y^2<3], (-3, 3), (-3,
> >>>> 3),plot_points=100,incol='gray').show(aspect_ratio=1)
> >>> I get a quarter-circle on my sage 3.4 and on sagenb.org.  Can you try on
> >>> sagenb.org?
> >> This works:
> >> sage: var('x,y')
> >> sage: region_plot([y>0,x>0,x^2+y^2<3], (x, -3, 3), (y, -3,3))
>
> >> But if one leaves out the variables, one gets an half circle:
> >> sage: region_plot([y>0,x>0,x^2+y^2<3], (-3, 3), (-3,3))
>
> >> I've written a patch which fixes this:
> >>http://trac.sagemath.org/sage_trac/ticket/5567
>
> > Ah, yes, good catch.  For those that want to know, Sage was interpreting
> > the first two constraints as functions of one variable, so when it
> > plugged in two numbers, Sage behaved as though you had typed x>0, x>0.
> > When I did my example, I explicitly put in the variable names (it's a
> > good habit to be explicit in plotting), so I got the right plot.
>
> > There should be a standard function that takes a tuple of functions and
> > returns a list of variables for all the functions.  This is used all
> > over the plotting code, the fast_callable code, now this code, etc.
> > Basically, there should be a function that, treating a tuple of
> > functions as a vector-valued function, returns the variables used in the
> > vector-valued function.
>
> > Also, I wonder why fast_float is not used?  It could drastically speed
> > up plots.  You could just replace the lines like:
>
> > s = symbolic_expression(f.rhs() - f.lhs()).function(*variables)
>
> > with
>
> > s = fast_float(f.rhs() - f.lhs(), *vars)
>
> > and you'd probably see at least an order of magnitude speedup.  (make
> > sure to do "from sage.ext.fast_eval import fast_float" first).
>
> Actually, I believe that the call to setup_eval_on_grid automatically
> does the call to fast_float, so it's probably already happening and we
> don't have to worry about anything.

Yes

> In fact, I think the root of the problem is in
> plot/plot3d/parametric_plot3d.py in the adapt_to_callable function (this
> is called by setup_for_eval_on_grid, which is in turn called by
> region_plot).  Observe (and please pardon my debugging in public :)
>
> sage: from sage.plot.plot3d.parametric_plot3d import adapt_to_callable
> sage: var('x,y')
> (x, y)
> sage: funcs = [x,y]
> sage: adapt_to_callable(funcs,2)
>
> ((<sage.ext.interpreters.wrapper_rdf.Wrapper_rdf object at 0xa9b1d9c>,
>    <sage.ext.interpreters.wrapper_rdf.Wrapper_rdf object at 0xa9d916c>),
>   (y, x))
>
> First of all, why in the world are the arguments y, then x?  I thought
> the convention was alphabetical ordering if an ordering wasn't specified.
>
> Well, the problem is in this line of adapt_to_callable:
>
> tuple(sorted(set(sum( [z.variables() for z in f], ()) )))
>
> Note:
>
> sage: sorted(set(sum([z.variables() for z in funcs],())))
> [y, x]
>
> and even
>
> sage: sorted(list(set(sum([z.variables() for z in funcs],()))))
> [y, x]
>
> For some reason, sorting the list [y,x] doesn't make it [x,y]:
>
> sage: sorted([y,x])
> [y, x]

Well, that is not surprising since x < y is a symbolic equation.
We need to sort the variables by name.

sage: sorted([y,x], cmp = lambda a,b: cmp(repr(a), repr(b)) )
[x, y]

But, fixing the variable order in adapt_to_callable does not
solve the problem in region_plot, because setup_for_eval_on_grid
calls adapt_to_callable in a loop for one function at a time.

> There seem to be other problems too:
>
> sage: funcs=[x,y,1]
> sage: adapt_to_callable(funcs,2)
> ---------------------------------------------------------------------------
> TypeError                                 Traceback (most recent call last)
>
> /home/jason/.sage/temp/littleone/16993/_home_jason__sage_init_sage_0.py
> in <module>()
>
> /home/jason/sage/local/lib/python2.5/site-packages/sage/plot/plot3d/parametric_plot3d.pyc
> in adapt_to_callable(f, nargs)
>      620     except TypeError:
>      621         vars = ()
> --> 622         f = [fast_float_constant(x) for x in f]
>      623
>      624     if nargs is not None and len(vars) != nargs:
>
> /home/jason/sage/local/lib/python2.5/site-packages/sage/ext/fast_eval.so
> in sage.ext.fast_eval.fast_float_constant (sage/ext/fast_eval.c:6827)()
>
> /home/jason/sage/local/lib/python2.5/site-packages/sage/ext/fast_eval.so
> in sage.ext.fast_eval.FastDoubleFunc.__init__ (sage/ext/fast_eval.c:2781)()
>
> TypeError: a float is required
>
> This comes from assuming that if any of the functions doesn't have a
> .variables() method, then *all* of the functions must be constants.
> That seems a bit silly...
>
> So I think it not a coincidence that this function has no doctests.  I
> think this is yet another example of code that doesn't have doctests
> that (not surprisingly) is broken.
>
> Wilfried, can you take a look at this function (adapt_to_callable)?  I
> think fixing it will fix probably lots of other bugs as well, since it
> is called from lots of plotting code.

I will try to look into it.

> Thanks,
>
> Jason

Cheers,
Wilfried
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to