Source code for cosapp.core.numerics.solve.root
from __future__ import annotations
import logging
from typing import (
Any, Callable, Dict, Optional,
Sequence, Tuple, TypeVar, Union,
)
import numpy
from scipy import optimize
from cosapp.core.numerics.basics import SolverResults
from cosapp.core.numerics.enum import NonLinearMethods
from .non_linear_solver import (
AbstractNonLinearSolver,
NewtonRaphsonSolver,
ScipyRootSolver,
)
logger = logging.getLogger(__name__)
ConcreteSolver = TypeVar("ConcreteSolver", bound=AbstractNonLinearSolver)
RootFunction = Callable[[Sequence[float], Any], numpy.ndarray]
[docs]
def root(
fun: RootFunction,
x0: Sequence[float],
args: Tuple[Any] = tuple(),
method: NonLinearMethods = NonLinearMethods.POWELL,
options: Dict[str, Any] = {},
callback: Optional[Callable[[], None]] = None,
) -> Union[SolverResults, optimize.OptimizeResult]:
if method == NonLinearMethods.NR:
solver = NewtonRaphsonSolver.from_options(options)
else:
solver = ScipyRootSolver(method.value, **options)
solver.update_options(options)
return solver.solve(fun, x0, args, callback=callback)