package splar.core.heuristics; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; import splar.core.constraints.BooleanVariableInterface; import splar.core.constraints.CNFFormula; import splar.core.fm.FeatureGroup; import splar.core.fm.FeatureModel; import splar.core.fm.FeatureTreeNode; public class FTPostOrderTraversalHeuristic extends FTTraversalHeuristic { public FTPostOrderTraversalHeuristic(String name, FeatureModel featureModel) { super(name, featureModel); } public String[] runHeuristic(CNFFormula cnf) { // runPreProcessing(cnf); featureModel.resetNodesAttachedData(); String varOrder[] = new String[cnf.getVariables().size()]; Set<BooleanVariableInterface> cnfVariables = cnf.getVariables(); Stack<FeatureTreeNode> nodes = new Stack<FeatureTreeNode>(); FeatureTreeNode curNode = featureModel.getRoot(); List<FeatureTreeNode> childNodes = new ArrayList<FeatureTreeNode>(); for( FeatureTreeNode node : orderChildNodes(curNode)) { childNodes.add(node); } curNode.attachData(childNodes); nodes.push(curNode); int curIndex = 0; while ( nodes.size() > 0 ) { curNode = nodes.peek(); if ( curNode != null ) { childNodes = (List<FeatureTreeNode>)(curNode.getAttachedData()); if ( childNodes.size() > 0 ) { FeatureTreeNode childNode = childNodes.get(0); childNodes.remove(0); List<FeatureTreeNode> childChildNodes = new ArrayList<FeatureTreeNode>(); for( FeatureTreeNode node : orderChildNodes(childNode)) { childChildNodes.add(node); } childNode.attachData(childChildNodes); nodes.push(childNode); } else { nodes.pop(); if ( !(curNode instanceof FeatureGroup) ) { if ( cnfVariables.contains(curNode) ) { varOrder[curIndex++] = curNode.getID(); } } } } } // runPostProcessing(cnf); return varOrder; } protected FeatureTreeNode[] orderChildNodes(FeatureTreeNode node) { int count = node.getChildCount(); FeatureTreeNode nodes[] = new FeatureTreeNode[count]; for( int i = 0 ; i < count ; i++ ) { nodes[i] = ((FeatureTreeNode)node.getChildAt(i)); } return nodes; } }