--- a/src/run.rs Sun Dec 11 23:25:53 2022 +0200 +++ b/src/run.rs Tue Mar 21 20:31:01 2023 +0200 @@ -57,9 +57,8 @@ use crate::frank_wolfe::{ FWConfig, FWVariant, - pointsource_fw, - prepare_optimise_weights, - optimise_weights, + pointsource_fw_reg, + WeightOptim, }; use crate::subproblem::InnerSettings; use crate::seminorms::*; @@ -436,7 +435,11 @@ }; // Create Logger and IteratorFactory let mut logger = Logger::new(); - let findim_data = prepare_optimise_weights(&opA); + let reg : Box<dyn WeightOptim<_, _, _, N>> = match regularisation { + Regularisation::Radon(α) => Box::new(RadonRegTerm(α)), + Regularisation::NonnegRadon(α) => Box::new(NonnegRadonRegTerm(α)), + }; + let findim_data = reg.prepare_optimise_weights(&opA, &b); let inner_config : InnerSettings<F> = Default::default(); let inner_it = inner_config.iterator_options; let logmap = |iter, Timed { cpu_time, data }| { @@ -450,12 +453,12 @@ this_iters, .. } = data; - let post_value = match (postprocessing, dataterm, regularisation) { - (Some(mut μ), DataTerm::L2Squared, Regularisation::Radon(α)) => { + let post_value = match (postprocessing, dataterm) { + (Some(mut μ), DataTerm::L2Squared) => { // Comparison postprocessing is only implemented for the case handled // by the FW variants. - optimise_weights( - &mut μ, &opA, &b, α, &findim_data, &inner_config, + reg.optimise_weights( + &mut μ, &opA, &b, &findim_data, &inner_config, inner_it ); dataterm.value_at_residual(opA.apply(&μ) - &b) @@ -544,7 +547,13 @@ match (regularisation, dataterm) { (Regularisation::Radon(α), DataTerm::L2Squared) => { running(); - pointsource_fw(&opA, &b, α, algconfig, iterator, plotter) + pointsource_fw_reg(&opA, &b, RadonRegTerm(α), + algconfig, iterator, plotter) + }, + (Regularisation::NonnegRadon(α), DataTerm::L2Squared) => { + running(); + pointsource_fw_reg(&opA, &b, NonnegRadonRegTerm(α), + algconfig, iterator, plotter) }, _ => { not_implemented();