package org.geogebra.common.kernel.cas; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.kernel.algos.AlgoElement; import org.geogebra.common.kernel.arithmetic.FunctionalNVar; import org.geogebra.common.kernel.arithmetic.MyArbitraryConstant; import org.geogebra.common.kernel.commands.Commands; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoFunction; import org.geogebra.common.kernel.geos.GeoFunctionNVar; /** * Algorithm for ImplicitDerivative[f(x,y)] * */ public class AlgoImplicitDerivative extends AlgoElement implements UsesCAS { private GeoFunctionNVar result; private FunctionalNVar functional; /** * @param cons * construction * @param label * label for output * @param functional * function of two variables */ public AlgoImplicitDerivative(Construction cons, String label, FunctionalNVar functional) { super(cons); this.functional = functional; this.result = new GeoFunctionNVar(cons); setInputOutput(); compute(); result.setLabel(label); } @Override protected void setInputOutput() { setOnlyOutput(result); if (functional instanceof GeoFunctionNVar) { input = new GeoElement[] { (GeoFunctionNVar) functional }; } if (functional instanceof GeoFunction) { input = new GeoElement[] { (GeoFunction) functional }; } setDependencies(); } private MyArbitraryConstant arbconst = new MyArbitraryConstant(this); @Override public void compute() { StringTemplate tpl = StringTemplate.prefixedDefault; StringBuilder sb = new StringBuilder(80); sb.append("ImplicitDerivative("); sb.append(functional.toValueString(tpl)); sb.append(")"); try { String functionOut = kernel.evaluateCachedGeoGebraCAS(sb.toString(), arbconst); if (functionOut == null || functionOut.length() == 0) { result.setUndefined(); } else { // read result back into function result.set(kernel.getAlgebraProcessor() .evaluateToFunctionNVar(functionOut, true)); } } catch (Throwable e) { result.setUndefined(); } } @Override public Commands getClassName() { return Commands.ImplicitDerivative; } /** * @return resulting derivative */ public GeoFunctionNVar getResult() { return result; } }