package edu.stanford.nlp.sempre; import fig.basic.LogInfo; import fig.basic.PriorityQueue; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * Data structure for agenda in reinforcement parser * Created by joberant on 10/20/14. */ public interface ParserAgenda<PrioritizedDerivationStream> extends Iterable<PrioritizedDerivationStream> { void sort(); boolean add(PrioritizedDerivationStream item, double priority); int size(); void clear(); PrioritizedDerivationStream pop(); PrioritizedDerivationStream get(int i); void remove(PrioritizedDerivationStream pds, int index); } class ListParserAgenda implements ParserAgenda<PrioritizedDerivationStream> { private List<PrioritizedDerivationStream> agenda = new ArrayList<>(); @Override public void sort() { Collections.sort(agenda); } @Override public boolean add(PrioritizedDerivationStream item, double priority) { return agenda.add(item); } @Override public int size() { return agenda.size(); } @Override public void clear() { agenda.clear(); } @Override public PrioritizedDerivationStream pop() { // todo - replace sort with finding max (check if makes it faster) sort(); PrioritizedDerivationStream pds = agenda.get(0); remove(pds, 0); return pds; } @Override public PrioritizedDerivationStream get(int i) { return agenda.get(i); } @Override public void remove(PrioritizedDerivationStream pds, int index) { PrioritizedDerivationStream last = agenda.remove(agenda.size() - 1); if (last != pds) agenda.set(index, last); } @Override public Iterator<PrioritizedDerivationStream> iterator() { return agenda.iterator(); } } class QueueParserAgenda implements ParserAgenda<PrioritizedDerivationStream> { private PriorityQueue<PrioritizedDerivationStream> agenda = new PriorityQueue<>(); @Override public void sort() { } @Override public boolean add(PrioritizedDerivationStream item, double priority) { return agenda.add(item, priority); } @Override public int size() { return agenda.size(); } @Override public void clear() { // hopefully this is never called since we sample just one LogInfo.warning("QueueParserAgenda: clear is only called when we have more than one sample"); while (agenda.hasNext()) agenda.next(); } @Override public PrioritizedDerivationStream pop() { return agenda.next(); } @Override public PrioritizedDerivationStream get(int i) { throw new RuntimeException("Not supported"); } @Override public void remove(PrioritizedDerivationStream pds, int index) { throw new RuntimeException("Not supported"); } @Override public Iterator<PrioritizedDerivationStream> iterator() { throw new RuntimeException("Not supported"); } }