B
    d(                 @   s   d dl mZmZmZ d dlmZ d dlm  mZ	 e	
dZd dlT d dlmZ e ZG dd deZG d	d
 d
eZG dd deZdddZdddZdddZdS )    )absolute_importdivisionprint_function)flexNscitbx_lbfgs_ext)*)adopt_init_argsc               @   s   e Zd Zd
ddZd	S )core_parameters      ?缉ؗҜ<#B;@xDc             C   s   t | t  d S )N)r   locals)selfmmaxfevgtolxtolstpminstpmax r   t/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/scitbx/lbfgs/__init__.py__init__   s    zcore_parameters.__init__N)r
   r   r   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r	      s        r	   c               @   s   e Zd Zd	ddZdS )
termination_parametersTh㈵>r
      r   Nc	       	      C   s   t ||}t| t  d S )N)maxr   r   )	r   traditional_convergence_test traditional_convergence_test_eps#drop_convergence_test_n_test_points"drop_convergence_test_max_drop_eps+drop_convergence_test_iteration_coefficientmin_iterationsmax_iterations	max_callsr   r   r   r      s    ztermination_parameters.__init__)Tr   r
   r   r    r   NN)r   r   r   r   r   r   r   r   r      s          r   c               @   s   e Zd ZdddZdd ZdS )	exception_handling_parametersTFc             C   s   t | t  d S )N)r   r   )r   )ignore_line_search_failed_rounding_errors-ignore_line_search_failed_step_at_lower_bound-ignore_line_search_failed_step_at_upper_bound ignore_line_search_failed_maxfevignore_line_search_failed_xtol#ignore_search_direction_not_descentr   r   r   r   '   s    z&exception_handling_parameters.__init__c             C   s   | dsdS |ddkr(| jrdS n|ddkrf|d k	rZ|d k	rZt|||rZdS | jrdS n|ddkr| jrdS np|ddkr| jrdS nV|d	dkr| jrdS n<|d
dkr|d k	r|d k	rt|||rdS | j	rdS dS )Nzlbfgs error   z)Rounding errors prevent further progress.r   z(The step is at the lower bound stpmin().z(The step is at the upper bound stpmax().z4Number of function evaluations has reached maxfev().z@Relative width of the interval of uncertainty is at most xtol().z0The search direction is not a descent direction.)

startswithfindr+   extr"   r,   r-   r.   r/   r0   )r   msgnxgr   r   r   filter/   s:    
z$exception_handling_parameters.filterN)TFFFFF)r   r   r   r   r:   r   r   r   r   r*   %   s        
r*   FTc          
   C   sr  |d krt  }|d krt }|d kr*t }| j}|d k	rtd|d td| |d td|j|d td|j|d td|j|d td|j	|d td|j
|d td	|j|d td
|j|d t| |j|j|j|j	|j
|j}|jrt| |j}	ntj|j|j|jd}	t| dd }
t| dd }|d k	rN|dksNtd\}}d\}}yHx@|d kr|  \}}d }n|  \}}}|dkrd }|d kr|js|	| ||  }}n||kr||  }}|d k	rtd|| t|t|t|f |d |d kr>||||||rXqfn|||||||rXqf|d k	rntd|d |
d k	r|
|dkr|d k	rtd|d P |jr| |j kr|	||r|d k	rtd|d P n"|	|r|d k	rtd|d P |j!d k	r2| |j!kr2|d k	r0td|d P |j"d k	rf|# |j"krf|d k	rdtd|d P |d kr||||||sP n|||||||sfP qfW W n t$k
rJ } zt%||_&|d k	rtdt%||d |d k	r|'  |(| |)|j&| ||}|dkr" n|dk r4d|_*nd|_*W d d }~X Y nX d |_&d |_*|d k	rntd|d |S )Nzlbfgs minimizer():)filez  x.size():z  m:z	  maxfev:z  gtol:z  xtol:z	  stpmin:z	  stpmax:z#lbfgs traditional_convergence_test:)Zn_test_pointsZmax_drop_epsZiteration_coefficientcallback_after_step	diag_mode)oncealways)NNr>   zLlbfgs minimizer.run(): f=%.6g, |g|=%.6g, x_min=%.6g, x_mean=%.6g, x_max=%.6gzlbfgs minimizer stepTz1lbfgs minimizer stop: callback_after_step is Truez2lbfgs minimizer stop: traditional_convergence_testz+lbfgs minimizer stop: drop_convergence_testz$lbfgs minimizer stop: max_iterationszlbfgs minimizer stop: max_callszlbfgs minimizer exception:r   Fzlbfgs minimizer done.)+r   r	   r*   r8   printsizer   r   r   r   r   r   r"   r5   	minimizerr#   Zdrop_convergence_testr$   r%   r&   getattrAssertionError compute_functional_and_gradientsZ!compute_functional_gradients_diag	deep_copynormr   minmeanr!   runiterr'   r(   r)   nfunRuntimeErrorstrerrorclearextendr:   Zis_unusual_error)target_evaluatortermination_paramscore_paramsexception_handling_paramsloggradient_onlyline_searchr8   rB   Zis_convergedr<   r=   Zf_minZx_minfr9   deZerror_classificationr   r   r   run_c_plus_plusN   s    	


 




,
  








  






r\   c             C   s  ddl m} ddlm} ddl}|dkr.t }|dkr<t }|jsFt|j	dksTt| j
}| }|j}|j}	|j}
|j}|j}|j}||||j}||||j}|d| d  d|  }||||j}||||j}ddg}d}|dg|j}|dd}x|  \}}xt|D ]\}}|||< q,W xt|D ]\}}|||< qLW |||||||||||
|| xt|D ]\}}|||< qW |d dkrP |d dk rd	|_P qW |S )
zFor debugging only!r   )store)lbfgsNr   r    r1   )rO   zfortran lbfgs error)scitbx.python_utils.miscr]   fortran_lbfgsr^   Numericr   r	   r"   rD   r   r8   rA   r   r   r   r   r   r#   arrayarangeZFloat64ZInt32rE   	enumeraterO   )rR   rS   rT   r]   r`   ra   r8   r7   r   r   r   r   r   epsZ	x_numericZ	g_numericZsize_wwdiagZiprintZdiagcoZiflagrB   rY   r9   ixiZgir   r   r   run_fortran   sT    

   rj   c             C   s(   |rt | ||S t| ||||||S d S )N)rj   r\   )rR   rS   rT   rU   Zuse_fortranrV   rW   rX   r   r   r   rJ     s    
rJ   )NNNNFT)NN)NNNFNFT)
__future__r   r   r   scitbx.array_familyr   boost_adaptbx.boost.pythonboostpythonbp
import_extr5   r   libtbxr   Z	raw_lbfgsrawobjectr	   r   r*   r\   rj   rJ   r   r   r   r   <module>   s2   

*     
  
+      