Xavier, For code for piecewise linear functions of several variables, see here: https://github.com/mkoeppe/cutgeneratingfunctionology/blob/master/piecewise_functions.sage I'd be quite interested in getting something like this into sage. There's no ticket for this yet.
Also, you might be interested in https://trac.sagemath.org/ticket/20877 Best, Matthias On Thursday, October 18, 2018 at 4:37:17 PM UTC-5, Xavier Caruso wrote: > > Hello, > > For some application I have in mind (related to ticket #26471 for > those who are interested), I need to have support for piecewise > affine functions in Sage. More precisely, what I mostly need is: > . to add, compose, take the sup/inf of these functions > . to check continuity, convexity, bijectivity > . to compute the inverse (for composition) when appropriate > > I'd be happy to implement this but I'm unsure how it should fit > in the current framework. Notably, I noticed that there already > exists support for piecewise defined functions: > > http://doc.sagemath.org/html/en/reference/functions/sage/functions/piecewise.html > > So I guess that I should derive from this class. > But I'm unsure because I realized that the behavior of piecewise > defined functions is sometimes a bit different for what I'd like > to have. For instance, if f and g are PiecewiseAffineFunction, I > would expect f + g to be a PiecewiseAffineFunction as well. And > f.derivative() as well, etc. > It's not exactly the case for piecewise defined function: > > sage: f = piecewise([((0,1), 2*x), ([-1,0], 3*x)]) > sage: type(f) == type(f + f) > False > sage: type(f) == type(f.derivative()) > False > > (I saw that there is a method piecewise_add() but I would expect > it to be the default __add__; why isn't it the case?) > > Moreover it seems that composition of piecewise defined functions > is presumably broken[#] (or not implemented): > > sage: f(f) > Traceback (most recent call last): > ... > TypeError: __call__() takes exactly 2 arguments (3 given) > > sage: f(f(x)) > Traceback (most recent call last): > ... > TypeError: __call__() takes exactly 2 arguments (3 given) > > So my question is: what should I do in order to implement piecewise > affine functions and the features I would like to have? Do you have > any good advise? > > Best, > --Xavier > > [#] By the way, I noticed: > sage: f(x) = 2*x + 3 > sage: f(f) > 4*x + 9 > Shouldn't it x |--> 4*x + 9 instead? > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at https://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.