ó
\™xTc           @   s:   d  d l  m Z d  d l m Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   division(   t   slots_getstate_setstatet   computec           B   s#   e  Z d  d d g Z d d „ Z RS(   t   centert   radiit   rotationg{®Gáz„?c         C   s€  d } | j  ƒ  } | d k s$ t ‚ d d l m } | j ƒ  } | j | j | d ƒ ƒ | j ƒ  } | j ƒ  } | j	 | j d | ƒ d ƒ | j
 | d | ƒ } | j
 | j | | ƒ d ƒ }	 | d }
 xË |
 | k r˜|	 j | ƒ | j |	 ƒ j | ƒ j ƒ  } | j | ƒ j | ƒ j ƒ  } | j | ƒ } | | } | | d | d | d } d | | } | | c | 7<| j | | ƒ d }
 | } qÎ W| j | ƒ } |	 j | ƒ | j |	 ƒ j | ƒ } | j | ƒ } | | j ƒ  | } d d l } | j j j | d	 t d
 t ƒ} d | j | j ƒ } d d l m } | j | ƒ |  _ | j | ƒ |  _  | j! | j" ƒ |  _# d S(   s£  Computation of Minimum-Volume Covering Ellipsoid using the Khachiyan Algorithm.
Based on a Python implementation by Raj Rajashankar (ANL, Nov 2011),
which in turn was based on a Matlab script by Nima Moshtagh (2009,
http://stackoverflow.com/questions/1768197/bounding-ellipse/1768440#1768440).

Caveats:
  - center and radii are correct, but rotation may permute axes
  - scales with the square of the number of points
i   i    iÿÿÿÿ(   t   flexi   i   g      à?Nt   accumulate_ut   accumulate_vg      ð?(   t   matrix($   t   sizet   AssertionErrort   scitbx.array_familyR   t	   as_doublet   reshapet   gridt   matrix_transposet	   deep_copyt   resizet   doublet   matrix_diagonal_set_in_placet   matrix_multiplyt   matrix_multiply_transposet   matrix_inversiont   matrix_transpose_multiplyt   matrix_diagonalt	   max_indext   sum_sqt   matrix_outer_productt   scitbx.linalg.svdt   linalgt   svdt   realt   Falset   Truet   sqrtt   sigmat   scitbxR	   t   colR   R   t   sqrt   vR   (   t   Ot   pointst   epsilont   dt   nR   t   pt   qt   ut   umxt   errt   x_invt   mt   jt   maximumt   ascent_step_sizet   new_uR   t   t1t   t2t   aR%   R   R
   R	   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/minimum_covering_ellipsoid.pyt   __init__   sJ    


!(   t   __name__t
   __module__t	   __slots__R<   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/minimum_covering_ellipsoid.pyR      s   N(   t
   __future__R    t   libtbxR   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/math/minimum_covering_ellipsoid.pyt   <module>   s   