use {super::stack::AssignStack, crate::types::*};
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum VarActivityScheme {
#[default]
LRB,
VMTF,
}
impl ActivityIF<VarId> for AssignStack {
#[inline]
fn activity(&self, vi: VarId) -> f64 {
match self.activity_scheme {
VarActivityScheme::LRB => self.var[vi].reward,
VarActivityScheme::VMTF => self.var[vi].last_conflict as f64 / self.num_conflict as f64,
}
}
fn set_activity(&mut self, vi: VarId, val: f64) {
self.var[vi].reward = val;
}
#[inline]
fn reward_to(&mut self, vi: VarId) -> f64 {
let stay = self.activity_stay_rate;
let reward = self.activity_learning_rate;
self.var[vi].reward *= stay;
if self.var[vi].is(FlagVar::USED) {
self.var[vi].reward += reward;
self.var[vi].turn_off(FlagVar::USED);
}
self.var[vi].reward
}
#[inline]
fn reward_at_analysis(&mut self, vi: VarId) {
self.var[vi].turn_on(FlagVar::USED);
}
#[inline]
fn reward_at_assign(&mut self, _vi: VarId) {}
#[inline]
fn reward_at_propagation(&mut self, _vi: VarId) {}
#[inline]
fn reward_at_unassign(&mut self, vi: VarId) {
self.reward_to(vi);
}
fn set_learning_rate(&mut self, scaling: f64) {
self.activity_stay_rate = 1.0 - scaling;
self.activity_learning_rate = scaling;
}
fn rescale_learning_rate(&mut self, scaling: f64) {
self.activity_learning_rate *= scaling;
self.activity_stay_rate = 1.0 - self.activity_learning_rate;
}
#[inline]
fn update_activity_tick(&mut self) {
self.tick += 1;
}
}