src/regularisation.rs

Wed, 07 Oct 2026 08:01:12 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Wed, 07 Oct 2026 08:01:12 -0500
changeset 100
9e0baf2143fb
parent 99
82e3cb274186
permissions
-rw-r--r--

Bump version

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
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 83
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
9 #[allow(unused_imports)] // Used by documentation.
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 83
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 83
diff changeset
30 /// The regularisation term $α\\|μ\\|\_{ℳ(Ω)} + δ_{≥ 0}(μ)$ for [`pointsource_fb_dom`] and other
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
91 type Codomain = F;
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
103
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
110 /// Approximately solve the problem
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
111 /// <div>$$
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
112 /// \min_{x ∈ ℝ^n} \frac{1}{2} x^⊤Ax - g^⊤ x + τ G(x)
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
113 /// $$</div>
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
114 /// for $G$ depending on the trait implementation.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
115 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
116 /// The parameter `mA` is $A$. An estimate for its opeator norm should be provided in
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
117 /// `mA_normest`. The initial iterate and output is `x`. The current main tolerance is `ε`.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
118 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
119 /// Returns the number of iterations taken.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
120 fn solve_findim(
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
129 ) -> usize;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
130
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
131 /// Find a point where `d` may violate the tolerance `ε`.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
132 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
133 /// If `skip_by_rough_check` is set, do not find the point if a rough check indicates that we
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
134 /// are in bounds. `ε` is the current main tolerance and `τ` a scaling factor for the
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
135 /// regulariser.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
136 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
137 /// Returns `None` if `d` is in bounds either based on the rough check, or a more precise check
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
138 /// terminating early. Otherwise returns a possibly violating point, the value of `d` there,
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
165 /// Verify that `d` is in bounds `ε` for a merge candidate `μ`
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
166 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
210 /// The [measures][crate::measures::DiscreteMeasure] `μ` and `radon_μ` are supposed to have
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
225 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
233 /// Calculate $τ[w(z) - w(y)]$ for some w in the subdifferential of the regularisation
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
253 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
254
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
259 fn solve_findim(
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
268 ) -> usize {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
269 let inner_tolerance = ε * config.inner.tolerance_mult;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
272 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
273
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
289 let refinement_tolerance = ε * config.refinement.tolerance_mult;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
292 // the insertion strategy, skip insertion.
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
293 if skip_by_rough_check && d.bounds().lower() >= keep_above {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
294 None
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
295 } else {
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
304 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
305 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
352 let τα = τ * self.α();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
353 let refinement_tolerance = ε * config.refinement.tolerance_mult;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
354 let merge_tolerance = config.merge_tolerance_mult * ε;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
355 let keep_above = -τα - merge_tolerance;
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
356 let keep_supp_below = -τα + merge_tolerance;
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
357 let bnd = d.bounds();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
369 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
475 let keep_above = -τα - slack - merge_tolerance;
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
484 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
485
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
514 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
515
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
518 fn solve_findim(
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
527 ) -> usize {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
528 let inner_tolerance = ε * config.inner.tolerance_mult;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
531 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
549 let refinement_tolerance = ε * config.refinement.tolerance_mult;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
550
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
551 // If preliminary check indicates that we are in bonds, and if it otherwise matches
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
552 // the insertion strategy, skip insertion.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
553 if skip_by_rough_check && Bounds(keep_above, keep_below).superset(&d.bounds()) {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
554 None
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
555 } else {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
567
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
568 match (mx, mi) {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
569 (None, None) => None,
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
570 (Some((ξ, v_ξ)), None) => Some((ξ, v_ξ, keep_below >= v_ξ)),
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
571 (None, Some((ζ, v_ζ))) => Some((ζ, v_ζ, keep_above <= v_ζ)),
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
572 (Some((ξ, v_ξ)), Some((ζ, v_ζ))) => {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
573 if v_ξ - τα > τα - v_ζ {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
574 Some((ξ, v_ξ, keep_below >= v_ξ))
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
575 } else {
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
576 Some((ζ, v_ζ, keep_above <= v_ζ))
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
577 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
578 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
579 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
580 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
581 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
642 let τα = τ * self.α();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
643 let refinement_tolerance = ε * config.refinement.tolerance_mult;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
644 let merge_tolerance = config.merge_tolerance_mult * ε;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
645 let keep_below = τα + merge_tolerance;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
646 let keep_above = -τα - merge_tolerance;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
647 let keep_supp_pos_above = τα - merge_tolerance;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
648 let keep_supp_neg_below = -τα + merge_tolerance;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
649 let bnd = d.bounds();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
655 Some(Greater) => d.apply(x) >= keep_supp_pos_above,
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
656 Some(Less) => d.apply(x) <= keep_supp_neg_below,
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
671 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
794 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
795
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
813 let α = self.α();
34
efa60bc4f743 Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
814 let w = |x| {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 24
diff changeset
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 }

mercurial