
    IR-eR                         d Z ddlZddlmZmZmZmZmZ ddl	m
Z
 ddlmZmZ g dZ G d d	e
          Z G d
 de
          Z G d de
          Z G d de
          Z G d de
          Z G d de
          ZdS )z
Power law model variants.
    N)	MagnitudeQuantity
UnitsErrordimensionless_unscaledmag   )Fittable1DModel)InputParameterError	Parameter)
PowerLaw1DBrokenPowerLaw1DSmoothlyBrokenPowerLaw1DExponentialCutoffPowerLaw1DLogParabola1DSchechter1Dc                       e Zd 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dS )r   a  
    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}

    r   z!Peak value at the reference pointdefaultdescriptionReference pointPower law indexc                     | |z  }||| z  z  S )z)One dimensional power law model function. )x	amplitudex_0alphaxxs        :lib/python3.11/site-packages/astropy/modeling/powerlaws.pyevaluatezPowerLaw1D.evaluate4   s     W25&>))    c                 n    | |z  }|| z  }||z  |z  |z  }| |z  t          j        |          z  }|||gS )z@One dimensional power law derivative with respect to parameters.nplog)r   r   r   r   r   d_amplituded_x_0d_alphas           r   	fit_derivzPowerLaw1D.fit_deriv:   sR     WeVnE!K/#5*{*RVBZZ7UG,,r!   c                 P    | j         j        d S | j        d         | j         j        iS Nr   r   
input_unitinputsselfs    r   input_unitszPowerLaw1D.input_unitsE   (    8&4A 344r!   c                 P    || j         d                  || j        d                  dS Nr   )r   r   r.   outputsr0   inputs_unitoutputs_units      r   _parameter_units_for_data_unitsz*PowerLaw1D._parameter_units_for_data_unitsK   -    t{1~.%dl1o6
 
 	
r!   N)__name__
__module____qualname____doc__r   r   r   r   staticmethodr    r)   propertyr1   r:   r   r!   r   r   r      s         0 	!1TUUUI
)A+<
=
=
=CIa->???E* * \*
 - - \- 5 5 X5

 
 
 
 
r!   r   c                       e Zd 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dS )r   aV  
    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   Peak value at break pointr   Break point"Power law index before break point!Power law index after break pointc                 R    t          j        | |k     ||          }| |z  }||| z  z  S )z0One dimensional broken power law model function.)r$   where)r   r   x_breakalpha_1alpha_2r   r   s          r   r    zBrokenPowerLaw1D.evaluatey   s5     Wgw77[25&>))r!   c                    t          j        | |k     ||          }| |z  }|| z  }||z  |z  |z  }| |z  t          j        |          z  }	t          j        | |k     |	d          }
t          j        | |k    |	d          }|||
|gS )zGOne dimensional broken power law derivative with respect to parameters.r   )r$   rH   r%   )r   r   rI   rJ   rK   r   r   r&   	d_x_breakr(   	d_alpha_1	d_alpha_2s               r   r)   zBrokenPowerLaw1D.fit_deriv   s     Wgw77[eVn%3g=	*{*RVBZZ7HQ['155	HQ'\7A66	Y	9==r!   c                 P    | j         j        d S | j        d         | j         j        iS r+   rI   r-   r.   r/   s    r   r1   zBrokenPowerLaw1D.input_units   (    <"*4A 788r!   c                 P    || j         d                  || j        d                  dS Nr   )rI   r   r5   r7   s      r   r:   z0BrokenPowerLaw1D._parameter_units_for_data_units   -    "4;q>2%dl1o6
 
 	
r!   N)r<   r=   r>   r?   r   r   rI   rJ   rK   r@   r    r)   rA   r1   r:   r   r!   r   r   r   R   s         B 	!1LMMMIi}===Gi/STTTGi/RSSSG* * \* > > \> 9 9 X9

 
 
 
 
r!   r   c                   
   e Zd 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          Z	d Z
e
e_        d Zee	_        ed             Zed             Zed             Zd ZdS )r   a+
  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   r   rC   T)r   minr   r   rD   r   rE      rF   MbP?zSmoothness Parameter)r   rW   r   c                 T    t          j        |dk              rt          d          d S )Nr   zamplitude parameter must be > 0r$   anyr
   r0   values     r   _amplitude_validatorz-SmoothlyBrokenPowerLaw1D._amplitude_validator   s4    6%1* 	I%&GHHH	I 	Ir!   c                 T    t          j        |dk               rt          d          d S )NrZ   z delta parameter must be >= 0.001r\   r^   s     r   _delta_validatorz)SmoothlyBrokenPowerLaw1D._delta_validator  s4    6%%-   	J%&HIII	J 	Jr!   c                    | |z  }t          j        |d          }t          |t                    r|j        }|j        }nd}t          j        |          |z  }	d}
|	|
k    }|                                r|||         | z  z  d||z
  |z  z  z  ||<   |	|
 k     }|                                r|||         | z  z  d||z
  |z  z  z  ||<   t          j        |	          |
k    }|                                r@t          j	        |	|                   }d|z   dz  }|||         | z  z  |||z
  |z  z  z  ||<   |rt          ||dd          S |S )	z9One dimensional smoothly broken power law model function.F)subokN          @      ?T)unitcopyrd   )
r$   
zeros_like
isinstancer   rh   r_   r%   maxabsexp)r   r   rI   rJ   rK   deltar   freturn_unitlogt	thresholditrs                 r   r    z!SmoothlyBrokenPowerLaw1D.evaluate  s    [ M"E***i** 	#.K!IIK
 vbzzE! 	95577 	 BqEwh//3Gg<MQV;V3WX aD I:5577 	 BqEwh//3Gg<MQV;V3WX aD F4LLI%5577 	X tAwAqCAr!u'22QGg<MQV;V5WWAaD 	IAKe4HHHHr!   c                 V   | |z  }t          j        |          |z  }t          j        |          }t          j        |          }	t          j        |          }
t          j        |          }t          j        |          }t          j        |          }d}||k    }|                                r|||         | z  z  d||z
  |z  z  z  ||<   ||         |z  |	|<   ||         |z  |z  |
|<   ||         | t          j        d          z  z  ||<   ||         t          j        ||                    |t          j        d          z  z   z  ||<   ||         ||z
   t          j        d          z  z  ||<   || k     }|                                r|||         | z  z  d||z
  |z  z  z  ||<   ||         |z  |	|<   ||         |z  |z  |
|<   ||         t          j        ||                    |t          j        d          z  z
  z  ||<   ||         |z  t          j        d          z  ||<   ||         ||z
   t          j        d          z  z  ||<   t          j        |          |k    }|                                rt          j        ||                   }d|z   dz  }|||         | z  z  |||z
  |z  z  z  ||<   ||         |z  |	|<   ||         |||z
  |z  dz  |z  z
  z  |z  |
|<   ||         t          j        ||                    |t          j        |          z  z   z  ||<   ||         | t          j        |          z  z  ||<   ||         ||z
  z  t          j        |          |d|z   z  |z  t          j        ||                   z  z
  z  ||<   |	|
|||gS )zaOne dimensional smoothly broken power law derivative with respect
        to parameters.
        re   rf   rY   rg   )r$   r%   rj   rl   rm   rn   )r   r   rI   rJ   rK   ro   r   rr   rp   r&   rM   rN   rO   d_deltars   rt   ru   rv   s                     r   r)   z"SmoothlyBrokenPowerLaw1D.fit_derivC  s    [vbzzE! M"mB''M"%%	M"%%	M"%%	-##	95577 		CBqEwh//3Gg<MQV;V3WX aD qTI-KNQ4'>G3IaLQ4E6BF1II#56IaLQ4BF2a5MM>EBF1II4E#EFIaL17W#4!5q		!ABGAJI:5577 		CBqEwh//3Gg<MQV;V3WX aD qTI-KNQ4'>G3IaLQ4BF2a5MM>EBF1II4E#EFIaLQ4%<"&))3IaL17W#4!5q		!ABGAJF4LLI%5577 	tAwAqCAr!u'22QGg<MQV;V5WWAaDqTI-KN!7W#4"9C"?!"CCDwN aL Q4BF2a5MM>EBF1II4E#EFIaLQ4E6BF1II#56IaL!W$&6!99qC!G}u4rvbe}}DDF AJ Y	9gFFr!   c                 P    | j         j        d S | j        d         | j         j        iS r+   rQ   r/   s    r   r1   z$SmoothlyBrokenPowerLaw1D.input_units  rR   r!   c                 P    || j         d                  || j        d                  dS rT   r5   r7   s      r   r:   z8SmoothlyBrokenPowerLaw1D._parameter_units_for_data_units  rU   r!   N)r<   r=   r>   r?   r   r   rI   rJ   rK   ro   r`   
_validatorrb   r@   r    r)   rA   r1   r:   r   r!   r   r   r      s5       Z Zx 	q&At  I i}===Gi0TUUUGi/RSSSGIaV9OPPPEI I I 0IJ J J (E4 4 \4l <G <G \<G| 9 9 X9

 
 
 
 
r!   r   c                       e Zd 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dS )r   a  
    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   Peak value of modelr   r   r   zCutoff pointc                 P    | |z  }||| z  z  t          j        |  |z            z  S )z<One dimensional exponential cutoff power law model function.)r$   rn   )r   r   r   r   x_cutoffr   s         r   r    z$ExponentialCutoffPowerLaw1D.evaluate  s3     W25&>)BFA2=,A,AAAr!   c                     | |z  }| |z  }|| z  t          j        |           z  }||z  |z  |z  }| |z  t          j        |          z  }	|| z  |z  |dz  z  }
|||	|
gS )ze
        One dimensional exponential cutoff power law derivative with respect to parameters.
        rY   )r$   rn   r%   )r   r   r   r   r   r   xcr&   r'   r(   
d_x_cutoffs              r   r)   z%ExponentialCutoffPowerLaw1D.fit_deriv  s    
 W\eVnrvrc{{2	!K/#5*{*RVBZZ7][08Q;>
UGZ88r!   c                 P    | j         j        d S | j        d         | j         j        iS r+   r,   r/   s    r   r1   z'ExponentialCutoffPowerLaw1D.input_units  r2   r!   c                 t    || j         d                  || j         d                  || j        d                  dS )Nr   )r   r   r   r5   r7   s      r   r:   z;ExponentialCutoffPowerLaw1D._parameter_units_for_data_units  s;    t{1~.#DKN3%dl1o6
 
 	
r!   N)r<   r=   r>   r?   r   r   r   r   r   r@   r    r)   rA   r1   r:   r   r!   r   r   r     s         4 	!1FGGGI
)A+<
=
=
=CIa->???Ey???HB B \B
 9 9 \9 5 5 X5

 
 
 
 
r!   r   c                       e Zd 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dS )r   a  
    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   r}   r   r   r   r   zPower law curvaturec                 R    | |z  }| |t          j        |          z  z
  }|||z  z  S )z,One dimensional log parabola model function.r#   )r   r   r   r   betar   exponents          r   r    zLogParabola1D.evaluate  s5     W6D26"::--2x<''r!   c                     | |z  }t          j        |          }| ||z  z
  }||z  }| |z  |dz  z  }	||z  ||z  |z  ||z  z
  z  }
| |z  |z  }||
||	gS )zCOne dimensional log parabola derivative with respect to parameters.rY   r#   )r   r   r   r   r   r   log_xxr   r&   d_betar'   r(   s               r   r)   zLogParabola1D.fit_deriv  s     W6D6M)(lk)FAI5K'4&=3+>C+OP*{*V3UGV44r!   c                 P    | j         j        d S | j        d         | j         j        iS r+   r,   r/   s    r   r1   zLogParabola1D.input_units	  r2   r!   c                 P    || j         d                  || j        d                  dS r4   r5   r7   s      r   r:   z-LogParabola1D._parameter_units_for_data_units  r;   r!   N)r<   r=   r>   r?   r   r   r   r   r   r@   r    r)   rA   r1   r:   r   r!   r   r   r     s         : 	!1FGGGI
)A+<
=
=
=CIa->???E9Q,ABBBD( ( \( 
5 
5 \
5 5 5 X5

 
 
 
 
r!   r   c                       e Zd ZdZ edd          Z eddd          Z ed	d
          Zed             Z	d Z
d Zed             Zd ZdS )r   a@  
    Schechter luminosity function (`Schechter 1976
    <https://ui.adsabs.harvard.edu/abs/1976ApJ...203..297S/abstract>`_),
    parameterized in terms of magnitudes.

    Parameters
    ----------
    phi_star : float
        The normalization factor in units of number density.

    m_star : float
        The characteristic magnitude where the power-law form of the
        function cuts off.

    alpha : float
        The power law index, also known as the faint-end slope. Must not
        have units.

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

    Notes
    -----
    Model formula (with :math:`\phi^{*}` for ``phi_star``, :math:`M^{*}`
    for ``m_star``, and :math:`\alpha` for ``alpha``):

    .. math::

        n(M) \ dM = (0.4 \ln 10) \ \phi^{*} \
            [{10^{0.4 (M^{*} - M)}}]^{\alpha + 1} \
            \exp{[-10^{0.4 (M^{*} - M)}]} \ dM

    ``phi_star`` is the normalization factor in units of number density.
    ``m_star`` is the characteristic magnitude where the power-law form
    of the function cuts off into the exponential form. ``alpha`` is
    the power-law index, defining the faint-end slope of the luminosity
    function.

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

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

        phi_star = 4.3e-4 * (u.Mpc ** -3)
        m_star = -20.26
        alpha = -1.98
        model = Schechter1D(phi_star, m_star, alpha)
        mag = np.linspace(-25, -17)

        fig, ax = plt.subplots()
        ax.plot(mag, model(mag))
        ax.set_yscale('log')
        ax.set_xlim(-22.6, -17)
        ax.set_ylim(1.e-7, 1.e-2)
        ax.set_xlabel('$M_{UV}$')
        ax.set_ylabel('$\phi$ [mag$^{-1}$ Mpc$^{-3}]$')

    References
    ----------
    .. [1] Schechter 1976; ApJ 203, 297
           (https://ui.adsabs.harvard.edu/abs/1976ApJ...203..297S/abstract)

    .. [2] `Luminosity function <https://en.wikipedia.org/wiki/Luminosity_function_(astronomy)>`_
    rg   z/Normalization factor in units of number densityr   g      4zCharacteristic magnitudeT)r   r   r   g      zFaint-end slopec                     | |z
  }t          |t                    rT|j        t          k    r5t	          |j        t                    }|                    t                    S t          d          dd|z  z  S )N)rh   z5The units of magnitude and m_star must be a magnitude
   gٿ)	rk   r   rh   r   r   r_   tor   r   )	magnitudem_star
factor_exps      r   _factorzSchechter1D._factord  sz    '
j(++ 
	-#%%&z'7cBBB
!}}%;<<< K   $+,,r!   c                     |                      ||          }dt          j        d          z  |z  ||dz   z  z  t          j        |           z  S )z-Schechter luminosity function model function.皙?r   r   r   r$   r%   rn   )r0   r   phi_starr   r   factors         r   r    zSchechter1D.evaluatet  sJ    c6**RVBZZ(*V	-BBRVVG__TTr!   c                 X   |                      ||          }dt          j        d          z  ||dz   z  z  t          j        |           z  }||z  }|dz   dz  t          j        d          z  |z  dt          j        d          z  |z  |z  z
  }|t          j        |          z  }	|||	gS )z^
        Schechter luminosity function derivative with respect to
        parameters.
        r   r   r   r   )
r0   r   r   r   r   r   
d_phi_starfuncd_m_starr(   s
             r   r)   zSchechter1D.fit_derivz  s    
 c6**26"::%519(==wO
*$AI$rvbzz1D8"&**t#f,
 'Hg..r!   c                 P    | j         j        d S | j        d         | j         j        iS r+   )r   r-   r.   r/   s    r   r1   zSchechter1D.input_units  s(    ;!)4A 677r!   c                 P    || j         d                  || j        d                  dS )Nr   )r   r   r5   r7   s      r   r:   z+Schechter1D._parameter_units_for_data_units  s-    !$+a.1$T\!_5
 
 	
r!   N)r<   r=   r>   r?   r   r   r   r   r@   r   r    r)   rA   r1   r:   r   r!   r   r   r     s        E EN y!R  H Yu2LRVWWWFId0ABBBE- - \-U U U/ / /  8 8 X8

 
 
 
 
r!   r   )r?   numpyr$   astropy.unitsr   r   r   r   r   corer	   
parametersr
   r   __all__r   r   r   r   r   r   r   r!   r   <module>r      s        V V V V V V V V V V V V V V ! ! ! ! ! ! 6 6 6 6 6 6 6 6  8
 8
 8
 8
 8
 8
 8
 8
vF
 F
 F
 F
 F
 F
 F
 F
Rq
 q
 q
 q
 q
 q
 q
 q
h@
 @
 @
 @
 @
/ @
 @
 @
FA
 A
 A
 A
 A
O A
 A
 A
H~
 ~
 ~
 ~
 ~
/ ~
 ~
 ~
 ~
 ~
r!   