Region: remove the Serialization requirement

This commit is contained in:
2022-08-12 00:56:28 -07:00
parent 090b1ca09a
commit d5fbb4e9b2
7 changed files with 30 additions and 111 deletions

View File

@@ -13,9 +13,9 @@ use coremem::stim::{CurlStimulus, Exp1, Gated, Sinusoid1, TimeVarying as _};
use log::{error, info, warn};
use serde::{Deserialize, Serialize};
mod cache;
use cache::DiskCache;
// XXX: cache was disabled during Region rework.
// mod cache;
// use cache::DiskCache;
type Mat = IsoConductorOr<f32, Ferroxcube3R1MH>;
@@ -142,7 +142,7 @@ struct Params {
dump_frames: (u64, Option<u64>),
}
#[derive(Clone, Default, Serialize, Deserialize)]
#[derive(Clone, Default)]
struct Geometries {
dim: Meters,
ferro1_region: Torus,
@@ -657,10 +657,14 @@ fn main() {
variants.len() / post_times.len(),
);
let mut geom_cache = DiskCache::new_with_supplier(
&format!("{}/.geom_cache", ensure_out_dir(i)),
|geom: &GeomParams| derive_geometries(geom.clone())
);
// let mut geom_cache = DiskCache::new_with_supplier(
// &format!("{}/.geom_cache", ensure_out_dir(i)),
// |geom: &GeomParams| derive_geometries(geom.clone())
// );
// TODO: re-enable geometry cache. had to disable during Region serialization rework
fn geom_cache_get_or_insert_from_supplier(geom: GeomParams) -> Option<Geometries> {
derive_geometries(geom)
}
for (peak_clock_current, clock_duration, post_time, clock_type, ferro_major, wrap1_coverage, wrap2_coverage, wrap1_density, wrap2_density) in variants {
info!("{}A/{}s {}s {}m {}:{}cov {}:{}density", peak_clock_current, clock_duration, post_time, ferro_major, wrap1_coverage, wrap2_coverage, wrap1_density, wrap2_density);
@@ -709,7 +713,7 @@ fn main() {
wraps1: (wraps1 * 4) as f32,
..base_params.geom
};
let geoms = geom_cache.get_or_insert_from_supplier(params.clone())?;
let geoms = geom_cache_get_or_insert_from_supplier(params.clone())?;
Some((params, geoms))
})
.collect();
@@ -734,7 +738,7 @@ fn main() {
wraps2: (wraps2 * 4) as f32,
..base_params.geom
};
let geoms = geom_cache.get_or_insert_from_supplier(params.clone())?;
let geoms = geom_cache_get_or_insert_from_supplier(params.clone())?;
Some((params, geoms))
})
.collect();
@@ -755,7 +759,7 @@ fn main() {
let mut params = base_params;
params.geom.wraps1 = wraps1;
params.geom.wraps2 = wraps2;
match geom_cache.get_or_insert_from_supplier(params.geom.clone()) {
match geom_cache_get_or_insert_from_supplier(params.geom.clone()) {
Some(geoms) => {
run_sim(i, params, geoms);
},

View File

@@ -33,7 +33,6 @@ rand = "0.8" # MIT or Apache 2.0
rayon = "1.5" # MIT or Apache 2.0
serde = "1.0" # MIT or Apache 2.0
threadpool = "1.8" # MIT or Apache 2.0
typetag = "0.2" # MIT or Apache 2.0
y4m = "0.7" # MIT
wgpu = "0.12"

View File

@@ -12,7 +12,6 @@ mod primitives;
pub use primitives::*;
#[typetag::serde(tag = "type")]
pub trait Region: Send + Sync + DynClone {
fn contains(&self, p: Meters) -> bool;
}
@@ -79,14 +78,13 @@ pub fn distance_to<R: Region, C: Coord>(r: &R, p0: C, p1: C, feat_size: f32) ->
#[derive(Copy, Clone, Serialize, Deserialize)]
pub struct WorldRegion;
#[typetag::serde]
impl Region for WorldRegion {
fn contains(&self, _: Meters) -> bool {
true
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct InvertedRegion(Box<dyn Region>);
impl InvertedRegion {
@@ -95,14 +93,13 @@ impl InvertedRegion {
}
}
#[typetag::serde]
impl Region for InvertedRegion {
fn contains(&self, p: Meters) -> bool {
!self.0.contains(p)
}
}
#[derive(Clone, Default, Serialize, Deserialize)]
#[derive(Clone, Default)]
pub struct Union(Vec<Box<dyn Region>>);
impl Union {
@@ -121,14 +118,13 @@ impl Union {
}
}
#[typetag::serde]
impl Region for Union {
fn contains(&self, p: Meters) -> bool {
self.0.iter().any(|r| r.contains(p))
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Intersection(Vec<Box<dyn Region>>);
@@ -148,14 +144,13 @@ impl Intersection {
}
}
#[typetag::serde]
impl Region for Intersection {
fn contains(&self, p: Meters) -> bool {
self.0.iter().all(|r| r.contains(p))
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Translate {
inner: Box<dyn Region>,
shift: Meters,
@@ -167,14 +162,13 @@ impl Translate {
}
}
#[typetag::serde]
impl Region for Translate {
fn contains(&self, p: Meters) -> bool {
self.inner.contains(p - self.shift)
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct SwapXZ {
inner: Box<dyn Region>,
}
@@ -185,7 +179,6 @@ impl SwapXZ {
}
}
#[typetag::serde]
impl Region for SwapXZ {
fn contains(&self, p: Meters) -> bool {
let p = Meters::new(p.z(), p.y(), p.z());
@@ -194,7 +187,7 @@ impl Region for SwapXZ {
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct SwapYZ {
inner: Box<dyn Region>,
}
@@ -205,7 +198,6 @@ impl SwapYZ {
}
}
#[typetag::serde]
impl Region for SwapYZ {
fn contains(&self, p: Meters) -> bool {
let mapped = Meters::new(p.x(), p.z(), p.y());
@@ -219,7 +211,7 @@ impl Region for SwapYZ {
/// the resulting region is mapped onto the original region y=[0, y_max]. x is just the radius
/// so that (0, 0) is mapped to (0, 0), and (1, 0) is mapped to (1, 0) and (0, 1) is mapped to
/// (1, 0.5*y_max) and (-5, 0) is mapped to (5, 0.5*y_max).
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Wrap {
inner: Box<dyn Region>,
y_max: f32,
@@ -244,14 +236,13 @@ impl Wrap {
}
}
#[typetag::serde]
impl Region for Wrap {
fn contains(&self, p: Meters) -> bool {
self.inner.contains(self.map(p))
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Dilate {
inner: Box<dyn Region>,
rad: f32,
@@ -264,7 +255,6 @@ impl Dilate {
}
}
#[typetag::serde]
impl Region for Dilate {
fn contains(&self, p: Meters) -> bool {
let rad_iters = (self.rad / self.res).ceil() as i32;
@@ -288,9 +278,8 @@ impl Region for Dilate {
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Memoize {
#[serde(skip)]
lut: Arc<dashmap::DashMap<OrdMeters, bool>>,
inner: Box<dyn Region>,
}
@@ -304,7 +293,6 @@ impl Memoize {
}
}
#[typetag::serde]
impl Region for Memoize {
fn contains(&self, p: Meters) -> bool {
*self.lut.entry(OrdMeters(p)).or_insert_with(|| self.inner.contains(p))

View File

@@ -24,7 +24,6 @@ impl CylinderZ {
}
}
#[typetag::serde]
impl Region for CylinderZ {
fn contains(&self, p: Meters) -> bool {
p.xy().distance_sq(self.center) <= self.radius * self.radius
@@ -77,7 +76,6 @@ impl Torus {
}
}
#[typetag::serde]
impl Region for Torus {
fn contains(&self, p: Meters) -> bool {
// a torus is the set of all points < distance `r` from the circle of radius `R`,
@@ -128,7 +126,6 @@ impl Sphere {
}
}
#[typetag::serde]
impl Region for Sphere {
fn contains(&self, p: Meters) -> bool {
p.distance_sq(*self.center) < self.rad * self.rad
@@ -237,7 +234,6 @@ impl Cube {
}
}
#[typetag::serde]
impl Region for Cube {
fn contains(&self, p: Meters) -> bool {
self.x_range().contains(&p.x()) &&
@@ -266,7 +262,6 @@ impl Spiral {
}
}
#[typetag::serde]
impl Region for Spiral {
fn contains(&self, p: Meters) -> bool {
let revs = p.z() / self.period;

View File

@@ -212,7 +212,7 @@ impl<S: AbstractSim> AbstractMeasurement<S> for Meta {
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Volume {
name: String,
region: Box<dyn Region>,
@@ -241,7 +241,7 @@ impl<S: AbstractSim> AbstractMeasurement<S> for Volume {
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Current {
name: String,
region: Box<dyn Region>,
@@ -471,7 +471,7 @@ impl<S: AbstractSim> AbstractMeasurement<S> for MagneticLoop {
}
/// mean M over a region
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct MagneticFlux {
name: String,
region: Box<dyn Region>,
@@ -508,7 +508,7 @@ impl<S: AbstractSim> AbstractMeasurement<S> for MagneticFlux {
}
/// mean B over a region
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Magnetization {
name: String,
region: Box<dyn Region>,
@@ -604,7 +604,7 @@ impl<S: AbstractSim> AbstractMeasurement<S> for ElectricField {
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Energy {
name: String,
region: Box<dyn Region>,
@@ -648,7 +648,7 @@ impl<S: AbstractSim> AbstractMeasurement<S> for Energy {
}
}
#[derive(Clone, Serialize, Deserialize)]
#[derive(Clone)]
pub struct Power {
name: String,
region: Box<dyn Region>
@@ -741,7 +741,6 @@ pub mod test {
self.normal
}
}
#[typetag::serde]
impl Region for MockRegion {
fn contains(&self, _p: Meters) -> bool {
true

View File

@@ -405,7 +405,6 @@ mod test {
self.normal
}
}
#[typetag::serde]
impl Region for MockRegion {
fn contains(&self, _p: Meters) -> bool {
true