[poincare] Add NullStatus for expressions

Change-Id: Ibaba72e3e3589ba259c7b22d402e2b27937f27c1
This commit is contained in:
Hugo Saint-Vignes
2020-10-23 12:04:35 +02:00
committed by Émilie Feral
parent b2945c3f8b
commit 4a3f749cc6
18 changed files with 62 additions and 48 deletions

View File

@@ -316,12 +316,13 @@ EquationStore::Error EquationStore::resolveLinearSystem(Expression exactSolution
for (int j = m-1; j >= 0; j--) {
bool rowWithNullCoefficients = true;
for (int i = 0; i < n; i++) {
if (!Ab.matrixChild(j, i).isNumberZero()) {
if (Ab.matrixChild(j, i).nullStatus(context) != ExpressionNode::NullStatus::Null) {
rowWithNullCoefficients = false;
break;
}
}
if (rowWithNullCoefficients && !Ab.matrixChild(j, n).isNumberZero()) {
if (rowWithNullCoefficients && Ab.matrixChild(j, n).nullStatus(context) != ExpressionNode::NullStatus::Null) {
// TODO: Handle ExpressionNode::NullStatus::Unknown
m_numberOfSolutions = 0;
}
}
@@ -348,11 +349,12 @@ EquationStore::Error EquationStore::oneDimensialPolynomialSolve(Expression exact
if (delta.isUninitialized()) {
delta = Poincare::Undefined::Builder();
}
if (delta.isNumberZero()) {
if (delta.nullStatus(context) == ExpressionNode::NullStatus::Null) {
// if delta = 0, x0=x1= -b/(2a)
exactSolutions[0] = Division::Builder(Opposite::Builder(coefficients[1]), Multiplication::Builder(Rational::Builder(2), coefficients[2]));
m_numberOfSolutions = 2;
} else {
// TODO: Handle ExpressionNode::NullStatus::Unknown
// x0 = (-b-sqrt(delta))/(2a)
exactSolutions[0] = Division::Builder(Subtraction::Builder(Opposite::Builder(coefficients[1].clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), coefficients[2].clone()));
// x1 = (-b+sqrt(delta))/(2a)
@@ -383,8 +385,8 @@ EquationStore::Error EquationStore::oneDimensialPolynomialSolve(Expression exact
Expression * mult5Operands[3] = {new Rational::Builder(3), a->clone(), c->clone()};
Expression * delta0 = new Subtraction::Builder(new Power::Builder(b->clone(), new Rational::Builder(2), false), new Multiplication::Builder(mult5Operands, 3, false), false);
Reduce(&delta0, *context);
if (delta->isNumberZero()) {
if (delta0->isNumberZero()) {
if (delta->nullStatus(context) == ExpressionNode::NullStatus::Null) {
if (delta0->nullStatus(context) == ExpressionNode::NullStatus::Null) {
// delta0 = 0 && delta = 0 --> x0 = -b/(3a)
delete delta0;
m_exactSolutions[0] = new Opposite::Builder(new Division::Builder(b, new Multiplication::Builder(new Rational::Builder(3), a, false), false), false);