mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-18 21:30:38 +01:00
[poincare] Add NullStatus for expressions
Change-Id: Ibaba72e3e3589ba259c7b22d402e2b27937f27c1
This commit is contained in:
committed by
Émilie Feral
parent
b2945c3f8b
commit
4a3f749cc6
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user