ó
áp7]c           @  sì  d  Z  d d l m Z d d l Z d d l m Z d d l m Z d e	 f d „  ƒ  YZ
 d e
 f d	 „  ƒ  YZ d
 e
 f d „  ƒ  YZ d „  Z d d „ Z d „  Z e d k rèd Z e j e ƒ Z e j j d e ƒ Z d d e j e ƒ d e j j e ƒ Z e j e ƒ Z e
 d e ƒ Z e e e j ƒ ƒ e j Z e e e ƒ ƒ e
 d e ƒ Z e e e j  e j! e j" e ƒ ƒ e j# ƒ ƒ e e e j$ e j# ƒ ƒ ƒ e d e ƒ Z% e e% j& d ƒ e e j& d ƒ e e e% ƒ n  d S(   s8  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
iÿÿÿÿ(   t   print_functionN(   t   linalg(   t   cache_readonlyt   PlainMatrixArrayc           B  sË   e  Z d  Z d 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 RS(   s³   Class that defines linalg operation on an array

    simplest version as benchmark

    linear algebra recipes for multivariate normal and linear
    regression calculations

    c         C  s£   | d  k	 rZ | d  k rK t j | ƒ |  _ t j |  j j |  j ƒ |  _ qŸ t d ƒ ‚ nE | d  k	 r“ t j | ƒ |  _ t j |  j j	 Œ  |  _ n t d ƒ ‚ d  S(   Ns!   data and sym cannot be both givens#   either data or sym need to be given(
   t   Nonet   npt   asarrayt   xt   dott   Tt   mt
   ValueErrort   eyet   shape(   t   selft   datat   sym(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   __init__)   s    !c         C  s   t  j j |  j ƒ S(   N(   R   R   t   invR
   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   minv7   s    c         C  s   t  j |  j | ƒ S(   N(   R   R   R
   (   R   t   y(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   m_y;   s    c         C  s   t  j |  j | ƒ S(   N(   R   R   R   (   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   minv_y>   s    c         C  s   t  j |  j ƒ S(   N(   R   t   pinvR
   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   mpinvA   s    c         C  s   t  j |  j ƒ S(   N(   R   R   R   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   xpinvE   s    c         C  s"   t  j | j t  j |  j | ƒ ƒ S(   N(   R   R   R	   R
   (   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   yt_m_yI   s    c         C  s"   t  j | j t  j |  j | ƒ ƒ S(   N(   R   R   R	   R   (   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt	   yt_minv_yL   s    c         C  s"   t  j | t  j |  j | j ƒ ƒ S(   N(   R   R   R
   R	   (   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   y_m_ytP   s    c         C  s"   t  j | t  j |  j | j ƒ ƒ S(   N(   R   R   R   R	   (   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt	   y_minv_ytS   s    c         C  s   t  j |  j ƒ S(   N(   R   t   detR
   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   mdetV   s    c         C  s   t  j t j |  j ƒ ƒ S(   N(   R   t   logR   R   R
   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   mlogdetZ   s    c         C  sR   t  j |  j ƒ \ } } t j | ƒ d  d  d … } | | | d  d  … | f f S(   Niÿÿÿÿ(   R   t   eighR
   R   t   argsort(   R   t   evalst   evecst   sortind(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   meigh^   s    c         C  s/   |  j  \ } } t j t j | d ƒ | j ƒ S(   Ng      à?(   R'   R   R   t   diagR	   (   R   R$   R%   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   mhalfd   s    c         C  s3   |  j  \ } } t j | d t j | ƒ | j ƒ S(   Ng      ð?(   R'   R   R   t   sqrtR	   (   R   R$   R%   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   minvhalfk   s    N(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   R   R   R   R   R   R   R   R!   R'   R)   R+   (    (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR       s    						t   SvdArrayc           B  s   e  Z d  Z d
 d
 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 RS(   s´   Class 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         C  s˜   t  t |  ƒ j d | d | ƒ t j j |  j d d ƒ\ } } } | | | |  _ |  _ |  _	 t j
 | t j Œ |  _ t j
 d | t j Œ |  _ d  S(   NR   R   t   full_matricesi   g      ð?(   t   superR/   R   R   R   t   svdR   t   ut   st   vt   diagsvdR   t   sdiagt   sinvdiag(   R   R   R   R3   R4   R5   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR   {   s
    $c         C  s"   t  j t j |  j | ƒ t j Œ S(   N(   R   R6   R   t   powerR4   R   R   (   R   t   p(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt	   _sdiagpowƒ   s    c         C  s+   t  j |  j |  j ƒ } t  j | j | ƒ S(   N(   R   R   R8   R5   R	   (   R   t   sinvv(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR   †   s    c         C  s#   |  j  j } |  j d } | | f S(   Ni   (   R5   R	   R4   (   R   R%   R$   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR'   ‹   s    c         C  s   |  j  d j ƒ  S(   Ni    (   R'   t   prod(   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR   ‘   s    c         C  s   t  j |  j d ƒ j ƒ  S(   Ni    (   R   R    R'   t   sum(   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR!   •   s    c         C  s   t  j t  j |  j ƒ |  j ƒ S(   N(   R   R   R(   R4   R5   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR)   ™   s    c         C  s   t  j |  j |  j ƒ S(   N(   R   R   R3   R7   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   xxthalf   s    c         C  s   t  j |  j |  j ƒ S(   N(   R   R   R3   R8   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt
   xxtinvhalf¡   s    N(   R,   R-   R.   R   R   R;   R   R   R'   R   R!   R)   R?   R@   (    (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR/   r   s   	t	   CholArrayc           B  s&   e  Z d  Z d d d „ Z d „  Z RS(   sÞ   Class 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         C  s#   t  t |  ƒ j d | d | ƒ d  S(   NR   R   (   R1   R/   R   (   R   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR   °   s    c         C  s(   t  j t t j t j |  j ƒ t ƒ ƒ S(   s;   xSigmainvx
        doesn't use stored cholesky yet
        (   R   R   R   R   t	   cho_solvet
   cho_factorR
   (   R   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyR   ´   s    N(   R,   R-   R.   R   R   R   (    (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyRA   ¦   s   c         C  sƒ  d d l  m } m } d } | |  j | j d | ƒt j |  j j d ƒ ƒ d  d  … d  f } t j | j j d ƒ ƒ d  d  … d  f } | | } | |  j | j | d | ƒ| |  j	 | j	 d | ƒ|  j
 \ } }	 | j
 \ }
 } | | |
 d | ƒt j |	 j d ƒ ƒ } t j | j d ƒ ƒ } | | } | |	 | | d | ƒ| |  j | j d d ƒ| |  j | j d d ƒd  S(	   Niÿÿÿÿ(   t   assert_almost_equalt   assert_approx_equali   t   decimali   i    t   significanti   (   t   numpy.testingRD   RE   R   R   t   signR)   R>   R   R+   R'   R   R!   (   t   m1t   m2RD   RE   RF   t   s1t   s2t   scorrt   evals1t   evecs1t   evals2t   evecs2(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   testcompare¿   s"    ++

gVçž¯Ò<c         C  s)   t  j |  j ƒ  ƒ | k  } d |  | <|  S(   s<   replace abs values smaller than eps by zero, makes copy
    i    (   R   t   abst   copy(   R   t   epst   mask(    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt	   tiny2zeroÝ   s    
c         C  s   t  j t  j |  ƒ ƒ S(   N(   R   t   maxRT   (   R   (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   maxabsä   s    t   __main__i   id   i   gš™™™™™é?g{®Gáz„?R   R   i    ('   R.   t
   __future__R    t   numpyR   t   scipyR   t   statsmodels.tools.decoratorsR   t   objectR   R/   RA   RS   RX   RZ   R,   t   nt   arangeR   t   randomt   randnR   t   autocovt   toeplitzt   sigmat   matt   printR)   R+   t   miht   mat2R   R   R	   R
   R   t   mat3R'   (    (    (    sJ   lib/python2.7/site-packages/statsmodels/sandbox/archive/linalg_decomp_1.pyt   <module>   s8   R4		+	/&