001package conexp.fx.core.context; 002 003/* 004 * #%L 005 * Concept Explorer FX 006 * %% 007 * Copyright (C) 2010 - 2023 Francesco Kriegel 008 * %% 009 * This program is free software: you can redistribute it and/or modify 010 * it under the terms of the GNU General Public License as 011 * published by the Free Software Foundation, either version 3 of the 012 * License, or (at your option) any later version. 013 * 014 * This program is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 017 * GNU General Public License for more details. 018 * 019 * You should have received a copy of the GNU General Public 020 * License along with this program. If not, see 021 * <http://www.gnu.org/licenses/gpl-3.0.html>. 022 * #L% 023 */ 024 025import java.util.Collection; 026import java.util.Iterator; 027import java.util.Set; 028 029import com.google.common.base.Function; 030import com.google.common.collect.Iterators; 031 032import de.tudresden.inf.tcs.fcaapi.Expert; 033import de.tudresden.inf.tcs.fcaapi.FCAImplication; 034import de.tudresden.inf.tcs.fcaapi.FCAObject; 035import de.tudresden.inf.tcs.fcaapi.exception.IllegalAttributeException; 036import de.tudresden.inf.tcs.fcaapi.exception.IllegalObjectException; 037import de.tudresden.inf.tcs.fcaapi.utils.IndexedSet; 038import de.tudresden.inf.tcs.fcalib.FullObject; 039import de.tudresden.inf.tcs.fcalib.FullObjectDescription; 040 041public final class FCALibContext<G, M> extends de.tudresden.inf.tcs.fcalib.AbstractContext<M, G, FCAObject<M, G>> { 042 043 private final MatrixContext<G, M> cxt; 044 private Expert<M, G, FCAObject<M, G>> expert; 045 046 public FCALibContext(final MatrixContext<G, M> cxt) { 047 super(); 048 this.cxt = cxt; 049 this.getAttributes().addAll(cxt.colHeads()); 050 } 051 052 @Override 053 public FCAObject<M, G> getObject(G id) { 054 return new FullObject<M, G>(id, cxt.row(id)); 055 } 056 057 @Override 058 public FCAObject<M, G> getObjectAtIndex(int index) { 059 return getObject(cxt.rowHeads().get(index)); 060 } 061 062 @Override 063 public boolean objectHasAttribute(FCAObject<M, G> object, M attribute) { 064 return cxt.contains(object.getIdentifier(), attribute); 065 } 066 067 @Override 068 public Set<FCAImplication<M>> getDuquenneGuiguesBase() { 069 return null; 070 } 071 072 @Override 073 public Expert<M, G, FCAObject<M, G>> getExpert() { 074 return expert; 075 } 076 077 @Override 078 public void setExpert(Expert<M, G, FCAObject<M, G>> e) { 079 expert = e; 080 } 081 082 @Override 083 public IndexedSet<FCAObject<M, G>> getObjects() { 084 return new IndexedSet<FCAObject<M, G>>() { 085 086 @Override 087 public int size() { 088 return cxt.rowHeads().size(); 089 } 090 091 @Override 092 public boolean isEmpty() { 093 return cxt.rowHeads().isEmpty(); 094 } 095 096 @Override 097 public boolean contains(Object o) { 098 if (o instanceof FCAObject) 099 return cxt.rowHeads().contains(((FCAObject<?, ?>) o).getIdentifier()); 100 return cxt.rowHeads().contains(o); 101 } 102 103 @Override 104 public Iterator<FCAObject<M, G>> iterator() { 105 return Iterators.transform(cxt.rowHeads().iterator(), new Function<G, FCAObject<M, G>>() { 106 107 @Override 108 public FCAObject<M, G> apply(G object) { 109 return getObject(object); 110 } 111 }); 112 } 113 114 @Override 115 public Object[] toArray() { 116 return cxt.rowHeads().toArray(); 117 } 118 119 @Override 120 public <T> T[] toArray(T[] a) { 121 return cxt.rowHeads().toArray(a); 122 } 123 124 @Override 125 public boolean add(FCAObject<M, G> e) { 126 return cxt.rowHeads().add(e.getIdentifier()) 127 && cxt.row(e.getIdentifier()).addAll(((FullObjectDescription<M>) e.getDescription()).getAttributes()); 128 } 129 130 @Override 131 public boolean remove(Object o) { 132 if (o instanceof FCAObject) 133 return cxt.rowHeads().remove(((FCAObject<?, ?>) o).getIdentifier()); 134 return cxt.rowHeads().remove(o); 135 } 136 137 @Override 138 public boolean containsAll(Collection<?> c) { 139 boolean b = false; 140 for (Object o : c) 141 b |= contains(o); 142 return b; 143 } 144 145 @Override 146 public boolean addAll(Collection<? extends FCAObject<M, G>> c) { 147 boolean b = false; 148 for (FCAObject<M, G> o : c) 149 b |= add(o); 150 return b; 151 } 152 153 @Override 154 public boolean retainAll(Collection<?> c) { 155 // TODO Auto-generated method stub 156 return false; 157 } 158 159 @Override 160 public boolean removeAll(Collection<?> c) { 161 boolean b = false; 162 for (Object o : c) 163 b |= remove(o); 164 return b; 165 } 166 167 @Override 168 public void clear() { 169 cxt.rowHeads().clear(); 170 } 171 172 @Override 173 public int getIndexOf(FCAObject<M, G> e) { 174 return cxt.rowHeads().indexOf(e.getIdentifier()); 175 } 176 177 @Override 178 public FCAObject<M, G> getElementAt(int index) throws IndexOutOfBoundsException { 179 return getObjectAtIndex(index); 180 } 181 182 @Override 183 public void changeOrder() {} 184 }; 185 } 186 187 @Override 188 public boolean addObject(FCAObject<M, G> e) throws IllegalObjectException { 189 return cxt.rowHeads().add(e.getIdentifier()) 190 && cxt.row(e.getIdentifier()).addAll(((FullObjectDescription<M>) e.getDescription()).getAttributes()); 191 } 192 193 @Override 194 public boolean removeObject(G id) throws IllegalObjectException { 195 return cxt.rowHeads().remove(id); 196 } 197 198 @Override 199 public boolean removeObject(FCAObject<M, G> object) throws IllegalObjectException { 200 return cxt.rowHeads().remove(object.getIdentifier()); 201 } 202 203 @Override 204 public boolean addAttributeToObject(M attribute, G id) throws IllegalAttributeException, IllegalObjectException { 205 return cxt.add(id, attribute); 206 } 207 208 @Override 209 public Set<M> doublePrime(Set<M> x) { 210 return cxt.intent(x); 211 } 212 213 @Override 214 public Set<FCAImplication<M>> getStemBase() { 215 return null; 216 } 217 218 @Override 219 public boolean refutes(FCAImplication<M> imp) { 220 return false; 221 } 222 223 @Override 224 public boolean isCounterExampleValid(FCAObject<M, G> counterExample, FCAImplication<M> imp) { 225 return false; 226 } 227 228 @Override 229 protected boolean followsFromBackgroundKnowledge(FCAImplication<M> implication) { 230 return false; 231 } 232 233}