package jscl.math.operator; import jscl.math.Generic; import jscl.math.GenericVariable; import jscl.math.JsclVector; import jscl.math.Variable; import javax.annotation.Nonnull; public class Substitute extends Operator { public static final String NAME = "subst"; public Substitute(Generic expression, Generic variable, Generic value) { super(NAME, new Generic[]{expression, variable, value}); } private Substitute(Generic parameters[]) { super(NAME, parameters); } @Override public int getMinParameters() { return 3; } public Generic selfExpand() { if (parameters[1] instanceof JsclVector && parameters[2] instanceof JsclVector) { Generic a = parameters[0]; Variable variable[] = toVariables((JsclVector) parameters[1]); Generic s[] = ((JsclVector) parameters[2]).elements(); for (int i = 0; i < variable.length; i++) a = a.substitute(variable[i], s[i]); return a; } else { Variable variable = parameters[1].variableValue(); return parameters[0].substitute(variable, parameters[2]); } } public Operator transmute() { Generic p[] = new Generic[]{null, GenericVariable.content(parameters[1]), GenericVariable.content(parameters[2])}; if (p[1] instanceof JsclVector && p[2] instanceof JsclVector) { return new Substitute(parameters[0], p[1], p[2]); } return this; } public Generic expand() { return selfExpand(); } @Nonnull @Override public Operator newInstance(@Nonnull Generic[] parameters) { return new Substitute(parameters).transmute(); } @Nonnull public Variable newInstance() { return new Substitute(null, null, null); } }