chore: format

This commit is contained in:
Emilia Allison 2023-05-13 19:13:03 -04:00
parent 6a9a7ff0ff
commit 43331ff8f2
Signed by: emilia
GPG Key ID: 7A3F8997BFE894E0
5 changed files with 188 additions and 158 deletions

View File

@ -55,7 +55,7 @@ fn SourcePlateCell(cx: Scope<PlateCellProps>, i: u8, j: u8, color: Option<String
};
let color_string = match color {
Some(c) => c.clone(),
None => "None".to_string()
None => "None".to_string(),
};
cx.render(rsx! {

View File

@ -18,7 +18,7 @@ impl Plate {
pub enum PlateType {
Source,
Destination
Destination,
}
pub enum PlateFormat {

View File

@ -3,7 +3,7 @@ use super::plate::Plate;
#[derive(Clone, Copy)]
pub enum Region {
Rect((u8, u8), (u8, u8)),
Point((u8,u8))
Point((u8, u8)),
}
impl TryFrom<Region> for ((u8, u8), (u8, u8)) {
type Error = &'static str;
@ -47,7 +47,9 @@ impl TransferRegion<'_> {
}
}
return wells;
} else { panic!("Source region is just a point!") }
} else {
panic!("Source region is just a point!")
}
}
pub fn get_destination_wells(&self) -> Vec<(u8, u8)> {
let map = self.calculate_map();
@ -70,15 +72,16 @@ impl TransferRegion<'_> {
if let Err(msg) = self.validate() {
eprintln!("{}", msg);
eprintln!("This transfer will be empty.");
return Box::new(|(_,_)| None)
return Box::new(|(_, _)| None);
}
let source_wells = self.get_source_wells();
let il_dest = self.interleave_dest.unwrap_or((1, 1));
let il_source = self.interleave_source.unwrap_or((1, 1));
let source_corners: ((u8,u8),(u8,u8)) = self.source_region.try_into()
let source_corners: ((u8, u8), (u8, u8)) = self
.source_region
.try_into()
.expect("Source region should not be a point");
let (source_ul, _) = standardize_rectangle(&source_corners.0, &source_corners.1);
// This map is not necessarily injective or surjective,
@ -88,20 +91,31 @@ impl TransferRegion<'_> {
// Non-replicate transfers:
match self.dest_region {
Region::Point((x,y)) => return Box::new(move |(i,j)| {
Region::Point((x, y)) => {
return Box::new(move |(i, j)| {
if source_wells.contains(&(i, j)) {
// Validity here already checked by self.validate()
Some(vec!((
x + i.checked_sub(source_ul.0).expect("Point cannot have been less than UL")
.checked_div(il_source.0.abs() as u8).expect("Source interleave cannot be 0")
Some(vec![(
x + i
.checked_sub(source_ul.0)
.expect("Point cannot have been less than UL")
.checked_div(il_source.0.abs() as u8)
.expect("Source interleave cannot be 0")
.mul(il_dest.0.abs() as u8),
y + j.checked_sub(source_ul.1).expect("Point cannot have been less than UL")
.checked_div(il_source.1.abs() as u8).expect("Source interleave cannot be 0")
y + j
.checked_sub(source_ul.1)
.expect("Point cannot have been less than UL")
.checked_div(il_source.1.abs() as u8)
.expect("Source interleave cannot be 0")
.mul(il_dest.1.abs() as u8),
)))
} else { None }
}),
Region::Rect(c1, c2) => return Box::new(move |(i,j)| {
)])
} else {
None
}
});
}
Region::Rect(c1, c2) => {
return Box::new(move |(i, j)| {
// Because of our call to validate,
// we can assume that our destination region contains
// an integer number of our source regions.
@ -110,9 +124,16 @@ impl TransferRegion<'_> {
let possible_destination_wells = create_dense_rectangle(&c1, &c2);
let (ds1, ds2) = standardize_rectangle(&c1, &c2);
let (s1, s2) = standardize_rectangle(&source_corners.0, &source_corners.1);
let dims = (s2.0.checked_sub(s1.0).unwrap()+1, s2.1.checked_sub(s1.1).unwrap()+1);
let relative_ij = (i.checked_sub(source_ul.0).expect("Point cannot have been less than UL"),
j.checked_sub(source_ul.1).expect("Point cannot have been less than UL"));
let dims = (
s2.0.checked_sub(s1.0).unwrap() + 1,
s2.1.checked_sub(s1.1).unwrap() + 1,
);
let relative_ij = (
i.checked_sub(source_ul.0)
.expect("Point cannot have been less than UL"),
j.checked_sub(source_ul.1)
.expect("Point cannot have been less than UL"),
);
/*
println!("{} % {} == {}", i, dims.0, i*il_dest.0.abs() as u8 % dims.0);
for a in ds1.0..=ds2.0 {
@ -131,16 +152,27 @@ impl TransferRegion<'_> {
}
*/
Some(possible_destination_wells.into_iter()
.filter(|(x,y)| i*il_dest.0.abs() as u8 % dims.0
== (x.checked_sub(ds1.0).unwrap() + 1) % dims.0 &&
j*il_dest.1.abs() as u8 % dims.1
== (y.checked_sub(ds1.1).unwrap() + 1) % dims.1)
.filter(|(x,y)| (x.checked_sub(ds1.0).unwrap()) % il_dest.0.abs() as u8 == 0 &&
(y.checked_sub(ds1.1).unwrap()) % il_dest.1.abs() as u8 == 0)
.collect())
} else { None }
Some(
possible_destination_wells
.into_iter()
.filter(|(x, y)| {
i * il_dest.0.abs() as u8 % dims.0
== (x.checked_sub(ds1.0).unwrap() + 1) % dims.0
&& j * il_dest.1.abs() as u8 % dims.1
== (y.checked_sub(ds1.1).unwrap() + 1) % dims.1
})
.filter(|(x, y)| {
(x.checked_sub(ds1.0).unwrap()) % il_dest.0.abs() as u8 == 0
&& (y.checked_sub(ds1.1).unwrap()) % il_dest.1.abs() as u8
== 0
})
.collect(),
)
} else {
None
}
});
}
}
}
@ -160,19 +192,16 @@ impl TransferRegion<'_> {
Region::Point(_) => return Err("Source region should not be a point!"),
Region::Rect(s1, s2) => {
// Check if all source wells exist:
if s1.0 == 0 || s1.1 == 0
|| s2.0 == 0 || s2.1 == 0 {
return Err("Source region is out-of-bounds! (Too small)")
if s1.0 == 0 || s1.1 == 0 || s2.0 == 0 || s2.1 == 0 {
return Err("Source region is out-of-bounds! (Too small)");
}
// Sufficient to check if the corners are in-bounds
let source_max = self.source_plate.size();
if s1.0 > source_max.0 ||
s2.0 > source_max.0 {
return Err("Source region is out-of-bounds! (Too tall)")
if s1.0 > source_max.0 || s2.0 > source_max.0 {
return Err("Source region is out-of-bounds! (Too tall)");
}
if s1.1 > source_max.1 ||
s2.1 > source_max.1 {
return Err("Source region is out-of-bounds! (Too wide)")
if s1.1 > source_max.1 || s2.1 > source_max.1 {
return Err("Source region is out-of-bounds! (Too wide)");
}
// Check that source lengths divide destination lengths
match &self.dest_region {
@ -184,25 +213,28 @@ impl TransferRegion<'_> {
// (dim)*(il) - (il - 1)
let dest_diff_i = ((il_dest.0.abs() as u8) * u8::abs_diff(d1.0, d2.0))
.checked_sub(il_dest.0.abs() as u8 - 1)
.expect("Dimension is somehow negative?")+1;
.expect("Dimension is somehow negative?")
+ 1;
let dest_diff_j = ((il_dest.1.abs() as u8) * u8::abs_diff(d1.1, d2.1))
.checked_sub(il_dest.1.abs() as u8 - 1)
.expect("Dimension is somehow negative?")+1;
.expect("Dimension is somehow negative?")
+ 1;
let source_diff_i = ((il_source.0.abs() as u8) * u8::abs_diff(s1.0, s2.0))
.checked_sub(il_source.0.abs() as u8 - 1)
.expect("Dimension is somehow negative?")+1;
.expect("Dimension is somehow negative?")
+ 1;
let source_diff_j = ((il_source.1.abs() as u8) * u8::abs_diff(s1.1, s2.1))
.checked_sub(il_source.1.abs() as u8 - 1)
.expect("Dimension is somehow negative?")+1;
.expect("Dimension is somehow negative?")
+ 1;
if dest_diff_i % source_diff_i != 0 {
eprintln!("{} {}", source_diff_i, dest_diff_i);
return Err("Replicate region has indivisible height!")
return Err("Replicate region has indivisible height!");
}
if dest_diff_j % source_diff_j != 0 {
eprintln!("{} {}", source_diff_j, source_diff_j);
return Err("Replicate region has indivisible width!")
return Err("Replicate region has indivisible width!");
}
}
}
@ -211,18 +243,16 @@ impl TransferRegion<'_> {
if let Some(source_il) = self.interleave_source {
if source_il.0 == 0 || source_il.1 == 0 {
return Err("Source interleave cannot be zero!")
return Err("Source interleave cannot be zero!");
}
}
// Check if all destination wells exist:
// NOT IMPLEMENTED
// Should *not* happen in this function---otherwise
// we'd get a nasty recursive loop.
return Ok(())
return Ok(());
}
}
@ -233,10 +263,8 @@ fn in_region(pt: (u8,u8), r: &Region) -> bool {
&& pt.0 >= u8::min(c1.0, c2.0)
&& pt.1 <= u8::max(c1.1, c2.1)
&& pt.1 >= u8::min(c1.1, c2.1)
},
Region::Point((i, j)) => {
pt.0 == *i && pt.1 == *j
}
Region::Point((i, j)) => pt.0 == *i && pt.1 == *j,
}
}
@ -259,7 +287,10 @@ fn standardize_rectangle(c1: &(u8,u8), c2: &(u8,u8)) -> ((u8,u8),(u8,u8)) {
let upper_left_j = u8::min(c1.1, c2.1);
let bottom_right_i = u8::max(c1.0, c2.0);
let bottom_right_j = u8::max(c1.1, c2.1);
return ((upper_left_i,upper_left_j),(bottom_right_i,bottom_right_j));
return (
(upper_left_i, upper_left_j),
(bottom_right_i, bottom_right_j),
);
}
#[cfg(debug_assertions)]

View File

@ -22,17 +22,16 @@ pub fn App(cx: Scope) -> Element {
pub fn plate_test() {
let source = plate::Plate::new(plate::PlateType::Source, plate::PlateFormat::W96);
let destination = plate::Plate::new(plate::PlateType::Destination, plate::PlateFormat::W96);
let destination = plate::Plate::new(plate::PlateType::Destination, plate::PlateFormat::W384);
let transfer = transfer_region::TransferRegion {
source_plate: &source,
source_region: transfer_region::Region::Rect((1,1), (6,6)),
source_region: transfer_region::Region::Rect((1, 1), (5, 1)),
dest_plate: &destination,
dest_region: transfer_region::Region::Point((2,2)),
dest_region: transfer_region::Region::Rect((1, 1), (10, 4)),
//dest_region: transfer_region::Region::Point((3,3)),
interleave_source: None,
interleave_dest: None
interleave_dest: Some((1, 2)),
};
println!("{}", transfer);
println!("{:?}", transfer.get_source_wells());
println!("{:?}", transfer.get_destination_wells());
}

View File

@ -1,5 +1,5 @@
use plate_tool::App;
use plate_tool::plate_test;
use plate_tool::App;
use wasm_logger;
fn main() {