| 731 /// latter needs to be pruned when μ is. |
731 /// latter needs to be pruned when μ is. |
| 732 pub(crate) fn prune_compat(&mut self, μ: &mut RNDM<N, F>, stats: &mut IterInfo<F>) { |
732 pub(crate) fn prune_compat(&mut self, μ: &mut RNDM<N, F>, stats: &mut IterInfo<F>) { |
| 733 assert!(self.vec.len() <= μ.len()); |
733 assert!(self.vec.len() <= μ.len()); |
| 734 let old_len = μ.len(); |
734 let old_len = μ.len(); |
| 735 for (ρ, δ) in self.vec.iter_mut().zip(μ.iter_spikes()) { |
735 for (ρ, δ) in self.vec.iter_mut().zip(μ.iter_spikes()) { |
| 736 ρ.retain = δ.α.abs() > F::EPSILON; |
736 ρ.retain = δ.α != F::ZERO; |
| 737 } |
737 } |
| 738 μ.prune_by(|δ| δ.α.abs() > F::EPSILON); |
738 // Do not prune new insertions on first round. |
| |
739 μ.prune_until(self.vec.len()); |
| 739 stats.pruned += old_len - μ.len(); |
740 stats.pruned += old_len - μ.len(); |
| 740 self.vec.retain(|ρ| ρ.retain); |
741 self.vec.retain(|ρ| ρ.retain); |
| 741 assert!(self.vec.len() <= μ.len()); |
742 assert!(self.vec.len() <= μ.len()); |
| 742 } |
743 } |
| 743 |
744 |
| 1113 ε, |
1114 ε, |
| 1114 ins, |
1115 ins, |
| 1115 ®, |
1116 ®, |
| 1116 Some(|μ̃: &RNDM<N, F>| f.apply(μ̃) + reg.apply(μ̃)), |
1117 Some(|μ̃: &RNDM<N, F>| f.apply(μ̃) + reg.apply(μ̃)), |
| 1117 ); |
1118 ); |
| |
1119 // Prune. Do not prune new insertions on first round. |
| 1118 γ.prune_compat(&mut μ, &mut stats); |
1120 γ.prune_compat(&mut μ, &mut stats); |
| 1119 |
1121 |
| 1120 if config.insertion.random_insertions { |
1122 if config.insertion.random_insertions { |
| 1121 if let Some(x) = domain.random_point() { |
1123 if let Some(x) = domain.random_point() { |
| 1122 μ += DeltaMeasure { x, α: 0.0 }; |
1124 μ += DeltaMeasure { x, α: 0.0 }; |