--- 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_θ