fix: Optimize region transfer map
This commit is contained in:
		
							parent
							
								
									ad3bbd3649
								
							
						
					
					
						commit
						04554f634b
					
				| 
						 | 
					@ -202,22 +202,30 @@ impl TransferRegion {
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        let count = (
 | 
					                        let count = (
 | 
				
			||||||
                            // How many times can we replicate?
 | 
					                            // How many times can we replicate?
 | 
				
			||||||
 | 
					                            if il_dest.0.unsigned_abs() == 0 {
 | 
				
			||||||
 | 
					                                1
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
                                (1..)
 | 
					                                (1..)
 | 
				
			||||||
                                    .position(|n| {
 | 
					                                    .position(|n| {
 | 
				
			||||||
                                    n * number_used_src_wells.0 * il_dest.0.unsigned_abs()
 | 
					                                        (n * number_used_src_wells.0 * il_dest.0.unsigned_abs())
 | 
				
			||||||
                                        - il_dest.0.unsigned_abs()
 | 
					                                            .saturating_sub(il_dest.0.unsigned_abs())
 | 
				
			||||||
                                            + 1
 | 
					                                            + 1
 | 
				
			||||||
                                            > d_dims.0
 | 
					                                            > d_dims.0
 | 
				
			||||||
                                    })
 | 
					                                    })
 | 
				
			||||||
                                .unwrap() as u8,
 | 
					                                    .unwrap() as u8
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            if il_dest.1.unsigned_abs() == 0 {
 | 
				
			||||||
 | 
					                                1
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
                                (1..)
 | 
					                                (1..)
 | 
				
			||||||
                                    .position(|n| {
 | 
					                                    .position(|n| {
 | 
				
			||||||
                                    n * number_used_src_wells.1 * il_dest.1.unsigned_abs()
 | 
					                                        (n * number_used_src_wells.1 * il_dest.1.unsigned_abs())
 | 
				
			||||||
                                        - il_dest.1.unsigned_abs()
 | 
					                                            .saturating_sub(il_dest.1.unsigned_abs())
 | 
				
			||||||
                                            + 1
 | 
					                                            + 1
 | 
				
			||||||
                                            > d_dims.1
 | 
					                                            > d_dims.1
 | 
				
			||||||
                                    })
 | 
					                                    })
 | 
				
			||||||
                                .unwrap() as u8,
 | 
					                                    .unwrap() as u8
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
                        let i = i
 | 
					                        let i = i
 | 
				
			||||||
                            .saturating_sub(s_ul.row)
 | 
					                            .saturating_sub(s_ul.row)
 | 
				
			||||||
| 
						 | 
					@ -225,30 +233,34 @@ impl TransferRegion {
 | 
				
			||||||
                        let j = j
 | 
					                        let j = j
 | 
				
			||||||
                            .saturating_sub(s_ul.col)
 | 
					                            .saturating_sub(s_ul.col)
 | 
				
			||||||
                            .saturating_div(il_source.1.unsigned_abs());
 | 
					                            .saturating_div(il_source.1.unsigned_abs());
 | 
				
			||||||
 | 
					                        let checked_il_dest = (u8::max(il_dest.0.unsigned_abs(), 1u8),
 | 
				
			||||||
 | 
					                                                u8::max(il_dest.1.unsigned_abs(), 1u8));
 | 
				
			||||||
 | 
					                        let row_modulus = number_used_src_wells.0 * checked_il_dest.0;
 | 
				
			||||||
 | 
					                        let column_modulus = number_used_src_wells.1 * checked_il_dest.1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        Some(
 | 
					                        Some(
 | 
				
			||||||
                            possible_destination_wells
 | 
					                            possible_destination_wells
 | 
				
			||||||
                                .into_iter()
 | 
					                                .into_iter()
 | 
				
			||||||
                                .filter(|Well { row: x , ..}| {
 | 
					                                .filter(|Well { row: x, .. }| {
 | 
				
			||||||
                                    x.checked_sub(d_ul.row).unwrap()
 | 
					                                    x.checked_sub(d_ul.row).unwrap()
 | 
				
			||||||
                                        % (number_used_src_wells.0 * il_dest.0.unsigned_abs()) // Counter along x
 | 
					                                        % row_modulus // Counter along x
 | 
				
			||||||
                                    == (il_dest.0.unsigned_abs() *i)
 | 
					                                    == (il_dest.0.unsigned_abs() *i)
 | 
				
			||||||
                                        % (number_used_src_wells.0 * il_dest.0.unsigned_abs())
 | 
					                                        % row_modulus
 | 
				
			||||||
                                })
 | 
					                                })
 | 
				
			||||||
                                .filter(|Well { col: y, .. }| {
 | 
					                                .filter(|Well { col: y, .. }| {
 | 
				
			||||||
                                    y.checked_sub(d_ul.col).unwrap()
 | 
					                                    y.checked_sub(d_ul.col).unwrap()
 | 
				
			||||||
                                        % (number_used_src_wells.1 * il_dest.1.unsigned_abs()) // Counter along u
 | 
					                                        % column_modulus // Counter along u
 | 
				
			||||||
                                    == (il_dest.1.unsigned_abs() *j)
 | 
					                                    == (il_dest.1.unsigned_abs() *j)
 | 
				
			||||||
                                        % (number_used_src_wells.1 * il_dest.1.unsigned_abs())
 | 
					                                        % column_modulus
 | 
				
			||||||
                                })
 | 
					                                })
 | 
				
			||||||
                                .filter(|Well { row: x, col: y }| {
 | 
					                                .filter(|Well { row: x, col: y }| {
 | 
				
			||||||
                                    // How many times have we replicated? < How many are we allowed
 | 
					                                    // How many times have we replicated? < How many are we allowed
 | 
				
			||||||
                                    // to replicate?
 | 
					                                    // to replicate?
 | 
				
			||||||
                                    x.checked_sub(d_ul.row).unwrap().div_euclid(
 | 
					                                    x.checked_sub(d_ul.row).unwrap().div_euclid(
 | 
				
			||||||
                                        number_used_src_wells.0 * il_dest.0.unsigned_abs(),
 | 
					                                        row_modulus
 | 
				
			||||||
                                    ) < count.0
 | 
					                                    ) < count.0
 | 
				
			||||||
                                        && y.checked_sub(d_ul.col).unwrap().div_euclid(
 | 
					                                        && y.checked_sub(d_ul.col).unwrap().div_euclid(
 | 
				
			||||||
                                            number_used_src_wells.1 * il_dest.1.unsigned_abs(),
 | 
					                                            column_modulus
 | 
				
			||||||
                                        ) < count.1
 | 
					                                        ) < count.1
 | 
				
			||||||
                                })
 | 
					                                })
 | 
				
			||||||
                                .collect(),
 | 
					                                .collect(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue