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