001package conexp.fx.core.context.negation;
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.ArrayList;
026import java.util.Collection;
027
028import org.ujmp.core.calculation.Calculation.Ret;
029
030import conexp.fx.core.context.MatrixContext;
031import conexp.fx.core.context.negation.Literal.Type;
032
033public class NegationScaling {
034
035  public static final <G, M> MatrixContext<G, Literal<M>> negationScaling(
036      final MatrixContext<G, M> cxt,
037      final Collection<M> attributes) {
038    final MatrixContext<G, Literal<M>> ncxt = new MatrixContext<G, Literal<M>>(false);
039    final ArrayList<Literal<M>> negations = new ArrayList<Literal<M>>();
040    ncxt.rowHeads().addAll(cxt.rowHeads());
041    for (M m : cxt.colHeads()) {
042      ncxt.colHeads().add(new Literal<M>(m));
043      if (attributes.contains(m))
044        negations.add(new Literal<M>(Type.NEGATIVE, m));
045    }
046    ncxt.colHeads().addAll(negations);
047    ncxt.setMatrix(cxt
048        .matrix()
049        .clone()
050        .appendHorizontally(Ret.NEW,
051            cxt.matrix().selectColumns(Ret.NEW, cxt.colHeads().indicesOf(attributes, false)).not(Ret.NEW))
052        .toBooleanMatrix());
053    return ncxt;
054  }
055
056}