
    !g              
       T   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(  rfdZ ej                  e      Zej"                  j%                  de      Zdd ej                  e      z  z  dej"                  j%                  e      z  z   Z ej*                  e      Z ee      Z e eej2                               ej4                  Z e ee              ee      Z e eej;                   ej<                  ej>                  e            ej@                  z
                e eejC                  ej@                                      ee      Z" ee"jF                  d           eejF                  d           e
ee"       yy)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y)PlainMatrixArrayzClass that defines linalg operation on an array

    simplest version as benchmark

    linear algebra recipes for multivariate normal and linear
    regression calculations

    Nc                 n   |a|Tt        j                  |      | _        t        j                  | j                  j                  | j                        | _        y t        d      |Ft        j                  |      | _        t        j                  | j
                  j                   | _        y 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      h/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.py__init__zPlainMatrixArray.__init__(   s    {D)$&&1 !DEE_ZZ_DFVVTVV\\*DF BCC    c                 T    t         j                  j                  | j                        S N)r   r   invr   r   s    r   minvzPlainMatrixArray.minv6   s    yy}}TVV$$r   c                 B    t        j                  | j                  |      S r   )r   r   r   r   ys     r   m_yzPlainMatrixArray.m_y:   s    vvdffa  r   c                 B    t        j                  | j                  |      S r   )r   r   r   r   s     r   minv_yzPlainMatrixArray.minv_y=   s    vvdii##r   c                 @    t        j                  | j                        S r   )r   pinvr   r   s    r   mpinvzPlainMatrixArray.mpinv@       {{466""r   c                 @    t        j                  | j                        S r   )r   r#   r
   r   s    r   xpinvzPlainMatrixArray.xpinvD   r%   r   c                 ~    t        j                  |j                  t        j                  | j                  |            S r   )r   r   r   r   r   s     r   yt_m_yzPlainMatrixArray.yt_m_yH   s&    vvacc266$&&!,--r   c                 ~    t        j                  |j                  t        j                  | j                  |            S r   )r   r   r   r   r   s     r   	yt_minv_yzPlainMatrixArray.yt_minv_yK   s&    vvacc266$))Q/00r   c                 ~    t        j                  |t        j                  | j                  |j                              S r   )r   r   r   r   r   s     r   y_m_ytzPlainMatrixArray.y_m_ytO   s&    vva,--r   c                 ~    t        j                  |t        j                  | j                  |j                              S r   )r   r   r   r   r   s     r   	y_minv_ytzPlainMatrixArray.y_minv_ytR   s&    vva		133/00r   c                 @    t        j                  | j                        S r   )r   detr   r   s    r   mdetzPlainMatrixArray.mdetU   s    zz$&&!!r   c                 f    t        j                  t        j                  | j                              S r   )r   logr   r1   r   r   s    r   mlogdetzPlainMatrixArray.mlogdetY   s    vvfjj())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]   sG    {{466*u**U#DbD)W~uQwY///r   c                     | j                   \  }}t        j                  t        j                  |dz        |j                        S )Ng      ?)r=   r   r   diagr   r   r:   r;   s      r   mhalfzPlainMatrixArray.mhalfc   s1    zzuvvbggeSj)57733r   c                     | j                   \  }}t        j                  |dt        j                  |      z  |j                  z        S )N      ?)r=   r   r   sqrtr   r@   s      r   minvhalfzPlainMatrixArray.minvhalfj   s6    zzuvveR.8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      s    D % %!$ # # # #.1.1 " " * * 0 0
 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
    c                 \   t         |   ||       t        j                  j	                  | j
                  d      \  }}}|||c| _        | _        | _        t        j                  |gt
        j                   | _        t        j                  d|z  gt
        j                   | _        y )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1a!"Aq^^A00
r!t6agg6r   c                     t        j                  t        j                  | j                  |      gt
        j                   S r   )r   rW   r   powerrU   r
   r   )r   ps     r   	_sdiagpowzSvdArray._sdiagpow   s)    ~~bhhtvvq1<AGG<<r   c                     t        j                  | j                  | j                        }t        j                  |j                  |      S r   )r   r   rY   rV   r   )r   sinvvs     r   r   zSvdArray.minv   s/    t}}dff-vveggu%%r   c                 T    | 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   j                         S Nr   )r=   prodr   s    r   r2   zSvdArray.mdet   s    zz!}!!##r   c                 b    t        j                  | j                  d         j                         S rd   )r   r4   r=   sumr   s    r   r5   zSvdArray.mlogdet   s"    vvdjjm$((**r   c                 |    t        j                  t        j                  | j                        | j                        S r   )r   r   r?   rU   rV   r   s    r   rA   zSvdArray.mhalf   s#    vvbggdffotvv..r   c                 V    t        j                  | j                  | j                        S r   )r   r   rT   rX   r   s    r   xxthalfzSvdArray.xxthalf   s    vvdffdjj))r   c                 V    t        j                  | j                  | j                        S r   )r   r   rT   rY   r   s    r   
xxtinvhalfzSvdArray.xxtinvhalf   s    vvdffdmm,,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= & &  
 $ $ + + / / * * - -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
    c                 0    t         t        |   ||       y )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   s1     vva(():):466)B1EFFr   rF   )rG   rH   rI   rJ   r   r+   rm   rn   s   @r   rp   rp      s    ;Gr   rp   c                 :   ddl m}m} d} || j                  |j                  |       t	        j
                  | j                  j                  d            d d d f   }t	        j
                  |j                  j                  d            d d d f   }||z  } || j                  |j                  |z  |        || j                  |j                  |       | j                  \  }}	|j                  \  }
} |||
|       t	        j
                  |	j                  d            }t	        j
                  |j                  d            }||z  } ||	||z  |        || j                  |j                  d        || j                  |j                  d       y )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      s5   FG ': 
a	!!D&	)B	a	!!D&	)BrEE"((U"2GDR[['B XXNFFXXNFF8	A	B	A	BrEE@ b9

BJJB?r   c                 \    t        j                  | 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+     66!&&(s"DAdGHr   c                 R    t        j                  t        j                  |             S r   )r   maxr   )r
   s    r   maxabsr      s    66"&&)r   __main__   d   rb   g?g{Gz?)r   )r   )gV瞯<)$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N: N:d1- 1-hG  G2@< z 	
A		!A
		AAYRYYq\!!4"))//!*<#<<GFOOG$E
u
%C	)CII

,,C	)C.#D	&qssA/$&&8
9:	)DKK'
()D	$**Q-	$**Q-d$1 r   