conspire/math/optimize/globalization/line_search/none/
mod.rs1use 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#[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}