
    M/Ph                     H    d Z ddlZddlmZ ddlmZmZ  G d d          ZdS )zL
Created on Sun May 10 08:23:48 2015

Author: Josef Perktold
License: BSD-3
    N   )NonePenalty)approx_fprime_csapprox_fprimec                        e Zd ZdZ fdZddZd fd	Zd fd	ZddZd fd		Z	d fd
	Z
ddZd fd	Zd fd	Z xZS )PenalizedMixina  Mixin class for Maximum Penalized Likelihood

    Parameters
    ----------
    args and kwds for the model super class
    penal : None or instance of Penalized function class
        If penal is None, then NonePenalty is used.
    pen_weight : float or None
        factor for weighting the penalization term.
        If None, then pen_weight is set to nobs.


    TODO: missing **kwds or explicit keywords

    TODO: do we adjust the inherited docstrings?
    We would need templating to add the penalization parameters
    c                    |                     dd           | _        |                     dd           | _         t                      j        |i | | j        t          | j                  | _        | j        t                      | _        d| _        | j        	                    ddg           t          | dg           | _        | j        	                    ddg           d S )Npenal
pen_weightr   _null_drop_keys)popr
   r   super__init__lenendogr   
_init_keysextendgetattrr   )selfargskwds	__class__s      [/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/base/_penalized.pyr   zPenalizedMixin.__init__    s     XXgt,,
88L$77$'$'''
 ?"!$*ooDO:$DJDO6777&t->CC##Wl$;<<<<<    Nc                     |=t          | d          r+|                     |          }|                     |          }nd}|S )N	scaletyper   )hasattrpredictestimate_scale)r   paramsscaler   mus        r   _handle_scalezPenalizedMixin._handle_scale7   sI    =t[)) \\&))++B//r   c                     || j         } t                      j        |fi |}|dk    r4 | j        |fi |}|d|z  |z  | j                            |          z  z  }|S )z3
        Log-likelihood of model at params
        Nr   r   )r   r   logliker#   r
   func)r   r    r   r   llfr!   r   s         r   r%   zPenalizedMixin.loglikeC   s}     Jeggof----??&D&v6666E1U7Z'$*//&*A*AAAC
r   c                     || j         } t                      j        |fi |}t          |j        d                   }|dk    r7 | j        |fi |}|d|z  |z  |z  | j                            |          z  z  }|S )z@
        Log-likelihood of model observations at params
        Nr   r   )r   r   
loglikeobsfloatshaper#   r
   r&   )r   r    r   r   r'   nobs_llfr!   r   s          r   r)   zPenalizedMixin.loglikeobsQ   s     J egg 004001&&??&D&v6666E1U7Z'(2TZ__V5L5LLLC
r   fdc                       j          fd}|dk    rt          ||          S |dk    rt          ||d          S t          d          )z4score based on finite difference derivative
        Nc                 $     j         | fdiS Nr   r%   pr   r   r   s    r   <lambda>z.PenalizedMixin.score_numdiff.<locals>.<lambda>g        LDLJJzJTJJ r   csr-   T)centeredz-method not recognized, should be "fd" or "cs")r   r   r   
ValueError)r   r    r   methodr   r%   s   ` ` ` r   score_numdiffzPenalizedMixin.score_numdiffa   sn     JJJJJJJT>>#FG444t^^ 4@@@@LMMMr   c                     || j         } t                      j        |fi |}|dk    r4 | j        |fi |}|d|z  |z  | j                            |          z  z  }|S )z-
        Gradient of model at params
        Nr   r   )r   r   scorer#   r
   deriv)r   r    r   r   scr!   r   s         r   r<   zPenalizedMixin.scorep   s     JUWW]6**T**??&D&v6666E!E'J&)9)9&)A)AAAB	r   c                     || j         } t                      j        |fi |}t          |j        d                   }|dk    r7 | j        |fi |}|d|z  |z  |z  | j                            |          z  z  }|S )z:
        Gradient of model observations at params
        Nr   r   )r   r   	score_obsr*   r+   r#   r
   r=   )r   r    r   r   r>   nobs_scr!   r   s          r   r@   zPenalizedMixin.score_obs~   s     JUWWv....$$??&D&v6666E!E'J&0DJ4D4DV4L4LLLB	r   c                 L      j          fd}ddlm}  |||          S )z6hessian based on finite difference derivative
        Nc                 $     j         | fdiS r0   r1   r2   s    r   r4   z0PenalizedMixin.hessian_numdiff.<locals>.<lambda>   r5   r   r   )approx_hess)r   statsmodels.tools.numdiffrD   )r   r    r   r   r%   rD   s   ` ``  r   hessian_numdiffzPenalizedMixin.hessian_numdiff   sL     JJJJJJJ999999{67+++r   c                    || j         } t                      j        |fi |}|dk    rb | j        |fi |}| j                            |          }|j        dk    r!|d|z  t          j        ||z            z  z  }n|d|z  |z  |z  z  }|S )z,
        Hessian of model at params
        Nr   r   )	r   r   hessianr#   r
   deriv2ndimnpdiag)r   r    r   r   hessr!   hr   s          r   rH   zPenalizedMixin.hessian   s     Juwwv....??&D&v6666E
!!&))Av{{%"'*q."9"999%*,q00r   c                    ddl m} ddlm} t	          | ||f          r|                    ddi           |d}|d} t                      j        dd|i|}|du r|S |d	u rd
}t          j	        t          j
        |j                  |k               d         }t          j	        t          j
        |j                  |k              d         }|                                r | j        |fi |}	|	S |S )a  minimize negative penalized log-likelihood

        Parameters
        ----------
        method : None or str
            Method specifies the scipy optimizer as in nonlinear MLE models.
        trim : {bool, float}
            Default is False or None, which uses no trimming.
            If trim is True or a float, then small parameters are set to zero.
            If True, then a default threshold is used. If trim is a float, then
            it will be used as threshold.
            The default threshold is currently 1e-4, but it will change in
            future and become penalty function dependent.
        kwds : extra keyword arguments
            This keyword arguments are treated in the same way as in the
            fit method of the underlying model class.
            Specifically, additional optimizer keywords and cov_type related
            keywords can be added.
        r   )GLMGam)GLMmax_start_irlsNbfgsFr9   Tg-C6? )*statsmodels.gam.generalized_additive_modelrP   +statsmodels.genmod.generalized_linear_modelrQ   
isinstanceupdater   fitrK   nonzeroabsr    any
_fit_zeros)r   r9   trimr   rP   rQ   res
drop_index
keep_indexres_auxr   s             r   rY   zPenalizedMixin.fit   s+   2 	FEEEEECCCCCCdS&M** 	/KK)1-... >F<Deggk0004005==Jt|| BF3:$6$6$=>>qAJBF3:$6$6$=>>qAJ~~ )$/*====
r   )N)Nr-   )NN)__name__
__module____qualname____doc__r   r#   r%   r)   r:   r<   r@   rF   rH   rY   __classcell__)r   s   @r   r   r      s6        $= = = = =.
 
 
 
           N N N N          , , , ,     $9 9 9 9 9 9 9 9 9 9r   r   )	rf   numpyrK   
_penaltiesr   rE   r   r   r   rT   r   r   <module>rj      s         # # # # # # E E E E E E E EU U U U U U U U U Ur   