U
    /‰dK  ã                   @   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   ú</tmp/pip-unpacked-wheel-9gxwnfpp/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ƒ  |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¶q(q¶|d kr6|
}||7 }d }!t	||ƒ}t||ƒD ]}|dkrvt
|||||ƒ ||k r„d}!|!d k	r” q`t || ¡}"d||"< |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|}#|#||< qþqªt|#| ƒ}|  |¡| }dt ||¡ } ||  }||| k rBd}!| }| j |¡}t	||ƒ}qV|!d krnd}!t||||||d |!|dS )	Néÿÿÿÿr   r   g      à?é   )ÚrcondT)ÚxZfunÚcostÚ
optimalityZactive_maskZnitÚstatusÚinitial_cost)ÚshapeÚcopyr   Ú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__Znumpyr   Znumpy.linalgr   r   Zscipy.optimizer   Úcommonr   r   r   r/   r   r   r   r   Ú<module>   s   