src/sliding_pdps.rs

branch
dev
changeset 44
03251c546744
parent 41
b6bdb6cb4d44
child 45
5200e7090e06
--- a/src/sliding_pdps.rs	Thu Jan 23 23:39:40 2025 +0100
+++ b/src/sliding_pdps.rs	Fri Jan 31 18:00:17 2025 -0500
@@ -27,7 +27,7 @@
 use crate::forward_model::{
     ForwardModel,
     AdjointProductPairBoundedBy,
-    LipschitzValues,
+    BoundedCurvature,
 };
 // use crate::transport::TransportLipschitz;
 //use crate::tolerance::Tolerance;
@@ -113,10 +113,10 @@
             PairNorm<Radon, L2, L2>,
             PreadjointCodomain = Pair<S, Z>,
         >
-        + AdjointProductPairBoundedBy<MeasureZ<F, Z, N>, P, IdOp<Z>, FloatType=F>,
+        + AdjointProductPairBoundedBy<MeasureZ<F, Z, N>, P, IdOp<Z>, FloatType=F>
+        + BoundedCurvature<FloatType=F>,
     S : DifferentiableRealMapping<F, N>,
     for<'b> &'b A::Observable : std::ops::Neg<Output=A::Observable> + Instance<A::Observable>,
-    for<'b> A::Preadjoint<'b> : LipschitzValues<FloatType=F>,
     PlotLookup : Plotting<N>,
     RNDM<F, N> : SpikeMerging<F>,
     Reg : SlidingRegTerm<F, N>,
@@ -188,23 +188,24 @@
     let ψ = 1.0 - τ * l;
     let β = σ_p * config.σd0 * nKz / a; // σ_p * σ_d * (nKz * nK_z) / a;
     assert!(β < 1.0);
-    // Now we need κ‖K_μ(π_♯^1 - π_♯^0)γ‖^2 ≤ (1/θ - τ[ℓ_v + ℓ]) ∫ c_2 dγ for κ defined as:
+    // Now we need κ‖K_μ(π_♯^1 - π_♯^0)γ‖^2 ≤ (1/θ - τ[ℓ_F + ℓ]) ∫ c_2 dγ for κ defined as:
     let κ = τ * σ_d * ψ / ((1.0 - β) * ψ - τ * σ_d * bigM);
     //  The factor two in the manuscript disappears due to the definition of 𝚹 being
     // for ‖x-y‖₂² instead of c_2(x, y)=‖x-y‖₂²/2.
+    let (maybe_ℓ_v0, maybe_transport_lip) = opA.curvature_bound_components();
+    let transport_lip = maybe_transport_lip.unwrap();
     let calculate_θ = |ℓ_v, max_transport| {
-        config.transport.θ0 / (τ*(ℓ + ℓ_v) + κ * bigθ * max_transport)
+        let ℓ_F = ℓ_v + transport_lip * max_transport;
+        config.transport.θ0 / (τ*(ℓ + ℓ_F) + κ * bigθ * max_transport)
     };
-    let mut θ_or_adaptive = match opA.preadjoint().value_diff_unit_lipschitz_factor() {
-        // We only estimate w (the uniform Lipschitz for of v), if we also estimate ℓ_v
-        // (the uniform Lipschitz factor of ∇v).
+    let mut θ_or_adaptive = match maybe_ℓ_v0 {
         // We assume that the residual is decreasing.
-        Some(ℓ_v0) => TransportStepLength::AdaptiveMax{
-            l: ℓ_v0 * b.norm2(),
+        Some(ℓ_v0) => TransportStepLength::AdaptiveMax {
+            l: ℓ_v0 * b.norm2(), // TODO: could estimate computing the real reesidual
             max_transport : 0.0,
             g : calculate_θ
         },
-        None => TransportStepLength::FullyAdaptive{
+        None => TransportStepLength::FullyAdaptive {
             l : F::EPSILON,
             max_transport : 0.0,
             g : calculate_θ

mercurial