ó
r™xTc           @   s¨  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l m Z m Z y d  d l	 Z	 Wn e
 k
 rs d Z	 n Xd  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z d „  Z d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z e d k r¤d e j d k Z d e j d k Z  d e j d k Z! d e j d k rŽe d e d e  d e! ƒ q¤e d e d e  ƒ n  d S(   iÿÿÿÿ(   t   divisionN(   t   matrix_equality_ratiot   matrix_normality_ratio(   t   approx_equal(   t   flexc          C   s�  t  j t d d ƒ ƒ }  d d d g } |  j t  j d d ƒ ƒ t j j j |  j	 ƒ  d t
 d	 t
 ƒ} t | j | ƒ s t ‚ | j ƒ  } t |  | ƒ d
 k  s¦ t ‚ t | j ƒ d
 k  sÁ t ‚ t | j ƒ d
 k  sÜ t ‚ t j j j |  j	 ƒ  d t d	 t ƒ} t | j | ƒ st ‚ | j r/| j s5t ‚ y | j ƒ  t ‚ Wn t k
 r\n X|  j ƒ  }  t j j j |  j	 ƒ  d t
 d	 t
 ƒ} t | j | ƒ s¨t ‚ | j ƒ  } t |  | ƒ d
 k  sÏt ‚ t | j ƒ d
 k  sêt ‚ t | j ƒ d
 k  st ‚ t  j t d d ƒ ƒ }  d d d g } |  j t  j d d ƒ ƒ t j j j |  j	 ƒ  d t
 d	 t
 ƒ} t | j | ƒ s„t ‚ | j ƒ  } t |  | ƒ d
 k  s«t ‚ t | j ƒ d
 k  sÆt ‚ t | j ƒ d
 k  sát ‚ |  j ƒ  }  t j j j |  j	 ƒ  d t
 d	 t
 ƒ} t | j | ƒ s,t ‚ | j ƒ  } t |  | ƒ d
 k  sSt ‚ t | j ƒ d
 k  snt ‚ t | j ƒ d
 k  s‰t ‚ d  S(   Ni   i   g*öý€òF@gQšP4T@ú?i    i   i   t   accumulate_ut   accumulate_vi
   i   gm†ÇuÔo9@g#¬,ÜÑ�û?i   (   R   t   doublet   xranget   resizet   gridt   scitbxt   linalgt   svdt   realt	   deep_copyt   TrueR   t   sigmat   AssertionErrort   reconstructR   R   t   ut   vt   Falset   Exception_expectedt   matrix_transposet   reshape(   t   aR   R   t   a1(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   exercise_svd_basic   sj    	

			t	   test_casec           B   sS   e  Z d  Z e Z e Z e Z e j	 j
 j Z d „  Z d „  Z d „  Z d „  Z RS(   i   c         K   sX   t  j |  | ƒ |  j o" t d  k	 |  _ |  j rD t |  _ |  _ n t |  _ |  _ d  S(   N(	   t   libtbxt   adopt_optional_init_argst   exercise_tntbxt   tntbxt   NoneR   R   R   R   (   t   selft   kwds(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   __init__R   s
    	c         c   s­   x¦ d D]ž } x• d D]� } |  j  r< t j ƒ  d k  r< q n  t | | ƒ } t j j | | ƒ } x= t |  j ƒ D], } |  j | | ƒ } | | j	 | ƒ f Vqq Wq Wq Wd  S(    Ni   gš™™™™™ñ?g333333ó?gÍÌÌÌÌÌô?gffffffö?g      ø?gš™™™™™ù?g333333û?gÍÌÌÌÌÌü?gffffffþ?i   i   i   i   i   i   i   i	   i
   i   i   i(   i2   i<   iF   iP   iZ   id   gÍÌÌÌÌÌì?(   i   gš™™™™™ñ?g333333ó?gÍÌÌÌÌÌô?gffffffö?g      ø?gš™™™™™ù?g333333û?gÍÌÌÌÌÌü?gffffffþ?i   i   i   i   i   i   i   i	   i
   i   i   i(   i2   i<   iF   iP   iZ   id   (
   i
   i   i   i(   i2   i<   iF   iP   iZ   id   (
   t   full_coveraget   randomt   intR   R   t   random_normal_matrix_generatorR   t   n_matrices_per_dimensionR   t   matrix_with_singular_values(   R#   t   kt   nt   mt   gent   pR   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   matricesZ   s     
 c         C   sÖ  d Gd } x¯|  j  ƒ  D]¡\ } } | j ƒ  \ } } |  j rb | sH Hn  | | f Gt j j ƒ  n  t j j j	 | |  j
 |  j ƒ } |  j r  d Gt j j ƒ  n  | j t j | d t ƒƒ } | j | j ƒ  | j ƒ  t | | ƒ |  j } | d k  st ‚ | d 7} |  j s'|  j r Hq q n  t j | ƒ } |  j rTd GHt j j ƒ  n  | j t j | d t ƒƒ } | j ƒ  | j ƒ  | j ƒ  t | | ƒ |  j } | d k  s t ‚ q W|  j rÉHn  d | GHd  S(   Ns   Scaling with m and m/n: i    t   !t   reversei
   i   s   %i done(   R1   t   focust   show_progresst   syst   stdoutt   flushR   R   R   R   R   R   t   selectR   t   sort_permutationR   R   t   normt   mint   epsR   R    R!   t   svd_m_ge_n_doublet   singular_values(   R#   t   n_testsR   R   R.   R-   R   t   delta(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   exercise_increasing_dimensionsf   s>    	 
!	1
		 	4	 c         C   sc  d d l  m } g  |  _ g  |  _ | t j j j d d d d d d  ƒ} t	 d  k	 ry | d „  d d	 d d
 d d  ƒ} n  xH|  j
 ƒ  D]:\ } } | j ƒ  \ } } |  j rÇ | | f Gt j j ƒ  n  t d | | d d | d d | | d | d ƒ } t t d | ƒ d ƒ }	 t	 rr|	 | _ t j j ƒ  | j | ƒ }
 |  j rVd Gn  |  j j | | |
 f ƒ n  |	 | _ | j | d t d t ƒ}
 |  j r§d GHn  |  j j | | |
 f ƒ q† Wd GHd j g  |  j D]" \ } } }
 d | | |
 f ^ qÙƒ GHd GHt	 r_d GHd GHd GHd j g  |  j D]" \ } } }
 d | | |
 f ^ q-ƒ GHd GHn  d  S(   Niÿÿÿÿ(   t   easy_profilet	   file_names   svd.pyt	   func_nameR%   t   linec         S   s   t  j |  ƒ S(   N(   R!   R>   (   R.   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   <lambda>Ž   s    s
   tst_svd.pys   <lambda>i   i   g     ˆÃ@i   R2   R   R   s
   scitbx = {s   , s   {%i, %i, %f}s   };s5   (***************************************************)s	   tntbx = {(   t   libtbx.easy_profileRC   t   scitbx_reportt   tntbx_reportR   R   R   R   R"   R!   R1   R4   R5   R6   R7   R8   R<   t   maxR(   t   runst   timet   appendR   t   join(   R#   RC   t   prof_scitbxt
   prof_tntbxR   R   R.   R-   t   flopsRL   t   t(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyRM   †   sP    				
;					1	1(   t   __name__t
   __module__R*   R   R&   R   R5   R    R   t   matht   double_numeric_limitst   epsilonR=   R%   R1   RB   RM   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyR   J   s   			 t,   chunks_of_small_and_big_singular_values_casec           B   s   e  Z d  Z d Z d „  Z RS(   s9    Top left half of singular values small, lower right big gšd~ÅQJc         C   sa   t  | | ƒ } t j | | d d d |  j ƒ} | j t j | d d |  j ƒ|  j ƒ | S(   Ni   t   factori   (   R<   R   t   random_doublet   bigt   extend(   R#   R.   R-   R0   R   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyR   ¶   s    $*(   RT   RU   t   __doc__R\   R   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyRY   ±   s   c         C   s±  d } d | } d } d t  j j j } t  j j | | ƒ } g  } | j t j g  t	 | ƒ D] } d | | ^ q] ƒ ƒ | j | d j
 t j | ƒ ƒ ƒ | j | d j ƒ  ƒ d Gd }	 xá t	 | ƒ D]Ó } | rò t j ƒ  d k  rò qÍ n  |	 d 7}	 x¡ t | ƒ D]“ \ }
 } | j | ƒ } t  j j j | d	 t d
 t ƒ} |
 d k rr| j
 t j | d t ƒƒ } n  | j | | | } | j d ƒ s	t ‚ q	WqÍ Wd |	 GHd  S(   Ni(   i   i   i
   i    s$   Densely distributed singular values:gš™™™™™é?i   R   R   R3   i   s   %i done.(   R   RV   RW   RX   R   R)   RN   R   R   R   R9   t   random_permutationt   reversedR'   t	   enumerateR+   R   R   R   R:   R   R   t   all_ltR   (   R5   R&   R-   R.   t   n_runst   tolR/   t   sigmast   iR@   t   i_caseR   R   R   RA   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt,   exercise_densely_distributed_singular_values½   s0    
8# 
! c          C   sB  d }  d |  } d t  j j j } g  t |  d ƒ D] } t j | ƒ ^ q4 } | j | |  d | |  d ƒ | j | |  d | |  d ƒ t j	 | ƒ t j
 ƒ  } x | D] } | j | ƒ q± W| j t j |  | ƒ ƒ | j ƒ  } t  j j j | j ƒ  d t d t ƒ} | j | j d	 | ƒ |  d k s>t ‚ d  S(
   Ni   i   i
   i   i   i   R   R   i    (   R   RV   RW   RX   R   R   R[   RN   R'   t   shuffleR   R]   R   R
   R   R   R   R   R   R   t   numerical_rankR   R   (   R-   R.   Rd   Rf   t   rowsR   t   rR   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   exercise_singular_matrixÕ   s    
,!! c    	      C   s&  t  j t  j d d ƒ d ƒ }  d |  d <d |  d <d |  d <d |  d <t j j j |  ƒ \ } } t | d d d d	 ƒs€ t ‚ t | d d
 d d	 ƒsŸ t ‚ t | d d d d	 ƒs¾ t ‚ t | d d d d	 ƒsÝ t ‚ |  j	 | ƒ } x3t
 d ƒ D]%} d } t  j t  j | | ƒ d ƒ }  xZ t
 | ƒ D]L } xC t
 | | ƒ D]2 } t j ƒ  } | |  | | f <| |  | | f <qFWq0Wt j j j |  j ƒ  d	 ƒ \ } } |  j	 | ƒ } xh t
 | ƒ D]Z } xQ t
 | ƒ D]C } d } | | k rôd
 } n  t | | | f | d ƒ sÓt ‚ qÓWqÀWqù Wd  S(   Ni   g        i   i    i   i   g       ÀR=   g�íµ ÷Æ°>g      ð?g      ø?g      à¿i
   i   gü©ñÒMbP?(   i    i    (   i    i   (   i   i    (   i   i   (   i    i    (   i    i   (   i   i    (   i   i   (   R   R   R
   R   R   R   t   inverse_via_svdR   R   t   matrix_multiplyt   rangeR'   R   (	   R   t   resultR   t   uut   iiR-   t   aat   bbt   tmp(    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   exercise_inverseå   s6    



$ 	c         C   s_   t  ƒ  t ƒ  t ƒ  t d |  d | ƒ t d |  d | d | ƒ } | j ƒ  t j j ƒ  GHd  S(   NR5   R&   R    (	   Rw   R   Rm   Rh   RY   RB   R   t   utilst   format_cpu_times(   R5   R    R&   RS   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   run  s    	
c         C   s#   t  d |  d | ƒ } | j ƒ  d  S(   NR5   R    (   RY   RM   (   R5   R    RS   (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyRM     s    	t   __main__s   --show-progressi   s   --exercise-tntbxs   --full-coverages   --timeR5   R    R&   ("   t
   __future__R    RV   t   scitbx.mathR   t   scitbx.linalg.svdt   scitbx.linalgR   R   R!   t   ImportErrorR"   t   libtbx.utilsR   R6   R'   t   libtbx.test_utilsR   t   scitbx.array_familyR   R   t   objectR   RY   Rh   Rm   Rw   Rz   RM   RT   t   argvR5   R    R&   (    (    (    sI   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/linalg/tests/tst_svd.pyt   <module>   s:     
	;g			'		
