in explainability/explainability-service/src/main/java/org/kie/kogito/explainability/ConversionUtils.java [215:240]
static Optional<FeatureDomain> toCounterfactualSearchDomain(CounterfactualDomain domain) {
if (Objects.isNull(domain)) {
return Optional.of(EmptyFeatureDomain.create());
} else if (domain instanceof CounterfactualDomainRange) {
CounterfactualDomainRange range = (CounterfactualDomainRange) domain;
JsonNode lb = range.getLowerBound();
JsonNode ub = range.getUpperBound();
if (lb.isNumber() && ub.isNumber()) {
return Optional.of(NumericalFeatureDomain.create(range.getLowerBound().asDouble(), range.getUpperBound().asDouble()));
} else {
throw new IllegalArgumentException(String.format("Unsupported CounterfactualDomainRange [%s, %s]", lb.asText(), ub.asText()));
}
} else if (domain instanceof CounterfactualDomainCategorical) {
CounterfactualDomainCategorical categorical = (CounterfactualDomainCategorical) domain;
Collection<JsonNode> jsonCategories = categorical.getCategories();
String[] categories = new String[jsonCategories.size()];
if (jsonCategories.stream().allMatch(JsonNode::isTextual)) {
jsonCategories.stream().map(JsonNode::asText).collect(Collectors.toList()).toArray(categories);
return Optional.of(CategoricalFeatureDomain.create(categories));
} else {
throw new IllegalArgumentException(String.format("Unsupported CounterfactualDomainCategorical [%s]", String.join(", ", categories)));
}
}
return Optional.empty();
}