| 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) |
| 1101 ε, |
1101 ε, |
| 1102 &config.insertion, |
1102 &config.insertion, |
| 1103 ®, |
1103 ®, |
| 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 ®, |
| |
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); |