# Source code for qutip.solver.sode.itotaylor

    from . import _sode
    from .sode import _Explicit_Simple_Integrator, _Implicit_Simple_Integrator
    from ..stochastic import StochasticSolver, SMESolver

    __all__ = [
        "EulerSODE", "Milstein_SODE", "Taylor1_5_SODE", "Explicit1_5_SODE",
        "Implicit_Milstein_SODE", "Implicit_Taylor1_5_SODE"
    ]

    class EulerSODE(_Explicit_Simple_Integrator):
        """
        A simple generalization of the Euler method for ordinary
        differential equations to stochastic differential equations.  Only
        solver which could take non-commuting ``sc_ops``.

        - Order: 0.5
        """
        integrator_options = {
            "dt": 0.001,
            "tol": 1e-10,
        }
        stepper = _sode.Euler
        N_dw = 1
        _stepper_options = ["measurement_noise"]

    class Milstein_SODE(_Explicit_Simple_Integrator):
        """
        An order 1.0 strong Taylor scheme.  Better approximate numerical
        solution to stochastic differential equations.  See eq. (3.12) of
        chapter 10.3 of Peter E. Kloeden and Exkhard Platen,
        *Numerical Solution of Stochastic Differential Equations*..

        - Order strong 1.0
        """
        integrator_options = {
            "dt": 0.001,
            "tol": 1e-10,
        }
        stepper = _sode.Milstein
        N_dw = 1
        _stepper_options = ["measurement_noise"]

    class Taylor1_5_SODE(_Explicit_Simple_Integrator):
        """
        Order 1.5 strong Taylor scheme.  Solver with more terms of the
        Ito-Taylor expansion. See eq. (4.6) of chapter 10.4 of Peter E. Kloeden and
        Exkhard Platen, *Numerical Solution of Stochastic Differential Equations*.

        - Order strong 1.5
        """
        integrator_options = {
            "dt": 0.001,
            "tol": 1e-10,
            "derr_dt": 1e-6,
        }
        stepper = _sode.Taylor15
        N_dw = 2

        @property
        def options(self):
            """
            Supported options by Order 1.5 strong Taylor Stochastic Integrators:

            dt : float, default: 0.001
                Internal time step.

            tol : float, default: 1e-10
                Relative tolerance.

            derr_dt : float, default: 1e-6
                Finite time difference used to compute the derrivative of the
                hamiltonian and ``sc_ops``.
            """
            return self._options

        @options.setter
        def options(self, new_options):
            _Explicit_Simple_Integrator.options.fset(self, new_options)

    class Explicit1_5_SODE(_Explicit_Simple_Integrator):
        """
        Explicit order 1.5 strong schemes.  Reproduce the order 1.5 strong
        Taylor scheme using finite difference instead of derivatives.
        Slower than ``taylor15`` but usable when derrivatives cannot be
        analytically obtained.
        See eq. (2.13) of chapter 11.2 of Peter E. Kloeden and Exkhard Platen,
        *Numerical Solution of Stochastic Differential Equations.*

        - Order: strong 1.5
        """
        stepper = _sode.Explicit15
        N_dw = 2

    class Implicit_Milstein_SODE(_Implicit_Simple_Integrator):
        """
        An order 1.0 implicit strong Taylor scheme.  Implicit Milstein
        scheme for the numerical simulation of stiff stochastic
        differential equations.  Eq. (2.11) with alpha=0.5 of
        chapter 12.2 of Peter E. Kloeden and Exkhard Platen,
        *Numerical Solution of Stochastic Differential Equations*.

        - Order strong 1.0
        """
        stepper = _sode.Milstein_imp
        N_dw = 1

    class Implicit_Taylor1_5_SODE(_Implicit_Simple_Integrator):
        """
        Order 1.5 implicit strong Taylor scheme.  Solver with more terms of the
        Ito-Taylor expansion.  Eq. (2.18) with ``alpha=0.5`` of chapter 12.2 of
        Peter E. Kloeden and Exkhard Platen,
        *Numerical Solution of Stochastic Differential Equations*.

        - Order strong 1.5
        """
        integrator_options = {
            "dt": 0.001,
            "tol": 1e-10,
            "solve_method": None,
            "solve_options": {},
            "deff_dt": 1e-6
        }
        stepper = _sode.Taylor15_imp
        N_dw = 2

        @property
        def options(self):
            """
            Supported options by Implicit Order 1.5 strong Taylor Stochastic
            Integrators:

            dt : float, default: 0.001
                Internal time step.

            tol : float, default: 1e-10
                Tolerance for the time steps.

            solve_method : str, default: None
                Method used for solver the ``Ax=b`` of the implicit step.
                Accept methods supported by :func:`qutip.core.data.solve`.
                When the system is constant, the inverse of the matrix ``A`` can be
                used by entering ``inv``.

            solve_options : dict, default: {}
                Options to pass to the call to :func:`qutip.core.data.solve`.

            derr_dt : float, default: 1e-6
                Finite time difference used to compute the derrivative of the
                hamiltonian and ``sc_ops``.
            """
            return self._options

        @options.setter
        def options(self, new_options):
            _Implicit_Simple_Integrator.options.fset(self, new_options)

    StochasticSolver.add_integrator(EulerSODE, "euler")
    StochasticSolver.add_integrator(Explicit1_5_SODE, "explicit1.5")
    SMESolver.add_integrator(Taylor1_5_SODE, "taylor1.5")
    SMESolver.add_integrator(Milstein_SODE, "milstein")
    SMESolver.add_integrator(Implicit_Milstein_SODE, "milstein_imp")
    SMESolver.add_integrator(Implicit_Taylor1_5_SODE, "taylor1.5_imp")