package jscl.math.function;
import jscl.math.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class Sgn extends Function {
public Sgn(Generic generic) {
super("sgn", new Generic[]{generic});
}
public Generic antiDerivative(int n) throws NotIntegrableException {
return new Abs(parameters[0]).selfExpand();
}
public Generic derivative(int n) {
return JsclInteger.valueOf(0);
}
public Generic selfExpand() {
final Generic result = selfEvaluate();
if (result == null) {
return expressionValue();
} else {
return result;
}
}
@Nullable
private Generic selfEvaluate() {
Generic result = null;
if (parameters[0].signum() < 0) {
result = new Sgn(parameters[0].negate()).selfExpand().negate();
} else if (parameters[0].signum() == 0) {
result = JsclInteger.valueOf(0);
}
if (result == null) {
try {
result = JsclInteger.valueOf(parameters[0].integerValue().signum());
} catch (NotIntegerException e) {
}
}
return result;
}
public Generic selfElementary() {
return new Fraction(parameters[0], new Abs(parameters[0]).selfElementary()).selfElementary();
}
public Generic selfSimplify() {
final Generic result = selfEvaluate();
if (result == null) {
try {
Variable v = parameters[0].variableValue();
if (v instanceof Abs) {
return JsclInteger.valueOf(1);
} else if (v instanceof Sgn) {
Function f = (Function) v;
return f.selfSimplify();
}
} catch (NotVariableException e) {
}
return expressionValue();
} else {
return result;
}
}
public Generic selfNumeric() {
return ((NumericWrapper) parameters[0]).sgn();
}
public String toJava() {
final StringBuilder result = new StringBuilder();
result.append(parameters[0].toJava());
result.append(".sgn()");
return result.toString();
}
@Nonnull
public Variable newInstance() {
return new Sgn(null);
}
}