ó
šßÈ[c           @` s  d  Z  d d l m Z m Z m Z m Z d d l m Z d d l Z	 d d l
 m Z d d l m Z m Z d d	 l m Z d
 d d d d g Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   u   
Power law model variants
i    (   t   absolute_importt   unicode_literalst   divisiont   print_function(   t   OrderedDictNi   (   t   Fittable1DModel(   t	   Parametert   InputParameterErrori   (   t   Quantityu
   PowerLaw1Du   BrokenPowerLaw1Du   SmoothlyBrokenPowerLaw1Du   ExponentialCutoffPowerLaw1Du   LogParabola1Dt
   PowerLaw1Dc           B` sq   e  Z d  Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d „  ƒ Z e d „  ƒ Z	 e
 d „  ƒ Z d „  Z RS(   uÛ  
    One dimensional power law model.

    Parameters
    ----------
    amplitude : float
        Model amplitude at the reference point
    x_0 : float
        Reference point
    alpha : float
        Power law index

    See Also
    --------
    BrokenPowerLaw1D, ExponentialCutoffPowerLaw1D, LogParabola1D

    Notes
    -----
    Model formula (with :math:`A` for ``amplitude`` and :math:`\alpha` for ``alpha``):

        .. math:: f(x) = A (x / x_0) ^ {-\alpha}

    t   defaulti   c         C` s   |  | } | | | S(   u(   One dimensional power law model function(    (   t   xt	   amplitudet   x_0t   alphat   xx(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyt   evaluate3   s    
c         C` sL   |  | } | | } | | | | } | | t  j | ƒ } | | | g S(   u?   One dimensional power law derivative with respect to parameters(   t   npt   log(   R   R   R   R   R   t   d_amplitudet   d_x_0t   d_alpha(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyt	   fit_deriv9   s
    
c         C` s+   |  j  j d  k r d  Si |  j  j d 6Sd  S(   Nu   x(   R   t   unitt   None(   t   self(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyt   input_unitsE   s    c         C` s$   t  d | d f d | d f g ƒ S(   Nu   x_0u   xu	   amplitudeu   y(   R   (   R   t   inputs_unitt   outputs_unit(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyt   _parameter_units_for_data_unitsL   s    (   t   __name__t
   __module__t   __doc__R   R   R   R   t   staticmethodR   R   t   propertyR   R   (    (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR	      s   t   BrokenPowerLaw1Dc           B` s€   e  Z d  Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z d „  Z RS(   uV  
    One dimensional power law model with a break.

    Parameters
    ----------
    amplitude : float
        Model amplitude at the break point.
    x_break : float
        Break point.
    alpha_1 : float
        Power law index for x < x_break.
    alpha_2 : float
        Power law index for x > x_break.

    See Also
    --------
    PowerLaw1D, ExponentialCutoffPowerLaw1D, LogParabola1D

    Notes
    -----
    Model formula (with :math:`A` for ``amplitude`` and :math:`\alpha_1`
    for ``alpha_1`` and :math:`\alpha_2` for ``alpha_2``):

        .. math::

            f(x) = \left \{
                     \begin{array}{ll}
                       A (x / x_{break}) ^ {-\alpha_1} & : x < x_{break} \\
                       A (x / x_{break}) ^ {-\alpha_2} & :  x > x_{break} \\
                     \end{array}
                   \right.
    R
   i   c         C` s2   t  j |  | k  | | ƒ } |  | } | | | S(   u/   One dimensional broken power law model function(   R   t   where(   R   R   t   x_breakt   alpha_1t   alpha_2R   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   x   s    
c         C` s    t  j |  | k  | | ƒ } |  | } | | } | | | | } | | t  j | ƒ }	 t  j |  | k  |	 d ƒ }
 t  j |  | k |	 d ƒ } | | |
 | g S(   uF   One dimensional broken power law derivative with respect to parametersi    (   R   R$   R   (   R   R   R%   R&   R'   R   R   R   t	   d_x_breakR   t	   d_alpha_1t	   d_alpha_2(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   €   s    
c         C` s+   |  j  j d  k r d  Si |  j  j d 6Sd  S(   Nu   x(   R%   R   R   (   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR      s    c         C` s$   t  d | d f d | d f g ƒ S(   Nu   x_breaku   xu	   amplitudeu   y(   R   (   R   R   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   –   s    (   R   R   R    R   R   R%   R&   R'   R!   R   R   R"   R   R   (    (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR#   Q   s    t   SmoothlyBrokenPowerLaw1Dc           B` s¿   e  Z d  Z e d d d d ƒ Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d d d d ƒ Z e j	 d „  ƒ Z e j	 d	 „  ƒ Z e
 d
 „  ƒ Z e
 d „  ƒ Z e d „  ƒ Z d „  Z RS(   u+
  One dimensional smoothly broken power law model.

    Parameters
    ----------
    amplitude : float
        Model amplitude at the break point.
    x_break : float
        Break point.
    alpha_1 : float
        Power law index for ``x << x_break``.
    alpha_2 : float
        Power law index for ``x >> x_break``.
    delta : float
        Smoothness parameter.

    See Also
    --------
    BrokenPowerLaw1D

    Notes
    -----
    Model formula (with :math:`A` for ``amplitude``, :math:`x_b` for
    ``x_break``, :math:`\alpha_1` for ``alpha_1``,
    :math:`\alpha_2` for ``alpha_2`` and :math:`\Delta` for
    ``delta``):

        .. math::

            f(x) = A \left( \frac{x}{x_b} \right) ^ {-\alpha_1}
                   \left\{
                      \frac{1}{2}
                      \left[
                        1 + \left( \frac{x}{x_b}\right)^{1 / \Delta}
                      \right]
                   \right\}^{(\alpha_1 - \alpha_2) \Delta}


    The change of slope occurs between the values :math:`x_1`
    and :math:`x_2` such that:

        .. math::
            \log_{10} \frac{x_2}{x_b} = \log_{10} \frac{x_b}{x_1}
            \sim \Delta


    At values :math:`x \lesssim x_1` and :math:`x \gtrsim x_2` the
    model is approximately a simple power law with index
    :math:`\alpha_1` and :math:`\alpha_2` respectively.  The two
    power laws are smoothly joined at values :math:`x_1 < x < x_2`,
    hence the :math:`\Delta` parameter sets the "smoothness" of the
    slope change.

    The ``delta`` parameter is bounded to values greater than 1e-3
    (corresponding to :math:`x_2 / x_1 \gtrsim 1.002`) to avoid
    overflow errors.

    The ``amplitude`` parameter is bounded to positive values since
    this model is typically used to represent positive quantities.


    Examples
    --------
    .. plot::
        :include-source:

        import numpy as np
        import matplotlib.pyplot as plt
        from astropy.modeling import models

        x = np.logspace(0.7, 2.3, 500)
        f = models.SmoothlyBrokenPowerLaw1D(amplitude=1, x_break=20,
                                            alpha_1=-2, alpha_2=2)

        plt.figure()
        plt.title("amplitude=1, x_break=20, alpha_1=-2, alpha_2=2")

        f.delta = 0.5
        plt.loglog(x, f(x), '--', label='delta=0.5')

        f.delta = 0.3
        plt.loglog(x, f(x), '-.', label='delta=0.3')

        f.delta = 0.1
        plt.loglog(x, f(x), label='delta=0.1')

        plt.axis([x.min(), x.max(), 0.1, 1.1])
        plt.legend(loc='lower center')
        plt.grid(True)
        plt.show()

    R
   i   t   mini    iþÿÿÿi   gü©ñÒMbP?c         C` s(   t  j | d k ƒ r$ t d ƒ ‚ n  d  S(   Ni    u   amplitude parameter must be > 0(   R   t   anyR   (   R   t   value(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   þ   s    c         C` s(   t  j | d k  ƒ r$ t d ƒ ‚ n  d  S(   Ngü©ñÒMbP?u    delta parameter must be >= 0.001(   R   R-   R   (   R   R.   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyt   delta  s    c         C` sw  |  | } t  j | d t ƒ} t | t ƒ rC | j } | j } n d } t  j | ƒ | }	 d }
 |	 |
 k } | j	 ƒ  r¤ | | | | d | | | | | <n  |	 |
 k  } | j	 ƒ  rç | | | | d | | | | | <n  t  j
 |	 ƒ |
 k } | j	 ƒ  rSt  j |	 | ƒ } d | d } | | | | | | | | | | <n  | rot | d | d t ƒS| Sd S(   u8   One dimensional smoothly broken power law model functiont   suboki   g       @g      ð?R   t   copyN(   R   t
   zeros_liket   Falset
   isinstanceR   R   R.   R   R   t   maxt   abst   exp(   R   R   R%   R&   R'   R/   R   t   ft   return_unitt   logtt	   thresholdt   it   tt   r(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   
  s,    
	***c         C` s‹  |  | } t  j | ƒ | } t  j | ƒ } t  j | ƒ }	 t  j | ƒ }
 t  j | ƒ } t  j | ƒ } t  j | ƒ } d } | | k } | j ƒ  r\| | | | d | | | | | <| | | |	 | <| | | | |
 | <| | | t  j d ƒ | | <| | t  j | | ƒ | t  j d ƒ | | <| | | | t  j d ƒ | | <n  | | k  } | j ƒ  r;| | | | d | | | | | <| | | |	 | <| | | | |
 | <| | t  j | | ƒ | t  j d ƒ | | <| | | t  j d ƒ | | <| | | | t  j d ƒ | | <n  t  j | ƒ | k } | j ƒ  rxt  j | | ƒ } d | d } | | | | | | | | | | <| | | |	 | <| | | | | | d | | |
 | <| | t  j | | ƒ | t  j | ƒ | | <| | | t  j | ƒ | | <| | | | t  j | ƒ | d | | t  j | | ƒ | | <n  |	 |
 | | | g S(   uZ   One dimensional smoothly broken power law derivative with respect
           to parametersi   g       @i   g      ð?(   R   R   R2   R5   R6   R7   (   R   R   R%   R&   R'   R/   R   R:   R8   R   R(   R)   R*   t   d_deltaR;   R<   R=   R>   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   B  sH    
' 1''1''*1 Gc         C` s+   |  j  j d  k r d  Si |  j  j d 6Sd  S(   Nu   x(   R%   R   R   (   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   {  s    c         C` s$   t  d | d f d | d f g ƒ S(   Nu   x_breaku   xu	   amplitudeu   y(   R   (   R   R   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   ‚  s    (   R   R   R    R   R   R%   R&   R'   R/   t	   validatorR!   R   R   R"   R   R   (    (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR+   ›   s   [89t   ExponentialCutoffPowerLaw1Dc           B` s€   e  Z d  Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z d „  Z RS(   u  
    One dimensional power law model with an exponential cutoff.

    Parameters
    ----------
    amplitude : float
        Model amplitude
    x_0 : float
        Reference point
    alpha : float
        Power law index
    x_cutoff : float
        Cutoff point

    See Also
    --------
    PowerLaw1D, BrokenPowerLaw1D, LogParabola1D

    Notes
    -----
    Model formula (with :math:`A` for ``amplitude`` and :math:`\alpha` for ``alpha``):

        .. math:: f(x) = A (x / x_0) ^ {-\alpha} \exp (-x / x_{cutoff})

    R
   i   c         C` s)   |  | } | | | t  j |  | ƒ S(   u;   One dimensional exponential cutoff power law model function(   R   R7   (   R   R   R   R   t   x_cutoffR   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   §  s    
c         C` s}   |  | } |  | } | | t  j | ƒ } | | | | } | | t  j | ƒ }	 | |  | | d }
 | | |	 |
 g S(   uR   One dimensional exponential cutoff power law derivative with respect to parametersi   (   R   R7   R   (   R   R   R   R   RB   R   t   xcR   R   R   t
   d_x_cutoff(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   ®  s    

c         C` s+   |  j  j d  k r d  Si |  j  j d 6Sd  S(   Nu   x(   R   R   R   (   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   ¼  s    c         C` s1   t  d | d f d | d f d | d f g ƒ S(   Nu   x_0u   xu   x_cutoffu	   amplitudeu   y(   R   (   R   R   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   Ã  s    (   R   R   R    R   R   R   R   RB   R!   R   R   R"   R   R   (    (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyRA   ‡  s   t   LogParabola1Dc           B` s€   e  Z d  Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d d ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z d „  Z RS(   ut  
    One dimensional log parabola model (sometimes called curved power law).

    Parameters
    ----------
    amplitude : float
        Model amplitude
    x_0 : float
        Reference point
    alpha : float
        Power law index
    beta : float
        Power law curvature

    See Also
    --------
    PowerLaw1D, BrokenPowerLaw1D, ExponentialCutoffPowerLaw1D

    Notes
    -----
    Model formula (with :math:`A` for ``amplitude`` and :math:`\alpha` for ``alpha`` and :math:`\beta` for ``beta``):

        .. math:: f(x) = A \left(\frac{x}{x_{0}}\right)^{- \alpha - \beta \log{\left (\frac{x}{x_{0}} \right )}}

    R
   i   i    c         C` s.   |  | } | | t  j | ƒ } | | | S(   u+   One dimensional log parabola model function(   R   R   (   R   R   R   R   t   betaR   t   exponent(    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   é  s    
c         C` s‚   |  | } t  j | ƒ } | | | } | | } | | | d }	 | | | | | | | }
 | | | } | |
 | |	 g S(   uB   One dimensional log parabola derivative with respect to parametersi   (   R   R   (   R   R   R   R   RF   R   t   log_xxRG   R   t   d_betaR   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   ñ  s    

c         C` s+   |  j  j d  k r d  Si |  j  j d 6Sd  S(   Nu   x(   R   R   R   (   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR   ÿ  s    c         C` s$   t  d | d f d | d f g ƒ S(   Nu   x_0u   xu	   amplitudeu   y(   R   (   R   R   R   (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyR     s    (   R   R   R    R   R   R   R   RF   R!   R   R   R"   R   R   (    (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyRE   É  s   (   R    t
   __future__R    R   R   R   t   collectionsR   t   numpyR   t   coreR   t
   parametersR   R   t   unitsR   t   __all__R	   R#   R+   RA   RE   (    (    (    s9   lib/python2.7/site-packages/astropy/modeling/powerlaws.pyt   <module>   s   "	;JìB