Awesome! You are a gentleman and a scholar, Matthew Rocklin. Thanks for letting me know there is no way to do this in the current sympy.
On 30 July 2013 13:18, Matthew Rocklin <[email protected]> wrote: > At some point we might do a simplify sort of treatment for sets. > > In the meantime something like the following could work in the case of > monotonic functions. In general we know how to transform Intervals and > FiniteSets. We know that unions and intersections will compose well with > these transformations. That's all you really need. > > This should eventually be broken out into methods on the various classes: > > def transform_set(x, expr, set): > """ Transform a set by an expression > > >>> domain = Interval(-pi, 0, True, True) + Interval(0, pi/2, True, > True) > (0, pi/2) U (-pi, 0) > > >>> transform(x, 2*x, domain) > (0, pi) U (-2*pi, 0) > > >>> transform(x, x**2, domain) > (0, pi**2) > """ > if isinstance(set, Union): > return Union(transform_set(x, expr, arg) for arg in set.args) > if isinstance(set, Intersection): > return Intersection(transform_set(x, expr, arg) for arg in > set.args) > z = Dummy('z', real=True) > f = Lambda(x, expr) > if isinstance(set, Interval): > # TODO: manage left_open and right_open better > left, right = f(set.left), f(set.right) > return Interval(Min(left, right), Max(left, right), > set.left_open, set.right_open) > if isinstance(set, FiniteSet): > return FiniteSet(map(f, set)) > > > > On Mon, Jul 29, 2013 at 9:37 PM, Ben Lucato <[email protected]> wrote: > >> Thanks - I updated to the git master and now the TransformationSet works. >> Is there some way to take this new TransformationSet object and rewrite it >> as a Union/Interval? >> >> i.e. >> >> get this: >> >> Interval(-2*pi, 0, True, True) + Interval(0, pi, True, True) >> >> >> On Tuesday, 30 July 2013 10:34:48 UTC+10, Matthew wrote: >> >>> This is what I get. Can you verify that things don't work for you? >>> This was done in sympy/master. >>> >>> In [1]: domain = Interval(-pi, 0, True, True) + Interval(0, pi/2, True, >>> True) >>> >>> In [2]: new_domain = TransformationSet(Lambda(x, 2*x), domain) >>> >>> In [3]: domain >>> Out[3]: >>> ⎛ π⎞ >>> ⎜0, ─⎟ ∪ (-π, 0) >>> ⎝ 2⎠ >>> >>> In [4]: new_domain >>> Out[4]: >>> ⎧ ⎛ π⎞ ⎫ >>> ⎨2⋅x | x ∊ ⎜0, ─⎟ ∪ (-π, 0)⎬ >>> ⎩ ⎝ 2⎠ ⎭ >>> >>> In [5]: 3*pi/4 in new_domain >>> Out[5]: True >>> >>> >>> >>> On Mon, Jul 29, 2013 at 7:24 PM, Ben Lucato <[email protected]> wrote: >>> >>>> Howdy, say I do: >>>> >>>> domain = Interval(-pi, 0, True, True) + Interval(0, pi/2, True, True) >>>> >>>> >>>> I could hope to do a transformation to dilate this domain by a factor 2 >>>> from the origin, like so: >>>> >>>> >>>> new_domain = domain.replace(lambda expr: expr.is_Real, lambda expr: >>>> 2*expr) >>>> OR: >>>> new_domain = TransformationSet(Lambda(x, 2*x), domain) >>>> >>>> in either case, checking: >>>> >>>> 3*pi/4 in new_domain >>>> >>>> returns False. >>>> >>>> I may be using TransformationSet incorrectly - I just looked in the >>>> docs and it looked like something relevant. Perhaps it only works for sets? >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "sympy" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to sympy+un...@**googlegroups.com. >>>> To post to this group, send email to [email protected]. >>>> >>>> Visit this group at >>>> http://groups.google.com/**group/sympy<http://groups.google.com/group/sympy> >>>> . >>>> For more options, visit >>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out> >>>> . >>>> >>>> >>>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "sympy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/sympy. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sympy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sympy/WlG3XirFAzM/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- Ben Lucato ---------------------------------------------------------------------------------- Phone: +61 400 159 632 | Email: [email protected] -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. For more options, visit https://groups.google.com/groups/opt_out.
