
    M/Ph              
          d Z ddlZddlmZ ddlmZ  G d d          Z G d de          Z G d	 d
e          Z	d Z
ddZd Zedk    rrdZ ej        e          Zej                            de          Zdd ej        e          z  z  dej                            e          z  z   Z ej        e          Z ee          Z e eej                             ej        Z e ee                      ee          Z e ee                     ej        ej        e                    ej         z
                        e ee!                    ej                                         ee          Z" ee"j#        d                     eej#        d                     e
ee"           dS dS )a8  Recipes for more efficient work with linalg using classes


intended for use for multivariate normal and linear regression
calculations

x  is the data (nobs, nvars)
m  is the moment matrix (x'x) or a covariance matrix Sigma

examples:
x'sigma^{-1}x
z = Px  where P=Sigma^{-1/2}  or P=Sigma^{1/2}

Initially assume positive definite, then add spectral cutoff and
regularization of moment matrix, and extend to PCA

maybe extend to sparse if some examples work out
(transformation matrix P for random effect and for toeplitz)


Author: josef-pktd
Created on 2010-10-20
    N)linalg)cache_readonlyc                       e Zd ZdZddZed             Zd Zd Zed             Z	ed             Z
d	 Zd
 Zd Zd Zed             Zed             Zed             Zed             Zed             ZdS )PlainMatrixArrayzClass that defines linalg operation on an array

    simplest version as benchmark

    linear algebra recipes for multivariate normal and linear
    regression calculations

    Nc                 B   |U|Dt          j        |          | _        t          j        | j        j        | j                  | _        d S t          d          |8t          j        |          | _        t          j        | j        j         | _        d S t          d          )Nz!data and sym cannot be both givenz#either data or sym need to be given)	npasarrayxdotTm
ValueErroreyeshape)selfdatasyms      k/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.py__init__zPlainMatrixArray.__init__(   s    {D))$&11 !DEEE_Z__DFVTV\*DFFF BCCC    c                 J    t           j                            | j                  S N)r   r   invr   r   s    r   minvzPlainMatrixArray.minv6   s    y}}TV$$$r   c                 6    t          j        | j        |          S r   )r   r   r   r   ys     r   m_yzPlainMatrixArray.m_y:   s    vdfa   r   c                 6    t          j        | j        |          S r   )r   r   r   r   s     r   minv_yzPlainMatrixArray.minv_y=   s    vdi###r   c                 4    t          j        | j                  S r   )r   pinvr   r   s    r   mpinvzPlainMatrixArray.mpinv@       {46"""r   c                 4    t          j        | j                  S r   )r   r#   r
   r   s    r   xpinvzPlainMatrixArray.xpinvD   r%   r   c                 f    t          j        |j        t          j        | j        |                    S r   )r   r   r   r   r   s     r   yt_m_yzPlainMatrixArray.yt_m_yH   s$    vac26$&!,,---r   c                 f    t          j        |j        t          j        | j        |                    S r   )r   r   r   r   r   s     r   	yt_minv_yzPlainMatrixArray.yt_minv_yK   s$    vac26$)Q//000r   c                 f    t          j        |t          j        | j        |j                            S r   )r   r   r   r   r   s     r   y_m_ytzPlainMatrixArray.y_m_ytO   s$    va,,---r   c                 f    t          j        |t          j        | j        |j                            S r   )r   r   r   r   r   s     r   	y_minv_ytzPlainMatrixArray.y_minv_ytR   s$    va	13//000r   c                 4    t          j        | j                  S r   )r   detr   r   s    r   mdetzPlainMatrixArray.mdetU   s    z$&!!!r   c                 X    t          j        t          j        | j                            S r   )r   logr   r1   r   r   s    r   mlogdetzPlainMatrixArray.mlogdetY   s    vfj(()))r   c                     t          j        | j                  \  }}t          j        |          d d d         }||         |d d |f         fS )N)r   eighr   r   argsort)r   evalsevecssortinds       r   meighzPlainMatrixArray.meigh]   sM    {46**u*U##DDbD)W~uQQQwY///r   c                 t    | j         \  }}t          j        t          j        |dz            |j                  S )Ng      ?)r=   r   r   diagr   r   r:   r;   s      r   mhalfzPlainMatrixArray.mhalfc   s/    zuvbgeSj))57333r   c                 z    | j         \  }}t          j        |dt          j        |          z  |j        z            S )N      ?)r=   r   r   sqrtr   r@   s      r   minvhalfzPlainMatrixArray.minvhalfj   s3    zuveR.8999r   NN)__name__
__module____qualname____doc__r   r   r   r   r!   r$   r'   r)   r+   r-   r/   r2   r5   r=   rA   rE    r   r   r   r      sh        D D D D % % ^%! ! !$ $ $ # # ^# # # ^#. . .1 1 1. . .1 1 1 " " ^" * * ^* 0 0 ^0
 4 4 ^4 : : ^: : :r   r   c                        e Zd ZdZd fd	Zd Zed             Zed             Zed             Z	ed             Z
ed	             Zed
             Zed             Z xZS )SvdArrayzClass that defines linalg operation on an array

    svd version, where svd is taken on original data array, if
    or when it matters

    no spectral cutoff in first version
    Nc                 X   t                                          ||           t          j                            | j        d          \  }}}|||c| _        | _        | _        t          j	        |gt
          j
        R  | _        t          j	        d|z  gt
          j
        R  | _        d S )Nr   r      )full_matricesrC   )superr   r   r   svdr
   usvdiagsvdr   sdiagsinvdiag)r   r   r   rT   rU   rV   	__class__s         r   r   zSvdArray.__init__z   s    d,,,)--a-881a!"Aq^A0000
r!t6ag666r   c                 j    t          j        t          j        | j        |          gt
          j        R  S r   )r   rW   r   powerrU   r
   r   )r   ps     r   	_sdiagpowzSvdArray._sdiagpow   s*    ~bhtvq11<AG<<<<r   c                 t    t          j        | j        | j                  }t          j        |j        |          S r   )r   r   rY   rV   r   )r   sinvvs     r   r   zSvdArray.minv   s+    t}df--vegu%%%r   c                 6    | j         j        }| j        dz  }||fS )N   )rV   r   rU   )r   r;   r:   s      r   r=   zSvdArray.meigh   s     	e|r   c                 @    | j         d                                         S Nr   )r=   prodr   s    r   r2   zSvdArray.mdet   s    z!}!!###r   c                 d    t          j        | j        d                                                   S rd   )r   r4   r=   sumr   s    r   r5   zSvdArray.mlogdet   s$    vdjm$$((***r   c                 d    t          j        t          j        | j                  | j                  S r   )r   r   r?   rU   rV   r   s    r   rA   zSvdArray.mhalf   s     vbgdfootv...r   c                 @    t          j        | j        | j                  S r   )r   r   rT   rX   r   s    r   xxthalfzSvdArray.xxthalf   s    vdfdj)))r   c                 @    t          j        | j        | j                  S r   )r   r   rT   rY   r   s    r   
xxtinvhalfzSvdArray.xxtinvhalf   s    vdfdm,,,r   rF   )rG   rH   rI   rJ   r   r^   r   r   r=   r2   r5   rA   rj   rl   __classcell__rZ   s   @r   rM   rM   q   s        7 7 7 7 7 7= = = & & ^&   ^
 $ $ ^$ + + ^+ / / ^/ * * ^* - - ^- - - - -r   rM   c                   *     e Zd ZdZd fd	Zd Z xZS )	CholArrayzClass that defines linalg operation on an array

    cholesky version, where svd is taken on original data array, if
    or when it matters

    plan: use cholesky factor and cholesky solve
    nothing implemented yet
    Nc                 \    t          t          |                               ||           d S )NrO   )rR   rM   r   )r   r   r   rZ   s      r   r   zCholArray.__init__   s,    h&&Dc&:::::r   c                     t          j        t          t          j        t          j        | j                  t                              S )z<xSigmainvx
        does not use stored cholesky yet
        )r   r   r
   r   	cho_solve
cho_factorr   r   s     r   r+   zCholArray.yt_minv_y   s0     va():46)B)B1EEFFFr   rF   )rG   rH   rI   rJ   r   r+   rm   rn   s   @r   rp   rp      s]         ; ; ; ; ; ;G G G G G G Gr   rp   c                    ddl m}m} d} || j        |j        |           t	          j        | j                            d                    d d d f         }t	          j        |j                            d                    d d d f         }||z  } || j        |j        |z  |            || j        |j        |           | j	        \  }}	|j	        \  }
} |||
|           t	          j        |	                    d                    }t	          j        |                    d                    }||z  } ||	||z  |            || j
        |j
        d            || j        |j        d           d S )Nr   )assert_almost_equalassert_approx_equal   )decimalrP      )significant)numpy.testingrv   rw   r   r   signrA   rg   rE   r=   r2   r5   )m1m2rv   rw   ry   s1s2scorrevals1evecs1evals2evecs2s               r   testcomparer      s   FFFFFFFFG ':::: 
a	!	!!!!D&	)B	a	!	!!!!D&	)BrEE"(U"2GDDDDR['BBBB XNFFXNFF8888	A		B	A		BrEE@@@@ b9999
BJB??????r   V瞯<c                 d    t          j        |                                           |k     }d| |<   | S )z<replace abs values smaller than eps by zero, makes copy
    r   )r   abscopy)r
   epsmasks      r   	tiny2zeror      s.     6!&&((s"DAdGHr   c                 N    t          j        t          j        |                     S r   )r   maxr   )r
   s    r   maxabsr      s    6"&))r   __main__   d   rb   g?g{Gz?)r   )r   )r   )$rJ   numpyr   scipyr   statsmodels.tools.decoratorsr   r   rM   rp   r   r   r   rG   naranger   randomrandnr
   autocovtoeplitzsigmamatprintrA   rE   mihmat2r+   r   r   r   r!   mat3r=   rK   r   r   <module>r      s   0           7 7 7 7 7 7N: N: N: N: N: N: N: N:d1- 1- 1- 1- 1- 1- 1- 1-hG G G G G  G G G2@ @ @<      z 	
A	!A
	AAYRYq\\!!4")//!*<*<#<<GFOG$$E

u
%
%
%C	E))CI


,C	E))C..###D	E&&qsA//$&8
9
9:::	E))DKK''
(
()))8D	E$*Q-	E$*Q-Kd$ $1 r   