Compare commits

..

3 commits

Author SHA1 Message Date
Aaron Fenyes
99a9c3ec55 Flag regulator update logging as debug 2025-04-17 21:31:24 -07:00
Aaron Fenyes
5506ec1f43 Make regulator activation less redundant 2025-04-17 21:25:22 -07:00
Aaron Fenyes
8dab223f6a Use field init shorthand in regulator constructors 2025-04-17 21:00:24 -07:00

View file

@ -148,7 +148,15 @@ pub trait Regulator: ProblemPoser + OutlineItem {
fn measurement(&self) -> ReadSignal<f64>; fn measurement(&self) -> ReadSignal<f64>;
fn set_point(&self) -> Signal<SpecifiedValue>; fn set_point(&self) -> Signal<SpecifiedValue>;
fn activate(&self, _assembly: &Assembly) {} // this method is used to responsively precondition the assembly for
// realization when the regulator becomes a constraint, or is edited while
// acting as a constraint. it should track the set point, do any desired
// preconditioning when the set point is present, and use its return value
// to report whether the set is present. the default implementation does no
// preconditioning
fn try_activate(&self, _assembly: &Assembly) -> bool {
self.set_point().with(|set_pt| set_pt.is_present())
}
} }
pub struct InversiveDistanceRegulator { pub struct InversiveDistanceRegulator {
@ -172,11 +180,7 @@ impl InversiveDistanceRegulator {
let set_point = create_signal(SpecifiedValue::from_empty_spec()); let set_point = create_signal(SpecifiedValue::from_empty_spec());
InversiveDistanceRegulator { InversiveDistanceRegulator { subjects, measurement, set_point }
subjects: subjects,
measurement: measurement,
set_point: set_point
}
} }
} }
@ -227,11 +231,7 @@ impl HalfCurvatureRegulator {
let set_point = create_signal(SpecifiedValue::from_empty_spec()); let set_point = create_signal(SpecifiedValue::from_empty_spec());
HalfCurvatureRegulator { HalfCurvatureRegulator { subject, measurement, set_point }
subject: subject,
measurement: measurement,
set_point: set_point
}
} }
} }
@ -248,14 +248,18 @@ impl Regulator for HalfCurvatureRegulator {
self.set_point self.set_point
} }
fn activate(&self, assembly: &Assembly) { fn try_activate(&self, assembly: &Assembly) -> bool {
if let Some(half_curv) = self.set_point.with_untracked(|set_pt| set_pt.value) { match self.set_point.with(|set_pt| set_pt.value) {
Some(half_curv) => {
let representation = assembly.elements.with_untracked( let representation = assembly.elements.with_untracked(
|elts| elts[self.subject].representation |elts| elts[self.subject].representation
); );
representation.update( representation.update(
|rep| change_half_curvature(rep, half_curv) |rep| change_half_curvature(rep, half_curv)
); );
true
}
None => false
} }
} }
} }
@ -387,11 +391,13 @@ impl Assembly {
// edited while acting as a constraint // edited while acting as a constraint
let self_for_effect = self.clone(); let self_for_effect = self.clone();
create_effect(move || { create_effect(move || {
/* DEBUG */
// log the regulator update
console::log_1(&JsValue::from( console::log_1(&JsValue::from(
format!("Updated regulator with subjects {:?}", regulator_rc.subjects()) format!("Updated regulator with subjects {:?}", regulator_rc.subjects())
)); ));
if regulator_rc.set_point().with(|set_pt| set_pt.is_present()) {
regulator_rc.activate(&self_for_effect); if regulator_rc.try_activate(&self_for_effect) {
self_for_effect.realize(); self_for_effect.realize();
} }
}); });