package jscl.math.function; import jscl.math.*; import jscl.mathml.MathML; import javax.annotation.Nonnull; import java.util.Arrays; import java.util.List; public class Comparison extends Function { public static final List<String> names = Arrays.asList("eq", "le", "ge", "ne", "lt", "gt", "ap"); private static final String eass[] = {"=", "<=", ">=", "<>", "<", ">", "~"}; private static final String easj[] = {"==", "<=", ">=", "!=", "<", ">", "=="}; private static final String easm[] = {"=", "\u2264", "\u2265", "\u2260", "<", ">", "\u2248"}; int operator; public Comparison(String name, Generic expression1, Generic expression2) { super(name, new Generic[]{expression1, expression2}); operator = names.indexOf(name); if (operator < 0) { throw new ArithmeticException(name + " comparison function doesn't exist!"); } } @Override public int getMinParameters() { return 2; } public Generic antiDerivative(int n) throws NotIntegrableException { throw new NotIntegrableException(this); } public Generic derivative(int n) { return JsclInteger.valueOf(0); } public Generic selfExpand() { try { return compare(parameters[0].integerValue(), parameters[1].integerValue()); } catch (NotIntegerException e) { } return expressionValue(); } public Generic selfElementary() { return expressionValue(); } public Generic selfSimplify() { return expressionValue(); } public Generic selfNumeric() { return compare((NumericWrapper) parameters[0], (NumericWrapper) parameters[1]); } JsclInteger compare(JsclInteger a1, JsclInteger a2) { return JsclInteger.valueOf(compare((Generic) a1, a2) ? 1 : 0); } NumericWrapper compare(NumericWrapper a1, NumericWrapper a2) { return new NumericWrapper(JsclInteger.valueOf(compare(a1, (Generic) a2) ? 1 : 0)); } boolean compare(Generic a1, Generic a2) { switch (operator) { case 0: return a1.compareTo(a2) == 0; case 1: return a1.compareTo(a2) <= 0; case 2: return a1.compareTo(a2) >= 0; case 3: return a1.compareTo(a2) != 0; case 4: return a1.compareTo(a2) < 0; case 5: return a1.compareTo(a2) > 0; case 6: return a1.compareTo(a2) == 0; default: return false; } } public String toJava() { final StringBuilder result = new StringBuilder(); result.append(parameters[0].toJava()).append(easj[operator]).append(parameters[1].toJava()); return result.toString(); } public void toMathML(MathML element, Object data) { parameters[0].toMathML(element, null); MathML e1 = element.element("mo"); e1.appendChild(element.text(easm[operator])); element.appendChild(e1); parameters[1].toMathML(element, null); } @Nonnull public Variable newInstance() { return new Comparison(name, null, null); } }