Ë
    ¢�Dj†  ã                   ó@   — 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      €ú_C:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\statsmodels/base/_penalized.pyr   zPenalizedMixin.__init__    s²   ø€ ð —X‘X˜g tÓ,ˆŒ
ØŸ8™8 L°$Ó7ˆŒä‰Ñ˜$Ð' $Ò'ð
 �?‰?Ð"Ü! $§*¡*›oˆDŒOà�:‰:Ðä$›ˆDŒJØˆDŒOà�‰×Ñ ¨Ð6Ô7Ü& tÐ->ÀÓCˆÔØ×Ñ×#Ñ# W¨lÐ$;Õ<ó    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ä‰g‰o˜fÑ-¨Ñ-ˆØ˜Š?Ø&�D×&Ñ& vÑ6°Ñ6ˆEØ�1�U‘7˜ZÑ'¨$¯*©*¯/©/¸&Ó*AÑAÑAˆCàˆ
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Ñ  Ñ0¨4Ñ0ˆÜ˜Ÿ™ 1™Ó&ˆà˜Š?Ø&�D×&Ñ& vÑ6°Ñ6ˆEØ�1�U‘7˜ZÑ'¨(Ñ2°T·Z±Z·_±_ÀVÓ5LÑLÑLˆCàˆ
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   ó   ø€ ˜L˜DŸL™L¨ÑJ°zÐJÀTÑ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Š>Ü# F¨GÓ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°Ñ6ˆEØ�!�E‘'˜JÑ&¨¯©×)9Ñ)9¸&Ó)AÑAÑAˆBàˆ	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°Ñ6ˆEØ�!�E‘'˜JÑ&¨Ñ0°D·J±J×4DÑ4DÀVÓ4LÑLÑLˆBàˆ	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Ù˜6 7Ó+Ð+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°Ñ6ˆEØ—
‘
×!Ñ! &Ó)ˆAØ�v‰v˜Š{Ø˜˜%™¤"§'¡'¨*°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ä�d˜S &˜MÔ*Ø�K‰KÐ)¨1Ð-Ô.ð ˆ>ØˆFàˆ<ØˆDä‰g‰kÑ0 Ð0¨4Ñ0ˆà�5‰=àˆJà�t‰|Ø�ô Ÿ™¤B§F¡F¨3¯:©:Ó$6¸Ñ$=Ó>¸qÑAˆJÜŸ™¤B§F¡F¨3¯:©:Ó$6¸Ñ$=Ó>¸qÑAˆJà�~‰~Ôà)˜$Ÿ/™/¨*Ñ=¸Ñ=�Ø�à�
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   