B
    †Ž0dK  ã               @   sN   d Z ddlZddlmZmZ ddlmZ ddlm	Z	m
Z
 dd„ Zdd	d
„ZdS )z)Bounded-variable least-squares algorithm.é    N)ÚnormÚlstsq)ÚOptimizeResulté   )Úprint_header_linearÚprint_iteration_linearc             C   s,   | | }|dk}t  | | ¡||< t  |¡S )z0Compute the maximum violation of KKT conditions.r   )ÚnpÚabsÚmax)ÚgÚon_boundZg_kktÚfree_set© r   úJ/var/www/html/venv/lib/python3.7/site-packages/scipy/optimize/_lsq/bvls.pyÚcompute_kkt_optimality	   s    r   c	       *   
   C   s”  | j \}	}
| ¡ }t |
¡}||k}|| ||< d||< ||k}|| ||< d||< |dk}| }t |¡\}|  |¡| }dt ||¡ }|}| j |¡}d }d }d}|dkr¶tƒ  xr|jdkr*|dkrèt	||ƒ}t
|||||ƒ |d7 }||  ¡ }| d d …|f }||  || ¡ }t|||dd }||| k }||| k}||B }t |¡r€|| }|| ||< d||< d||< t |¡r°|| }|| ||< d||< d||< ||  }||  ||< |  |¡| }dt ||¡ } ||  }| }| j |¡}t|| | ƒ}t |¡r&||  }qºP qºW |d kr:|
}||7 }d }!t	||ƒ}xt||ƒD ]}|dkr~t
|||||ƒ ||k rŒd}!|!d k	r˜P t || ¡}"d||"< xT|dk}| }t |¡\}|| }#|# ¡ }|| }$|| }%| d d …|f }||  || ¡ }t|||dd }t ||$k ¡\}t ||%k¡\}t ||f¡}|jdkròt |$| |#|  |%| |#|  f¡|| |#|   }&t |&¡}'||' }(|&|' })|#d|) 9 }#|#|)| 7 }#|#||< |'|jk räd|||( < nd|||( < n|}#|#||< P q²W t|#| ƒ}|  |¡| }dt ||¡ } ||  }||| k rJd}!| }| j |¡}t	||ƒ}q^W |!d krxd}!t||||||d |!|dS )	Néÿÿÿÿr   r   g      à?é   )ÚrcondT)ÚxZfunÚcostÚ
optimalityZactive_maskÚnitÚstatusÚinitial_cost)ÚshapeÚcopyr   ZzerosZnonzeroÚdotÚTr   Úsizer   r   r   Úanyr   ÚrangeZargmaxZhstackZargminr   )*ÚAÚbZx_lsqZlbZubZtolZmax_iterÚverboser   ÚmÚnr   r   Úmaskr   Z
active_setÚrr   r   r   Zcost_changeZ	step_normÚ	iterationr   Z
x_free_oldZA_freeZb_freeÚzZlbvZubvÚvÚindZcost_newZtermination_statusZmove_to_freeZx_freeZlb_freeZub_freeÚalphasÚiZi_freeÚalphar   r   r   Úbvls   sæ    









$


r/   )N)Ú__doc__Únumpyr   Znumpy.linalgr   r   Zscipy.optimizer   Úcommonr   r   r   r/   r   r   r   r   Ú<module>   s   