Skip to main content

conspire/math/optimize/globalization/line_search/none/
mod.rs

1use super::{LineSearchError, ObjectiveMerit, ResidualMerit};
2use crate::math::{Erase, Jacobian, Quantity, Scalar, Solution, Tensor};
3use std::{
4    fmt::{self, Display, Formatter},
5    ops::Mul,
6};
7
8/// No line search.
9#[derive(Clone, Copy, Debug, Default)]
10pub struct NoSearch;
11
12impl Display for NoSearch {
13    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
14        write!(f, "NoSearch")
15    }
16}
17
18impl ObjectiveMerit for NoSearch {
19    const SEARCHES: bool = false;
20    const MERIT: bool = false;
21    fn search<X, J, D, W, E>(
22        &self,
23        _function: impl FnMut(&X, Scalar) -> Result<Scalar, String>,
24        _jacobian: impl FnMut(&X) -> Result<J, String>,
25        _argument: &X,
26        _jacobian0: &J,
27        _decrement: &D,
28        step_size: Scalar,
29    ) -> Result<Scalar, LineSearchError>
30    where
31        J: Erase<Erased = E> + Jacobian,
32        D: Erase<Erased = E>,
33        E: Tensor,
34        X: Solution,
35        for<'a> &'a D: Mul<Quantity<W>, Output = X>,
36    {
37        Ok(step_size)
38    }
39    fn search_merit(
40        &self,
41        _merit: impl FnMut(Scalar) -> Result<Scalar, String>,
42        _value: Scalar,
43        _slope: Scalar,
44        step_size: Scalar,
45    ) -> Result<Scalar, LineSearchError> {
46        Ok(step_size)
47    }
48}
49
50impl ResidualMerit for NoSearch {
51    const SEARCHES: bool = false;
52    const MERIT: bool = false;
53    fn search_residual(
54        &self,
55        _merit: impl FnMut(Scalar) -> Result<Scalar, String>,
56        _value: Scalar,
57        _fraction: Scalar,
58    ) -> Result<Scalar, LineSearchError> {
59        Ok(1.0)
60    }
61}