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}