docs: public Set<SyntacticCategory> getSubcategories(Set<String> featureValues) {
      Set<Integer> featureVariables = Sets.newHashSet();
      getAllFeatureVariables(featureVariables);
  
      Preconditions.checkState(featureVariables.size() <= 2);
      if (featureVariables.size() == 0) {
        return Sets.newHashSet(this);
      } else if (featureVariables.size() == 1) {
        int varNum = Iterables.getOnlyElement(featureVariables);
        Set<SyntacticCategory> subcategories = Sets.newHashSet(this);
        Map<Integer, String> assignment = Maps.newHashMap();
        Map<Integer, Integer> relabeling = Maps.newHashMap();
        for (String value : featureValues) {
          assignment.clear();
          assignment.put(varNum, value);
          subcategories.add(assignFeatures(assignment, relabeling));
        }
        return subcategories;
      } else {
        List<Integer> list = Lists.newArrayList(featureVariables);
        int varNum1 = list.get(0);
        int varNum2 = list.get(1);
        Set<SyntacticCategory> subcategories = Sets.newHashSet(this);
        Map<Integer, String> assignment = Maps.newHashMap();
        Map<Integer, Integer> relabeling = Maps.newHashMap();
        for (String value1 : featureValues) {
          for (String value2 : featureValues) {
            assignment.clear();
            assignment.put(varNum1, value1);
            assignment.put(varNum2, value2);
            subcategories.add(assignFeatures(assignment, relabeling));
          }
  
          assignment.clear();
          assignment.put(varNum1, value1);
          subcategories.add(assignFeatures(assignment, relabeling));
  
          assignment.clear();
          assignment.put(varNum2, value1);
          subcategories.add(assignFeatures(assignment, relabeling));
        }
        return subcategories;
      }
    }