Mon, 05 Oct 2026 20:20:00 -0500
Subdifferential discrepancy calculation scaling fix for sliding PDPS
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
1 | /*! |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
2 | Regularisation terms |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
3 | */ |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
4 | |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
5 | #[allow(unused_imports)] // Used by documentation. |
| 89 | 6 | use crate::fb::pointsource_fb_dom; |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
7 | use crate::fb::InsertionConfig; |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
8 | use crate::measures::{DeltaMeasure, DiscreteMeasure, Radon, RNDM}; |
| 32 | 9 | #[allow(unused_imports)] // Used by documentation. |
| 89 | 10 | use crate::sliding_fb::pointsource_sliding_fb; |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
11 | use crate::types::*; |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
12 | use alg_tools::instance::{Instance, Space}; |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
13 | use alg_tools::linops::Mapping; |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
14 | use alg_tools::loc::Loc; |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
15 | use alg_tools::norms::Norm; |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
16 | use numeric_literals::replace_float_literals; |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
17 | use serde::{Deserialize, Serialize}; |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
18 | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
19 | use crate::subproblem::{ |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
20 | l1squared_nonneg::l1squared_nonneg, l1squared_unconstrained::l1squared_unconstrained, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
21 | nonneg::quadratic_nonneg, unconstrained::quadratic_unconstrained, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
22 | }; |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
23 | use alg_tools::bounds::{Bounds, MinMaxMapping}; |
| 32 | 24 | use alg_tools::iterate::AlgIteratorFactory; |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
25 | use alg_tools::nalgebra_support::ToNalgebraRealField; |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
26 | use nalgebra::{DMatrix, DVector}; |
| 32 | 27 | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
28 | use std::cmp::Ordering::{Equal, Greater, Less}; |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
29 | |
| 89 | 30 | /// The regularisation term $α\\|μ\\|\_{ℳ(Ω)} + δ_{≥ 0}(μ)$ for [`pointsource_fb_dom`] and other |
| 32 | 31 | /// algorithms. |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
32 | /// |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
33 | /// The only member of the struct is the regularisation parameter α. |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
34 | #[derive(Copy, Clone, Debug, Serialize, Deserialize)] |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
35 | pub struct NonnegRadonRegTerm<F: Float = f64>(pub F /* α */); |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
36 | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
37 | impl<'a, F: Float> NonnegRadonRegTerm<F> { |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
38 | /// Returns the regularisation parameter |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
39 | pub fn α(&self) -> F { |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
40 | let &NonnegRadonRegTerm(α) = self; |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
41 | α |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
42 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
43 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
44 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
45 | impl<'a, F: Float, const N: usize> Mapping<RNDM<N, F>> for NonnegRadonRegTerm<F> { |
| 35 | 46 | type Codomain = F; |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
47 | |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
48 | fn apply<I>(&self, μ: I) -> F |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
49 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
50 | I: Instance<RNDM<N, F>>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
51 | { |
| 35 | 52 | self.α() * μ.eval(|x| x.norm(Radon)) |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
53 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
54 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
55 | |
| 32 | 56 | /// The regularisation term $α\|μ\|_{ℳ(Ω)}$ for [`pointsource_fb_reg`]. |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
57 | /// |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
58 | /// The only member of the struct is the regularisation parameter α. |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
59 | #[derive(Copy, Clone, Debug, Serialize, Deserialize)] |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
60 | pub struct RadonRegTerm<F: Float = f64>(pub F /* α */); |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
61 | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
62 | impl<'a, F: Float> RadonRegTerm<F> { |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
63 | /// Returns the regularisation parameter |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
64 | pub fn α(&self) -> F { |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
65 | let &RadonRegTerm(α) = self; |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
66 | α |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
67 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
68 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
69 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
70 | impl<'a, F: Float, const N: usize> Mapping<RNDM<N, F>> for RadonRegTerm<F> { |
| 35 | 71 | type Codomain = F; |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
72 | |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
73 | fn apply<I>(&self, μ: I) -> F |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
74 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
75 | I: Instance<RNDM<N, F>>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
76 | { |
| 35 | 77 | self.α() * μ.eval(|x| x.norm(Radon)) |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
78 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
79 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
80 | |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
81 | /// Regularisation term configuration |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
82 | #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)] |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
83 | pub enum Regularisation<F: Float = f64> { |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
84 | /// $α \\|μ\\|\_{ℳ(Ω)}$ |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
85 | Radon(F), |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
86 | /// $α\\|μ\\|\_{ℳ(Ω)} + δ_{≥ 0}(μ)$ |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
87 | NonnegRadon(F), |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
88 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
89 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
90 | impl<'a, F: Float, const N: usize> Mapping<RNDM<N, F>> for Regularisation<F> { |
| 35 | 91 | type Codomain = F; |
| 92 | ||
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
93 | fn apply<I>(&self, μ: I) -> F |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
94 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
95 | I: Instance<RNDM<N, F>>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
96 | { |
|
24
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
97 | match *self { |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
98 | Self::Radon(α) => RadonRegTerm(α).apply(μ), |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
99 | Self::NonnegRadon(α) => NonnegRadonRegTerm(α).apply(μ), |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
100 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
101 | } |
|
d29d1fcf5423
Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
102 | } |
| 32 | 103 | |
| 35 | 104 | /// Abstraction of regularisation terms. |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
105 | pub trait RegTerm<Domain, F = f64>: Mapping<DiscreteMeasure<Domain, F>, Codomain = F> |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
106 | where |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
107 | Domain: Space + Clone, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
108 | F: Float + ToNalgebraRealField, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
109 | { |
| 32 | 110 | /// Approximately solve the problem |
| 111 | /// <div>$$ | |
| 112 | /// \min_{x ∈ ℝ^n} \frac{1}{2} x^⊤Ax - g^⊤ x + τ G(x) | |
| 113 | /// $$</div> | |
| 114 | /// for $G$ depending on the trait implementation. | |
| 115 | /// | |
| 116 | /// The parameter `mA` is $A$. An estimate for its opeator norm should be provided in | |
| 117 | /// `mA_normest`. The initial iterate and output is `x`. The current main tolerance is `ε`. | |
| 118 | /// | |
| 119 | /// Returns the number of iterations taken. | |
| 120 | fn solve_findim( | |
| 121 | &self, | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
122 | mA: &DMatrix<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
123 | g: &DVector<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
124 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
125 | x: &mut DVector<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
126 | mA_normest: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
127 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
128 | config: &InsertionConfig<F>, |
| 32 | 129 | ) -> usize; |
| 130 | ||
| 131 | /// Find a point where `d` may violate the tolerance `ε`. | |
| 132 | /// | |
| 133 | /// If `skip_by_rough_check` is set, do not find the point if a rough check indicates that we | |
| 134 | /// are in bounds. `ε` is the current main tolerance and `τ` a scaling factor for the | |
| 135 | /// regulariser. | |
| 136 | /// | |
| 137 | /// Returns `None` if `d` is in bounds either based on the rough check, or a more precise check | |
| 138 | /// terminating early. Otherwise returns a possibly violating point, the value of `d` there, | |
| 139 | /// and a boolean indicating whether the found point is in bounds. | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
140 | fn find_tolerance_violation<M>( |
| 32 | 141 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
142 | d: &mut M, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
143 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
144 | ε: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
145 | skip_by_rough_check: bool, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
146 | config: &InsertionConfig<F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
147 | ) -> Option<(Domain, F, bool)> |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
148 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
149 | M: MinMaxMapping<Domain, F>; |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
150 | |
|
98
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
151 | /// Returns the minimum distance of the subdifferential of $τ[F+R]$ to zero, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
152 | /// where $F$ is the smooth data term (differential given in `τv/τ`), and $R$ is |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
153 | /// this regulariser. |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
154 | fn discrepancy<M>( |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
155 | &self, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
156 | τv: &mut M, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
157 | τ: F, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
158 | ε: F, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
159 | μ: &DiscreteMeasure<Domain, F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
160 | config: &InsertionConfig<F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
161 | ) -> F |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
162 | where |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
163 | M: MinMaxMapping<Domain, F>; |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
164 | |
| 32 | 165 | /// Verify that `d` is in bounds `ε` for a merge candidate `μ` |
| 166 | /// | |
| 167 | /// `ε` is the current main tolerance and `τ` a scaling factor for the regulariser. | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
168 | fn verify_merge_candidate<M>( |
| 32 | 169 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
170 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
171 | μ: &DiscreteMeasure<Domain, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
172 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
173 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
174 | config: &InsertionConfig<F>, |
| 32 | 175 | ) -> bool |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
176 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
177 | M: MinMaxMapping<Domain, F>; |
| 32 | 178 | |
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
179 | /// Returns a scaling factor for the tolerance sequence. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
180 | /// |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
181 | /// Typically this is the regularisation parameter. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
182 | fn tolerance_scaling(&self) -> F; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
183 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
184 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
185 | /// Regularisation term that can be used with [`crate::prox_penalty::radon_squared::RadonSquared`] |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
186 | /// proximal penalty. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
187 | pub trait RadonSquaredRegTerm<Domain, F = f64>: RegTerm<Domain, F> |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
188 | where |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
189 | Domain: Space + Clone, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
190 | F: Float + ToNalgebraRealField, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
191 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
192 | /// Adapt weights of μ, possibly insertion a new point at tolerance_violation (which should |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
193 | /// be returned by [`RegTerm::find_tolerance_violation`]. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
194 | fn solve_oc_radonsq<M>( |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
195 | &self, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
196 | μ: &mut DiscreteMeasure<Domain, F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
197 | τv: &mut M, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
198 | τ: F, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
199 | ε: F, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
200 | tolerance_violation: Option<(Domain, F, bool)>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
201 | config: &InsertionConfig<F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
202 | stats: &mut IterInfo<F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
203 | ) where |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
204 | M: Mapping<Domain, Codomain = F>; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
205 | |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
206 | /// Verify that `d` is in bounds `ε` for a merge candidate `μ` |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
207 | /// |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
208 | /// This version is s used for Radon-norm squared proximal term in |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
209 | /// [`crate::prox_penalty::radon_squared`]. |
| 35 | 210 | /// The [measures][crate::measures::DiscreteMeasure] `μ` and `radon_μ` are supposed to have |
| 211 | /// same coordinates at same agreeing indices. | |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
212 | /// |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
213 | /// `ε` is the current main tolerance and `τ` a scaling factor for the regulariser. |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
214 | fn verify_merge_candidate_radonsq<M>( |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
215 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
216 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
217 | μ: &DiscreteMeasure<Domain, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
218 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
219 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
220 | config: &InsertionConfig<F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
221 | radon_μ: &DiscreteMeasure<Domain, F>, |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
222 | ) -> bool |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
223 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
224 | M: MinMaxMapping<Domain, F>; |
| 32 | 225 | } |
| 226 | ||
|
83
66b8ac0ebe00
Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents:
72
diff
changeset
|
227 | /// Abstraction of regularisation terms for [`pointsource_sliding_fb_dom`]. |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
228 | pub trait SlidingRegTerm<Domain, F = f64>: RegTerm<Domain, F> |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
229 | where |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
230 | Domain: Space + Clone, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
231 | F: Float + ToNalgebraRealField, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
232 | { |
| 32 | 233 | /// Calculate $τ[w(z) - w(y)]$ for some w in the subdifferential of the regularisation |
| 234 | /// term, such that $-ε ≤ τw - d ≤ ε$. | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
235 | fn goodness<M>( |
| 32 | 236 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
237 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
238 | μ: &DiscreteMeasure<Domain, F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
239 | y: &Domain, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
240 | z: &Domain, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
241 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
242 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
243 | config: &InsertionConfig<F>, |
| 32 | 244 | ) -> F |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
245 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
246 | M: MinMaxMapping<Domain, F>; |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
247 | |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
248 | /// Convert bound on the regulariser to a bound on the Radon norm |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
249 | fn radon_norm_bound(&self, b: F) -> F; |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
250 | |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
251 | /// Returns true if $v$ is within the pointwise range of the subdifferential |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
252 | fn subdiff_range(&self) -> Bounds<F>; |
| 32 | 253 | } |
| 254 | ||
| 255 | #[replace_float_literals(F::cast_from(literal))] | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
256 | impl<F: Float + ToNalgebraRealField, const N: usize> RegTerm<Loc<N, F>, F> |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
257 | for NonnegRadonRegTerm<F> |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
258 | { |
| 32 | 259 | fn solve_findim( |
| 260 | &self, | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
261 | mA: &DMatrix<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
262 | g: &DVector<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
263 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
264 | x: &mut DVector<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
265 | mA_normest: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
266 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
267 | config: &InsertionConfig<F>, |
| 32 | 268 | ) -> usize { |
| 269 | let inner_tolerance = ε * config.inner.tolerance_mult; | |
| 270 | let inner_it = config.inner.iterator_options.stop_target(inner_tolerance); | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
271 | quadratic_nonneg(mA, g, τ * self.α(), x, mA_normest, &config.inner, inner_it) |
| 32 | 272 | } |
| 273 | ||
| 274 | #[inline] | |
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
275 | fn find_tolerance_violation<M>( |
| 32 | 276 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
277 | d: &mut M, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
278 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
279 | ε: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
280 | skip_by_rough_check: bool, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
281 | config: &InsertionConfig<F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
282 | ) -> Option<(Loc<N, F>, F, bool)> |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
283 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
284 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
285 | { |
|
90
b471a13e3136
Added greedy insertion option, but does and actually really should not too much
Tuomo Valkonen <tuomov@iki.fi>
parents:
89
diff
changeset
|
286 | let τα = if config.greedy { 0.0 } else { τ * self.α() }; |
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
287 | let keep_above = -τα - ε; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
288 | let minimise_below = -τα - ε * config.insertion_cutoff_factor; |
| 32 | 289 | let refinement_tolerance = ε * config.refinement.tolerance_mult; |
| 290 | ||
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
291 | // If preliminary check indicates that we are in bounds, and if it otherwise matches |
| 32 | 292 | // the insertion strategy, skip insertion. |
| 35 | 293 | if skip_by_rough_check && d.bounds().lower() >= keep_above { |
| 32 | 294 | None |
| 295 | } else { | |
| 35 | 296 | // If the rough check didn't indicate no insertion needed, find minimising point. |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
297 | let res = d.minimise_below( |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
298 | minimise_below, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
299 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
300 | config.refinement.max_steps, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
301 | ); |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
302 | |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
303 | res.map(|(ξ, v_ξ)| (ξ, v_ξ, v_ξ >= keep_above)) |
| 32 | 304 | } |
| 305 | } | |
| 306 | ||
|
98
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
307 | fn discrepancy<M>( |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
308 | &self, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
309 | τv: &mut M, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
310 | τ: F, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
311 | ε: F, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
312 | μ: &DiscreteMeasure<Loc<N, F>, F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
313 | config: &InsertionConfig<F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
314 | ) -> F |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
315 | where |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
316 | M: MinMaxMapping<Loc<N, F>, F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
317 | { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
318 | let refinement_tolerance = ε * config.refinement.tolerance_mult; |
|
99
82e3cb274186
Subdifferential discrepancy calculation scaling fix for sliding PDPS
Tuomo Valkonen <tuomov@iki.fi>
parents:
98
diff
changeset
|
319 | let τα = self.α() * τ; |
|
98
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
320 | |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
321 | let μ_disrepancy = μ |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
322 | .iter_spikes() |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
323 | .map(|δ| { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
324 | let v = τv.apply(&δ.x); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
325 | if δ.α > 0.0 { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
326 | (v + τα).abs() |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
327 | } else { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
328 | (-v - τα).max(0.0) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
329 | } |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
330 | }) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
331 | .reduce(F::max) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
332 | .unwrap_or(0.0); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
333 | |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
334 | let (_, τv_min) = τv.minimise(refinement_tolerance, config.refinement.max_steps); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
335 | //let rest_discrepancy = (-d_min - self.α()).max(0.0); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
336 | //return rest_discrepancy.max(μ_disrepancy) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
337 | // Simplifies to |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
338 | return (-τv_min - τα).max(μ_disrepancy); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
339 | } |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
340 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
341 | fn verify_merge_candidate<M>( |
| 32 | 342 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
343 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
344 | μ: &RNDM<N, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
345 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
346 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
347 | config: &InsertionConfig<F>, |
| 32 | 348 | ) -> bool |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
349 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
350 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
351 | { |
| 32 | 352 | let τα = τ * self.α(); |
| 353 | let refinement_tolerance = ε * config.refinement.tolerance_mult; | |
| 354 | let merge_tolerance = config.merge_tolerance_mult * ε; | |
| 35 | 355 | let keep_above = -τα - merge_tolerance; |
| 356 | let keep_supp_below = -τα + merge_tolerance; | |
| 32 | 357 | let bnd = d.bounds(); |
| 358 | ||
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
359 | return (bnd.upper() <= keep_supp_below |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
360 | || μ |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
361 | .iter_spikes() |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
362 | .all(|&DeltaMeasure { α, ref x }| (α == 0.0) || d.apply(x) <= keep_supp_below)) |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
363 | && (bnd.lower() >= keep_above |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
364 | || d.has_lower_bound( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
365 | keep_above, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
366 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
367 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
368 | )); |
| 32 | 369 | } |
| 370 | ||
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
371 | fn tolerance_scaling(&self) -> F { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
372 | self.α() |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
373 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
374 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
375 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
376 | #[replace_float_literals(F::cast_from(literal))] |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
377 | impl<F: Float + ToNalgebraRealField, const N: usize> RadonSquaredRegTerm<Loc<N, F>, F> |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
378 | for NonnegRadonRegTerm<F> |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
379 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
380 | fn solve_oc_radonsq<M>( |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
381 | &self, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
382 | μ: &mut DiscreteMeasure<Loc<N, F>, F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
383 | τv: &mut M, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
384 | τ: F, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
385 | ε: F, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
386 | tolerance_violation: Option<(Loc<N, F>, F, bool)>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
387 | config: &InsertionConfig<F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
388 | stats: &mut IterInfo<F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
389 | ) where |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
390 | M: Mapping<Loc<N, F>, Codomain = F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
391 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
392 | let τα = τ * self.α(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
393 | let mut g: Vec<_> = μ |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
394 | .iter_locations() |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
395 | .map(|ζ| F::to_nalgebra_mixed(-τv.apply(ζ))) |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
396 | .collect(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
397 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
398 | let new_spike_initial_weight = if let Some((ξ, v_ξ, _in_bounds)) = tolerance_violation { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
399 | // Don't insert if existing spikes are almost as good |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
400 | if g.iter().all(|minus_τv| { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
401 | -F::from_nalgebra_mixed(*minus_τv) > v_ξ + ε * config.refinement.tolerance_mult |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
402 | }) { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
403 | // Weight is found out by running the finite-dimensional optimisation algorithm |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
404 | // above |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
405 | // NOTE: cannot set α here before y is extracted |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
406 | *μ += DeltaMeasure { x: ξ, α: 0.0 /*-v_ξ - τα*/ }; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
407 | g.push(F::to_nalgebra_mixed(-v_ξ)); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
408 | Some(-v_ξ - τα) |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
409 | } else { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
410 | None |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
411 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
412 | } else { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
413 | None |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
414 | }; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
415 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
416 | // Optimise weights |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
417 | if μ.len() > 0 { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
418 | // Form finite-dimensional subproblem. The subproblem references to the original μ^k |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
419 | // from the beginning of the iteration are all contained in the immutable c and g. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
420 | // TODO: observe negation of -τv after switch from minus_τv: finite-dimensional |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
421 | // problems have not yet been updated to sign change. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
422 | let y = μ.masses_dvector(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
423 | let mut x = y.clone(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
424 | let g_na = DVector::from_vec(g); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
425 | if let (Some(β), Some(dest)) = (new_spike_initial_weight, x.as_mut_slice().last_mut()) |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
426 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
427 | *dest = F::to_nalgebra_mixed(β); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
428 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
429 | // Solve finite-dimensional subproblem. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
430 | let inner_tolerance = ε * config.inner.tolerance_mult; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
431 | let inner_it = config.inner.iterator_options.stop_target(inner_tolerance); |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
432 | stats.inner_iters += l1squared_nonneg(&y, &g_na, τα, &mut x, &config.inner, inner_it); |
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
433 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
434 | // Update masses of μ based on solution of finite-dimensional subproblem. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
435 | μ.set_masses_dvector(&x); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
436 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
437 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
438 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
439 | fn verify_merge_candidate_radonsq<M>( |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
440 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
441 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
442 | μ: &RNDM<N, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
443 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
444 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
445 | config: &InsertionConfig<F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
446 | radon_μ: &RNDM<N, F>, |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
447 | ) -> bool |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
448 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
449 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
450 | { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
451 | let τα = τ * self.α(); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
452 | let refinement_tolerance = ε * config.refinement.tolerance_mult; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
453 | let merge_tolerance = config.merge_tolerance_mult * ε; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
454 | let slack = radon_μ.norm(Radon); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
455 | let bnd = d.bounds(); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
456 | |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
457 | return { |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
458 | μ.both_matching(radon_μ).all(|(α, rα, x)| { |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
459 | let v = -d.apply(x); // TODO: observe ad hoc negation here, after minus_τv |
| 35 | 460 | // switch to τv. |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
461 | let (l1, u1) = match α.total_cmp(&0.0) { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
462 | Greater => (τα, τα), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
463 | _ => (F::NEG_INFINITY, τα), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
464 | // Less should not happen; treated as Equal |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
465 | }; |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
466 | let (l2, u2) = match rα.total_cmp(&0.0) { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
467 | Greater => (slack, slack), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
468 | Equal => (-slack, slack), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
469 | Less => (-slack, -slack), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
470 | }; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
471 | // TODO: both fail. |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
472 | (l1 + l2 - merge_tolerance <= v) && (v <= u1 + u2 + merge_tolerance) |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
473 | }) |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
474 | } && { |
| 35 | 475 | let keep_above = -τα - slack - merge_tolerance; |
| 476 | bnd.lower() <= keep_above | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
477 | || d.has_lower_bound( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
478 | keep_above, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
479 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
480 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
481 | ) |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
482 | }; |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
483 | } |
| 32 | 484 | } |
| 485 | ||
| 486 | #[replace_float_literals(F::cast_from(literal))] | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
487 | impl<F: Float + ToNalgebraRealField, const N: usize> SlidingRegTerm<Loc<N, F>, F> |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
488 | for NonnegRadonRegTerm<F> |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
489 | { |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
490 | fn goodness<M>( |
| 32 | 491 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
492 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
493 | _μ: &RNDM<N, F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
494 | y: &Loc<N, F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
495 | z: &Loc<N, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
496 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
497 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
498 | _config: &InsertionConfig<F>, |
| 32 | 499 | ) -> F |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
500 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
501 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
502 | { |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
503 | let w = |x| 1.0.min((ε + d.apply(x)) / (τ * self.α())); |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
504 | w(z) - w(y) |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
505 | } |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
506 | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
507 | fn radon_norm_bound(&self, b: F) -> F { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
508 | b / self.α() |
| 32 | 509 | } |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
510 | |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
511 | fn subdiff_range(&self) -> Bounds<F> { |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
512 | Bounds(F::NEG_INFINITY, self.α()) |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
513 | } |
| 32 | 514 | } |
| 515 | ||
| 516 | #[replace_float_literals(F::cast_from(literal))] | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
517 | impl<F: Float + ToNalgebraRealField, const N: usize> RegTerm<Loc<N, F>, F> for RadonRegTerm<F> { |
| 32 | 518 | fn solve_findim( |
| 519 | &self, | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
520 | mA: &DMatrix<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
521 | g: &DVector<F::MixedType>, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
522 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
523 | x: &mut DVector<F::MixedType>, |
| 32 | 524 | mA_normest: F, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
525 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
526 | config: &InsertionConfig<F>, |
| 32 | 527 | ) -> usize { |
| 528 | let inner_tolerance = ε * config.inner.tolerance_mult; | |
| 529 | let inner_it = config.inner.iterator_options.stop_target(inner_tolerance); | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
530 | quadratic_unconstrained(mA, g, τ * self.α(), x, mA_normest, &config.inner, inner_it) |
| 32 | 531 | } |
| 532 | ||
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
533 | fn find_tolerance_violation<M>( |
| 32 | 534 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
535 | d: &mut M, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
536 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
537 | ε: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
538 | skip_by_rough_check: bool, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
539 | config: &InsertionConfig<F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
540 | ) -> Option<(Loc<N, F>, F, bool)> |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
541 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
542 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
543 | { |
|
90
b471a13e3136
Added greedy insertion option, but does and actually really should not too much
Tuomo Valkonen <tuomov@iki.fi>
parents:
89
diff
changeset
|
544 | let τα = if config.greedy { 0.0 } else { τ * self.α() }; |
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
545 | let keep_below = τα + ε; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
546 | let keep_above = -τα - ε; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
547 | let maximise_above = τα + ε * config.insertion_cutoff_factor; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
548 | let minimise_below = -τα - ε * config.insertion_cutoff_factor; |
| 32 | 549 | let refinement_tolerance = ε * config.refinement.tolerance_mult; |
| 550 | ||
| 551 | // If preliminary check indicates that we are in bonds, and if it otherwise matches | |
| 552 | // the insertion strategy, skip insertion. | |
| 553 | if skip_by_rough_check && Bounds(keep_above, keep_below).superset(&d.bounds()) { | |
| 554 | None | |
| 555 | } else { | |
| 556 | // If the rough check didn't indicate no insertion needed, find maximising point. | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
557 | let mx = d.maximise_above( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
558 | maximise_above, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
559 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
560 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
561 | ); |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
562 | let mi = d.minimise_below( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
563 | minimise_below, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
564 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
565 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
566 | ); |
| 32 | 567 | |
| 568 | match (mx, mi) { | |
| 569 | (None, None) => None, | |
| 570 | (Some((ξ, v_ξ)), None) => Some((ξ, v_ξ, keep_below >= v_ξ)), | |
| 571 | (None, Some((ζ, v_ζ))) => Some((ζ, v_ζ, keep_above <= v_ζ)), | |
| 572 | (Some((ξ, v_ξ)), Some((ζ, v_ζ))) => { | |
| 573 | if v_ξ - τα > τα - v_ζ { | |
| 574 | Some((ξ, v_ξ, keep_below >= v_ξ)) | |
| 575 | } else { | |
| 576 | Some((ζ, v_ζ, keep_above <= v_ζ)) | |
| 577 | } | |
| 578 | } | |
| 579 | } | |
| 580 | } | |
| 581 | } | |
| 582 | ||
|
98
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
583 | fn discrepancy<M>( |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
584 | &self, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
585 | τv: &mut M, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
586 | τ: F, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
587 | ε: F, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
588 | μ: &DiscreteMeasure<Loc<N, F>, F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
589 | config: &InsertionConfig<F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
590 | ) -> F |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
591 | where |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
592 | M: MinMaxMapping<Loc<N, F>, F>, |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
593 | { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
594 | use std::cmp::Ordering::*; |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
595 | let refinement_tolerance = ε * config.refinement.tolerance_mult; |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
596 | let τα = τ * self.α(); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
597 | |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
598 | let threshold = |v: F, α: F| { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
599 | if v > α { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
600 | v - α |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
601 | } else if v < -α { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
602 | -v - α |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
603 | } else { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
604 | 0.0 |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
605 | } |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
606 | }; |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
607 | |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
608 | let μ_disrepancy = μ |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
609 | .iter_spikes() |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
610 | .map(|δ| { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
611 | let v = τv.apply(&δ.x); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
612 | match δ.α.total_cmp(&0.0) { |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
613 | Greater => (v + τα).abs(), |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
614 | Less => (v - τα).abs(), |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
615 | Equal => threshold(v, τα), |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
616 | } |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
617 | }) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
618 | .reduce(F::max) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
619 | .unwrap_or(0.0); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
620 | |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
621 | let (_, τv_min) = τv.minimise(refinement_tolerance, config.refinement.max_steps); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
622 | let (_, τv_max) = τv.maximise(refinement_tolerance, config.refinement.max_steps); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
623 | //let rest_discrepancy = (-d_min - α).max(0.0); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
624 | //return rest_discrepancy.max(μ_disrepancy) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
625 | // Simplifies to |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
626 | return threshold(τv_min, τα) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
627 | .max(threshold(τv_max, τα)) |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
628 | .max(μ_disrepancy); |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
629 | } |
|
b9818eb24b47
Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents:
92
diff
changeset
|
630 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
631 | fn verify_merge_candidate<M>( |
| 32 | 632 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
633 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
634 | μ: &RNDM<N, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
635 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
636 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
637 | config: &InsertionConfig<F>, |
| 32 | 638 | ) -> bool |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
639 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
640 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
641 | { |
| 32 | 642 | let τα = τ * self.α(); |
| 643 | let refinement_tolerance = ε * config.refinement.tolerance_mult; | |
| 644 | let merge_tolerance = config.merge_tolerance_mult * ε; | |
| 645 | let keep_below = τα + merge_tolerance; | |
| 646 | let keep_above = -τα - merge_tolerance; | |
| 647 | let keep_supp_pos_above = τα - merge_tolerance; | |
| 648 | let keep_supp_neg_below = -τα + merge_tolerance; | |
| 649 | let bnd = d.bounds(); | |
| 650 | ||
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
651 | return ((bnd.lower() >= keep_supp_pos_above && bnd.upper() <= keep_supp_neg_below) |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
652 | || μ |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
653 | .iter_spikes() |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
654 | .all(|&DeltaMeasure { α: β, ref x }| match β.partial_cmp(&0.0) { |
| 32 | 655 | Some(Greater) => d.apply(x) >= keep_supp_pos_above, |
| 656 | Some(Less) => d.apply(x) <= keep_supp_neg_below, | |
| 657 | _ => true, | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
658 | })) |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
659 | && (bnd.upper() <= keep_below |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
660 | || d.has_upper_bound( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
661 | keep_below, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
662 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
663 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
664 | )) |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
665 | && (bnd.lower() >= keep_above |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
666 | || d.has_lower_bound( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
667 | keep_above, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
668 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
669 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
670 | )); |
| 32 | 671 | } |
| 672 | ||
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
673 | fn tolerance_scaling(&self) -> F { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
674 | self.α() |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
675 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
676 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
677 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
678 | #[replace_float_literals(F::cast_from(literal))] |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
679 | impl<F: Float + ToNalgebraRealField, const N: usize> RadonSquaredRegTerm<Loc<N, F>, F> |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
680 | for RadonRegTerm<F> |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
681 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
682 | fn solve_oc_radonsq<M>( |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
683 | &self, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
684 | μ: &mut DiscreteMeasure<Loc<N, F>, F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
685 | τv: &mut M, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
686 | τ: F, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
687 | ε: F, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
688 | tolerance_violation: Option<(Loc<N, F>, F, bool)>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
689 | config: &InsertionConfig<F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
690 | stats: &mut IterInfo<F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
691 | ) where |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
692 | M: Mapping<Loc<N, F>, Codomain = F>, |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
693 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
694 | let τα = τ * self.α(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
695 | let mut g: Vec<_> = μ |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
696 | .iter_locations() |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
697 | .map(|ζ| F::to_nalgebra_mixed(τv.apply(-ζ))) |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
698 | .collect(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
699 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
700 | let new_spike_initial_weight = if let Some((ξ, v_ξ, _in_bounds)) = tolerance_violation { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
701 | // Don't insert if existing spikes are almost as good |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
702 | let n = v_ξ.abs(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
703 | if g.iter().all(|minus_τv| { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
704 | F::from_nalgebra_mixed(*minus_τv).abs() < n - ε * config.refinement.tolerance_mult |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
705 | }) { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
706 | // Weight is found out by running the finite-dimensional optimisation algorithm |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
707 | // above |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
708 | // NOTE: cannot initialise α before y is extracted. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
709 | *μ += DeltaMeasure { x: ξ, α: 0.0 /*-(n + τα) * v_ξ.signum()*/ }; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
710 | g.push(F::to_nalgebra_mixed(-v_ξ)); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
711 | Some(-(n + τα) * v_ξ.signum()) |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
712 | } else { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
713 | None |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
714 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
715 | } else { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
716 | None |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
717 | }; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
718 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
719 | // Optimise weights |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
720 | if μ.len() > 0 { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
721 | // Form finite-dimensional subproblem. The subproblem references to the original μ^k |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
722 | // from the beginning of the iteration are all contained in the immutable c and g. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
723 | // TODO: observe negation of -τv after switch from minus_τv: finite-dimensional |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
724 | // problems have not yet been updated to sign change. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
725 | let y = μ.masses_dvector(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
726 | let mut x = y.clone(); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
727 | if let (Some(β), Some(dest)) = (new_spike_initial_weight, x.as_mut_slice().last_mut()) |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
728 | { |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
729 | *dest = F::to_nalgebra_mixed(β); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
730 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
731 | let g_na = DVector::from_vec(g); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
732 | // Solve finite-dimensional subproblem. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
733 | let inner_tolerance = ε * config.inner.tolerance_mult; |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
734 | let inner_it = config.inner.iterator_options.stop_target(inner_tolerance); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
735 | stats.inner_iters += |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
736 | l1squared_unconstrained(&y, &g_na, τα, &mut x, &config.inner, inner_it); |
|
63
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
737 | |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
738 | // Update masses of μ based on solution of finite-dimensional subproblem. |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
739 | μ.set_masses_dvector(&x); |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
740 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
741 | } |
|
7a8a55fd41c0
Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
742 | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
743 | fn verify_merge_candidate_radonsq<M>( |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
744 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
745 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
746 | μ: &RNDM<N, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
747 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
748 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
749 | config: &InsertionConfig<F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
750 | radon_μ: &RNDM<N, F>, |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
751 | ) -> bool |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
752 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
753 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
754 | { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
755 | let τα = τ * self.α(); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
756 | let refinement_tolerance = ε * config.refinement.tolerance_mult; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
757 | let merge_tolerance = config.merge_tolerance_mult * ε; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
758 | let slack = radon_μ.norm(Radon); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
759 | let bnd = d.bounds(); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
760 | |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
761 | return { |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
762 | μ.both_matching(radon_μ).all(|(α, rα, x)| { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
763 | let v = d.apply(x); |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
764 | let (l1, u1) = match α.partial_cmp(&0.0).unwrap_or(Equal) { |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
765 | Greater => (τα, τα), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
766 | Equal => (-τα, τα), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
767 | Less => (-τα, -τα), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
768 | }; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
769 | let (l2, u2) = match rα.partial_cmp(&0.0).unwrap_or(Equal) { |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
770 | Greater => (slack, slack), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
771 | Equal => (-slack, slack), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
772 | Less => (-slack, -slack), |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
773 | }; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
774 | (l1 + l2 - merge_tolerance <= v) && (v <= u1 + u2 + merge_tolerance) |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
775 | }) |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
776 | } && { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
777 | let keep_below = τα + slack + merge_tolerance; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
778 | bnd.upper() <= keep_below |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
779 | || d.has_upper_bound( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
780 | keep_below, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
781 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
782 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
783 | ) |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
784 | } && { |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
785 | let keep_above = -τα - slack - merge_tolerance; |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
786 | bnd.lower() >= keep_above |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
787 | || d.has_lower_bound( |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
788 | keep_above, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
789 | refinement_tolerance, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
790 | config.refinement.max_steps, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
791 | ) |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
792 | }; |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
793 | } |
| 32 | 794 | } |
| 795 | ||
| 796 | #[replace_float_literals(F::cast_from(literal))] | |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
797 | impl<F: Float + ToNalgebraRealField, const N: usize> SlidingRegTerm<Loc<N, F>, F> |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
798 | for RadonRegTerm<F> |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
799 | { |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
800 | fn goodness<M>( |
| 32 | 801 | &self, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
802 | d: &mut M, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
803 | _μ: &RNDM<N, F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
804 | y: &Loc<N, F>, |
|
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
805 | z: &Loc<N, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
806 | τ: F, |
|
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
807 | ε: F, |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
808 | _config: &InsertionConfig<F>, |
| 32 | 809 | ) -> F |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
810 | where |
|
61
4f468d35fa29
General forward operators, separation of measures into own crate, and other architecture improvements to support the pointsource_pde crate.
Tuomo Valkonen <tuomov@iki.fi>
parents:
51
diff
changeset
|
811 | M: MinMaxMapping<Loc<N, F>, F>, |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
812 | { |
| 32 | 813 | let α = self.α(); |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
814 | let w = |x| { |
| 32 | 815 | let dx = d.apply(x); |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
816 | ((-ε + dx) / (τ * α)).max(1.0.min(ε + dx) / (τ * α)) |
| 32 | 817 | }; |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
818 | w(z) - w(y) |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
819 | } |
|
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
820 | |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
821 | fn radon_norm_bound(&self, b: F) -> F { |
|
34
efa60bc4f743
Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
822 | b / self.α() |
| 32 | 823 | } |
|
72
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
824 | |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
825 | fn subdiff_range(&self) -> Bounds<F> { |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
826 | let α = self.α(); |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
827 | Bounds(-α, α) |
|
e9a460a0e638
New simplified sliding a posteriori rule. Enable scaling heuristic from fixed `measure` crate. “Fast” spread Lipschitz factor fixes, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
828 | } |
|
51
0693cc9ba9f0
Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents:
35
diff
changeset
|
829 | } |