[poincare] NAryExpressionNode: fix sortChildrenInPlace to put

expressions involving matrices as last children
This commit is contained in:
Émilie Feral
2019-12-02 16:30:29 +01:00
committed by LeaNumworks
parent 984d1ff924
commit a515160470
2 changed files with 16 additions and 1 deletions

View File

@@ -32,7 +32,12 @@ void NAryExpressionNode::sortChildrenInPlace(ExpressionOrder order, Context * co
* multiplication) so we never swap 2 matrices. */
ExpressionNode * cj = childAtIndex(j);
ExpressionNode * cj1 = childAtIndex(j+1);
if (order(cj, cj1, canBeInterrupted) > 0 && (canSwapMatrices || !(Expression(cj).deepIsMatrix(context) && Expression(cj1).deepIsMatrix(context)))) {
bool cjIsMatrix = Expression(cj).deepIsMatrix(context);
bool cj1IsMatrix = Expression(cj1).deepIsMatrix(context);
bool cj1GreaterThanCj = order(cj, cj1, canBeInterrupted) > 0;
if ((cjIsMatrix && !cj1IsMatrix) || // we always put matrices at the end of expressions
(cjIsMatrix && cj1IsMatrix && canSwapMatrices && cj1GreaterThanCj) ||
(!cjIsMatrix && !cj1IsMatrix && cj1GreaterThanCj)) {
reference.swapChildrenInPlace(j, j+1);
isSorted = false;
}

View File

@@ -216,4 +216,14 @@ QUIZ_CASE(poincare_expression_order_addition_multiplication) {
assert_multiplication_or_addition_is_ordered_as(e1, e2);
}
{
// ∑Matrix + 𝐢 -> 𝐢 + ∑Matrix
Expression childMatrix = Matrix::Builder();
static_cast<Matrix &>(childMatrix).addChildAtIndexInPlace(Rational::Builder(0), 0, 0);
Expression child1 = Sum::Builder(childMatrix, Symbol::Builder('n'), Rational::Builder(0), Rational::Builder(0));
Expression child2 = Symbol::Builder(UCodePointMathematicalBoldSmallI);
Expression e1 = Addition::Builder(child1.clone(), child2.clone());
Expression e2 = Addition::Builder(child2, child1);
assert_multiplication_or_addition_is_ordered_as(e1, e2);
}
}