src/sliding_fb.rs

changeset 75
677a5fd1b014
parent 72
e9a460a0e638
child 78
2a122736e91c
equal deleted inserted replaced
74:df92e78cc3f4 75:677a5fd1b014
1039 1039
1040 let mut attempts = 0; 1040 let mut attempts = 0;
1041 1041
1042 // Solve finite-dimensional subproblem several times until the dual variable for the 1042 // Solve finite-dimensional subproblem several times until the dual variable for the
1043 // regularisation term conforms to the assumptions made for the transport above. 1043 // regularisation term conforms to the assumptions made for the transport above.
1044 let (maybe_d, _within_tolerances, mut τv̆, μ̆) = 'adapt_transport: loop { 1044 let (mut τv̆, μ̆) = 'adapt_transport: loop {
1045 // Set initial guess for μ=μ^{k+1}. 1045 // Set initial guess for μ=μ^{k+1}.
1046 γ.μ̆_into(&mut μ); 1046 γ.μ̆_into(&mut μ);
1047 let μ̆ = μ.clone(); 1047 let μ̆ = μ.clone();
1048 1048
1049 // Calculate τv̆ = τA_*(A[μ_transported + μ_transported_base]-b) 1049 // Calculate τv̆ = τA_*(A[μ_transported + μ_transported_base]-b)
1052 // old residual2. 1052 // old residual2.
1053 // NOTE: This assumes that μ = γ1 1053 // NOTE: This assumes that μ = γ1
1054 let mut τv̆ = f.differential(&μ̆) * τ; 1054 let mut τv̆ = f.differential(&μ̆) * τ;
1055 1055
1056 // Construct μ^{k+1} by solving finite-dimensional subproblems and insert new spikes. 1056 // Construct μ^{k+1} by solving finite-dimensional subproblems and insert new spikes.
1057 let (maybe_d, within_tolerances) = prox_penalty.insert_and_reweigh( 1057 prox_penalty.insert_and_reweigh(
1058 &mut μ, 1058 &mut μ,
1059 &mut τv̆, 1059 &mut τv̆,
1060 τ, 1060 τ,
1061 ε, 1061 ε,
1062 &config.insertion, 1062 &config.insertion,
1079 reg, 1079 reg,
1080 &config.transport, 1080 &config.transport,
1081 &config.insertion.refinement, 1081 &config.insertion.refinement,
1082 &mut attempts, 1082 &mut attempts,
1083 ) { 1083 ) {
1084 break 'adapt_transport (maybe_d, within_tolerances, τv̆, μ̆); 1084 break 'adapt_transport (τv̆, μ̆);
1085 } 1085 }
1086 1086
1087 stats.get_transport_mut().readjustment_iters += 1; 1087 stats.get_transport_mut().readjustment_iters += 1;
1088 }; 1088 };
1089 1089
1101 ε, 1101 ε,
1102 &config.insertion, 1102 &config.insertion,
1103 &reg, 1103 &reg,
1104 Some(|μ̃: &RNDM<N, F>| f.apply(μ̃)), 1104 Some(|μ̃: &RNDM<N, F>| f.apply(μ̃)),
1105 ); 1105 );
1106 if m > 0 { 1106 //if m > 0 {
1107 stats.merged += m; 1107 stats.merged += m;
1108 v = f.differential(&μ); 1108 //v = f.differential(&μ);
1109 } 1109 //}
1110 } 1110 }
1111 1111
1112 γ.prune_compat(&mut μ, &mut stats); 1112 γ.prune_compat(&mut μ, &mut stats);
1113
1114 // Do extra weight optimisation step heuristic
1115 for _ in 1..config.insertion.extra_weight_optimisation_steps {
1116 τv̆ = f.differential(&μ) * τ;
1117 prox_penalty.reweigh(
1118 &mut μ,
1119 &mut τv̆,
1120 τ,
1121 ε,
1122 &config.insertion,
1123 &reg,
1124 &state,
1125 &mut stats,
1126 )?;
1127 }
1128
1129 if config.insertion.extra_weight_optimisation_steps > 0 {
1130 γ.prune_compat(&mut μ, &mut stats);
1131 }
1113 1132
1114 let iter = state.iteration(); 1133 let iter = state.iteration();
1115 stats.this_iters += 1; 1134 stats.this_iters += 1;
1116 1135
1117 // Give statistics if requested 1136 // Give statistics if requested
1118 state.if_verbose(|| { 1137 state.if_verbose(|| {
1119 plotter.plot_spikes(iter, maybe_d.as_ref(), Some(&τv̆), &μ); 1138 plotter.plot_spikes(iter, None, Some(&τv̆), &μ);
1120 full_stats(&μ, ε, std::mem::replace(&mut stats, IterInfo::new())) 1139 full_stats(&μ, ε, std::mem::replace(&mut stats, IterInfo::new()))
1121 }); 1140 });
1122 1141
1123 // Update main tolerance for next iteration 1142 // Update main tolerance for next iteration
1124 ε = tolerance.update(ε, iter); 1143 ε = tolerance.update(ε, iter);

mercurial