@Override public SearchArgument build() { if (currentTree.size() != 1) { throw new IllegalArgumentException("Failed to end " + currentTree.size() + " operations."); } ExpressionTree optimized = pushDownNot(root); optimized = foldMaybe(optimized); optimized = flatten(optimized); optimized = convertToCNF(optimized); optimized = flatten(optimized); int leafReorder[] = new int[leaves.size()]; Arrays.fill(leafReorder, -1); int newLeafCount = compactLeaves(optimized, 0, leafReorder); optimized = rewriteLeaves(optimized, leafReorder); ArrayList<PredicateLeaf> leafList = new ArrayList<>(newLeafCount); // expand list to correct size for(int i=0; i < newLeafCount; ++i) { leafList.add(null); } // build the new list for(Map.Entry<PredicateLeaf, Integer> elem: leaves.entrySet()) { int newLoc = leafReorder[elem.getValue()]; if (newLoc != -1) { leafList.set(newLoc, elem.getKey()); } } return new SearchArgumentImpl(optimized, leafList); }
root.getChildren().set(i, convertToCNF(root.getChildren().get(i)));
constant(TruthValue.YES_NO_NULL)), leaf(1))).toString()); assertEquals("(and leaf-100)", SearchArgumentImpl.BuilderImpl.foldMaybe( SearchArgumentImpl.BuilderImpl.convertToCNF(and(leaf(100), or(and(leaf(0), leaf(1)), and(leaf(2), leaf(3)),
root.getChildren().set(i, convertToCNF(root.getChildren().get(i)));
@Override public SearchArgument build() { if (currentTree.size() != 1) { throw new IllegalArgumentException("Failed to end " + currentTree.size() + " operations."); } ExpressionTree optimized = pushDownNot(root); optimized = foldMaybe(optimized); optimized = flatten(optimized); optimized = convertToCNF(optimized); optimized = flatten(optimized); int leafReorder[] = new int[leaves.size()]; Arrays.fill(leafReorder, -1); int newLeafCount = compactLeaves(optimized, 0, leafReorder); optimized = rewriteLeaves(optimized, leafReorder); ArrayList<PredicateLeaf> leafList = new ArrayList<>(newLeafCount); // expand list to correct size for(int i=0; i < newLeafCount; ++i) { leafList.add(null); } // build the new list for(Map.Entry<PredicateLeaf, Integer> elem: leaves.entrySet()) { int newLoc = leafReorder[elem.getValue()]; if (newLoc != -1) { leafList.set(newLoc, elem.getKey()); } } return new SearchArgumentImpl(optimized, leafList); }
@Test public void testCNF() throws Exception { assertEquals("leaf-1", SearchArgumentImpl.BuilderImpl.convertToCNF(leaf(1)). toString()); assertEquals("NO", SearchArgumentImpl.BuilderImpl.convertToCNF( constant(TruthValue.NO)).toString()); assertEquals("(not leaf-1)", SearchArgumentImpl.BuilderImpl.convertToCNF( not(leaf(1))).toString()); assertEquals("(and leaf-1 leaf-2)", SearchArgumentImpl.BuilderImpl. convertToCNF( and(leaf(1), leaf(2))).toString()); assertEquals("(or (not leaf-1) leaf-2)", SearchArgumentImpl.BuilderImpl. convertToCNF( or(not(leaf(1)), leaf(2))).toString()); assertEquals("(and (or leaf-1 leaf-2) (not leaf-3))", SearchArgumentImpl.BuilderImpl.convertToCNF( and(or(leaf(1), leaf(2)), not(leaf(3)))).toString()); assertEquals("(and (or leaf-1 leaf-3) (or leaf-2 leaf-3)" + " (or leaf-1 leaf-4) (or leaf-2 leaf-4))", SearchArgumentImpl.BuilderImpl.convertToCNF( or(and(leaf(1), leaf(2)), and(leaf(3), leaf(4)))).toString()); assertEquals("(and" + " (or leaf-1 leaf-6) (or leaf-2 leaf-6)" + " (or leaf-3 leaf-6) (or leaf-4 leaf-6))", SearchArgumentImpl.BuilderImpl.convertToCNF( or(and(leaf(1), leaf(2), leaf(3), leaf(4)), and(leaf(5), leaf(6)))).toString()); " (or leaf-5 leaf-6 (not leaf-7) leaf-1 leaf-4)" +