ó
¡¼™\c           @   sn   d  d l  m Z m Z m Z m Z d  d l m Z d  d l m Z m	 Z	 d  d l
 m Z d „  Z d „  Z d S(   iÿÿÿÿ(   t   Functiont   Powt   sympifyt   Expr(   t
   Relational(   t   Polyt	   decompose(   t	   func_namec            sˆ  t  |  ƒ }  t |  t ƒ s+ t |  t ƒ rD t d t |  ƒ ƒ ‚ n  ˆ  |  j k rZ |  g Sg  } t |  t t f ƒ rÇ |  j	 d ˆ  k r |  g S| |  j
 |  j	 d ˆ  ƒ g t |  j	 d ˆ  ƒ 7} | St |  ƒ } t t ‡  f d †  | j ƒ ƒ } t | ƒ d k rT| d ˆ  k rT|  j
 | d ˆ  ƒ } | d } | | g t | ˆ  ƒ 7} | Sy | t |  ƒ 7} | SWn t k
 rƒ|  g SXd S(   se  
    Computes General functional decomposition of ``f``.
    Given an expression ``f``, returns a list ``[f_1, f_2, ..., f_n]``,
    where::
              f = f_1 o f_2 o ... f_n = f_1(f_2(... f_n))

    Note: This is a General decomposition function. It also decomposes
    Polynomials. For only Polynomial decomposition see ``decompose`` in polys.

    Examples
    ========

    >>> from sympy.solvers.decompogen import decompogen
    >>> from sympy.abc import x
    >>> from sympy import sqrt, sin, cos
    >>> decompogen(sin(cos(x)), x)
    [sin(x), cos(x)]
    >>> decompogen(sin(x)**2 + sin(x) + 1, x)
    [x**2 + x + 1, sin(x)]
    >>> decompogen(sqrt(6*x**2 - 5), x)
    [sqrt(x), 6*x**2 - 5]
    >>> decompogen(sin(sqrt(cos(x**2 + 1))), x)
    [sin(x), sqrt(x), cos(x), x**2 + 1]
    >>> decompogen(x**4 + 2*x**3 - x - 1, x)
    [x**2 - x - 1, x**2 + x]

    s   expecting Expr but got: `%s`i    c            s   ˆ  |  j  k S(   N(   t   free_symbols(   t   x(   t   symbol(    s7   lib/python2.7/site-packages/sympy/solvers/decompogen.pyt   <lambda>4   t    i   N(   R   t
   isinstanceR   R   t	   TypeErrorR   R   R    R   t   argst   subst
   decompogenR   t   listt   filtert   genst   lenR   t
   ValueError(   t   fR
   t   resultt   fpR   t   f1t   f2(    (   R
   s7   lib/python2.7/site-packages/sympy/solvers/decompogen.pyR      s.    4!"
c         C   sb   t  |  ƒ d k r |  d S|  d j | |  d ƒ } t  |  ƒ d k rJ | St | g |  d | ƒ S(   s0  
    Returns the composition of functions.
    Given a list of functions ``g_s``, returns their composition ``f``,
    where:
        f = g_1 o g_2 o .. o g_n

    Note: This is a General composition function. It also composes Polynomials.
    For only Polynomial composition see ``compose`` in polys.

    Examples
    ========

    >>> from sympy.solvers.decompogen import compogen
    >>> from sympy.abc import x
    >>> from sympy import sqrt, sin, cos
    >>> compogen([sin(x), cos(x)], x)
    sin(cos(x))
    >>> compogen([x**2 + x + 1, sin(x)], x)
    sin(x)**2 + sin(x) + 1
    >>> compogen([sqrt(x), 6*x**2 - 5], x)
    sqrt(6*x**2 - 5)
    >>> compogen([sin(x), sqrt(x), cos(x), x**2 + 1], x)
    sin(sqrt(cos(x**2 + 1)))
    >>> compogen([x**2 - x - 1, x**2 + x], x)
    -x**2 - x + (x**2 + x)**2 - 1
    i   i    i   (   R   R   t   compogen(   t   g_sR
   t   foo(    (    s7   lib/python2.7/site-packages/sympy/solvers/decompogen.pyR   D   s    N(   t
   sympy.coreR    R   R   R   t   sympy.core.relationalR   t   sympy.polysR   R   t   sympy.utilities.miscR   R   R   (    (    (    s7   lib/python2.7/site-packages/sympy/solvers/decompogen.pyt   <module>   s
   "	=