
    !g                     @    d Z ddlZddlmZ ddlmZmZ  G d d      Zy)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                    |j                  dd       | _        |j                  dd       | _        t        |   |i | | j                  t        | j                        | _        | j                  t               | _        d| _        | j                  j                  ddg       t        | dg       | _        | j                  j                  ddg       y )Npenal
pen_weightr   _null_drop_keys)popr
   r   super__init__lenendogr   
_init_keysextendgetattrr   )selfargskwds	__class__s      X/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/base/_penalized.pyr   zPenalizedMixin.__init__    s     XXgt,
88L$7$'$'
 ??"!$**oDO::$DJDO67&t->C##Wl$;<    c                 n    |2t        | d      r$| j                  |      }| j                  |      }|S d}|S )N	scaletyper   )hasattrpredictestimate_scale)r   paramsscaler   mus        r   _handle_scalezPenalizedMixin._handle_scale7   sB    =t[)\\&)++B/  r   c                     || j                   }t        |   |fi |}|dk7  r: | j                  |fi |}|d|z  |z  | j                  j                  |      z  z  }|S )z3
        Log-likelihood of model at params
        r   r   )r   r   logliker#   r
   func)r   r    r   r   llfr!   r   s         r   r%   zPenalizedMixin.loglikeC   so     Jgof--?&D&&v66E1U7Z'$**//&*AAAC
r   c                     || j                   }t        |   |fi |}t        |j                  d         }|dk7  r= | j
                  |fi |}|d|z  |z  |z  | j                  j                  |      z  z  }|S )z@
        Log-likelihood of model observations at params
        r   r   )r   r   
loglikeobsfloatshaper#   r
   r&   )r   r    r   r   r'   nobs_llfr!   r   s          r   r)   zPenalizedMixin.loglikeobsQ   s     Jg 0401&?&D&&v66E1U7Z'(2TZZ__V5LLLC
r   c                       j                    fd}|dk(  rt        ||      S |dk(  rt        ||d      S t        d      )z4score based on finite difference derivative
        c                 .     j                   | fdiS Nr   r%   pr   r   r   s    r   <lambda>z.PenalizedMixin.score_numdiff.<locals>.<lambda>g       LDLLJzJTJ r   csfdT)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   sO     JJT>#FG44t^ 4@@LMMr   c                     || j                   }t        |   |fi |}|dk7  r: | j                  |fi |}|d|z  |z  | j                  j                  |      z  z  }|S )z-
        Gradient of model at params
        r   r   )r   r   scorer#   r
   deriv)r   r    r   r   scr!   r   s         r   r<   zPenalizedMixin.scorep   sq     JW]6*T*?&D&&v66E!E'J&)9)9&)AAAB	r   c                     || j                   }t        |   |fi |}t        |j                  d         }|dk7  r= | j
                  |fi |}|d|z  |z  |z  | j                  j                  |      z  z  }|S )z:
        Gradient of model observations at params
        r   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Wv..$?&D&&v66E!E'J&0DJJ4D4DV4LLLB	r   c                 P      j                    fd}ddlm}  |||      S )z6hessian based on finite difference derivative
        c                 .     j                   | fdiS r/   r0   r1   s    r   r3   z0PenalizedMixin.hessian_numdiff.<locals>.<lambda>   r4   r   r   )approx_hess)r   statsmodels.tools.numdiffrD   )r   r    r   r   r%   rD   s   ` ``  r   hessian_numdiffzPenalizedMixin.hessian_numdiff   s)     JJ967++r   c                 *   || j                   }t        |   |fi |}|dk7  rn | j                  |fi |}| j                  j                  |      }|j                  dk(  r#|d|z  t        j                  ||z        z  z  }|S |d|z  |z  |z  z  }|S )z,
        Hessian of model at params
        r   r   )	r   r   hessianr#   r
   deriv2ndimnpdiag)r   r    r   r   hessr!   hr   s          r   rH   zPenalizedMixin.hessian   s     Jwv..?&D&&v66E

!!&)Avv{%"''*q."999  %*,q00r   c                    ddl m} ddlm} t	        | ||f      r|j                  ddi       |d}|d}t        
|   d
d|i|}|du r|S |du rd	}t        j                  t        j                  |j                        |k        d   }t        j                  t        j                  |j                        |kD        d   }|j                         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_irls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CdS&M*KK)1-. >F<Dgk00405=Jt| BFF3::$6$=>qAJBFF3::$6$=>qAJ~~)$//*==
r   )N)Nr6   )NN)__name__
__module____qualname____doc__r   r#   r%   r)   r:   r<   r@   rF   rH   rY   __classcell__)r   s   @r   r   r      s@    $=.
 N,$9 9r   r   )	rf   numpyrK   
_penaltiesr   rE   r   r   r   rT   r   r   <module>rj      s!     # EU Ur   