mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-27 09:40:07 +01:00
46 lines
1.1 KiB
C++
46 lines
1.1 KiB
C++
#include <poincare/determinant.h>
|
|
#include <poincare/matrix.h>
|
|
extern "C" {
|
|
#include <assert.h>
|
|
}
|
|
#include <cmath>
|
|
|
|
namespace Poincare {
|
|
|
|
Expression::Type Determinant::type() const {
|
|
return Type::Determinant;
|
|
}
|
|
|
|
Expression * Determinant::clone() const {
|
|
Determinant * a = new Determinant(m_operands, true);
|
|
return a;
|
|
}
|
|
|
|
ExpressionReference Determinant::shallowReduce(Context& context, Preferences::AngleUnit angleUnit) {
|
|
Expression * e = Expression::shallowReduce(context, angleUnit);
|
|
if (e != this) {
|
|
return e;
|
|
}
|
|
Expression * op = editableOperand(0);
|
|
#if MATRIX_EXACT_REDUCING
|
|
if (!op->recursivelyMatches(Expression::IsMatrix)) {
|
|
return replaceWith(op, true);
|
|
}
|
|
return this;
|
|
#else
|
|
return replaceWith(op, true);
|
|
#endif
|
|
}
|
|
|
|
// TODO: handle this exactly in shallowReduce for small dimensions.
|
|
template<typename T>
|
|
Evaluation<T> Determinant::templatedApproximate(Context& context, Preferences::AngleUnit angleUnit) const {
|
|
Evaluation<T> * input = operand(0)->privateApproximate(T(), context, angleUnit);
|
|
Complex<T> * result = new Complex<T>(input->createDeterminant());
|
|
delete input;
|
|
return result;
|
|
}
|
|
|
|
}
|
|
|