src/sliding_pdps.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

35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Solver for the point source localisation problem using a sliding
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 primal-dual proximal splitting method.
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 */
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
6 use crate::domain::{AdmissibleDomain, FullSpace};
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: 49
diff changeset
7 use crate::fb::*;
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: 49
diff changeset
8 use crate::forward_model::{BoundedCurvature, BoundedCurvatureGuess};
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: 49
diff changeset
9 use crate::measures::merging::SpikeMerging;
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
10 use crate::measures::DiscreteMeasure;
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: 49
diff changeset
11 use crate::plot::Plotter;
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: 68
diff changeset
12 use crate::prox_penalty::StepLengthBoundPair;
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: 49
diff changeset
13 use crate::regularisation::SlidingRegTerm;
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: 68
diff changeset
14 use crate::sliding_fb::{SlidingFBConfig, Transport, TransportConfig, TransportProxPenalty};
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: 49
diff changeset
15 use crate::types::*;
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: 68
diff changeset
16 use alg_tools::bounds::MinMaxMapping;
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: 49
diff changeset
17 use alg_tools::convex::{Conjugable, Prox, Zero};
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: 49
diff changeset
18 use alg_tools::direct_product::Pair;
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: 49
diff changeset
19 use alg_tools::error::DynResult;
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: 49
diff changeset
20 use alg_tools::euclidean::ClosedEuclidean;
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
21 use alg_tools::instance::{Instance, Space};
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: 49
diff changeset
22 use alg_tools::iterate::AlgIteratorFactory;
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: 49
diff changeset
23 use alg_tools::linops::{
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: 49
diff changeset
24 BoundedLinear, IdOp, SimplyAdjointable, StaticEuclideanOriginGenerator, ZeroOp, AXPY, GEMV,
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: 49
diff changeset
25 };
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
26 use alg_tools::mapping::DifferentiableMapping;
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: 49
diff changeset
27 use alg_tools::nalgebra_support::ToNalgebraRealField;
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
28 use alg_tools::norms::{Dist, Norm, L2};
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: 49
diff changeset
29 use anyhow::ensure;
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
30 use measures::{DeltaMeasure, Radon};
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 use numeric_literals::replace_float_literals;
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
32 use serde::{Deserialize, Serialize};
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 /// Settings for [`pointsource_sliding_pdps_pair`].
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 #[serde(default)]
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
37 pub struct SlidingPDPSConfig<F: Float> {
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: 49
diff changeset
38 /// Overall primal step length scaling.
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
39 pub τ0: 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: 49
diff changeset
40 /// Primal step length scaling for additional variable.
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
41 pub σp0: 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: 49
diff changeset
42 /// Dual step length scaling for additional variable.
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: 49
diff changeset
43 ///
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: 49
diff changeset
44 /// Taken zero for [`pointsource_sliding_fb_pair`].
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
45 pub σd0: F,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 /// Transport parameters
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
47 pub transport: TransportConfig<F>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /// Generic parameters
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: 49
diff changeset
49 pub insertion: 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: 49
diff changeset
50 /// Guess for curvature bound calculations.
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: 49
diff changeset
51 pub guess: BoundedCurvatureGuess,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 }
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 #[replace_float_literals(F::cast_from(literal))]
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
55 impl<F: Float> Default for SlidingPDPSConfig<F> {
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 fn default() -> Self {
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 SlidingPDPSConfig {
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
58 τ0: 0.99,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
59 σd0: 0.05,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
60 σp0: 0.99,
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: 49
diff changeset
61 transport: TransportConfig { θ0: 0.9, ..Default::default() },
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
62 insertion: Default::default(),
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: 49
diff changeset
63 guess: BoundedCurvatureGuess::BetterThanZero,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 }
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 }
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 }
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
68 type MeasureZ<F, Z, U> = Pair<DiscreteMeasure<U, F>, Z>;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 /// Iteratively solve the pointsource localisation with an additional variable
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 /// using sliding primal-dual proximal splitting
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 ///
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
73 /// The parametrisation is as for [`crate::forward_pdps::pointsource_forward_pdps_pair`],
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
74 /// except an additional domain restriction may be given.
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 #[replace_float_literals(F::cast_from(literal))]
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
76 pub fn pointsource_sliding_pdps_pair_dom<
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
77 F,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
78 I,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
79 S,
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: 49
diff changeset
80 Dat,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
81 Reg,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
82 P,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
83 Z,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
84 R,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
85 Y,
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: 49
diff changeset
86 Plot,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
87 /*KOpM, */ KOpZ,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
88 H,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
89 U,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 >(
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: 49
diff changeset
91 f: &Dat,
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: 49
diff changeset
92 reg: &Reg,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
93 prox_penalty: &P,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
94 config: &SlidingPDPSConfig<F>,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
95 iterator: I,
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: 49
diff changeset
96 mut plotter: Plot,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
97 (μ0, mut z, mut y): (Option<DiscreteMeasure<U, F>>, Z, Y),
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 //opKμ : KOpM,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
99 opKz: &KOpZ,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
100 fnR: &R,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
101 fnH: &H,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
102 domain: &mut impl AdmissibleDomain<U>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
103 ) -> DynResult<MeasureZ<F, Z, U>>
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 where
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
105 F: Float + ToNalgebraRealField,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
106 U: Space + Clone + Dist<L2, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
107 for<'a> &'a U: Instance<U>,
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: 49
diff changeset
108 I: AlgIteratorFactory<IterInfo<F>>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
109 Dat: DifferentiableMapping<MeasureZ<F, Z, U>, Codomain = F, DerivativeDomain = Pair<S, Z>>
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: 49
diff changeset
110 + BoundedCurvature<F>,
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
111 S: ClosedMul<F> + MinMaxMapping<U, 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: 49
diff changeset
112 for<'a> Pair<&'a P, &'a IdOp<Z>>: StepLengthBoundPair<F, Dat>,
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
113 DiscreteMeasure<U, F>: SpikeMerging<F> + Norm<Radon, F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
114 Reg: SlidingRegTerm<U, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
115 P: TransportProxPenalty<U, S, Reg, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
116 // KOpM : Linear<DiscreteMeasure<U, F>, Codomain=Y>
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
117 // + GEMV<F, DiscreteMeasure<U, F>>
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 // + Preadjointable<
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
119 // DiscreteMeasure<U, F>, Y,
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 36
diff changeset
120 // PreadjointCodomain = S,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 // >
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 // + TransportLipschitz<L2Squared, FloatType=F>
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
123 // + AdjointProductBoundedBy<DiscreteMeasure<U, F>, 𝒟, FloatType=F>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 // for<'b> KOpM::Preadjoint<'b> : GEMV<F, Y>,
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 // Since Z is Hilbert, we may just as well use adjoints for K_z.
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
126 KOpZ: BoundedLinear<Z, L2, L2, F, Codomain = Y>
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 + GEMV<F, Z>
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: 49
diff changeset
128 + SimplyAdjointable<Z, Y, AdjointCodomain = Z>,
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: 49
diff changeset
129 KOpZ::SimpleAdjoint: GEMV<F, Y>,
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: 49
diff changeset
130 Y: ClosedEuclidean<F>,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
131 for<'b> &'b Y: Instance<Y>,
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: 68
diff changeset
132 Z: ClosedEuclidean<F> + AXPY,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
133 for<'b> &'b Z: Instance<Z>,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
134 R: Prox<Z, Codomain = F>,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
135 H: Conjugable<Y, F, Codomain = F>,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
136 for<'b> H::Conjugate<'b>: Prox<Y>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
137 Plot: Plotter<P::ReturnMapping, S, DiscreteMeasure<U, F>>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 {
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 // Check parameters
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
140 ensure!(
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
141 config.τ0 > 0.0 && config.σp0 > 0.0,
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
142 //&& config.τ0 < 1.0 && config.σp0 < 1.0
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
143 "Invalid step length parameters"
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
144 );
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: 49
diff changeset
145 config.transport.check()?;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 // Initialise iterates
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: 49
diff changeset
148 let mut μ = μ0.unwrap_or_else(|| DiscreteMeasure::new());
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
149 let mut γ = Transport::new();
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: 49
diff changeset
150 //let zero_z = z.similar_origin();
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 // Set up parameters
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 // TODO: maybe this PairNorm doesn't make sense here?
41
b6bdb6cb4d44 Remove initial transport adaptation—it is not needed, after all
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
154 // let opAnorm = opA.opnorm_bound(PairNorm(Radon, L2, L2), L2);
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 let bigθ = 0.0; //opKμ.transport_lipschitz_factor(L2Squared);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 let bigM = 0.0; //opKμ.adjoint_product_bound(&op𝒟).unwrap().sqrt();
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: 49
diff changeset
157 let nKz = opKz.opnorm_bound(L2, L2)?;
66
fe47ad484deb Allow fitness merge when forward_pdps and sliding_pdps are used as forward-backward with aux variable.
Tuomo Valkonen <tuomov@iki.fi>
parents: 63
diff changeset
158 let is_fb = nKz == 0.0;
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: 49
diff changeset
159 let idOpZ = IdOp::new();
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: 49
diff changeset
160 let opKz_adj = opKz.adjoint();
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: 49
diff changeset
161 let (l, l_z) = Pair(prox_penalty, &idOpZ).step_length_bound_pair(&f)?;
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
162 let l_z_prime = if l_z == 0.0 {
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
163 1.0
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
164 } else {
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
165 ensure!(config.σp0 < 1.0);
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
166 l_z
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
167 };
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
168 let l_prime = if l == 0.0 {
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
169 1.0
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
170 } else {
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
171 ensure!(config.τ0 < 1.0);
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
172 l
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
173 };
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: 49
diff changeset
174
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
175 let (τ, σ_p, σ_d, κ) = if is_fb {
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
176 (config.τ0 / l_prime, config.σp0 / l_z_prime, 0.0, 0.0)
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
177 } else {
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
178 ensure!(
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
179 //config.τ0 < 1.0 &&
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
180 config.σp0 < 1.0 && config.σd0 > 0.0 && config.σp0 * config.σd0 <= 1.0,
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
181 "Invalid step length parameters"
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
182 );
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
183 // We need to satisfy
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
184 //
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
185 // τσ_dM(1-σ_p L_z)/(1 - τ L) + [σ_p L_z + σ_pσ_d‖K_z‖^2] < 1
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
186 // ^^^^^^^^^^^^^^^^^^^^^^^^^
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
187 // with 1 > σ_p L_z and 1 > τ L.
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
188 //
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
189 // To do so, we first solve σ_p and σ_d from standard PDPS step length condition
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
190 // ^^^^^ < 1. then we solve τ from the rest.
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
191 // If opKZ is the zero operator, then we set σ_d = 0 for τ to be calculated correctly below.
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
192 let σ_d = config.σd0 / nKz;
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
193 let σ_p = config.σp0 / (l_z_prime + config.σd0 * nKz);
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
194 // Observe that = 1 - ^^^^^^^^^^^^^^^^^^^^^ = 1 - σ_{p,0}
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
195 // We get the condition τσ_d M (1-σ_p L_z) < (1-σ_{p,0})*(1-τ L)
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
196 // ⟺ τ [ σ_d M (1-σ_p L_z) + (1-σ_{p,0}) L ] < (1-σ_{p,0})
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
197 let φ = 1.0 - config.σp0;
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
198 let a = 1.0 - σ_p * l_z_prime;
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
199 let τ = config.τ0 * φ / (σ_d * bigM * a + φ * l);
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
200 let ψ = 1.0 - τ * l_prime;
95
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
201 let β = σ_p * config.σd0 * nKz / a; // σ_p * σ_d * (nKz * nK_z) / a;
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
202 ensure!(β < 1.0);
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
203 // Now we need κ‖K_μ(π_♯^1 - π_♯^0)γ‖^2 ≤ (1/θ - τ[ℓ_F + ℓ]) ∫ c_2 dγ for κ defined as:
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
204 // The factor two in the manuscript disappears due to the definition of 𝚹 being
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
205 // for ‖x-y‖₂² instead of c_2(x, y)=‖x-y‖₂²/2.
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
206 let κ = τ * σ_d * ψ / ((1.0 - β) * ψ - τ * σ_d * bigM);
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
207 (τ, σ_p, σ_d, κ)
d9318317ccac Relax step length bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 93
diff changeset
208 };
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
209
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: 68
diff changeset
210 let mut τθ_or_adaptive = prox_penalty.get_transport_steplength(
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: 68
diff changeset
211 f.curvature_bound_components(config.guess),
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: 68
diff changeset
212 &config.transport,
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: 68
diff changeset
213 0.0,
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: 68
diff changeset
214 κ * bigθ / τ, // = 0 currently
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: 68
diff changeset
215 );
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: 68
diff changeset
216
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
217 // Acceleration is not currently supported
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
218 // let γ = dataterm.factor_of_strong_convexity();
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
219 let ω = 1.0;
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
220
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
221 // We multiply tolerance by τ for FB since our subproblems depending on tolerances are scaled
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
222 // by τ compared to the conditional gradient approach.
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
223 let tolerance = config.insertion.tolerance * τ * reg.tolerance_scaling();
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
224 let mut ε = tolerance.initial();
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
225
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
226 let starH = fnH.conjugate();
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
227
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
228 // Statistics
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
229 let full_stats = |μ: &DiscreteMeasure<U, F>, v: &mut S, z: &Z, dz: Z, ε, stats| {
99
82e3cb274186 Subdifferential discrepancy calculation scaling fix for sliding PDPS
Tuomo Valkonen <tuomov@iki.fi>
parents: 98
diff changeset
230 let discrepancy = τ * reg.discrepancy(v, 1.0, ε / τ, μ, &config.insertion);
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
231 let aux_discrepancy = is_fb.then(|| z.dist2(fnR.prox(σ_p, dz * (-σ_p) + z)));
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
232 let joint_discrepancy = aux_discrepancy
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
233 .map(|d| (discrepancy.powi(2) + τ * (2.0 / σ_p - l_z) * d.powi(2)).sqrt());
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
234 IterInfo {
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
235 value: f.apply(Pair(μ, z))
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
236 + fnR.apply(z)
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
237 + reg.apply(μ)
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
238 + fnH.apply(/* opKμ.apply(μ) + */ opKz.apply(z)),
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
239 n_spikes: μ.len(),
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
240 discrepancy: Some(discrepancy),
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
241 μ_norm: μ.norm(Radon),
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
242 aux_discrepancy,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
243 joint_discrepancy,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
244 ε,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
245 // postprocessing: config.insertion.postprocessing.then(|| μ.clone()),
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
246 ..stats
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
247 }
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
248 };
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
249 let mut stats = IterInfo::new();
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
250
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
251 let Pair(mut v, mut dz) = f.differential(Pair(&μ, &z));
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
252
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
253 // Run the algorithm
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
254 for state in iterator.iter_init(|| full_stats(&μ, &mut v, &z, dz, ε, stats.clone())) {
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
255 //opKμ.preadjoint().apply_add(&mut v, y);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
256 // We want to proceed as in Example 4.12 but with v and v̆ as in §5.
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
257 // With A(ν, z) = A_μ ν + A_z z, following Example 5.1, we have
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258 // P_ℳ[F'(ν, z) + Ξ(ν, z, y)]= A_ν^*[A_ν ν + A_z z] + K_μ ν = A_ν^*A(ν, z) + K_μ ν,
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
259 // where A_ν^* becomes a multiplier.
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
260 // This is much easier with K_μ = 0, which is the only reason why are enforcing it.
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
261 // TODO: Write a version of initial_transport that can deal with K_μ ≠ 0.
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
262
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: 49
diff changeset
263 //dbg!(&μ);
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: 49
diff changeset
264
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: 68
diff changeset
265 prox_penalty.initial_transport(
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: 68
diff changeset
266 &mut γ,
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: 68
diff changeset
267 &μ,
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: 68
diff changeset
268 ε,
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: 68
diff changeset
269 τ,
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: 68
diff changeset
270 &mut τθ_or_adaptive,
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: 68
diff changeset
271 &v,
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: 68
diff changeset
272 &config.transport,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
273 domain,
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: 68
diff changeset
274 );
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
275
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
276 let mut attempts = 0;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
277
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
278 // Solve finite-dimensional subproblem several times until the dual variable for the
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279 // regularisation term conforms to the assumptions made for the transport above.
97
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
280 let (mut τv̆, mut z̆, μ̆) = 'adapt_transport: loop {
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
281 // Set initial guess for μ=μ^{k+1}.
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
282 γ.μ̆_into(&mut μ);
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
283 let μ̆ = μ.clone();
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
284
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 // Calculate τv̆ = τA_*(A[μ_transported + μ_transported_base]-b)
97
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
286 let Pair(v̆, z̆) = f.differential(Pair(&μ̆, &z));
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: 68
diff changeset
287 let mut τv̆ = v̆ * τ;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
288 // opKμ.preadjoint().gemv(&mut τv̆, τ, y, 1.0);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
289
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
290 // Construct μ^{k+1} by solving finite-dimensional subproblems and insert new spikes.
75
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
291 prox_penalty.insert_and_reweigh(
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
292 &mut μ,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
293 &mut τv̆,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
294 τ,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
295 ε,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
296 &config.insertion,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
297 &reg,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
298 &state,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
299 &mut stats,
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: 49
diff changeset
300 )?;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
301
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
302 // A posteriori transport adaptation.
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: 68
diff changeset
303 if prox_penalty.aposteriori_transport(
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: 68
diff changeset
304 &mut γ,
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
305 &μ,
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
306 &μ̆,
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
307 &mut τ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: 68
diff changeset
308 &mut v,
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: 68
diff changeset
309 None, //Some(z_new.dist2(&z)),
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
310 ε,
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: 68
diff changeset
311 τ,
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: 68
diff changeset
312 &τθ_or_adaptive,
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: 68
diff changeset
313 reg,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
314 &config.transport,
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: 68
diff changeset
315 &config.insertion.refinement,
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
316 &mut attempts,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
317 ) {
97
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
318 break 'adapt_transport (τv̆, z̆, μ̆);
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
319 }
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
320 };
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
321
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
322 γ.get_transport_stats(&mut stats, &μ);
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
323
97
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
324 // Do z variable primal update
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
325 opKz_adj.apply_add(&mut z̆, &y);
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
326 z̆.axpy(1.0, &z, -σ_p);
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
327 let z_new = fnR.prox(σ_p, z̆);
f91f382ba4ae Small optimisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 96
diff changeset
328 //let z_new = fnR.prox(σ_p, z̆ * (-σ_p) + &z);
75
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
329 // Do dual update
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
330 // opKμ.gemv(&mut y, σ_d*(1.0 + ω), &μ, 1.0); // y = y + σ_d K[(1+ω)(μ,z)^{k+1}]
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
331 z.axpy(1.0 + ω, &z_new, -ω);
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
332 //z = (z - &z_new) * (-ω) + &z_new;
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
333 opKz.gemv(&mut y, σ_d, z, 1.0);
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
334 y = starH.prox(σ_d, y);
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
335 z = z_new;
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
336
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
337 // Merge spikes.
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
338 // This crucially expects the merge routine to be stable with respect to spike locations,
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
339 // and not to performing any pruning. That is be to done below simultaneously for γ.
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
340 let did_merge = config.insertion.if_merge_now(&state, |ins| {
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
341 stats.merged += prox_penalty.merge_spikes(
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
342 &mut μ,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
343 &mut τv̆,
63
7a8a55fd41c0 Subproblem solver and sliding adjustments/improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
344 &μ̆,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
345 τ,
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
346 ε,
78
2a122736e91c Add maximum iteration setting for scaling heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
347 ins,
49
6b0db7251ebe Some documentation and factor changes related to ℓ_F and ℓ_r.
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
348 &reg,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
349 Some(|μ̃: &DiscreteMeasure<U, F>| f.apply(Pair(μ̃, &z)) + reg.apply(μ̃)),
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
350 );
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
351 γ.prune_compat(&mut μ, &mut stats);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
352
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
353 if config.insertion.random_insertions {
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
354 if let Some(x) = domain.random_point() {
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
355 μ += DeltaMeasure { x, α: 0.0 };
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
356 stats.inserted += 1;
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
357 }
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: 68
diff changeset
358 }
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
359
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
360 for _ in 0..config.insertion.extra_weight_optimisation_steps {
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
361 // Do extra weight optimisation step heuristic
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
362 let Pair(v, mut _z_tmp) = f.differential(Pair(&μ, &z));
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
363 τv̆ = v * τ;
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
364 prox_penalty.reweigh(
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
365 &mut μ,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
366 &mut τv̆,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
367 τ,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
368 ε,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
369 &config.insertion,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
370 &reg,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
371 &state,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
372 &mut stats,
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
373 )?;
75
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
374
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
375 // opKz_adj.apply_add(&mut z_tmp, &y);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
376 // z_tmp.axpy(1.0, &z, -σ_p);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
377 // let z_new = fnR.prox(σ_p, z_tmp);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
378 // z.axpy(1.0 + ω, &z_new, -ω);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
379 // //z = (z - &z_new) * (-ω) + &z_new;
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
380 // opKz.gemv(&mut y, σ_d, z, 1.0);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
381 // y = starH.prox(σ_d, y);
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
382 // z = z_new;
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
383 }
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
384 Ok(())
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
385 })?;
75
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
386
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
387 if did_merge.is_none() {
75
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
388 γ.prune_compat(&mut μ, &mut stats);
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
389 }
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
390
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
391 // Update step length parameters
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
392 // let ω = pdpsconfig.acceleration.accelerate(&mut τ, &mut σ, γ);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
393
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
394 // Give statistics if requested
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
395 let iter = state.iteration();
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
396 stats.this_iters += 1;
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
397
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
398 Pair(v, dz) = f.differential(Pair(&μ, &z));
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
399
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
400 state.if_verbose(|| {
75
677a5fd1b014 Added an extra step heuristic
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
401 plotter.plot_spikes(iter, None, Some(&τv̆), &μ);
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
402 full_stats(
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
403 &μ,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
404 &mut v,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
405 &z,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
406 dz,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
407 ε,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
408 std::mem::replace(&mut stats, IterInfo::new()),
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
409 )
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
410 });
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
411
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
412 // Update main tolerance for next iteration
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
413 ε = tolerance.update(ε, iter);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
414 }
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
415
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
416 let fit = |μ̃: &DiscreteMeasure<U, 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: 49
diff changeset
417 f.apply(Pair(μ̃, &z)) /*+ fnR.apply(z) + reg.apply(μ)*/
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
418 + fnH.apply(/* opKμ.apply(&μ̃) + */ opKz.apply(&z))
84
edb5de5d5bd6 Minor merging adjustments
Tuomo Valkonen <tuomov@iki.fi>
parents: 83
diff changeset
419 + reg.apply(μ̃)
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
420 };
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
421
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
422 μ.merge_spikes_fitness(config.insertion.final_merging_method(), fit, |&v| v);
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
423 μ.prune();
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: 49
diff changeset
424 Ok(Pair(μ, z))
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
425 }
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: 49
diff changeset
426
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: 49
diff changeset
427 /// Iteratively solve the pointsource localisation with an additional variable
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: 49
diff changeset
428 /// using sliding forward-backward splitting.
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: 49
diff changeset
429 ///
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: 49
diff changeset
430 /// The implementation uses [`pointsource_sliding_pdps_pair`] with appropriate dummy
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: 49
diff changeset
431 /// variables, operators, and functions.
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: 49
diff changeset
432 #[replace_float_literals(F::cast_from(literal))]
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
433 pub fn pointsource_sliding_fb_pair_dom<F, I, S, Dat, Reg, P, Z, R, Plot, U>(
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
434 f: &Dat,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
435 reg: &Reg,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
436 prox_penalty: &P,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
437 config: &SlidingFBConfig<F>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
438 iterator: I,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
439 plotter: Plot,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
440 (μ0, z): (Option<DiscreteMeasure<U, F>>, Z),
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
441 //opKμ : KOpM,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
442 fnR: &R,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
443 domain: &mut impl AdmissibleDomain<U>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
444 ) -> DynResult<MeasureZ<F, Z, U>>
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
445 where
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
446 F: Float + ToNalgebraRealField,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
447 U: Space + Clone + Dist<L2, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
448 for<'a> &'a U: Instance<U>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
449 I: AlgIteratorFactory<IterInfo<F>>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
450 Dat: DifferentiableMapping<MeasureZ<F, Z, U>, Codomain = F, DerivativeDomain = Pair<S, Z>>
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
451 + BoundedCurvature<F>,
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
452 S: ClosedMul<F> + MinMaxMapping<U, F>,
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
453 DiscreteMeasure<U, F>: SpikeMerging<F> + Norm<Radon, F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
454 Reg: SlidingRegTerm<U, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
455 P: TransportProxPenalty<U, S, Reg, F>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
456 for<'a> Pair<&'a P, &'a IdOp<Z>>: StepLengthBoundPair<F, Dat>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
457 Z: ClosedEuclidean<F> + AXPY + Clone,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
458 for<'b> &'b Z: Instance<Z>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
459 R: Prox<Z, Codomain = F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
460 Plot: Plotter<P::ReturnMapping, S, DiscreteMeasure<U, F>>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
461 {
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
462 let opKz: ZeroOp<Z, Loc<0, F>, _, _, F> =
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
463 ZeroOp::new_dualisable(StaticEuclideanOriginGenerator, z.dual_origin());
96
5ba25d740dfc attempt to reduce trait bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 95
diff changeset
464 let fnH = Zero::<Loc<0, F>, F>::new();
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
465 // Convert config. We don't implement From (that could be done with the o2o crate), as σd0
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
466 // needs to be chosen in a general case; for the problem of this fucntion, anything is valid.
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
467 let &SlidingFBConfig { τ0, σp0, insertion, transport, guess } = config;
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
468 let pdps_config = SlidingPDPSConfig { τ0, σp0, insertion, transport, guess, σd0: 0.0 };
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
469
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
470 pointsource_sliding_pdps_pair_dom(
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
471 f,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
472 reg,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
473 prox_penalty,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
474 &pdps_config,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
475 iterator,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
476 plotter,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
477 (μ0, z, Loc([])),
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
478 &opKz,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
479 fnR,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
480 &fnH,
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
481 domain,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
482 )
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
483 }
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
484
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
485 #[deprecated]
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
486 /// Version of [`pointsource_sliding_pdps_pair`] without domain specification.
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
487 #[replace_float_literals(F::cast_from(literal))]
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
488 pub fn pointsource_sliding_pdps_pair<
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
489 F,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
490 I,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
491 S,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
492 Dat,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
493 Reg,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
494 P,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
495 Z,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
496 R,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
497 Y,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
498 Plot,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
499 /*KOpM, */ KOpZ,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
500 H,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
501 U,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
502 >(
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
503 f: &Dat,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
504 reg: &Reg,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
505 prox_penalty: &P,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
506 config: &SlidingPDPSConfig<F>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
507 iterator: I,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
508 plotter: Plot,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
509 init: (Option<DiscreteMeasure<U, F>>, Z, Y),
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
510 //opKμ : KOpM,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
511 opKz: &KOpZ,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
512 fnR: &R,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
513 fnH: &H,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
514 ) -> DynResult<MeasureZ<F, Z, U>>
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
515 where
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
516 F: Float + ToNalgebraRealField,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
517 U: Space + Clone + Dist<L2, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
518 for<'a> &'a U: Instance<U>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
519 I: AlgIteratorFactory<IterInfo<F>>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
520 Dat: DifferentiableMapping<MeasureZ<F, Z, U>, Codomain = F, DerivativeDomain = Pair<S, Z>>
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
521 + BoundedCurvature<F>,
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
522 S: ClosedMul<F> + MinMaxMapping<U, F>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
523 for<'a> Pair<&'a P, &'a IdOp<Z>>: StepLengthBoundPair<F, Dat>,
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
524 DiscreteMeasure<U, F>: SpikeMerging<F> + Norm<Radon, F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
525 Reg: SlidingRegTerm<U, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
526 P: TransportProxPenalty<U, S, Reg, F>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
527 KOpZ: BoundedLinear<Z, L2, L2, F, Codomain = Y>
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
528 + GEMV<F, Z>
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
529 + SimplyAdjointable<Z, Y, AdjointCodomain = Z>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
530 KOpZ::SimpleAdjoint: GEMV<F, Y>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
531 Y: ClosedEuclidean<F>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
532 for<'b> &'b Y: Instance<Y>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
533 Z: ClosedEuclidean<F> + AXPY,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
534 for<'b> &'b Z: Instance<Z>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
535 R: Prox<Z, Codomain = F>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
536 H: Conjugable<Y, F, Codomain = F>,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
537 for<'b> H::Conjugate<'b>: Prox<Y>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
538 Plot: Plotter<P::ReturnMapping, S, DiscreteMeasure<U, F>>,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
539 {
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
540 pointsource_sliding_pdps_pair_dom(
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
541 f,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
542 reg,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
543 prox_penalty,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
544 config,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
545 iterator,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
546 plotter,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
547 init,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
548 opKz,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
549 fnR,
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
550 fnH,
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
551 &mut FullSpace,
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
552 )
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
553 }
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
554
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
555 #[deprecated]
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
556 /// Version of [`pointsource_sliding_fb_pair_dom`] without domain specification
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
557 #[replace_float_literals(F::cast_from(literal))]
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
558 pub fn pointsource_sliding_fb_pair<F, I, S, Dat, Reg, P, Z, R, Plot, U>(
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: 49
diff changeset
559 f: &Dat,
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: 49
diff changeset
560 reg: &Reg,
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: 49
diff changeset
561 prox_penalty: &P,
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: 49
diff changeset
562 config: &SlidingFBConfig<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: 49
diff changeset
563 iterator: I,
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: 49
diff changeset
564 plotter: Plot,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
565 (μ0, z): (Option<DiscreteMeasure<U, F>>, Z),
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: 49
diff changeset
566 //opKμ : KOpM,
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: 49
diff changeset
567 fnR: &R,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
568 ) -> DynResult<MeasureZ<F, Z, U>>
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: 49
diff changeset
569 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: 49
diff changeset
570 F: Float + ToNalgebraRealField,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
571 U: Space + Clone + Dist<L2, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
572 for<'a> &'a U: Instance<U>,
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: 49
diff changeset
573 I: AlgIteratorFactory<IterInfo<F>>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
574 Dat: DifferentiableMapping<MeasureZ<F, Z, U>, Codomain = F, DerivativeDomain = Pair<S, Z>>
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: 49
diff changeset
575 + BoundedCurvature<F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
576 S: DifferentiableMapping<U, Codomain = F> + ClosedMul<F> + MinMaxMapping<U, F>,
98
b9818eb24b47 Store subdifferential discrepancy in log
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
577 DiscreteMeasure<U, F>: SpikeMerging<F> + Norm<Radon, F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
578 Reg: SlidingRegTerm<U, F>,
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
579 P: TransportProxPenalty<U, S, Reg, 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: 49
diff changeset
580 for<'a> Pair<&'a P, &'a IdOp<Z>>: StepLengthBoundPair<F, Dat>,
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: 49
diff changeset
581 Z: ClosedEuclidean<F> + AXPY + 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: 49
diff changeset
582 for<'b> &'b Z: Instance<Z>,
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: 49
diff changeset
583 R: Prox<Z, Codomain = F>,
93
8f1e57821d76 Generalise algorithms to arbitrary domains
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
584 Plot: Plotter<P::ReturnMapping, S, DiscreteMeasure<U, 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: 49
diff changeset
585 {
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: 49
diff changeset
586 let opKz: ZeroOp<Z, Loc<0, 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: 49
diff changeset
587 ZeroOp::new_dualisable(StaticEuclideanOriginGenerator, z.dual_origin());
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: 49
diff changeset
588 let fnH = Zero::new();
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: 49
diff changeset
589 // Convert config. We don't implement From (that could be done with the o2o crate), as σd0
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: 49
diff changeset
590 // needs to be chosen in a general case; for the problem of this fucntion, anything is valid.
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: 49
diff changeset
591 let &SlidingFBConfig { τ0, σp0, insertion, transport, guess } = config;
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: 49
diff changeset
592 let pdps_config = SlidingPDPSConfig { τ0, σp0, insertion, transport, guess, σd0: 0.0 };
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: 49
diff changeset
593
83
66b8ac0ebe00 Sliding methods now support domain restrictions
Tuomo Valkonen <tuomov@iki.fi>
parents: 81
diff changeset
594 pointsource_sliding_pdps_pair_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: 49
diff changeset
595 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: 49
diff changeset
596 reg,
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: 49
diff changeset
597 prox_penalty,
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: 49
diff changeset
598 &pdps_config,
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: 49
diff changeset
599 iterator,
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: 49
diff changeset
600 plotter,
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: 49
diff changeset
601 (μ0, z, Loc([])),
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: 49
diff changeset
602 &opKz,
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: 49
diff changeset
603 fnR,
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: 49
diff changeset
604 &fnH,
89
8d1c959432c8 Add AdmissibleDomain
Tuomo Valkonen <tuomov@iki.fi>
parents: 84
diff changeset
605 &mut FullSpace,
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: 49
diff changeset
606 )
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: 49
diff changeset
607 }

mercurial