ó
l™xTc           @   sÄ   d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l m
 Z
 d  d l m Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d „  Z e d k rÀ e ƒ  d GHn  d S(   iÿÿÿÿ(   t   division(   t   flex(   t   math(   t   Sorry(   t   deepcopy(   t   random(   t   simplext   dssac        	   B   s›   e  Z d  Z e d d d d d d d d „ Z d „  Z d	 „  Z d
 „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   së   
  Directed Simplex Simulated Annealing
  http://www-optima.amp.i.kyoto-u.ac.jp/member/student/hedar/Hedar_files/go_files/DSSA.pdf
  Hybrid simulated annealing and direct search method for nonlinear unconstrained global optimization
  g:Œ0âŽyE>g    eÍÍAg333333ã?g     ˆÃ@gš™™™™™É?i   c         C   s%  | |  _  | |  _ | |  _ | |  _ | |  _ |	 |  _ |
 |  _ | d  k r[ | d |  _ n	 | |  _ t	 | ƒ |  j d k s– | d j
 ƒ  |  j k r¥ t d ƒ ‚ n  x= | d D]1 } | j
 ƒ  | d j
 ƒ  k r° t d ƒ ‚ q° q° W| |  _ |  j | ƒ g  |  _ |  j ƒ  | r!|  j ƒ  n  d  S(   Ni   i    s>   The initial simplex matrix does not match dimensions specifieds/   Vector length in intial simplex do not match up(   t   max_itert	   dimensiont	   tolerancet	   evaluatort
   coolfactort   T_ratiot   simplex_scalet   Nonet   n_candidatet   lent   sizeR   t   monitor_cyclet
   initializet
   candidatest   optimizet   optimize_further(   t   selfR	   t   matrixR   t   further_optR   R
   R   R   R   R   R   t   vector(    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyt   __init__   s*    								2		
c         C   sŒ   t  |  _ t  |  _ t j ƒ  |  _ g  |  _ x= | D]5 } |  j j | j ƒ  ƒ |  j j |  j	 | ƒ ƒ q1 Wt j ƒ  |  _
 t j ƒ  |  _ d  S(   N(   t   Falset   endt   foundR   t   doublet   simplexValueR   t   appendt	   deep_copyt   functiont   centroidt   reflectionPt(   R   R   R   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR   6   s    			c         C   sl  t  } t  } |  j d |  _ d } |  j ƒ  x' |  j D] } |  j j | j ƒ  ƒ q6 W|  j j ƒ  |  _	 d } d |  _
 xî | rg| rg|  j ƒ  |  j ƒ  |  j
 d 7_
 |  j d |  _ |  j
 |  j d k r7t |  j |  j |  j d ƒ } | t |  j ƒ |  j |  j } | |  j k  r+t } q7|  j } n  |  j
 |  j k s[|  j |  j k  rz t } qz qz Wd  S(   Ni   i    i   (   R   R	   t   Nstept   sortR   R   R"   R#   R!   t   candi_valuet   countt   exploret   update_candit	   min_scoreR   t   absR
   t   TrueR   t   Tt   min_T(   R   R   R   t   monitor_scoret   pointt   rd(    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR   A   s.    
	

!!	$c         C   sæ   xß t  d ƒ D]Ñ } xÈ t  | |  j ƒ D]´ } |  j | |  j | k  r& |  j | |  j | d k rÖ |  j j | |  j | ƒ |  j j | |  j | j ƒ  ƒ |  j j ƒ  |  j k rÖ |  j j	 ƒ  |  j j
 ƒ  qÖ n  Pq& q& Wq Wd  S(   Ni   i   (   t   rangeR   R!   R)   t   insertR   R   R#   R   t   pop_backt   pop(   R   t   iit   jj(    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR,   `   s     c      
   C   s  g  |  _  t j ƒ  |  _ x² |  j D]§ } g  } x? t |  j d ƒ D]* } | j t j |  j ƒ |  j	 | ƒ qB Wt
 j d |  j d | d |  j d |  j ƒ } |  j  j | j ƒ  ƒ |  j j | j ƒ  ƒ q" Wt j |  j ƒ } |  j  | |  _ |  j | |  _ d  S(   Ni   R	   R   R   R
   (   t	   solutionsR   R    t   scoresR   R5   R	   R"   t   random_doubleR   R   t   simplex_optR   R
   t   get_solutiont	   get_scoret	   min_indext   best_solutiont
   best_score(   R   t   candit   starting_simplexR9   t	   optimizerRA   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR   l   s    	(	c         C   sÛ   |  j  d k r[ t j t j |  j t j |  j ƒ ƒ ƒ d d |  _ |  j |  j |  _ n, |  j  |  j d k r‡ |  j |  j	 |  _ n  xC t
 d |  j d ƒ D]+ } |  j |  j d | ƒ |  j | ƒ qž W|  j ƒ  d  S(   Ni    g      à?g      $@i   (   R*   R   t   meant   pow2R!   R0   R   R1   R'   R   R5   R	   t   FindCentroidPtt   FindReflectionPtR(   (   R   t   kk(    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR+   €   s    6
c         C   s¶   t  |  j ƒ } t |  j ƒ } t |  j ƒ } | j ƒ  g  } x* | D]" } | j | ƒ } | j | ƒ qD WxE t |  j d ƒ D]0 } | | | |  j | <| | | |  j | <q~ Wd  S(   Ni   (	   R   R   t   listR!   R(   t   indexR"   R5   R	   (   R   t
   tmp_matrixt	   tmp_valuet
   sort_valuet
   indx_arrayt   valuet   indxR9   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR(   Ž   s    
c         C   sT   |  j  d d |  _ x* t | ƒ D] } |  j |  j  | 7_ q! W|  j | _ d  S(   Ni    (   R   R%   R5   (   R   RK   R9   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyRI   œ   s    c         C   s$  g  } g  } t  j  ƒ  d d |  _ xr t |  j d | |  j d ƒ D]O } |  j d |  j |  j |  j | } | j | ƒ | j |  j | ƒ ƒ qE Wt | ƒ |  _	 |  j	 |  j
 d k rt j |  j	 |  j
 d |  j ƒ } | t  j  ƒ  k r |  j | | | ƒ q n |  j | | | ƒ d  S(   Ngš™™™™™É?gÍÌÌÌÌÌì?i   g      ð?i    (   R   t   alphaR5   R	   R%   R   R"   R$   t   mint   reflectionPtValueR!   R   t   expR0   t	   ReplacePt(   R   RK   t   reflect_matrixt   reflect_valueR9   R&   t   p(    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyRJ   ¢   s    (&%c         C   sz   xi t  |  j d | |  j d ƒ D]F } | | |  j d | |  j | <| | |  j d | |  j | <q" W|  j ƒ  d  S(   Ni   (   R5   R	   R   R!   R(   (   R   RK   RY   RZ   R9   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyRX   µ   s    ( $c         C   s   |  j  S(   N(   RB   (   R   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR?   ¼   s    c         C   s   |  j  S(   N(   R   (   R   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyt	   get_candi¿   s    c         C   s   |  j  j | ƒ S(   N(   R   t   target(   R   R3   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR$   Â   s    N(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R,   R   R+   R(   RI   RJ   RX   R?   R\   R$   (    (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR   	   s*   											t   test_rosenbrock_functionc           B   s   e  Z d  d „ Z d „  Z RS(   i   c         C   sô   | d |  _  | |  _ t j |  j  d ƒ |  _ g  |  _ x> t |  j  d ƒ D]) } |  j j t j |  j  ƒ |  j ƒ qK Wt	 d |  j  d |  j d |  d d d	 t
 d
 d ƒ |  _ |  j j ƒ  |  _ x- |  j D]" } t | d ƒ d k  sÊ t ‚ qÊ Wd  S(   Ni   g       @i   R	   R   R   R
   g:Œ0âŽyE>R   R   g333333ã?g      ð?g{®Gáz„?(   t   nt   dimR   R    t   xRE   R5   R"   R=   R   R/   RF   R?   R.   t   AssertionError(   R   Rc   R9   Rd   (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR   Ç   s    		'	c         C   sm   | d |  j  !} | |  j  } d } xC t | | ƒ D]2 \ } } | d | | | d d | d 7} q3 W| S(   Ni    g      Y@g       @i   (   Rc   t   zip(   R   R   t   x_vect   y_vect   resultRd   t   y(    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyR]   ß   s    *(   R^   R_   R   R]   (    (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyRa   Æ   s   c           C   sL   t  j d ƒ t j d ƒ t d ƒ t  j d ƒ t j d ƒ t d ƒ d  S(   Ni    i   i   (   R   t   seedR   t   set_random_seedRa   (    (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyt   runê   s    
t   __main__t   OKN(   t
   __future__R    t   scitbx.array_familyR   t   stdlibR   t   libtbx.utilsR   t   copyR   R   t   scitbxR   t   objectR   Ra   Rm   R^   (    (    (    sV   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/scitbx/direct_search_simulated_annealing.pyt   <module>   s   ½$	