| 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 } |