1 package org.simantics.scl.runtime.chr;
\r
3 import java.util.Arrays;
\r
5 public class FactActivationQueue {
\r
6 public static final boolean TRACE = false;
\r
8 private final PriorityContainer[] containers;
\r
9 private PriorityContainer[] activeContainers = new PriorityContainer[8];
\r
10 private int activeContainerCount;
\r
12 public FactActivationQueue(int priorityCount) {
\r
14 System.out.println("priorityCount = " + priorityCount);
\r
15 containers = new PriorityContainer[priorityCount];
\r
16 for(int i=0;i<priorityCount;++i)
\r
17 containers[i] = new PriorityContainer(i);
\r
21 * Adds a new fact with a given priority
\r
23 public void add(int priority, Fact item) {
\r
25 System.out.println("FactActivationQueue.add " + priority + "@" + item);
\r
26 PriorityContainer container = containers[priority];
\r
27 if(container.size == 0)
\r
28 activateContainer(container);
\r
29 container.push(item);
\r
32 private void activateContainer(PriorityContainer container) {
\r
34 System.out.println("FactActivationQueue.activate priority " + container.priority);
\r
35 if(activeContainers.length == activeContainerCount)
\r
36 activeContainers = Arrays.copyOf(activeContainers, activeContainerCount*2);
\r
37 adjustUpwards(activeContainerCount, container);
\r
38 ++activeContainerCount;
\r
41 private void deactivateContainer() {
\r
42 --activeContainerCount;
\r
43 adjustDownwards(0, activeContainers[activeContainerCount]);
\r
44 activeContainers[activeContainerCount] = null;
\r
47 private void adjustDownwards(int pos, PriorityContainer item) {
\r
48 int priority = item.priority;
\r
51 if(npos+1 >= activeContainerCount) {
\r
52 if(npos >= activeContainerCount)
\r
54 PriorityContainer item1 = activeContainers[npos];
\r
55 if(priority > item1.priority) {
\r
56 activeContainers[pos] = item1;
\r
57 activeContainers[npos] = item;
\r
63 PriorityContainer item1 = activeContainers[npos];
\r
64 PriorityContainer item2 = activeContainers[npos+1];
\r
65 if(priority < item1.priority) {
\r
66 if(priority < item2.priority)
\r
70 if(item1.priority < item2.priority) {
\r
71 activeContainers[pos] = item1;
\r
76 activeContainers[pos] = item2;
\r
79 activeContainers[pos] = item;
\r
82 private void adjustUpwards(int pos, PriorityContainer item) {
\r
83 int priority = item.priority;
\r
85 int npos = (pos-1)/2;
\r
86 PriorityContainer item1 = activeContainers[npos];
\r
87 if(item1.priority > priority) {
\r
88 activeContainers[pos] = item1;
\r
94 activeContainers[pos] = item;
\r
98 * Activates all facts with priority less than the current priority
\r
100 public void activate(Object context, int currentPriority) {
\r
102 System.out.println("FactActivationQueue.activate " + currentPriority);
\r
103 while(activeContainerCount > 0) {
\r
104 PriorityContainer topContainer = activeContainers[0];
\r
105 int priority = topContainer.priority;
\r
106 if(priority >= currentPriority)
\r
109 Fact fact = topContainer.pop();
\r
110 if(topContainer.size == 0)
\r
111 deactivateContainer();
\r
113 int newPriority = fact.activate(context, priority);
\r
115 System.out.println(" [" + currentPriority + "] " + fact + " oldPriority=" + priority + ", newPriority=" + newPriority);
\r
116 if(newPriority >= 0)
\r
117 add(newPriority, fact);
\r