001package conexp.fx.core.algorithm.nextclosures.mn;
002
003/*
004 * #%L
005 * Concept Explorer FX
006 * %%
007 * Copyright (C) 2010 - 2019 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.HashSet;
026import java.util.Set;
027
028import com.google.common.collect.Sets;
029
030import conexp.fx.core.context.MatrixContext;
031
032public final class MatrixContextMN<G, M> {
033
034  private final MatrixContext<G, M> cxt;
035  private final Set<M>              premises;
036  private final Set<M>              conclusions;
037  private final MatrixContext<G, M> cxtM;
038  private final MatrixContext<G, M> cxtN;
039
040  public MatrixContextMN(final MatrixContext<G, M> cxt, final Set<M> premises, final Set<M> conclusions) {
041    if (!Sets.intersection(
042        premises,
043        conclusions).isEmpty())
044      throw new RuntimeException();
045    this.cxt = cxt;
046    this.premises = premises;
047    this.conclusions = conclusions;
048    this.cxtM = cxt.subRelation(
049        cxt.rowHeads(),
050        premises).clone();
051    this.cxtN = cxt.subRelation(
052        cxt.rowHeads(),
053        conclusions).clone();
054  }
055
056  public final Set<M> closureMN(final Set<M> set) {
057    if (!premises.containsAll(set))
058      throw new RuntimeException();
059    return new HashSet<M>(cxtN.rowAnd(new HashSet<G>(cxtM.colAnd(set))));
060  }
061
062  public final Set<M> intentM(final Set<M> set) {
063    if (!premises.containsAll(set))
064      throw new RuntimeException();
065    return new HashSet<M>(cxtM.intent(set));
066  }
067
068}