o
    EbK                     @   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   :/usr/lib/python3/dist-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  |jdkr|dkrrt	||}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||  }nn|jdksa|d u r|
}||7 }d }!t	||}t||D ]}|dkr<t
||||| ||k rCd}!|!d urJ nt|| }"d||"< 	 |dk}| }t|\}|| }#|# }|| }$|| }%| d d |f }|| ||  }t|||dd }t||$k \}t||%k\}t||f}|jdkrt|$| |#|  |%| |#|  f|| |#|   }&t|&}'||' }(|&|' })|#d|) 9 }#|#|)| 7 }#|#||< |'|jk rd|||( < nd|||( < n|}#|#||< nqVt|#| }| || }dt|| } ||  }||| k r!d}!| }| j|}t	||}q,|!d u r7d}!t||||||d |!|dS )	Nr   r   g      ?   )rcondT)xZfuncost
optimalityZactive_maskZ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_normZ	iterationr   Z
x_free_oldZA_freeZb_freezZlbvZubvvZindZcost_newZtermination_statusZmove_to_freeZx_freeZlb_freeZub_freeZalphasiZi_freeZ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    