package jadex.rules.rulesystem; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeSet; /** * An agenda that sorts activations according to their priority. */ public class PriorityAgenda extends AbstractAgenda { //-------- attributes -------- /** The activations. */ protected TreeSet activations; /** The next activation (selected by strategy or manually form outside for debugging). */ protected Activation next; /** The map containing the activation order count (for FIFO in case two activations are equal). */ protected Map counts; /** The current count. */ protected long count; //-------- constructors -------- /** * Create a new agenda. */ public PriorityAgenda() { this.counts = new HashMap(); this.activations = new TreeSet(new Comparator() { public int compare(Object arg0, Object arg1) { Activation act0 = (Activation)arg0; Activation act1 = (Activation)arg1; // if(act0==null || act1==null) // System.out.println("test"); int ret = act0.getPriority()-act1.getPriority(); if(ret==0) { Long tmp0 = (Long)counts.get(act0); Long tmp1 = (Long)counts.get(act1); long cnt0 = tmp0==null? 0: tmp0.longValue(); long cnt1 = tmp1==null? 0: tmp1.longValue(); // FIFO ret = (int)(cnt1-cnt0); } return ret; } }); } // long total = 0; // long last = 0; // long lasttime = 0; /** * Add a new activation. * @param act The activation. */ public void addActivation(Activation act) { // total -= System.nanoTime(); // System.out.println("Add: "+act); this.counts.put(act, new Long(count++)); this.activations.add(act); state++; notifyListeners(); // total += System.nanoTime(); // long currenttime = System.currentTimeMillis(); // if(currenttime>lasttime+1000) // { // if(lasttime!=0) // System.out.println("Total agenda time: "+((int)(total/1000000.0))+" ms, "+((int)((total-last)/1000.0)/(currenttime-lasttime))/10.0+"% in last step."); // last = total; // lasttime = currenttime; // } } /** * Remove an activation * @param act The activation. */ public void removeActivation(Activation act) { // total -= System.nanoTime(); // System.out.println("Remove: "+act); this.activations.remove(act); this.counts.remove(act); if(next==act) next = null; // state++; notifyListeners(); // total += System.nanoTime(); // long currenttime = System.currentTimeMillis(); // if(currenttime>lasttime+1000) // { // if(lasttime!=0) // System.out.println("Total agenda time: "+((int)(total/1000000.0))+" ms, "+((int)((total-last)/1000.0)/(currenttime-lasttime))/10.0+"% in last step."); // lasttime = currenttime; // last = total; // } } /** * Get the current activations. * @return The activations. */ public Collection getActivations() { return activations; } /** * Test if the agenda is empty. * @return True if is empty. */ public boolean isEmpty() { return activations.isEmpty(); } /** * Get the next activation. * @return The next activation. */ public Activation getNextActivation() { Activation ret = next; if(ret==null && activations.size()>0) { ret = (Activation)activations.last(); } assert next==null || activations.contains(next); return ret; } /** * Set the next activation. */ public void setNextActivation(Activation next) { // System.out.println("Set next: "+next); if(activations.contains(next)) { this.next = next; } else { throw new RuntimeException("Activation not in agenda: "+next+", "+this); } notifyListeners(); } }