ó
Y™xTc           @   s!  d  d l  m Z d  d l Z d „  Z d „  Z d d d „ Z d d	 d
 „ Z d „  Z d „  Z d d „ Z	 d „  Z
 d „  Z d „  Z e d „ Z d e f d „  ƒ  YZ e d „ Z d e d „ Z d" d# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 g Z d  „  Z e d! k re ƒ  n  d S(4   iÿÿÿÿ(   t   divisionNc         C   s²   |  } | d k  r | } n  | } | d k r® xd t  r” | | } | d k rW | } Pn  | | } | d k rw | } Pn  | | } | d k r1 Pq1 q1 W| d k  r® | } q® n  | S(   Ni    (   t   True(   t   at   bt   rit   rjt   rk(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   gcd   s(     
	


 c         C   sø  g  } t  |  ƒ } t  |  d ƒ } d } d } xÃ| | k  ród  } d } x^ t | | ƒ D]M } t |  | | ƒ }	 |	 d k rY | d k s— |	 | k  rY |	 } | } qY qY W| d  k	 rÙ| | k râ |  | |  | |  | <|  | <n  |  | | }
 xÙ t | d | ƒ D]Ä } |  | | } | d k r*qn  d } xX t | | ƒ D]G } |  | | |
 |  | | | |  | | <t |  | | | ƒ } q@W| d k rx. t | | ƒ D] } |  | | c | <q§WqqW| d 7} n | j | ƒ | d 7} q1 W| S(   Ni    i   (   t   lent   Nonet   xranget   absR   t   append(   t   mt	   free_varst   n_rowst   n_colst   piv_rt   piv_ct   best_rt   min_vt   i_rowt   vt   fpt   rt   frt   gt   c(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   integer_row_echelon_form   s@    $  *g:Œ0âŽyE>g{®Gáz„?c         C   s�  g  } t  |  ƒ } t  |  d ƒ } d } d } x[| | k  r‹d  } | }	 xF t | | ƒ D]5 }
 t |  |
 | ƒ } | |	 k rY | }	 |
 } qY qY W| d  k	 rq|	 | k  r® d  S| | k rÚ |  | |  | |  | <|  | <n  |  | | } xy t | d | ƒ D]d } |  | | } | d k r"qü n  x; t | | ƒ D]* } |  | | c |  | | | | 8<q2Wqü W| d 7} n | j | ƒ | d 7} q1 W| S(   Ni    i   (   R   R	   R
   R   R   (   R   t   zero_pivot_tolerancet   min_non_zero_pivotR   R   R   R   R   R   t   max_vR   R   R   R   R   R   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   float_row_echelon_form:   s:      ,g�íµ ÷Æ°>gü©ñÒMbP?c            sn  t  |  ƒ } t  |  d ƒ } t  ˆ  ƒ | k s4 t ‚ t g | } x | D] } t | | <qH W‡  ‡ ‡ f d †  }	 d }
 x½ t | t  | ƒ ƒ D]¥ } x1 | |
 rÇ |	 d |
 ƒ } | sº | S|
 d 7}
 q— W|  | |
 } ˆ  |
 } | d k r)x: t |
 | ƒ D]& } ˆ  | c |  | | | | 8<qü Wn  |
 d 7}
 qŽ Wx0 t |
 | ƒ D] } |	 d | ƒ } | sG| SqGWt S(   Ni    c            s4   t  ˆ  |  ƒ } | ˆ k  r  t S| ˆ k  r0 d  St S(   N(   R   R   R	   t   False(   R   R   (   t   addl_rowR   R   (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   approx_zeroi   s    R   i   (   R   t   AssertionErrorR!   R   R
   (   R   R   R"   R   R   R   R   t
   free_flagsR   R#   R   R   t   azR   R   (    (   R"   R   R   sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt#   float_row_echelon_form_is_redundant]   s2     
' c         C   s  t  |  ƒ } t  |  d ƒ } t  | ƒ | k s4 t ‚ t g | } x | D] } t | | <qH Wg  } x0 t | ƒ D]" \ } } | so | j | ƒ qo qo Wxƒ t t  | ƒ d d d ƒ D]e }	 | |	 }
 d } x5 t |
 d | ƒ D]  } | |  |	 | | | 7} qÜ W| |  |	 |
 | |
 <q² Wd  S(   Ni    i   iÿÿÿÿ(   R   R$   R!   R   t	   enumerateR   R
   (   R   R   t   solR   R   R%   R   t   piv_colst   fR   R   t   s(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt(   float_row_echelon_form_back_substitution�   s      #
c         C   sÙ   | d k s t  ‚ t d d |  ƒ } | g } x] t | ƒ | k r� g  } x1 t |  ƒ D]# } | j | | | d | ƒ qV W| j | ƒ q1 WxD t t | ƒ ƒ D]0 } | | } | |  } | | | |  | | <q¡ W| S(   Ni    i   iÿÿÿÿ(   R$   t   rangeR   R
   R   (   t   n_dimt
   n_verticest   v0t   resultt   vertext   it   j(    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   create_fake_integer_vertices’   s    	!

g     ˆÃ@c         C   sv   | d k s t  ‚ g  } xW t | ƒ | k rq g  } x+ t |  ƒ D] } | j t j ƒ  | ƒ q@ W| j | ƒ q W| S(   Ni    (   R$   R   R
   R   t   random(   R/   R0   t   max_coordinateR2   R3   R4   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   create_fake_float_vertices¥   s    c   
         sâ   t  | ƒ d k r d  St  | ƒ ˆ } g  } x¯ | D]§ \ } } | | k sQ t ‚ d g | ‰ g  t | | | | ƒ D] \ } } | | ^ qv ‰  ‡  ‡ ‡ f d †  }	 |	 d | d d ƒ |	 d | d d ƒ | j ˆ ƒ q3 W| S(   Ni    c            s;   |  ˆ 9}  x* t  ˆ ƒ D] } | ˆ  | ˆ |  | <q Wd  S(   N(   R
   (   R   t   signt   d(   t   dijR/   t   row(    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   copy_to_row·   s    
R   R:   i   iÿÿÿÿ(   R   R	   R$   t   zipR   (
   R/   t   verticest	   edge_listt	   n_columnsR2   R4   R5   t   vit   vjR>   (    (   R<   R/   R=   sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt!   construct_numeric_rigidity_matrix¯   s     4c         C   s.   t  d | d |  ƒ } t d |  d | d | ƒ S(   NR0   R/   R@   RA   (   R6   RE   (   R/   R0   RA   R@   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt!   construct_integer_rigidity_matrixÀ   s    c         C   s.   t  d | d |  ƒ } t d |  d | d | ƒ S(   NR0   R/   R@   RA   (   R9   RE   (   R/   R0   RA   R@   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   construct_float_rigidity_matrixÆ   s    c         C   sŒ   | d k r | r d Sd St  d |  d | d | ƒ } | d  k r] | rU |  | d f S|  | St d | ƒ } | r‚ t | ƒ d f St | ƒ S(   Ni    R/   R0   RA   R   (   i    i    (   RF   R	   R   R   (   R/   R0   RA   t   also_return_repeatsR   R   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt$   determine_degrees_of_freedom_integerÌ   s       t!   row_reduced_float_rigidity_matrixc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s]   | |  _  | |  _ | |  _ d  |  _ d  |  _ d  |  _ d |  _ | d k rO d  S|  j ƒ  d  S(   Niÿÿÿÿi    (	   R/   R0   RA   R	   R   R@   R   t   repeatst   construct_m(   t   selfR/   R0   RA   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   __init__ß   s    							 c         C   s    x™ t  r› |  j d 7_ t d |  j d |  j ƒ |  _ t d |  j d |  j d |  j ƒ |  _ |  j d  k rp d  St
 d |  j ƒ |  _ |  j d  k	 r Pq q Wd  S(   Ni   R0   R/   R@   RA   R   (   R   RK   R9   R0   R/   R@   RE   RA   R   R	   R    R   (   RM   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyRL   ê   s    	! c         C   s*   |  j  d  k r |  j |  j St |  j  ƒ S(   N(   R   R	   R/   R0   R   (   RM   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   dofö   s    c         C   s‰   |  j  d  k	 s t ‚ xm t r„ t d |  j d |  j d | g ƒ d } t d |  j  d |  j d | ƒ } | d  k	 rw Pn  |  j	 ƒ  q W| S(   NR/   R@   RA   i    R   R   R"   (
   R   R	   R$   R   RE   R/   R@   R'   R   RL   (   RM   t   edgeR"   R2   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   is_redundantû   s    	"(   t   __name__t
   __module__RN   RL   RO   RQ   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyRJ   Ý   s   			c         C   sc   | r d } n d } | d k r% | St  d |  d | d | ƒ } | rY | j ƒ  | j f S| j ƒ  S(   Ni    R/   R0   RA   (   i    i    (   RJ   RO   RK   (   R/   R0   RA   RH   t   return_zeroR   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt"   determine_degrees_of_freedom_float  s     	  t   integerc      	   C   s\   | d k s t  ‚ | d k r= t d |  d | d | d | ƒ St d |  d | d | d | ƒ S(   NRV   t   floatR/   R0   RA   RH   (   RV   s   float(   R$   RI   RU   (   R/   R0   RA   t   methodRH   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   determine_degrees_of_freedom  s    i    i   i   i   i   i   i   i   c       
   C   sO   d }  t  } x< d d g D]. } d | Gt d d d |  d | d	 | ƒ GHq Wd  S(
   Ni   RV   RW   s!   double banana 3D dof (method=%s):R/   i   R0   RA   RX   (   t   double_banana_edge_listRY   (   R0   RA   RX   (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   example/  s    t   __main__(   i    i   (   i    i   (   i   i   (   i    i   (   i   i   (   i   i   (   i    i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   t
   __future__R    R7   R   R   R    R'   R-   R6   R9   RE   RF   RG   R!   RI   t   objectRJ   RU   RY   RZ   R[   RR   (    (    (    sC   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/graph/rigidity.pyt   <module>   s6   		$$		
			
.						