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.


Reply via email to