--- a/src/python_access/diff_mapping.rs Sun May 17 19:40:50 2026 -0500 +++ b/src/python_access/diff_mapping.rs Sat Jun 13 20:58:47 2026 -0500 @@ -171,22 +171,20 @@ fn curvature_bound_components( &self, _guess: BoundedCurvatureGuess, - ) -> (DynResult<f64>, DynResult<f64>) { + ) -> (DynResult<f64>, DynResult<f64>, DynResult<f64>) { let m = intern!(self.obj.py(), "curvature_bound_components"); - match process_error::<(Option<f64>, Option<f64>)>( - "curvature_bound_components", - self.obj.py(), - self.obj.call_method0(m).and_then(|r| r.extract()), - ) { - Ok((l, θ2)) => ( - l.ok_or_else(|| anyhow!("l is None")), - θ2.ok_or_else(|| anyhow!("θ2 is None")), - ), - Err(e) => ( - Err(anyhow!("(same error as second component)")), - Err(e.into()), - ), - } + let (ℓ_F, ℓ_gradv_est, transport_lip): (Option<f64>, Option<f64>, Option<f64>) = + process_error( + "curvature_bound_components", + self.obj.py(), + self.obj.call_method0(m).and_then(|r| r.extract()), + ) + .unwrap(); + ( + ℓ_F.ok_or_else(|| anyhow!("ℓ_F is None")), + ℓ_gradv_est.ok_or_else(|| anyhow!("ℓ_gradv_est is None")), + transport_lip.ok_or_else(|| anyhow!("transport_lip is None")), + ) } }