
&]\c           @   s~   d  d l  Z d  d l m Z d d l m Z m Z m Z d d l m	 Z	 m
 Z
 d e	 f d     YZ d e
 f d	     YZ d S(
   iN(   t   odei   (   t   validate_tolt   validate_first_stept   warn_extraneous(   t	   OdeSolvert   DenseOutputt   LSODAc        
   B   sG   e  Z d  Z d d e j d d d d d e d 	 Z d   Z d   Z	 RS(   s  Adams/BDF method with automatic stiffness detection and switching.

    This is a wrapper to the Fortran solver from ODEPACK [1]_. It switches
    automatically between the nonstiff Adams method and the stiff BDF method.
    The method was originally detailed in [2]_.

    Parameters
    ----------
    fun : callable
        Right-hand side of the system. The calling signature is ``fun(t, y)``.
        Here ``t`` is a scalar, and there are two options for the ndarray ``y``:
        It can either have shape (n,); then ``fun`` must return array_like with
        shape (n,). Alternatively it can have shape (n, k); then ``fun``
        must return an array_like with shape (n, k), i.e. each column
        corresponds to a single column in ``y``. The choice between the two
        options is determined by `vectorized` argument (see below). The
        vectorized implementation allows a faster approximation of the Jacobian
        by finite differences (required for this solver).
    t0 : float
        Initial time.
    y0 : array_like, shape (n,)
        Initial state.
    t_bound : float
        Boundary time - the integration won't continue beyond it. It also
        determines the direction of the integration.
    first_step : float or None, optional
        Initial step size. Default is ``None`` which means that the algorithm
        should choose.
    min_step : float, optional
        Minimum allowed step size. Default is 0.0, i.e. the step size is not
        bounded and determined solely by the solver.
    max_step : float, optional
        Maximum allowed step size. Default is np.inf, i.e. the step size is not
        bounded and determined solely by the solver.
    rtol, atol : float and array_like, optional
        Relative and absolute tolerances. The solver keeps the local error
        estimates less than ``atol + rtol * abs(y)``. Here `rtol` controls a
        relative accuracy (number of correct digits). But if a component of `y`
        is approximately below `atol`, the error only needs to fall within
        the same `atol` threshold, and the number of correct digits is not
        guaranteed. If components of y have different scales, it might be
        beneficial to set different `atol` values for different components by
        passing array_like with shape (n,) for `atol`. Default values are
        1e-3 for `rtol` and 1e-6 for `atol`.
    jac : None or callable, optional
        Jacobian matrix of the right-hand side of the system with respect to
        ``y``. The Jacobian matrix has shape (n, n) and its element (i, j) is
        equal to ``d f_i / d y_j``. The function will be called as
        ``jac(t, y)``. If None (default), the Jacobian will be
        approximated by finite differences. It is generally recommended to
        provide the Jacobian rather than relying on a finite-difference
        approximation.
    lband, uband : int or None
        Parameters defining the bandwidth of the Jacobian,
        i.e., ``jac[i, j] != 0 only for i - lband <= j <= i + uband``. Setting
        these requires your jac routine to return the Jacobian in the packed format:
        the returned array must have ``n`` columns and ``uband + lband + 1``
        rows in which Jacobian diagonals are written. Specifically
        ``jac_packed[uband + i - j , j] = jac[i, j]``. The same format is used
        in `scipy.linalg.solve_banded` (check for an illustration).
        These parameters can be also used with ``jac=None`` to reduce the
        number of Jacobian elements estimated by finite differences.
    vectorized : bool, optional
        Whether `fun` is implemented in a vectorized fashion. A vectorized
        implementation offers no advantages for this solver. Default is False.

    Attributes
    ----------
    n : int
        Number of equations.
    status : string
        Current status of the solver: 'running', 'finished' or 'failed'.
    t_bound : float
        Boundary time.
    direction : float
        Integration direction: +1 or -1.
    t : float
        Current time.
    y : ndarray
        Current state.
    t_old : float
        Previous time. None if no steps were made yet.
    nfev : int
        Number of evaluations of the right-hand side.
    njev : int
        Number of evaluations of the Jacobian.

    References
    ----------
    .. [1] A. C. Hindmarsh, "ODEPACK, A Systematized Collection of ODE
           Solvers," IMACS Transactions on Scientific Computation, Vol 1.,
           pp. 55-64, 1983.
    .. [2] L. Petzold, "Automatic selection of methods for solving stiff and
           nonstiff systems of ordinary differential equations", SIAM Journal
           on Scientific and Statistical Computing, Vol. 4, No. 1, pp. 136-148,
           1983.
    g        gMbP?gư>c         K   sp  t  |  t t |   j | | | | |  | d  k rA d } n t | | |  } | |  j 9} | t j k rx d } n | d k r t	 d   n  | d k  r t	 d   n  t
 | |	 |  j  \ } }	 |
 d  k r d   }
 n  t |  j |
  } | j d d | d |	 d | d	 | d
 | d | d | | j | |  |  j | j j d <| j j | j j d <| |  _ d  S(   Ni    s   `max_step` must be positive.s   `min_step` must be nonnegative.c           S   s   d  S(   N(   t   None(    (    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyt   jac   s    t   lsodat   rtolt   atolt   max_stept   min_stept
   first_stept   lbandt   ubandi   (   R   t   superR   t   __init__R   R   t	   directiont   npt   inft
   ValueErrorR   t   nR    t   funt   set_integratort   set_initial_valuet   t_boundt   _integratort   rworkt	   call_argst   _lsoda_solver(   t   selfR   t   t0t   y0R   R   R   R   R
   R   R   R   R   t
   vectorizedt
   extraneoust   solver(    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyR   i   s.    
"		c         C   s   |  j  } | j } | j d } d | j d <| j | j | j | j | j |  j | j	 | j
  \ | _ | _ | | j d <| j   r | j |  _ | j |  _ | j d |  _ | j d |  _ t d  f St d f Sd  S(   Ni   i   i   s   Unexpected istate in LSODA.(   R   R   R   t   runt   fR   t   _yt   tR   t   f_paramst
   jac_paramst
   successfult   yt   iworkt   njevt   nlut   TrueR   t   False(   R    R%   t
   integratort   itask(    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyt
   _step_impl   s    		$
c         C   s   |  j  j j } |  j  j j } | d } | d } t j | d d | d |  j !|  j | d f d d j   } t |  j	 |  j
 | | |  S(   Ni   i   i   i   t   ordert   F(   R   R   R.   R   R   t   reshapeR   t   copyt   LsodaDenseOutputt   t_oldR)   (   R    R.   R   R6   t   ht   yh(    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyt   _dense_output_impl   s    

"N(
   t   __name__t
   __module__t   __doc__R   R   R   R2   R   R5   R>   (    (    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyR      s   a%	R:   c           B   s   e  Z d    Z d   Z RS(   c         C   sE   t  t |   j | |  | |  _ | |  _ t j | d  |  _ d  S(   Ni   (   R   R:   R   R<   R=   R   t   aranget   p(   R    R;   R)   R<   R6   R=   (    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyR      s    		c         C   sk   | j  d k r- | |  j |  j |  j } n+ | |  j |  j |  j d  d   d  f } t j |  j |  S(   Ni    (   t   ndimR)   R<   RC   R   R   t   dotR=   (   R    R)   t   x(    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyt
   _call_impl   s    +(   R?   R@   R   RG   (    (    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyR:      s   	(   t   numpyR   t   scipy.integrateR    t   commonR   R   R   t   baseR   R   R   R:   (    (    (    s9   lib/python2.7/site-packages/scipy/integrate/_ivp/lsoda.pyt   <module>   s
   