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

121
LINES

< > BotCompany Repo | #1035426 // PStack - probabilistic virtual stack

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

Transpiled version (23726L) is out of date.

1  
persistable sclass PStack is Steppable {
2  
  settable new ProbabilisticScheduler scheduler;
3  
  settable bool verbose;
4  
  
5  
  sclass NoOptionsException extends RuntimeException {}
6  
  
7  
  <A> *(VStack.Computable<A> computable) { add(computable); }
8  
  
9  
  srecord noeq ExecuteOption(IVF1 option) is VStack.Computable {
10  
    public void step(VStack stack, O subComputationResult) {
11  
      O target = stack.caller();
12  
      stack.return();
13  
      option.get(target);
14  
    }
15  
  }
16  
  
17  
  class SingleStack extends VStack is IPStack, Runnable {
18  
    double probability = 1.0;
19  
    
20  
    *() {}
21  
    *(VStack.Computable computable) { super(computable); }
22  
    
23  
    run {
24  
      if (verbose) print("Stepping " + last(stack));
25  
      if (step() && !isEmpty()) {
26  
        if (verbose) print("Re-scheduling at " + probability + ": " + last(stack));
27  
        // re-add myself to scheduler to continue
28  
        scheduler.add(probability, this);
29  
      }
30  
    }
31  
    
32  
    // give each option the probability 1/n (with n=number of options)
33  
    public <B extends VStack.Computable> void options(B function, Iterable<IVF1<B>> options) {
34  
      L<IVF1<B>> optionsList = nonNulls(options);
35  
      
36  
      if (empty(optionsList))
37  
        throw new NoOptionsException;
38  
        
39  
      // probability penalty according to number of options
40  
      probability = probability/l(optionsList);
41  
      
42  
      // Schedule all options except first in cloned stacks
43  
      int n = l(optionsList)-1;
44  
      for (int i = 0; i < n; i++) {
45  
        new SingleStack s;
46  
        s.stack = shallowCloneElements(stack);
47  
        s.push(new ExecuteOption(optionsList.get(i)));
48  
        s.probability = probability;
49  
        scheduler.at(probability, s);
50  
      }
51  
      
52  
      // Last option is executed in same stack
53  
      push(new ExecuteOption(last(optionsList));
54  
    }
55  
    
56  
    // give each option its own probability
57  
    public <B extends VStack.Computable> void probabilisticOptions(B currentFrame, Iterable<WithProbability<IVF1<B>>> options) {
58  
      L<WithProbability<IVF1<B>>> optionsList = nonNulls(options);
59  
      
60  
      if (empty(optionsList))
61  
        throw new NoOptionsException;
62  
        
63  
      // Schedule all options except first in cloned stacks
64  
      int n = l(optionsList)-1;
65  
      for (int i = 0; i < n; i++) {
66  
        new SingleStack s;
67  
        s.stack = shallowCloneElements(stack);
68  
        var option = optionsList.get(i);
69  
        s.push(new ExecuteOption(option!));
70  
        s.probability = probability*option.probability();
71  
        scheduler.at(s.probability, s);
72  
      }
73  
      
74  
      // Last option is executed in same stack
75  
      var option = last(optionsList);
76  
      probability *= option.probability();
77  
      push(new ExecuteOption(option!));
78  
    }
79  
  }
80  
  
81  
  srecord noeq FollowUp<A>(VStack.Computable<A> computable, IVF1<A> onCompletion) extends PStackComputableWithStep {
82  
    // !customConstructor
83  
    *(VStack.Computable<A> *computable, IVF1<A> *onCompletion) {
84  
      probability = getProbability(computable);
85  
    }
86  
    
87  
    void step(IPStack stack) {
88  
      if (step == 0) {
89  
        stack.push(computable);
90  
        ++step;
91  
      } else {
92  
        onCompletion.get((A) stack.subResult());
93  
        stack.return();
94  
      }
95  
    }
96  
  }
97  
  
98  
  // also takes a PStackComputable
99  
  void add(VStack.Computable computable) {
100  
    scheduler.at(getProbability(computable), new SingleStack(computable));
101  
  }
102  
  
103  
  // also takes a PStackComputable
104  
  <A> void add(VStack.Computable<A> computable, IVF1<A> onCompletion) {
105  
    if (onCompletion != null)
106  
      add(new FollowUp<>(computable, onCompletion));
107  
    else
108  
      add(computable);
109  
  }
110  
  
111  
  public bool step() { ret scheduler.step(); }
112  
  meta-for run also as runWithStats {
113  
    public void run() { scheduler.run(); }
114  
    void run(VStack.Computable computable) { add(computable); run(); }
115  
  }
116  
  
117  
  static double getProbability(VStack.Computable computable) {
118  
    ret computable cast PStackComputable ?
119  
      computable.probability : 1.0;
120  
  }
121  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 3 computer(s): ekrmjmnbrukm, mowyntqkapby, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1035426
Snippet name: PStack - probabilistic virtual stack
Eternal ID of this version: #1035426/37
Text MD5: 73d4de5fcd492a6f55321de422f07b8a
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-09-05 02:05:20
Source code size: 4036 bytes / 121 lines
Pitched / IR pitched: No / No
Views / Downloads: 220 / 512
Version history: 36 change(s)
Referenced in: [show references]