public void closureOneByOne(FcaMatrix matrix, FcaTree tree) { FcaObject nextObject = new FcaObject(); FcaTree node; do { do { nextObject = matrix.getElemById(tree.getNextId() + 1); if (nextObject != null) { FcaObjectSet q = new FcaObjectSet(); q = tree.getMainSet().clone(); q.closure(nextObject, matrix); FcaObjectSet dif =q.difference(tree.getMainSet()); if (dif.minObject() == nextObject) { node = new FcaTree(); node.setMainSet(q); listOfSets.Add(q); node.setNextId(q.maxObject().getId()); node.setParent(tree); tree.addDescendant(node); listOfNodes.Add(node); closureOneByOne(matrix, node); tree.setNextId(nextObject.getId()); } else { tree.setNextId(nextObject.getId()); } } } while (nextObject != null); if (tree.getParent() != null) tree = tree.getParent(); } while ((tree.getParent() != null) && (nextObject != null)); }
/// <summary> /// Замыкание множества /// </summary> /// <param name="elem">добавляемый элемент</param> /// <param name="matrix">универсальное множество</param> public void closure(FcaObject elem, FcaMatrix matrix) { addObject(elem); int i = 0; int len = matrix.count(); int[] vect = new int[this.attributes.Length]; while (i < len){ vect = intersect(matrix.getElemById(i).getAttributes()); if (attrEquals(vect)&&(i!=elem.getId())) { addObject(matrix.getElemById(i)); } i++; } }