package jscl.math.operator.matrix;
import jscl.math.Generic;
import jscl.math.GenericVariable;
import jscl.math.Matrix;
import jscl.math.Variable;
import jscl.math.operator.Operator;
import jscl.mathml.MathML;
import javax.annotation.Nonnull;
public class Determinant extends Operator {
public static final String NAME = "det";
public Determinant(Generic matrix) {
super(NAME, new Generic[]{matrix});
}
private Determinant(Generic parameters[]) {
super(NAME, parameters);
}
@Override
public int getMinParameters() {
return 1;
}
public Generic selfExpand() {
if (parameters[0] instanceof Matrix) {
Matrix matrix = (Matrix) parameters[0];
return matrix.determinant();
}
return expressionValue();
}
public void toMathML(MathML element, Object data) {
int exponent = data instanceof Integer ? (Integer) data : 1;
if (exponent == 1) bodyToMathML(element);
else {
MathML e1 = element.element("msup");
bodyToMathML(e1);
MathML e2 = element.element("mn");
e2.appendChild(element.text(String.valueOf(exponent)));
e1.appendChild(e2);
element.appendChild(e1);
}
}
@Nonnull
@Override
public Operator newInstance(@Nonnull Generic[] parameters) {
return new Determinant(parameters);
}
void bodyToMathML(MathML e0) {
Generic m = GenericVariable.content(parameters[0]);
MathML e1 = e0.element("mfenced");
e1.setAttribute("open", "|");
e1.setAttribute("close", "|");
if (m instanceof Matrix) {
Generic element[][] = ((Matrix) m).elements();
MathML e2 = e0.element("mtable");
for (int i = 0; i < element.length; i++) {
MathML e3 = e0.element("mtr");
for (int j = 0; j < element.length; j++) {
MathML e4 = e0.element("mtd");
element[i][j].toMathML(e4, null);
e3.appendChild(e4);
}
e2.appendChild(e3);
}
e1.appendChild(e2);
} else m.toMathML(e1, null);
e0.appendChild(e1);
}
@Nonnull
public Variable newInstance() {
return new Determinant((Matrix) null);
}
}