001 package com.hammurapi.reasoning.impl;
002
003 import java.util.ArrayList;
004 import java.util.Collection;
005 import java.util.Iterator;
006
007 import com.hammurapi.convert.ConvertingService;
008 import com.hammurapi.reasoning.spi.Superseder;
009
010 /**
011 * Compacts collections of facts by removing facts superseded
012 * by other facts in the collection.
013 * @author Pavel Vlasov
014 *
015 */
016 public class KnowledgeCompactor {
017
018 @SuppressWarnings("unchecked")
019 static <F> Collection<F> compact(Collection<F> input) {
020 F[] elements = (F[]) new Object[input.size()];
021 Iterator<F> it = input.iterator();
022 for (int i=0; it.hasNext(); ++i) {
023 elements[i] = it.next();
024 }
025
026 for (int i=0; i<elements.length; ++i) {
027 if (elements[i]!=null) {
028 Superseder superseder = ConvertingService.convert(elements[i], Superseder.class);
029 if (superseder!=null) {
030 for (int j=0; j<elements.length; ++j) {
031 if (j!=i && elements[j]!=null && superseder.supersedes(elements[j])) {
032 elements[j] = null;
033 }
034 }
035 }
036 }
037 }
038
039 Collection<F> ret = new ArrayList<F>();
040 for (F element: elements) {
041 if (element!=null) {
042 ret.add(element);
043 }
044 }
045 return ret;
046 }
047 }