splr/assign/
learning_rate.rs

1/// Var Rewarding based on Learning Rate Rewarding and Reason Side Rewarding
2use {
3    super::{AssignStack, Var},
4    crate::types::*,
5};
6
7impl ActivityIF<VarId> for AssignStack {
8    #[inline]
9    fn activity(&self, vi: VarId) -> f64 {
10        self.var[vi].reward
11    }
12    // fn activity_slow(&self, vi: VarId) -> f64 {
13    //     self.var[vi].reward_ema.get()
14    // }
15    fn set_activity(&mut self, vi: VarId, val: f64) {
16        self.var[vi].reward = val;
17    }
18    fn reward_at_analysis(&mut self, vi: VarId) {
19        self.var[vi].turn_on(FlagVar::USED);
20    }
21    #[inline]
22    fn reward_at_assign(&mut self, _vi: VarId) {}
23    #[inline]
24    fn reward_at_propagation(&mut self, _vi: VarId) {}
25    #[inline]
26    fn reward_at_unassign(&mut self, vi: VarId) {
27        self.var[vi].update_activity(self.activity_decay, self.activity_anti_decay);
28    }
29    fn update_activity_decay(&mut self, scaling: f64) {
30        self.activity_decay = scaling;
31        self.activity_anti_decay = 1.0 - scaling;
32    }
33    // Note: `update_rewards` should be called before `cancel_until`
34    #[inline]
35    fn update_activity_tick(&mut self) {
36        self.tick += 1;
37    }
38}
39
40impl AssignStack {
41    pub fn rescale_activity(&mut self, scaling: f64) {
42        for v in self.var.iter_mut().skip(1) {
43            v.reward *= scaling;
44        }
45    }
46    // pub fn set_activity_trend(&mut self) -> f64 {
47    //     let mut nv = 0;
48    //     let mut inc = 0;
49    //     let mut activity_sum: f64 = 0.0;
50    //     // let mut dec = 1;
51    //     for (vi, v) in self.var.iter_mut().enumerate().skip(1) {
52    //         if v.is(FlagVar::ELIMINATED) || self.level[vi] == self.root_level {
53    //             continue;
54    //         }
55    //         nv += 1;
56    //         activity_sum += v.reward;
57    //         let trend = v.reward_ema.trend();
58    //         if 1.0 < trend {
59    //             inc += 1;
60    //         }
61    //     }
62    //     self.activity_averaged = activity_sum / nv as f64;
63    //     self.cwss = inc as f64 / nv as f64;
64    //     // println!("inc rate:{:>6.4}", self.cwss);
65    //     self.cwss
66    // }
67}
68
69impl Var {
70    fn update_activity(&mut self, decay: f64, reward: f64) -> f64 {
71        // Note: why the condition can be broken.
72        //
73        // 1. asg.ordinal += 1;
74        // 1. handle_conflict -> cancel_until -> reward_at_unassign
75        // 1. assign_by_implication -> v.timestamp = asg.ordinal
76        // 1. restart
77        // 1. cancel_until -> reward_at_unassign -> assertion failed
78        //
79        self.reward *= decay;
80        if self.is(FlagVar::USED) {
81            self.reward += reward;
82            self.turn_off(FlagVar::USED);
83        }
84        // self.reward_ema.update(self.reward);
85        self.reward
86    }
87}