package jscl.math.operator; import jscl.math.Generic; import jscl.math.JsclInteger; import jscl.math.Variable; import jscl.math.function.Root; import jscl.math.polynomial.Polynomial; import jscl.math.polynomial.UnivariatePolynomial; import jscl.mathml.MathML; import javax.annotation.Nonnull; public class Solve extends Operator { public static final String NAME = "solve"; public Solve(Generic expression, Generic variable, Generic subscript) { super(NAME, new Generic[]{expression, variable, subscript}); } public Solve(Generic parameters[]) { super(NAME, createParameters(parameters)); } private static Generic[] createParameters(Generic[] parameters) { final Generic[] result = new Generic[3]; result[0] = parameters[0]; result[1] = parameters[1]; result[2] = parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0); return result; } @Override public int getMinParameters() { return 2; } @Override public int getMaxParameters() { return 3; } public Generic selfExpand() { final Variable variable = parameters[1].variableValue(); int subscript = parameters[2].integerValue().intValue(); if (parameters[0].isPolynomial(variable)) { return new Root((UnivariatePolynomial) Polynomial.factory(variable).valueOf(parameters[0]), subscript).selfExpand(); } return expressionValue(); } // todo serso: think /*public String toString() { StringBuilder result = new StringBuilder(); int n=3; if(parameters[2].signum()==0) n=2; result.append(name); result.append("("); for(int i=0;i<n;i++) { result.append(parameters[i]).append(i<n-1?", ":""); } result.append(")"); return result.toString(); }*/ public void toMathML(MathML element, Object data) { MathML e1; int exponent = data instanceof Integer ? (Integer) data : 1; int n = 3; if (parameters[2].signum() == 0) n = 2; if (exponent == 1) nameToMathML(element); else { e1 = element.element("msup"); nameToMathML(e1); MathML e2 = element.element("mn"); e2.appendChild(element.text(String.valueOf(exponent))); e1.appendChild(e2); element.appendChild(e1); } e1 = element.element("mfenced"); for (int i = 0; i < n; i++) { parameters[i].toMathML(e1, null); } element.appendChild(e1); } @Nonnull @Override public Operator newInstance(@Nonnull Generic[] parameters) { return new Solve(parameters); } @Nonnull public Variable newInstance() { return new Solve(null, null, null); } }