protected Set<AtomicConcept> updateSubsumptionsUsingLeafNodeStrategy() {
Hierarchy<AtomicConcept> hierarchy=buildTransitivelyReducedHierarchy(m_knownSubsumptions);
Set<HierarchyNode<AtomicConcept>> leafNodes=hierarchy.getBottomNode().getParentNodes();
Set<AtomicConcept> processedConcepts=new HashSet<AtomicConcept>();
for (HierarchyNode<AtomicConcept> leafNode : leafNodes) {
AtomicConcept leafNodeElement=leafNode.getRepresentative();
processedConcepts.add(leafNodeElement);
m_progressMonitor.elementClassified(leafNodeElement);
if (!m_possibleSubsumptions.getSuccessors(leafNodeElement).isEmpty() || isUnsatisfiable(leafNodeElement))
continue;
getKnownSubsumersForConcept(leafNodeElement);
// If the leaf was unsatisfable go up to find satisfiable parents. Unsatisfiable parent information can be propagated downwards.
if (isUnsatisfiable(leafNodeElement)) {
Stack<HierarchyNode<AtomicConcept>> parentsToProcess=new Stack<HierarchyNode<AtomicConcept>>();
parentsToProcess.addAll(leafNode.getParentNodes());
HierarchyNode<AtomicConcept> lastUnsatNode=leafNode;
while (!parentsToProcess.isEmpty()) {
HierarchyNode<AtomicConcept> parentNode=parentsToProcess.pop();
AtomicConcept parentElement=parentNode.getRepresentative();
if (isUnsatisfiable(parentElement))
continue;
getKnownSubsumersForConcept(parentElement);
if (!isUnsatisfiable(parentElement)) {
for (HierarchyNode<AtomicConcept> newUnsatNode : lastUnsatNode.getDescendantNodes()) {