* The search starts with the empty rule, other rules are generated by
* refinement.
*/
public void search() {
SimpleLinkedList nodes = new SimpleLinkedList(); /* The agenda. */
Rule currentNode;
SimpleLinkedList children;
SimpleLinkedList.LinkedListIterator iter;
Rule child;
boolean negBody = (m_negation == BODY || m_negation == ALL);
boolean negHead = (m_negation == HEAD || m_negation == ALL);
/* Start with the empty rule. */
nodes.add(new Rule(m_repeat, m_numLiterals, negBody, negHead,
m_classification, m_horn));
/* Print the current values. */
printValues();
/* Explore the rules in the agenda. */
while (m_status != STOP && !nodes.isEmpty()) {
currentNode = (Rule) nodes.removeFirst();
if (canRefine(currentNode)) {
children = currentNode.refine(m_predicates);
iter = children.iterator();
/* Calculate the optimistic estimate of the children and
* consider them for adding to the agenda and to the results. */
while (iter.hasNext()) {
m_hypotheses++;
child = (Rule) iter.next();
child.upDate(m_instances);
if (canCalculateOptimistic(child)) {
child.calculateOptimistic();
if (canExplore(child)) {
m_explored++;
if (canStoreInNodes(child)) {
} else {
iter.remove();
}
if (canCalculateConfirmation(child)) {
child.calculateConfirmation();
if (canStoreInResults(child)) {
addResult(child);
}
}
} else {
iter.remove();
}
} else {
iter.remove();
}
}
/* Since the agenda is already sorted it is more efficient
* to sort the children only and then merge. */
children.sort(Rule.optimisticThenObservedComparator);
nodes.merge(children, Rule.optimisticThenObservedComparator);
} else {
/* The agenda being sorted, it is not worth considering the following
* nodes. */
break;