U
    L?h                     @   sp   d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZ dd Zd	d
 ZdS )    )FunctionPowsympifyExpr)
Relational)S)Poly	decompose)	func_name)MinMaxc                    s  t | } t| trt| tr,tdt|   | jkr<| gS t| ttfr| j	rd| j
tjkrd| j}n
| jd }| kr|| gS | | gt|  S t| ttfrVt| j}d}t|D ]v\}}| sqt| }t|dkr g| }|dkr|dd }n|dd |kr$ g} q2|d ||< q|d  krF| gS | j| g| S t| }tt fdd|j}	t|	dkr|	d  kr| |	d  }
|	d }|
gt|  S z
t| W S  tk
r   | g Y S X dS )a9  
    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.abc import x
    >>> from sympy import decompogen, 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]

    zexpecting Expr but got: `%s`r   N   c                    s
    | j kS )N)free_symbols)xsymbol J/var/www/html/venv/lib/python3.8/site-packages/sympy/solvers/decompogen.py<lambda>M       zdecompogen.<locals>.<lambda>)r   
isinstancer   r   	TypeErrorr
   r   r   r   Zis_Powbaser   ZExp1expargssubs
decompogenr   r   list	enumerateZhas_freelenfuncr   filtergensr	   
ValueError)fr   argr   Zd0iadfpr"   f1f2r   r   r   r   	   sP    







r   c                 C   sP   t | dkr| d S | d || d }t | dkr8|S t|g| dd  |S )a0  
    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
    r   r      N)r   r   compogen)Zg_sr   Zfoor   r   r   r-   [   s    r-   N)Z
sympy.corer   r   r   r   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.polysr   r	   Zsympy.utilities.miscr
   Z(sympy.functions.elementary.miscellaneousr   r   r   r-   r   r   r   r   <module>   s   R