public static PredicateTreeAnalyzerResult analyzePredicateTree(Predicate predicate) {
        AnalyzerContext context = new AnalyzerContext();
        int treeSize = aggregatePredicateStatistics(predicate, false, context);
        int minFeature = ((int)Math.ceil(findMinFeature(predicate, false, context))) + (context.hasNegationPredicate ? 1 : 0);
        return new PredicateTreeAnalyzerResult(minFeature, treeSize, context.subTreeSizes);
    }
@Test
    void require_that_multiple_indentical_feature_conjunctions_does_not_contribute_more_than_one() {
        Predicate p =
                and(
                        or(
                                conj(
                                        feature("a").inSet("b"),
                                        feature("c").inSet("d")
                                ),
                                feature("x").inSet("y")),
                        or(
                                conj(
                                        feature("a").inSet("b"),
                                        feature("c").inSet("d")
                                ),
                                feature("z").inSet("w")));
        PredicateTreeAnalyzerResult r = PredicateTreeAnalyzer.analyzePredicateTree(p);
        assertEquals(1, r.minFeature);
        assertEquals(4, r.treeSize);
    }