U
    e»{j  ã                   @   sˆ   d Z ddlZddlZddlZddlmZ dddgZdZe 	e 
e¡j¡ZdZd	ZG d
d„ dejd�ZG dd„ deƒZG dd„ deƒZdS )z>
Optimization algorithms used in `~astropy.modeling.fitting`.
é    N)ÚAstropyUserWarningÚOptimizationÚSLSQPÚSimplexéd   gH¯¼šò×z>)lýÿÿÿ J)£l    J)£c                   @   sŒ   e Zd ZdZg Zdd„ Zedd„ ƒZejdd„ ƒZedd„ ƒZ	e	jd	d„ ƒZ	ed
d„ ƒZ
e
jdd„ ƒZ
dd„ Zedd„ ƒZejdd„ ƒZdS )r   aE  
    Base class for optimizers.

    Parameters
    ----------
    opt_method : callable
        Implements optimization method

    Notes
    -----
    The base Optimizer does not support any constraints by default; individual
    optimizers should explicitly set this list to the specific constraints
    it supports.

    c                 C   s   || _ t| _t| _t| _d S )N)Ú_opt_methodÚDEFAULT_MAXITERÚ_maxiterÚDEFAULT_EPSÚ_epsÚDEFAULT_ACCÚ_acc)ÚselfÚ
opt_method© r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/optimizers.pyÚ__init__0   s    zOptimization.__init__c                 C   s   | j S )zMaximum number of iterations©r	   ©r   r   r   r   Úmaxiter6   s    zOptimization.maxiterc                 C   s
   || _ dS )zSet maxiterNr   ©r   Úvalr   r   r   r   ;   s    c                 C   s   | j S )z=Step for the forward difference approximation of the Jacobian©r   r   r   r   r   Úeps@   s    zOptimization.epsc                 C   s
   || _ dS )zSet eps valueNr   r   r   r   r   r   E   s    c                 C   s   | j S )zRequested accuracy©r   r   r   r   r   ÚaccJ   s    zOptimization.accc                 C   s
   || _ dS )zSet accuracyNr   r   r   r   r   r   O   s    c                 C   s   | j j› d�}|S )Nz())Ú	__class__Ú__name__)r   Úfmtr   r   r   Ú__repr__T   s    zOptimization.__repr__c                 C   s   | j S )zReturn the optimization method.)r   r   r   r   r   r   X   s    zOptimization.opt_methodc                 C   s   t dƒ‚d S )Nz'Subclasses should implement this method)ÚNotImplementedErrorr   r   r   r   Ú__call__]   s    zOptimization.__call__N)r   Ú
__module__Ú__qualname__Ú__doc__Úsupported_constraintsr   Úpropertyr   Úsetterr   r   r   r   ÚabcÚabstractmethodr!   r   r   r   r   r      s(   






)Ú	metaclassc                       s6   e Zd ZdZdddddgZ‡ fdd„Zd	d
„ Z‡  ZS )r   a)  
    Sequential Least Squares Programming optimization algorithm.

    The algorithm is described in [1]_. It supports tied and fixed
    parameters, as well as bounded constraints. Uses
    `scipy.optimize.fmin_slsqp`.

    References
    ----------
    .. [1] http://www.netlib.org/toms/733
    ÚboundsÚeqconsÚineqconsÚfixedÚtiedc                    s,   ddl m} tƒ  |¡ d d d d dœ| _d S )Nr   )Ú
fmin_slsqp)Úfinal_func_valÚnumiterÚ	exit_modeÚmessage)Úscipy.optimizer0   Úsuperr   Úfit_info)r   r0   ©r   r   r   r   q   s    üzSLSQP.__init__c              	      sJ  |  d| j¡|d< d|kr$| j|d< d|kr6| j|d< |  dd¡}|d ‰ ‡ fdd	„ˆ jD ƒ}d
d	„ |D ƒ}t |¡}|D ]4}|d dkr–td |d< |d dkrztd |d< qztj|td�}t 	ˆ j
¡}	t 	ˆ j¡}
| j||f|d|||	|
dœ|—Ž\}}}}}|| jd< || jd< || jd< || jd< |dk�r@t dt¡ || jfS )á  
        Run the solver.

        Parameters
        ----------
        objfunc : callable
            objection function
        initval : iterable
            initial guess for the parameter values
        fargs : tuple
            other arguments to be passed to the statistic function
        kwargs : dict
            other keyword arguments to be passed to the solver

        r   ÚiterÚepsilonr   Ú	verblevelNr   c                    s   g | ]}t ˆ |ƒ‘qS r   )Úgetattr)Ú.0Úname©Úmodelr   r   Ú
<listcomp>—   s     z"SLSQP.__call__.<locals>.<listcomp>c                 S   s   g | ]}|j s|js|j‘qS r   )r.   r/   r+   )r>   Zparr   r   r   rB   ˜   s       é   )ZdtypeT)ÚargsÚfull_outputÚdispr+   r,   Zieqconsr1   r2   r3   r4   zLThe fit may be unsuccessful; check fit_info['message'] for more information.)Úpopr	   r   r   Zparam_namesÚnpZasarrayÚDEFAULT_BOUNDSÚfloatÚarrayr,   r-   r   r7   ÚwarningsÚwarnr   )r   ÚobjfuncÚinitvalÚfargsÚkwargsrF   Zparsr+   Úir,   r-   Ú	fitparamsr1   r2   r3   Zmessr   r@   r   r!   |   sR    


þø	÷




ýzSLSQP.__call__©r   r"   r#   r$   r%   r   r!   Ú__classcell__r   r   r8   r   r   b   s   c                       s2   e Zd ZdZdddgZ‡ fdd„Zdd„ Z‡  ZS )	r   a=  
    Neald-Mead (downhill simplex) algorithm.

    This algorithm [1]_ only uses function values, not derivatives.
    Uses `scipy.optimize.fmin`.

    References
    ----------
    .. [1] Nelder, J.A. and Mead, R. (1965), "A simplex method for function
       minimization", The Computer Journal, 7, pp. 308-313
    r+   r.   r/   c                    s,   ddl m} tƒ  |¡ d d d d dœ| _d S )Nr   )Úfmin)r1   r2   r3   Únum_function_calls)r5   rV   r6   r   r7   )r   Zsimplexr8   r   r   r   Í   s    üzSimplex.__init__c                 K   sè   d|kr| j |d< d|kr.|d | _| d¡ d|krJ|d | _| d¡ | dd¡}| j||f|| j|ddœ|—Ž\}}}}	}
|| jd< || jd	< |
| jd
< |	| jd< | jd
 dkrÄt dt¡ n| jd
 dkrÞt dt¡ || jfS )r9   r   r   Úxtolr<   NT)rD   rX   rF   rE   r1   r2   r3   rW   rC   zLThe fit may be unsuccessful; Maximum number of function evaluations reached.é   zBThe fit may be unsuccessful; Maximum number of iterations reached.)r	   r   rG   r   r7   rL   rM   r   )r   rN   rO   rP   rQ   rF   rS   r1   r2   Zfuncallsr3   r   r   r   r!   Ø   sF    




þúù	



ýþzSimplex.__call__rT   r   r   r8   r   r   ¾   s   
)r$   r(   rL   ÚnumpyrH   Zastropy.utils.exceptionsr   Ú__all__r   ÚsqrtZfinforJ   r   r
   r   rI   ÚABCMetar   r   r   r   r   r   r   Ú<module>   s   
E\