/*
* #%L
* gitools-utils
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.utils.cutoffcmp;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public abstract class CutoffCmp implements Serializable {
private static final long serialVersionUID = 6256197968707025432L;
public static final CutoffCmp LT = new CutoffCmp("lt", "<", "less than") {
@Override
public boolean compare(double value, double cutoff) {
return value < cutoff;
}
};
private static final CutoffCmp LE = new CutoffCmp("le", "<=", "less than or equal to") {
@Override
public boolean compare(double value, double cutoff) {
return value <= cutoff;
}
};
public static final CutoffCmp EQ = new CutoffCmp("eq", "=", "equal to") {
@Override
public boolean compare(double value, double cutoff) {
return value == cutoff;
}
};
public static final CutoffCmp NE = new CutoffCmp("ne", "!=", "not equal to") {
@Override
public boolean compare(double value, double cutoff) {
return value != cutoff;
}
};
private static final CutoffCmp GT = new CutoffCmp("gt", ">", "greater than") {
@Override
public boolean compare(double value, double cutoff) {
return value > cutoff;
}
};
public static final CutoffCmp GE = new CutoffCmp("ge", ">=", "greater than or equal to") {
@Override
public boolean compare(double value, double cutoff) {
return value >= cutoff;
}
};
public static final CutoffCmp ABS_LT = new CutoffCmp("alt", "abs <", "absolute less than") {
@Override
public boolean compare(double value, double cutoff) {
return Math.abs(value) < Math.abs(cutoff);
}
};
public static final CutoffCmp ABS_LE = new CutoffCmp("ale", "abs <=", "absolute less than or equal to") {
@Override
public boolean compare(double value, double cutoff) {
return Math.abs(value) <= Math.abs(cutoff);
}
};
public static final CutoffCmp ABS_EQ = new CutoffCmp("aeq", "abs =", "absolute equal to") {
@Override
public boolean compare(double value, double cutoff) {
return Math.abs(value) == Math.abs(cutoff);
}
};
public static final CutoffCmp ABS_NE = new CutoffCmp("ane", "abs !=", "absolute not equal to") {
@Override
public boolean compare(double value, double cutoff) {
return Math.abs(value) != Math.abs(cutoff);
}
};
public static final CutoffCmp ABS_GT = new CutoffCmp("agt", "abs >", "absolute greater than") {
@Override
public boolean compare(double value, double cutoff) {
return Math.abs(value) > Math.abs(cutoff);
}
};
public static final CutoffCmp ABS_GE = new CutoffCmp("age", "abs >=", "absolute greater than or equal to") {
@Override
public boolean compare(double value, double cutoff) {
return Math.abs(value) >= Math.abs(cutoff);
}
};
public static final CutoffCmp[] comparators = new CutoffCmp[]{LT, LE, GT, GE, EQ, NE, ABS_LT, ABS_LE, ABS_GT, ABS_GE, ABS_EQ, ABS_NE};
private static final BiMap opposite = HashBiMap.create();
static {
opposite.put(CutoffCmp.LT, CutoffCmp.GE);
opposite.put(CutoffCmp.LE, CutoffCmp.GT);
opposite.put(CutoffCmp.EQ, CutoffCmp.NE);
opposite.put(CutoffCmp.ABS_LT, CutoffCmp.ABS_GE);
opposite.put(CutoffCmp.ABS_LE, CutoffCmp.ABS_GT);
opposite.put(CutoffCmp.ABS_EQ, CutoffCmp.ABS_NE);
}
private static final Map<String, CutoffCmp> abbreviatedNameMap = new HashMap<>();
private static final Map<String, CutoffCmp> shortNameMap = new HashMap<>();
private static final Map<String, CutoffCmp> longNameMap = new HashMap<>();
private static final Map<String, CutoffCmp> nameMap = new HashMap<>();
static {
for (CutoffCmp cmp : comparators) {
abbreviatedNameMap.put(cmp.getAbbreviation(), cmp);
shortNameMap.put(cmp.getShortName(), cmp);
longNameMap.put(cmp.getLongName(), cmp);
nameMap.put(cmp.getAbbreviation(), cmp);
nameMap.put(cmp.getShortName(), cmp);
nameMap.put(cmp.getLongName(), cmp);
}
}
public static CutoffCmp getFromName(String name) {
return nameMap.get(name);
}
private final String abbreviation;
private final String shortName;
private final String longName;
public CutoffCmp(String abbreviation, String shortName, String longName) {
this.abbreviation = abbreviation;
this.shortName = shortName;
this.longName = longName;
}
public String getAbbreviation() {
return abbreviation;
}
public String getShortName() {
return shortName;
}
public String getLongName() {
return longName;
}
public static CutoffCmp getOpposite(CutoffCmp key) {
if (opposite.get(key) == null) {
return (CutoffCmp) (opposite.inverse().get(key));
} else {
return (CutoffCmp) (opposite.get(key));
}
}
public abstract boolean compare(double value, double cutoff);
@Override
public String toString() {
return shortName;
}
}