55 pointsource_pdps_reg, |
55 pointsource_pdps_reg, |
56 }; |
56 }; |
57 use crate::frank_wolfe::{ |
57 use crate::frank_wolfe::{ |
58 FWConfig, |
58 FWConfig, |
59 FWVariant, |
59 FWVariant, |
60 pointsource_fw, |
60 pointsource_fw_reg, |
61 prepare_optimise_weights, |
61 WeightOptim, |
62 optimise_weights, |
|
63 }; |
62 }; |
64 use crate::subproblem::InnerSettings; |
63 use crate::subproblem::InnerSettings; |
65 use crate::seminorms::*; |
64 use crate::seminorms::*; |
66 use crate::plot::*; |
65 use crate::plot::*; |
67 use crate::{AlgorithmOverrides, CommandLineArgs}; |
66 use crate::{AlgorithmOverrides, CommandLineArgs}; |
434 Skipping.").red(); |
433 Skipping.").red(); |
435 eprintln!("{}", msg); |
434 eprintln!("{}", msg); |
436 }; |
435 }; |
437 // Create Logger and IteratorFactory |
436 // Create Logger and IteratorFactory |
438 let mut logger = Logger::new(); |
437 let mut logger = Logger::new(); |
439 let findim_data = prepare_optimise_weights(&opA); |
438 let reg : Box<dyn WeightOptim<_, _, _, N>> = match regularisation { |
|
439 Regularisation::Radon(α) => Box::new(RadonRegTerm(α)), |
|
440 Regularisation::NonnegRadon(α) => Box::new(NonnegRadonRegTerm(α)), |
|
441 }; |
|
442 let findim_data = reg.prepare_optimise_weights(&opA, &b); |
440 let inner_config : InnerSettings<F> = Default::default(); |
443 let inner_config : InnerSettings<F> = Default::default(); |
441 let inner_it = inner_config.iterator_options; |
444 let inner_it = inner_config.iterator_options; |
442 let logmap = |iter, Timed { cpu_time, data }| { |
445 let logmap = |iter, Timed { cpu_time, data }| { |
443 let IterInfo { |
446 let IterInfo { |
444 value, |
447 value, |
448 pruned, |
451 pruned, |
449 postprocessing, |
452 postprocessing, |
450 this_iters, |
453 this_iters, |
451 .. |
454 .. |
452 } = data; |
455 } = data; |
453 let post_value = match (postprocessing, dataterm, regularisation) { |
456 let post_value = match (postprocessing, dataterm) { |
454 (Some(mut μ), DataTerm::L2Squared, Regularisation::Radon(α)) => { |
457 (Some(mut μ), DataTerm::L2Squared) => { |
455 // Comparison postprocessing is only implemented for the case handled |
458 // Comparison postprocessing is only implemented for the case handled |
456 // by the FW variants. |
459 // by the FW variants. |
457 optimise_weights( |
460 reg.optimise_weights( |
458 &mut μ, &opA, &b, α, &findim_data, &inner_config, |
461 &mut μ, &opA, &b, &findim_data, &inner_config, |
459 inner_it |
462 inner_it |
460 ); |
463 ); |
461 dataterm.value_at_residual(opA.apply(&μ) - &b) |
464 dataterm.value_at_residual(opA.apply(&μ) - &b) |
462 + regularisation.apply(&μ) |
465 + regularisation.apply(&μ) |
463 }, |
466 }, |
542 }, |
545 }, |
543 AlgorithmConfig::FW(ref algconfig) => { |
546 AlgorithmConfig::FW(ref algconfig) => { |
544 match (regularisation, dataterm) { |
547 match (regularisation, dataterm) { |
545 (Regularisation::Radon(α), DataTerm::L2Squared) => { |
548 (Regularisation::Radon(α), DataTerm::L2Squared) => { |
546 running(); |
549 running(); |
547 pointsource_fw(&opA, &b, α, algconfig, iterator, plotter) |
550 pointsource_fw_reg(&opA, &b, RadonRegTerm(α), |
|
551 algconfig, iterator, plotter) |
|
552 }, |
|
553 (Regularisation::NonnegRadon(α), DataTerm::L2Squared) => { |
|
554 running(); |
|
555 pointsource_fw_reg(&opA, &b, NonnegRadonRegTerm(α), |
|
556 algconfig, iterator, plotter) |
548 }, |
557 }, |
549 _ => { |
558 _ => { |
550 not_implemented(); |
559 not_implemented(); |
551 continue |
560 continue |
552 } |
561 } |