package jscl.math.function; import jscl.math.*; import jscl.mathml.MathML; import javax.annotation.Nonnull; public class Abs extends Function { public Abs(Generic generic) { super("abs", new Generic[]{generic}); } public Generic antiDerivative(int n) throws NotIntegrableException { return Constants.Generic.HALF.multiply(parameters[0]).multiply(new Abs(parameters[0]).selfExpand()); } public Generic derivative(int n) { return new Sgn(parameters[0]).selfExpand(); } public Generic selfExpand() { if (parameters[0].signum() < 0) { return new Abs(parameters[0].negate()).selfExpand(); } try { return parameters[0].integerValue().abs(); } catch (NotIntegerException e) { } return expressionValue(); } public Generic selfElementary() { return new Sqrt( parameters[0].pow(2) ).selfElementary(); } public Generic selfSimplify() { if (parameters[0].signum() < 0) { return new Abs(parameters[0].negate()).selfSimplify(); } try { return parameters[0].integerValue().abs(); } catch (NotIntegerException e) { } try { Variable v = parameters[0].variableValue(); if (v instanceof Abs) { Function f = (Function) v; return f.selfSimplify(); } else if (v instanceof Sgn) { return JsclInteger.valueOf(1); } } catch (NotVariableException e) { } return expressionValue(); } public Generic selfNumeric() { return parameters[0].abs(); } public String toJava() { final StringBuilder result = new StringBuilder(); result.append(parameters[0].toJava()); result.append(".abs()"); return result.toString(); } public void toMathML(MathML element, Object data) { int exponent = data instanceof Integer ? (Integer) data : 1; if (exponent == 1) bodyToMathML(element); else { MathML e1 = element.element("msup"); bodyToMathML(e1); MathML e2 = element.element("mn"); e2.appendChild(element.text(String.valueOf(exponent))); e1.appendChild(e2); element.appendChild(e1); } } void bodyToMathML(MathML element) { MathML e1 = element.element("mfenced"); e1.setAttribute("open", "|"); e1.setAttribute("close", "|"); parameters[0].toMathML(e1, null); element.appendChild(e1); } @Nonnull public Variable newInstance() { return new Abs(null); } }