package jscl.math.operator.matrix;
import jscl.math.Generic;
import jscl.math.function.FunctionsRegistry;
import jscl.math.operator.*;
import org.solovyev.common.math.AbstractMathRegistry;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* User: serso
* Date: 11/17/11
* Time: 10:22 AM
*/
public class OperatorsRegistry extends AbstractMathRegistry<Operator> {
private final static OperatorsRegistry instance = new OperatorsRegistry();
static {
instance.add(new Derivative(null, null, null, null));
//instance.add(new Grad(null, null));
//instance.add(new Divergence(null, null));
//instance.add(new Curl(null, null));
//instance.add(new Jacobian(null, null));
//instance.add(new Laplacian(null, null));
//instance.add(new Dalembertian(null, null));
//instance.add(new Del(null, null, null));
//instance.add(new VectorProduct(null, null));
//instance.add(new ComplexProduct(null, null));
//instance.add(new QuaternionProduct(null, null));
//instance.add(new GeometricProduct(null, null, null));
//instance.add(new MatrixProduct(null, null));
//instance.add(new TensorProduct(null, null));
//instance.add(new Transpose(null));
//instance.add(new Trace(null));
//instance.add(new Determinant(null));
//instance.add(new Coefficient(null, null));
//instance.add(new Solve(null, null, null));
//instance.add(new Substitute(null, null, null));
//instance.add(new Limit(null, null, null, null));
instance.add(new Sum(null, null, null, null));
instance.add(new Product(null, null, null, null));
//instance.add(new Groebner(null, null, null, null));
//instance.add(new Division(null, null));
instance.add(new Modulo(null, null));
//instance.add(new ModPow(null, null, null));
//instance.add(new ModInverse(null, null));
//instance.add(new EulerPhi(null));
instance.add(new Integral(null, null, null, null));
instance.add(new IndefiniteIntegral(null, null));
//instance.add(new Rand());
//instance.add(new Mean(null));
//instance.add(new Min(null));
//instance.add(new Max(null));
//instance.add(new MeanSquareDeviation(null));
//instance.add(new StandardDeviation(null));
//instance.add(new PrimitiveRoots(null));
}
/* if (operatorName.compareTo("d") == 0)
v = new Derivative(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : parameters[1], parameters.length > 3 ? parameters[3] : JsclInteger.valueOf(1));
else if (operatorName.compareTo("grad") == 0) v = new Grad(parameters[0], parameters[1]);
else if (operatorName.compareTo("diverg") == 0) v = new Divergence(parameters[0], parameters[1]);
else if (operatorName.compareTo("curl") == 0) v = new Curl(parameters[0], parameters[1]);
else if (operatorName.compareTo("jacobian") == 0) v = new Jacobian(parameters[0], parameters[1]);
else if (operatorName.compareTo("laplacian") == 0) v = new Laplacian(parameters[0], parameters[1]);
else if (operatorName.compareTo("dalembertian") == 0) v = new Dalembertian(parameters[0], parameters[1]);
else if (operatorName.compareTo("del") == 0)
v = new Del(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0));
else if (operatorName.compareTo("vector") == 0) v = new VectorProduct(parameters[0], parameters[1]);
else if (operatorName.compareTo("complex") == 0) v = new ComplexProduct(parameters[0], parameters[1]);
else if (operatorName.compareTo("quaternion") == 0) v = new QuaternionProduct(parameters[0], parameters[1]);
else if (operatorName.compareTo("geometric") == 0)
v = new GeometricProduct(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0));
else if (operatorName.compareTo("matrix") == 0) v = new MatrixProduct(parameters[0], parameters[1]);
else if (operatorName.compareTo("tensor") == 0) v = new TensorProduct(parameters[0], parameters[1]);
else if (operatorName.compareTo("tran") == 0) v = new Transpose(parameters[0]);
else if (operatorName.compareTo("trace") == 0) v = new Trace(parameters[0]);
else if (operatorName.compareTo("det") == 0) v = new Determinant(parameters[0]);
else if (operatorName.compareTo("coef") == 0) v = new Coefficient(parameters[0], parameters[1]);
else if (operatorName.compareTo("solve") == 0)
v = new Solve(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : JsclInteger.valueOf(0));
else if (operatorName.compareTo("subst") == 0)
v = new Substitute(parameters[0], parameters[1], parameters[2]).transmute();
else if (operatorName.compareTo("lim") == 0)
v = new Limit(parameters[0], parameters[1], parameters[2], parameters.length > 3 && (parameters[2].compareTo(Constant.infinity) != 0 && parameters[2].compareTo(Constant.infinity.negate()) != 0) ? JsclInteger.valueOf(parameters[3].signum()) : JsclInteger.valueOf(0));
else if (operatorName.compareTo("sum") == 0)
v = new Sum(parameters[0], parameters[1], parameters[2], parameters[3]);
else if (operatorName.compareTo("prod") == 0)
v = new Product(parameters[0], parameters[1], parameters[2], parameters[3]);
else if (operatorName.compareTo("integral") == 0)
v = parameters.length > 2 ? new Integral(parameters[0], parameters[1], parameters[2], parameters[3]) : new IndefiniteIntegral(parameters[0], parameters[1]);
else if (operatorName.compareTo("groebner") == 0)
v = new Groebner(parameters[0], parameters[1], parameters.length > 2 ? parameters[2] : Expression.valueOf("lex"), parameters.length > 3 ? parameters[3] : JsclInteger.valueOf(0)).transmute();
else if (operatorName.compareTo("div") == 0) v = new Division(parameters[0], parameters[1]);
else if (operatorName.compareTo("mod") == 0) v = new Modulo(parameters[0], parameters[1]);
else if (operatorName.compareTo("modpow") == 0) v = new ModPow(parameters[0], parameters[1], parameters[2]);
else if (operatorName.compareTo("modinv") == 0) v = new ModInverse(parameters[0], parameters[1]);
else if (operatorName.compareTo("eulerphi") == 0) v = new EulerPhi(parameters[0]);
else if (operatorName.compareTo("primitiveroots") == 0) v = new PrimitiveRoots(parameters[0]);*/
@Nonnull
public static OperatorsRegistry getInstance() {
return instance;
}
@Nullable
public Operator get(@Nonnull String name, @Nonnull Generic[] parameters) {
final Operator operator = super.get(name);
if (operator == null) {
return null;
} else {
if (operator.getMinParameters() <= parameters.length && operator.getMaxParameters() >= parameters.length) {
return operator.newInstance(parameters);
} else {
return null;
}
}
}
@Override
public Operator get(@Nonnull String name) {
final Operator operator = super.get(name);
return operator == null ? null : FunctionsRegistry.copy(operator);
}
}