Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

122
LINES

< > BotCompany Repo | #1031949 // ProbabilisticScheduler

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (10207L/58K).

1  
sclass ProbabilisticScheduler extends Meta implements IProbabilisticScheduler, Steppable {
2  
  TreeSetWithDuplicates<Entry> entries = new(byProbability());
3  
4  
  long stepCount;
5  
  bool verbose;
6  
  
7  
  // must be >= 0. probability 0 is never executed
8  
  double cutoffProbabilityOnAdd = 0;
9  
  double cutoffProbabilityOnExecute = 0;
10  
  
11  
  Comparator<Entry> byProbability() { ret (a, b) -> cmp(b.probability, a.probability); }
12  
  
13  
  long dropped;
14  
  double lastExecutedProbability = 1.0;
15  
  new ThreadLocal<Double> threadProbability;
16  
  
17  
  persistable class Entry {
18  
    double probability;
19  
    Runnable action;
20  
    
21  
    *(double *probability, Runnable *action) {}
22  
    
23  
    run {
24  
      initAction(action);
25  
      temp tempSetTL(threadProbability, probability);
26  
      action.run();
27  
    }
28  
29  
    toString {
30  
      ret str(WithProbability(probability, action));
31  
    }
32  
  }
33  
  
34  
  public void add aka at(double probability, Runnable action) {
35  
    if (action == null) ret;
36  
    if (probability < cutoffProbabilityOnAdd) {
37  
      ++dropped;
38  
      scaffoldPrint("Not scheduling " + withProbability(probability, action) + " (below threshold of " + cutoffProbabilityOnAdd + ")");
39  
      ret;
40  
    }
41  
    scaffoldPrint("Scheduling " + withProbability(probability, action));
42  
    entries.add(new Entry(probability, action));
43  
  }
44  
  
45  
  public bool step() {
46  
    ret stepFirstUnstepped();
47  
  }
48  
  
49  
  Entry nextSteppable() {
50  
    Entry s = first(entries);
51  
    if (s != null && s.probability <= cutoffProbabilityOnExecute) null;
52  
    ret s;
53  
  }
54  
  
55  
  // returns false when done stepping
56  
  bool stepFirstUnstepped() {
57  
    Entry s = nextSteppable(), ret false if null;
58  
    if (verbose) print("Current scheduler probability: " + s.probability);
59  
    entries.remove(s);
60  
    ++stepCount;
61  
    lastExecutedProbability = s.probability;
62  
    s.run();
63  
    true;
64  
  }
65  
  
66  
  void reset {
67  
    entries.clear();
68  
  }
69  
70  
  run { stepAll(this); }
71  
  void runWithStats { stepAllWithStats(this); }
72  
  
73  
  void run(int maxSteps) {
74  
    stepMax(maxSteps, this);
75  
  }
76  
77  
  void printStats() {
78  
    Entry first = entries.first(), last = entries.last();
79  
    Entry next = nextSteppable();
80  
    print("ProbabilisticScheduler. "
81  
      + nEntries(entries)
82  
      + ", highest probability in queue: " + (first == null ? "-" : first.probability)
83  
      + ", lowest probability in queue: " + (last == null ? "-" : last.probability)
84  
      + ", cutoff probability: " + cutoffProbabilityOnAdd + "/" + cutoffProbabilityOnExecute
85  
      + ", " + (next == null ? "done" : "next step: " + next.action));
86  
  }
87  
  
88  
  // Get probability of this thread's Runnable.
89  
  // Or 1.0 when we are coming from "outside" (so you don't _have_ to
90  
  // run your first step through the scheduler).
91  
  public double currentProbability aka current() {
92  
    ret or(threadProbability!, 1.0);
93  
  }
94  
  
95  
  /*IProbabilisticScheduler freeze() {
96  
    double prob = currentProbability();
97  
    ret new IProbabilisticScheduler {
98  
      public void at(double probability, Runnable action) {
99  
        ProbabilisticScheduler.this.at(prob*probability, action);
100  
      }
101  
      
102  
      public double currentProbability() {
103  
        ret prob;
104  
      }
105  
      
106  
      public long stepCount() { ret stepCount; }
107  
    };
108  
  }*/
109  
  
110  
  double remainingProbability() {
111  
    Entry s = nextSteppable();
112  
    ret s == null ? 0.0 : s.probability;
113  
  }
114  
  
115  
  public double lastExecutedProbability() { ret lastExecutedProbability; }
116  
  
117  
  public long stepCount() { ret stepCount; }
118  
  
119  
  bool isEmpty() {
120  
    ret empty(entries);
121  
  }
122  
}

Author comment

Began life as a copy of #1028166

download  show line numbers  debug dex  old transpilations   

Travelled to 3 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx

No comments. add comment

Snippet ID: #1031949
Snippet name: ProbabilisticScheduler
Eternal ID of this version: #1031949/43
Text MD5: f7f0458a990b8ba37e8c17bfdd5fb75b
Transpilation MD5: fb333527ceacf78a88e990879612e35f
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-09-02 23:20:57
Source code size: 3569 bytes / 122 lines
Pitched / IR pitched: No / No
Views / Downloads: 351 / 674
Version history: 42 change(s)
Referenced in: [show references]