Really I just like working on sets.  They're fairly simple and fun to play
with.  Here is a pull request adding a `transform` method to sets

https://github.com/sympy/sympy/pull/2340


On Tue, Jul 30, 2013 at 7:14 AM, Ben Lucato <[email protected]> wrote:

> 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.
>
>
>

-- 
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.


Reply via email to